From 28c188aecbaee75309117173596e963505bfa2b2 Mon Sep 17 00:00:00 2001 From: Alex Vulaj Date: Thu, 19 Feb 2026 17:29:31 -0500 Subject: [PATCH 1/2] Add managed-by labels to roxie-created namespaces --- internal/deployer/deployer.go | 18 ++++++++++++------ tests/e2e/basic_test.go | 4 +++- tests/e2e/e2e_test.go | 24 +++++++++++++++++++++++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index 96eaef3e..9f6ef195 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -579,17 +579,23 @@ func (d *Deployer) teardownSecuredCluster(ctx context.Context) error { } func (d *Deployer) ensureNamespaceExists(namespace string) error { - if d.namespaceExists(namespace) { - return nil + if !d.namespaceExists(namespace) { + d.logger.Infof("Creating namespace %s", namespace) + _, err := d.runKubectl(context.Background(), KubectlOptions{ + Args: []string{"create", "namespace", namespace}, + }) + if err != nil { + return fmt.Errorf("failed to create namespace: %w", err) + } } - d.logger.Infof("Creating namespace %s", namespace) - + // Label namespace as managed by roxie _, err := d.runKubectl(context.Background(), KubectlOptions{ - Args: []string{"create", "namespace", namespace}, + Args: []string{"label", "namespace", namespace, + "app.kubernetes.io/managed-by=roxie", "--overwrite"}, }) if err != nil { - return fmt.Errorf("failed to create namespace: %w", err) + d.logger.Warningf("failed to label namespace %s: %v", namespace, err) } return nil diff --git a/tests/e2e/basic_test.go b/tests/e2e/basic_test.go index 4724821b..3129b840 100644 --- a/tests/e2e/basic_test.go +++ b/tests/e2e/basic_test.go @@ -28,12 +28,14 @@ func TestDeployBothSimple(t *testing.T) { args := append([]string{roxieBinary, "deploy", "--early-readiness", "both", "--envrc", envrcPath}, commonDeployArgsNoPortForward...) runCommand(t, deployTimeout*2, nil, args...) - // Verify namespaces exist + // Verify namespaces exist and have managed-by labels t.Log("Verifying namespace: acs-central") verifyNamespaceExists(t, "acs-central") + verifyNamespaceHasLabel(t, "acs-central", "app.kubernetes.io/managed-by", "roxie") t.Log("Verifying namespace: acs-sensor") verifyNamespaceExists(t, "acs-sensor") + verifyNamespaceHasLabel(t, "acs-sensor", "app.kubernetes.io/managed-by", "roxie") // Brief pause before cleanup time.Sleep(5 * time.Second) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index c4a8887a..27e7729f 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -196,6 +196,22 @@ func verifyNamespaceExists(t *testing.T, namespace string) { } } +func verifyNamespaceHasLabel(t *testing.T, namespace, key, value string) { + t.Helper() + + cmd := exec.Command("kubectl", "get", "namespace", namespace, + "-o", "jsonpath={.metadata.labels['"+key+"']}") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Failed to get label %s from namespace %s: %v", key, namespace, err) + } + + actualValue := strings.TrimSpace(string(output)) + if actualValue != value { + t.Fatalf("Namespace %s has label %s=%s, expected %s", namespace, key, actualValue, value) + } +} + func doesDeploymentExist(t *testing.T, namespace string, name string) bool { t.Helper() @@ -272,12 +288,14 @@ func TestDeployCentralAndSecuredCluster(t *testing.T) { args = append([]string{roxieBinary, "deploy", "--early-readiness", "secured-cluster"}, commonDeployArgsNoPortForward...) runCommand(t, deployTimeout, envrcEnv, args...) - // Verify namespaces + // Verify namespaces and labels t.Log("Verifying namespace: acs-central") verifyNamespaceExists(t, "acs-central") + verifyNamespaceHasLabel(t, "acs-central", "app.kubernetes.io/managed-by", "roxie") t.Log("Verifying namespace: acs-sensor") verifyNamespaceExists(t, "acs-sensor") + verifyNamespaceHasLabel(t, "acs-sensor", "app.kubernetes.io/managed-by", "roxie") // Brief pause before next test time.Sleep(5 * time.Second) @@ -350,9 +368,11 @@ func TestDeployBothComponentsTogether(t *testing.T) { t.Log("Verifying namespace: acs-central") verifyNamespaceExists(t, "acs-central") + verifyNamespaceHasLabel(t, "acs-central", "app.kubernetes.io/managed-by", "roxie") t.Log("Verifying namespace: acs-sensor") verifyNamespaceExists(t, "acs-sensor") + verifyNamespaceHasLabel(t, "acs-sensor", "app.kubernetes.io/managed-by", "roxie") // Verify Central has the pause-reconcile annotation. t.Log("Verifying pause-reconcile annotation on Central CR") @@ -420,9 +440,11 @@ func TestDeployCentralAndSecuredClusterViaHelm(t *testing.T) { t.Log("Verifying namespace: acs-central") verifyNamespaceExists(t, "acs-central") + verifyNamespaceHasLabel(t, "acs-central", "app.kubernetes.io/managed-by", "roxie") t.Log("Verifying namespace: acs-sensor") verifyNamespaceExists(t, "acs-sensor") + verifyNamespaceHasLabel(t, "acs-sensor", "app.kubernetes.io/managed-by", "roxie") } func verifyAnnotation(t *testing.T, resourceType, resourceName, namespace, annotationKey, expectedValue string) { From a9efa9895cae63dfa3059ebc7bb8b53e41a4bac7 Mon Sep 17 00:00:00 2001 From: Alex Vulaj Date: Wed, 4 Mar 2026 16:05:22 -0500 Subject: [PATCH 2/2] Only label namespaces on creation --- internal/deployer/deployer.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index 9f6ef195..1b9f66c2 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -579,18 +579,20 @@ func (d *Deployer) teardownSecuredCluster(ctx context.Context) error { } func (d *Deployer) ensureNamespaceExists(namespace string) error { - if !d.namespaceExists(namespace) { - d.logger.Infof("Creating namespace %s", namespace) - _, err := d.runKubectl(context.Background(), KubectlOptions{ - Args: []string{"create", "namespace", namespace}, - }) - if err != nil { - return fmt.Errorf("failed to create namespace: %w", err) - } + if d.namespaceExists(namespace) { + return nil } - // Label namespace as managed by roxie + d.logger.Infof("Creating namespace %s", namespace) _, err := d.runKubectl(context.Background(), KubectlOptions{ + Args: []string{"create", "namespace", namespace}, + }) + if err != nil { + return fmt.Errorf("failed to create namespace: %w", err) + } + + // Label namespace as managed by roxie since we just created it + _, err = d.runKubectl(context.Background(), KubectlOptions{ Args: []string{"label", "namespace", namespace, "app.kubernetes.io/managed-by=roxie", "--overwrite"}, })