diff --git a/pkg/router/appmesh_test.go b/pkg/router/appmesh_test.go index b7e3ac42..bae70620 100644 --- a/pkg/router/appmesh_test.go +++ b/pkg/router/appmesh_test.go @@ -10,7 +10,7 @@ import ( ) func TestAppmeshRouter_Reconcile(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -151,7 +151,7 @@ func TestAppmeshRouter_Reconcile(t *testing.T) { } func TestAppmeshRouter_GetSetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -188,7 +188,7 @@ func TestAppmeshRouter_GetSetRoutes(t *testing.T) { } func TestAppmeshRouter_ABTest(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -230,7 +230,7 @@ func TestAppmeshRouter_ABTest(t *testing.T) { } func TestAppmeshRouter_Gateway(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, diff --git a/pkg/router/contour_test.go b/pkg/router/contour_test.go index 13d2b699..5c828ac6 100644 --- a/pkg/router/contour_test.go +++ b/pkg/router/contour_test.go @@ -7,7 +7,7 @@ import ( ) func TestContourRouter_Reconcile(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &ContourRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -92,7 +92,7 @@ func TestContourRouter_Reconcile(t *testing.T) { cdClone = cd.DeepCopy() cdClone.Spec.CanaryAnalysis.Iterations = 5 - cdClone.Spec.CanaryAnalysis.Match = newMockABTest().Spec.CanaryAnalysis.Match + cdClone.Spec.CanaryAnalysis.Match = newTestABTest().Spec.CanaryAnalysis.Match canary, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cdClone) if err != nil { t.Fatal(err.Error()) @@ -116,7 +116,7 @@ func TestContourRouter_Reconcile(t *testing.T) { } func TestContourRouter_Routes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &ContourRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -164,7 +164,7 @@ func TestContourRouter_Routes(t *testing.T) { // test update to A/B cdClone := cd.DeepCopy() cdClone.Spec.CanaryAnalysis.Iterations = 5 - cdClone.Spec.CanaryAnalysis.Match = newMockABTest().Spec.CanaryAnalysis.Match + cdClone.Spec.CanaryAnalysis.Match = newTestABTest().Spec.CanaryAnalysis.Match canary, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cdClone) if err != nil { t.Fatal(err.Error()) diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index d46867ee..69d4da5f 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -10,7 +10,7 @@ import ( ) func TestGlooRouter_Sync(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &GlooRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -43,7 +43,7 @@ func TestGlooRouter_Sync(t *testing.T) { } func TestGlooRouter_SetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &GlooRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -100,7 +100,7 @@ func TestGlooRouter_SetRoutes(t *testing.T) { } func TestGlooRouter_GetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &GlooRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, diff --git a/pkg/router/ingress_test.go b/pkg/router/ingress_test.go index 91079927..200999c8 100644 --- a/pkg/router/ingress_test.go +++ b/pkg/router/ingress_test.go @@ -8,7 +8,7 @@ import ( ) func TestIngressRouter_Reconcile(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IngressRouter{ logger: mocks.logger, kubeClient: mocks.kubeClient, @@ -44,7 +44,7 @@ func TestIngressRouter_Reconcile(t *testing.T) { } func TestIngressRouter_GetSetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IngressRouter{ logger: mocks.logger, kubeClient: mocks.kubeClient, diff --git a/pkg/router/istio_test.go b/pkg/router/istio_test.go index e7ba0732..afca0d4b 100644 --- a/pkg/router/istio_test.go +++ b/pkg/router/istio_test.go @@ -10,7 +10,7 @@ import ( ) func TestIstioRouter_Sync(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -112,7 +112,7 @@ func TestIstioRouter_Sync(t *testing.T) { } func TestIstioRouter_SetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -217,7 +217,7 @@ func TestIstioRouter_SetRoutes(t *testing.T) { } func TestIstioRouter_GetRoutes(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -247,7 +247,7 @@ func TestIstioRouter_GetRoutes(t *testing.T) { t.Errorf("Got mirror %v wanted %v", m, false) } - mocks.canary = newMockMirror() + mocks.canary = newTestMirror() err = router.Reconcile(mocks.canary) if err != nil { @@ -313,7 +313,7 @@ func TestIstioRouter_GetRoutes(t *testing.T) { } func TestIstioRouter_HTTPRequestHeaders(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -342,7 +342,7 @@ func TestIstioRouter_HTTPRequestHeaders(t *testing.T) { } func TestIstioRouter_CORS(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -375,7 +375,7 @@ func TestIstioRouter_CORS(t *testing.T) { } func TestIstioRouter_ABTest(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, @@ -444,7 +444,7 @@ func TestIstioRouter_ABTest(t *testing.T) { } func TestIstioRouter_GatewayPort(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &IstioRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, diff --git a/pkg/router/kubernetes_deployment_test.go b/pkg/router/kubernetes_deployment_test.go index d4aae335..3cea7370 100644 --- a/pkg/router/kubernetes_deployment_test.go +++ b/pkg/router/kubernetes_deployment_test.go @@ -7,7 +7,7 @@ import ( ) func TestServiceRouter_Create(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &KubernetesDeploymentRouter{ kubeClient: mocks.kubeClient, flaggerClient: mocks.flaggerClient, @@ -52,7 +52,7 @@ func TestServiceRouter_Create(t *testing.T) { } func TestServiceRouter_Update(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &KubernetesDeploymentRouter{ kubeClient: mocks.kubeClient, flaggerClient: mocks.flaggerClient, @@ -103,7 +103,7 @@ func TestServiceRouter_Update(t *testing.T) { } func TestServiceRouter_Undo(t *testing.T) { - mocks := newFixture() + mocks := newFixture(nil) router := &KubernetesDeploymentRouter{ kubeClient: mocks.kubeClient, flaggerClient: mocks.flaggerClient, diff --git a/pkg/router/router_test.go b/pkg/router/router_test.go index 0d1973ae..45c61a14 100644 --- a/pkg/router/router_test.go +++ b/pkg/router/router_test.go @@ -29,18 +29,31 @@ type fixture struct { logger *zap.SugaredLogger } -func newFixture() fixture { - canary := newMockCanary() - abtest := newMockABTest() - appmeshCanary := newMockCanaryAppMesh() - ingressCanary := newMockCanaryIngress() - flaggerClient := fakeFlagger.NewSimpleClientset(canary, abtest, appmeshCanary, ingressCanary) +func newFixture(c *flaggerv1.Canary) fixture { + canary := newTestCanary() + if c != nil { + canary = c + } + abtest := newTestABTest() + appmeshCanary := newTestCanaryAppMesh() + ingressCanary := newTestCanaryIngress() - kubeClient := fake.NewSimpleClientset(newMockDeployment(), newMockABTestDeployment(), newMockIngress()) + flaggerClient := fakeFlagger.NewSimpleClientset( + canary, + abtest, + appmeshCanary, + ingressCanary, + ) + + kubeClient := fake.NewSimpleClientset( + newTestDeployment(), + newTestABTestDeployment(), + newTestIngress(), + ) meshClient := fakeFlagger.NewSimpleClientset() - logger, _ := logger.NewLogger("debug") + logger, _ := logger.NewLogger("debug") return fixture{ canary: canary, abtest: abtest, @@ -53,53 +66,7 @@ func newFixture() fixture { } } -func newMockCanaryAppMesh() *flaggerv1.Canary { - cd := &flaggerv1.Canary{ - TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "appmesh", - }, - Spec: flaggerv1.CanarySpec{ - TargetRef: flaggerv1.CrossNamespaceObjectReference{ - Name: "podinfo", - APIVersion: "apps/v1", - Kind: "Deployment", - }, - Service: flaggerv1.CanaryService{ - Port: 9898, - MeshName: "global", - Hosts: []string{"*"}, - Backends: []string{"backend.default"}, - Timeout: "25", - Retries: &istiov1alpha3.HTTPRetry{ - Attempts: 5, - PerTryTimeout: "gateway-error", - RetryOn: "5s", - }, - }, CanaryAnalysis: flaggerv1.CanaryAnalysis{ - Threshold: 10, - StepWeight: 10, - MaxWeight: 50, - Metrics: []flaggerv1.CanaryMetric{ - { - Name: "request-success-rate", - Threshold: 99, - Interval: "1m", - }, - { - Name: "request-duration", - Threshold: 500, - Interval: "1m", - }, - }, - }, - }, - } - return cd -} - -func newMockCanary() *flaggerv1.Canary { +func newTestCanary() *flaggerv1.Canary { cd := &flaggerv1.Canary{ TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ @@ -163,13 +130,104 @@ func newMockCanary() *flaggerv1.Canary { return cd } -func newMockMirror() *flaggerv1.Canary { - cd := newMockCanary() +func newTestCanaryAppMesh() *flaggerv1.Canary { + cd := &flaggerv1.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "appmesh", + }, + Spec: flaggerv1.CanarySpec{ + TargetRef: flaggerv1.CrossNamespaceObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + Service: flaggerv1.CanaryService{ + Port: 9898, + MeshName: "global", + Hosts: []string{"*"}, + Backends: []string{"backend.default"}, + Timeout: "25", + Retries: &istiov1alpha3.HTTPRetry{ + Attempts: 5, + PerTryTimeout: "gateway-error", + RetryOn: "5s", + }, + }, CanaryAnalysis: flaggerv1.CanaryAnalysis{ + Threshold: 10, + StepWeight: 10, + MaxWeight: 50, + Metrics: []flaggerv1.CanaryMetric{ + { + Name: "request-success-rate", + Threshold: 99, + Interval: "1m", + }, + { + Name: "request-duration", + Threshold: 500, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + +func newTestSMICanary() *flaggerv1.Canary { + cd := &flaggerv1.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: flaggerv1.CanarySpec{ + TargetRef: flaggerv1.CrossNamespaceObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + Service: flaggerv1.CanaryService{ + Name: "podinfo", + Port: 80, + PortName: "http", + TargetPort: intstr.IntOrString{ + Type: 0, + IntVal: 9898, + }, + PortDiscovery: true, + }, + CanaryAnalysis: flaggerv1.CanaryAnalysis{ + Threshold: 10, + StepWeight: 10, + MaxWeight: 50, + Metrics: []flaggerv1.CanaryMetric{ + { + Name: "request-success-rate", + Threshold: 99, + Interval: "1m", + }, + { + Name: "request-duration", + Threshold: 500, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + +func newTestMirror() *flaggerv1.Canary { + cd := newTestCanary() cd.Spec.CanaryAnalysis.Mirror = true return cd } -func newMockABTest() *flaggerv1.Canary { +func newTestABTest() *flaggerv1.Canary { cd := &flaggerv1.Canary{ TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ @@ -215,7 +273,7 @@ func newMockABTest() *flaggerv1.Canary { return cd } -func newMockDeployment() *appsv1.Deployment { +func newTestDeployment() *appsv1.Deployment { d := &appsv1.Deployment{ TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ @@ -233,15 +291,20 @@ func newMockDeployment() *appsv1.Deployment { Labels: map[string]string{ "app": "podinfo", }, + Annotations: map[string]string{ + "prometheus.io/scrape": "true", + "prometheus.io/port": "9797", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ { Name: "podinfo", - Image: "quay.io/stefanprodan/podinfo:1.4.0", + Image: "stefanprodan/podinfo:test", Command: []string{ "./podinfo", "--port=9898", + "--port-metrics=9797", }, Ports: []corev1.ContainerPort{ { @@ -249,6 +312,11 @@ func newMockDeployment() *appsv1.Deployment { ContainerPort: 9898, Protocol: corev1.ProtocolTCP, }, + { + Name: "http-prom", + ContainerPort: 9797, + Protocol: corev1.ProtocolTCP, + }, }, }, }, @@ -260,7 +328,7 @@ func newMockDeployment() *appsv1.Deployment { return d } -func newMockABTestDeployment() *appsv1.Deployment { +func newTestABTestDeployment() *appsv1.Deployment { d := &appsv1.Deployment{ TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ @@ -283,7 +351,7 @@ func newMockABTestDeployment() *appsv1.Deployment { Containers: []corev1.Container{ { Name: "podinfo", - Image: "quay.io/stefanprodan/podinfo:1.4.0", + Image: "quay.io/stefanprodan/podinfo:test", Command: []string{ "./podinfo", "--port=9898", @@ -305,7 +373,7 @@ func newMockABTestDeployment() *appsv1.Deployment { return d } -func newMockCanaryIngress() *flaggerv1.Canary { +func newTestCanaryIngress() *flaggerv1.Canary { cd := &flaggerv1.Canary{ TypeMeta: metav1.TypeMeta{APIVersion: flaggerv1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ @@ -342,7 +410,7 @@ func newMockCanaryIngress() *flaggerv1.Canary { return cd } -func newMockIngress() *v1beta1.Ingress { +func newTestIngress() *v1beta1.Ingress { return &v1beta1.Ingress{ TypeMeta: metav1.TypeMeta{APIVersion: v1beta1.SchemeGroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{