From 44935f1e276ea25a4d1e5efcc82867e5e84f7324 Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Wed, 20 Sep 2023 08:47:45 -0600 Subject: [PATCH] test/e2e: improve waits, logs, etc Signed-off-by: Steve Kuznetsov --- scripts/build_local.sh | 3 +- scripts/lib/olm_util.sh | 5 +- test/e2e/bundle_e2e_test.go | 4 +- test/e2e/catalog_e2e_test.go | 38 ++--- test/e2e/crd_e2e_test.go | 17 ++- test/e2e/csv_e2e_test.go | 39 ++++- test/e2e/dynamic_resource_e2e_test.go | 6 +- test/e2e/e2e_test.go | 2 +- test/e2e/fail_forward_e2e_test.go | 6 +- test/e2e/gc_e2e_test.go | 16 +- test/e2e/installplan_e2e_test.go | 76 +++++----- test/e2e/metrics_e2e_test.go | 2 +- test/e2e/operator_condition_e2e_test.go | 6 +- test/e2e/operator_groups_e2e_test.go | 24 +-- test/e2e/operator_test.go | 2 +- test/e2e/packagemanifest_e2e_test.go | 4 +- test/e2e/subscription_e2e_test.go | 186 +++++++++++++++--------- test/e2e/user_defined_sa_test.go | 56 +++---- test/e2e/util.go | 34 +++-- test/e2e/webhook_e2e_test.go | 2 +- 20 files changed, 312 insertions(+), 216 deletions(-) diff --git a/scripts/build_local.sh b/scripts/build_local.sh index e30ea18a0e..19c342e2c4 100755 --- a/scripts/build_local.sh +++ b/scripts/build_local.sh @@ -4,11 +4,12 @@ # This is used to start and build services for running e2e tests set -e +set -o xtrace [ -x "$(command -v kind)" ] && [[ "$(kubectl config current-context)" =~ ^kind-? ]] && KIND=1 NO_MINIKUBE=1 if [ -z "$NO_MINIKUBE" ]; then - pgrep -f "[m]inikube" >/dev/null || minikube start --extra-config=apiserver.v=4 || { echo 'Cannot start minikube.'; exit 1; } + pgrep -f "[m]inikube" >/dev/null || minikube start "${MINIKUBE_ARGS}" --extra-config=apiserver.v=4 || { echo 'Cannot start minikube.'; exit 1; } eval "$(minikube docker-env)" || { echo 'Cannot switch to minikube docker'; exit 1; } kubectl config use-context minikube fi diff --git a/scripts/lib/olm_util.sh b/scripts/lib/olm_util.sh index 4a56b25ac1..5b58cea50a 100755 --- a/scripts/lib/olm_util.sh +++ b/scripts/lib/olm_util.sh @@ -13,6 +13,7 @@ olm::util::await_csv_success() { echo "awaiting ${namespace}/${csv} csv installation success" until [[ "${retries}" -le "0" || "${phase:=$(kubectl get csv -n "${namespace}" "${csv}" -o jsonpath='{.status.phase}' 2>/dev/null || echo "missing")}" == "Succeeded" ]]; do retries=$((retries - 1)) + kubectl get csv -n "${namespace}" "${csv}" -o yaml echo "current phase: ${phase}, remaining attempts: ${retries}" unset phase sleep 1 @@ -29,7 +30,7 @@ olm::util::await_csv_success() { olm::util::await_olm_ready() { local namespace="$1" - kubectl rollout status -w deployment/olm-operator --namespace="${namespace}" || return - kubectl rollout status -w deployment/catalog-operator --namespace="${namespace}" || return + kubectl rollout status -w deployment/olm-operator --namespace="${namespace}" || kubectl get deployment olm-operator --namespace="${namespace}" -o yaml && return + kubectl rollout status -w deployment/catalog-operator --namespace="${namespace}" || kubectl get deployment catalog-operator --namespace="${namespace}" -o yaml && return olm::util::await_csv_success "${namespace}" "packageserver" 32 || return } \ No newline at end of file diff --git a/test/e2e/bundle_e2e_test.go b/test/e2e/bundle_e2e_test.go index 8690ad1956..4d1aae0940 100644 --- a/test/e2e/bundle_e2e_test.go +++ b/test/e2e/bundle_e2e_test.go @@ -114,14 +114,14 @@ var _ = Describe("Installing bundles with new object types", func() { }).Should(Succeed()) // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // Create a Subscription for package _ = createSubscriptionForCatalog(operatorClient, source.GetNamespace(), subName, source.GetName(), packageName, channelName, "", v1alpha1.ApprovalAutomatic) // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, generatedNamespace.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, generatedNamespace.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef := sub.Status.InstallPlanRef diff --git a/test/e2e/catalog_e2e_test.go b/test/e2e/catalog_e2e_test.go index cc46fbf852..b7aa95a1d8 100644 --- a/test/e2e/catalog_e2e_test.go +++ b/test/e2e/catalog_e2e_test.go @@ -109,7 +109,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { defer cleanupSource() // ensure the mock catalog exists and has been synced by the catalog operator - catalogSource, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + catalogSource, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) // get catalog operator deployment @@ -180,7 +180,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { defer cleanup() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) subscriptionSpec := &v1alpha1.SubscriptionSpec{ @@ -196,7 +196,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { subscriptionName := genName("sub-") createSubscriptionForCatalogWithSpec(GinkgoT(), crc, ns.GetName(), subscriptionName, subscriptionSpec) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) @@ -232,10 +232,10 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { updateInternalCatalog(GinkgoT(), c, crc, cs.GetName(), cs.GetNamespace(), []apiextensions.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, replacementCSV}, mainManifests) // Get updated catalogsource - fetchedUpdatedCatalog, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced) + fetchedUpdatedCatalog, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) - subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateUpgradePendingChecker) + subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateUpgradePendingChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) @@ -298,7 +298,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { createInternalCatalogSource(c, crc, mainCatalogName, ns.GetName(), mainManifests, nil, []v1alpha1.ClusterServiceVersion{mainCSV}) // Attempt to get the catalog source before creating install plan - fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) // Get initial configmap @@ -361,7 +361,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { subscriptionName := genName("sub-") createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, fetchedUpdatedCatalog.GetName(), mainPackageName, stableChannel, "", v1alpha1.ApprovalAutomatic) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) _, err = fetchCSV(crc, subscription.Status.CurrentCSV, ns.GetName(), buildCSVConditionChecker(v1alpha1.CSVPhaseSucceeded)) @@ -431,7 +431,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { _, cleanupSource := createInternalCatalogSource(c, crc, mainCatalogName, ns.GetName(), mainManifests, nil, []v1alpha1.ClusterServiceVersion{mainCSV}) // Attempt to get the catalog source before creating install plan - fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) // Get initial configmap configMap, err := c.KubernetesInterface().CoreV1().ConfigMaps(ns.GetName()).Get(context.Background(), fetchedInitialCatalog.Spec.ConfigMap, metav1.GetOptions{}) @@ -452,7 +452,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { subscriptionName := genName("sub-") createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", v1alpha1.ApprovalAutomatic) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) _, err = fetchCSV(crc, subscription.Status.CurrentCSV, ns.GetName(), buildCSVConditionChecker(v1alpha1.CSVPhaseSucceeded)) @@ -540,9 +540,9 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { createInternalCatalogSource(c, crc, replacementSourceName, ns.GetName(), append(replacementManifests, dependentManifests...), []apiextensions.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{replacementCSV, mainCSV, dependentCSV}) // Wait for ConfigMap CatalogSources to be ready - mainSource, err := fetchCatalogSourceOnStatus(crc, mainSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + mainSource, err := fetchCatalogSourceOnStatus(crc, mainSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) - replacementSource, err := fetchCatalogSourceOnStatus(crc, replacementSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + replacementSource, err := fetchCatalogSourceOnStatus(crc, replacementSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) // Replicate catalog pods with no OwnerReferences @@ -580,7 +580,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { }() // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(crc, addressSource.GetName(), addressSource.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, addressSource.GetName(), addressSource.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // Delete CatalogSources @@ -594,7 +594,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { cleanupSubscription := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, addressSourceName, mainPackageName, stableChannel, "", v1alpha1.ApprovalAutomatic) defer cleanupSubscription() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) _, err = fetchCSV(crc, subscription.Status.CurrentCSV, ns.GetName(), csvSucceededChecker) @@ -783,7 +783,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { Expect(err).ShouldNot(HaveOccurred()) By("Wait for the CatalogSource to be ready") - source, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + source, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // the gRPC endpoints are not exposed from the pod, and there's no simple way to get at them - @@ -923,7 +923,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { defer cleanupSubscription() // Wait for the Subscription to succeed - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) @@ -1088,7 +1088,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { }() By("waiting for the CatalogSource to be ready") - _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") By("creating a Subscription for busybox") @@ -1097,7 +1097,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { defer cleanupSubscription() By("waiting for the Subscription to succeed") - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) Expect(subscription.Status.InstalledCSV).To(Equal("busybox.v1.0.0")) @@ -1114,7 +1114,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { Expect(dependencySubscriptionName).ToNot(BeEmpty()) By("waiting for the Subscription to succeed") - subscription, err = fetchSubscription(crc, ns.GetName(), dependencySubscriptionName, subscriptionStateAtLatestChecker) + subscription, err = fetchSubscription(crc, ns.GetName(), dependencySubscriptionName, subscriptionStateAtLatestChecker()) Expect(err).ShouldNot(HaveOccurred()) Expect(subscription).ShouldNot(BeNil()) Expect(subscription.Status.InstalledCSV).To(Equal("busybox-dependency.v1.0.0")) @@ -1132,7 +1132,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { }).Should(Succeed()) By("waiting for the CatalogSource to be ready") - _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") By("waiting for the busybox v2 Subscription to succeed") diff --git a/test/e2e/crd_e2e_test.go b/test/e2e/crd_e2e_test.go index 123a3622fb..616db36407 100644 --- a/test/e2e/crd_e2e_test.go +++ b/test/e2e/crd_e2e_test.go @@ -92,14 +92,14 @@ var _ = Describe("CRD Versions", func() { }() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) subscriptionName := genName("sub-nginx-update2-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(Equal(nil)) Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) @@ -231,14 +231,14 @@ var _ = Describe("CRD Versions", func() { }() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) subscriptionName := genName("sub-nginx-update2-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) @@ -261,8 +261,9 @@ var _ = Describe("CRD Versions", func() { })).Should(Succeed()) ctx.Ctx().Logf("updated subscription to point to alpha channel") + checker := subscriptionStateAtLatestChecker() subscriptionAtLatestWithDifferentInstallPlan := func(v *operatorsv1alpha1.Subscription) bool { - return subscriptionStateAtLatestChecker(v) && v.Status.InstallPlanRef != nil && v.Status.InstallPlanRef.Name != fetchedInstallPlan.Name + return checker(v) && v.Status.InstallPlanRef != nil && v.Status.InstallPlanRef.Name != fetchedInstallPlan.Name } // fetch new subscription @@ -421,13 +422,13 @@ var _ = Describe("CRD Versions", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) subscriptionName := genName("sub-nginx-update2-") _ = createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) @@ -467,7 +468,7 @@ var _ = Describe("CRD Versions", func() { subscriptionNameNew := genName("sub-nginx-update2-new-") _ = createSubscriptionForCatalog(crc, ns.GetName(), subscriptionNameNew, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionNameNew, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionNameNew, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) diff --git a/test/e2e/csv_e2e_test.go b/test/e2e/csv_e2e_test.go index ea7409745f..3f9172d03c 100644 --- a/test/e2e/csv_e2e_test.go +++ b/test/e2e/csv_e2e_test.go @@ -3,6 +3,7 @@ package e2e import ( "context" "fmt" + "os" "strconv" "strings" "time" @@ -4205,6 +4206,11 @@ func findLastEvent(events *corev1.EventList) (event corev1.Event) { func buildCSVCleanupFunc(c operatorclient.ClientInterface, crc versioned.Interface, csv operatorsv1alpha1.ClusterServiceVersion, namespace string, deleteCRDs, deleteAPIServices bool) cleanupFunc { return func() { + if env := os.Getenv("SKIP_CLEANUP"); env != "" { + fmt.Printf("Skipping deletion of CSV %s/%s...\n", namespace, csv.Name) + return + } + err := crc.OperatorsV1alpha1().ClusterServiceVersions(namespace).Delete(context.TODO(), csv.GetName(), metav1.DeleteOptions{}) if err != nil && apierrors.IsNotFound(err) { err = nil @@ -4248,6 +4254,11 @@ func createCSV(c operatorclient.ClientInterface, crc versioned.Interface, csv op func buildCRDCleanupFunc(c operatorclient.ClientInterface, crdName string) cleanupFunc { return func() { + if env := os.Getenv("SKIP_CLEANUP"); env != "" { + fmt.Printf("Skipping deletion of CRD %s...\n", crdName) + return + } + err := c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), crdName, *metav1.NewDeleteOptions(immediateDeleteGracePeriod)) if err != nil { fmt.Println(err) @@ -4262,6 +4273,11 @@ func buildCRDCleanupFunc(c operatorclient.ClientInterface, crdName string) clean func buildAPIServiceCleanupFunc(c operatorclient.ClientInterface, apiServiceName string) cleanupFunc { return func() { + if env := os.Getenv("SKIP_CLEANUP"); env != "" { + fmt.Printf("Skipping deletion of APIService %s...\n", apiServiceName) + return + } + err := c.ApiregistrationV1Interface().ApiregistrationV1().APIServices().Delete(context.TODO(), apiServiceName, *metav1.NewDeleteOptions(immediateDeleteGracePeriod)) if err != nil { fmt.Println(err) @@ -4402,21 +4418,43 @@ func newMockExtServerDeployment(labelName string, mGVKs []mockGroupVersionKind) type csvConditionChecker func(csv *operatorsv1alpha1.ClusterServiceVersion) bool func buildCSVConditionChecker(phases ...operatorsv1alpha1.ClusterServiceVersionPhase) csvConditionChecker { + var lastPhase operatorsv1alpha1.ClusterServiceVersionPhase + var lastReason operatorsv1alpha1.ConditionReason + var lastMessage string + lastTime := time.Now() + return func(csv *operatorsv1alpha1.ClusterServiceVersion) bool { conditionMet := false for _, phase := range phases { conditionMet = conditionMet || csv.Status.Phase == phase } + phase, reason, message := csv.Status.Phase, csv.Status.Reason, csv.Status.Message + if phase != lastPhase || reason != lastReason || message != lastMessage { + ctx.Ctx().Logf("waited %s for CSV %s/%s: to be in phases %s, in phase %s (%s): %s", time.Since(lastTime), csv.Namespace, csv.Name, phases, phase, reason, message) + lastPhase, lastReason, lastMessage = phase, reason, message + lastTime = time.Now() + } return conditionMet } } func buildCSVReasonChecker(reasons ...operatorsv1alpha1.ConditionReason) csvConditionChecker { + var lastPhase operatorsv1alpha1.ClusterServiceVersionPhase + var lastReason operatorsv1alpha1.ConditionReason + var lastMessage string + lastTime := time.Now() + return func(csv *operatorsv1alpha1.ClusterServiceVersion) bool { conditionMet := false for _, reason := range reasons { conditionMet = conditionMet || csv.Status.Reason == reason } + phase, reason, message := csv.Status.Phase, csv.Status.Reason, csv.Status.Message + if phase != lastPhase || reason != lastReason || message != lastMessage { + ctx.Ctx().Logf("waited %s for CSV %s/%s: to have reasons %s, in phase %s (%s): %s", time.Since(lastTime), csv.Namespace, csv.Name, reasons, phase, reason, message) + lastPhase, lastReason, lastMessage = phase, reason, message + lastTime = time.Now() + } return conditionMet } } @@ -4438,7 +4476,6 @@ func fetchCSV(c versioned.Interface, name, namespace string, checker csvConditio if err != nil { return false, err } - ctx.Ctx().Logf("CSV %s/%s: phase %s (%s): %s", namespace, name, fetchedCSV.Status.Phase, fetchedCSV.Status.Reason, fetchedCSV.Status.Message) return checker(fetchedCSV), nil }).Should(BeTrue()) diff --git a/test/e2e/dynamic_resource_e2e_test.go b/test/e2e/dynamic_resource_e2e_test.go index aae13be5d6..387a77c743 100644 --- a/test/e2e/dynamic_resource_e2e_test.go +++ b/test/e2e/dynamic_resource_e2e_test.go @@ -78,7 +78,7 @@ var _ = Describe("Subscriptions create required objects from Catalogs", func() { Expect(err).NotTo(HaveOccurred()) // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).NotTo(HaveOccurred()) // Generate a Subscription @@ -110,13 +110,13 @@ var _ = Describe("Subscriptions create required objects from Catalogs", func() { It("should install the operator successfully", func() { Skip("this test disabled pending fix of the v1 CRD feature") - _, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker) + _, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker()) Expect(err).NotTo(HaveOccurred()) }) It("should have created the expected prometheus objects", func() { Skip("this test disabled pending fix of the v1 CRD feature") - sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker) + sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker()) Expect(err).NotTo(HaveOccurred()) ipName := sub.Status.InstallPlanRef.Name diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 99a2b7fada..28fcc8f8d2 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -126,7 +126,7 @@ var _ = BeforeSuite(func() { ContainElement(Not(BeZero())), )) - _, err := fetchCatalogSourceOnStatus(ctx.Ctx().OperatorClient(), "operatorhubio-catalog", operatorNamespace, catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(ctx.Ctx().OperatorClient(), "operatorhubio-catalog", operatorNamespace, catalogSourceRegistryPodSynced()) Expect(err).NotTo(HaveOccurred()) }) diff --git a/test/e2e/fail_forward_e2e_test.go b/test/e2e/fail_forward_e2e_test.go index 3df0768f61..8f06170322 100644 --- a/test/e2e/fail_forward_e2e_test.go +++ b/test/e2e/fail_forward_e2e_test.go @@ -93,7 +93,7 @@ var _ = Describe("Fail Forward Upgrades", func() { Expect(c.Create(context.Background(), subscription)).To(BeNil()) By("waiting until the subscription has an IP reference") - subscription, err := fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker()) Expect(err).Should(BeNil()) originalInstallPlanRef = subscription.Status.InstallPlanRef @@ -214,7 +214,7 @@ var _ = Describe("Fail Forward Upgrades", func() { Consistently(subscriptionCurrentCSVGetter(crclient, subscription.GetNamespace(), subscription.GetName())).Should(Equal("example-operator.v0.2.0")) By("verifying the subscription is referencing the same InstallPlan") - subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker()) Expect(err).Should(BeNil()) Expect(subscription.Status.InstallPlanRef.Name).To(Equal(failedInstallPlanRef.Name)) }) @@ -251,7 +251,7 @@ var _ = Describe("Fail Forward Upgrades", func() { Expect(c.Create(context.Background(), subscription)).To(BeNil()) By("waiting until the subscription has an IP reference") - subscription, err := fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker()) Expect(err).Should(BeNil()) By("waiting for the v0.1.0 CSV to report a succeeded phase") diff --git a/test/e2e/gc_e2e_test.go b/test/e2e/gc_e2e_test.go index b33c40c518..f9bdd992f8 100644 --- a/test/e2e/gc_e2e_test.go +++ b/test/e2e/gc_e2e_test.go @@ -367,14 +367,14 @@ var _ = Describe("Garbage collection for dependent resources", func() { }).Should(Succeed(), "could not create catalog source") // Wait for the CatalogSource to be ready - _, err := fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // Create a Subscription for package _ = createSubscriptionForCatalog(operatorClient, source.GetNamespace(), subName, source.GetName(), packageName, channelName, "", v1alpha1.ApprovalAutomatic) // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef = sub.Status.InstallPlanRef.Name @@ -486,14 +486,14 @@ var _ = Describe("Garbage collection for dependent resources", func() { }).Should(Succeed(), "could not create catalog source") // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // Create a Subscription for package _ = createSubscriptionForCatalog(operatorClient, source.GetNamespace(), subName, source.GetName(), packageName, channelName, "", v1alpha1.ApprovalAutomatic) // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef = sub.Status.InstallPlanRef.Name @@ -530,7 +530,7 @@ var _ = Describe("Garbage collection for dependent resources", func() { }).Should(Succeed(), "could not update subscription") // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef = sub.Status.InstallPlanRef.Name @@ -604,14 +604,14 @@ var _ = Describe("Garbage collection for dependent resources", func() { }).Should(Succeed()) // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(operatorClient, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") // Create a Subscription for package _ = createSubscriptionForCatalog(operatorClient, source.GetNamespace(), subName, source.GetName(), packageName, channelName, "", v1alpha1.ApprovalAutomatic) // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef = sub.Status.InstallPlanRef.Name @@ -649,7 +649,7 @@ var _ = Describe("Garbage collection for dependent resources", func() { }).Should(Succeed(), "could not update subscription") // Wait for the Subscription to succeed - sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker) + sub, err := fetchSubscription(operatorClient, ns.GetName(), subName, subscriptionStateAtLatestChecker()) Expect(err).ToNot(HaveOccurred(), "could not get subscription at latest status") installPlanRef = sub.Status.InstallPlanRef.Name diff --git a/test/e2e/installplan_e2e_test.go b/test/e2e/installplan_e2e_test.go index 92d2c4c3e0..2de113cb25 100644 --- a/test/e2e/installplan_e2e_test.go +++ b/test/e2e/installplan_e2e_test.go @@ -736,14 +736,14 @@ var _ = Describe("Install Plan", func() { defer cleanupDependentCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, dependentCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, dependentCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, ns.GetName(), mainManifests, nil, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create expected install plan step sources @@ -758,7 +758,7 @@ var _ = Describe("Install Plan", func() { subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -806,7 +806,7 @@ var _ = Describe("Install Plan", func() { log("All expected resources resolved") // Verify that the dependent subscription is in a good state - dependentSubscription, err := fetchSubscription(crc, ns.GetName(), strings.Join([]string{dependentPackageStable, dependentCatalogName, ns.GetName()}, "-"), subscriptionStateAtLatestChecker) + dependentSubscription, err := fetchSubscription(crc, ns.GetName(), strings.Join([]string{dependentPackageStable, dependentCatalogName, ns.GetName()}, "-"), subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), dependentSubscription) require.NotNil(GinkgoT(), dependentSubscription.Status.InstallPlanRef) @@ -909,7 +909,7 @@ var _ = Describe("Install Plan", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) expectedSteps := map[registry.ResourceKey]struct{}{ @@ -930,7 +930,7 @@ var _ = Describe("Install Plan", func() { subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogSourceName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1334,14 +1334,14 @@ var _ = Describe("Install Plan", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-alpha-") cleanupSubscription := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogSourceName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer cleanupSubscription() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1385,12 +1385,12 @@ var _ = Describe("Install Plan", func() { updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, ns.GetName(), []apiextensions.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Update the subscription resource to point to the beta CSV err = retry.RetryOnConflict(retry.DefaultBackoff, func() error { - subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1582,7 +1582,7 @@ var _ = Describe("Install Plan", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") @@ -1590,7 +1590,7 @@ var _ = Describe("Install Plan", func() { // this subscription will be cleaned up below without the clean up function createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogSourceName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1623,7 +1623,7 @@ var _ = Describe("Install Plan", func() { updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, ns.GetName(), []apiextensions.CustomResourceDefinition{*tt.intermediateCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(installPlanName)) require.NoError(GinkgoT(), err) @@ -1663,7 +1663,7 @@ var _ = Describe("Install Plan", func() { updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, ns.GetName(), []apiextensions.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV, mainDeltaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscription, err = fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(installPlanName)) require.NoError(GinkgoT(), err) @@ -1797,14 +1797,14 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-update-perms1") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) require.NotNil(GinkgoT(), subscription.Status.InstallPlanRef) @@ -1995,14 +1995,14 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-update-perms1") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) require.NotNil(GinkgoT(), subscription.Status.InstallPlanRef) @@ -2211,14 +2211,14 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-stompy-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) require.NotNil(GinkgoT(), subscription.Status.InstallPlanRef) @@ -2451,13 +2451,13 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-update-") createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) require.NotNil(GinkgoT(), subscription.Status.InstallPlanRef) @@ -2650,14 +2650,14 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-update2-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) require.NotNil(GinkgoT(), subscription.Status.InstallPlanRef) @@ -2792,14 +2792,14 @@ var _ = Describe("Install Plan", func() { defer cleanupCatalogSource() // Attempt to get CatalogSource - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -3040,14 +3040,14 @@ var _ = Describe("Install Plan", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") cleanupSubscription := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, catalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer cleanupSubscription() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -3145,7 +3145,7 @@ var _ = Describe("Install Plan", func() { defer cleanupDependentCatalogSource() // Attempt to get the catalog source before creating install plan - dependentCatalogSource, err := fetchCatalogSourceOnStatus(crc, dependentCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + dependentCatalogSource, err := fetchCatalogSourceOnStatus(crc, dependentCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create the alt dependent catalog sources @@ -3174,7 +3174,7 @@ var _ = Describe("Install Plan", func() { require.NoError(GinkgoT(), err) // Attempt to get the catalog source before creating install plan - _, err = fetchCatalogSourceOnStatus(crc, addressSource.GetName(), ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, addressSource.GetName(), ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) wg.Done() }(i) @@ -3186,14 +3186,14 @@ var _ = Describe("Install Plan", func() { defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan - _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, mainCatalogName, ns.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") subscriptionCleanup := createSubscriptionForCatalog(crc, ns.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -3354,7 +3354,7 @@ var _ = Describe("Install Plan", func() { Expect(err).ToNot(HaveOccurred()) // Wait for the CatalogSource to be ready - catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced) + catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) // Generate a Subscription @@ -3362,7 +3362,7 @@ var _ = Describe("Install Plan", func() { cleanUpSubscriptionFn := createSubscriptionForCatalog(crc, catsrc.GetNamespace(), subName, catsrc.GetName(), "kiali", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) defer cleanUpSubscriptionFn() - sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker) + sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) // Wait for the expected InstallPlan's execution to either fail or succeed @@ -3929,8 +3929,14 @@ func validateCRDVersions(t GinkgoTInterface, c operatorclient.ClientInterface, n } func buildInstallPlanPhaseCheckFunc(phases ...operatorsv1alpha1.InstallPlanPhase) checkInstallPlanFunc { + var lastPhase operatorsv1alpha1.InstallPlanPhase + lastTime := time.Now() return func(fip *operatorsv1alpha1.InstallPlan) bool { - ctx.Ctx().Logf("installplan %v is in phase %v", fip.GetName(), fip.Status.Phase) + if fip.Status.Phase != lastPhase { + ctx.Ctx().Logf("waiting %s for installplan %s/%s to be phases %v, in phase %s", time.Since(lastTime), fip.Namespace, fip.Name, phases, fip.Status.Phase) + lastPhase = fip.Status.Phase + lastTime = time.Now() + } satisfiesAny := false for _, phase := range phases { satisfiesAny = satisfiesAny || fip.Status.Phase == phase diff --git a/test/e2e/metrics_e2e_test.go b/test/e2e/metrics_e2e_test.go index 0d0d119c10..64c33ed59d 100644 --- a/test/e2e/metrics_e2e_test.go +++ b/test/e2e/metrics_e2e_test.go @@ -362,7 +362,7 @@ var _ = Describe("Metrics are generated for OLM managed resources", func() { // operator can generate all the requisite resources (e.g. the ServiceAccount), which can leave the underlying // registry Pod in a terminating state until kubelet times out waiting for the generated ServiceAccount // resource to be present so it can mount it in the registry container. - _, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ShouldNot(HaveOccurred()) var once sync.Once diff --git a/test/e2e/operator_condition_e2e_test.go b/test/e2e/operator_condition_e2e_test.go index c10ba615d4..1a6cbc9712 100644 --- a/test/e2e/operator_condition_e2e_test.go +++ b/test/e2e/operator_condition_e2e_test.go @@ -72,7 +72,7 @@ var _ = Describe("Operator Condition", func() { catalog := genName("catalog-") _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA}) defer cleanupCatalogSource() - _, err := fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) subName := genName("sub-") cleanupSub := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subName, catalog, pkgA, stableChannel, pkgAStable, operatorsv1alpha1.ApprovalAutomatic) defer cleanupSub() @@ -117,7 +117,7 @@ var _ = Describe("Operator Condition", func() { updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}, manifests) // Attempt to get the catalog source before creating install plan(s) - _, err = fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // csvB will be in Pending phase due to csvA reports Upgradeable=False condition @@ -176,7 +176,7 @@ var _ = Describe("Operator Condition", func() { updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvD}, manifests) // Attempt to get the catalog source before creating install plan(s) - _, err = fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // CSVD will be in Pending status due to overrides in csvB's condition diff --git a/test/e2e/operator_groups_e2e_test.go b/test/e2e/operator_groups_e2e_test.go index a60a8ffcb4..940b06e5e1 100644 --- a/test/e2e/operator_groups_e2e_test.go +++ b/test/e2e/operator_groups_e2e_test.go @@ -938,15 +938,15 @@ var _ = Describe("Operator Group", func() { catalog := genName("catalog-") _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, nsA, manifests, []apiextensions.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() - _, err := fetchCatalogSourceOnStatus(crc, catalog, nsA, catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalog, nsA, catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsB, manifests, []apiextensions.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() - _, err = fetchCatalogSourceOnStatus(crc, catalog, nsB, catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalog, nsB, catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsD, manifests, []apiextensions.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() - _, err = fetchCatalogSourceOnStatus(crc, catalog, nsD, catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalog, nsD, catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create operatorgroups @@ -965,7 +965,7 @@ var _ = Describe("Operator Group", func() { subDName := genName("d-") cleanupSubD := createSubscriptionForCatalog(crc, nsD, subDName, catalog, pkgD, stableChannel, pkgDStable, v1alpha1.ApprovalAutomatic) defer cleanupSubD() - subD, err := fetchSubscription(crc, nsD, subDName, subscriptionHasInstallPlanChecker) + subD, err := fetchSubscription(crc, nsD, subDName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subD) @@ -988,7 +988,7 @@ var _ = Describe("Operator Group", func() { subD2Name := genName("d2-") cleanupSubD2 := createSubscriptionForCatalog(crc, nsA, subD2Name, catalog, pkgD, stableChannel, pkgDStable, v1alpha1.ApprovalAutomatic) defer cleanupSubD2() - subD2, err := fetchSubscription(crc, nsA, subD2Name, subscriptionHasInstallPlanChecker) + subD2, err := fetchSubscription(crc, nsA, subD2Name, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subD2) @@ -1012,7 +1012,7 @@ var _ = Describe("Operator Group", func() { subAName := genName("a-") cleanupSubA := createSubscriptionForCatalog(crc, nsA, subAName, catalog, pkgA, stableChannel, pkgAStable, v1alpha1.ApprovalAutomatic) defer cleanupSubA() - subA, err := fetchSubscription(crc, nsA, subAName, subscriptionHasInstallPlanChecker) + subA, err := fetchSubscription(crc, nsA, subAName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subA) @@ -1083,7 +1083,7 @@ var _ = Describe("Operator Group", func() { subBName := genName("b-") cleanupSubB := createSubscriptionForCatalog(crc, nsB, subBName, catalog, pkgB, stableChannel, pkgBStable, v1alpha1.ApprovalAutomatic) defer cleanupSubB() - subB, err := fetchSubscription(crc, nsB, subBName, subscriptionHasInstallPlanChecker) + subB, err := fetchSubscription(crc, nsB, subBName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subB) @@ -1205,11 +1205,11 @@ var _ = Describe("Operator Group", func() { catalog := genName("catalog-") _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, nsB, manifests, []apiextensions.CustomResourceDefinition{crdA, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanupCatalogSource() - _, err := fetchCatalogSourceOnStatus(crc, catalog, nsB, catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalog, nsB, catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsC, manifests, []apiextensions.CustomResourceDefinition{crdA, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanupCatalogSource() - _, err = fetchCatalogSourceOnStatus(crc, catalog, nsC, catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalog, nsC, catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create OperatorGroups @@ -1228,7 +1228,7 @@ var _ = Describe("Operator Group", func() { subAName := genName("a-") cleanupSubA := createSubscriptionForCatalog(crc, nsB, subAName, catalog, pkgA, stableChannel, pkgAStable, v1alpha1.ApprovalAutomatic) defer cleanupSubA() - subA, err := fetchSubscription(crc, nsB, subAName, subscriptionHasInstallPlanChecker) + subA, err := fetchSubscription(crc, nsB, subAName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subA) @@ -1254,7 +1254,7 @@ var _ = Describe("Operator Group", func() { // Create subscription for csvA in namespaceC cleanupSubAC := createSubscriptionForCatalog(crc, nsC, subAName, catalog, pkgA, stableChannel, pkgAStable, v1alpha1.ApprovalAutomatic) defer cleanupSubAC() - subAC, err := fetchSubscription(crc, nsC, subAName, subscriptionHasInstallPlanChecker) + subAC, err := fetchSubscription(crc, nsC, subAName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subAC) @@ -1280,7 +1280,7 @@ var _ = Describe("Operator Group", func() { subBName := genName("b-") cleanupSubB := createSubscriptionForCatalog(crc, nsB, subBName, catalog, pkgB, stableChannel, pkgBStable, v1alpha1.ApprovalAutomatic) defer cleanupSubB() - subB, err := fetchSubscription(crc, nsB, subBName, subscriptionHasInstallPlanChecker) + subB, err := fetchSubscription(crc, nsB, subBName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subB) diff --git a/test/e2e/operator_test.go b/test/e2e/operator_test.go index d9e541c53c..6824adcdd2 100644 --- a/test/e2e/operator_test.go +++ b/test/e2e/operator_test.go @@ -279,7 +279,7 @@ var _ = Describe("Operator API", func() { }).Should(Succeed()) // Wait for the CatalogSource to be ready - _, err := fetchCatalogSourceOnStatus(newCRClient(), cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(newCRClient(), cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) sub = &operatorsv1alpha1.Subscription{ diff --git a/test/e2e/packagemanifest_e2e_test.go b/test/e2e/packagemanifest_e2e_test.go index 10af623b39..5e13fe17d8 100644 --- a/test/e2e/packagemanifest_e2e_test.go +++ b/test/e2e/packagemanifest_e2e_test.go @@ -111,7 +111,7 @@ var _ = Describe("Package Manifest API lists available Operators from Catalog So _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catsrcName, testNamespace, manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv, csvAlpha}) // Verify catalog source was created - _, err := fetchCatalogSourceOnStatus(crc, catsrcName, testNamespace, catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catsrcName, testNamespace, catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) }) @@ -238,7 +238,7 @@ var _ = Describe("Package Manifest API lists available Operators from Catalog So Expect(err).NotTo(HaveOccurred()) // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(crc, catalogSource.GetName(), catalogSource.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, catalogSource.GetName(), catalogSource.GetNamespace(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready") }) diff --git a/test/e2e/subscription_e2e_test.go b/test/e2e/subscription_e2e_test.go index 0c968997fb..a3421b12dd 100644 --- a/test/e2e/subscription_e2e_test.go +++ b/test/e2e/subscription_e2e_test.go @@ -20,6 +20,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -110,7 +111,7 @@ var _ = Describe("Subscription", func() { } _, teardown = createInternalCatalogSource(ctx.Ctx().KubeClient(), ctx.Ctx().OperatorClient(), "test-catalog", generatedNamespace.GetName(), packages, crds, csvs) - _, err := fetchCatalogSourceOnStatus(ctx.Ctx().OperatorClient(), "test-catalog", generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(ctx.Ctx().OperatorClient(), "test-catalog", generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).NotTo(HaveOccurred()) createSubscriptionForCatalog(ctx.Ctx().OperatorClient(), generatedNamespace.GetName(), "test-subscription", "test-catalog", "root", "channel-root", "", operatorsv1alpha1.ApprovalAutomatic) @@ -202,7 +203,7 @@ var _ = Describe("Subscription", func() { subscriptionCleanup, _ := createSubscription(GinkgoT(), crc, generatedNamespace.GetName(), testSubscriptionName, testPackageName, alphaChannel, operatorsv1alpha1.ApprovalAutomatic) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), testSubscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), testSubscriptionName, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) _, err = fetchCSV(crc, subscription.Status.CurrentCSV, generatedNamespace.GetName(), buildCSVConditionChecker(operatorsv1alpha1.CSVPhaseSucceeded)) @@ -281,7 +282,7 @@ var _ = Describe("Subscription", func() { _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating subscription - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create a subscription @@ -315,7 +316,7 @@ var _ = Describe("Subscription", func() { subscriptionCleanup, _ := createSubscription(GinkgoT(), crc, generatedNamespace.GetName(), "manual-subscription", testPackageName, stableChannel, operatorsv1alpha1.ApprovalManual) defer subscriptionCleanup() - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), "manual-subscription", subscriptionStateUpgradePendingChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), "manual-subscription", subscriptionStateUpgradePendingChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -358,7 +359,7 @@ var _ = Describe("Subscription", func() { return nil })).Should(Succeed()) - subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), "manual-subscription", subscriptionStateAtLatestChecker) + subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), "manual-subscription", subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -424,14 +425,14 @@ var _ = Describe("Subscription", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catalogSourceName, packageName, stableChannel, csvA.GetName(), operatorsv1alpha1.ApprovalManual) defer cleanupSubscription() - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -545,14 +546,14 @@ var _ = Describe("Subscription", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("sub-nginx-") cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catalogSourceName, packageName, stableChannel, csvA.GetName(), operatorsv1alpha1.ApprovalAutomatic) defer cleanupSubscription() - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -631,7 +632,7 @@ var _ = Describe("Subscription", func() { defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create a subscription to just get an InstallPlan for csvB @@ -642,7 +643,7 @@ var _ = Describe("Subscription", func() { _, err = awaitCSV(crc, generatedNamespace.GetName(), csvB.GetName(), csvSucceededChecker) require.NoError(GinkgoT(), err) - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) fetchedInstallPlan, err := fetchInstallPlanWithNamespace(GinkgoT(), crc, subscription.Status.InstallPlanRef.Name, generatedNamespace.GetName(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete)) // Delete this subscription @@ -678,7 +679,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catalogSourceName, packageName, stableChannel, csvA.GetName(), operatorsv1alpha1.ApprovalManual) defer cleanupSubscription() - subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -699,7 +700,7 @@ var _ = Describe("Subscription", func() { require.NoError(GinkgoT(), err) // Wait for the subscription to begin upgrading to csvB - subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionStateUpgradePendingChecker) + subscription, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionStateUpgradePendingChecker()) require.NoError(GinkgoT(), err) // Fetch existing csvB installPlan @@ -768,7 +769,7 @@ var _ = Describe("Subscription", func() { Expect(err).NotTo(HaveOccurred()) // Wait for success - _, err = fetchSubscription(crc, generatedNamespace.GetName(), testSubscriptionName, subscriptionStateAtLatestChecker) + _, err = fetchSubscription(crc, generatedNamespace.GetName(), testSubscriptionName, subscriptionStateAtLatestChecker()) Expect(err).NotTo(HaveOccurred()) }) }) @@ -1055,7 +1056,7 @@ var _ = Describe("Subscription", func() { catalogName := genName("catalog-") _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csv}) defer cleanupCatalogSource() - _, err := fetchCatalogSourceOnStatus(crc, catalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) // Create Subscription to a package of cs in ns, sub @@ -1063,6 +1064,7 @@ var _ = Describe("Subscription", func() { defer createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subName, catalogName, pkgName, channelName, pkgName, operatorsv1alpha1.ApprovalAutomatic)() // Wait for the package from sub to install successfully with no remaining InstallPlan status conditions + checker := subscriptionStateAtLatestChecker() sub, err := fetchSubscription(crc, generatedNamespace.GetName(), subName, func(s *operatorsv1alpha1.Subscription) bool { for _, cond := range s.Status.Conditions { switch cond.Type { @@ -1070,7 +1072,7 @@ var _ = Describe("Subscription", func() { return false } } - return subscriptionStateAtLatestChecker(s) + return checker(s) }) Expect(err).ToNot(HaveOccurred()) Expect(sub).ToNot(BeNil()) @@ -1333,7 +1335,7 @@ var _ = Describe("Subscription", func() { defer catsrcCleanup() // Ensure that the catalog source is resolved before we create a subscription. - _, err = fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("podconfig-sub-") @@ -1341,7 +1343,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subSpec) defer cleanupSubscription() - subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1392,7 +1394,7 @@ var _ = Describe("Subscription", func() { defer catsrcCleanup() // Ensure that the catalog source is resolved before we create a subscription. - _, err = fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("podconfig-sub-") @@ -1400,7 +1402,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subSpec) defer cleanupSubscription() - subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1424,7 +1426,7 @@ var _ = Describe("Subscription", func() { defer catsrcCleanup() // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create duplicates of the CatalogSource @@ -1433,7 +1435,7 @@ var _ = Describe("Subscription", func() { defer duplicateCatSrcCleanup() // Ensure that the catalog source is resolved before we create a subscription. - _, err = fetchCatalogSourceOnStatus(crClient, duplicateCatsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, duplicateCatsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) } @@ -1442,7 +1444,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subSpec) defer cleanupSubscription() - subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1557,9 +1559,9 @@ var _ = Describe("Subscription", func() { defer cleanup() By("waiting for catalogsources to be ready", func() { - _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) - _, err = fetchCatalogSourceOnStatus(crClient, catsrc2.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrc2.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) }) @@ -1575,7 +1577,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) defer cleanupSubscription() - subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -1649,11 +1651,11 @@ var _ = Describe("Subscription", func() { catsrcDepWrong, catsrcCleanup3 = createInternalCatalogSource(kubeClient, crClient, "catsrc2", generatedNamespace.GetName(), []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) - _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) }) @@ -1685,7 +1687,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription = createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) var err error - subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) @@ -1741,9 +1743,9 @@ var _ = Describe("Subscription", func() { csvsWrong, 100) // waiting for catalogsources to be ready - _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) }) @@ -1773,7 +1775,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription = createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) var err error - subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) @@ -1831,11 +1833,11 @@ var _ = Describe("Subscription", func() { []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) // waiting for catalogsources to be ready - _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) }) @@ -1867,7 +1869,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription = createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) var err error - subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) @@ -1925,11 +1927,11 @@ var _ = Describe("Subscription", func() { []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) // waiting for catalogsources to be ready - _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepRight.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) - _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), operatorNamespace, catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crClient, catsrcDepWrong.GetName(), operatorNamespace, catalogSourceRegistryPodSynced()) Expect(err).ToNot(HaveOccurred()) }) @@ -1961,7 +1963,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription = createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) var err error - subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + subscription, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) Expect(err).ToNot(HaveOccurred()) Expect(subscription).ToNot(BeNil()) @@ -2054,7 +2056,7 @@ var _ = Describe("Subscription", func() { defer cleanup() // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crClient, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionSpec := &operatorsv1alpha1.SubscriptionSpec{ @@ -2071,7 +2073,7 @@ var _ = Describe("Subscription", func() { cleanupSubscription := createSubscriptionForCatalogWithSpec(GinkgoT(), crClient, generatedNamespace.GetName(), subscriptionName, subscriptionSpec) defer cleanupSubscription() - subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker) + subscription, err := fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -2103,7 +2105,7 @@ var _ = Describe("Subscription", func() { } updateInternalCatalog(GinkgoT(), kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvNewA, csvA, csvB}, manifests) csvAsub := strings.Join([]string{packageName1, stableChannel, catalogSourceName, generatedNamespace.GetName()}, "-") - _, err = fetchSubscription(crClient, generatedNamespace.GetName(), csvAsub, subscriptionStateAtLatestChecker) + _, err = fetchSubscription(crClient, generatedNamespace.GetName(), csvAsub, subscriptionStateAtLatestChecker()) require.NoError(GinkgoT(), err) // Ensure csvNewA is not installed _, err = crClient.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Get(context.Background(), csvNewA.Name, metav1.GetOptions{}) @@ -2173,7 +2175,7 @@ var _ = Describe("Subscription", func() { _, teardown = createInternalCatalogSource(c, ctx.Ctx().OperatorClient(), catSrcName, generatedNamespace.GetName(), packages, nil, []operatorsv1alpha1.ClusterServiceVersion{csvA}) // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crc, catSrcName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + _, err := fetchCatalogSourceOnStatus(crc, catSrcName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) cleanup = createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subName, catSrcName, "packageA", "alpha", "", operatorsv1alpha1.ApprovalAutomatic) @@ -2367,7 +2369,7 @@ var _ = Describe("Subscription", func() { }() By("waiting for the CatalogSource to be ready") - catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced) + catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) By("generating a Subscription") @@ -2376,7 +2378,7 @@ var _ = Describe("Subscription", func() { defer cleanUpSubscriptionFn() By("waiting for the InstallPlan to get created for the subscription") - sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker) + sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) By("waiting for the expected InstallPlan's execution to either fail or succeed") @@ -2431,7 +2433,7 @@ var _ = Describe("Subscription", func() { createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subName, catalogSourceName, "packageA", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) By("waiting until the subscription has an IP reference") - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subName, subscriptionHasInstallPlanChecker) + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subName, subscriptionHasInstallPlanChecker()) Expect(err).Should(BeNil()) By("waiting for the v0.1.0 CSV to report a succeeded phase") @@ -2775,7 +2777,7 @@ func initCatalog(t GinkgoTInterface, namespace string, c operatorclient.ClientIn return err } - fetched, err := fetchCatalogSourceOnStatus(crc, dummyCatalogSource.GetName(), dummyCatalogSource.GetNamespace(), catalogSourceRegistryPodSynced) + fetched, err := fetchCatalogSourceOnStatus(crc, dummyCatalogSource.GetName(), dummyCatalogSource.GetNamespace(), catalogSourceRegistryPodSynced()) require.NoError(t, err) require.NotNil(t, fetched) @@ -2784,40 +2786,72 @@ func initCatalog(t GinkgoTInterface, namespace string, c operatorclient.ClientIn type subscriptionStateChecker func(subscription *operatorsv1alpha1.Subscription) bool -func subscriptionStateUpgradeAvailableChecker(subscription *operatorsv1alpha1.Subscription) bool { - return subscription.Status.State == operatorsv1alpha1.SubscriptionStateUpgradeAvailable +func subscriptionStateUpgradeAvailableChecker() func(subscription *operatorsv1alpha1.Subscription) bool { + var lastState operatorsv1alpha1.SubscriptionState + lastTime := time.Now() + return func(subscription *operatorsv1alpha1.Subscription) bool { + if subscription.Status.State != lastState { + ctx.Ctx().Logf("waiting %s for subscription %s/%s to have state %s: has state %s", time.Since(lastTime), subscription.Namespace, subscription.Name, operatorsv1alpha1.SubscriptionStateUpgradeAvailable, subscription.Status.State) + lastState = subscription.Status.State + lastTime = time.Now() + } + return subscription.Status.State == operatorsv1alpha1.SubscriptionStateUpgradeAvailable + } } -func subscriptionStateUpgradePendingChecker(subscription *operatorsv1alpha1.Subscription) bool { - return subscription.Status.State == operatorsv1alpha1.SubscriptionStateUpgradePending +func subscriptionStateUpgradePendingChecker() func(subscription *operatorsv1alpha1.Subscription) bool { + var lastState operatorsv1alpha1.SubscriptionState + lastTime := time.Now() + return func(subscription *operatorsv1alpha1.Subscription) bool { + if subscription.Status.State != lastState { + ctx.Ctx().Logf("waiting %s for subscription %s/%s to have state %s: has state %s", time.Since(lastTime), subscription.Namespace, subscription.Name, operatorsv1alpha1.SubscriptionStateUpgradePending, subscription.Status.State) + lastState = subscription.Status.State + lastTime = time.Now() + } + return subscription.Status.State == operatorsv1alpha1.SubscriptionStateUpgradePending + } } -func subscriptionStateAtLatestChecker(subscription *operatorsv1alpha1.Subscription) bool { - return subscription.Status.State == operatorsv1alpha1.SubscriptionStateAtLatest +func subscriptionStateAtLatestChecker() func(subscription *operatorsv1alpha1.Subscription) bool { + var lastState operatorsv1alpha1.SubscriptionState + lastTime := time.Now() + return func(subscription *operatorsv1alpha1.Subscription) bool { + if subscription.Status.State != lastState { + ctx.Ctx().Logf("waiting %s for subscription %s/%s to have state %s: has state %s", time.Since(lastTime), subscription.Namespace, subscription.Name, operatorsv1alpha1.SubscriptionStateAtLatest, subscription.Status.State) + lastState = subscription.Status.State + lastTime = time.Now() + } + return subscription.Status.State == operatorsv1alpha1.SubscriptionStateAtLatest + } } -func subscriptionHasInstallPlanChecker(subscription *operatorsv1alpha1.Subscription) bool { - ctx.Ctx().Logf("waiting for %s to have installplan ref", subscription.GetName()) - return subscription.Status.InstallPlanRef != nil +func subscriptionHasInstallPlanChecker() func(subscription *operatorsv1alpha1.Subscription) bool { + var lastState operatorsv1alpha1.SubscriptionState + lastTime := time.Now() + return func(subscription *operatorsv1alpha1.Subscription) bool { + if subscription.Status.State != lastState { + ctx.Ctx().Logf("waiting %s for subscription %s/%s to have installplan ref: has ref %#v", time.Since(lastTime), subscription.Namespace, subscription.Name, subscription.Status.InstallPlanRef) + lastState = subscription.Status.State + lastTime = time.Now() + } + return subscription.Status.InstallPlanRef != nil + } } func subscriptionHasInstallPlanDifferentChecker(currentInstallPlanName string) subscriptionStateChecker { + checker := subscriptionHasInstallPlanChecker() + var lastState operatorsv1alpha1.SubscriptionState + lastTime := time.Now() return func(subscription *operatorsv1alpha1.Subscription) bool { - return subscriptionHasInstallPlanChecker(subscription) && subscription.Status.InstallPlanRef.Name != currentInstallPlanName + if subscription.Status.State != lastState { + ctx.Ctx().Logf("waiting %s for subscription %s/%s to have installplan different from %s: has ref %#v", time.Since(lastTime), subscription.Namespace, subscription.Name, currentInstallPlanName, subscription.Status.InstallPlanRef) + lastState = subscription.Status.State + lastTime = time.Now() + } + return checker(subscription) && subscription.Status.InstallPlanRef.Name != currentInstallPlanName } } -func subscriptionStateNoneChecker(subscription *operatorsv1alpha1.Subscription) bool { - return subscription.Status.State == operatorsv1alpha1.SubscriptionStateNone -} - -func subscriptionStateAny(subscription *operatorsv1alpha1.Subscription) bool { - return subscriptionStateNoneChecker(subscription) || - subscriptionStateAtLatestChecker(subscription) || - subscriptionStateUpgradePendingChecker(subscription) || - subscriptionStateUpgradeAvailableChecker(subscription) -} - func subscriptionHasCurrentCSV(currentCSV string) subscriptionStateChecker { return func(subscription *operatorsv1alpha1.Subscription) bool { return subscription.Status.CurrentCSV == currentCSV @@ -2845,12 +2879,20 @@ func fetchSubscription(crc versioned.Interface, namespace, name string, checker ctx.Ctx().Logf("%s: %s", time.Now().Format("15:04:05.9999"), s) } + var lastState operatorsv1alpha1.SubscriptionState + var lastCSV string + var lastInstallPlanRef *corev1.ObjectReference + err = wait.Poll(pollInterval, pollDuration, func() (bool, error) { fetchedSubscription, err = crc.OperatorsV1alpha1().Subscriptions(namespace).Get(context.Background(), name, metav1.GetOptions{}) if err != nil || fetchedSubscription == nil { return false, err } - log(fmt.Sprintf("%s (%s): %s", fetchedSubscription.Status.State, fetchedSubscription.Status.CurrentCSV, fetchedSubscription.Status.InstallPlanRef)) + thisState, thisCSV, thisInstallPlanRef := fetchedSubscription.Status.State, fetchedSubscription.Status.CurrentCSV, fetchedSubscription.Status.InstallPlanRef + if thisState != lastState || thisCSV != lastCSV || equality.Semantic.DeepEqual(thisInstallPlanRef, lastInstallPlanRef) { + lastState, lastCSV, lastInstallPlanRef = thisState, thisCSV, thisInstallPlanRef + log(fmt.Sprintf("%s (%s): %s", thisState, thisCSV, thisInstallPlanRef)) + } return checker(fetchedSubscription), nil }) if err != nil { @@ -3093,7 +3135,7 @@ func checkDeploymentWithPodConfiguration(client operatorclient.ClientInterface, } func updateInternalCatalog(t GinkgoTInterface, c operatorclient.ClientInterface, crc versioned.Interface, catalogSourceName, namespace string, crds []apiextensions.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, packages []registry.PackageManifest) { - fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, namespace, catalogSourceRegistryPodSynced) + fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, namespace, catalogSourceRegistryPodSynced()) require.NoError(t, err) // Get initial configmap diff --git a/test/e2e/user_defined_sa_test.go b/test/e2e/user_defined_sa_test.go index b4a9806032..1e05304b9a 100644 --- a/test/e2e/user_defined_sa_test.go +++ b/test/e2e/user_defined_sa_test.go @@ -50,15 +50,15 @@ var _ = Describe("User defined service account", func() { It("with no permission", func() { - // Create a service account, but add no permission to it. + By("Create a service account, but add no permission to it.") saName := genName("scoped-sa-") _, cleanupSA := newServiceAccount(c, generatedNamespace.GetName(), saName) defer cleanupSA() - // Create token secret for the serviceaccount + By("Create token secret for the serviceaccount") _, cleanupSE := newTokenSecret(c, generatedNamespace.GetName(), saName) defer cleanupSE() - // Add an OperatorGroup and specify the service account. + By("Add an OperatorGroup and specify the service account.") ogName := genName("scoped-og-") _, cleanupOG := newOperatorGroupWithServiceAccount(crc, generatedNamespace.GetName(), ogName, saName) defer cleanupOG() @@ -67,20 +67,20 @@ var _ = Describe("User defined service account", func() { catsrc, subSpec, catsrcCleanup := newCatalogSource(GinkgoT(), c, crc, "scoped", generatedNamespace.GetName(), permissions) defer catsrcCleanup() - // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + By("Ensure that the catalog source is resolved before we create a subscription.") + _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("scoped-sub-") cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catsrc.GetName(), subSpec.Package, subSpec.Channel, subSpec.StartingCSV, subSpec.InstallPlanApproval) defer cleanupSubscription() - // Wait until an install plan is created. - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + By("Wait until an install plan is created.") + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) - // We expect the InstallPlan to be in status: Failed. + By("We expect the InstallPlan to be in status: Failed.") ipName := subscription.Status.Install.Name ipPhaseCheckerFunc := buildInstallPlanPhaseCheckFunc(v1alpha1.InstallPlanPhaseFailed) ipGot, err := fetchInstallPlanWithNamespace(GinkgoT(), crc, ipName, generatedNamespace.GetName(), ipPhaseCheckerFunc) @@ -91,29 +91,29 @@ var _ = Describe("User defined service account", func() { assert.Equal(GinkgoT(), v1alpha1.InstallPlanReasonComponentFailed, conditionGot.Reason) assert.Contains(GinkgoT(), conditionGot.Message, fmt.Sprintf("is forbidden: User \"system:serviceaccount:%s:%s\" cannot create resource", generatedNamespace.GetName(), saName)) - // Verify that all step resources are in Unknown state. + By("Verify that all step resources are in Unknown state.") for _, step := range ipGot.Status.Plan { assert.Equal(GinkgoT(), v1alpha1.StepStatusUnknown, step.Status) } }) It("with permission", func() { - // Create the CatalogSource + By("Create the CatalogSource") namespace := genName("scoped-ns-") _, cleanupNS := newNamespace(c, namespace) defer cleanupNS() - // Create a service account, add enough permission to it so that operator install is successful. + By("Create a service account, add enough permission to it so that operator install is successful.") saName := genName("scoped-sa") _, cleanupSA := newServiceAccount(c, generatedNamespace.GetName(), saName) defer cleanupSA() - // Create token secret for the serviceaccount + By("Create token secret for the serviceaccount") _, cleanupSE := newTokenSecret(c, generatedNamespace.GetName(), saName) defer cleanupSE() cleanupPerm := grantPermission(GinkgoT(), c, generatedNamespace.GetName(), saName) defer cleanupPerm() - // Add an OperatorGroup and specify the service account. + By("Add an OperatorGroup and specify the service account.") ogName := genName("scoped-og-") _, cleanupOG := newOperatorGroupWithServiceAccount(crc, generatedNamespace.GetName(), ogName, saName) defer cleanupOG() @@ -122,20 +122,20 @@ var _ = Describe("User defined service account", func() { catsrc, subSpec, catsrcCleanup := newCatalogSource(GinkgoT(), c, crc, "scoped", generatedNamespace.GetName(), permissions) defer catsrcCleanup() - // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + By("Ensure that the catalog source is resolved before we create a subscription.") + _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("scoped-sub-") cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catsrc.GetName(), subSpec.Package, subSpec.Channel, subSpec.StartingCSV, subSpec.InstallPlanApproval) defer cleanupSubscription() - // Wait until an install plan is created. - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + By("Wait until an install plan is created.") + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) - // We expect the InstallPlan to be in status: Complete. + By("We expect the InstallPlan to be in status: Complete.") ipName := subscription.Status.Install.Name ipPhaseCheckerFunc := buildInstallPlanPhaseCheckFunc(v1alpha1.InstallPlanPhaseComplete) ipGot, err := fetchInstallPlanWithNamespace(GinkgoT(), crc, ipName, generatedNamespace.GetName(), ipPhaseCheckerFunc) @@ -146,7 +146,7 @@ var _ = Describe("User defined service account", func() { assert.Equal(GinkgoT(), corev1.ConditionTrue, conditionGot.Status) assert.Equal(GinkgoT(), "", conditionGot.Message) - // Verify that all step resources are in Created state. + By("Verify that all step resources are in Created state.") for _, step := range ipGot.Status.Plan { // TODO: switch back to commented assertion once InstallPlan status is being patched instead of updated // assert.Equal(GinkgoT(), v1alpha1.StepStatusCreated, step.Status) @@ -155,15 +155,15 @@ var _ = Describe("User defined service account", func() { }) It("with retry", func() { - // Create a service account, but add no permission to it. + By("Create a service account, but add no permission to it.") saName := genName("scoped-sa-") _, cleanupSA := newServiceAccount(c, generatedNamespace.GetName(), saName) defer cleanupSA() - // Create token secret for the serviceaccount + By("Create token secret for the serviceaccount") _, cleanupSE := newTokenSecret(c, generatedNamespace.GetName(), saName) defer cleanupSE() - // Add an OperatorGroup and specify the service account. + By("Add an OperatorGroup and specify the service account.") ogName := genName("scoped-og-") _, cleanupOG := newOperatorGroupWithServiceAccount(crc, generatedNamespace.GetName(), ogName, saName) defer cleanupOG() @@ -172,27 +172,27 @@ var _ = Describe("User defined service account", func() { catsrc, subSpec, catsrcCleanup := newCatalogSource(GinkgoT(), c, crc, "scoped", generatedNamespace.GetName(), permissions) defer catsrcCleanup() - // Ensure that the catalog source is resolved before we create a subscription. - _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + By("Ensure that the catalog source is resolved before we create a subscription.") + _, err := fetchCatalogSourceOnStatus(crc, catsrc.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) subscriptionName := genName("scoped-sub-") cleanupSubscription := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, catsrc.GetName(), subSpec.Package, subSpec.Channel, subSpec.StartingCSV, subSpec.InstallPlanApproval) defer cleanupSubscription() - // Wait until an install plan is created. - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + By("Wait until an install plan is created.") + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker()) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) - // We expect the InstallPlan to be in status: Failed. + By("We expect the InstallPlan to be in status: Failed.") ipNameOld := subscription.Status.InstallPlanRef.Name ipPhaseCheckerFunc := buildInstallPlanPhaseCheckFunc(v1alpha1.InstallPlanPhaseFailed) ipGotOld, err := fetchInstallPlanWithNamespace(GinkgoT(), crc, ipNameOld, generatedNamespace.GetName(), ipPhaseCheckerFunc) require.NoError(GinkgoT(), err) require.Equal(GinkgoT(), v1alpha1.InstallPlanPhaseFailed, ipGotOld.Status.Phase) - // Grant permission now and this should trigger an retry of InstallPlan. + By("Grant permission now and this should trigger an retry of InstallPlan.") cleanupPerm := grantPermission(GinkgoT(), c, generatedNamespace.GetName(), saName) defer cleanupPerm() diff --git a/test/e2e/util.go b/test/e2e/util.go index 43570cc49b..04878b321b 100644 --- a/test/e2e/util.go +++ b/test/e2e/util.go @@ -337,19 +337,27 @@ func registryPodHealthy(address string) bool { return true } -func catalogSourceRegistryPodSynced(catalog *operatorsv1alpha1.CatalogSource) bool { - registry := catalog.Status.RegistryServiceStatus - connState := catalog.Status.GRPCConnectionState - if registry != nil && connState != nil && !connState.LastConnectTime.IsZero() && connState.LastObservedState == "READY" { - fmt.Printf("probing catalog %s pod with address %s\n", catalog.GetName(), registry.Address()) - return registryPodHealthy(registry.Address()) - } - state := "NO_CONNECTION" - if connState != nil { - state = connState.LastObservedState +func catalogSourceRegistryPodSynced() func(catalog *operatorsv1alpha1.CatalogSource) bool { + var lastState string + lastTime := time.Now() + return func(catalog *operatorsv1alpha1.CatalogSource) bool { + registry := catalog.Status.RegistryServiceStatus + connState := catalog.Status.GRPCConnectionState + state := "NO_CONNECTION" + if connState != nil { + state = connState.LastObservedState + } + if state != lastState { + fmt.Printf("waiting %s for catalog pod %s/%s to be available (for sync) - %s\n", time.Since(lastTime), catalog.GetNamespace(), catalog.GetName(), state) + lastState = state + lastTime = time.Now() + } + if registry != nil && connState != nil && !connState.LastConnectTime.IsZero() && connState.LastObservedState == "READY" { + fmt.Printf("probing catalog %s pod with address %s\n", catalog.GetName(), registry.Address()) + return registryPodHealthy(registry.Address()) + } + return false } - fmt.Printf("waiting for catalog pod %s/%s to be available (for sync) - %s\n", catalog.GetNamespace(), catalog.GetName(), state) - return false } func catalogSourceInvalidSpec(catalog *operatorsv1alpha1.CatalogSource) bool { @@ -363,7 +371,7 @@ func fetchCatalogSourceOnStatus(crc versioned.Interface, name, namespace string, err = wait.Poll(pollInterval, pollDuration, func() (bool, error) { fetched, err = crc.OperatorsV1alpha1().CatalogSources(namespace).Get(context.Background(), name, metav1.GetOptions{}) if err != nil || fetched == nil { - fmt.Println(err) + fmt.Printf("failed to fetch catalogSource %s/%s: %v\n", namespace, name, err) return false, err } return check(fetched), nil diff --git a/test/e2e/webhook_e2e_test.go b/test/e2e/webhook_e2e_test.go index df2793cdea..273b009a51 100644 --- a/test/e2e/webhook_e2e_test.go +++ b/test/e2e/webhook_e2e_test.go @@ -682,7 +682,7 @@ var _ = Describe("CSVs with a Webhook", func() { } // Wait for the CatalogSource to be ready - _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced) + _, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced()) require.NoError(GinkgoT(), err) // Create a Subscription for the webhook-operator