From 89453394c14792221b3342e2651e28a8b8ea3c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Th=C3=B6mmes?= Date: Fri, 17 Apr 2020 17:43:24 +0200 Subject: [PATCH 1/2] Unify operators into one binary. --- .../kodata/knative-eventing/1-eventing.yaml | 0 .../2-upgrade-to-v0.14.1.yaml | 0 .../knative-serving/1-serving-crds.yaml | 0 .../knative-serving/2-serving-core.yaml | 0 .../kodata/knative-serving/3-serving-hpa.yaml | 0 .../kodata/knative-serving/4-net-istio.yaml | 0 cmd/{eventing-operator => operator}/main.go | 15 ++- cmd/serving-operator/main.go | 35 ------ config/operator.yaml | 57 +-------- config/role.yaml | 18 +++ config/role_binding.yaml | 8 +- config/service_account.yaml | 7 +- pkg/reconciler/knativeeventing/controller.go | 77 ++++++------- pkg/reconciler/knativeserving/controller.go | 109 +++++++++--------- pkg/reconciler/upgrade.go | 39 +++++++ test/config/serving | 2 +- version/version_test.go | 4 +- 17 files changed, 171 insertions(+), 200 deletions(-) rename cmd/{eventing-operator => operator}/kodata/knative-eventing/1-eventing.yaml (100%) rename cmd/{eventing-operator => operator}/kodata/knative-eventing/2-upgrade-to-v0.14.1.yaml (100%) rename cmd/{serving-operator => operator}/kodata/knative-serving/1-serving-crds.yaml (100%) rename cmd/{serving-operator => operator}/kodata/knative-serving/2-serving-core.yaml (100%) rename cmd/{serving-operator => operator}/kodata/knative-serving/3-serving-hpa.yaml (100%) rename cmd/{serving-operator => operator}/kodata/knative-serving/4-net-istio.yaml (100%) rename cmd/{eventing-operator => operator}/main.go (57%) delete mode 100644 cmd/serving-operator/main.go create mode 100644 pkg/reconciler/upgrade.go diff --git a/cmd/eventing-operator/kodata/knative-eventing/1-eventing.yaml b/cmd/operator/kodata/knative-eventing/1-eventing.yaml similarity index 100% rename from cmd/eventing-operator/kodata/knative-eventing/1-eventing.yaml rename to cmd/operator/kodata/knative-eventing/1-eventing.yaml diff --git a/cmd/eventing-operator/kodata/knative-eventing/2-upgrade-to-v0.14.1.yaml b/cmd/operator/kodata/knative-eventing/2-upgrade-to-v0.14.1.yaml similarity index 100% rename from cmd/eventing-operator/kodata/knative-eventing/2-upgrade-to-v0.14.1.yaml rename to cmd/operator/kodata/knative-eventing/2-upgrade-to-v0.14.1.yaml diff --git a/cmd/serving-operator/kodata/knative-serving/1-serving-crds.yaml b/cmd/operator/kodata/knative-serving/1-serving-crds.yaml similarity index 100% rename from cmd/serving-operator/kodata/knative-serving/1-serving-crds.yaml rename to cmd/operator/kodata/knative-serving/1-serving-crds.yaml diff --git a/cmd/serving-operator/kodata/knative-serving/2-serving-core.yaml b/cmd/operator/kodata/knative-serving/2-serving-core.yaml similarity index 100% rename from cmd/serving-operator/kodata/knative-serving/2-serving-core.yaml rename to cmd/operator/kodata/knative-serving/2-serving-core.yaml diff --git a/cmd/serving-operator/kodata/knative-serving/3-serving-hpa.yaml b/cmd/operator/kodata/knative-serving/3-serving-hpa.yaml similarity index 100% rename from cmd/serving-operator/kodata/knative-serving/3-serving-hpa.yaml rename to cmd/operator/kodata/knative-serving/3-serving-hpa.yaml diff --git a/cmd/serving-operator/kodata/knative-serving/4-net-istio.yaml b/cmd/operator/kodata/knative-serving/4-net-istio.yaml similarity index 100% rename from cmd/serving-operator/kodata/knative-serving/4-net-istio.yaml rename to cmd/operator/kodata/knative-serving/4-net-istio.yaml diff --git a/cmd/eventing-operator/main.go b/cmd/operator/main.go similarity index 57% rename from cmd/eventing-operator/main.go rename to cmd/operator/main.go index d3207d8106..7342f54773 100644 --- a/cmd/eventing-operator/main.go +++ b/cmd/operator/main.go @@ -1,5 +1,5 @@ /* -Copyright 2019 The Knative Authors +Copyright 2020 The Knative Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,16 +20,25 @@ import ( "log" "knative.dev/operator/pkg/reconciler/knativeeventing" + "knative.dev/operator/pkg/reconciler/knativeserving" "knative.dev/pkg/injection/sharedmain" "knative.dev/pkg/signals" ) +var ( + masterURL = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") + kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") +) + func main() { flag.Parse() - cfg, err := sharedmain.GetConfig(*knativeeventing.MasterURL, *knativeeventing.Kubeconfig) + cfg, err := sharedmain.GetConfig(*masterURL, *kubeconfig) if err != nil { log.Fatal("Error building kubeconfig", err) } - sharedmain.MainWithConfig(signals.NewContext(), "eventing-operator", cfg, knativeeventing.NewController) + sharedmain.MainWithConfig(signals.NewContext(), "knative-operator", cfg, + knativeserving.NewControllerWithConfig(cfg), + knativeeventing.NewControllerWithConfig(cfg), + ) } diff --git a/cmd/serving-operator/main.go b/cmd/serving-operator/main.go deleted file mode 100644 index 353f1ddbea..0000000000 --- a/cmd/serving-operator/main.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2019 The Knative Authors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package main - -import ( - "flag" - "log" - - "knative.dev/operator/pkg/reconciler/knativeserving" - "knative.dev/pkg/injection/sharedmain" - "knative.dev/pkg/signals" -) - -func main() { - flag.Parse() - - cfg, err := sharedmain.GetConfig(*knativeserving.MasterURL, *knativeserving.Kubeconfig) - if err != nil { - log.Fatal("Error building kubeconfig", err) - } - sharedmain.MainWithConfig(signals.NewContext(), "serving-operator", cfg, knativeserving.NewController) -} diff --git a/config/operator.yaml b/config/operator.yaml index a3590738d5..4a462c2c44 100644 --- a/config/operator.yaml +++ b/config/operator.yaml @@ -15,31 +15,29 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: knative-serving-operator + name: knative-operator spec: replicas: 1 selector: matchLabels: - name: knative-serving-operator + name: knative-operator template: metadata: annotations: sidecar.istio.io/inject: "false" labels: - name: knative-serving-operator + name: knative-operator spec: - serviceAccountName: knative-serving-operator + serviceAccountName: knative-operator containers: - - name: knative-serving-operator - image: ko://knative.dev/operator/cmd/serving-operator + - name: knative-operator + image: ko://knative.dev/operator/cmd/operator imagePullPolicy: IfNotPresent env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - - name: OPERATOR_NAME - value: "knative-serving-operator" - name: SYSTEM_NAMESPACE valueFrom: fieldRef: @@ -53,46 +51,3 @@ spec: ports: - name: metrics containerPort: 9090 ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: knative-eventing-operator -spec: - replicas: 1 - selector: - matchLabels: - name: knative-eventing-operator - template: - metadata: - annotations: - sidecar.istio.io/inject: "false" - labels: - name: knative-eventing-operator - spec: - serviceAccountName: knative-eventing-operator - containers: - - name: knative-eventing-operator - image: ko://knative.dev/operator/cmd/eventing-operator - imagePullPolicy: IfNotPresent - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: OPERATOR_NAME - value: "knative-eventing-operator" - - name: SYSTEM_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: CONFIG_LOGGING_NAME - value: config-logging - - name: CONFIG_OBSERVABILITY_NAME - value: config-observability - - name: METRICS_DOMAIN - value: knative.dev/eventing-operator - ports: - - name: metrics - containerPort: 9090 diff --git a/config/role.yaml b/config/role.yaml index 6d32cf931a..618d7aeb05 100644 --- a/config/role.yaml +++ b/config/role.yaml @@ -195,6 +195,14 @@ rules: - config-controller verbs: - delete +- apiGroups: + - "" + resources: + - serviceaccounts + resourceNames: + - knative-serving-operator + verbs: + - delete --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole @@ -354,3 +362,13 @@ rules: - get - list - watch +# Old resources that need cleaning up that are not in the knative-eventing +# namespace. + - apiGroups: + - "" + resources: + - serviceaccounts + resourceNames: + - knative-eventing-operator + verbs: + - delete \ No newline at end of file diff --git a/config/role_binding.yaml b/config/role_binding.yaml index fa94cbf505..792ddddc90 100644 --- a/config/role_binding.yaml +++ b/config/role_binding.yaml @@ -22,7 +22,7 @@ roleRef: name: knative-serving-operator subjects: - kind: ServiceAccount - name: knative-serving-operator + name: knative-operator namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 @@ -35,7 +35,7 @@ roleRef: name: knative-serving-operator-aggregated subjects: - kind: ServiceAccount - name: knative-serving-operator + name: knative-operator namespace: default --- # TODO: Consider restriction of non-aggregated role to knativeeventing namespaces. @@ -49,7 +49,7 @@ roleRef: name: knative-eventing-operator subjects: - kind: ServiceAccount - name: knative-eventing-operator + name: knative-operator namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 @@ -62,5 +62,5 @@ roleRef: name: knative-eventing-operator-aggregated subjects: - kind: ServiceAccount - name: knative-eventing-operator + name: knative-operator namespace: default \ No newline at end of file diff --git a/config/service_account.yaml b/config/service_account.yaml index c4c2930659..24a7630fca 100644 --- a/config/service_account.yaml +++ b/config/service_account.yaml @@ -15,9 +15,4 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: knative-serving-operator ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: knative-eventing-operator + name: knative-operator \ No newline at end of file diff --git a/pkg/reconciler/knativeeventing/controller.go b/pkg/reconciler/knativeeventing/controller.go index 23ebbfc3a8..59c3b7198e 100644 --- a/pkg/reconciler/knativeeventing/controller.go +++ b/pkg/reconciler/knativeeventing/controller.go @@ -15,72 +15,67 @@ package knativeeventing import ( "context" - "flag" "os" "path/filepath" "github.com/go-logr/zapr" mfc "github.com/manifestival/client-go-client" mf "github.com/manifestival/manifestival" + "go.uber.org/zap" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "knative.dev/operator/pkg/apis/operator/v1alpha1" knativeEventinginformer "knative.dev/operator/pkg/client/injection/informers/operator/v1alpha1/knativeeventing" knereconciler "knative.dev/operator/pkg/client/injection/reconciler/operator/v1alpha1/knativeeventing" + "knative.dev/operator/pkg/reconciler" kubeclient "knative.dev/pkg/client/injection/kube/client" deploymentinformer "knative.dev/pkg/client/injection/kube/informers/apps/v1/deployment" "knative.dev/pkg/configmap" "knative.dev/pkg/controller" - "knative.dev/pkg/injection/sharedmain" "knative.dev/pkg/logging" ) -var ( - MasterURL = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - Kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") -) - -// NewController initializes the controller and is called by the generated code +// NewControllerWithConfig initializes the controller and is called by the generated code // Registers eventhandlers to enqueue events -func NewController( - ctx context.Context, - cmw configmap.Watcher, -) *controller.Impl { - knativeEventingInformer := knativeEventinginformer.Get(ctx) - deploymentInformer := deploymentinformer.Get(ctx) - logger := logging.FromContext(ctx) +func NewControllerWithConfig(cfg *rest.Config) func(context.Context, configmap.Watcher) *controller.Impl { + return func(ctx context.Context, cmw configmap.Watcher) *controller.Impl { + knativeEventingInformer := knativeEventinginformer.Get(ctx) + deploymentInformer := deploymentinformer.Get(ctx) + kubeClient := kubeclient.Get(ctx) + logger := logging.FromContext(ctx) - koDataDir := os.Getenv("KO_DATA_PATH") + // Clean up old non-unified operator resources before even starting the controller. + if err := reconciler.RemovePreUnifiedResources(kubeClient, "knative-eventing-operator"); err != nil { + logger.Fatalw("Failed to remove old resources", zap.Error(err)) + } - cfg, err := sharedmain.GetConfig(*MasterURL, *Kubeconfig) - if err != nil { - logger.Error(err, "Error building kubeconfig") - } + koDataDir := os.Getenv("KO_DATA_PATH") + config, err := mfc.NewManifest(filepath.Join(koDataDir, "knative-eventing/"), + cfg, + mf.UseLogger(zapr.NewLogger(logger.Desugar()).WithName("manifestival"))) + if err != nil { + logger.Error(err, "Error creating the Manifest for knative-eventing") + os.Exit(1) + } - config, err := mfc.NewManifest(filepath.Join(koDataDir, "knative-eventing/"), - cfg, - mf.UseLogger(zapr.NewLogger(logger.Desugar()).WithName("manifestival"))) - if err != nil { - logger.Error(err, "Error creating the Manifest for knative-eventing") - os.Exit(1) - } + c := &Reconciler{ + kubeClientSet: kubeClient, + config: config, + eventings: sets.NewString(), + } + impl := knereconciler.NewImpl(ctx, c) - c := &Reconciler{ - kubeClientSet: kubeclient.Get(ctx), - config: config, - eventings: sets.NewString(), - } - impl := knereconciler.NewImpl(ctx, c) - - logger.Info("Setting up event handlers") + logger.Info("Setting up event handlers") - knativeEventingInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) + knativeEventingInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) - deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{ - FilterFunc: controller.Filter(v1alpha1.SchemeGroupVersion.WithKind("KnativeEventing")), - Handler: controller.HandleAll(impl.EnqueueControllerOf), - }) + deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{ + FilterFunc: controller.Filter(v1alpha1.SchemeGroupVersion.WithKind("KnativeEventing")), + Handler: controller.HandleAll(impl.EnqueueControllerOf), + }) - return impl + return impl + } } diff --git a/pkg/reconciler/knativeserving/controller.go b/pkg/reconciler/knativeserving/controller.go index 2852ec13ee..98081260f8 100644 --- a/pkg/reconciler/knativeserving/controller.go +++ b/pkg/reconciler/knativeserving/controller.go @@ -15,18 +15,19 @@ package knativeserving import ( "context" - "flag" "os" "path/filepath" + "go.uber.org/zap" + servingclient "knative.dev/operator/pkg/client/injection/client" kubeclient "knative.dev/pkg/client/injection/kube/client" - "knative.dev/pkg/injection/sharedmain" "knative.dev/pkg/logging" "github.com/go-logr/zapr" mfc "github.com/manifestival/client-go-client" mf "github.com/manifestival/manifestival" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "knative.dev/operator/pkg/apis/operator/v1alpha1" knativeServinginformer "knative.dev/operator/pkg/client/injection/informers/operator/v1alpha1/knativeserving" @@ -42,61 +43,55 @@ const ( controllerAgentName = "knativeserving-controller" ) -var ( - MasterURL = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - Kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") -) - -// NewController initializes the controller and is called by the generated code +// NewControllerWithConfig initializes the controller and is called by the generated code // Registers eventhandlers to enqueue events -func NewController( - ctx context.Context, - cmw configmap.Watcher, -) *controller.Impl { - knativeServingInformer := knativeServinginformer.Get(ctx) - deploymentInformer := deploymentinformer.Get(ctx) - logger := logging.FromContext(ctx) - - statsReporter, err := reconciler.NewStatsReporter(controllerAgentName) - if err != nil { - logger.Fatal(err) - } - - c := &Reconciler{ - kubeClientSet: kubeclient.Get(ctx), - knativeServingClientSet: servingclient.Get(ctx), - statsReporter: statsReporter, - knativeServingLister: knativeServingInformer.Lister(), - servings: map[string]int64{}, - platform: common.GetPlatforms(ctx), - } - - koDataDir := os.Getenv("KO_DATA_PATH") - - cfg, err := sharedmain.GetConfig(*MasterURL, *Kubeconfig) - if err != nil { - logger.Error(err, "Error building kubeconfig") +func NewControllerWithConfig(cfg *rest.Config) func(context.Context, configmap.Watcher) *controller.Impl { + return func(ctx context.Context, cmw configmap.Watcher) *controller.Impl { + knativeServingInformer := knativeServinginformer.Get(ctx) + deploymentInformer := deploymentinformer.Get(ctx) + kubeClient := kubeclient.Get(ctx) + logger := logging.FromContext(ctx) + + // Clean up old non-unified operator resources before even starting the controller. + if err := reconciler.RemovePreUnifiedResources(kubeClient, "knative-serving-operator"); err != nil { + logger.Fatalw("Failed to remove old resources", zap.Error(err)) + } + + statsReporter, err := reconciler.NewStatsReporter(controllerAgentName) + if err != nil { + logger.Fatal(err) + } + + c := &Reconciler{ + kubeClientSet: kubeClient, + knativeServingClientSet: servingclient.Get(ctx), + statsReporter: statsReporter, + knativeServingLister: knativeServingInformer.Lister(), + servings: map[string]int64{}, + platform: common.GetPlatforms(ctx), + } + + koDataDir := os.Getenv("KO_DATA_PATH") + config, err := mfc.NewManifest(filepath.Join(koDataDir, "knative-serving/"), + cfg, + mf.UseLogger(zapr.NewLogger(logger.Desugar()).WithName("manifestival"))) + if err != nil { + logger.Error(err, "Error creating the Manifest for knative-serving") + os.Exit(1) + } + + c.config = config + impl := knsreconciler.NewImpl(ctx, c) + + logger.Info("Setting up event handlers") + + knativeServingInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) + + deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{ + FilterFunc: controller.Filter(v1alpha1.SchemeGroupVersion.WithKind("KnativeServing")), + Handler: controller.HandleAll(impl.EnqueueControllerOf), + }) + + return impl } - - config, err := mfc.NewManifest(filepath.Join(koDataDir, "knative-serving/"), - cfg, - mf.UseLogger(zapr.NewLogger(logger.Desugar()).WithName("manifestival"))) - if err != nil { - logger.Error(err, "Error creating the Manifest for knative-serving") - os.Exit(1) - } - - c.config = config - impl := knsreconciler.NewImpl(ctx, c) - - logger.Info("Setting up event handlers") - - knativeServingInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) - - deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{ - FilterFunc: controller.Filter(v1alpha1.SchemeGroupVersion.WithKind("KnativeServing")), - Handler: controller.HandleAll(impl.EnqueueControllerOf), - }) - - return impl } diff --git a/pkg/reconciler/upgrade.go b/pkg/reconciler/upgrade.go new file mode 100644 index 0000000000..7416dcdfa5 --- /dev/null +++ b/pkg/reconciler/upgrade.go @@ -0,0 +1,39 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package reconciler + +import ( + "fmt" + + apierrs "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "knative.dev/pkg/system" +) + +// RemovePreUnified resources removes resources that predate the fusion of the operators +// into a single binary. +func RemovePreUnifiedResources(kube kubernetes.Interface, oldName string) error { + if err := kube.AppsV1().Deployments(system.Namespace()).Delete(oldName, &metav1.DeleteOptions{}); err != nil && !apierrs.IsNotFound(err) { + return fmt.Errorf("failed to remove old deployment %s: %w", oldName, err) + } + if err := kube.CoreV1().ServiceAccounts(system.Namespace()).Delete(oldName, &metav1.DeleteOptions{}); err != nil && !apierrs.IsNotFound(err) { + return fmt.Errorf("failed to remove old serviceaccount %s: %w", oldName, err) + } + + return nil +} diff --git a/test/config/serving b/test/config/serving index cc5c775567..96cd72bfd5 120000 --- a/test/config/serving +++ b/test/config/serving @@ -1 +1 @@ -../../cmd/serving-operator/kodata/knative-serving \ No newline at end of file +../../cmd/operator/kodata/knative-serving \ No newline at end of file diff --git a/version/version_test.go b/version/version_test.go index e7b5598329..9c3afb4fcd 100644 --- a/version/version_test.go +++ b/version/version_test.go @@ -25,7 +25,7 @@ import ( func TestManifestVersionServingSame(t *testing.T) { _, b, _, _ := runtime.Caller(0) - manifest, err := mf.NewManifest(filepath.Join(filepath.Dir(b)+"/..", "cmd/serving-operator/kodata/knative-serving/")) + manifest, err := mf.NewManifest(filepath.Join(filepath.Dir(b)+"/..", "cmd/operator/kodata/knative-serving/")) if err != nil { t.Fatal("Failed to load manifest", err) } @@ -45,7 +45,7 @@ func TestManifestVersionServingSame(t *testing.T) { func TestManifestVersionEventingSame(t *testing.T) { _, b, _, _ := runtime.Caller(0) - manifest, err := mf.NewManifest(filepath.Join(filepath.Dir(b)+"/..", "cmd/eventing-operator/kodata/knative-eventing/")) + manifest, err := mf.NewManifest(filepath.Join(filepath.Dir(b)+"/..", "cmd/operator/kodata/knative-eventing/")) if err != nil { t.Fatal("Failed to load manifest", err) } From a89446fcca93bd21b40aaab86693b9d263f41b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Th=C3=B6mmes?= Date: Tue, 28 Apr 2020 10:51:58 +0200 Subject: [PATCH 2/2] Add tests. --- pkg/reconciler/upgrade_test.go | 96 ++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 pkg/reconciler/upgrade_test.go diff --git a/pkg/reconciler/upgrade_test.go b/pkg/reconciler/upgrade_test.go new file mode 100644 index 0000000000..ff2439c47a --- /dev/null +++ b/pkg/reconciler/upgrade_test.go @@ -0,0 +1,96 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package reconciler + +import ( + "os" + "testing" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + apierrs "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + fakekube "k8s.io/client-go/kubernetes/fake" + "knative.dev/pkg/system" +) + +func TestRemovePreUnifiedResources(t *testing.T) { + tests := []struct { + name string + in []runtime.Object + oldName string + }{{ + name: "none exist", + oldName: "test1", + }, { + name: "delete deployment only", + in: []runtime.Object{ + deployment("test", "test2"), + }, + oldName: "test2", + }, { + name: "delete serviceaccount only", + in: []runtime.Object{ + sa("test", "test3"), + }, + oldName: "test3", + }, { + name: "delete both", + in: []runtime.Object{ + deployment("test", "test4"), + sa("test", "test4"), + }, + oldName: "test4", + }} + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ns := "test" + os.Setenv(system.NamespaceEnvKey, ns) + fake := fakekube.NewSimpleClientset(test.in...) + if err := RemovePreUnifiedResources(fake, test.oldName); err != nil { + t.Fatalf("RemovePreUnifiedResources() = %v, want nil", err) + } + + if _, err := fake.CoreV1().ServiceAccounts(ns).Get(test.oldName, metav1.GetOptions{}); !apierrs.IsNotFound(err) { + t.Fatalf("ServiceAccount %s was still present: %v", test.oldName, err) + } + if _, err := fake.AppsV1().Deployments(ns).Get(test.oldName, metav1.GetOptions{}); !apierrs.IsNotFound(err) { + t.Fatalf("Deployment %s was still present: %v", test.oldName, err) + } + }) + } +} + +func deployment(ns, name string) *appsv1.Deployment { + return &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: name, + }, + } +} + +func sa(ns, name string) *corev1.ServiceAccount { + return &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: name, + }, + } +}