From 9c39e9ee027e124282a8af480c76f92c937578b3 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 10:56:18 +0800 Subject: [PATCH 01/13] add config files --- controllers/config/controller_configs.go | 61 +++++++++++++++++++ controllers/config/controller_configs_test.go | 39 ++++++++++++ controllers/spec/common.go | 37 +++++------ main.go | 12 ++++ testdata/controller_configs.yaml | 9 +++ 5 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 controllers/config/controller_configs.go create mode 100644 controllers/config/controller_configs_test.go create mode 100644 testdata/controller_configs.yaml diff --git a/controllers/config/controller_configs.go b/controllers/config/controller_configs.go new file mode 100644 index 000000000..efb3f2ae2 --- /dev/null +++ b/controllers/config/controller_configs.go @@ -0,0 +1,61 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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 config + +import ( + "github.com/streamnative/function-mesh/controllers/spec" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +type RunnerImages struct { + Java string `yaml:"java,omitempty"` + Python string `yaml:"python,omitempty"` + Go string `yaml:"go,omitempty"` +} + +type ControllerConfigs struct { + RunnerImages RunnerImages `yaml:"runnerImages,omitempty"` + ResourceLabels map[string]string `yaml:"resourceLabels,omitempty"` + ResourceAnnotations map[string]string `yaml:"resourceAnnotations,omitempty"` +} + +var Configs = DefaultConfigs() + +func DefaultConfigs() *ControllerConfigs { + return &ControllerConfigs{ + RunnerImages: RunnerImages{ + Java: spec.DefaultJavaRunnerImage, + Python: spec.DefaultPythonRunnerImage, + Go: spec.DefaultGoRunnerImage, + }, + } +} + +func ParseControllerConfigs(configFilePath string) error { + yamlFile, err := ioutil.ReadFile(configFilePath) + if err != nil { + return err + } + err = yaml.Unmarshal(yamlFile, Configs) + if err != nil { + return err + } + + return nil +} diff --git a/controllers/config/controller_configs_test.go b/controllers/config/controller_configs_test.go new file mode 100644 index 000000000..0fc6d8c06 --- /dev/null +++ b/controllers/config/controller_configs_test.go @@ -0,0 +1,39 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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 config + +import ( + "gotest.tools/assert" + "testing" +) + +func TestParseConfigFiles(t *testing.T) { + err := ParseControllerConfigs("testdata/controller_configs.yaml") + if err != nil { + t.Errorf("ParseControllerConfigs failed: %v", err) + } + assert.Assert(t, Configs != nil) + assert.Assert(t, Configs.RunnerImages.Java == "streamnative/pulsar-functions-java-runner:latest") + assert.Assert(t, Configs.RunnerImages.Python == "streamnative/pulsar-functions-python-runner:latest") + assert.Assert(t, Configs.RunnerImages.Go == "streamnative/pulsar-functions-go-runner:latest") + assert.Assert(t, len(Configs.ResourceLabels) == 2) + assert.Assert(t, len(Configs.ResourceAnnotations) == 1) + assert.Assert(t, Configs.ResourceLabels["functionmesh.io/managedBy"] == "function-mesh") + assert.Assert(t, Configs.ResourceLabels["foo"] == "bar") + assert.Assert(t, Configs.ResourceAnnotations["fooAnnotation"] == "barAnnotation") +} diff --git a/controllers/spec/common.go b/controllers/spec/common.go index 1bee56881..04efa7b71 100644 --- a/controllers/spec/common.go +++ b/controllers/spec/common.go @@ -20,6 +20,7 @@ package spec import ( "encoding/json" "fmt" + "github.com/streamnative/function-mesh/controllers/config" "strconv" "strings" @@ -142,7 +143,7 @@ func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume, } return &corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: mergeLabels(labels, policy.Labels), + Labels: mergeLabels(labels, config.Configs.ResourceLabels, policy.Labels), Annotations: generateAnnotations(policy.Annotations), }, Spec: corev1.PodSpec{ @@ -191,17 +192,13 @@ func MakeGoFunctionCommand(downloadPath, goExecFilePath string, function *v1alph strings.Join(getProcessGoRuntimeArgs(goExecFilePath, function), " ") if downloadPath != "" { // prepend download command if the downPath is provided - downloadCommand := strings.Join(getDownloadCommand(downloadPath, goExecFilePath, function.Spec.Pulsar.AuthSecret != "", function.Spec.Pulsar.TLSSecret != ""), " ") + downloadCommand := strings.Join(getDownloadCommand(downloadPath, goExecFilePath, + function.Spec.Pulsar.AuthSecret != "", function.Spec.Pulsar.TLSSecret != ""), " ") processCommand = downloadCommand + " && ls -al && pwd &&" + processCommand } return []string{"sh", "-c", processCommand} } -func ComputeConfigHash(config map[string]interface{}) (string, error) { - - return "", nil -} - func getDownloadCommand(downloadPath, componentPackage string, authProvided, tlsProvided bool) []string { // The download path is the path that the package saved in the pulsar. // By default, it's the path that the package saved in the pulsar, we can use package name @@ -599,18 +596,16 @@ func generatePodVolumes(podVolumes []corev1.Volume, producerConf *v1alpha1.Produ return volumes } -func mergeLabels(label1, label2 map[string]string) map[string]string { - label := make(map[string]string) +func mergeLabels(labels ...map[string]string) map[string]string { + merged := make(map[string]string) - for k, v := range label1 { - label[k] = v - } - - for k, v := range label2 { - label[k] = v + for _, m := range labels { + for k, v := range m { + merged[k] = v + } } - return label + return merged } func generateAnnotations(customAnnotations map[string]string) map[string]string { @@ -634,11 +629,11 @@ func getFunctionRunnerImage(spec *v1alpha1.FunctionSpec) string { if img != "" { return img } else if runtime.Java != nil && runtime.Java.Jar != "" { - return DefaultJavaRunnerImage + return config.Configs.RunnerImages.Java } else if runtime.Python != nil && runtime.Python.Py != "" { - return DefaultPythonRunnerImage + return config.Configs.RunnerImages.Python } else if runtime.Golang != nil && runtime.Golang.Go != "" { - return DefaultGoRunnerImage + return config.Configs.RunnerImages.Go } return DefaultRunnerImage } @@ -650,7 +645,7 @@ func getSinkRunnerImage(spec *v1alpha1.SinkSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return DefaultJavaRunnerImage + return config.Configs.RunnerImages.Java } return DefaultRunnerImage } @@ -662,7 +657,7 @@ func getSourceRunnerImage(spec *v1alpha1.SourceSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return DefaultJavaRunnerImage + return config.Configs.RunnerImages.Java } return DefaultRunnerImage } diff --git a/main.go b/main.go index 8e98c05a5..2b9dd691a 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,7 @@ package main import ( "flag" + "github.com/streamnative/function-mesh/controllers/config" "os" "k8s.io/apimachinery/pkg/runtime" @@ -50,6 +51,7 @@ func main() { var leaderElectionID string var certDir string var enableLeaderElection bool + var configFile string flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&leaderElectionID, "leader-election-id", "a3f45fce.functionmesh.io", "the name of the configmap that leader election will use for holding the leader lock.") @@ -58,10 +60,20 @@ func main() { "Enabling this will ensure there is only one active controller manager.") flag.StringVar(&certDir, "cert-dir", "", "CertDir is the directory that contains the server key and certificate.\n\tif not set, webhook server would look up the server key and certificate in\n\t{TempDir}/k8s-webhook-server/serving-certs. The server key and certificate\n\tmust be named tls.key and tls.crt, respectively.") + flag.StringVar(&configFile, "config-file", "", + "config file path for controller manager") flag.Parse() ctrl.SetLogger(zap.New(zap.UseDevMode(true))) + if configFile != "" { + err := config.ParseControllerConfigs(configFile) + if err != nil { + setupLog.Error(err, "unable to parse the controller configs") + os.Exit(1) + } + } + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, MetricsBindAddress: metricsAddr, diff --git a/testdata/controller_configs.yaml b/testdata/controller_configs.yaml new file mode 100644 index 000000000..2841028c2 --- /dev/null +++ b/testdata/controller_configs.yaml @@ -0,0 +1,9 @@ +runnerImages: + java: streamnative/pulsar-functions-java-runner:latest + python: streamnative/pulsar-functions-python-runner:latest + go: streamnative/pulsar-functions-go-runner:latest +resourceLabels: + functionmesh.io/managedBy: function-mesh + foo: bar +resourceAnnotations: + fooAnnotation: barAnnotation From e7d1c084568678cc2ff259d34a9df08da0440317 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 11:02:12 +0800 Subject: [PATCH 02/13] resolve import cycle --- controllers/{config => }/controller_configs.go | 2 +- .../{config => }/controller_configs_test.go | 2 +- controllers/spec/common.go | 14 +++++++------- main.go | 3 +-- 4 files changed, 10 insertions(+), 11 deletions(-) rename controllers/{config => }/controller_configs.go (98%) rename controllers/{config => }/controller_configs_test.go (98%) diff --git a/controllers/config/controller_configs.go b/controllers/controller_configs.go similarity index 98% rename from controllers/config/controller_configs.go rename to controllers/controller_configs.go index efb3f2ae2..3d297ab75 100644 --- a/controllers/config/controller_configs.go +++ b/controllers/controller_configs.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package config +package controllers import ( "github.com/streamnative/function-mesh/controllers/spec" diff --git a/controllers/config/controller_configs_test.go b/controllers/controller_configs_test.go similarity index 98% rename from controllers/config/controller_configs_test.go rename to controllers/controller_configs_test.go index 0fc6d8c06..108703a4d 100644 --- a/controllers/config/controller_configs_test.go +++ b/controllers/controller_configs_test.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package config +package controllers import ( "gotest.tools/assert" diff --git a/controllers/spec/common.go b/controllers/spec/common.go index 04efa7b71..c59113d7a 100644 --- a/controllers/spec/common.go +++ b/controllers/spec/common.go @@ -20,7 +20,7 @@ package spec import ( "encoding/json" "fmt" - "github.com/streamnative/function-mesh/controllers/config" + "github.com/streamnative/function-mesh/controllers" "strconv" "strings" @@ -143,7 +143,7 @@ func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume, } return &corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: mergeLabels(labels, config.Configs.ResourceLabels, policy.Labels), + Labels: mergeLabels(labels, controllers.Configs.ResourceLabels, policy.Labels), Annotations: generateAnnotations(policy.Annotations), }, Spec: corev1.PodSpec{ @@ -629,11 +629,11 @@ func getFunctionRunnerImage(spec *v1alpha1.FunctionSpec) string { if img != "" { return img } else if runtime.Java != nil && runtime.Java.Jar != "" { - return config.Configs.RunnerImages.Java + return controllers.Configs.RunnerImages.Java } else if runtime.Python != nil && runtime.Python.Py != "" { - return config.Configs.RunnerImages.Python + return controllers.Configs.RunnerImages.Python } else if runtime.Golang != nil && runtime.Golang.Go != "" { - return config.Configs.RunnerImages.Go + return controllers.Configs.RunnerImages.Go } return DefaultRunnerImage } @@ -645,7 +645,7 @@ func getSinkRunnerImage(spec *v1alpha1.SinkSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return config.Configs.RunnerImages.Java + return controllers.Configs.RunnerImages.Java } return DefaultRunnerImage } @@ -657,7 +657,7 @@ func getSourceRunnerImage(spec *v1alpha1.SourceSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return config.Configs.RunnerImages.Java + return controllers.Configs.RunnerImages.Java } return DefaultRunnerImage } diff --git a/main.go b/main.go index 2b9dd691a..b1aef95ad 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,6 @@ package main import ( "flag" - "github.com/streamnative/function-mesh/controllers/config" "os" "k8s.io/apimachinery/pkg/runtime" @@ -67,7 +66,7 @@ func main() { ctrl.SetLogger(zap.New(zap.UseDevMode(true))) if configFile != "" { - err := config.ParseControllerConfigs(configFile) + err := controllers.ParseControllerConfigs(configFile) if err != nil { setupLog.Error(err, "unable to parse the controller configs") os.Exit(1) From f95b412a811ec13c378d4b36dc1515b06c8dd4d5 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 11:06:57 +0800 Subject: [PATCH 03/13] resolve import cycle --- controllers/spec/common.go | 13 ++++++------- controllers/{ => spec}/controller_configs.go | 9 ++++----- controllers/{ => spec}/controller_configs_test.go | 2 +- main.go | 3 ++- 4 files changed, 13 insertions(+), 14 deletions(-) rename controllers/{ => spec}/controller_configs.go (89%) rename controllers/{ => spec}/controller_configs_test.go (98%) diff --git a/controllers/spec/common.go b/controllers/spec/common.go index c59113d7a..949fdd723 100644 --- a/controllers/spec/common.go +++ b/controllers/spec/common.go @@ -20,7 +20,6 @@ package spec import ( "encoding/json" "fmt" - "github.com/streamnative/function-mesh/controllers" "strconv" "strings" @@ -143,7 +142,7 @@ func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume, } return &corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: mergeLabels(labels, controllers.Configs.ResourceLabels, policy.Labels), + Labels: mergeLabels(labels, Configs.ResourceLabels, policy.Labels), Annotations: generateAnnotations(policy.Annotations), }, Spec: corev1.PodSpec{ @@ -629,11 +628,11 @@ func getFunctionRunnerImage(spec *v1alpha1.FunctionSpec) string { if img != "" { return img } else if runtime.Java != nil && runtime.Java.Jar != "" { - return controllers.Configs.RunnerImages.Java + return Configs.RunnerImages.Java } else if runtime.Python != nil && runtime.Python.Py != "" { - return controllers.Configs.RunnerImages.Python + return Configs.RunnerImages.Python } else if runtime.Golang != nil && runtime.Golang.Go != "" { - return controllers.Configs.RunnerImages.Go + return Configs.RunnerImages.Go } return DefaultRunnerImage } @@ -645,7 +644,7 @@ func getSinkRunnerImage(spec *v1alpha1.SinkSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return controllers.Configs.RunnerImages.Java + return Configs.RunnerImages.Java } return DefaultRunnerImage } @@ -657,7 +656,7 @@ func getSourceRunnerImage(spec *v1alpha1.SourceSpec) string { } if spec.Runtime.Java.Jar != "" && spec.Runtime.Java.JarLocation != "" && hasPackageNamePrefix(spec.Runtime.Java.JarLocation) { - return controllers.Configs.RunnerImages.Java + return Configs.RunnerImages.Java } return DefaultRunnerImage } diff --git a/controllers/controller_configs.go b/controllers/spec/controller_configs.go similarity index 89% rename from controllers/controller_configs.go rename to controllers/spec/controller_configs.go index 3d297ab75..8c89a346a 100644 --- a/controllers/controller_configs.go +++ b/controllers/spec/controller_configs.go @@ -15,10 +15,9 @@ // specific language governing permissions and limitations // under the License. -package controllers +package spec import ( - "github.com/streamnative/function-mesh/controllers/spec" "gopkg.in/yaml.v3" "io/ioutil" ) @@ -40,9 +39,9 @@ var Configs = DefaultConfigs() func DefaultConfigs() *ControllerConfigs { return &ControllerConfigs{ RunnerImages: RunnerImages{ - Java: spec.DefaultJavaRunnerImage, - Python: spec.DefaultPythonRunnerImage, - Go: spec.DefaultGoRunnerImage, + Java: DefaultJavaRunnerImage, + Python: DefaultPythonRunnerImage, + Go: DefaultGoRunnerImage, }, } } diff --git a/controllers/controller_configs_test.go b/controllers/spec/controller_configs_test.go similarity index 98% rename from controllers/controller_configs_test.go rename to controllers/spec/controller_configs_test.go index 108703a4d..8ab5ac974 100644 --- a/controllers/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package controllers +package spec import ( "gotest.tools/assert" diff --git a/main.go b/main.go index b1aef95ad..88e2571be 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,7 @@ package main import ( "flag" + "github.com/streamnative/function-mesh/controllers/spec" "os" "k8s.io/apimachinery/pkg/runtime" @@ -66,7 +67,7 @@ func main() { ctrl.SetLogger(zap.New(zap.UseDevMode(true))) if configFile != "" { - err := controllers.ParseControllerConfigs(configFile) + err := spec.ParseControllerConfigs(configFile) if err != nil { setupLog.Error(err, "unable to parse the controller configs") os.Exit(1) From 2b1665354b745e27652862489dd6e90f163e5f14 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 11:13:40 +0800 Subject: [PATCH 04/13] fix style --- controllers/spec/controller_configs.go | 3 ++- controllers/spec/controller_configs_test.go | 3 ++- main.go | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/controllers/spec/controller_configs.go b/controllers/spec/controller_configs.go index 8c89a346a..4fbed9b0b 100644 --- a/controllers/spec/controller_configs.go +++ b/controllers/spec/controller_configs.go @@ -18,8 +18,9 @@ package spec import ( - "gopkg.in/yaml.v3" "io/ioutil" + + "gopkg.in/yaml.v3" ) type RunnerImages struct { diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index 8ab5ac974..813b75926 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -18,8 +18,9 @@ package spec import ( - "gotest.tools/assert" "testing" + + "gotest.tools/assert" ) func TestParseConfigFiles(t *testing.T) { diff --git a/main.go b/main.go index 88e2571be..a98b791d5 100644 --- a/main.go +++ b/main.go @@ -19,9 +19,10 @@ package main import ( "flag" - "github.com/streamnative/function-mesh/controllers/spec" "os" + "github.com/streamnative/function-mesh/controllers/spec" + "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" From ef14d85adc89c27fedd3506aafc79ee5c525b035 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 11:28:29 +0800 Subject: [PATCH 05/13] fix tests --- controllers/spec/controller_configs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index 813b75926..9cc8f7af8 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -24,7 +24,7 @@ import ( ) func TestParseConfigFiles(t *testing.T) { - err := ParseControllerConfigs("testdata/controller_configs.yaml") + err := ParseControllerConfigs("../../testdata/controller_configs.yaml") if err != nil { t.Errorf("ParseControllerConfigs failed: %v", err) } From 95a82b85125634bd0da75496f90706104ac4aeeb Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 12:17:04 +0800 Subject: [PATCH 06/13] add more tests and support helm --- .../controller-manager-configmap.yaml | 24 +++++++++++++++++++ .../controller-manager-deployment.yaml | 12 ++++++++++ charts/function-mesh-operator/values.yaml | 9 +++++++ controllers/spec/controller_configs_test.go | 13 ++++++++++ testdata/empty_contoller_configs.yaml | 0 5 files changed, 58 insertions(+) create mode 100644 charts/function-mesh-operator/templates/controller-manager-configmap.yaml create mode 100644 testdata/empty_contoller_configs.yaml diff --git a/charts/function-mesh-operator/templates/controller-manager-configmap.yaml b/charts/function-mesh-operator/templates/controller-manager-configmap.yaml new file mode 100644 index 000000000..5ccbac121 --- /dev/null +++ b/charts/function-mesh-operator/templates/controller-manager-configmap.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: function-mesh-controller-manager-configs + labels: + app.kubernetes.io/name: { { template "function-mesh-operator.name" . } } + app.kubernetes.io/managed-by: { { .Release.Service } } + app.kubernetes.io/instance: { { .Release.Name } } + app.kubernetes.io/component: controller-manager + helm.sh/chart: { { .Chart.Name } }-{{ .Chart.Version | replace "+" "_" }} +data: + configs.yaml: | + {{- if .Values.controllerManager.runnerImages }} + runnerImages: +{{ toYaml .Values.controllerManager.runnerImages | indent 6 }} + {{- end }} + {{- if .Values.controllerManager.resourceLabels }} + resourceLabels: +{{ toYaml .Values.controllerManager.resourceLabels | indent 6 }} + {{- end }} + {{- if .Values.controllerManager.resourceAnnotations }} + resourceAnnotations: +{{ toYaml .Values.controllerManager.resourceAnnotations | indent 6 }} + {{- end }} diff --git a/charts/function-mesh-operator/templates/controller-manager-deployment.yaml b/charts/function-mesh-operator/templates/controller-manager-deployment.yaml index 716cbfef3..50b363761 100644 --- a/charts/function-mesh-operator/templates/controller-manager-deployment.yaml +++ b/charts/function-mesh-operator/templates/controller-manager-deployment.yaml @@ -39,11 +39,18 @@ spec: {{- end }} command: - /manager + args: + - --enable-leader-election + - --config-file=/etc/config/config.yaml env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace + volumeMounts: + - name: cfg + mountPath: /etc/config/config.yaml + subPath: config.yaml {{- with .Values.controllerManager.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} @@ -59,3 +66,8 @@ spec: {{- if .Values.controllerManager.priorityClassName }} priorityClassName: {{ .Values.controllerManager.priorityClassName }} {{- end }} + volumes: + - name: cfg + configMap: + name: function-mesh-controller-manager-configs + defaultMode: 420 \ No newline at end of file diff --git a/charts/function-mesh-operator/values.yaml b/charts/function-mesh-operator/values.yaml index 209a63249..35fcc5609 100644 --- a/charts/function-mesh-operator/values.yaml +++ b/charts/function-mesh-operator/values.yaml @@ -46,3 +46,12 @@ controllerManager: selector: [] # - k1==v1 # - k2!=v2 + # default runner images for different language runtime + # runnerImages: + # java: streamnative/pulsar-functions-java-runner:2.9.0.0-rc-4 + # python: streamnative/pulsar-functions-python-runner:2.9.0.0-rc-4 + # go: streamnative/pulsar-functions-go-runner:2.9.0.0-rc-4 + # resource labels applied to each function/connector managed by this controller + # resourceLabels: {} + # resource annotations applied to each function/connector managed by this controller + # resourceAnnotations: {} diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index 9cc8f7af8..7b474bda4 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -38,3 +38,16 @@ func TestParseConfigFiles(t *testing.T) { assert.Assert(t, Configs.ResourceLabels["foo"] == "bar") assert.Assert(t, Configs.ResourceAnnotations["fooAnnotation"] == "barAnnotation") } + +func TestParseEmptyConfigFiles(t *testing.T) { + err := ParseControllerConfigs("../../testdata/controller_configs.yaml") + if err != nil { + t.Errorf("ParseControllerConfigs failed: %v", err) + } + assert.Assert(t, Configs != nil) + assert.Assert(t, Configs.RunnerImages.Java == DefaultJavaRunnerImage) + assert.Assert(t, Configs.RunnerImages.Python == DefaultPythonRunnerImage) + assert.Assert(t, Configs.RunnerImages.Go == DefaultGoRunnerImage) + assert.Assert(t, len(Configs.ResourceLabels) == 0) + assert.Assert(t, len(Configs.ResourceAnnotations) == 0) +} diff --git a/testdata/empty_contoller_configs.yaml b/testdata/empty_contoller_configs.yaml new file mode 100644 index 000000000..e69de29bb From c3eb8d9a4a6d83976be178d3687eee2bc9d610c1 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 13:31:57 +0800 Subject: [PATCH 07/13] fix empty test case --- controllers/spec/controller_configs.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controllers/spec/controller_configs.go b/controllers/spec/controller_configs.go index 4fbed9b0b..3070318aa 100644 --- a/controllers/spec/controller_configs.go +++ b/controllers/spec/controller_configs.go @@ -52,6 +52,9 @@ func ParseControllerConfigs(configFilePath string) error { if err != nil { return err } + if len(yamlFile) == 0 { + return nil + } err = yaml.Unmarshal(yamlFile, Configs) if err != nil { return err From 106ec1aa7256b1e45833341ed3ca0d8e65e711cc Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 13:40:33 +0800 Subject: [PATCH 08/13] fix ci --- controllers/spec/controller_configs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index 7b474bda4..e5b9f5fa8 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -40,7 +40,7 @@ func TestParseConfigFiles(t *testing.T) { } func TestParseEmptyConfigFiles(t *testing.T) { - err := ParseControllerConfigs("../../testdata/controller_configs.yaml") + err := ParseControllerConfigs("../../testdata/empty_controller_configs.yaml") if err != nil { t.Errorf("ParseControllerConfigs failed: %v", err) } From 9f66acd4ca020b021e6262e9c742283cc23bb0ad Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 13:48:12 +0800 Subject: [PATCH 09/13] fix test --- ...empty_contoller_configs.yaml => empty_controller_configs.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename testdata/{empty_contoller_configs.yaml => empty_controller_configs.yaml} (100%) diff --git a/testdata/empty_contoller_configs.yaml b/testdata/empty_controller_configs.yaml similarity index 100% rename from testdata/empty_contoller_configs.yaml rename to testdata/empty_controller_configs.yaml From 3715463ba7cde3dbf995ee8be1387ecaa202be02 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 14:09:20 +0800 Subject: [PATCH 10/13] update dep --- .github/workflows/project.yml | 2 +- go.mod | 2 ++ go.sum | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/project.yml b/.github/workflows/project.yml index 7e1a19759..1fb42fa26 100644 --- a/.github/workflows/project.yml +++ b/.github/workflows/project.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-version: [1.13, 1.14] + go-version: [1.13, 1.14, 1.15, 1.16, 1.17] steps: - name: clean disk run: | diff --git a/go.mod b/go.mod index 98b2b3bb5..b263b527d 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,8 @@ require ( github.com/streamnative/pulsarctl v0.4.3-0.20220104092115-5af28d815290 github.com/stretchr/testify v1.6.1 google.golang.org/protobuf v1.25.0 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c + gotest.tools v2.2.0+incompatible k8s.io/api v0.18.6 k8s.io/apimachinery v0.18.6 k8s.io/client-go v0.18.6 diff --git a/go.sum b/go.sum index 23021b789..eb0d49025 100644 --- a/go.sum +++ b/go.sum @@ -784,6 +784,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v0.0.0-20181223230014-1083505acf35/go.mod h1:R//lfYlUuTOTfblYI3lGoAAAebUdzjvbmQsuB7Ykd90= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 7dc7560f1461498ad8aa03f5378af23b5fd19115 Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 14:19:41 +0800 Subject: [PATCH 11/13] more logs --- controllers/spec/controller_configs_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index e5b9f5fa8..6b25b2498 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -45,6 +45,7 @@ func TestParseEmptyConfigFiles(t *testing.T) { t.Errorf("ParseControllerConfigs failed: %v", err) } assert.Assert(t, Configs != nil) + t.Log("Configs", Configs) assert.Assert(t, Configs.RunnerImages.Java == DefaultJavaRunnerImage) assert.Assert(t, Configs.RunnerImages.Python == DefaultPythonRunnerImage) assert.Assert(t, Configs.RunnerImages.Go == DefaultGoRunnerImage) From eb1e43fd381c6801b96c3eb25a3e6f9f4645aaea Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 14:27:03 +0800 Subject: [PATCH 12/13] always remember to re-init --- controllers/spec/controller_configs_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/controllers/spec/controller_configs_test.go b/controllers/spec/controller_configs_test.go index 6b25b2498..8936755e9 100644 --- a/controllers/spec/controller_configs_test.go +++ b/controllers/spec/controller_configs_test.go @@ -24,6 +24,7 @@ import ( ) func TestParseConfigFiles(t *testing.T) { + Configs = DefaultConfigs() err := ParseControllerConfigs("../../testdata/controller_configs.yaml") if err != nil { t.Errorf("ParseControllerConfigs failed: %v", err) @@ -40,6 +41,7 @@ func TestParseConfigFiles(t *testing.T) { } func TestParseEmptyConfigFiles(t *testing.T) { + Configs = DefaultConfigs() err := ParseControllerConfigs("../../testdata/empty_controller_configs.yaml") if err != nil { t.Errorf("ParseControllerConfigs failed: %v", err) From f7f99819419fc891c97bf637bdbd75aa74c5795a Mon Sep 17 00:00:00 2001 From: Rui Fu Date: Mon, 14 Feb 2022 17:34:43 +0800 Subject: [PATCH 13/13] add resourceAnnotations --- controllers/spec/common.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/controllers/spec/common.go b/controllers/spec/common.go index 949fdd723..4864f4b43 100644 --- a/controllers/spec/common.go +++ b/controllers/spec/common.go @@ -143,7 +143,7 @@ func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume, return &corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: mergeLabels(labels, Configs.ResourceLabels, policy.Labels), - Annotations: generateAnnotations(policy.Annotations), + Annotations: generateAnnotations(Configs.ResourceAnnotations, policy.Annotations), }, Spec: corev1.PodSpec{ InitContainers: policy.InitContainers, @@ -607,7 +607,7 @@ func mergeLabels(labels ...map[string]string) map[string]string { return merged } -func generateAnnotations(customAnnotations map[string]string) map[string]string { +func generateAnnotations(customAnnotations ...map[string]string) map[string]string { annotations := make(map[string]string) // controlled annotations @@ -615,8 +615,10 @@ func generateAnnotations(customAnnotations map[string]string) map[string]string annotations[AnnotationPrometheusPort] = strconv.Itoa(int(MetricsPort.ContainerPort)) // customized annotations which may override any previous set annotations - for k, v := range customAnnotations { - annotations[k] = v + for _, custom := range customAnnotations { + for k, v := range custom { + annotations[k] = v + } } return annotations