diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go new file mode 100644 index 000000000..fce27fa6f --- /dev/null +++ b/pkg/controller/controller_test.go @@ -0,0 +1,326 @@ +package controller + +import ( + istioclientset "github.com/knative/pkg/client/clientset/versioned" + fakeIstio "github.com/knative/pkg/client/clientset/versioned/fake" + "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" + clientset "github.com/stefanprodan/flagger/pkg/client/clientset/versioned" + fakeFlagger "github.com/stefanprodan/flagger/pkg/client/clientset/versioned/fake" + informers "github.com/stefanprodan/flagger/pkg/client/informers/externalversions" + "github.com/stefanprodan/flagger/pkg/logging" + "go.uber.org/zap" + appsv1 "k8s.io/api/apps/v1" + hpav1 "k8s.io/api/autoscaling/v1" + hpav2 "k8s.io/api/autoscaling/v2beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/tools/record" + "k8s.io/client-go/util/workqueue" + "sync" + "time" +) + +var ( + alwaysReady = func() bool { return true } + noResyncPeriodFunc = func() time.Duration { return 0 } +) + +func SetupTest() ( + canary *v1alpha3.Canary, + kubeClient kubernetes.Interface, + istioClient istioclientset.Interface, + flaggerClient clientset.Interface, + deployer CanaryDeployer, + router CanaryRouter, + observer CanaryObserver, + controller *Controller, + logger *zap.SugaredLogger, +) { + canary = newTestCanary() + configMap := NewTestConfigMap() + dep := newTestDeployment() + hpa := newTestHPA() + + kubeClient = fake.NewSimpleClientset(configMap, dep, hpa) + + istioClient = fakeIstio.NewSimpleClientset() + + flaggerClient = fakeFlagger.NewSimpleClientset(canary) + + logger, _ = logging.NewLogger("debug") + + observer = CanaryObserver{ + metricsServer: "fake", + } + + deployer = CanaryDeployer{ + flaggerClient: flaggerClient, + kubeClient: kubeClient, + logger: logger, + configTracker: ConfigTracker{ + logger: logger, + kubeClient: kubeClient, + flaggerClient: flaggerClient, + }, + } + + router = CanaryRouter{ + flaggerClient: flaggerClient, + kubeClient: kubeClient, + istioClient: istioClient, + logger: logger, + } + + controller = newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + + return +} + +func newTestController( + kubeClient kubernetes.Interface, + istioClient istioclientset.Interface, + flaggerClient clientset.Interface, + logger *zap.SugaredLogger, + deployer CanaryDeployer, + router CanaryRouter, + observer CanaryObserver, +) *Controller { + flaggerInformerFactory := informers.NewSharedInformerFactory(flaggerClient, noResyncPeriodFunc()) + flaggerInformer := flaggerInformerFactory.Flagger().V1alpha3().Canaries() + + ctrl := &Controller{ + kubeClient: kubeClient, + istioClient: istioClient, + flaggerClient: flaggerClient, + flaggerLister: flaggerInformer.Lister(), + flaggerSynced: flaggerInformer.Informer().HasSynced, + workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), controllerAgentName), + eventRecorder: &record.FakeRecorder{}, + logger: logger, + canaries: new(sync.Map), + flaggerWindow: time.Second, + deployer: deployer, + router: router, + observer: observer, + recorder: NewCanaryRecorder(false), + } + ctrl.flaggerSynced = alwaysReady + + return ctrl +} + +func NewTestConfigMap() *corev1.ConfigMap { + return &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{APIVersion: corev1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo-config-env", + }, + Data: map[string]string{ + "color": "red", + }, + } +} + +func NewTestConfigMapUpdated() *corev1.ConfigMap { + return &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{APIVersion: corev1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo-config-env", + }, + Data: map[string]string{ + "color": "blue", + "output": "console", + }, + } +} + +func newTestCanary() *v1alpha3.Canary { + cd := &v1alpha3.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: v1alpha3.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: v1alpha3.CanarySpec{ + TargetRef: hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + AutoscalerRef: &hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "autoscaling/v2beta1", + Kind: "HorizontalPodAutoscaler", + }, Service: v1alpha3.CanaryService{ + Port: 9898, + }, CanaryAnalysis: v1alpha3.CanaryAnalysis{ + Threshold: 10, + StepWeight: 10, + MaxWeight: 50, + Metrics: []v1alpha3.CanaryMetric{ + { + Name: "istio_requests_total", + Threshold: 99, + Interval: "1m", + }, + { + Name: "istio_request_duration_seconds_bucket", + Threshold: 500, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + +func newTestDeployment() *appsv1.Deployment { + d := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "podinfo", + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "podinfo", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "podinfo", + Image: "quay.io/stefanprodan/podinfo:1.2.0", + Command: []string{ + "./podinfo", + "--port=9898", + }, + Args: nil, + WorkingDir: "", + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 9898, + Protocol: corev1.ProtocolTCP, + }, + }, + Env: []corev1.EnvVar{ + { + Name: "PODINFO_UI_COLOR", + ValueFrom: &corev1.EnvVarSource{ + ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "podinfo-config-env", + }, + Key: "color", + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + return d +} + +func newTestDeploymentUpdated() *appsv1.Deployment { + d := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "podinfo", + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "podinfo", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "podinfo", + Image: "quay.io/stefanprodan/podinfo:1.2.1", + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 9898, + Protocol: corev1.ProtocolTCP, + }, + }, + Command: []string{ + "./podinfo", + "--port=9898", + }, + Env: []corev1.EnvVar{ + { + Name: "PODINFO_UI_COLOR", + ValueFrom: &corev1.EnvVarSource{ + ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "podinfo-config-env", + }, + Key: "color", + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + return d +} + +func newTestHPA() *hpav2.HorizontalPodAutoscaler { + h := &hpav2.HorizontalPodAutoscaler{ + TypeMeta: metav1.TypeMeta{APIVersion: hpav2.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: hpav2.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: hpav2.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + Metrics: []hpav2.MetricSpec{ + { + Type: "Resource", + Resource: &hpav2.ResourceMetricSource{ + Name: "cpu", + TargetAverageUtilization: int32p(99), + }, + }, + }, + }, + } + + return h +} diff --git a/pkg/controller/deployer_test.go b/pkg/controller/deployer_test.go index 69910efc2..6560278f2 100644 --- a/pkg/controller/deployer_test.go +++ b/pkg/controller/deployer_test.go @@ -4,190 +4,11 @@ import ( "testing" "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" - fakeFlagger "github.com/stefanprodan/flagger/pkg/client/clientset/versioned/fake" - "github.com/stefanprodan/flagger/pkg/logging" - appsv1 "k8s.io/api/apps/v1" - hpav1 "k8s.io/api/autoscaling/v1" - hpav2 "k8s.io/api/autoscaling/v2beta1" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" ) -func newTestCanary() *v1alpha3.Canary { - cd := &v1alpha3.Canary{ - TypeMeta: metav1.TypeMeta{APIVersion: v1alpha3.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "podinfo", - }, - Spec: v1alpha3.CanarySpec{ - TargetRef: hpav1.CrossVersionObjectReference{ - Name: "podinfo", - APIVersion: "apps/v1", - Kind: "Deployment", - }, - AutoscalerRef: &hpav1.CrossVersionObjectReference{ - Name: "podinfo", - APIVersion: "autoscaling/v2beta1", - Kind: "HorizontalPodAutoscaler", - }, Service: v1alpha3.CanaryService{ - Port: 9898, - }, CanaryAnalysis: v1alpha3.CanaryAnalysis{ - Threshold: 10, - StepWeight: 10, - MaxWeight: 50, - Metrics: []v1alpha3.CanaryMetric{ - { - Name: "istio_requests_total", - Threshold: 99, - Interval: "1m", - }, - { - Name: "istio_request_duration_seconds_bucket", - Threshold: 500, - Interval: "1m", - }, - }, - }, - }, - } - return cd -} - -func newTestDeployment() *appsv1.Deployment { - d := &appsv1.Deployment{ - TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "podinfo", - }, - Spec: appsv1.DeploymentSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "app": "podinfo", - }, - }, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "app": "podinfo", - }, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "podinfo", - Image: "quay.io/stefanprodan/podinfo:1.2.0", - Ports: []corev1.ContainerPort{ - { - Name: "http", - ContainerPort: 9898, - Protocol: corev1.ProtocolTCP, - }, - }, - Command: []string{ - "./podinfo", - "--port=9898", - }, - }, - }, - }, - }, - }, - } - - return d -} - -func newTestDeploymentUpdated() *appsv1.Deployment { - d := &appsv1.Deployment{ - TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "podinfo", - }, - Spec: appsv1.DeploymentSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "app": "podinfo", - }, - }, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "app": "podinfo", - }, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "podinfo", - Image: "quay.io/stefanprodan/podinfo:1.2.1", - Ports: []corev1.ContainerPort{ - { - Name: "http", - ContainerPort: 9898, - Protocol: corev1.ProtocolTCP, - }, - }, - Command: []string{ - "./podinfo", - "--port=9898", - }, - }, - }, - }, - }, - }, - } - - return d -} - -func newTestHPA() *hpav2.HorizontalPodAutoscaler { - h := &hpav2.HorizontalPodAutoscaler{ - TypeMeta: metav1.TypeMeta{APIVersion: hpav2.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "podinfo", - }, - Spec: hpav2.HorizontalPodAutoscalerSpec{ - ScaleTargetRef: hpav2.CrossVersionObjectReference{ - Name: "podinfo", - APIVersion: "apps/v1", - Kind: "Deployment", - }, - Metrics: []hpav2.MetricSpec{ - { - Type: "Resource", - Resource: &hpav2.ResourceMetricSource{ - Name: "cpu", - TargetAverageUtilization: int32p(99), - }, - }, - }, - }, - } - - return h -} - func TestCanaryDeployer_Sync(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, kubeClient, _, _, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { @@ -199,6 +20,9 @@ func TestCanaryDeployer_Sync(t *testing.T) { t.Fatal(err.Error()) } + dep := newTestDeployment() + configMap := NewTestConfigMap() + primaryImage := depPrimary.Spec.Template.Spec.Containers[0].Image sourceImage := dep.Spec.Template.Spec.Containers[0].Image if primaryImage != sourceImage { @@ -213,31 +37,26 @@ func TestCanaryDeployer_Sync(t *testing.T) { if hpaPrimary.Spec.ScaleTargetRef.Name != depPrimary.Name { t.Errorf("Got HPA target %s wanted %s", hpaPrimary.Spec.ScaleTargetRef.Name, depPrimary.Name) } -} - -func TestCanaryDeployer_IsNewSpec(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - dep2 := newTestDeploymentUpdated() - - hpa := newTestHPA() - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) + configPrimary, err := kubeClient.CoreV1().ConfigMaps("default").Get("podinfo-config-env-primary", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, + if configPrimary.Data["color"] != configMap.Data["color"] { + t.Errorf("Got ConfigMap color %s wanted %s", configPrimary.Data["color"], configMap.Data["color"]) } +} + +func TestCanaryDeployer_IsNewSpec(t *testing.T) { + canary, kubeClient, _, _, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { t.Fatal(err.Error()) } + dep2 := newTestDeploymentUpdated() _, err = kubeClient.AppsV1().Deployments("default").Update(dep2) if err != nil { t.Fatal(err.Error()) @@ -254,33 +73,25 @@ func TestCanaryDeployer_IsNewSpec(t *testing.T) { } func TestCanaryDeployer_Promote(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - dep2 := newTestDeploymentUpdated() - - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, kubeClient, _, _, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { t.Fatal(err.Error()) } + dep2 := newTestDeploymentUpdated() _, err = kubeClient.AppsV1().Deployments("default").Update(dep2) if err != nil { t.Fatal(err.Error()) } + config2 := NewTestConfigMapUpdated() + _, err = kubeClient.CoreV1().ConfigMaps("default").Update(config2) + if err != nil { + t.Fatal(err.Error()) + } + err = deployer.Promote(canary) if err != nil { t.Fatal(err.Error()) @@ -296,23 +107,19 @@ func TestCanaryDeployer_Promote(t *testing.T) { if primaryImage != sourceImage { t.Errorf("Got image %s wanted %s", primaryImage, sourceImage) } -} - -func TestCanaryDeployer_IsReady(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) + configPrimary, err := kubeClient.CoreV1().ConfigMaps("default").Get("podinfo-config-env-primary", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, + if configPrimary.Data["color"] != config2.Data["color"] { + t.Errorf("Got primary ConfigMap color %s wanted %s", configPrimary.Data["color"], config2.Data["color"]) } +} + +func TestCanaryDeployer_IsReady(t *testing.T) { + canary, _, _, _, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { @@ -331,20 +138,7 @@ func TestCanaryDeployer_IsReady(t *testing.T) { } func TestCanaryDeployer_SetFailedChecks(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, _, _, flaggerClient, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { @@ -367,20 +161,7 @@ func TestCanaryDeployer_SetFailedChecks(t *testing.T) { } func TestCanaryDeployer_SetState(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, _, _, flaggerClient, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { @@ -403,20 +184,7 @@ func TestCanaryDeployer_SetState(t *testing.T) { } func TestCanaryDeployer_SyncStatus(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, _, _, flaggerClient, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { @@ -447,20 +215,7 @@ func TestCanaryDeployer_SyncStatus(t *testing.T) { } func TestCanaryDeployer_Scale(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - - kubeClient := fake.NewSimpleClientset(dep, hpa) - - logger, _ := logging.NewLogger("debug") - deployer := &CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } + canary, kubeClient, _, _, deployer, _, _, _, _ := SetupTest() err := deployer.Sync(canary) if err != nil { diff --git a/pkg/controller/scheduler_test.go b/pkg/controller/scheduler_test.go index 3c03fd749..16d653ecc 100644 --- a/pkg/controller/scheduler_test.go +++ b/pkg/controller/scheduler_test.go @@ -1,88 +1,13 @@ package controller import ( - "go.uber.org/zap" - "k8s.io/client-go/kubernetes" - "sync" - "testing" - "time" - - istioclientset "github.com/knative/pkg/client/clientset/versioned" - fakeIstio "github.com/knative/pkg/client/clientset/versioned/fake" "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" - clientset "github.com/stefanprodan/flagger/pkg/client/clientset/versioned" - fakeFlagger "github.com/stefanprodan/flagger/pkg/client/clientset/versioned/fake" - informers "github.com/stefanprodan/flagger/pkg/client/informers/externalversions" - "github.com/stefanprodan/flagger/pkg/logging" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/record" - "k8s.io/client-go/util/workqueue" -) - -var ( - alwaysReady = func() bool { return true } - noResyncPeriodFunc = func() time.Duration { return 0 } + "testing" ) -func newTestController( - kubeClient kubernetes.Interface, - istioClient istioclientset.Interface, - flaggerClient clientset.Interface, - logger *zap.SugaredLogger, - deployer CanaryDeployer, - router CanaryRouter, - observer CanaryObserver, -) *Controller { - flaggerInformerFactory := informers.NewSharedInformerFactory(flaggerClient, noResyncPeriodFunc()) - flaggerInformer := flaggerInformerFactory.Flagger().V1alpha3().Canaries() - - ctrl := &Controller{ - kubeClient: kubeClient, - istioClient: istioClient, - flaggerClient: flaggerClient, - flaggerLister: flaggerInformer.Lister(), - flaggerSynced: flaggerInformer.Informer().HasSynced, - workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), controllerAgentName), - eventRecorder: &record.FakeRecorder{}, - logger: logger, - canaries: new(sync.Map), - flaggerWindow: time.Second, - deployer: deployer, - router: router, - observer: observer, - recorder: NewCanaryRecorder(false), - } - ctrl.flaggerSynced = alwaysReady - - return ctrl -} - func TestScheduler_Init(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - kubeClient := fake.NewSimpleClientset(dep, hpa) - istioClient := fakeIstio.NewSimpleClientset() - - logger, _ := logging.NewLogger("debug") - deployer := CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } - router := CanaryRouter{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - istioClient: istioClient, - logger: logger, - } - observer := CanaryObserver{ - metricsServer: "fake", - } - ctrl := newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + _, kubeClient, _, _, _, _, _, ctrl, _ := SetupTest() ctrl.advanceCanary("podinfo", "default", false) @@ -93,30 +18,7 @@ func TestScheduler_Init(t *testing.T) { } func TestScheduler_NewRevision(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - kubeClient := fake.NewSimpleClientset(dep, hpa) - istioClient := fakeIstio.NewSimpleClientset() - - logger, _ := logging.NewLogger("debug") - deployer := CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } - router := CanaryRouter{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - istioClient: istioClient, - logger: logger, - } - observer := CanaryObserver{ - metricsServer: "fake", - } - ctrl := newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + _, kubeClient, _, _, _, _, _, ctrl, _ := SetupTest() // init ctrl.advanceCanary("podinfo", "default", false) @@ -142,30 +44,7 @@ func TestScheduler_NewRevision(t *testing.T) { } func TestScheduler_Rollback(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - kubeClient := fake.NewSimpleClientset(dep, hpa) - istioClient := fakeIstio.NewSimpleClientset() - - logger, _ := logging.NewLogger("debug") - deployer := CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } - router := CanaryRouter{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - istioClient: istioClient, - logger: logger, - } - observer := CanaryObserver{ - metricsServer: "fake", - } - ctrl := newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + canary, _, _, flaggerClient, deployer, _, _, ctrl, _ := SetupTest() // init ctrl.advanceCanary("podinfo", "default", true) @@ -190,30 +69,7 @@ func TestScheduler_Rollback(t *testing.T) { } func TestScheduler_NewRevisionReset(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - kubeClient := fake.NewSimpleClientset(dep, hpa) - istioClient := fakeIstio.NewSimpleClientset() - - logger, _ := logging.NewLogger("debug") - deployer := CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } - router := CanaryRouter{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - istioClient: istioClient, - logger: logger, - } - observer := CanaryObserver{ - metricsServer: "fake", - } - ctrl := newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + canary, kubeClient, _, _, _, router, _, ctrl, _ := SetupTest() // init ctrl.advanceCanary("podinfo", "default", false) @@ -268,30 +124,7 @@ func TestScheduler_NewRevisionReset(t *testing.T) { } func TestScheduler_Promotion(t *testing.T) { - canary := newTestCanary() - dep := newTestDeployment() - hpa := newTestHPA() - - flaggerClient := fakeFlagger.NewSimpleClientset(canary) - kubeClient := fake.NewSimpleClientset(dep, hpa) - istioClient := fakeIstio.NewSimpleClientset() - - logger, _ := logging.NewLogger("debug") - deployer := CanaryDeployer{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - logger: logger, - } - router := CanaryRouter{ - flaggerClient: flaggerClient, - kubeClient: kubeClient, - istioClient: istioClient, - logger: logger, - } - observer := CanaryObserver{ - metricsServer: "fake", - } - ctrl := newTestController(kubeClient, istioClient, flaggerClient, logger, deployer, router, observer) + canary, kubeClient, _, flaggerClient, _, router, _, ctrl, _ := SetupTest() // init ctrl.advanceCanary("podinfo", "default", false) @@ -318,6 +151,12 @@ func TestScheduler_Promotion(t *testing.T) { t.Fatal(err.Error()) } + config2 := NewTestConfigMapUpdated() + _, err = kubeClient.CoreV1().ConfigMaps("default").Update(config2) + if err != nil { + t.Fatal(err.Error()) + } + // advance ctrl.advanceCanary("podinfo", "default", true) @@ -348,6 +187,15 @@ func TestScheduler_Promotion(t *testing.T) { t.Errorf("Got primary image %v wanted %v", primaryImage, canaryImage) } + configPrimary, err := kubeClient.CoreV1().ConfigMaps("default").Get("podinfo-config-env-primary", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if configPrimary.Data["color"] != config2.Data["color"] { + t.Errorf("Got primary ConfigMap color %s wanted %s", configPrimary.Data["color"], config2.Data["color"]) + } + c, err := flaggerClient.FlaggerV1alpha3().Canaries("default").Get("podinfo", metav1.GetOptions{}) if err != nil { t.Fatal(err.Error())