Fix status update tests

This commit is contained in:
Manuel de Brito Fontes 2017-11-20 11:05:47 -03:00
parent 3dfbf385e4
commit 098a94c28d
2 changed files with 63 additions and 32 deletions

View file

@ -307,19 +307,22 @@ func (s *statusSync) updateStatus(newIngressPoint []apiv1.LoadBalancerIngress) {
running := make(chan struct{}, max) running := make(chan struct{}, max)
for _, ing := range s.IngressLister() { for _, ing := range s.IngressLister() {
running <- struct{}{} // waits for a free slot running <- struct{}{}
go func(ing *extensions.Ingress, go func(ing *extensions.Ingress,
status []apiv1.LoadBalancerIngress, status []apiv1.LoadBalancerIngress,
client clientset.Interface) { client clientset.Interface) {
defer func() { defer func() {
<-running // releases slot <-running
}() }()
sort.SliceStable(status, lessLoadBalancerIngress(status)) var ns []apiv1.LoadBalancerIngress
copy(ns, status)
sort.SliceStable(ns, lessLoadBalancerIngress(status))
curIPs := ing.Status.LoadBalancer.Ingress curIPs := ing.Status.LoadBalancer.Ingress
sort.SliceStable(curIPs, lessLoadBalancerIngress(curIPs)) sort.SliceStable(curIPs, lessLoadBalancerIngress(curIPs))
if ingressSliceEqual(status, curIPs) { if ingressSliceEqual(ns, curIPs) {
glog.V(3).Infof("skipping update of Ingress %v/%v (no change)", ing.Namespace, ing.Name) glog.V(3).Infof("skipping update of Ingress %v/%v (no change)", ing.Namespace, ing.Name)
return return
} }

View file

@ -32,6 +32,7 @@ import (
"k8s.io/ingress-nginx/internal/task" "k8s.io/ingress-nginx/internal/task"
) )
// buildLoadBalancerIngressByIP builds the final status of LoadBalancerIngress
func buildLoadBalancerIngressByIP() []apiv1.LoadBalancerIngress { func buildLoadBalancerIngressByIP() []apiv1.LoadBalancerIngress {
return []apiv1.LoadBalancerIngress{ return []apiv1.LoadBalancerIngress{
{ {
@ -269,10 +270,13 @@ func TestStatusActions(t *testing.T) {
fk := fkSync.(statusSync) fk := fkSync.(statusSync)
ns := make(chan struct{}) ns := make(chan struct{})
// start it and wait for the election and syn actions // start it and wait for the election and syn actions
go fk.Run(ns) go fk.Run(ns)
// wait for the election // wait for the election
time.Sleep(100 * time.Millisecond) time.Sleep(1 * time.Second)
// execute sync // execute sync
fk.sync("just-test") fk.sync("just-test")
// PublishService is empty, so the running address is: ["11.0.0.2"] // PublishService is empty, so the running address is: ["11.0.0.2"]
@ -280,29 +284,45 @@ func TestStatusActions(t *testing.T) {
newIPs := []apiv1.LoadBalancerIngress{{ newIPs := []apiv1.LoadBalancerIngress{{
IP: "11.0.0.2", IP: "11.0.0.2",
}} }}
fooIngress1, err1 := fk.Client.Extensions().Ingresses(apiv1.NamespaceDefault).Get("foo_ingress_1", metav1.GetOptions{})
// wait for update
time.Sleep(1 * time.Second)
ing, err1 := fk.Client.
ExtensionsV1beta1().
Ingresses(apiv1.NamespaceDefault).
Get("foo_ingress_1", metav1.GetOptions{})
if err1 != nil { if err1 != nil {
t.Fatalf("unexpected error") t.Fatalf("unexpected error")
} }
fooIngress1CurIPs := fooIngress1.Status.LoadBalancer.Ingress ingIPs := ing.Status.LoadBalancer.Ingress
if !ingressSliceEqual(fooIngress1CurIPs, newIPs) { if !ingressSliceEqual(ingIPs, newIPs) {
t.Fatalf("returned %v but expected %v", fooIngress1CurIPs, newIPs) t.Fatalf("returned %v but expected %v", ingIPs, newIPs)
} }
// execute shutdown // execute shutdown
fk.Shutdown() fk.Shutdown()
time.Sleep(5 * time.Second)
// ingress should be empty // ingress should be empty
newIPs2 := []apiv1.LoadBalancerIngress{} newIPs2 := []apiv1.LoadBalancerIngress{}
fooIngress2, err2 := fk.Client.Extensions().Ingresses(apiv1.NamespaceDefault).Get("foo_ingress_1", metav1.GetOptions{}) ing, err := fk.Client.
if err2 != nil { ExtensionsV1beta1().
Ingresses(apiv1.NamespaceDefault).
Get("foo_ingress_1", metav1.GetOptions{})
if err != nil {
t.Fatalf("unexpected error") t.Fatalf("unexpected error")
} }
fooIngress2CurIPs := fooIngress2.Status.LoadBalancer.Ingress ingIPs = ing.Status.LoadBalancer.Ingress
if !ingressSliceEqual(fooIngress2CurIPs, newIPs2) { if !ingressSliceEqual(ingIPs, newIPs2) {
t.Fatalf("returned %v but expected %v", fooIngress2CurIPs, newIPs2) t.Fatalf("returned %v but expected %v", ingIPs, newIPs2)
} }
oic, err := fk.Client.Extensions().Ingresses(api.NamespaceDefault).Get("foo_ingress_different_class", metav1.GetOptions{}) oic, err := fk.Client.
ExtensionsV1beta1().
Ingresses(api.NamespaceDefault).
Get("foo_ingress_different_class", metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("unexpected error") t.Fatalf("unexpected error")
} }
@ -314,10 +334,6 @@ func TestStatusActions(t *testing.T) {
ns <- struct{}{} ns <- struct{}{}
} }
func TestCallback(t *testing.T) {
buildStatusSync()
}
func TestKeyfunc(t *testing.T) { func TestKeyfunc(t *testing.T) {
fk := buildStatusSync() fk := buildStatusSync()
i := "foo_base_pod" i := "foo_base_pod"
@ -364,25 +380,37 @@ func TestRunningAddresessWithPods(t *testing.T) {
func TestUpdateStatus(t *testing.T) { func TestUpdateStatus(t *testing.T) {
fk := buildStatusSync() fk := buildStatusSync()
newIPs := buildLoadBalancerIngressByIP() newIPs := buildLoadBalancerIngressByIP()
fk.updateStatus(newIPs) fk.updateStatus(newIPs)
fooIngress1, err1 := fk.Client.Extensions().Ingresses(apiv1.NamespaceDefault).Get("foo_ingress_1", metav1.GetOptions{}) // wait end of updates
if err1 != nil { time.Sleep(5 * time.Second)
t.Fatalf("unexpected error")
} ing, err := fk.Client.
fooIngress1CurIPs := fooIngress1.Status.LoadBalancer.Ingress ExtensionsV1beta1().
if !ingressSliceEqual(fooIngress1CurIPs, newIPs) { Ingresses(apiv1.NamespaceDefault).
t.Fatalf("returned %v but expected %v", fooIngress1CurIPs, newIPs) Get("foo_ingress_1", metav1.GetOptions{})
if err != nil {
t.Fatalf("unexpected error %v", err)
} }
fooIngress2, err2 := fk.Client.Extensions().Ingresses(apiv1.NamespaceDefault).Get("foo_ingress_2", metav1.GetOptions{}) ingIPs := ing.Status.LoadBalancer.Ingress
if err2 != nil { if !ingressSliceEqual(ingIPs, newIPs) {
t.Fatalf("unexpected error") t.Fatalf("returned %v but expected %v", ingIPs, newIPs)
} }
fooIngress2CurIPs := fooIngress2.Status.LoadBalancer.Ingress
if !ingressSliceEqual(fooIngress2CurIPs, []apiv1.LoadBalancerIngress{}) { ing, err = fk.Client.
t.Fatalf("returned %v but expected %v", fooIngress2CurIPs, []apiv1.LoadBalancerIngress{}) ExtensionsV1beta1().
Ingresses(apiv1.NamespaceDefault).
Get("foo_ingress_2", metav1.GetOptions{})
if err != nil {
t.Fatalf("unexpected error %v", err)
}
ingIPs = ing.Status.LoadBalancer.Ingress
if !ingressSliceEqual(ingIPs, []apiv1.LoadBalancerIngress{}) {
t.Fatalf("returned %v but expected %v", ingIPs, []apiv1.LoadBalancerIngress{})
} }
} }