From 8e2f538e4c7a0e83ce236c59a1c48eb2a4e1082b Mon Sep 17 00:00:00 2001 From: Stefan Prodan Date: Mon, 22 Oct 2018 20:14:09 +0300 Subject: [PATCH] Add scheduler tests for initialization and revision --- pkg/controller/observer.go | 7 ++ pkg/controller/scheduler_test.go | 142 +++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 pkg/controller/scheduler_test.go diff --git a/pkg/controller/observer.go b/pkg/controller/observer.go index 76f1d012..74fc0f4b 100644 --- a/pkg/controller/observer.go +++ b/pkg/controller/observer.go @@ -74,6 +74,10 @@ func (c *CanaryObserver) queryMetric(query string) (*VectorQueryResponse, error) // istio_requests_total func (c *CanaryObserver) GetDeploymentCounter(name string, namespace string, metric string, interval string) (float64, error) { + if c.metricsServer == "fake" { + return 100, nil + } + var rate *float64 querySt := url.QueryEscape(`sum(rate(` + metric + `{reporter="destination",destination_workload_namespace=~"` + @@ -107,6 +111,9 @@ func (c *CanaryObserver) GetDeploymentCounter(name string, namespace string, met // istio_request_duration_seconds_bucket func (c *CanaryObserver) GetDeploymentHistogram(name string, namespace string, metric string, interval string) (time.Duration, error) { + if c.metricsServer == "fake" { + return 1, nil + } var rate *float64 querySt := url.QueryEscape(`histogram_quantile(0.99, sum(rate(` + metric + `{reporter="destination",destination_workload=~"` + diff --git a/pkg/controller/scheduler_test.go b/pkg/controller/scheduler_test.go new file mode 100644 index 00000000..dd44e318 --- /dev/null +++ b/pkg/controller/scheduler_test.go @@ -0,0 +1,142 @@ +package controller + +import ( + "sync" + "testing" + "time" + + fakeIstio "github.com/knative/pkg/client/clientset/versioned/fake" + 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 } +) + +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", + } + + flaggerInformerFactory := informers.NewSharedInformerFactory(flaggerClient, noResyncPeriodFunc()) + flaggerInformer := flaggerInformerFactory.Flagger().V1alpha1().Canaries() + + ctrl := &Controller{ + kubeClient: kubeClient, + istioClient: istioClient, + flaggerClient: flaggerClient, + flaggerLister: flaggerInformer.Lister(), + flaggerSynced: flaggerInformer.Informer().HasSynced, + workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), controllerAgentName), + recorder: &record.FakeRecorder{}, + logger: logger, + canaries: new(sync.Map), + flaggerWindow: time.Second, + deployer: deployer, + router: router, + observer: observer, + } + ctrl.flaggerSynced = alwaysReady + + ctrl.advanceCanary("podinfo", "default") + + _, err := kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } +} + +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", + } + + flaggerInformerFactory := informers.NewSharedInformerFactory(flaggerClient, noResyncPeriodFunc()) + flaggerInformer := flaggerInformerFactory.Flagger().V1alpha1().Canaries() + + ctrl := &Controller{ + kubeClient: kubeClient, + istioClient: istioClient, + flaggerClient: flaggerClient, + flaggerLister: flaggerInformer.Lister(), + flaggerSynced: flaggerInformer.Informer().HasSynced, + workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), controllerAgentName), + recorder: &record.FakeRecorder{}, + logger: logger, + canaries: new(sync.Map), + flaggerWindow: time.Second, + deployer: deployer, + router: router, + observer: observer, + } + ctrl.flaggerSynced = alwaysReady + + // init + ctrl.advanceCanary("podinfo", "default") + + // update + dep2 := newTestDeploymentUpdated() + _, err := kubeClient.AppsV1().Deployments("default").Update(dep2) + if err != nil { + t.Fatal(err.Error()) + } + + // detect changes + ctrl.advanceCanary("podinfo", "default") + + c, err := kubeClient.AppsV1().Deployments("default").Get("podinfo", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if *c.Spec.Replicas != 1 { + t.Errorf("Got canary replicas %v wanted %v", *c.Spec.Replicas, 1) + } +}