From 4065eb12731dab0f43164b0a9df711a499c30239 Mon Sep 17 00:00:00 2001 From: yashoza19 Date: Sat, 29 Jun 2024 00:21:37 -0400 Subject: [PATCH] fix TestClusterExtensionInstallReResolvesWhenNewCataloge2e test --- Makefile | 8 +++-- test/e2e/cluster_extension_install_test.go | 34 ++++++++----------- test/e2e/e2e_suite_test.go | 25 ++++++++++++-- test/tools/build-push-e2e-catalog.sh | 34 ++++++++++--------- ....Dockerfile => test-catalog-v1.Dockerfile} | 2 +- .../.indexignore | 0 .../catalog.yaml | 12 ------- testdata/catalogs/test-catalog-v2.Dockerfile | 6 ++++ .../catalogs/test-catalog-v2/.indexignore | 2 ++ .../catalogs/test-catalog-v2/catalog.yaml | 31 +++++++++++++++++ 10 files changed, 101 insertions(+), 53 deletions(-) rename testdata/catalogs/{test-catalog.Dockerfile => test-catalog-v1.Dockerfile} (84%) rename testdata/catalogs/{test-catalog => test-catalog-v1}/.indexignore (100%) rename testdata/catalogs/{test-catalog => test-catalog-v1}/catalog.yaml (77%) create mode 100644 testdata/catalogs/test-catalog-v2.Dockerfile create mode 100644 testdata/catalogs/test-catalog-v2/.indexignore create mode 100644 testdata/catalogs/test-catalog-v2/catalog.yaml diff --git a/Makefile b/Makefile index c2af631bf..a9affbbe1 100644 --- a/Makefile +++ b/Makefile @@ -125,7 +125,10 @@ E2E_REGISTRY_NAMESPACE := operator-controller-e2e export REG_PKG_NAME := registry-operator export REGISTRY_ROOT := $(E2E_REGISTRY_NAME).$(E2E_REGISTRY_NAMESPACE).svc:5000 -export CATALOG_IMG := $(REGISTRY_ROOT)/test-catalog:e2e +export CATALOG_IMG_TAG := v1 +export UPDATED_CATALOG_IMG_TAG := v2 +export CATALOG_IMG := $(REGISTRY_ROOT)/test-catalog:$(CATALOG_IMG_TAG) +export UPDATED_CATALOG_IMG := $(REGISTRY_ROOT)/test-catalog:$(UPDATED_CATALOG_IMG_TAG) .PHONY: test-ext-dev-e2e test-ext-dev-e2e: $(OPERATOR_SDK) $(KUSTOMIZE) $(KIND) #HELP Run extension create, upgrade and delete tests. test/extension-developer-e2e/setup.sh $(OPERATOR_SDK) $(CONTAINER_RUNTIME) $(KUSTOMIZE) $(KIND) $(KIND_CLUSTER_NAME) $(E2E_REGISTRY_NAMESPACE) @@ -141,7 +144,8 @@ image-registry: ## Setup in-cluster image registry ./test/tools/image-registry.sh $(E2E_REGISTRY_NAMESPACE) $(E2E_REGISTRY_NAME) build-push-e2e-catalog: ## Build the testdata catalog used for e2e tests and push it to the image registry - ./test/tools/build-push-e2e-catalog.sh $(E2E_REGISTRY_NAMESPACE) $(CATALOG_IMG) + ./test/tools/build-push-e2e-catalog.sh $(E2E_REGISTRY_NAMESPACE) $(CATALOG_IMG) $(CATALOG_IMG_TAG) + ./test/tools/build-push-e2e-catalog.sh $(E2E_REGISTRY_NAMESPACE) $(UPDATED_CATALOG_IMG) $(UPDATED_CATALOG_IMG_TAG) # When running the e2e suite, you can set the ARTIFACT_PATH variable to the absolute path # of the directory for the operator-controller e2e tests to store the artifacts, which diff --git a/test/e2e/cluster_extension_install_test.go b/test/e2e/cluster_extension_install_test.go index b4260efb3..77db7a266 100644 --- a/test/e2e/cluster_extension_install_test.go +++ b/test/e2e/cluster_extension_install_test.go @@ -91,7 +91,7 @@ func TestClusterExtensionInstallRegistry(t *testing.T) { assert.Equal(ct, metav1.ConditionTrue, cond.Status) assert.Equal(ct, ocv1alpha1.ReasonSuccess, cond.Reason) assert.Contains(ct, cond.Message, "resolved to") - assert.Equal(ct, &ocv1alpha1.BundleMetadata{Name: "prometheus-operator.2.0.0", Version: "2.0.0"}, clusterExtension.Status.ResolvedBundle) + assert.Equal(ct, &ocv1alpha1.BundleMetadata{Name: "prometheus-operator.1.2.0", Version: "1.2.0"}, clusterExtension.Status.ResolvedBundle) }, pollDuration, pollInterval) t.Log("By eventually reporting a successful unpacked") @@ -133,36 +133,27 @@ func TestClusterExtensionInstallReResolvesWhenNewCatalog(t *testing.T) { PackageName: pkgName, InstallNamespace: "default", } - - t.Log("By deleting the catalog first") - require.NoError(t, c.Delete(context.Background(), extensionCatalog)) - require.EventuallyWithT(t, func(ct *assert.CollectT) { - err := c.Get(context.Background(), types.NamespacedName{Name: extensionCatalog.Name}, &catalogd.ClusterCatalog{}) - assert.True(ct, errors.IsNotFound(err)) - }, pollDuration, pollInterval) - + t.Log("It resolves the specified package with correct bundle path") t.Log("By creating the ClusterExtension resource") require.NoError(t, c.Create(context.Background(), clusterExtension)) - // TODO: this isn't a good precondition because a missing package results in - // exponential backoff retries. So we can't be sure that the re-reconcile is a result of - // the catalog becoming available because it could also be a retry of the initial failed - // resolution. - t.Log("By failing to find ClusterExtension during resolution") + t.Log("By reporting a successful resolution and bundle path") require.EventuallyWithT(t, func(ct *assert.CollectT) { assert.NoError(ct, c.Get(context.Background(), types.NamespacedName{Name: clusterExtension.Name}, clusterExtension)) + assert.Len(ct, clusterExtension.Status.Conditions, len(conditionsets.ConditionTypes)) cond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeResolved) if !assert.NotNil(ct, cond) { return } - assert.Equal(ct, metav1.ConditionFalse, cond.Status) - assert.Equal(ct, ocv1alpha1.ReasonResolutionFailed, cond.Reason) - assert.Contains(ct, cond.Message, fmt.Sprintf("no package %q found", pkgName)) + assert.Equal(ct, metav1.ConditionTrue, cond.Status) + assert.Equal(ct, ocv1alpha1.ReasonSuccess, cond.Reason) + assert.Contains(ct, cond.Message, "resolved to") + assert.Equal(ct, &ocv1alpha1.BundleMetadata{Name: "prometheus-operator.1.2.0", Version: "1.2.0"}, clusterExtension.Status.ResolvedBundle) }, pollDuration, pollInterval) - t.Log("By creating an ClusterExtension catalog with the desired package") + t.Log("By creating an ClusterExtension catalog with the updated ClusterCatalog") var err error - extensionCatalog, err = createTestCatalog(context.Background(), testCatalogName, os.Getenv(testCatalogRefEnvVar)) + extensionCatalog, err = patchTestCatalog(context.Background(), testCatalogName, os.Getenv(testUpdatedCatalogRefEnvVar)) require.NoError(t, err) require.EventuallyWithT(t, func(ct *assert.CollectT) { assert.NoError(ct, c.Get(context.Background(), types.NamespacedName{Name: extensionCatalog.Name}, extensionCatalog)) @@ -174,15 +165,18 @@ func TestClusterExtensionInstallReResolvesWhenNewCatalog(t *testing.T) { assert.Equal(ct, catalogd.ReasonUnpackSuccessful, cond.Reason) }, pollDuration, pollInterval) - t.Log("By eventually resolving the package successfully") + t.Log("By eventually reporting a successful resolution and bundle path") require.EventuallyWithT(t, func(ct *assert.CollectT) { assert.NoError(ct, c.Get(context.Background(), types.NamespacedName{Name: clusterExtension.Name}, clusterExtension)) + assert.Len(ct, clusterExtension.Status.Conditions, len(conditionsets.ConditionTypes)) cond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeResolved) if !assert.NotNil(ct, cond) { return } assert.Equal(ct, metav1.ConditionTrue, cond.Status) assert.Equal(ct, ocv1alpha1.ReasonSuccess, cond.Reason) + assert.Contains(ct, cond.Message, "resolved to") + assert.Equal(ct, &ocv1alpha1.BundleMetadata{Name: "prometheus-operator.2.0.0", Version: "2.0.0"}, clusterExtension.Status.ResolvedBundle) }, pollDuration, pollInterval) } diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 8c32390bd..4f5160f8f 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -22,8 +22,9 @@ var ( ) const ( - testCatalogRefEnvVar = "CATALOG_IMG" - testCatalogName = "test-catalog" + testCatalogRefEnvVar = "CATALOG_IMG" + testUpdatedCatalogRefEnvVar = "UPDATED_CATALOG_IMG" + testCatalogName = "test-catalog" ) func TestMain(m *testing.M) { @@ -58,3 +59,23 @@ func createTestCatalog(ctx context.Context, name string, imageRef string) (*cata err := c.Create(ctx, catalog) return catalog, err } + +func patchTestCatalog(ctx context.Context, name string, newImageRef string) (*catalogd.ClusterCatalog, error) { + // Fetch the existing ClusterCatalog + catalog := &catalogd.ClusterCatalog{} + err := c.Get(ctx, client.ObjectKey{Name: name}, catalog) + if err != nil { + return nil, err + } + + // Update the ImageRef + catalog.Spec.Source.Image.Ref = newImageRef + + // Patch the ClusterCatalog + err = c.Update(ctx, catalog) + if err != nil { + return nil, err + } + + return catalog, err +} diff --git a/test/tools/build-push-e2e-catalog.sh b/test/tools/build-push-e2e-catalog.sh index e6d34d86e..4530200a1 100755 --- a/test/tools/build-push-e2e-catalog.sh +++ b/test/tools/build-push-e2e-catalog.sh @@ -7,59 +7,61 @@ set -o pipefail help=" build-push-e2e-catalog.sh is a script to build and push the e2e catalog image using kaniko. Usage: - build-push-e2e-catalog.sh [NAMESPACE] [TAG] + build-push-e2e-catalog.sh [NAMESPACE] [IMAGE] [TAG] Argument Descriptions: - NAMESPACE is the namespace the kaniko Job should be created in + - IMAGE is the full image name to build and push the catalog image - TAG is the full tag used to build and push the catalog image " -if [[ "$#" -ne 2 ]]; then +if [[ "$#" -ne 3 ]]; then echo "Illegal number of arguments passed" echo "${help}" exit 1 fi namespace=$1 -tag=$2 +image=$2 +tag=$3 -echo "${namespace}" "${tag}" +echo "${namespace}" "${image}" "${tag}" -kubectl create configmap -n "${namespace}" --from-file=testdata/catalogs/test-catalog.Dockerfile operator-controller-e2e.dockerfile -kubectl create configmap -n "${namespace}" --from-file=testdata/catalogs/test-catalog operator-controller-e2e.build-contents +kubectl create configmap -n "${namespace}" --from-file=testdata/catalogs/test-catalog-${tag}.Dockerfile operator-controller-e2e-${tag}.dockerfile +kubectl create configmap -n "${namespace}" --from-file=testdata/catalogs/test-catalog-${tag} operator-controller-e2e-${tag}.build-contents kubectl apply -f - << EOF apiVersion: batch/v1 kind: Job metadata: - name: kaniko + name: "kaniko-${tag}" namespace: "${namespace}" spec: template: spec: containers: - - name: kaniko + - name: kaniko-${tag} image: gcr.io/kaniko-project/executor:latest - args: ["--dockerfile=/workspace/test-catalog.Dockerfile", + args: ["--dockerfile=/workspace/test-catalog-${tag}.Dockerfile", "--context=/workspace/", - "--destination=${tag}", + "--destination=${image}", "--skip-tls-verify"] volumeMounts: - name: dockerfile mountPath: /workspace/ - name: build-contents - mountPath: /workspace/test-catalog/ + mountPath: /workspace/test-catalog-${tag}/ restartPolicy: Never volumes: - name: dockerfile configMap: - name: operator-controller-e2e.dockerfile + name: operator-controller-e2e-${tag}.dockerfile items: - - key: test-catalog.Dockerfile - path: test-catalog.Dockerfile + - key: test-catalog-${tag}.Dockerfile + path: test-catalog-${tag}.Dockerfile - name: build-contents configMap: - name: operator-controller-e2e.build-contents + name: operator-controller-e2e-${tag}.build-contents EOF -kubectl wait --for=condition=Complete -n "${namespace}" jobs/kaniko --timeout=60s +kubectl wait --for=condition=Complete -n "${namespace}" jobs/kaniko-${tag} --timeout=60s diff --git a/testdata/catalogs/test-catalog.Dockerfile b/testdata/catalogs/test-catalog-v1.Dockerfile similarity index 84% rename from testdata/catalogs/test-catalog.Dockerfile rename to testdata/catalogs/test-catalog-v1.Dockerfile index efe922e05..d255e0774 100644 --- a/testdata/catalogs/test-catalog.Dockerfile +++ b/testdata/catalogs/test-catalog-v1.Dockerfile @@ -1,5 +1,5 @@ FROM scratch -ADD test-catalog /configs +ADD test-catalog-v1 /configs # Set DC-specific label for the location of the DC root directory # in the image diff --git a/testdata/catalogs/test-catalog/.indexignore b/testdata/catalogs/test-catalog-v1/.indexignore similarity index 100% rename from testdata/catalogs/test-catalog/.indexignore rename to testdata/catalogs/test-catalog-v1/.indexignore diff --git a/testdata/catalogs/test-catalog/catalog.yaml b/testdata/catalogs/test-catalog-v1/catalog.yaml similarity index 77% rename from testdata/catalogs/test-catalog/catalog.yaml rename to testdata/catalogs/test-catalog-v1/catalog.yaml index 36736dac2..9ec6beae5 100644 --- a/testdata/catalogs/test-catalog/catalog.yaml +++ b/testdata/catalogs/test-catalog-v1/catalog.yaml @@ -18,8 +18,6 @@ entries: replaces: prometheus-operator.1.0.0 - name: prometheus-operator.1.2.0 replaces: prometheus-operator.1.0.1 - - name: prometheus-operator.2.0.0 - replaces: prometheus-operator.1.2.0 --- schema: olm.bundle name: prometheus-operator.1.0.0 @@ -50,13 +48,3 @@ properties: value: packageName: prometheus version: 1.2.0 ---- -schema: olm.bundle -name: prometheus-operator.2.0.0 -package: prometheus -image: docker-registry.operator-controller-e2e.svc.cluster.local:5000/bundles/registry-v1/prometheus-operator:v2.0.0 -properties: - - type: olm.package - value: - packageName: prometheus - version: 2.0.0 diff --git a/testdata/catalogs/test-catalog-v2.Dockerfile b/testdata/catalogs/test-catalog-v2.Dockerfile new file mode 100644 index 000000000..72b3a7a2e --- /dev/null +++ b/testdata/catalogs/test-catalog-v2.Dockerfile @@ -0,0 +1,6 @@ +FROM scratch +ADD test-catalog-v2 /configs + +# Set DC-specific label for the location of the DC root directory +# in the image +LABEL operators.operatorframework.io.index.configs.v1=/configs diff --git a/testdata/catalogs/test-catalog-v2/.indexignore b/testdata/catalogs/test-catalog-v2/.indexignore new file mode 100644 index 000000000..699fa6d33 --- /dev/null +++ b/testdata/catalogs/test-catalog-v2/.indexignore @@ -0,0 +1,2 @@ +/expected_all.json +..* diff --git a/testdata/catalogs/test-catalog-v2/catalog.yaml b/testdata/catalogs/test-catalog-v2/catalog.yaml new file mode 100644 index 000000000..76ff7b96b --- /dev/null +++ b/testdata/catalogs/test-catalog-v2/catalog.yaml @@ -0,0 +1,31 @@ +--- +schema: olm.package +name: prometheus +defaultChannel: beta +--- +schema: olm.channel +name: beta +package: prometheus +entries: + - name: prometheus-operator.2.0.0 + replaces: prometheus-operator.1.2.0 +--- +schema: olm.bundle +name: prometheus-operator.1.2.0 +package: prometheus +image: docker-registry.operator-controller-e2e.svc.cluster.local:5000/bundles/registry-v1/prometheus-operator:v1.2.0 +properties: + - type: olm.package + value: + packageName: prometheus + version: 1.2.0 +--- +schema: olm.bundle +name: prometheus-operator.2.0.0 +package: prometheus +image: docker-registry.operator-controller-e2e.svc.cluster.local:5000/bundles/registry-v1/prometheus-operator:v2.0.0 +properties: + - type: olm.package + value: + packageName: prometheus + version: 2.0.0