From 4c28d4752d3b0461e71a0851879fd8bc5e7b8111 Mon Sep 17 00:00:00 2001 From: Angel Misevski Date: Fri, 13 Jan 2023 13:38:14 -0500 Subject: [PATCH 1/4] Reorganize controllers code to separate eventHandlers into file Signed-off-by: Angel Misevski --- .../workspace/devworkspace_controller.go | 65 +------------- controllers/workspace/eventhandlers.go | 88 +++++++++++++++++++ controllers/workspace/predicates.go | 4 +- 3 files changed, 91 insertions(+), 66 deletions(-) create mode 100644 controllers/workspace/eventhandlers.go diff --git a/controllers/workspace/devworkspace_controller.go b/controllers/workspace/devworkspace_controller.go index 7c280b15a..77c532327 100644 --- a/controllers/workspace/devworkspace_controller.go +++ b/controllers/workspace/devworkspace_controller.go @@ -700,69 +700,6 @@ func (r *DevWorkspaceReconciler) getWorkspaceId(ctx context.Context, workspace * } } -// Mapping the pod to the devworkspace -func dwRelatedPodsHandler(obj client.Object) []reconcile.Request { - labels := obj.GetLabels() - if _, ok := labels[constants.DevWorkspaceNameLabel]; !ok { - return []reconcile.Request{} - } - - //If the dewworkspace label does not exist, do no reconcile - if _, ok := labels[constants.DevWorkspaceIDLabel]; !ok { - return []reconcile.Request{} - } - - return []reconcile.Request{ - { - NamespacedName: types.NamespacedName{ - Name: labels[constants.DevWorkspaceNameLabel], - Namespace: obj.GetNamespace(), - }, - }, - } -} - -func (r *DevWorkspaceReconciler) dwPVCHandler(obj client.Object) []reconcile.Request { - // Check if PVC is owned by a DevWorkspace (per-workspace storage case) - for _, ownerref := range obj.GetOwnerReferences() { - if ownerref.Kind != "DevWorkspace" { - continue - } - return []reconcile.Request{ - { - NamespacedName: types.NamespacedName{ - Name: ownerref.Name, - Namespace: obj.GetNamespace(), - }, - }, - } - } - - // TODO: Label PVCs used for workspace storage so that they can be cleaned up if non-default name is used. - // Otherwise, check if common PVC is deleted to make sure all DevWorkspaces see it happen - if obj.GetName() != wkspConfig.GetGlobalConfig().Workspace.PVCName || obj.GetDeletionTimestamp() == nil { - // We're looking for a deleted common PVC - return []reconcile.Request{} - } - dwList := &dw.DevWorkspaceList{} - if err := r.Client.List(context.Background(), dwList, &client.ListOptions{Namespace: obj.GetNamespace()}); err != nil { - return []reconcile.Request{} - } - var reconciles []reconcile.Request - for _, workspace := range dwList.Items { - storageType := workspace.Spec.Template.Attributes.GetString(constants.DevWorkspaceStorageTypeAttribute, nil) - if storageType == constants.CommonStorageClassType || storageType == constants.PerUserStorageClassType || storageType == "" { - reconciles = append(reconciles, reconcile.Request{ - NamespacedName: types.NamespacedName{ - Name: workspace.GetName(), - Namespace: workspace.GetNamespace(), - }, - }) - } - } - return reconciles -} - func (r *DevWorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { setupHttpClients() @@ -794,7 +731,7 @@ func (r *DevWorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { Watches(&source.Kind{Type: &corev1.Pod{}}, handler.EnqueueRequestsFromMapFunc(dwRelatedPodsHandler)). Watches(&source.Kind{Type: &corev1.PersistentVolumeClaim{}}, handler.EnqueueRequestsFromMapFunc(r.dwPVCHandler)). Watches(&source.Kind{Type: &controllerv1alpha1.DevWorkspaceOperatorConfig{}}, handler.EnqueueRequestsFromMapFunc(emptyMapper), configWatcher). - WithEventFilter(predicates). + WithEventFilter(devworkspacePredicates). WithEventFilter(podPredicates). Complete(r) } diff --git a/controllers/workspace/eventhandlers.go b/controllers/workspace/eventhandlers.go new file mode 100644 index 000000000..2affc1653 --- /dev/null +++ b/controllers/workspace/eventhandlers.go @@ -0,0 +1,88 @@ +// Copyright (c) 2019-2023 Red Hat, Inc. +// 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 controllers + +import ( + "context" + + dw "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" + wkspConfig "github.com/devfile/devworkspace-operator/pkg/config" + "github.com/devfile/devworkspace-operator/pkg/constants" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +// Mapping the pod to the devworkspace +func dwRelatedPodsHandler(obj client.Object) []reconcile.Request { + labels := obj.GetLabels() + if _, ok := labels[constants.DevWorkspaceNameLabel]; !ok { + return []reconcile.Request{} + } + + //If the dewworkspace label does not exist, do no reconcile + if _, ok := labels[constants.DevWorkspaceIDLabel]; !ok { + return []reconcile.Request{} + } + + return []reconcile.Request{ + { + NamespacedName: types.NamespacedName{ + Name: labels[constants.DevWorkspaceNameLabel], + Namespace: obj.GetNamespace(), + }, + }, + } +} + +func (r *DevWorkspaceReconciler) dwPVCHandler(obj client.Object) []reconcile.Request { + // Check if PVC is owned by a DevWorkspace (per-workspace storage case) + for _, ownerref := range obj.GetOwnerReferences() { + if ownerref.Kind != "DevWorkspace" { + continue + } + return []reconcile.Request{ + { + NamespacedName: types.NamespacedName{ + Name: ownerref.Name, + Namespace: obj.GetNamespace(), + }, + }, + } + } + + // TODO: Label PVCs used for workspace storage so that they can be cleaned up if non-default name is used. + // Otherwise, check if common PVC is deleted to make sure all DevWorkspaces see it happen + if obj.GetName() != wkspConfig.GetGlobalConfig().Workspace.PVCName || obj.GetDeletionTimestamp() == nil { + // We're looking for a deleted common PVC + return []reconcile.Request{} + } + dwList := &dw.DevWorkspaceList{} + if err := r.Client.List(context.Background(), dwList, &client.ListOptions{Namespace: obj.GetNamespace()}); err != nil { + return []reconcile.Request{} + } + var reconciles []reconcile.Request + for _, workspace := range dwList.Items { + storageType := workspace.Spec.Template.Attributes.GetString(constants.DevWorkspaceStorageTypeAttribute, nil) + if storageType == constants.CommonStorageClassType || storageType == constants.PerUserStorageClassType || storageType == "" { + reconciles = append(reconciles, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: workspace.GetName(), + Namespace: workspace.GetNamespace(), + }, + }) + } + } + return reconciles +} diff --git a/controllers/workspace/predicates.go b/controllers/workspace/predicates.go index 22d923c26..e5541baae 100644 --- a/controllers/workspace/predicates.go +++ b/controllers/workspace/predicates.go @@ -25,10 +25,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/predicate" ) -// predicates filters incoming events to avoid unnecessary reconciles to failed workspaces. +// devworkspacePredicates filters incoming events to avoid unnecessary reconciles to failed workspaces. // If a workspace failed and its spec is changed, we trigger reconciles to allow for fixing // issues in the workspace spec. -var predicates = predicate.Funcs{ +var devworkspacePredicates = predicate.Funcs{ CreateFunc: func(_ event.CreateEvent) bool { return true }, DeleteFunc: func(_ event.DeleteEvent) bool { return true }, UpdateFunc: func(ev event.UpdateEvent) bool { From f4e0914b2d91fc156fd1ea5ba62ee05d1c23b6f6 Mon Sep 17 00:00:00 2001 From: Angel Misevski Date: Fri, 13 Jan 2023 14:20:17 -0500 Subject: [PATCH 2/4] Watch automount resources and queue reconciles for running workspaces Watch for events related to automount resources (configmaps, secrets, pvcs) and queue reconciles for all running workspaces when detected. This ensures that changes to automount resources (e.g. updating a git-credential secret) are picked up and included in workspaces without requiring a manually triggered reconcile. Signed-off-by: Angel Misevski --- .../workspace/devworkspace_controller.go | 6 +++- controllers/workspace/eventhandlers.go | 20 +++++++++++++ controllers/workspace/predicates.go | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/controllers/workspace/devworkspace_controller.go b/controllers/workspace/devworkspace_controller.go index 77c532327..6ac3b99ce 100644 --- a/controllers/workspace/devworkspace_controller.go +++ b/controllers/workspace/devworkspace_controller.go @@ -712,7 +712,8 @@ func (r *DevWorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { return []reconcile.Request{} } - var configWatcher builder.WatchesOption = builder.WithPredicates(wkspConfig.Predicates()) + configWatcher := builder.WithPredicates(wkspConfig.Predicates()) + automountWatcher := builder.WithPredicates(automountPredicates) // TODO: Set up indexing https://book.kubebuilder.io/cronjob-tutorial/controller-implementation.html#setup return ctrl.NewControllerManagedBy(mgr). @@ -730,6 +731,9 @@ func (r *DevWorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&corev1.ServiceAccount{}). Watches(&source.Kind{Type: &corev1.Pod{}}, handler.EnqueueRequestsFromMapFunc(dwRelatedPodsHandler)). Watches(&source.Kind{Type: &corev1.PersistentVolumeClaim{}}, handler.EnqueueRequestsFromMapFunc(r.dwPVCHandler)). + Watches(&source.Kind{Type: &corev1.Secret{}}, handler.EnqueueRequestsFromMapFunc(r.runningWorkspacesHandler), automountWatcher). + Watches(&source.Kind{Type: &corev1.ConfigMap{}}, handler.EnqueueRequestsFromMapFunc(r.runningWorkspacesHandler), automountWatcher). + Watches(&source.Kind{Type: &corev1.PersistentVolumeClaim{}}, handler.EnqueueRequestsFromMapFunc(r.runningWorkspacesHandler), automountWatcher). Watches(&source.Kind{Type: &controllerv1alpha1.DevWorkspaceOperatorConfig{}}, handler.EnqueueRequestsFromMapFunc(emptyMapper), configWatcher). WithEventFilter(devworkspacePredicates). WithEventFilter(podPredicates). diff --git a/controllers/workspace/eventhandlers.go b/controllers/workspace/eventhandlers.go index 2affc1653..74a73313c 100644 --- a/controllers/workspace/eventhandlers.go +++ b/controllers/workspace/eventhandlers.go @@ -86,3 +86,23 @@ func (r *DevWorkspaceReconciler) dwPVCHandler(obj client.Object) []reconcile.Req } return reconciles } + +func (r *DevWorkspaceReconciler) runningWorkspacesHandler(obj client.Object) []reconcile.Request { + dwList := &dw.DevWorkspaceList{} + if err := r.Client.List(context.Background(), dwList, &client.ListOptions{Namespace: obj.GetNamespace()}); err != nil { + return []reconcile.Request{} + } + var reconciles []reconcile.Request + for _, workspace := range dwList.Items { + // Queue reconciles for any started workspaces to make sure they pick up new object + if workspace.Spec.Started { + reconciles = append(reconciles, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: workspace.GetName(), + Namespace: workspace.GetNamespace(), + }, + }) + } + } + return reconciles +} diff --git a/controllers/workspace/predicates.go b/controllers/workspace/predicates.go index e5541baae..d81f7234e 100644 --- a/controllers/workspace/predicates.go +++ b/controllers/workspace/predicates.go @@ -21,6 +21,7 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/predicate" ) @@ -84,3 +85,30 @@ var podPredicates = predicate.Funcs{ return true }, } + +var automountPredicates = predicate.Funcs{ + CreateFunc: func(ev event.CreateEvent) bool { + return objectIsAutomountResource(ev.Object) + }, + DeleteFunc: func(ev event.DeleteEvent) bool { + return objectIsAutomountResource(ev.Object) + }, + UpdateFunc: func(ev event.UpdateEvent) bool { + return objectIsAutomountResource(ev.ObjectNew) + }, + GenericFunc: func(_ event.GenericEvent) bool { return false }, +} + +func objectIsAutomountResource(obj client.Object) bool { + labels := obj.GetLabels() + switch { + case labels[constants.DevWorkspaceMountLabel] == "true", + labels[constants.DevWorkspaceGitCredentialLabel] == "true", + labels[constants.DevWorkspaceGitTLSLabel] == "true", + labels[constants.DevWorkspacePullSecretLabel] == "true": + return true + default: + return false + } + +} From 03ea5c5faff4cd3c23a2381460abac98dfa1d039 Mon Sep 17 00:00:00 2001 From: Angel Misevski Date: Fri, 13 Jan 2023 15:41:57 -0500 Subject: [PATCH 3/4] Add controller test to verify changes to automount secrets reconcile Signed-off-by: Angel Misevski --- .../workspace/devworkspace_controller_test.go | 45 ++++++++++++++++++- pkg/provision/automount/gitconfig.go | 2 +- pkg/provision/automount/templates.go | 4 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/controllers/workspace/devworkspace_controller_test.go b/controllers/workspace/devworkspace_controller_test.go index 331cd1c0a..31f462270 100644 --- a/controllers/workspace/devworkspace_controller_test.go +++ b/controllers/workspace/devworkspace_controller_test.go @@ -28,6 +28,7 @@ import ( "github.com/devfile/devworkspace-operator/pkg/conditions" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/devfile/devworkspace-operator/pkg/constants" + "github.com/devfile/devworkspace-operator/pkg/provision/automount" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" @@ -353,7 +354,6 @@ var _ = Describe("DevWorkspace Controller", func() { }, }, }) - createDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") }) AfterEach(func() { @@ -362,6 +362,7 @@ var _ = Describe("DevWorkspace Controller", func() { }) It("Mounts image pull secrets to the DevWorkspace Deployment", func() { + createDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") devworkspace := getExistingDevWorkspace(devWorkspaceName) workspaceID := devworkspace.Status.DevWorkspaceId @@ -394,6 +395,7 @@ var _ = Describe("DevWorkspace Controller", func() { }) It("Manages git credentials for DevWorkspace", func() { + createDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") devworkspace := getExistingDevWorkspace(devWorkspaceName) workspaceID := devworkspace.Status.DevWorkspaceId @@ -456,6 +458,7 @@ var _ = Describe("DevWorkspace Controller", func() { }) It("Automounts secrets and configmaps volumes", func() { + createDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") devworkspace := getExistingDevWorkspace(devWorkspaceName) workspaceID := devworkspace.Status.DevWorkspaceId @@ -518,6 +521,7 @@ var _ = Describe("DevWorkspace Controller", func() { }) It("Automounts secrets and configmaps env vars", func() { + createDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") devworkspace := getExistingDevWorkspace(devWorkspaceName) workspaceID := devworkspace.Status.DevWorkspaceId @@ -558,6 +562,45 @@ var _ = Describe("DevWorkspace Controller", func() { Expect(container.EnvFrom).Should(ContainElements(expectedEnvFromSources), "Automounted env sources should be added to containers") } }) + + It("Detects changes to automount resources and reconciles", func() { + // NOTE: timeout for this test is reduced, as eventually DWO will reconcile the workspace by coincidence and notice + // the automount secret. + createStartedDevWorkspace(devWorkspaceName, "test-devworkspace.yaml") + devworkspace := getExistingDevWorkspace(devWorkspaceName) + workspaceID := devworkspace.Status.DevWorkspaceId + + mergedSecretNN := namespacedName(automount.GitCredentialsMergedSecretName, testNamespace) + mergedSecret := &corev1.Secret{} + Expect(k8sClient.Get(ctx, mergedSecretNN, mergedSecret)).Error() + + By("Creating git-credential secret") + secret := generateSecret("git-credential-secret", corev1.SecretTypeOpaque) + secret.Labels[constants.DevWorkspaceGitCredentialLabel] = "true" + secret.Data["credentials"] = []byte("https://test:token@github.com") + createObject(secret) + defer deleteObject(secret) + + By("Checking that merged credentials secret is created") + Eventually(func() error { + return k8sClient.Get(ctx, mergedSecretNN, mergedSecret) + }, 1*time.Second, interval).Should(Succeed(), "Merged credentials secret is created") + + By("Checking that workspace deployment mounts merged credentials secret") + Eventually(func() error { + deploy := &appsv1.Deployment{} + deployNN := namespacedName(common.DeploymentName(workspaceID), testNamespace) + if err := k8sClient.Get(ctx, deployNN, deploy); err != nil { + return err + } + for _, volume := range deploy.Spec.Template.Spec.Volumes { + if volume.Secret != nil && volume.Secret.SecretName == automount.GitCredentialsMergedSecretName { + return nil + } + } + return fmt.Errorf("Secret not found in volumes") + }, 1*time.Second, interval).Should(Succeed(), "Merged credentials secret is added to deployment") + }) }) Context("Stopping DevWorkspaces", func() { diff --git a/pkg/provision/automount/gitconfig.go b/pkg/provision/automount/gitconfig.go index 85b8ff036..bd5f06393 100644 --- a/pkg/provision/automount/gitconfig.go +++ b/pkg/provision/automount/gitconfig.go @@ -116,7 +116,7 @@ func getGitResources(api sync.ClusterAPI, namespace string) (credentialSecrets [ func cleanupGitConfig(api sync.ClusterAPI, namespace string) error { secretNN := types.NamespacedName{ - Name: gitCredentialsSecretName, + Name: GitCredentialsMergedSecretName, Namespace: namespace, } tlsSecret := &corev1.Secret{} diff --git a/pkg/provision/automount/templates.go b/pkg/provision/automount/templates.go index d490dc159..6e2b2bdb9 100644 --- a/pkg/provision/automount/templates.go +++ b/pkg/provision/automount/templates.go @@ -31,7 +31,7 @@ const gitConfigLocation = "/etc/" + gitConfigName const gitCredentialsConfigMapName = "devworkspace-gitconfig" const gitCredentialsSecretKey = "credentials" -const gitCredentialsSecretName = "devworkspace-merged-git-credentials" +const GitCredentialsMergedSecretName = "devworkspace-merged-git-credentials" // gitLFSConfig is the default configuration that gets provisioned when git-lfs // is installed. It needs to be included in the overridden gitconfig to avoid @@ -122,7 +122,7 @@ func mergeGitCredentials(namespace string, credentialSecrets []corev1.Secret) (* } mergedCredentials := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: gitCredentialsSecretName, + Name: GitCredentialsMergedSecretName, Namespace: namespace, Labels: map[string]string{ "app.kubernetes.io/defaultName": "git-config-secret", From 8e87736198d83c32fd63bbc47fd1ca6ed62b4d15 Mon Sep 17 00:00:00 2001 From: Angel Misevski Date: Fri, 13 Jan 2023 15:55:12 -0500 Subject: [PATCH 4/4] Move automounted fixed object names into constants package Signed-off-by: Angel Misevski --- controllers/workspace/devworkspace_controller_test.go | 5 ++--- pkg/constants/metadata.go | 9 +++++++++ pkg/provision/automount/gitconfig.go | 4 ++-- pkg/provision/automount/templates.go | 6 ++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/controllers/workspace/devworkspace_controller_test.go b/controllers/workspace/devworkspace_controller_test.go index 31f462270..6b072ed39 100644 --- a/controllers/workspace/devworkspace_controller_test.go +++ b/controllers/workspace/devworkspace_controller_test.go @@ -28,7 +28,6 @@ import ( "github.com/devfile/devworkspace-operator/pkg/conditions" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/devfile/devworkspace-operator/pkg/constants" - "github.com/devfile/devworkspace-operator/pkg/provision/automount" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" @@ -570,7 +569,7 @@ var _ = Describe("DevWorkspace Controller", func() { devworkspace := getExistingDevWorkspace(devWorkspaceName) workspaceID := devworkspace.Status.DevWorkspaceId - mergedSecretNN := namespacedName(automount.GitCredentialsMergedSecretName, testNamespace) + mergedSecretNN := namespacedName(constants.GitCredentialsMergedSecretName, testNamespace) mergedSecret := &corev1.Secret{} Expect(k8sClient.Get(ctx, mergedSecretNN, mergedSecret)).Error() @@ -594,7 +593,7 @@ var _ = Describe("DevWorkspace Controller", func() { return err } for _, volume := range deploy.Spec.Template.Spec.Volumes { - if volume.Secret != nil && volume.Secret.SecretName == automount.GitCredentialsMergedSecretName { + if volume.Secret != nil && volume.Secret.SecretName == constants.GitCredentialsMergedSecretName { return nil } } diff --git a/pkg/constants/metadata.go b/pkg/constants/metadata.go index 162491609..0d72b15bd 100644 --- a/pkg/constants/metadata.go +++ b/pkg/constants/metadata.go @@ -58,6 +58,15 @@ const ( // If the git host is not defined then the certificate will be used for all http repositories. DevWorkspaceGitTLSLabel = "controller.devfile.io/git-tls-credential" + // GitCredentialsConfigMapName is the name used for the configmap that stores the Git configuration for workspaces + // in a given namespace. It is used when e.g. adding Git credentials via secret + GitCredentialsConfigMapName = "devworkspace-gitconfig" + + // GitCredentialsMergedSecretName is the name for the merged Git credentials secret that is mounted to workspaces + // when Git credentials are defined. This secret combines the values of any secrets labelled + // "controller.devfile.io/git-credential" + GitCredentialsMergedSecretName = "devworkspace-merged-git-credentials" + // DevWorkspaceMountPathAnnotation is the annotation key to store the mount path for the secret or configmap. // If no mount path is provided, configmaps will be mounted at /etc/config/, secrets will // be mounted at /etc/secret/, and persistent volume claims will be mounted to /tmp/ diff --git a/pkg/provision/automount/gitconfig.go b/pkg/provision/automount/gitconfig.go index bd5f06393..e738ac55a 100644 --- a/pkg/provision/automount/gitconfig.go +++ b/pkg/provision/automount/gitconfig.go @@ -116,7 +116,7 @@ func getGitResources(api sync.ClusterAPI, namespace string) (credentialSecrets [ func cleanupGitConfig(api sync.ClusterAPI, namespace string) error { secretNN := types.NamespacedName{ - Name: GitCredentialsMergedSecretName, + Name: constants.GitCredentialsMergedSecretName, Namespace: namespace, } tlsSecret := &corev1.Secret{} @@ -134,7 +134,7 @@ func cleanupGitConfig(api sync.ClusterAPI, namespace string) error { } configmapNN := types.NamespacedName{ - Name: gitCredentialsConfigMapName, + Name: constants.GitCredentialsConfigMapName, Namespace: namespace, } credentialsConfigMap := &corev1.ConfigMap{} diff --git a/pkg/provision/automount/templates.go b/pkg/provision/automount/templates.go index 6e2b2bdb9..e15ba131c 100644 --- a/pkg/provision/automount/templates.go +++ b/pkg/provision/automount/templates.go @@ -28,10 +28,8 @@ const gitTLSCertificateKey = "certificate" const gitConfigName = "gitconfig" const gitConfigLocation = "/etc/" + gitConfigName -const gitCredentialsConfigMapName = "devworkspace-gitconfig" const gitCredentialsSecretKey = "credentials" -const GitCredentialsMergedSecretName = "devworkspace-merged-git-credentials" // gitLFSConfig is the default configuration that gets provisioned when git-lfs // is installed. It needs to be included in the overridden gitconfig to avoid @@ -95,7 +93,7 @@ func constructGitConfig(namespace, credentialMountPath string, certificatesConfi gitConfigMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: gitCredentialsConfigMapName, + Name: constants.GitCredentialsConfigMapName, Namespace: namespace, Labels: map[string]string{ "app.kubernetes.io/defaultName": "git-config-secret", @@ -122,7 +120,7 @@ func mergeGitCredentials(namespace string, credentialSecrets []corev1.Secret) (* } mergedCredentials := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: GitCredentialsMergedSecretName, + Name: constants.GitCredentialsMergedSecretName, Namespace: namespace, Labels: map[string]string{ "app.kubernetes.io/defaultName": "git-config-secret",