Skip to content

Commit

Permalink
fix TestClusterExtensionInstallReResolvesWhenNewCataloge2e test
Browse files Browse the repository at this point in the history
  • Loading branch information
yashoza19 committed Jul 2, 2024
1 parent f681af0 commit 09ff7f3
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 53 deletions.
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
34 changes: 14 additions & 20 deletions test/e2e/cluster_extension_install_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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 = patchCatalogImageRef(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))
Expand All @@ -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)
}

Expand Down
25 changes: 23 additions & 2 deletions test/e2e/e2e_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -58,3 +59,23 @@ func createTestCatalog(ctx context.Context, name string, imageRef string) (*cata
err := c.Create(ctx, catalog)
return catalog, err
}

func patchCatalogImageRef(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
}
34 changes: 18 additions & 16 deletions test/tools/build-push-e2e-catalog.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
6 changes: 6 additions & 0 deletions testdata/catalogs/test-catalog-v2.Dockerfile
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions testdata/catalogs/test-catalog-v2/.indexignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/expected_all.json
..*
31 changes: 31 additions & 0 deletions testdata/catalogs/test-catalog-v2/catalog.yaml
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 09ff7f3

Please sign in to comment.