From 00ce4f46f3b7982940177eae6b0b69406ac73c2f Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Fri, 31 Mar 2017 09:46:51 -0300 Subject: [PATCH] Add test for ingress status update --- core/pkg/ingress/status/status.go | 6 +++ core/pkg/ingress/status/status_test.go | 64 ++++++++++++++++++-------- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/core/pkg/ingress/status/status.go b/core/pkg/ingress/status/status.go index 6e54d422b2..88627a82bf 100644 --- a/core/pkg/ingress/status/status.go +++ b/core/pkg/ingress/status/status.go @@ -132,6 +132,11 @@ func (s *statusSync) sync(key interface{}) error { s.runLock.Lock() defer s.runLock.Unlock() + if s.syncQueue.IsShuttingDown() { + glog.V(2).Infof("skipping Ingress status update (shutting down in progress)") + return nil + } + if !s.elector.IsLeader() { glog.V(2).Infof("skipping Ingress status update (I am not the current leader)") return nil @@ -249,6 +254,7 @@ func (s *statusSync) updateStatus(newIPs []api.LoadBalancerIngress) { ing := cur.(*extensions.Ingress) if !class.IsValid(ing, s.Config.IngressClass, s.Config.DefaultIngressClass) { + wg.Done() continue } diff --git a/core/pkg/ingress/status/status_test.go b/core/pkg/ingress/status/status_test.go index 57e9f1e840..bbaef43dd8 100644 --- a/core/pkg/ingress/status/status_test.go +++ b/core/pkg/ingress/status/status_test.go @@ -23,14 +23,15 @@ import ( "testing" "time" - cache_store "k8s.io/ingress/core/pkg/cache" - "k8s.io/ingress/core/pkg/k8s" - "k8s.io/ingress/core/pkg/task" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/cache" testclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/util/sets" + + cache_store "k8s.io/ingress/core/pkg/cache" + "k8s.io/ingress/core/pkg/ingress/annotations/class" + "k8s.io/ingress/core/pkg/k8s" + "k8s.io/ingress/core/pkg/task" ) func buildLoadBalancerIngressByIP() loadBalancerIngressByIP { @@ -150,6 +151,7 @@ func buildSimpleClientSet() *testclient.Clientset { ObjectMeta: api.ObjectMeta{ Name: "ingress-controller-leader", Namespace: api.NamespaceDefault, + SelfLink: "/api/v1/namespaces/default/endpoints/ingress-controller-leader", }, }}}, &extensions.IngressList{Items: buildExtensionsIngresses()}, @@ -178,6 +180,25 @@ func buildExtensionsIngresses() []extensions.Ingress { }, }, }, + { + ObjectMeta: api.ObjectMeta{ + Name: "foo_ingress_different_class", + Namespace: api.NamespaceDefault, + Annotations: map[string]string{ + class.IngressKey: "no-nginx", + }, + }, + Status: extensions.IngressStatus{ + LoadBalancer: api.LoadBalancerStatus{ + Ingress: []api.LoadBalancerIngress{ + { + IP: "0.0.0.0", + Hostname: "foo.bar.com", + }, + }, + }, + }, + }, { ObjectMeta: api.ObjectMeta{ Name: "foo_ingress_2", @@ -192,16 +213,13 @@ func buildExtensionsIngresses() []extensions.Ingress { } } -func buildIngressLIstener() cache_store.StoreToIngressLister { +func buildIngressListener() cache_store.StoreToIngressLister { store := cache.NewStore(cache.MetaNamespaceKeyFunc) - ids := sets.NewString("foo_ingress_non_01") - for id := range ids { - store.Add(&extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: id, - Namespace: api.NamespaceDefault, - }}) - } + store.Add(&extensions.Ingress{ + ObjectMeta: api.ObjectMeta{ + Name: "foo_ingress_non_01", + Namespace: api.NamespaceDefault, + }}) store.Add(&extensions.Ingress{ ObjectMeta: api.ObjectMeta{ Name: "foo_ingress_1", @@ -230,7 +248,7 @@ func buildStatusSync() statusSync { Config: Config{ Client: buildSimpleClientSet(), PublishService: api.NamespaceDefault + "/" + "foo", - IngressLister: buildIngressLIstener(), + IngressLister: buildIngressListener(), }, } } @@ -240,9 +258,11 @@ func TestStatusActions(t *testing.T) { os.Setenv("POD_NAME", "foo1") os.Setenv("POD_NAMESPACE", api.NamespaceDefault) c := Config{ - Client: buildSimpleClientSet(), - PublishService: "", - IngressLister: buildIngressLIstener(), + Client: buildSimpleClientSet(), + PublishService: "", + IngressLister: buildIngressListener(), + DefaultIngressClass: "nginx", + IngressClass: "", } // create object fkSync := NewStatusSyncer(c) @@ -253,7 +273,7 @@ func TestStatusActions(t *testing.T) { fk := fkSync.(statusSync) ns := make(chan struct{}) - // start it and wait for the election and syn actions + // start it and wait for the election and sync actions go fk.Run(ns) // wait for the election time.Sleep(100 * time.Millisecond) @@ -286,6 +306,14 @@ func TestStatusActions(t *testing.T) { t.Fatalf("returned %v but expected %v", fooIngress2CurIPs, newIPs2) } + oic, err := fk.Client.Extensions().Ingresses(api.NamespaceDefault).Get("foo_ingress_different_class") + if err != nil { + t.Fatalf("unexpected error") + } + if oic.Status.LoadBalancer.Ingress[0].IP != "0.0.0.0" && oic.Status.LoadBalancer.Ingress[0].Hostname != "foo.bar.com" { + t.Fatalf("invalid ingress status for rule with different class") + } + // end test ns <- struct{}{} }