From eadce34d6f75edfe8c82e4627171417982997546 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 10 May 2019 11:39:52 +0300 Subject: [PATCH] Add ingress router unit tests --- pkg/router/ingress_test.go | 90 ++++++++++++++++++++++++++++++++++++++ pkg/router/router_test.go | 79 ++++++++++++++++++++++++++++++++- 2 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 pkg/router/ingress_test.go diff --git a/pkg/router/ingress_test.go b/pkg/router/ingress_test.go new file mode 100644 index 00000000..1fda7cd5 --- /dev/null +++ b/pkg/router/ingress_test.go @@ -0,0 +1,90 @@ +package router + +import ( + "fmt" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "testing" +) + +func TestIngressRouter_Reconcile(t *testing.T) { + mocks := setupfakeClients() + router := &IngressRouter{ + logger: mocks.logger, + kubeClient: mocks.kubeClient, + } + + err := router.Reconcile(mocks.ingressCanary) + if err != nil { + t.Fatal(err.Error()) + } + + canaryAn := "nginx.ingress.kubernetes.io/canary" + canaryWeightAn := "nginx.ingress.kubernetes.io/canary-weight" + + canaryName := fmt.Sprintf("%s-canary", mocks.ingressCanary.Spec.IngressRef.Name) + inCanary, err := router.kubeClient.ExtensionsV1beta1().Ingresses("default").Get(canaryName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if _, ok := inCanary.Annotations[canaryAn]; !ok { + t.Errorf("Canary annotation missing") + } + + // test initialisation + if inCanary.Annotations[canaryAn] != "false" { + t.Errorf("Got canary annotation %v wanted false", inCanary.Annotations[canaryAn]) + } + + if inCanary.Annotations[canaryWeightAn] != "0" { + t.Errorf("Got canary weight annotation %v wanted 0", inCanary.Annotations[canaryWeightAn]) + } +} + +func TestIngressRouter_GetSetRoutes(t *testing.T) { + mocks := setupfakeClients() + router := &IngressRouter{ + logger: mocks.logger, + kubeClient: mocks.kubeClient, + } + + err := router.Reconcile(mocks.ingressCanary) + if err != nil { + t.Fatal(err.Error()) + } + + p, c, err := router.GetRoutes(mocks.ingressCanary) + if err != nil { + t.Fatal(err.Error()) + } + + p = 50 + c = 50 + + err = router.SetRoutes(mocks.ingressCanary, p, c) + if err != nil { + t.Fatal(err.Error()) + } + + canaryAn := "nginx.ingress.kubernetes.io/canary" + canaryWeightAn := "nginx.ingress.kubernetes.io/canary-weight" + + canaryName := fmt.Sprintf("%s-canary", mocks.ingressCanary.Spec.IngressRef.Name) + inCanary, err := router.kubeClient.ExtensionsV1beta1().Ingresses("default").Get(canaryName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if _, ok := inCanary.Annotations[canaryAn]; !ok { + t.Errorf("Canary annotation missing") + } + + // test initialisation + if inCanary.Annotations[canaryAn] != "true" { + t.Errorf("Got canary annotation %v wanted true", inCanary.Annotations[canaryAn]) + } + + if inCanary.Annotations[canaryWeightAn] != "50" { + t.Errorf("Got canary weight annotation %v wanted 50", inCanary.Annotations[canaryWeightAn]) + } +} diff --git a/pkg/router/router_test.go b/pkg/router/router_test.go index 32c5f770..701cae0c 100644 --- a/pkg/router/router_test.go +++ b/pkg/router/router_test.go @@ -11,7 +11,9 @@ import ( appsv1 "k8s.io/api/apps/v1" hpav1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" + "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" ) @@ -20,6 +22,7 @@ type fakeClients struct { canary *v1alpha3.Canary abtest *v1alpha3.Canary appmeshCanary *v1alpha3.Canary + ingressCanary *v1alpha3.Canary kubeClient kubernetes.Interface meshClient clientset.Interface flaggerClient clientset.Interface @@ -30,9 +33,10 @@ func setupfakeClients() fakeClients { canary := newMockCanary() abtest := newMockABTest() appmeshCanary := newMockCanaryAppMesh() - flaggerClient := fakeFlagger.NewSimpleClientset(canary, abtest, appmeshCanary) + ingressCanary := newMockCanaryIngress() + flaggerClient := fakeFlagger.NewSimpleClientset(canary, abtest, appmeshCanary, ingressCanary) - kubeClient := fake.NewSimpleClientset(newMockDeployment(), newMockABTestDeployment()) + kubeClient := fake.NewSimpleClientset(newMockDeployment(), newMockABTestDeployment(), newMockIngress()) meshClient := fakeFlagger.NewSimpleClientset() logger, _ := logger.NewLogger("debug") @@ -41,6 +45,7 @@ func setupfakeClients() fakeClients { canary: canary, abtest: abtest, appmeshCanary: appmeshCanary, + ingressCanary: ingressCanary, kubeClient: kubeClient, meshClient: meshClient, flaggerClient: flaggerClient, @@ -266,3 +271,73 @@ func newMockABTestDeployment() *appsv1.Deployment { return d } + +func newMockCanaryIngress() *v1alpha3.Canary { + cd := &v1alpha3.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: v1alpha3.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "nginx", + }, + Spec: v1alpha3.CanarySpec{ + TargetRef: hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + IngressRef: &hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "extensions/v1beta1", + Kind: "Ingress", + }, + Service: v1alpha3.CanaryService{ + Port: 9898, + }, CanaryAnalysis: v1alpha3.CanaryAnalysis{ + Threshold: 10, + StepWeight: 10, + MaxWeight: 50, + Metrics: []v1alpha3.CanaryMetric{ + { + Name: "request-success-rate", + Threshold: 99, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + +func newMockIngress() *v1beta1.Ingress { + return &v1beta1.Ingress{ + TypeMeta: metav1.TypeMeta{APIVersion: v1beta1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + Annotations: map[string]string{ + "kubernetes.io/ingress.class": "nginx", + }, + }, + Spec: v1beta1.IngressSpec{ + Rules: []v1beta1.IngressRule{ + { + Host: "app.example.com", + IngressRuleValue: v1beta1.IngressRuleValue{ + HTTP: &v1beta1.HTTPIngressRuleValue{ + Paths: []v1beta1.HTTPIngressPath{ + { + Path: "/", + Backend: v1beta1.IngressBackend{ + ServiceName: "podinfo", + ServicePort: intstr.FromInt(9898), + }, + }, + }, + }, + }, + }, + }, + }, + } +}