From 71cd9ffe35e1c3935a6c25a88a40b010c97ef122 Mon Sep 17 00:00:00 2001 From: Eric Paris Date: Fri, 4 May 2018 07:52:39 -0400 Subject: [PATCH] pkg/generator: Work in my namespace, not default This will make it, by default, watch for CRs in the same namespace as the operator and it will create the busybox pods in that namespace as well. The watch namespace can be set by setting the WATCH_NAMESPACE env explicitly in the operator deployment. Resolves #187 --- pkg/generator/deploy_tmpl.go | 5 +++++ pkg/generator/gen_deploy_test.go | 5 +++++ pkg/generator/gen_main.go | 3 +++ pkg/generator/generator_test.go | 18 ++++++++++++++---- pkg/generator/handler_tmpl.go | 4 ++-- pkg/generator/main_tmpl.go | 12 +++++++++++- pkg/util/k8sutil/constants.go | 4 ++++ pkg/util/k8sutil/k8sutil.go | 13 +++++++++++++ 8 files changed, 57 insertions(+), 7 deletions(-) diff --git a/pkg/generator/deploy_tmpl.go b/pkg/generator/deploy_tmpl.go index 13ec4ec017..94f15411c1 100644 --- a/pkg/generator/deploy_tmpl.go +++ b/pkg/generator/deploy_tmpl.go @@ -49,6 +49,11 @@ spec: command: - {{.ProjectName}} imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace ` const rbacYamlTmpl = `kind: Role diff --git a/pkg/generator/gen_deploy_test.go b/pkg/generator/gen_deploy_test.go index 1f956ab9de..80b27681ac 100644 --- a/pkg/generator/gen_deploy_test.go +++ b/pkg/generator/gen_deploy_test.go @@ -40,6 +40,11 @@ spec: command: - app-operator imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace ` const rbacYamlExp = `kind: Role diff --git a/pkg/generator/gen_main.go b/pkg/generator/gen_main.go index 07cada7458..5f56a1d653 100644 --- a/pkg/generator/gen_main.go +++ b/pkg/generator/gen_main.go @@ -23,6 +23,7 @@ import ( const ( // sdkImport is the operator-sdk import path. sdkImport = "github.com/operator-framework/operator-sdk/pkg/sdk" + k8sutilImport = "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" versionImport = "github.com/operator-framework/operator-sdk/version" ) @@ -32,6 +33,7 @@ type Main struct { // imports OperatorSDKImport string StubImport string + K8sutilImport string SDKVersionImport string APIVersion string @@ -49,6 +51,7 @@ func renderMainFile(w io.Writer, repo, apiVersion, kind string) error { m := Main{ OperatorSDKImport: sdkImport, StubImport: filepath.Join(repo, stubDir), + K8sutilImport: k8sutilImport, SDKVersionImport: versionImport, APIVersion: apiVersion, Kind: kind, diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 06fefc1e14..c67550ad31 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -27,6 +27,7 @@ import ( stub "github.com/example-inc/app-operator/pkg/stub" sdk "github.com/operator-framework/operator-sdk/pkg/sdk" + k8sutil "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" "github.com/sirupsen/logrus" @@ -40,7 +41,16 @@ func printVersion() { func main() { printVersion() - sdk.Watch("app.example.com/v1alpha1", "AppService", "default", 5) + + resource := "app.example.com/v1alpha1" + kind := "AppService" + namespace, err := k8sutil.GetWatchNamespace() + if err != nil { + logrus.Fatalf("Failed to get watch namespace: %v", err) + } + resyncPeriod := 5 + logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod) + sdk.Watch(resource, kind, namespace, resyncPeriod) sdk.Handle(stub.NewHandler()) sdk.Run(context.TODO()) } @@ -54,7 +64,7 @@ func TestGenMain(t *testing.T) { } if mainExp != buf.String() { - t.Errorf("want %v, got %v", mainExp, buf.String()) + t.Errorf("want %v\ngot %v", mainExp, buf.String()) } } @@ -104,8 +114,8 @@ func newbusyBoxPod(cr *v1alpha1.AppService) *v1.Pod { APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "busy-box", - Namespace: "default", + Name: "busy-box", + Namespace: cr.Namespace, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cr, schema.GroupVersionKind{ Group: v1alpha1.SchemeGroupVersion.Group, diff --git a/pkg/generator/handler_tmpl.go b/pkg/generator/handler_tmpl.go index ee528d0969..5370703e55 100644 --- a/pkg/generator/handler_tmpl.go +++ b/pkg/generator/handler_tmpl.go @@ -61,8 +61,8 @@ func newbusyBoxPod(cr *{{.Version}}.{{.Kind}}) *v1.Pod { APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "busy-box", - Namespace: "default", + Name: "busy-box", + Namespace: cr.Namespace, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cr, schema.GroupVersionKind{ Group: {{.Version}}.SchemeGroupVersion.Group, diff --git a/pkg/generator/main_tmpl.go b/pkg/generator/main_tmpl.go index 880b97f781..7737784bbe 100644 --- a/pkg/generator/main_tmpl.go +++ b/pkg/generator/main_tmpl.go @@ -23,6 +23,7 @@ import ( stub "{{.StubImport}}" sdk "{{.OperatorSDKImport}}" + k8sutil "{{.K8sutilImport}}" sdkVersion "{{.SDKVersionImport}}" "github.com/sirupsen/logrus" @@ -36,7 +37,16 @@ func printVersion() { func main() { printVersion() - sdk.Watch("{{.APIVersion}}", "{{.Kind}}", "default", 5) + + resource := "{{.APIVersion}}" + kind := "{{.Kind}}" + namespace, err := k8sutil.GetWatchNamespace() + if err != nil { + logrus.Fatalf("Failed to get watch namespace: %v", err) + } + resyncPeriod := 5 + logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod) + sdk.Watch(resource, kind, namespace, resyncPeriod) sdk.Handle(stub.NewHandler()) sdk.Run(context.TODO()) } diff --git a/pkg/util/k8sutil/constants.go b/pkg/util/k8sutil/constants.go index 77f1e6215c..fd67036cca 100644 --- a/pkg/util/k8sutil/constants.go +++ b/pkg/util/k8sutil/constants.go @@ -4,4 +4,8 @@ const ( // KubeConfigEnvVar defines the env variable KUBERNETES_CONFIG which // contains the kubeconfig file path. KubeConfigEnvVar = "KUBERNETES_CONFIG" + + // WatchNamespaceEnvVar is the constant for env variable WATCH_NAMESPACE + // which is the namespace that the pod is currently running in. + WatchNamespaceEnvVar = "WATCH_NAMESPACE" ) diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 243adfaf0d..f317f67bb5 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -17,6 +17,7 @@ package k8sutil import ( "encoding/json" "fmt" + "os" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -134,3 +135,15 @@ func GetNameAndNamespace(object runtime.Object) (string, string, error) { func ObjectInfo(kind, name, namespace string) string { return kind + ": " + namespace + "/" + name } + +// GetWatchNamespace returns the namespace the operator should be watching for changes +func GetWatchNamespace() (string, error) { + ns, found := os.LookupEnv(WatchNamespaceEnvVar) + if !found { + return "", fmt.Errorf("%s must be set", WatchNamespaceEnvVar) + } + if len(ns) == 0 { + return "", fmt.Errorf("%s must not be empty", WatchNamespaceEnvVar) + } + return ns, nil +}