From 7325f74ad8b386fd6e9deadd010833c84163ff36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 21 Oct 2026 12:39:45 +0200 Subject: [PATCH 1/4] tests(e2e): Drop largely duplicated 1-108_validate_imagepullpolicy_test.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Signed-off-by: Oliver Gondža --- .../1-108_validate_imagepullpolicy_test.go | 465 ------------------ .../1-114_validate_imagepullpolicy_test.go | 4 + 2 files changed, 4 insertions(+), 465 deletions(-) delete mode 100644 argocd-operator/tests/ginkgo/sequential/1-108_validate_imagepullpolicy_test.go diff --git a/argocd-operator/tests/ginkgo/sequential/1-108_validate_imagepullpolicy_test.go b/argocd-operator/tests/ginkgo/sequential/1-108_validate_imagepullpolicy_test.go deleted file mode 100644 index 7c910392b86..00000000000 --- a/argocd-operator/tests/ginkgo/sequential/1-108_validate_imagepullpolicy_test.go +++ /dev/null @@ -1,465 +0,0 @@ -/* -Copyright 2025 ArgoCD Operator Developers - -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 sequential - -import ( - "context" - "os" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - argoproj "github.com/redhat-developer/gitops-operator/argocd-operator/api/v1beta1" - "github.com/redhat-developer/gitops-operator/argocd-operator/common" - "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture" - argocdFixture "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture/argocd" - deploymentFixture "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture/deployment" - k8sFixture "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture/k8s" - fixtureUtils "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture/utils" - - "sigs.k8s.io/controller-runtime/pkg/client" -) - -var _ = Describe("GitOps Operator Sequential E2E Tests", func() { - - Context("1-108_validate_imagepullpolicy", func() { - - var ( - k8sClient client.Client - ctx context.Context - ns *corev1.Namespace - cleanupFunc func() - ) - - BeforeEach(func() { - fixture.EnsureSequentialCleanSlate() - k8sClient, _ = fixtureUtils.GetE2ETestKubeClient() - ctx = context.Background() - }) - - AfterEach(func() { - if ns != nil { - fixture.OutputDebugOnFail(ns) - } - - if cleanupFunc != nil { - cleanupFunc() - } - - // Clean up environment variable - os.Unsetenv(common.ArgoCDImagePullPolicyEnvName) - }) - - It("ArgoCD CR ImagePullPolicy Validation", func() { - By("verifying PullAlways is accepted") - policyAlways := corev1.PullAlways - argoCD := &argoproj.ArgoCD{ - Spec: argoproj.ArgoCDSpec{ - ImagePullPolicy: policyAlways, - }, - } - Expect(argoCD.Spec.ImagePullPolicy).ToNot(BeNil()) - Expect(argoCD.Spec.ImagePullPolicy).To(Equal(corev1.PullAlways)) - - By("verifying PullIfNotPresent is accepted") - policyIfNotPresent := corev1.PullIfNotPresent - argoCD.Spec.ImagePullPolicy = policyIfNotPresent - Expect(argoCD.Spec.ImagePullPolicy).To(Equal(corev1.PullIfNotPresent)) - - By("verifying PullNever is accepted") - policyNever := corev1.PullNever - argoCD.Spec.ImagePullPolicy = policyNever - Expect(argoCD.Spec.ImagePullPolicy).To(Equal(corev1.PullNever)) - - By("verifying nil imagePullPolicy is allowed (uses default)") - argoCD.Spec.ImagePullPolicy = "" - Expect(argoCD.Spec.ImagePullPolicy).To(BeEmpty()) - - }) - - It("ArgoCD CR Instance level ImagePullPolicy Validation", func() { - - By("creating namespace-scoped ArgoCD instance with instance level imagePullPolicy=IfNotPresent") - ns, cleanupFunc = fixture.CreateRandomE2ETestNamespaceWithCleanupFunc() - - policy := corev1.PullIfNotPresent - enabled := true - argoCD := &argoproj.ArgoCD{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd", Namespace: ns.Name}, - Spec: argoproj.ArgoCDSpec{ - ImagePullPolicy: policy, - ApplicationSet: &argoproj.ArgoCDApplicationSet{ - Enabled: &enabled, - }, - Notifications: argoproj.ArgoCDNotifications{ - Enabled: true, - }, - Server: argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ - Enabled: true, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, argoCD)).To(Succeed()) - - By("waiting for ArgoCD CR to be reconciled and the instance to be ready") - Eventually(argoCD, "5m", "5s").Should(argocdFixture.BeAvailable()) - - By("verifying all core deployments respect instance level imagePullPolicy setting and have imagePullPolicy=IfNotPresent") - coreDeployments := []string{"argocd-server", "argocd-repo-server", "argocd-redis"} - for _, deploymentName := range coreDeployments { - deployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: deploymentName, Namespace: ns.Name}, - } - Eventually(deployment, "2m", "2s").Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(deployment), deployment); err != nil { - return false - } - for _, container := range deployment.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullIfNotPresent { - GinkgoWriter.Printf("%s container %s has ImagePullPolicy %s, expected %s\n", - deploymentName, container.Name, container.ImagePullPolicy, corev1.PullIfNotPresent) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue(), "%s should have imagePullPolicy=IfNotPresent", deploymentName) - } - - By("verifying application-controller statefulset has imagePullPolicy=IfNotPresent") - controllerStatefulSet := &appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-application-controller", Namespace: ns.Name}, - } - Eventually(controllerStatefulSet).Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(controllerStatefulSet), controllerStatefulSet); err != nil { - return false - } - for _, container := range controllerStatefulSet.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullIfNotPresent { - return false - } - } - return true - }, "60s", "2s").Should(BeTrue()) - - By("verifying applicationset-controller deployment respects imagePullPolicy") - appsetDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-applicationset-controller", Namespace: ns.Name}, - } - Eventually(appsetDeployment, "2m", "2s").Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(appsetDeployment), appsetDeployment); err != nil { - return false - } - for _, container := range appsetDeployment.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullIfNotPresent { - return false - } - } - return true - }, "60s", "2s").Should(BeTrue()) - - By("verifying notifications-controller deployment respects imagePullPolicy") - notificationsDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-notifications-controller", Namespace: ns.Name}, - } - Eventually(notificationsDeployment, "2m", "2s").Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(notificationsDeployment), notificationsDeployment); err != nil { - return false - } - for _, container := range notificationsDeployment.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullIfNotPresent { - return false - } - } - return true - }, "60s", "2s").Should(BeTrue()) - - By("updating instance level imagePullPolicy to Always and verifying changes propagate") - argocdFixture.Update(argoCD, func(ac *argoproj.ArgoCD) { - newPolicy := corev1.PullAlways - ac.Spec.ImagePullPolicy = newPolicy - }) - - By("verifying server deployment updated to imagePullPolicy=Always") - serverDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-server", Namespace: ns.Name}, - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(serverDeployment), serverDeployment); err != nil { - return false - } - for _, container := range serverDeployment.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullAlways { - return false - } - } - return true - }, "120s", "2s").Should(BeTrue()) - - By("verifying repo-server deployment also updated to imagePullPolicy=Always") - repoDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-repo-server", Namespace: ns.Name}, - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(repoDeployment), repoDeployment); err != nil { - return false - } - for _, container := range repoDeployment.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullAlways { - return false - } - } - return true - }, "120s", "2s").Should(BeTrue()) - }) - - It("verifies default imagePullPolicy behaviour", func() { - By("creating namespace-scoped ArgoCD instance without imagePullPolicy specified") - ns, cleanupFunc = fixture.CreateRandomE2ETestNamespaceWithCleanupFunc() - - argoCD := &argoproj.ArgoCD{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd", Namespace: ns.Name}, - Spec: argoproj.ArgoCDSpec{ - Server: argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ - Enabled: true, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, argoCD)).To(Succeed()) - - By("waiting for ArgoCD CR to be reconciled and the instance to be ready") - Eventually(argoCD, "5m", "5s").Should(argocdFixture.BeAvailable()) - - By("verifying all core deployments use default imagePullPolicy behavior") - coreDeployments := []string{"argocd-server", "argocd-repo-server", "argocd-redis"} - for _, deploymentName := range coreDeployments { - deployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: deploymentName, Namespace: ns.Name}, - } - Eventually(deployment, "2m", "2s").Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(deployment), deployment); err != nil { - return false - } - if len(deployment.Spec.Template.Spec.Containers) == 0 { - return false - } - // Verify that imagePullPolicy is set to default value - // When not explicitly set by operator, IfNotPresent is the default value: - for _, container := range deployment.Spec.Template.Spec.Containers { - policy := container.ImagePullPolicy - if policy != corev1.PullIfNotPresent { - GinkgoWriter.Printf("Deployment %s container %s has unexpected ImagePullPolicy %s\n", - deploymentName, container.Name, policy) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue(), "Deployment %s should use default imagePullPolicy", deploymentName) - } - - By("verifying application-controller statefulset uses default imagePullPolicy") - controllerStatefulSet := &appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-application-controller", Namespace: ns.Name}, - } - Eventually(controllerStatefulSet, "2m", "2s").Should(k8sFixture.ExistByName()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(controllerStatefulSet), controllerStatefulSet); err != nil { - return false - } - for _, container := range controllerStatefulSet.Spec.Template.Spec.Containers { - policy := container.ImagePullPolicy - if policy != corev1.PullIfNotPresent { - GinkgoWriter.Printf("StatefulSet container %s has unexpected ImagePullPolicy %s\n", - container.Name, policy) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue()) - - }) - - It("verifies subscription env var affects instances without CR policy", func() { - - // Check if running locally - skip this test as it requires modifying operator deployment - if os.Getenv("LOCAL_RUN") == "true" { - Skip("Skipping subscription env var test for LOCAL_RUN - operator runs locally without deployment") - } - - // Find the operator deployment - operatorDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "argocd-operator-controller-manager", - Namespace: "argocd-operator-system", - }, - } - - By("checking if operator deployment exists") - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(operatorDeployment), operatorDeployment) - if err != nil { - Skip("Operator deployment not found - test requires operator running in cluster: " + err.Error()) - } - - // Store original env value for cleanup - originalEnvValue, _ := deploymentFixture.GetEnv(operatorDeployment, "manager", common.ArgoCDImagePullPolicyEnvName) - - // Ensure cleanup happens - defer func() { - By("restoring original operator deployment env var") - if originalEnvValue != nil { - deploymentFixture.SetEnv(operatorDeployment, "manager", common.ArgoCDImagePullPolicyEnvName, *originalEnvValue) - } else { - deploymentFixture.RemoveEnv(operatorDeployment, "manager", common.ArgoCDImagePullPolicyEnvName) - } - By("waiting for operator pod to restart with original settings") - time.Sleep(30 * time.Second) - Eventually(operatorDeployment, "3m", "5s").Should(deploymentFixture.HaveReadyReplicas(1)) - }() - - By("setting IMAGE_PULL_POLICY env var on operator deployment to Always") - deploymentFixture.SetEnv(operatorDeployment, "manager", common.ArgoCDImagePullPolicyEnvName, "Always") - - By("waiting for operator pod to restart with new env var") - time.Sleep(30 * time.Second) // Give time for pod to start terminating - Eventually(operatorDeployment, "3m", "5s").Should(deploymentFixture.HaveReadyReplicas(1)) - - By("creating first namespace with ArgoCD instance without CR policy") - ns1, cleanupFunc1 := fixture.CreateRandomE2ETestNamespaceWithCleanupFunc() - defer cleanupFunc1() - - argoCD1 := &argoproj.ArgoCD{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd", Namespace: ns1.Name}, - Spec: argoproj.ArgoCDSpec{ - Server: argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ - Enabled: true, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, argoCD1)).To(Succeed()) - - By("creating second namespace with ArgoCD instance with CR policy set") - ns2, cleanupFunc2 := fixture.CreateRandomE2ETestNamespaceWithCleanupFunc() - defer cleanupFunc2() - - policyNever := corev1.PullNever - argoCD2 := &argoproj.ArgoCD{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd", Namespace: ns2.Name}, - Spec: argoproj.ArgoCDSpec{ - ImagePullPolicy: policyNever, - Server: argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ - Enabled: true, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, argoCD2)).To(Succeed()) - - By("waiting for both ArgoCD instances to be ready") - Eventually(argoCD1, "5m", "5s").Should(argocdFixture.BeAvailable()) - Eventually(argoCD2, "5m", "5s").Should(argocdFixture.BeAvailable()) - - By("verifying first instance uses operator env var (Always)") - server1 := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-server", Namespace: ns1.Name}, - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(server1), server1); err != nil { - GinkgoWriter.Printf("Failed to get server1: %v\n", err) - return false - } - for _, container := range server1.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullAlways { - GinkgoWriter.Printf("Container %s has policy %s, expected Always\n", container.Name, container.ImagePullPolicy) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue(), "First instance should use operator env var (Always)") - - By("verifying second instance uses CR policy (Never) regardless of env var") - server2 := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{Name: "argocd-server", Namespace: ns2.Name}, - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(server2), server2); err != nil { - GinkgoWriter.Printf("Failed to get server2: %v\n", err) - return false - } - for _, container := range server2.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullNever { - GinkgoWriter.Printf("Container %s has policy %s, expected Never\n", container.Name, container.ImagePullPolicy) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue(), "Second instance should use CR policy (Never)") - - By("changing operator env var to IfNotPresent") - deploymentFixture.SetEnv(operatorDeployment, "manager", common.ArgoCDImagePullPolicyEnvName, "IfNotPresent") - - By("waiting for operator pod to restart with updated env var") - time.Sleep(30 * time.Second) - Eventually(operatorDeployment, "3m", "5s").Should(deploymentFixture.HaveReadyReplicas(1)) - - By("verifying first instance eventually uses new env var (IfNotPresent)") - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(server1), server1); err != nil { - GinkgoWriter.Printf("Failed to get server1: %v\n", err) - return false - } - for _, container := range server1.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullIfNotPresent { - GinkgoWriter.Printf("Container %s has policy %s, expected IfNotPresent\n", container.Name, container.ImagePullPolicy) - return false - } - } - return true - }, "120s", "2s").Should(BeTrue(), "First instance should use updated env var (IfNotPresent)") - - By("verifying second instance still uses CR policy (Never), unaffected by env var change") - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(server2), server2); err != nil { - GinkgoWriter.Printf("Failed to get server2: %v\n", err) - return false - } - for _, container := range server2.Spec.Template.Spec.Containers { - if container.ImagePullPolicy != corev1.PullNever { - GinkgoWriter.Printf("Container %s has policy %s, expected Never\n", container.Name, container.ImagePullPolicy) - return false - } - } - return true - }, "60s", "2s").Should(BeTrue(), "Second instance should remain with CR policy (Never)") - }) - - }) -}) diff --git a/test/openshift/e2e/ginkgo/sequential/1-114_validate_imagepullpolicy_test.go b/test/openshift/e2e/ginkgo/sequential/1-114_validate_imagepullpolicy_test.go index 1bacf444e11..ec94b41648e 100644 --- a/test/openshift/e2e/ginkgo/sequential/1-114_validate_imagepullpolicy_test.go +++ b/test/openshift/e2e/ginkgo/sequential/1-114_validate_imagepullpolicy_test.go @@ -63,6 +63,9 @@ var _ = Describe("GitOps Operator Sequential E2E Tests", func() { ObjectMeta: metav1.ObjectMeta{Name: "argocd", Namespace: ns.Name}, Spec: argov1beta1api.ArgoCDSpec{ ImagePullPolicy: policy, + Notifications: argov1beta1api.ArgoCDNotifications{ + Enabled: true, + }, }, } Expect(k8sClient.Create(ctx, argoCD)).To(Succeed()) @@ -78,6 +81,7 @@ var _ = Describe("GitOps Operator Sequential E2E Tests", func() { "argocd-server", "argocd-repo-server", "argocd-redis", + "argocd-notifications-controller", } for _, deplName := range deploymentNames { From 4b07f13089a0ab6ac0fa6f355c1a4853a9a00383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 23 Oct 2026 13:37:20 +0200 Subject: [PATCH 2/4] tests(e2e): Carry 1-130_validate_deployment_image_and_version_test.go from argocd-operator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Oliver Gondža --- test/openshift/e2e/ginkgo/fixture/fixture.go | 33 ++++++++- .../ginkgo/fixture/subscription/fixture.go | 2 +- ...idate_deployment_image_and_version_test.go | 67 +++++++++---------- 3 files changed, 65 insertions(+), 37 deletions(-) rename {argocd-operator/tests => test/openshift/e2e}/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go (72%) diff --git a/test/openshift/e2e/ginkgo/fixture/fixture.go b/test/openshift/e2e/ginkgo/fixture/fixture.go index c6efbd320be..495357a2748 100644 --- a/test/openshift/e2e/ginkgo/fixture/fixture.go +++ b/test/openshift/e2e/ginkgo/fixture/fixture.go @@ -463,7 +463,6 @@ func GetEnvInOperatorSubscriptionOrDeployment(key string) (*string, error) { func SetEnvInOperatorSubscriptionOrDeployment(key string, value string) { k8sClient, _ := utils.GetE2ETestKubeClient() - if EnvNonOLM() { depl := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: "openshift-gitops-operator-controller-manager", Namespace: "openshift-gitops-operator"}} @@ -479,6 +478,7 @@ func SetEnvInOperatorSubscriptionOrDeployment(key string, value string) { subscriptionFixture.SetEnv(sub, key, value) + waitForEnvVarToBePresentOnDeployment(sub.Namespace, "openshift-gitops-operator-controller-manager", key, value) WaitForAllDeploymentsInTheNamespaceToBeReady(sub.Namespace, k8sClient) } else { @@ -488,11 +488,40 @@ func SetEnvInOperatorSubscriptionOrDeployment(key string, value string) { subscriptionFixture.SetEnv(sub, key, value) + waitForEnvVarToBePresentOnDeployment(sub.Namespace, "openshift-gitops-operator-controller-manager", key, value) WaitForAllDeploymentsInTheNamespaceToBeReady(sub.Namespace, k8sClient) } } +// waitForEnvVarToBePresentOnDeployment waits until the named Deployment's pod template contains an environment variable with the given key/value, on any container. +// This is used after updating an operator Subscription (or Deployment) with a new environment variable, to ensure the change has actually propagated to the Deployment spec before proceeding: +// OLM applies Subscription config changes asynchronously (Subscription -> CSV -> Deployment), so a naive "wait for Deployment to be ready" check can race ahead and +// succeed immediately against the Deployment's prior (already-ready) state, before the new env var has even been added to the spec. +func waitForEnvVarToBePresentOnDeployment(ns string, deploymentName string, key string, value string) { + k8sClient, _ := utils.GetE2ETestKubeClient() + + Eventually(func() bool { + depl := &appsv1.Deployment{} + if err := k8sClient.Get(context.Background(), client.ObjectKey{Namespace: ns, Name: deploymentName}, depl); err != nil { + GinkgoWriter.Println(err) + return false + } + + for _, container := range depl.Spec.Template.Spec.Containers { + for _, env := range container.Env { + if env.Name == key && env.Value == value { + return true + } + } + } + + GinkgoWriter.Println("Waiting: env var", key, "=", value, "not yet present in Deployment", depl.Name) + return false + + }, "30s", "5s").Should(BeTrue()) +} + // RemoveEnvFromOperatorSubscriptionOrDeployment will delete an environment variable from either operator Subscription or operator Deployment, depending on which mode the test is running in. func RemoveEnvFromOperatorSubscriptionOrDeployment(key string) error { @@ -564,7 +593,7 @@ func RestoreSubcriptionToDefault() { Expect(err).ToNot(HaveOccurred()) // optionalEnvVarsToRemove is a non-exhaustive list of environment variables that are known to be added to Subscription or operator Deployment by tests - optionalEnvVarsToRemove := []string{"DISABLE_DEFAULT_ARGOCD_CONSOLELINK", "CONTROLLER_CLUSTER_ROLE", "SERVER_CLUSTER_ROLE", "ARGOCD_LABEL_SELECTOR", "ALLOW_NAMESPACE_MANAGEMENT_IN_NAMESPACE_SCOPED_INSTANCES", "IMAGE_PULL_POLICY"} + optionalEnvVarsToRemove := []string{"DISABLE_DEFAULT_ARGOCD_CONSOLELINK", "CONTROLLER_CLUSTER_ROLE", "SERVER_CLUSTER_ROLE", "ARGOCD_LABEL_SELECTOR", "ALLOW_NAMESPACE_MANAGEMENT_IN_NAMESPACE_SCOPED_INSTANCES", "IMAGE_PULL_POLICY", "ARGOCD_IMAGE"} if EnvNonOLM() { diff --git a/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go b/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go index 7a4b2ab8a36..1bd4e67ab46 100644 --- a/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go +++ b/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go @@ -10,6 +10,7 @@ import ( "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/utils" corev1 "k8s.io/api/core/v1" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -84,7 +85,6 @@ func SetEnv(subscription *olmv1alpha1.Subscription, key string, value string) { } s.Spec.Config.Env = newEnvVars - }) } diff --git a/argocd-operator/tests/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go b/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go similarity index 72% rename from argocd-operator/tests/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go rename to test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go index 5fabd2d2fc8..51bd63ab6d7 100644 --- a/argocd-operator/tests/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go +++ b/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go @@ -29,18 +29,20 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" argov1beta1api "github.com/redhat-developer/gitops-operator/argocd-operator/api/v1beta1" + "github.com/redhat-developer/gitops-operator/argocd-operator/common" "github.com/redhat-developer/gitops-operator/argocd-operator/controllers/argoutil" - "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture" - "github.com/redhat-developer/gitops-operator/argocd-operator/tests/ginkgo/fixture/utils" + "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture" + argocdFixture "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/argocd" + "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/utils" ) const ( - controllerManagerName = "argocd-operator-controller-manager" - controllerManagerNamespace = "argocd-operator-system" + controllerManagerName = "openshift-gitops-operator-controller-manager" + controllerManagerNamespace = "openshift-gitops-operator" argocdInstanceName = "argocd" argocdNamespace = "argocd" - defaultImage = "argoproj/argocd@sha123456" - expectedDefaultImage = "argoproj/argocd:sha123456" + defaultImage = "quay.io/argoproj/argocd:latest" + expectedDefaultImage = "quay.io/argoproj/argocd:latest" ) // --- Local Helpers (kept inline for reuse in this test) --- @@ -121,37 +123,31 @@ var _ = Describe("Validate deployment image and version", func() { BeforeEach(func() { if fixture.EnvLocalRun() { - Skip("This test is known not to work when running gitops operator locally, in both kuttl and ginkgo forms") + Skip("Requires setting operator environment variable") } }) It("validates image resolution order", func() { + + // The image used must be valid one for things to start, but it must be different from the default so the test is valid + Expect(defaultImage).To(Not(Equal(fmt.Sprintf("%s:%s", common.ArgoCDDefaultArgoImage, common.ArgoCDDefaultArgoVersion)))) + By("ensuring operator env variable ARGOCD_IMAGE is set") - deploy := &appsv1.Deployment{} - Expect(c.Get(ctx, types.NamespacedName{Name: controllerManagerName, Namespace: controllerManagerNamespace}, deploy)).To(Succeed()) - _, added := ensureEnv(ctx, c, deploy) + fixture.SetEnvInOperatorSubscriptionOrDeployment("ARGOCD_IMAGE", defaultImage) By("creating namespace-scoped ArgoCD without image/version") - ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: argocdNamespace}} - Expect(c.Create(ctx, ns)).To(Succeed()) - enabled := true + ns, cleanupFunc := fixture.CreateNamespaceWithCleanupFunc(argocdNamespace) + argo := &argov1beta1api.ArgoCD{ ObjectMeta: metav1.ObjectMeta{Name: argocdInstanceName, Namespace: argocdNamespace}, - Spec: argov1beta1api.ArgoCDSpec{ApplicationSet: &argov1beta1api.ArgoCDApplicationSet{Enabled: &enabled}}, + Spec: argov1beta1api.ArgoCDSpec{ApplicationSet: &argov1beta1api.ArgoCDApplicationSet{Enabled: new(true)}}, } Expect(c.Create(ctx, argo)).To(Succeed()) - Eventually(func() error { - return c.Get(ctx, types.NamespacedName{Name: argocdInstanceName, Namespace: ns.Name}, &argov1beta1api.ArgoCD{}) - }, "2m", "5s").Should(Succeed()) + Eventually(argo, "2m", "5s").Should(argocdFixture.BeAvailable()) defer func() { - if added { - By("removing operator env var ARGOCD_IMAGE") - Expect(c.Get(ctx, types.NamespacedName{Name: controllerManagerName, Namespace: controllerManagerNamespace}, deploy)).To(Succeed()) - removeEnv(ctx, c, deploy) - } - Expect(c.Delete(ctx, argo)).To(Succeed()) - Expect(c.Delete(ctx, ns)).To(Succeed()) + cleanupFunc() + fixture.RestoreSubcriptionToDefault() }() checkImages := func(expected map[string]string, stsExpected string) { @@ -168,21 +164,24 @@ var _ = Describe("Validate deployment image and version", func() { }, expectedDefaultImage) By("updating spec.version") - Expect(c.Get(ctx, types.NamespacedName{Name: argocdInstanceName, Namespace: ns.Name}, argo)).To(Succeed()) - argo.Spec.Version = "v0.0.1" - Expect(c.Update(ctx, argo)).To(Succeed()) + argocdFixture.Update(argo, func(argo *argov1beta1api.ArgoCD) { + argo.Spec.Version = "v0.0.1" + }) time.Sleep(30 * time.Second) + checkImages(map[string]string{ - "argocd-repo-server": "argoproj/argocd:v0.0.1", - "argocd-server": "argoproj/argocd:v0.0.1", - "argocd-applicationset-controller": "argoproj/argocd:v0.0.1", - }, "argoproj/argocd:v0.0.1") + "argocd-repo-server": "quay.io/argoproj/argocd:v0.0.1", + "argocd-server": "quay.io/argoproj/argocd:v0.0.1", + "argocd-applicationset-controller": "quay.io/argoproj/argocd:v0.0.1", + }, "quay.io/argoproj/argocd:v0.0.1") By("updating spec.version and spec.image") - Expect(c.Get(ctx, types.NamespacedName{Name: argocdInstanceName, Namespace: ns.Name}, argo)).To(Succeed()) - argo.Spec.Image, argo.Spec.Version = "argoprpj/sampletestimage", "v0.0.1" - Expect(c.Update(ctx, argo)).To(Succeed()) + argocdFixture.Update(argo, func(argo *argov1beta1api.ArgoCD) { + argo.Spec.Image = "argoprpj/sampletestimage" + argo.Spec.Version = "v0.0.1" + }) time.Sleep(30 * time.Second) + checkImages(map[string]string{ "argocd-repo-server": "argoprpj/sampletestimage:v0.0.1", "argocd-server": "argoprpj/sampletestimage:v0.0.1", From 5214acaf365f3a9bc23f6c64e09e5e4318736614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 23 Oct 2026 21:52:31 +0200 Subject: [PATCH 3/4] Remove unused import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Oliver Gondža --- test/openshift/e2e/ginkgo/fixture/subscription/fixture.go | 1 - 1 file changed, 1 deletion(-) diff --git a/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go b/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go index 1bd4e67ab46..ac164f178a7 100644 --- a/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go +++ b/test/openshift/e2e/ginkgo/fixture/subscription/fixture.go @@ -10,7 +10,6 @@ import ( "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/utils" corev1 "k8s.io/api/core/v1" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) From 2a8777506b0c4fc3b7f10997c4734ede1b7367c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 25 Oct 2026 14:15:39 +0100 Subject: [PATCH 4/4] Remove now-unused declarations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Oliver Gondža --- ...idate_deployment_image_and_version_test.go | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go b/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go index 4216faf8c6d..c65ac68a088 100644 --- a/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go +++ b/test/openshift/e2e/ginkgo/sequential/1-130_validate_deployment_image_and_version_test.go @@ -23,14 +23,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" argov1beta1api "github.com/redhat-developer/gitops-operator/argocd-operator/api/v1beta1" "github.com/redhat-developer/gitops-operator/argocd-operator/common" - "github.com/redhat-developer/gitops-operator/argocd-operator/controllers/argoutil" "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture" argocdFixture "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/argocd" "github.com/redhat-developer/gitops-operator/test/openshift/e2e/ginkgo/fixture/utils" @@ -47,33 +45,6 @@ const ( // --- Local Helpers (kept inline for reuse in this test) --- -func ensureEnv(ctx context.Context, c client.Client, d *appsv1.Deployment) (string, bool) { - if env := argoutil.EnvGet(d.Spec.Template.Spec.Containers[0].Env, "ARGOCD_IMAGE"); env != nil { - return env.Value, false - } - d.Spec.Template.Spec.Containers[0].Env = argoutil.EnvSet( - d.Spec.Template.Spec.Containers[0].Env, - corev1.EnvVar{Name: "ARGOCD_IMAGE", Value: defaultImage}, - ) - Expect(c.Update(ctx, d)).To(Succeed()) - waitForDeploymentReady(ctx, c, d) - return defaultImage, true -} - -func removeEnv(ctx context.Context, c client.Client, d *appsv1.Deployment) { - d.Spec.Template.Spec.Containers[0].Env = argoutil.EnvRemove( - d.Spec.Template.Spec.Containers[0].Env, "ARGOCD_IMAGE") - Expect(c.Update(ctx, d)).To(Succeed()) - waitForDeploymentReady(ctx, c, d) -} - -func waitForDeploymentReady(ctx context.Context, c client.Client, d *appsv1.Deployment) { - Eventually(func() bool { - err := c.Get(ctx, types.NamespacedName{Name: d.Name, Namespace: d.Namespace}, d) - return err == nil && d.Status.ReadyReplicas == 1 - }, "2m", "5s").Should(BeTrue()) -} - func waitForDeployments(ctx context.Context, c client.Client, ns string, min int) *appsv1.DeploymentList { deploys := &appsv1.DeploymentList{} Eventually(func() error {