From 9389134907e7792a0b01d1a231d1b6b4441226b5 Mon Sep 17 00:00:00 2001 From: Jerop Date: Thu, 9 Apr 2020 18:27:31 -0400 Subject: [PATCH] Make feature-flags config map name customizable The config maps used by Tekton Pipeline should be able to take custom names to avoid collisions with other services. However, the feature-flags config map wasn't customizable because its name hardcoded its usages. By defining an env var in controller.yaml, from which the feature-flags config map name can be derived, we enable it to be customizable. Fixes #1805. --- config/controller.yaml | 2 ++ pkg/pod/pod.go | 15 +++++++++++--- pkg/pod/pod_test.go | 44 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/config/controller.yaml b/config/controller.yaml index 6819432cf7b..0cdc649b13d 100644 --- a/config/controller.yaml +++ b/config/controller.yaml @@ -71,6 +71,8 @@ spec: value: config-artifact-bucket - name: CONFIG_ARTIFACT_PVC_NAME value: config-artifact-pvc + - name: CONFIG_FEATURE_FLAGS_NAME + value: feature-flags - name: METRICS_DOMAIN value: tekton.dev/pipeline volumes: diff --git a/pkg/pod/pod.go b/pkg/pod/pod.go index ad6f0811919..6ed3a44fb1a 100644 --- a/pkg/pod/pod.go +++ b/pkg/pod/pod.go @@ -18,6 +18,7 @@ package pod import ( "fmt" + "os" "path/filepath" "github.com/tektoncd/pipeline/pkg/apis/pipeline" @@ -31,13 +32,21 @@ import ( "k8s.io/client-go/kubernetes" ) +// GetFeatureFlagsConfigName returns the name of the configmap containing all +// customizations for the feature flags. +func GetFeatureFlagsConfigName() string { + if e := os.Getenv("CONFIG_FEATURE_FLAGS_NAME"); e != "" { + return e + } + return "feature-flags" +} + const ( homeDir = "/tekton/home" // ResultsDir is the folder used by default to create the results file ResultsDir = "/tekton/results" - featureFlagConfigMapName = "feature-flags" featureFlagDisableHomeEnvKey = "disable-home-env-overwrite" featureFlagDisableWorkingDirKey = "disable-working-directory-overwrite" @@ -323,7 +332,7 @@ func getLimitRangeMinimum(namespace string, kubeclient kubernetes.Interface) (co // // For further reference see https://github.com/tektoncd/pipeline/issues/2013 func ShouldOverrideHomeEnv(kubeclient kubernetes.Interface) bool { - configMap, err := kubeclient.CoreV1().ConfigMaps(system.GetNamespace()).Get(featureFlagConfigMapName, metav1.GetOptions{}) + configMap, err := kubeclient.CoreV1().ConfigMaps(system.GetNamespace()).Get(GetFeatureFlagsConfigName(), metav1.GetOptions{}) if err == nil && configMap != nil && configMap.Data != nil && configMap.Data[featureFlagDisableHomeEnvKey] == "true" { return false } @@ -337,7 +346,7 @@ func ShouldOverrideHomeEnv(kubeclient kubernetes.Interface) bool { // // For further reference see https://github.com/tektoncd/pipeline/issues/1836 func shouldOverrideWorkingDir(kubeclient kubernetes.Interface) bool { - configMap, err := kubeclient.CoreV1().ConfigMaps(system.GetNamespace()).Get(featureFlagConfigMapName, metav1.GetOptions{}) + configMap, err := kubeclient.CoreV1().ConfigMaps(system.GetNamespace()).Get(GetFeatureFlagsConfigName(), metav1.GetOptions{}) if err == nil && configMap != nil && configMap.Data != nil && configMap.Data[featureFlagDisableWorkingDirKey] == "true" { return false } diff --git a/pkg/pod/pod_test.go b/pkg/pod/pod_test.go index d43b04281e6..d83f658457a 100644 --- a/pkg/pod/pod_test.go +++ b/pkg/pod/pod_test.go @@ -18,6 +18,7 @@ package pod import ( "fmt" + "os" "path/filepath" "strings" "testing" @@ -813,14 +814,14 @@ func TestShouldOverrideHomeEnv(t *testing.T) { }{{ description: "Default behaviour: A missing disable-home-env-overwrite flag should result in true", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{}, }, expected: true, }, { description: "Setting disable-home-env-overwrite to false should result in true", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{ featureFlagDisableHomeEnvKey: "false", }, @@ -829,7 +830,7 @@ func TestShouldOverrideHomeEnv(t *testing.T) { }, { description: "Setting disable-home-env-overwrite to true should result in false", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{ featureFlagDisableHomeEnvKey: "true", }, @@ -847,6 +848,37 @@ func TestShouldOverrideHomeEnv(t *testing.T) { } } +func TestGetFeatureFlagsConfigName(t *testing.T) { + for _, tc := range []struct { + description string + featureFlagEnvValue string + expected string + }{{ + description: "Feature flags config value not set", + featureFlagEnvValue: "", + expected: "feature-flags", + }, { + description: "Feature flags config value set", + featureFlagEnvValue: "feature-flags-test", + expected: "feature-flags-test", + }} { + t.Run(tc.description, func(t *testing.T) { + original := os.Getenv("CONFIG_FEATURE_FLAGS_NAME") + defer t.Cleanup(func() { + os.Setenv("CONFIG_FEATURE_FLAGS_NAME", original) + }) + if tc.featureFlagEnvValue != "" { + os.Setenv("CONFIG_FEATURE_FLAGS_NAME", tc.featureFlagEnvValue) + } + got := GetFeatureFlagsConfigName() + want := tc.expected + if got != want { + t.Errorf("GetFeatureFlagsConfigName() = %s, want %s", got, want) + } + }) + } +} + func TestShouldOverrideWorkingDir(t *testing.T) { for _, tc := range []struct { description string @@ -855,14 +887,14 @@ func TestShouldOverrideWorkingDir(t *testing.T) { }{{ description: "Default behaviour: A missing disable-working-directory-overwrite flag should result in true", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{}, }, expected: true, }, { description: "Setting disable-working-directory-overwrite to false should result in true", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{ featureFlagDisableWorkingDirKey: "false", }, @@ -871,7 +903,7 @@ func TestShouldOverrideWorkingDir(t *testing.T) { }, { description: "Setting disable-working-directory-overwrite to true should result in false", configMap: &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: featureFlagConfigMapName, Namespace: system.GetNamespace()}, + ObjectMeta: metav1.ObjectMeta{Name: GetFeatureFlagsConfigName(), Namespace: system.GetNamespace()}, Data: map[string]string{ featureFlagDisableWorkingDirKey: "true", },