Add test for ingress status update

This commit is contained in:
Manuel de Brito Fontes 2017-03-31 09:46:51 -03:00
parent c5949252ed
commit 00ce4f46f3
2 changed files with 52 additions and 18 deletions

View file

@ -132,6 +132,11 @@ func (s *statusSync) sync(key interface{}) error {
s.runLock.Lock() s.runLock.Lock()
defer s.runLock.Unlock() 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() { if !s.elector.IsLeader() {
glog.V(2).Infof("skipping Ingress status update (I am not the current leader)") glog.V(2).Infof("skipping Ingress status update (I am not the current leader)")
return nil return nil
@ -249,6 +254,7 @@ func (s *statusSync) updateStatus(newIPs []api.LoadBalancerIngress) {
ing := cur.(*extensions.Ingress) ing := cur.(*extensions.Ingress)
if !class.IsValid(ing, s.Config.IngressClass, s.Config.DefaultIngressClass) { if !class.IsValid(ing, s.Config.IngressClass, s.Config.DefaultIngressClass) {
wg.Done()
continue continue
} }

View file

@ -23,14 +23,15 @@ import (
"testing" "testing"
"time" "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/api"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
testclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" 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 { func buildLoadBalancerIngressByIP() loadBalancerIngressByIP {
@ -150,6 +151,7 @@ func buildSimpleClientSet() *testclient.Clientset {
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "ingress-controller-leader", Name: "ingress-controller-leader",
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
SelfLink: "/api/v1/namespaces/default/endpoints/ingress-controller-leader",
}, },
}}}, }}},
&extensions.IngressList{Items: buildExtensionsIngresses()}, &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{ ObjectMeta: api.ObjectMeta{
Name: "foo_ingress_2", 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) store := cache.NewStore(cache.MetaNamespaceKeyFunc)
ids := sets.NewString("foo_ingress_non_01")
for id := range ids {
store.Add(&extensions.Ingress{ store.Add(&extensions.Ingress{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: id, Name: "foo_ingress_non_01",
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
}}) }})
}
store.Add(&extensions.Ingress{ store.Add(&extensions.Ingress{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo_ingress_1", Name: "foo_ingress_1",
@ -230,7 +248,7 @@ func buildStatusSync() statusSync {
Config: Config{ Config: Config{
Client: buildSimpleClientSet(), Client: buildSimpleClientSet(),
PublishService: api.NamespaceDefault + "/" + "foo", PublishService: api.NamespaceDefault + "/" + "foo",
IngressLister: buildIngressLIstener(), IngressLister: buildIngressListener(),
}, },
} }
} }
@ -242,7 +260,9 @@ func TestStatusActions(t *testing.T) {
c := Config{ c := Config{
Client: buildSimpleClientSet(), Client: buildSimpleClientSet(),
PublishService: "", PublishService: "",
IngressLister: buildIngressLIstener(), IngressLister: buildIngressListener(),
DefaultIngressClass: "nginx",
IngressClass: "",
} }
// create object // create object
fkSync := NewStatusSyncer(c) fkSync := NewStatusSyncer(c)
@ -253,7 +273,7 @@ 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 sync actions
go fk.Run(ns) go fk.Run(ns)
// wait for the election // wait for the election
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
@ -286,6 +306,14 @@ func TestStatusActions(t *testing.T) {
t.Fatalf("returned %v but expected %v", fooIngress2CurIPs, newIPs2) 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 // end test
ns <- struct{}{} ns <- struct{}{}
} }