From 4dde3c9520764a7944ec38ac5c8ab0d3f8d06b4d Mon Sep 17 00:00:00 2001 From: Shubham Bansal <62992590+shubham-bansal96@users.noreply.github.com> Date: Wed, 7 Dec 2022 14:50:45 +0530 Subject: [PATCH] Fix namespace resolution with DEFAULT_NAMESPACE and other parameters set (#2659) --- pkg/utils/namespace.go | 36 +++++----- pkg/utils/namespace_test.go | 130 ++++++++++++++++++++++++++++++++++-- 2 files changed, 145 insertions(+), 21 deletions(-) diff --git a/pkg/utils/namespace.go b/pkg/utils/namespace.go index 73a8988992..1e552e8dad 100644 --- a/pkg/utils/namespace.go +++ b/pkg/utils/namespace.go @@ -42,7 +42,7 @@ func init() { FunctionNamespace: os.Getenv(ENV_FUNCTION_NAMESPACE), BuiderNamespace: os.Getenv(ENV_BUILDER_NAMESPACE), DefaultNamespace: os.Getenv(ENV_DEFAULT_NAMESPACE), - FissionResourceNS: getNamespaces(), + FissionResourceNS: GetNamespaces(), Logger: loggerfactory.GetLogger(), } @@ -106,27 +106,33 @@ func (nsr *NamespaceResolver) FissionNSWithOptions(option ...option) map[string] return fissionResourceNS } -func getNamespaces() map[string]string { - envValue := os.Getenv(ENV_ADDITIONAL_NAMESPACE) - if len(envValue) == 0 { - return map[string]string{ - metav1.NamespaceDefault: metav1.NamespaceDefault, - } +func GetNamespaces() map[string]string { + namespaces := make(map[string]string) + + envValue := os.Getenv(ENV_DEFAULT_NAMESPACE) + if len(envValue) > 0 { + namespaces[envValue] = envValue } - lstNamespaces := strings.Split(envValue, ",") - namespaces := make(map[string]string, len(lstNamespaces)) - for _, namespace := range lstNamespaces { - //check to handle string with additional comma at the end of string. eg- ns1,ns2, - if namespace != "" { - namespaces[namespace] = namespace + envValue = os.Getenv(ENV_ADDITIONAL_NAMESPACE) + if len(envValue) > 0 { + lstNamespaces := strings.Split(envValue, ",") + for _, namespace := range lstNamespaces { + //check to handle string with additional comma at the end of string. eg- ns1,ns2, + if namespace != "" { + namespaces[namespace] = namespace + } } } + + if len(namespaces) == 0 { + namespaces[metav1.NamespaceDefault] = metav1.NamespaceDefault + } return namespaces } func (nsr *NamespaceResolver) GetBuilderNS(namespace string) string { - if nsr.FunctionNamespace == "" || nsr.BuiderNamespace == "" { + if nsr.BuiderNamespace == "" { return namespace } @@ -137,7 +143,7 @@ func (nsr *NamespaceResolver) GetBuilderNS(namespace string) string { } func (nsr *NamespaceResolver) GetFunctionNS(namespace string) string { - if nsr.FunctionNamespace == "" || nsr.BuiderNamespace == "" { + if nsr.FunctionNamespace == "" { return namespace } diff --git a/pkg/utils/namespace_test.go b/pkg/utils/namespace_test.go index 61b55984cf..9620f2d0ac 100644 --- a/pkg/utils/namespace_test.go +++ b/pkg/utils/namespace_test.go @@ -1,6 +1,7 @@ package utils import ( + "os" "testing" ) @@ -20,22 +21,52 @@ func TestNamespaceResolver(t *testing.T) { }, { name: "should return testns2 namespace", - namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "testns"), + namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "default"), namespace: "testns2", expected: "testns2", }, + { + name: "should return fission-builder namespace", + namespaceResolver: getFissionNamespaces("fission-builder", "", "default"), + namespace: "default", + expected: "fission-builder", + }, { name: "should return testns3 namespace", - namespaceResolver: getFissionNamespaces("", "", "testns"), + namespaceResolver: getFissionNamespaces("fission-builder", "", "testns"), namespace: "testns3", expected: "testns3", }, + { + name: "should return testns4 namespace", + namespaceResolver: getFissionNamespaces("", "fission-function", "default"), + namespace: "testns4", + expected: "testns4", + }, + { + name: "should return testns5 namespace", + namespaceResolver: getFissionNamespaces("", "fission-function", "testns"), + namespace: "testns5", + expected: "testns5", + }, { name: "should return default namespace", - namespaceResolver: getFissionNamespaces("fission-builder", "", "default"), + namespaceResolver: getFissionNamespaces("", "", "default"), namespace: "default", expected: "default", }, + { + name: "should return testns6 namespace", + namespaceResolver: getFissionNamespaces("", "", "default"), + namespace: "testns6", + expected: "testns6", + }, + { + name: "should return testns7 namespace", + namespaceResolver: getFissionNamespaces("", "", ""), + namespace: "testns7", + expected: "testns7", + }, } { t.Run(test.name, func(t *testing.T) { ns := test.namespaceResolver.GetBuilderNS(test.namespace) @@ -61,22 +92,52 @@ func TestNamespaceResolver(t *testing.T) { }, { name: "should return testns2 namespace", - namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "testns"), + namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "default"), namespace: "testns2", expected: "testns2", }, + { + name: "should return fission-function namespace", + namespaceResolver: getFissionNamespaces("", "fission-function", "default"), + namespace: "default", + expected: "fission-function", + }, { name: "should return testns3 namespace", - namespaceResolver: getFissionNamespaces("", "", "testns"), + namespaceResolver: getFissionNamespaces("", "fission-function", "testns"), namespace: "testns3", expected: "testns3", }, + { + name: "should return testns4 namespace", + namespaceResolver: getFissionNamespaces("fission-builder", "", "default"), + namespace: "testns4", + expected: "testns4", + }, + { + name: "should return testns5 namespace", + namespaceResolver: getFissionNamespaces("fission-builder", "", "testns"), + namespace: "testns5", + expected: "testns5", + }, { name: "should return default namespace", - namespaceResolver: getFissionNamespaces("", "fission-function", "default"), + namespaceResolver: getFissionNamespaces("", "", "default"), namespace: "default", expected: "default", }, + { + name: "should return testns6 namespace", + namespaceResolver: getFissionNamespaces("", "", "default"), + namespace: "testns6", + expected: "testns6", + }, + { + name: "should return testns7 namespace", + namespaceResolver: getFissionNamespaces("", "", ""), + namespace: "testns7", + expected: "testns7", + }, } { t.Run(test.name, func(t *testing.T) { ns := test.namespaceResolver.GetFunctionNS(test.namespace) @@ -115,6 +176,51 @@ func TestNamespaceResolver(t *testing.T) { }) } }) + + t.Run("getNamespace", func(t *testing.T) { + for _, test := range []struct { + name string + defaultNamespace string + additionalNamespace string + expected int + }{ + { + name: "length of namespaces should be 1", + defaultNamespace: "", + additionalNamespace: "", + expected: 1, + }, + { + name: "length of namespaces should be 1", + defaultNamespace: "default", + additionalNamespace: "", + expected: 1, + }, + { + name: "length of namespaces should be 1", + defaultNamespace: "default", + additionalNamespace: "default", + expected: 1, + }, + { + name: "length of namespaces should be 3", + defaultNamespace: "default", + additionalNamespace: "testns1,testns2", + expected: 3, + }, + } { + t.Run(test.name, func(t *testing.T) { + err := setNamespace(test.defaultNamespace, test.additionalNamespace) + if err != nil { + t.Fatalf("error setting environment Variable %s", err.Error()) + } + ns := GetNamespaces() + if test.expected != len(ns) { + t.Errorf("expected length of namespace %d, got %d", test.expected, len(ns)) + } + }) + } + }) } func getFissionNamespaces(builderNS, functionNS, defaultNS string) *NamespaceResolver { @@ -124,3 +230,15 @@ func getFissionNamespaces(builderNS, functionNS, defaultNS string) *NamespaceRes DefaultNamespace: defaultNS, } } + +func setNamespace(defaultNamespace string, additionalNamespace string) error { + err := os.Setenv(ENV_DEFAULT_NAMESPACE, defaultNamespace) + if err != nil { + return err + } + err = os.Setenv(ENV_ADDITIONAL_NAMESPACE, additionalNamespace) + if err != nil { + return err + } + return nil +}