diff --git a/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go index a5de230eaa..35d7d95d7e 100644 --- a/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go @@ -14,6 +14,7 @@ import ( operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" k8serror "k8s.io/apimachinery/pkg/api/errors" "sigs.k8s.io/controller-runtime/pkg/client" @@ -22,7 +23,6 @@ import ( . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -89,7 +89,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { } crd := newCRD(genName("ins-")) - csv := newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv := newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) defer func() { Eventually(func() error { @@ -101,7 +101,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { }() catalogSourceName := genName("mock-ocs-") - _, cleanupSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv}) + _, cleanupSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv}) defer cleanupSource() // ensure the mock catalog exists and has been synced by the catalog operator @@ -143,8 +143,8 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { stableChannel := "stable" mainCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, nil) - replacementCSV := newCSV(mainPackageReplacement, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, nil) + replacementCSV := newCSV(mainPackageReplacement, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, nil) defer func() { Eventually(func() error { @@ -172,7 +172,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { } // Create the initial catalog source - cs, cleanup := createInternalCatalogSource(c, crc, mainCatalogName, globalCatalogNamespace, mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV}) + cs, cleanup := createInternalCatalogSource(c, crc, mainCatalogName, globalCatalogNamespace, mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV}) defer cleanup() // Attempt to get the catalog source before creating install plan @@ -225,7 +225,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { } // Update catalog configmap - updateInternalCatalog(GinkgoT(), c, crc, cs.GetName(), cs.GetNamespace(), []apiextensions.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, replacementCSV}, mainManifests) + updateInternalCatalog(GinkgoT(), c, crc, cs.GetName(), cs.GetNamespace(), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, replacementCSV}, mainManifests) // Get updated catalogsource fetchedUpdatedCatalog, err := fetchCatalogSourceOnStatus(crc, cs.GetName(), cs.GetNamespace(), catalogSourceRegistryPodSynced) @@ -252,8 +252,8 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { stableChannel := "stable" dependentCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) defer func() { Eventually(func() error { @@ -307,7 +307,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { Expect(initialPods.Items).To(HaveLen(1)) // Update catalog configmap - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}, append(mainManifests, dependentManifests...)) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}, append(mainManifests, dependentManifests...)) fetchedUpdatedCatalog, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), func(catalog *v1alpha1.CatalogSource) bool { before := fetchedInitialCatalog.Status.ConfigMapResource @@ -385,8 +385,8 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { stableChannel := "stable" dependentCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) defer func() { Eventually(func() error { @@ -442,7 +442,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { cleanupSource() // create a catalog with the same name - createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), append(mainManifests, dependentManifests...), []apiextensions.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}) + createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), append(mainManifests, dependentManifests...), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}) // Create Subscription subscriptionName := genName("sub-") @@ -478,9 +478,9 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { stableChannel := "stable" dependentCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - replacementCSV := newCSV(mainPackageReplacement, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + replacementCSV := newCSV(mainPackageReplacement, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) defer func() { Eventually(func() error { @@ -532,8 +532,8 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { } // Create ConfigMap CatalogSources - createInternalCatalogSource(c, crc, mainSourceName, generatedNamespace.GetName(), append(mainManifests, dependentManifests...), []apiextensions.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}) - createInternalCatalogSource(c, crc, replacementSourceName, generatedNamespace.GetName(), append(replacementManifests, dependentManifests...), []apiextensions.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{replacementCSV, mainCSV, dependentCSV}) + createInternalCatalogSource(c, crc, mainSourceName, generatedNamespace.GetName(), append(mainManifests, dependentManifests...), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{mainCSV, dependentCSV}) + createInternalCatalogSource(c, crc, replacementSourceName, generatedNamespace.GetName(), append(replacementManifests, dependentManifests...), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []v1alpha1.ClusterServiceVersion{replacementCSV, mainCSV, dependentCSV}) // Wait for ConfigMap CatalogSources to be ready mainSource, err := fetchCatalogSourceOnStatus(crc, mainSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) @@ -626,7 +626,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { stableChannel := "stable" sourceName := genName("catalog-") crd := newCRD(genName("ins-")) - csv := newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv := newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) manifests := []registry.PackageManifest{ { PackageName: packageName, @@ -646,7 +646,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() { }).Should(Succeed()) }() - _, cleanupSource := createInternalCatalogSource(c, crc, sourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv}) + _, cleanupSource := createInternalCatalogSource(c, crc, sourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv}) defer cleanupSource() // Wait for a new registry pod to be created diff --git a/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go index ac5526a729..d8dde335fa 100644 --- a/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go @@ -3,6 +3,8 @@ package e2e import ( "context" "fmt" + operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" "time" "github.com/blang/semver/v4" @@ -15,7 +17,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -31,7 +32,18 @@ var _ = Describe("CRD Versions", func() { BeforeEach(func() { c = ctx.Ctx().KubeClient() crc = ctx.Ctx().OperatorClient() - generatedNamespace = SetupGeneratedTestNamespace(genName("crd-e2e-")) + namespace := genName("crd-e2e-") + og := operatorsv1.OperatorGroup{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-operatorgroup", namespace), + Namespace: namespace, + Annotations: map[string]string{ + // Reduce the bundle unpack timeout to ensure error states are reached quickly + bundle.BundleUnpackTimeoutAnnotationKey: "5s", + }, + }, + } + generatedNamespace = SetupGeneratedTestNamespaceWithOperatorGroup(namespace, og) }) AfterEach(func() { @@ -39,7 +51,7 @@ var _ = Describe("CRD Versions", func() { }) // issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/2640 - XIt("[FLAKE] creates v1 CRDs with a v1 schema successfully", func() { + It("[FLAKE] creates v1 CRDs with a v1 schema successfully", func() { By("v1 crds with a valid openapiv3 schema should be created successfully by OLM") mainPackageName := genName("nginx-update2-") @@ -114,190 +126,14 @@ var _ = Describe("CRD Versions", func() { Expect(fetchedInstallPlan.Status.Phase).To(Equal(operatorsv1alpha1.InstallPlanPhaseComplete)) }) - // issue:https://github.com/operator-framework/operator-lifecycle-manager/issues/2638 - It("[FLAKE] blocks a CRD upgrade that could cause data loss", func() { - By("checking the storage versions in the existing CRD status and the spec of the new CRD") - - mainPackageName := genName("nginx-update2-") - mainPackageStable := fmt.Sprintf("%s-stable", mainPackageName) - stableChannel := "stable" - - crdPlural := genName("ins-") - crdName := crdPlural + ".cluster.com" - oldCRD := apiextensions.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{ - Name: crdName, - }, - Spec: apiextensions.CustomResourceDefinitionSpec{ - Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1alpha2", - Served: true, - Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "object", - Description: "my crd schema", - }, - }, - }, - { - Name: "v2alpha1", - Served: true, - Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "object", - Description: "my crd schema", - }, - }, - }, - }, - Names: apiextensions.CustomResourceDefinitionNames{ - Plural: crdPlural, - Singular: crdPlural, - Kind: crdPlural, - ListKind: "list" + crdPlural, - }, - Scope: apiextensions.NamespaceScoped, - }, - } - - alphaChannel := "alpha" - mainPackageAlpha := fmt.Sprintf("%s-alpha", mainPackageName) - newCRD := apiextensions.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{ - Name: crdName, - }, - Spec: apiextensions.CustomResourceDefinitionSpec{ - Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1alpha3", - Served: true, - Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "object", - Description: "my crd schema", - }, - }, - }, - { - Name: "v2alpha2", - Served: true, - Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "object", - Description: "my crd schema", - }, - }, - }, - }, - Names: apiextensions.CustomResourceDefinitionNames{ - Plural: crdPlural, - Singular: crdPlural, - Kind: crdPlural, - ListKind: "list" + crdPlural, - }, - Scope: apiextensions.NamespaceScoped, - }, - } - - oldCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{oldCRD}, nil, nil) - newCSV := newCSV(mainPackageAlpha, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.1.1"), []apiextensions.CustomResourceDefinition{newCRD}, nil, nil) - mainCatalogName := genName("mock-ocs-main-update2-") - mainManifests := []registry.PackageManifest{ - { - PackageName: mainPackageName, - Channels: []registry.PackageChannel{ - {Name: stableChannel, CurrentCSVName: mainPackageStable}, - {Name: alphaChannel, CurrentCSVName: mainPackageAlpha}, - }, - DefaultChannelName: stableChannel, - }, - } - - // Create the catalog sources - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{oldCRD, newCRD}, []operatorsv1alpha1.ClusterServiceVersion{oldCSV, newCSV}) - defer cleanupMainCatalogSource() - defer func() { - _ = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), oldCSV.GetName(), metav1.DeleteOptions{}) - _ = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), newCSV.GetName(), metav1.DeleteOptions{}) - _ = c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), oldCRD.GetName(), metav1.DeleteOptions{}) - _ = c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), newCRD.GetName(), metav1.DeleteOptions{}) - }() - - // Attempt to get the catalog source before creating install plan - _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) - Expect(err).ToNot(HaveOccurred()) - - subscriptionName := genName("sub-nginx-update2-") - subscriptionCleanup := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - defer subscriptionCleanup() - - subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) - Expect(err).ToNot(HaveOccurred()) - Expect(subscription).ToNot(BeNil()) - Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) - Expect(oldCSV.GetName()).To(Equal(subscription.Status.CurrentCSV)) - - installPlanName := subscription.Status.InstallPlanRef.Name - - // Wait for InstallPlan to be status: Complete before checking resource presence - fetchedInstallPlan, err := fetchInstallPlan(GinkgoT(), crc, installPlanName, generatedNamespace.GetName(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete)) - Expect(err).ToNot(HaveOccurred()) - GinkgoT().Logf("Install plan %s fetched with status %s", fetchedInstallPlan.GetName(), fetchedInstallPlan.Status.Phase) - Expect(fetchedInstallPlan.Status.Phase).To(Equal(operatorsv1alpha1.InstallPlanPhaseComplete)) - - // old CRD has been installed onto the cluster - now upgrade the subscription to point to the channel with the new CRD - // installing the new CSV should fail with a warning about data loss, since a storage version is missing in the new CRD - // use server-side apply to apply the update to the subscription point to the alpha channel - Eventually(Apply(subscription, func(s *operatorsv1alpha1.Subscription) error { - s.Spec.Channel = alphaChannel - return nil - })).Should(Succeed()) - ctx.Ctx().Logf("updated subscription to point to alpha channel") - - subscriptionAtLatestWithDifferentInstallPlan := func(v *operatorsv1alpha1.Subscription) bool { - return subscriptionStateAtLatestChecker(v) && v.Status.InstallPlanRef != nil && v.Status.InstallPlanRef.Name != fetchedInstallPlan.Name - } - - // Check the error on the installplan - should be related to data loss and the CRD upgrade missing a stored version - Eventually(func() (*operatorsv1alpha1.InstallPlan, error) { - s, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionAtLatestWithDifferentInstallPlan) - if err != nil || s.Status.InstallPlanRef == nil { - return nil, err - } - return crc.OperatorsV1alpha1().InstallPlans(generatedNamespace.GetName()).Get(context.TODO(), s.Status.InstallPlanRef.Name, metav1.GetOptions{}) - }).Should(And( - WithTransform( - func(v *operatorsv1alpha1.InstallPlan) operatorsv1alpha1.InstallPlanPhase { - return v.Status.Phase - }, - Equal(operatorsv1alpha1.InstallPlanPhaseFailed), - ), - WithTransform( - func(v *operatorsv1alpha1.InstallPlan) string { - return v.Status.Conditions[len(v.Status.Conditions)-1].Message - }, - ContainSubstring("risk of data loss"), - ), - )) - }) - - // Create a CRD on cluster with v1alpha1 (storage) - // Update that CRD with v1alpha2 (storage), v1alpha1 (served) - // Now the CRD should have two versions in status.storedVersions - // Now make a catalog with a CRD with just v1alpha2 (storage) - // That should fail because v1alpha1 is still in status.storedVersions - risk of data loss - // Update the CRD status to remove the v1alpha1 - // Now the installplan should succeed - - XIt("allows a CRD upgrade that doesn't cause data loss", func() { - By("manually editing the storage versions in the existing CRD status") + It("allows a CRD upgrade that doesn't cause data loss", func() { + By(`Create a CRD on cluster with v1alpha1 (storage)`) + By(`Update that CRD with v1alpha2 (storage), v1alpha1 (served)`) + By(`Now the CRD should have two versions in status.storedVersions`) + By(`Now make a catalog with a CRD with just v1alpha2 (storage)`) + By(`That should fail because v1alpha1 is still in status.storedVersions - risk of data loss`) + By(`Update the CRD status to remove the v1alpha1`) + By(`Now the installplan should succeed`) crdPlural := genName("ins-v1-") crdName := crdPlural + ".cluster.com" @@ -365,39 +201,39 @@ var _ = Describe("CRD Versions", func() { }).Should(BeNil()) // create CSV and catalog with just the catalog CRD - catalogCRD := apiextensions.CustomResourceDefinition{ + catalogCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: crdGroup, - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha2", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } mainPackageName := genName("nginx-update2-") mainPackageStable := fmt.Sprintf("%s-stable", mainPackageName) stableChannel := "stable" - catalogCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{catalogCRD}, nil, nil) + catalogCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{catalogCRD}, nil, nil) defer func() { _ = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), catalogCSV.GetName(), metav1.DeleteOptions{}) _ = c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), catalogCRD.GetName(), metav1.DeleteOptions{}) @@ -415,7 +251,7 @@ var _ = Describe("CRD Versions", func() { } // Create the catalog sources - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{catalogCRD}, []operatorsv1alpha1.ClusterServiceVersion{catalogCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{catalogCRD}, []operatorsv1alpha1.ClusterServiceVersion{catalogCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -457,8 +293,9 @@ var _ = Describe("CRD Versions", func() { // remove old subscription err = crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Delete(context.TODO(), subscription.GetName(), metav1.DeleteOptions{}) Expect(err).ToNot(HaveOccurred(), "error deleting old subscription") - // remove old csv - crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), mainPackageStable, metav1.DeleteOptions{}) + + By("remove old csv") + err = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), mainPackageStable, metav1.DeleteOptions{}) Expect(err).ToNot(HaveOccurred(), "error deleting old subscription") // recreate subscription @@ -490,4 +327,181 @@ var _ = Describe("CRD Versions", func() { }).Should(BeTrue()) GinkgoT().Log("manually reconciled potentially unsafe CRD upgrade") }) + + It("blocks a CRD upgrade that could cause data loss", func() { + By("checking the storage versions in the existing CRD status and the spec of the new CRD") + + mainPackageName := genName("nginx-update2-") + mainPackageStable := fmt.Sprintf("%s-stable", mainPackageName) + stableChannel := "stable" + + crdPlural := genName("ins-") + crdName := crdPlural + ".cluster.com" + oldCRD := apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: crdName, + }, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "cluster.com", + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1alpha2", + Served: true, + Storage: true, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + Type: "object", + Description: "my crd schema", + }, + }, + }, + { + Name: "v2alpha1", + Served: true, + Storage: false, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + Type: "object", + Description: "my crd schema", + }, + }, + }, + }, + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Plural: crdPlural, + Singular: crdPlural, + Kind: crdPlural, + ListKind: "list" + crdPlural, + }, + Scope: apiextensionsv1.NamespaceScoped, + }, + } + + alphaChannel := "alpha" + mainPackageAlpha := fmt.Sprintf("%s-alpha", mainPackageName) + newCRD := apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: crdName, + }, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "cluster.com", + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1alpha3", + Served: true, + Storage: true, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + Type: "object", + Description: "my crd schema", + }, + }, + }, + { + Name: "v2alpha2", + Served: true, + Storage: false, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + Type: "object", + Description: "my crd schema", + }, + }, + }, + }, + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Plural: crdPlural, + Singular: crdPlural, + Kind: crdPlural, + ListKind: "list" + crdPlural, + }, + Scope: apiextensionsv1.NamespaceScoped, + }, + } + + oldCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{oldCRD}, nil, nil) + newCSV := newCSV(mainPackageAlpha, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.1.1"), []apiextensionsv1.CustomResourceDefinition{newCRD}, nil, nil) + mainCatalogName := genName("mock-ocs-main-update2-") + mainManifests := []registry.PackageManifest{ + { + PackageName: mainPackageName, + Channels: []registry.PackageChannel{ + {Name: stableChannel, CurrentCSVName: mainPackageStable}, + {Name: alphaChannel, CurrentCSVName: mainPackageAlpha}, + }, + DefaultChannelName: stableChannel, + }, + } + + By("Create the catalog sources") + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{oldCRD, newCRD}, []operatorsv1alpha1.ClusterServiceVersion{oldCSV, newCSV}) + defer cleanupMainCatalogSource() + defer func() { + _ = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), oldCSV.GetName(), metav1.DeleteOptions{}) + _ = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.TODO(), newCSV.GetName(), metav1.DeleteOptions{}) + _ = c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), oldCRD.GetName(), metav1.DeleteOptions{}) + _ = c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), newCRD.GetName(), metav1.DeleteOptions{}) + }() + + By("Attempt to get the catalog source before creating install plan") + _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) + Expect(err).ToNot(HaveOccurred()) + + subscriptionName := genName("sub-nginx-update2-") + subscriptionCleanup := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) + defer subscriptionCleanup() + + subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) + Expect(err).ToNot(HaveOccurred()) + Expect(subscription).ToNot(BeNil()) + Expect(subscription.Status.InstallPlanRef).ToNot(Equal(nil)) + Expect(oldCSV.GetName()).To(Equal(subscription.Status.CurrentCSV)) + + installPlanName := subscription.Status.InstallPlanRef.Name + + By("Wait for InstallPlan to be status: Complete before checking resource presence") + fetchedInstallPlan, err := fetchInstallPlan(GinkgoT(), crc, installPlanName, generatedNamespace.GetName(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete)) + Expect(err).ToNot(HaveOccurred()) + GinkgoT().Logf("Install plan %s fetched with status %s", fetchedInstallPlan.GetName(), fetchedInstallPlan.Status.Phase) + Expect(fetchedInstallPlan.Status.Phase).To(Equal(operatorsv1alpha1.InstallPlanPhaseComplete)) + + By("old CRD has been installed onto the cluster - now upgrade the subscription to point to the channel with the new CRD") + By("installing the new CSV should fail with a warning about data loss, since a storage version is missing in the new CRD") + By("use server-side apply to apply the update to the subscription point to the alpha channel") + Eventually(Apply(subscription, func(s *operatorsv1alpha1.Subscription) error { + s.Spec.Channel = alphaChannel + return nil + })).Should(Succeed()) + ctx.Ctx().Logf("updated subscription to point to alpha channel") + + checker := subscriptionStateAtLatestChecker + subscriptionAtLatestWithDifferentInstallPlan := func(v *operatorsv1alpha1.Subscription) bool { + return checker(v) && v.Status.InstallPlanRef != nil && v.Status.InstallPlanRef.Name != fetchedInstallPlan.Name + } + + By("fetch new subscription") + s, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionAtLatestWithDifferentInstallPlan) + Expect(err).ToNot(HaveOccurred()) + Expect(s).ToNot(BeNil()) + Expect(s.Status.InstallPlanRef).ToNot(Equal(nil)) + + By("Check the error on the installplan - should be related to data loss and the CRD upgrade missing a stored version") + Eventually(func() (*operatorsv1alpha1.InstallPlan, error) { + return crc.OperatorsV1alpha1().InstallPlans(generatedNamespace.GetName()).Get(context.TODO(), s.Status.InstallPlanRef.Name, metav1.GetOptions{}) + // the install plan retry time out is 60 seconds, so we should expect the install plan to be failed within 2 minutes + }, "2m").Should(And( + WithTransform( + func(v *operatorsv1alpha1.InstallPlan) operatorsv1alpha1.InstallPlanPhase { + return v.Status.Phase + }, + Equal(operatorsv1alpha1.InstallPlanPhaseFailed), + ), + WithTransform( + func(v *operatorsv1alpha1.InstallPlan) string { + return v.Status.Conditions[len(v.Status.Conditions)-1].Message + }, + ContainSubstring("risk of data loss"), + ), + )) + }) }) diff --git a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go index 2b0ffcab01..ca7e21234e 100644 --- a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go @@ -16,13 +16,11 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" k8slabels "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" @@ -891,32 +889,32 @@ var _ = Describe("ClusterServiceVersion", func() { } // Create dependency first (CRD) - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -1230,32 +1228,32 @@ var _ = Describe("ClusterServiceVersion", func() { _, err = c.CreateServiceAccount(&sa) Expect(err).ShouldNot(HaveOccurred(), "could not create ServiceAccount %#v", sa) - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } crd.SetOwnerReferences([]metav1.OwnerReference{{ @@ -2376,32 +2374,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) @@ -2567,32 +2565,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins2") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -2756,32 +2754,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins3") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -2945,32 +2943,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) @@ -3105,19 +3103,19 @@ var _ = Describe("ClusterServiceVersion", func() { // Create initial CRD which has 2 versions: v1alpha1 & v1alpha2 crdPlural := genName("ins4") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -3127,21 +3125,21 @@ var _ = Describe("ClusterServiceVersion", func() { Name: "v1alpha2", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -3394,32 +3392,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins2") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -3558,32 +3556,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create dependency first (CRD) crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) defer cleanupCRD() @@ -3671,13 +3669,6 @@ var _ = Describe("ClusterServiceVersion", func() { }, } - // Fetch the current csv - fetchedCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csv.Name, csvSucceededChecker) - Expect(err).ShouldNot(HaveOccurred()) - - // Update csv with modified deployment spec - fetchedCSV.Spec.InstallStrategy.StrategySpec = strategyNew - Eventually(func() error { // Fetch the current csv fetchedCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csv.Name, csvSucceededChecker) @@ -3794,32 +3785,32 @@ var _ = Describe("ClusterServiceVersion", func() { // Create CRD crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - cleanupCRD, err := createCRD(c, apiextensions.CustomResourceDefinition{ + cleanupCRD, err := createCRD(c, apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, }) Expect(err).ShouldNot(HaveOccurred()) @@ -4285,39 +4276,8 @@ func buildAPIServiceCleanupFunc(c operatorclient.ClientInterface, apiServiceName } } -func createCRD(c operatorclient.ClientInterface, crd apiextensions.CustomResourceDefinition) (cleanupFunc, error) { - out := &apiextensionsv1.CustomResourceDefinition{} - scheme := runtime.NewScheme() - if err := apiextensions.AddToScheme(scheme); err != nil { - return nil, err - } - if err := apiextensionsv1.AddToScheme(scheme); err != nil { - return nil, err - } - if err := scheme.Convert(&crd, out, nil); err != nil { - return nil, err - } - _, err := c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Create(context.TODO(), out, metav1.CreateOptions{}) - if err != nil { - return nil, err - } - - return buildCRDCleanupFunc(c, crd.GetName()), nil -} - -func createV1CRD(c operatorclient.ClientInterface, crd apiextensionsv1.CustomResourceDefinition) (cleanupFunc, error) { - out := &apiextensionsv1.CustomResourceDefinition{} - scheme := runtime.NewScheme() - if err := apiextensions.AddToScheme(scheme); err != nil { - return nil, err - } - if err := apiextensionsv1.AddToScheme(scheme); err != nil { - return nil, err - } - if err := scheme.Convert(&crd, out, nil); err != nil { - return nil, err - } - _, err := c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Create(context.TODO(), out, metav1.CreateOptions{}) +func createCRD(c operatorclient.ClientInterface, crd apiextensionsv1.CustomResourceDefinition) (cleanupFunc, error) { + _, err := c.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Create(context.TODO(), &crd, metav1.CreateOptions{}) if err != nil { return nil, err } @@ -4440,23 +4400,34 @@ var csvAnyChecker = buildCSVConditionChecker(operatorsv1alpha1.CSVPhasePending, var csvCopiedChecker = buildCSVReasonChecker(operatorsv1alpha1.CSVReasonCopied) func fetchCSV(c versioned.Interface, namespace, name string, checker csvConditionChecker) (*operatorsv1alpha1.ClusterServiceVersion, error) { - var fetchedCSV *operatorsv1alpha1.ClusterServiceVersion + var lastPhase operatorsv1alpha1.ClusterServiceVersionPhase + var lastReason operatorsv1alpha1.ConditionReason + var lastMessage string + lastTime := time.Now() + var csv *operatorsv1alpha1.ClusterServiceVersion + ctx.Ctx().Logf("waiting for CSV %s/%s to reach condition", namespace, name) err := wait.Poll(pollInterval, pollDuration, func() (bool, error) { var err error - fetchedCSV, err = c.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + csv, err = c.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { ctx.Ctx().Logf("error getting csv %s/%s: %v", namespace, name, err) return false, nil } - ctx.Ctx().Logf("%s (%s): %s", fetchedCSV.Status.Phase, fetchedCSV.Status.Reason, fetchedCSV.Status.Message) - return checker(fetchedCSV), nil + 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 - %s (%s): %s", time.Since(lastTime), namespace, name, phase, reason, message) + lastPhase, lastReason, lastMessage = phase, reason, message + lastTime = time.Now() + } + return checker(csv), nil }) - if err != nil { - ctx.Ctx().Logf("never got correct status: %#v", fetchedCSV.Status) + // Only want to return `csv` if there was no (timeout) error + if err == nil { + return csv, nil } - return fetchedCSV, err + return nil, err } func waitForDeployment(namespace, name string, c operatorclient.ClientInterface) (*appsv1.Deployment, error) { @@ -4534,6 +4505,18 @@ func waitForCsvToDelete(namespace, name string, c versioned.Interface) error { return err } +func csvExists(namespace string, c versioned.Interface, name string) bool { + fetched, err := c.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + return false + } + ctx.Ctx().Logf("%s (%s): %s", fetched.Status.Phase, fetched.Status.Reason, fetched.Status.Message) + if err != nil { + return true + } + return true +} + func deleteLegacyAPIResources(namespace string, desc operatorsv1alpha1.APIServiceDescription, c operatorclient.ClientInterface) { apiServiceName := fmt.Sprintf("%s.%s", desc.Version, desc.Group) diff --git a/staging/operator-lifecycle-manager/test/e2e/ctx/ctx.go b/staging/operator-lifecycle-manager/test/e2e/ctx/ctx.go index f54401cede..cc2af75499 100644 --- a/staging/operator-lifecycle-manager/test/e2e/ctx/ctx.go +++ b/staging/operator-lifecycle-manager/test/e2e/ctx/ctx.go @@ -8,7 +8,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/test/e2e/util" appsv1 "k8s.io/api/apps/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -186,7 +185,7 @@ func setDerivedFields(ctx *TestContext) error { ctx.scheme = runtime.NewScheme() localSchemeBuilder := runtime.NewSchemeBuilder( - apiextensions.AddToScheme, + apiextensionsv1.AddToScheme, kscheme.AddToScheme, operatorsv1alpha1.AddToScheme, operatorsv1.AddToScheme, diff --git a/staging/operator-lifecycle-manager/test/e2e/downstream_csv_namespace_labeler_plugin_test.go b/staging/operator-lifecycle-manager/test/e2e/downstream_csv_namespace_labeler_plugin_test.go index 056a1698e1..fc7c28a228 100644 --- a/staging/operator-lifecycle-manager/test/e2e/downstream_csv_namespace_labeler_plugin_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/downstream_csv_namespace_labeler_plugin_test.go @@ -2,6 +2,7 @@ package e2e import ( "context" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "github.com/blang/semver/v4" . "github.com/onsi/ginkgo/v2" @@ -12,7 +13,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx" "github.com/operator-framework/operator-lifecycle-manager/test/e2e/util" v1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" k8scontrollerclient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -105,6 +105,6 @@ var _ = Describe("CSV Namespace Labeler Plugin", func() { func newCsv(namespace string) *v1alpha1.ClusterServiceVersion { crd := newCRD(genName("ins-")) - csv := newCSV(genName("package-"), namespace, "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv := newCSV(genName("package-"), namespace, "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) return &csv } diff --git a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go index 5aeeeb110a..aab56d4b81 100644 --- a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "encoding/json" - "errors" "fmt" "path/filepath" "strconv" @@ -22,7 +21,6 @@ import ( authorizationv1 "k8s.io/api/authorization/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -32,7 +30,6 @@ import ( k8sjson "k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" @@ -693,8 +690,8 @@ var _ = Describe("Install Plan", func() { stableChannel := "stable" dependentCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) defer func() { require.NoError(GinkgoT(), crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).DeleteCollection(context.Background(), metav1.DeleteOptions{}, metav1.ListOptions{})) @@ -733,7 +730,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog sources require.NotEqual(GinkgoT(), "", generatedNamespace.GetName()) - _, cleanupDependentCatalogSource := createInternalCatalogSource(c, crc, dependentCatalogName, generatedNamespace.GetName(), dependentManifests, []apiextensions.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV}) + _, cleanupDependentCatalogSource := createInternalCatalogSource(c, crc, dependentCatalogName, generatedNamespace.GetName(), dependentManifests, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV}) defer cleanupDependentCatalogSource() // Attempt to get the catalog source before creating install plan @@ -818,7 +815,7 @@ var _ = Describe("Install Plan", func() { require.NoError(GinkgoT(), err) // Update dependent subscription in catalog and wait for csv to update - updatedDependentCSV := newCSV(dependentPackageStable+"-v2", generatedNamespace.GetName(), dependentPackageStable, semver.MustParse("0.1.1"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + updatedDependentCSV := newCSV(dependentPackageStable+"-v2", generatedNamespace.GetName(), dependentPackageStable, semver.MustParse("0.1.1"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) dependentManifests = []registry.PackageManifest{ { PackageName: dependentPackageName, @@ -829,7 +826,7 @@ var _ = Describe("Install Plan", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, dependentCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV, updatedDependentCSV}, dependentManifests) + updateInternalCatalog(GinkgoT(), c, crc, dependentCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV, updatedDependentCSV}, dependentManifests) // Wait for subscription to update updatedDepSubscription, err := fetchSubscription(crc, generatedNamespace.GetName(), strings.Join([]string{dependentPackageStable, dependentCatalogName, generatedNamespace.GetName()}, "-"), subscriptionHasCurrentCSV(updatedDependentCSV.GetName())) @@ -885,10 +882,10 @@ var _ = Describe("Install Plan", func() { dependentCRD := newCRD(genName("ins-")) // Create new CSVs - mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{mainCRD}, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{mainCRD}, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentStableCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) - dependentBetaCSV := newCSV(dependentPackageBeta, generatedNamespace.GetName(), dependentPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentStableCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) + dependentBetaCSV := newCSV(dependentPackageBeta, generatedNamespace.GetName(), dependentPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) // Defer CRD clean up defer func() { @@ -906,7 +903,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog source mainCatalogSourceName := genName("mock-ocs-main-" + strings.ToLower(K8sSafeCurrentTestDescription()) + "-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{dependentCRD, mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentBetaCSV, dependentStableCSV, mainStableCSV, mainBetaCSV}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{dependentCRD, mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentBetaCSV, dependentStableCSV, mainStableCSV, mainBetaCSV}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) @@ -982,9 +979,9 @@ var _ = Describe("Install Plan", func() { type schemaPayload struct { name string expectedPhase operatorsv1alpha1.InstallPlanPhase - oldCRD *apiextensions.CustomResourceDefinition - intermediateCRD *apiextensions.CustomResourceDefinition - newCRD *apiextensions.CustomResourceDefinition + oldCRD *apiextensionsv1.CustomResourceDefinition + intermediateCRD *apiextensionsv1.CustomResourceDefinition + newCRD *apiextensionsv1.CustomResourceDefinition } var min float64 = 2 @@ -998,21 +995,21 @@ var _ = Describe("Install Plan", func() { Entry("all existing versions are present, different (backwards compatible) schema", schemaPayload{ name: "all existing versions are present, different (backwards compatible) schema", expectedPhase: operatorsv1alpha1.InstallPlanPhaseComplete, - oldCRD: func() *apiextensions.CustomResourceDefinition { + oldCRD: func() *apiextensionsv1.CustomResourceDefinition { oldCRD := newCRD(mainCRDPlural + "a") - oldCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + oldCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1028,21 +1025,21 @@ var _ = Describe("Install Plan", func() { } return &oldCRD }(), - newCRD: func() *apiextensions.CustomResourceDefinition { + newCRD: func() *apiextensionsv1.CustomResourceDefinition { newCRD := newCRD(mainCRDPlural + "a") - newCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + newCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1059,14 +1056,14 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha2", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1085,21 +1082,21 @@ var _ = Describe("Install Plan", func() { }), Entry("all existing versions are present, different (backwards incompatible) schema", schemaPayload{name: "all existing versions are present, different (backwards incompatible) schema", expectedPhase: operatorsv1alpha1.InstallPlanPhaseFailed, - oldCRD: func() *apiextensions.CustomResourceDefinition { + oldCRD: func() *apiextensionsv1.CustomResourceDefinition { oldCRD := newCRD(mainCRDPlural + "b") - oldCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + oldCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1113,21 +1110,21 @@ var _ = Describe("Install Plan", func() { } return &oldCRD }(), - newCRD: func() *apiextensions.CustomResourceDefinition { + newCRD: func() *apiextensionsv1.CustomResourceDefinition { newCRD := newCRD(mainCRDPlural + "b") - newCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + newCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1146,15 +1143,15 @@ var _ = Describe("Install Plan", func() { }), Entry("missing existing versions in new CRD", schemaPayload{name: "missing existing versions in new CRD", expectedPhase: operatorsv1alpha1.InstallPlanPhaseComplete, - oldCRD: func() *apiextensions.CustomResourceDefinition { + oldCRD: func() *apiextensionsv1.CustomResourceDefinition { oldCRD := newCRD(mainCRDPlural + "c") - oldCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + oldCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1164,8 +1161,8 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha2", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1174,21 +1171,21 @@ var _ = Describe("Install Plan", func() { } return &oldCRD }(), - newCRD: func() *apiextensions.CustomResourceDefinition { + newCRD: func() *apiextensionsv1.CustomResourceDefinition { newCRD := newCRD(mainCRDPlural + "c") - newCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + newCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1205,14 +1202,14 @@ var _ = Describe("Install Plan", func() { Name: "v1", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1230,25 +1227,25 @@ var _ = Describe("Install Plan", func() { }()}), Entry("existing version is present in new CRD (deprecated field)", schemaPayload{name: "existing version is present in new CRD (deprecated field)", expectedPhase: operatorsv1alpha1.InstallPlanPhaseComplete, - oldCRD: func() *apiextensions.CustomResourceDefinition { + oldCRD: func() *apiextensionsv1.CustomResourceDefinition { oldCRD := newCRD(mainCRDPlural + "d") return &oldCRD }(), - newCRD: func() *apiextensions.CustomResourceDefinition { + newCRD: func() *apiextensionsv1.CustomResourceDefinition { newCRD := newCRD(mainCRDPlural + "d") - newCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + newCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -1265,8 +1262,8 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha3", Served: false, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{Type: "object"}, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{Type: "object"}, }, }, } @@ -1296,8 +1293,8 @@ var _ = Describe("Install Plan", func() { } // Create new CSVs - mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{*tt.oldCRD}, nil, nil) - mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{*tt.oldCRD}, nil, nil) + mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{*tt.oldCRD}, nil, nil) + mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{*tt.oldCRD}, nil, nil) // Defer CRD clean up defer func() { @@ -1331,7 +1328,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog source mainCatalogSourceName := genName("mock-ocs-main-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{*tt.oldCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{*tt.oldCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) @@ -1383,7 +1380,7 @@ var _ = Describe("Install Plan", func() { require.NoError(GinkgoT(), err) defer cleanupCR() - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) @@ -1432,9 +1429,9 @@ var _ = Describe("Install Plan", func() { type schemaPayload struct { name string expectedPhase operatorsv1alpha1.InstallPlanPhase - oldCRD *apiextensions.CustomResourceDefinition - intermediateCRD *apiextensions.CustomResourceDefinition - newCRD *apiextensions.CustomResourceDefinition + oldCRD *apiextensionsv1.CustomResourceDefinition + intermediateCRD *apiextensionsv1.CustomResourceDefinition + newCRD *apiextensionsv1.CustomResourceDefinition } // excluded: new CRD, same version, same schema - won't trigger a CRD update @@ -1443,15 +1440,15 @@ var _ = Describe("Install Plan", func() { Entry("upgrade CRD with deprecated version", schemaPayload{ name: "upgrade CRD with deprecated version", expectedPhase: operatorsv1alpha1.InstallPlanPhaseComplete, - oldCRD: func() *apiextensions.CustomResourceDefinition { + oldCRD: func() *apiextensionsv1.CustomResourceDefinition { oldCRD := newCRD(mainCRDPlural) - oldCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + oldCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1460,15 +1457,15 @@ var _ = Describe("Install Plan", func() { } return &oldCRD }(), - intermediateCRD: func() *apiextensions.CustomResourceDefinition { + intermediateCRD: func() *apiextensionsv1.CustomResourceDefinition { intermediateCRD := newCRD(mainCRDPlural) - intermediateCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + intermediateCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha2", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1478,8 +1475,8 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha1", Served: false, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1488,15 +1485,15 @@ var _ = Describe("Install Plan", func() { } return &intermediateCRD }(), - newCRD: func() *apiextensions.CustomResourceDefinition { + newCRD: func() *apiextensionsv1.CustomResourceDefinition { newCRD := newCRD(mainCRDPlural) - newCRD.Spec.Versions = []apiextensions.CustomResourceDefinitionVersion{ + newCRD.Spec.Versions = []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha2", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1506,8 +1503,8 @@ var _ = Describe("Install Plan", func() { Name: "v1beta1", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1517,8 +1514,8 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha1", Served: false, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -1551,9 +1548,9 @@ var _ = Describe("Install Plan", func() { } // Create new CSVs - mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{*tt.oldCRD}, nil, nil) - mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{*tt.intermediateCRD}, nil, nil) - mainDeltaCSV := newCSV(mainPackageDelta, generatedNamespace.GetName(), mainPackageBeta, semver.MustParse("0.3.0"), []apiextensions.CustomResourceDefinition{*tt.newCRD}, nil, nil) + mainStableCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{*tt.oldCRD}, nil, nil) + mainBetaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{*tt.intermediateCRD}, nil, nil) + mainDeltaCSV := newCSV(mainPackageDelta, generatedNamespace.GetName(), mainPackageBeta, semver.MustParse("0.3.0"), []apiextensionsv1.CustomResourceDefinition{*tt.newCRD}, nil, nil) // Defer CRD clean up defer func() { @@ -1579,7 +1576,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog source mainCatalogSourceName := genName("mock-ocs-main-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{*tt.oldCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{*tt.oldCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan(s) @@ -1622,7 +1619,7 @@ var _ = Describe("Install Plan", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{*tt.intermediateCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{*tt.intermediateCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) require.NoError(GinkgoT(), err) @@ -1662,7 +1659,7 @@ var _ = Describe("Install Plan", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV, mainDeltaCSV}, mainManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{*tt.newCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainStableCSV, mainBetaCSV, mainDeltaCSV}, mainManifests) // Attempt to get the catalog source before creating install plan(s) _, err = fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) require.NoError(GinkgoT(), err) @@ -1716,32 +1713,32 @@ var _ = Describe("Install Plan", func() { stableChannel := "stable" crdPlural := genName("ins-amplify-") crdName := crdPlural + ".cluster.com" - mainCRD := apiextensions.CustomResourceDefinition{ + mainCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -1794,7 +1791,7 @@ var _ = Describe("Install Plan", func() { }).Should(Succeed()) }() - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -1861,7 +1858,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog sources updatedNamedStrategy := newNginxInstallStrategy(genName("dep-"), updatedPermissions, updatedClusterPermissions) - updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &updatedNamedStrategy) + updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &updatedNamedStrategy) updatedManifests := []registry.PackageManifest{ { PackageName: mainPackageName, @@ -1873,7 +1870,7 @@ var _ = Describe("Install Plan", func() { } // Update catalog with updated CSV with more permissions - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) _, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(fetchedInstallPlan.GetName())) require.NoError(GinkgoT(), err) @@ -1903,32 +1900,32 @@ var _ = Describe("Install Plan", func() { stableChannel := "stable" crdPlural := genName("ins-attenuate-") crdName := crdPlural + ".cluster.com" - mainCRD := apiextensions.CustomResourceDefinition{ + mainCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -1992,7 +1989,7 @@ var _ = Describe("Install Plan", func() { }).Should(Succeed()) }() - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -2052,7 +2049,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog sources updatedNamedStrategy := newNginxInstallStrategy(genName("dep-"), updatedPermissions, updatedClusterPermissions) - updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &updatedNamedStrategy) + updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &updatedNamedStrategy) updatedManifests := []registry.PackageManifest{ { PackageName: mainPackageName, @@ -2064,7 +2061,7 @@ var _ = Describe("Install Plan", func() { } // Update catalog with updated CSV with more permissions - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) // Wait for subscription to update its status _, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(fetchedInstallPlan.GetName())) @@ -2128,32 +2125,32 @@ var _ = Describe("Install Plan", func() { stableChannel := "stable" crdPlural := genName("ins-amplify-") crdName := crdPlural + ".cluster.com" - mainCRD := apiextensions.CustomResourceDefinition{ + mainCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -2208,7 +2205,7 @@ var _ = Describe("Install Plan", func() { }).Should(Succeed()) }() - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -2298,7 +2295,7 @@ var _ = Describe("Install Plan", func() { // Create the catalog sources // Updated csv has the same deployment strategy as main - updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &mainNamedStrategy) + updatedCSV := newCSV(mainPackageStable+"-next", generatedNamespace.GetName(), mainCSV.GetName(), semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &mainNamedStrategy) updatedManifests := []registry.PackageManifest{ { PackageName: mainPackageName, @@ -2310,7 +2307,7 @@ var _ = Describe("Install Plan", func() { } // Update catalog with updated CSV with more permissions - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, updatedCSV}, updatedManifests) _, err = fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(fetchedInstallPlan.GetName())) require.NoError(GinkgoT(), err) @@ -2348,48 +2345,48 @@ var _ = Describe("Install Plan", func() { crdPlural := genName("ins-update-") crdName := crdPlural + ".cluster.com" - mainCRD := apiextensions.CustomResourceDefinition{ + mainCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } - updatedCRD := apiextensions.CustomResourceDefinition{ + updatedCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -2399,26 +2396,26 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha2", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, nil) - betaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{updatedCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, nil) + betaCSV := newCSV(mainPackageBeta, generatedNamespace.GetName(), mainPackageStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{updatedCRD}, nil, nil) // Defer CRD clean up defer func() { @@ -2448,7 +2445,7 @@ var _ = Describe("Install Plan", func() { } // Create the catalog sources - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -2493,7 +2490,7 @@ var _ = Describe("Install Plan", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{updatedCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, betaCSV}, mainManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{updatedCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV, betaCSV}, mainManifests) // Wait for subscription to update updatedSubscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(fetchedInstallPlan.GetName())) require.NoError(GinkgoT(), err) @@ -2547,48 +2544,48 @@ var _ = Describe("Install Plan", func() { crdPlural := genName("ins-update2-") crdName := crdPlural + ".cluster.com" - mainCRD := apiextensions.CustomResourceDefinition{ + mainCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } - updatedCRD := apiextensions.CustomResourceDefinition{ + updatedCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -2598,21 +2595,21 @@ var _ = Describe("Install Plan", func() { Name: "v1alpha2", Served: true, Storage: false, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -2647,7 +2644,7 @@ var _ = Describe("Install Plan", func() { } // Create the catalog sources - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{updatedCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{updatedCRD}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating install plan @@ -2781,7 +2778,7 @@ var _ = Describe("Install Plan", func() { namedStrategy := newNginxInstallStrategy(genName("dep-"), permissions, clusterPermissions) // Create new CSVs - stableCSV := newCSV(stableCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &namedStrategy) + stableCSV := newCSV(stableCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &namedStrategy) defer func() { require.NoError(GinkgoT(), crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).DeleteCollection(context.Background(), metav1.DeleteOptions{}, metav1.ListOptions{})) @@ -2789,17 +2786,20 @@ var _ = Describe("Install Plan", func() { // Create CatalogSource mainCatalogSourceName := genName("nginx-catalog") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{stableCSV}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, mainCatalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{stableCSV}) defer cleanupCatalogSource() // Attempt to get CatalogSource _, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) require.NoError(GinkgoT(), err) + By("Creating a Subscription") subscriptionName := genName("sub-nginx-") - subscriptionCleanup := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) - defer subscriptionCleanup() + // Subscription is explitly deleted as part of the test to avoid CSV being recreated, + // so ignore cleanup function + _ = createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) + By("Attempt to get Subscription") subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -2871,92 +2871,63 @@ var _ = Describe("Install Plan", func() { // Should have removed every matching step require.Equal(GinkgoT(), 0, len(expectedSteps), "Actual resource steps do not match expected: %#v", expectedSteps) - // the test from here out verifies created RBAC is removed after CSV deletion - createdClusterRoles, err := c.KubernetesInterface().RbacV1().ClusterRoles().List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) - createdClusterRoleNames := map[string]struct{}{} - for _, role := range createdClusterRoles.Items { - createdClusterRoleNames[role.GetName()] = struct{}{} - GinkgoT().Logf("Monitoring cluster role %v", role.GetName()) - } - - createdClusterRoleBindings, err := c.KubernetesInterface().RbacV1().ClusterRoleBindings().List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) - createdClusterRoleBindingNames := map[string]struct{}{} - for _, binding := range createdClusterRoleBindings.Items { - createdClusterRoleBindingNames[binding.GetName()] = struct{}{} - GinkgoT().Logf("Monitoring cluster role binding %v", binding.GetName()) - } - - crWatcher, err := c.KubernetesInterface().RbacV1().ClusterRoles().Watch(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) - require.NoError(GinkgoT(), err) - crbWatcher, err := c.KubernetesInterface().RbacV1().ClusterRoleBindings().Watch(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) - require.NoError(GinkgoT(), err) - - done := make(chan struct{}) - errExit := make(chan error) - go func() { - defer GinkgoRecover() - for { - select { - case evt, ok := <-crWatcher.ResultChan(): - if !ok { - errExit <- errors.New("cr watch channel closed unexpectedly") - return - } - if evt.Type == watch.Deleted { - cr, ok := evt.Object.(*rbacv1.ClusterRole) - if !ok { - continue - } - delete(createdClusterRoleNames, cr.GetName()) - if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 { - done <- struct{}{} - return - } - } - case evt, ok := <-crbWatcher.ResultChan(): - if !ok { - errExit <- errors.New("crb watch channel closed unexpectedly") - return - } - if evt.Type == watch.Deleted { - crb, ok := evt.Object.(*rbacv1.ClusterRoleBinding) - if !ok { - continue - } - delete(createdClusterRoleBindingNames, crb.GetName()) - if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 { - done <- struct{}{} - return - } - } - case <-time.After(pollDuration): - done <- struct{}{} - return + By(fmt.Sprintf("Explicitly deleting subscription %s/%s", generatedNamespace.GetName(), subscriptionName)) + err = crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Delete(context.Background(), subscriptionName, metav1.DeleteOptions{}) + By("Looking for no error OR IsNotFound error") + require.NoError(GinkgoT(), client.IgnoreNotFound(err)) + + By("Waiting for the Subscription to delete") + err = waitForSubscriptionToDelete(generatedNamespace.GetName(), subscriptionName, crc) + require.NoError(GinkgoT(), client.IgnoreNotFound(err)) + + By(fmt.Sprintf("Explicitly deleting csv %s/%s", generatedNamespace.GetName(), stableCSVName)) + err = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.Background(), stableCSVName, metav1.DeleteOptions{}) + By("Looking for no error OR IsNotFound error") + require.NoError(GinkgoT(), client.IgnoreNotFound(err)) + By("Waiting for the CSV to delete") + err = waitForCsvToDelete(generatedNamespace.GetName(), stableCSVName, crc) + require.NoError(GinkgoT(), client.IgnoreNotFound(err)) + + nCrs := 0 + nCrbs := 0 + By("Waiting for CRBs and CRs and SAs to delete") + Eventually(func() bool { + + crbs, err := c.KubernetesInterface().RbacV1().ClusterRoleBindings().List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) + if err != nil { + GinkgoT().Logf("error getting crbs: %v", err) + return false + } + if n := len(crbs.Items); n != 0 { + if n != nCrbs { + GinkgoT().Logf("CRBs remaining: %v", n) + nCrbs = n } + return false } - }() - GinkgoT().Logf("Deleting CSV '%v' in namespace %v", stableCSVName, generatedNamespace.GetName()) - require.NoError(GinkgoT(), crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).DeleteCollection(context.Background(), metav1.DeleteOptions{}, metav1.ListOptions{})) - select { - case <-done: - break - case err := <-errExit: - GinkgoT().Fatal(err) - } - - require.Emptyf(GinkgoT(), createdClusterRoleNames, "unexpected cluster role remain: %v", createdClusterRoleNames) - require.Emptyf(GinkgoT(), createdClusterRoleBindingNames, "unexpected cluster role binding remain: %v", createdClusterRoleBindingNames) - Eventually(func() error { - _, err := c.GetServiceAccount(generatedNamespace.GetName(), serviceAccountName) - if err == nil { - return fmt.Errorf("The %v/%v ServiceAccount should have been deleted", generatedNamespace.GetName(), serviceAccountName) + crs, err := c.KubernetesInterface().RbacV1().ClusterRoles().List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) + if err != nil { + GinkgoT().Logf("error getting crs: %v", err) + return false } - if !apierrors.IsNotFound(err) { - return err + if n := len(crs.Items); n != 0 { + if n != nCrs { + GinkgoT().Logf("CRs remaining: %v", n) + nCrs = n + } + return false + } + + _, err = c.KubernetesInterface().CoreV1().ServiceAccounts(generatedNamespace.GetName()).Get(context.Background(), serviceAccountName, metav1.GetOptions{}) + if client.IgnoreNotFound(err) != nil { + GinkgoT().Logf("error getting sa %s/%s: %v", generatedNamespace.GetName(), serviceAccountName, err) + return false } - return nil - }, timeout, interval).Should(BeNil()) + + return true + }, pollDuration*2, pollInterval).Should(BeTrue()) + By("Cleaning up the test") }) It("CRD validation", func() { @@ -2969,25 +2940,25 @@ var _ = Describe("Install Plan", func() { var max float64 = 256 // Create CRD with offending property - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "spec": { Type: "object", Description: "Spec of a test object.", - Properties: map[string]apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensionsv1.JSONSchemaProps{ "scalar": { Type: "number", Description: "Scalar value that should have a min and max.", @@ -3001,13 +2972,13 @@ var _ = Describe("Install Plan", func() { }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -3022,7 +2993,7 @@ var _ = Describe("Install Plan", func() { packageName := genName("nginx-") stableChannel := "stable" packageNameStable := packageName + "-" + stableChannel - csv := newCSV(packageNameStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv := newCSV(packageNameStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) // Create PackageManifests manifests := []registry.PackageManifest{ @@ -3037,7 +3008,7 @@ var _ = Describe("Install Plan", func() { // Create the CatalogSource catalogSourceName := genName("mock-nginx-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csv}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csv}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan @@ -3171,8 +3142,8 @@ var _ = Describe("Install Plan", func() { stableChannel := "stable" dependentCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{dependentCRD}, nil) - dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{dependentCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil) + dependentCSV := newCSV(dependentPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{dependentCRD}, nil, nil) defer func() { require.NoError(GinkgoT(), crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).DeleteCollection(context.Background(), metav1.DeleteOptions{}, metav1.ListOptions{})) @@ -3210,7 +3181,7 @@ var _ = Describe("Install Plan", func() { }() // Create the dependent catalog source - _, cleanupDependentCatalogSource := createInternalCatalogSource(c, crc, dependentCatalogName, generatedNamespace.GetName(), dependentManifests, []apiextensions.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV}) + _, cleanupDependentCatalogSource := createInternalCatalogSource(c, crc, dependentCatalogName, generatedNamespace.GetName(), dependentManifests, []apiextensionsv1.CustomResourceDefinition{dependentCRD}, []operatorsv1alpha1.ClusterServiceVersion{dependentCSV}) defer cleanupDependentCatalogSource() // Attempt to get the catalog source before creating install plan @@ -4271,40 +4242,40 @@ func newNginxInstallStrategy(name string, permissions []operatorsv1alpha1.Strate return namedStrategy } -func newCRD(plural string) apiextensions.CustomResourceDefinition { - crd := apiextensions.CustomResourceDefinition{ +func newCRD(plural string) apiextensionsv1.CustomResourceDefinition { + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: plural + ".cluster.com", }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: plural, Singular: plural, Kind: plural, ListKind: plural + "list", }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } return crd } -func newCSV(name, namespace, replaces string, version semver.Version, owned []apiextensions.CustomResourceDefinition, required []apiextensions.CustomResourceDefinition, namedStrategy *operatorsv1alpha1.NamedInstallStrategy) operatorsv1alpha1.ClusterServiceVersion { +func newCSV(name, namespace, replaces string, version semver.Version, owned []apiextensionsv1.CustomResourceDefinition, required []apiextensionsv1.CustomResourceDefinition, namedStrategy *operatorsv1alpha1.NamedInstallStrategy) operatorsv1alpha1.ClusterServiceVersion { csvType = metav1.TypeMeta{ Kind: operatorsv1alpha1.ClusterServiceVersionKind, APIVersion: operatorsv1alpha1.SchemeGroupVersion.String(), diff --git a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go index 711be269b9..33d3d4fd2a 100644 --- a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go @@ -19,7 +19,7 @@ import ( "github.com/prometheus/common/expfmt" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/net" @@ -345,7 +345,7 @@ var _ = Describe("Metrics are generated for OLM managed resources", func() { stableChannel := "stable" mainCRD := newCRD(genName("ins-")) - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, nil) mainManifests := []registry.PackageManifest{ { @@ -356,7 +356,7 @@ var _ = Describe("Metrics are generated for OLM managed resources", func() { DefaultChannelName: stableChannel, }, } - cs, cleanupAll := createInternalCatalogSource(c, crc, name, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV}) + cs, cleanupAll := createInternalCatalogSource(c, crc, name, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{mainCRD}, []v1alpha1.ClusterServiceVersion{mainCSV}) // Note(tflannag): Dependending on how ginkgo orders these test specs, and how bloated the cluster we're running // this test case against, we risk creating and then immediately deleting the catalogsource before the catalog // operator can generate all the requisite resources (e.g. the ServiceAccount), which can leave the underlying diff --git a/staging/operator-lifecycle-manager/test/e2e/operator_condition_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/operator_condition_e2e_test.go index 1bf2a4ffc1..917a3a5792 100644 --- a/staging/operator-lifecycle-manager/test/e2e/operator_condition_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/operator_condition_e2e_test.go @@ -8,9 +8,9 @@ import ( . "github.com/onsi/gomega" "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" - meta "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" @@ -54,9 +54,9 @@ var _ = Describe("Operator Condition", func() { strategyB := newNginxInstallStrategy(pkgBStable, nil, nil) strategyD := newNginxInstallStrategy(pkgDStable, nil, nil) crd := newCRD(genName(pkgA)) - csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &strategyA) - csvB := newCSV(pkgBStable, generatedNamespace.GetName(), pkgAStable, semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &strategyB) - csvD := newCSV(pkgDStable, generatedNamespace.GetName(), pkgBStable, semver.MustParse("0.3.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &strategyD) + csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &strategyA) + csvB := newCSV(pkgBStable, generatedNamespace.GetName(), pkgAStable, semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &strategyB) + csvD := newCSV(pkgDStable, generatedNamespace.GetName(), pkgBStable, semver.MustParse("0.3.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &strategyD) // Create the initial catalogsources manifests := []registry.PackageManifest{ @@ -70,7 +70,7 @@ var _ = Describe("Operator Condition", func() { } catalog := genName("catalog-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA}) defer cleanupCatalogSource() _, err := fetchCatalogSourceOnStatus(crc, catalog, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) subName := genName("sub-") @@ -114,7 +114,7 @@ var _ = Describe("Operator Condition", func() { DefaultChannelName: stableChannel, }, } - updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}, manifests) + updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensionsv1.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) @@ -174,7 +174,7 @@ var _ = Describe("Operator Condition", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvD}, manifests) + updateInternalCatalog(GinkgoT(), c, crc, catalog, generatedNamespace.GetName(), []apiextensionsv1.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) require.NoError(GinkgoT(), err) diff --git a/staging/operator-lifecycle-manager/test/e2e/operator_groups_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/operator_groups_e2e_test.go index 9768b1d3ff..720d135093 100644 --- a/staging/operator-lifecycle-manager/test/e2e/operator_groups_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/operator_groups_e2e_test.go @@ -13,7 +13,7 @@ import ( authorizationv1 "k8s.io/api/authorization/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -163,7 +163,7 @@ var _ = Describe("Operator Group", func() { deploymentName := genName("operator-deployment") namedStrategy := newNginxInstallStrategy(deploymentName, permissions, nil) - aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) + aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) createdCSV, err := crc.OperatorsV1alpha1().ClusterServiceVersions(opGroupNamespace).Create(context.TODO(), &aCSV, metav1.CreateOptions{}) require.NoError(GinkgoT(), err) @@ -454,10 +454,14 @@ var _ = Describe("Operator Group", func() { require.NoError(GinkgoT(), crc.OperatorsV1().OperatorGroups(nsA).Delete(context.TODO(), groupA.GetName(), metav1.DeleteOptions{})) }() - // Generate csvA in namespaceA with all installmodes supported - crd := newCRD(genName("a")) - namedStrategy := newNginxInstallStrategy(genName("dep-"), nil, nil) - csvA := newCSV("nginx-a", nsA, "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &namedStrategy) + crdAName := genName("a") + strategyName := genName("dep-") + csvAName := "nginx-a" + GinkgoT().Logf("Generate csv (%s/%s) with crd %s and with all installmodes supported: %s", nsA, csvAName, crdAName, strategyName) + crd := newCRD(crdAName) + namedStrategy := newNginxInstallStrategy(strategyName, nil, nil) + csvA := newCSV(csvAName, nsA, "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &namedStrategy) + _, err = crc.OperatorsV1alpha1().ClusterServiceVersions(nsA).Create(context.TODO(), &csvA, metav1.CreateOptions{}) require.NoError(GinkgoT(), err) defer func() { @@ -649,7 +653,7 @@ var _ = Describe("Operator Group", func() { // Generate csvA in namespaceA with no supported InstallModes crd := newCRD(genName("b")) namedStrategy := newNginxInstallStrategy(genName("dep-"), nil, nil) - csv := newCSV("nginx-a", nsA, "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{crd}, &namedStrategy) + csv := newCSV("nginx-a", nsA, "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{crd}, &namedStrategy) csvA := &csv csvA.Spec.InstallModes = []v1alpha1.InstallMode{ { @@ -875,9 +879,9 @@ var _ = Describe("Operator Group", func() { kvgA := fmt.Sprintf("%s.%s.%s", crdA.Spec.Names.Kind, crdA.Spec.Versions[0].Name, crdA.Spec.Group) kvgB := fmt.Sprintf("%s.%s.%s", crdB.Spec.Names.Kind, crdB.Spec.Versions[0].Name, crdB.Spec.Group) kvgD := fmt.Sprintf("%s.%s.%s", crdD.Spec.Names.Kind, crdD.Spec.Versions[0].Name, crdD.Spec.Group) - csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crdA}, nil, &strategyA) - csvB := newCSV(pkgBStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crdA, crdB}, nil, &strategyB) - csvD := newCSV(pkgDStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crdD}, nil, &strategyD) + csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crdA}, nil, &strategyA) + csvB := newCSV(pkgBStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crdA, crdB}, nil, &strategyB) + csvD := newCSV(pkgDStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crdD}, nil, &strategyD) // Create namespaces nsA, nsB, nsC, nsD, nsE := genName("a-"), genName("b-"), genName("c-"), genName("d-"), genName("e-") @@ -920,15 +924,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}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, nsA, manifests, []apiextensionsv1.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() _, 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}) + _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsB, manifests, []apiextensionsv1.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() _, 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}) + _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsD, manifests, []apiextensionsv1.CustomResourceDefinition{crdA, crdD, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB, csvD}) defer cleanupCatalogSource() _, err = fetchCatalogSourceOnStatus(crc, catalog, nsD, catalogSourceRegistryPodSynced) require.NoError(GinkgoT(), err) @@ -1148,8 +1152,8 @@ var _ = Describe("Operator Group", func() { crdB := newCRD(genName(pkgB)) kvgA := fmt.Sprintf("%s.%s.%s", crdA.Spec.Names.Kind, crdA.Spec.Versions[0].Name, crdA.Spec.Group) kvgB := fmt.Sprintf("%s.%s.%s", crdB.Spec.Names.Kind, crdB.Spec.Versions[0].Name, crdB.Spec.Group) - csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crdA}, nil, &strategyA) - csvB := newCSV(pkgBStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crdB}, nil, &strategyB) + csvA := newCSV(pkgAStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crdA}, nil, &strategyA) + csvB := newCSV(pkgBStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crdB}, nil, &strategyB) // Create namespaces nsA, nsB, nsC, nsD := genName("a-"), genName("b-"), genName("c-"), genName("d-") @@ -1187,11 +1191,11 @@ var _ = Describe("Operator Group", func() { // Create catalog in namespaceB and namespaceC catalog := genName("catalog-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, nsB, manifests, []apiextensions.CustomResourceDefinition{crdA, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalog, nsB, manifests, []apiextensionsv1.CustomResourceDefinition{crdA, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanupCatalogSource() _, 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}) + _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catalog, nsC, manifests, []apiextensionsv1.CustomResourceDefinition{crdA, crdB}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanupCatalogSource() _, err = fetchCatalogSourceOnStatus(crc, catalog, nsC, catalogSourceRegistryPodSynced) require.NoError(GinkgoT(), err) @@ -1422,7 +1426,7 @@ var _ = Describe("Operator Group", func() { deploymentName := genName("operator-deployment") namedStrategy := newNginxInstallStrategy(deploymentName, permissions, nil) - aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) + aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) // Use the It spec name as label after stripping whitespaces aCSV.Labels = map[string]string{"label": K8sSafeCurrentTestDescription()} @@ -1615,7 +1619,7 @@ var _ = Describe("Operator Group", func() { deploymentName := genName("operator-deployment") namedStrategy := newNginxInstallStrategy(deploymentName, nil, nil) - aCSV := newCSV(csvName, newNamespaceName, "", semver.MustParse("0.0.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) + aCSV := newCSV(csvName, newNamespaceName, "", semver.MustParse("0.0.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) createdCSV, err := crc.OperatorsV1alpha1().ClusterServiceVersions(newNamespaceName).Create(context.TODO(), &aCSV, metav1.CreateOptions{}) require.NoError(GinkgoT(), err) @@ -1751,7 +1755,7 @@ var _ = Describe("Operator Group", func() { deploymentName := genName("operator-deployment") namedStrategy := newNginxInstallStrategy(deploymentName, nil, nil) - aCSV := newCSV(csvName, newNamespaceName, "", semver.MustParse("0.0.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) + aCSV := newCSV(csvName, newNamespaceName, "", semver.MustParse("0.0.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) createdCSV, err := crc.OperatorsV1alpha1().ClusterServiceVersions(newNamespaceName).Create(context.TODO(), &aCSV, metav1.CreateOptions{}) require.NoError(GinkgoT(), err) @@ -1901,7 +1905,7 @@ var _ = Describe("Operator Group", func() { deploymentName := genName("operator-deployment") namedStrategy := newNginxInstallStrategy(deploymentName, permissions, nil) - aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensions.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) + aCSV := newCSV(csvName, opGroupNamespace, "", semver.MustParse("0.0.0"), []apiextensionsv1.CustomResourceDefinition{mainCRD}, nil, &namedStrategy) // Use the It spec name as label after stripping whitespaces aCSV.Labels = map[string]string{"label": K8sSafeCurrentTestDescription()} diff --git a/staging/operator-lifecycle-manager/test/e2e/packagemanifest_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/packagemanifest_e2e_test.go index 06a0a4c268..cfd2fc835e 100644 --- a/staging/operator-lifecycle-manager/test/e2e/packagemanifest_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/packagemanifest_e2e_test.go @@ -11,7 +11,7 @@ import ( opver "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" @@ -77,7 +77,7 @@ var _ = Describe("Package Manifest API lists available Operators from Catalog So crdPlural := genName("ins") crd := newCRD(crdPlural) catsrcName = genName("mock-ocs") - csv = newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv = newCSV(packageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) csv.SetLabels(map[string]string{"projected": "label"}) csv.Spec.Keywords = []string{"foo", "bar"} csv.Spec.Links = []v1alpha1.AppLink{ @@ -112,7 +112,7 @@ var _ = Describe("Package Manifest API lists available Operators from Catalog So }, } - _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catsrcName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv, csvAlpha}) + _, cleanupCatalogSource = createInternalCatalogSource(c, crc, catsrcName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csv, csvAlpha}) // Verify catalog source was created _, err := fetchCatalogSourceOnStatus(crc, catsrcName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) diff --git a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go index e954a37cee..5cf17a32f3 100644 --- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go @@ -18,7 +18,7 @@ import ( "github.com/stretchr/testify/require" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -87,7 +87,7 @@ var _ = Describe("Subscription", func() { }, } - crds := []apiextensions.CustomResourceDefinition{newCRD(genName("crd-"))} + crds := []apiextensionsv1.CustomResourceDefinition{newCRD(genName("crd-"))} csvs := []operatorsv1alpha1.ClusterServiceVersion{ newCSV("csv-dependency-1", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), crds, nil, nil), newCSV("csv-dependency-2", generatedNamespace.GetName(), "csv-dependency-1", semver.MustParse("2.0.0"), nil, nil, nil), @@ -198,32 +198,32 @@ var _ = Describe("Subscription", func() { crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -231,8 +231,8 @@ var _ = Describe("Subscription", func() { mainPackageStable := fmt.Sprintf("%s-stable", mainPackageName) updatedPackageStable := fmt.Sprintf("%s-updated", mainPackageName) stableChannel := "stable" - mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0-1556661347"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) - updatedCSV := newCSV(updatedPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0-1556661832"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + mainCSV := newCSV(mainPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0-1556661347"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) + updatedCSV := newCSV(updatedPackageStable, generatedNamespace.GetName(), "", semver.MustParse("0.1.0-1556661832"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) updatedCSV.SetAnnotations(map[string]string{"olm.skipRange": ">=0.1.0-1556661347 <0.1.0-1556661832"}) c := newKubeClient() @@ -264,7 +264,7 @@ var _ = Describe("Subscription", func() { } // Create catalog source - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) + _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{mainCSV}) defer cleanupMainCatalogSource() // Attempt to get the catalog source before creating subscription _, err := fetchCatalogSourceOnStatus(crc, mainCatalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) @@ -280,7 +280,7 @@ var _ = Describe("Subscription", func() { require.NoError(GinkgoT(), err) // Update catalog with a new csv in the channel with a skip range - updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{updatedCSV}, updatedManifests) + updateInternalCatalog(GinkgoT(), c, crc, mainCatalogName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{updatedCSV}, updatedManifests) // Wait for csv to update finalCSV, err := fetchCSV(crc, generatedNamespace.GetName(), updatedCSV.GetName(), csvSucceededChecker) @@ -301,7 +301,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", subscriptionHasCondition(operatorsv1alpha1.SubscriptionInstallPlanPending, corev1.ConditionTrue, string(operatorsv1alpha1.InstallPlanPhaseRequiresApproval), "")) require.NoError(GinkgoT(), err) require.NotNil(GinkgoT(), subscription) @@ -356,32 +356,32 @@ var _ = Describe("Subscription", func() { crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -389,8 +389,8 @@ var _ = Describe("Subscription", func() { packageName := genName("nginx-") stableChannel := "stable" - csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) - csvB := newCSV("nginx-b", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) + csvB := newCSV("nginx-b", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) // Create PackageManifests manifests := []registry.PackageManifest{ @@ -405,7 +405,7 @@ var _ = Describe("Subscription", func() { // Create the CatalogSource catalogSourceName := genName("mock-nginx-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan @@ -515,9 +515,9 @@ var _ = Describe("Subscription", func() { packageName := genName("nginx-") stableChannel := "stable" - csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) - csvB := newCSV("nginx-b", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) - csvC := newCSV("nginx-c", generatedNamespace.GetName(), "nginx-b", semver.MustParse("0.3.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) + csvB := newCSV("nginx-b", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) + csvC := newCSV("nginx-c", generatedNamespace.GetName(), "nginx-b", semver.MustParse("0.3.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) // Create PackageManifests manifests := []registry.PackageManifest{ @@ -532,7 +532,7 @@ var _ = Describe("Subscription", func() { // Create the CatalogSource with just one version catalogSourceName := genName("mock-nginx-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA}) defer cleanupCatalogSource() // Attempt to get the catalog source before creating install plan @@ -571,7 +571,7 @@ var _ = Describe("Subscription", func() { }, } - updateInternalCatalog(GinkgoT(), c, crc, catalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvC}, packages) + updateInternalCatalog(GinkgoT(), c, crc, catalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvC}, packages) // wait for checks on intermediate csvs to succeed wg.Wait() @@ -1032,7 +1032,7 @@ var _ = Describe("Subscription", func() { pkgName := genName("pkg-") channelName := genName("channel-") crd := newCRD(pkgName) - csv := newCSV(pkgName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csv := newCSV(pkgName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) manifests := []registry.PackageManifest{ { PackageName: pkgName, @@ -1043,7 +1043,7 @@ var _ = Describe("Subscription", func() { }, } catalogName := genName("catalog-") - _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csv}) + _, cleanupCatalogSource := createInternalCatalogSource(c, crc, catalogName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csv}) defer cleanupCatalogSource() _, err := fetchCatalogSourceOnStatus(crc, catalogName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced) Expect(err).ToNot(HaveOccurred()) @@ -1462,7 +1462,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Stable", func() { Step(2, "Operator A (Requires CRD, CRD 2)", func() { - csvA := newCSV("csv-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{crd, crd2}, nil) + csvA := newCSV("csv-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{crd, crd2}, nil) packageA.Channels = append(packageA.Channels, registry.PackageChannel{Name: stableChannel, CurrentCSVName: csvA.GetName()}) csvs1 = append(csvs1, csvA) }) @@ -1470,7 +1470,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Alpha", func() { Step(2, "Operator ABC (Provides: CRD, CRD 2)", func() { - csvABC := newCSV("csv-abc", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd, crd2}, nil, nil) + csvABC := newCSV("csv-abc", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd, crd2}, nil, nil) packageA.Channels = append(packageA.Channels, registry.PackageChannel{Name: alphaChannel, CurrentCSVName: csvABC.GetName()}) csvs1 = append(csvs1, csvABC) }) @@ -1485,7 +1485,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Stable", func() { Step(2, "Operator B (Provides: CRD)", func() { - csvB := newCSV("csv-b", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvB := newCSV("csv-b", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageB.Channels = append(packageB.Channels, registry.PackageChannel{Name: stableChannel, CurrentCSVName: csvB.GetName()}) csvs1 = append(csvs1, csvB) }) @@ -1493,7 +1493,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Alpha", func() { Step(2, "Operator D (Provides: CRD)", func() { - csvD := newCSV("csv-d", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvD := newCSV("csv-d", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageB.Channels = append(packageB.Channels, registry.PackageChannel{Name: alphaChannel, CurrentCSVName: csvD.GetName()}) csvs1 = append(csvs1, csvD) }) @@ -1508,7 +1508,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Stable", func() { Step(2, "Operator C (Provides: CRD 2)", func() { - csvC := newCSV("csv-c", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd2}, nil, nil) + csvC := newCSV("csv-c", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd2}, nil, nil) packageBInCatsrc2.Channels = append(packageBInCatsrc2.Channels, registry.PackageChannel{Name: stableChannel, CurrentCSVName: csvC.GetName()}) csvs2 = append(csvs2, csvC) }) @@ -1523,7 +1523,7 @@ var _ = Describe("Subscription", func() { Step(1, "Channel Stable", func() { Step(2, "Operator E (Provides: CRD 2)", func() { - csvE := newCSV("csv-e", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd2}, nil, nil) + csvE := newCSV("csv-e", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd2}, nil, nil) packageC.Channels = append(packageC.Channels, registry.PackageChannel{Name: stable, CurrentCSVName: csvE.GetName()}) csvs2 = append(csvs2, csvE) }) @@ -1535,8 +1535,8 @@ var _ = Describe("Subscription", func() { var cleanup cleanupFunc By("creating catalogsources", func() { var c1, c2 cleanupFunc - catsrc, c1 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageA, packageB}, []apiextensions.CustomResourceDefinition{crd, crd2}, csvs1) - catsrc2, c2 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc2"), generatedNamespace.GetName(), []registry.PackageManifest{packageBInCatsrc2, packageC}, []apiextensions.CustomResourceDefinition{crd, crd2}, csvs2) + catsrc, c1 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageA, packageB}, []apiextensionsv1.CustomResourceDefinition{crd, crd2}, csvs1) + catsrc2, c2 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc2"), generatedNamespace.GetName(), []registry.PackageManifest{packageBInCatsrc2, packageC}, []apiextensionsv1.CustomResourceDefinition{crd, crd2}, csvs2) cleanup = func() { c1() c2() @@ -1584,7 +1584,7 @@ var _ = Describe("Subscription", func() { var ( kubeClient operatorclient.ClientInterface crClient versioned.Interface - crd apiextensions.CustomResourceDefinition + crd apiextensionsv1.CustomResourceDefinition packageMain, packageDepRight, packageDepWrong registry.PackageManifest csvsMain, csvsRight, csvsWrong []operatorsv1alpha1.ClusterServiceVersion catsrcMain, catsrcDepRight, catsrcDepWrong *operatorsv1alpha1.CatalogSource @@ -1603,7 +1603,7 @@ var _ = Describe("Subscription", func() { packageMain = registry.PackageManifest{PackageName: genName("PkgMain-")} csv := newCSV(mainCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), nil, - []apiextensions.CustomResourceDefinition{crd}, nil) + []apiextensionsv1.CustomResourceDefinition{crd}, nil) packageMain.DefaultChannelName = stableChannel packageMain.Channels = append(packageMain.Channels, registry.PackageChannel{Name: stableChannel, CurrentCSVName: csv.GetName()}) @@ -1618,7 +1618,7 @@ var _ = Describe("Subscription", func() { BeforeEach(func() { packageDepRight = registry.PackageManifest{PackageName: "PackageDependent"} csv := newCSV(rightCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), - []apiextensions.CustomResourceDefinition{crd}, nil, nil) + []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageDepRight.DefaultChannelName = alphaChannel packageDepRight.Channels = []registry.PackageChannel{{Name: alphaChannel, CurrentCSVName: csv.GetName()}} csvsRight = append(csvsRight, csv) @@ -1632,10 +1632,10 @@ var _ = Describe("Subscription", func() { []registry.PackageManifest{packageMain}, nil, csvsMain) catsrcDepRight, catsrcCleanup2 = createInternalCatalogSource(kubeClient, crClient, "catsrc1", generatedNamespace.GetName(), - []registry.PackageManifest{packageDepRight}, []apiextensions.CustomResourceDefinition{crd}, csvsRight) + []registry.PackageManifest{packageDepRight}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsRight) catsrcDepWrong, catsrcCleanup3 = createInternalCatalogSource(kubeClient, crClient, "catsrc2", generatedNamespace.GetName(), - []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) + []registry.PackageManifest{packageDepWrong}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsWrong) _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) Expect(err).ToNot(HaveOccurred()) @@ -1711,7 +1711,7 @@ var _ = Describe("Subscription", func() { packageDepRight = registry.PackageManifest{PackageName: "PackageDependent"} csv := newCSV(rightCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), - []apiextensions.CustomResourceDefinition{crd}, nil, nil) + []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageDepRight.DefaultChannelName = alphaChannel packageDepRight.Channels = []registry.PackageChannel{{Name: alphaChannel, CurrentCSVName: csv.GetName()}} csvsMain = append(csvsMain, csv) @@ -1722,10 +1722,10 @@ var _ = Describe("Subscription", func() { csvsWrong = append(csvsWrong, csv) catsrcMain, catsrcCleanup1 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), generatedNamespace.GetName(), - []registry.PackageManifest{packageDepRight, packageMain}, []apiextensions.CustomResourceDefinition{crd}, csvsMain) + []registry.PackageManifest{packageDepRight, packageMain}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsMain) catsrcDepWrong, catsrcCleanup2 = createInternalCatalogSourceWithPriority(kubeClient, crClient, - genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, + genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageDepWrong}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsWrong, 100) // waiting for catalogsources to be ready @@ -1798,7 +1798,7 @@ var _ = Describe("Subscription", func() { BeforeEach(func() { packageDepRight = registry.PackageManifest{PackageName: "PackageDependent"} csv := newCSV(rightCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), - []apiextensions.CustomResourceDefinition{crd}, nil, nil) + []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageDepRight.DefaultChannelName = alphaChannel packageDepRight.Channels = []registry.PackageChannel{{Name: alphaChannel, CurrentCSVName: csv.GetName()}} csvsRight = append(csvsRight, csv) @@ -1812,11 +1812,11 @@ var _ = Describe("Subscription", func() { []registry.PackageManifest{packageMain}, nil, csvsMain) catsrcDepRight, catsrcCleanup2 = createInternalCatalogSourceWithPriority(kubeClient, crClient, - genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageDepRight}, []apiextensions.CustomResourceDefinition{crd}, + genName("catsrc"), generatedNamespace.GetName(), []registry.PackageManifest{packageDepRight}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsRight, 100) catsrcDepWrong, catsrcCleanup3 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), generatedNamespace.GetName(), - []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) + []registry.PackageManifest{packageDepWrong}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsWrong) // waiting for catalogsources to be ready _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) @@ -1893,7 +1893,7 @@ var _ = Describe("Subscription", func() { packageDepRight = registry.PackageManifest{PackageName: "PackageDependent"} csv := newCSV(rightCSVName, generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), - []apiextensions.CustomResourceDefinition{crd}, nil, nil) + []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) packageDepRight.DefaultChannelName = alphaChannel packageDepRight.Channels = []registry.PackageChannel{{Name: alphaChannel, CurrentCSVName: csv.GetName()}} csvsRight = append(csvsRight, csv) @@ -1907,10 +1907,10 @@ var _ = Describe("Subscription", func() { []registry.PackageManifest{packageMain}, nil, csvsMain) catsrcDepRight, catsrcCleanup2 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), generatedNamespace.GetName(), - []registry.PackageManifest{packageDepRight}, []apiextensions.CustomResourceDefinition{crd}, csvsRight) + []registry.PackageManifest{packageDepRight}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsRight) catsrcDepWrong, catsrcCleanup3 = createInternalCatalogSource(kubeClient, crClient, genName("catsrc"), operatorNamespace, - []registry.PackageManifest{packageDepWrong}, []apiextensions.CustomResourceDefinition{crd}, csvsWrong) + []registry.PackageManifest{packageDepWrong}, []apiextensionsv1.CustomResourceDefinition{crd}, csvsWrong) // waiting for catalogsources to be ready _, err := fetchCatalogSourceOnStatus(crClient, catsrcMain.GetName(), generatedNamespace.GetName(), catalogSourceRegistryPodSynced) @@ -2004,13 +2004,13 @@ var _ = Describe("Subscription", func() { packageName2 := genName("bpackage") // csvA provides CRD - csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvA := newCSV("nginx-a", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) // csvB provides CRD2 and requires CRD - csvB := newCSV("nginx-b", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd2}, []apiextensions.CustomResourceDefinition{crd}, nil) + csvB := newCSV("nginx-b", generatedNamespace.GetName(), "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd2}, []apiextensionsv1.CustomResourceDefinition{crd}, nil) // New csvA requires CRD (transfer CRD ownership to the new csvB) - csvNewA := newCSV("nginx-new-a", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), nil, []apiextensions.CustomResourceDefinition{crd}, nil) + csvNewA := newCSV("nginx-new-a", generatedNamespace.GetName(), "nginx-a", semver.MustParse("0.2.0"), nil, []apiextensionsv1.CustomResourceDefinition{crd}, nil) // New csvB provides CRD and CRD2 - csvNewB := newCSV("nginx-new-b", generatedNamespace.GetName(), "nginx-b", semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{crd, crd2}, nil, nil) + csvNewB := newCSV("nginx-new-b", generatedNamespace.GetName(), "nginx-b", semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{crd, crd2}, nil, nil) // constraints not satisfiable: // apackagert6cq requires at least one of catsrcc6xgr/operators/stable/nginx-new-a, @@ -2038,7 +2038,7 @@ var _ = Describe("Subscription", func() { } catalogSourceName := genName("catsrc") - catsrc, cleanup := createInternalCatalogSource(kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensions.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}) + catsrc, cleanup := createInternalCatalogSource(kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), manifests, []apiextensionsv1.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}) defer cleanup() // Ensure that the catalog source is resolved before we create a subscription. @@ -2089,7 +2089,7 @@ var _ = Describe("Subscription", func() { DefaultChannelName: stableChannel, }, } - updateInternalCatalog(GinkgoT(), kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvNewA, csvA, csvB}, manifests) + updateInternalCatalog(GinkgoT(), kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.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) require.NoError(GinkgoT(), err) @@ -2117,7 +2117,7 @@ var _ = Describe("Subscription", func() { DefaultChannelName: stableChannel, }, } - updateInternalCatalog(GinkgoT(), kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvNewA, csvNewB}, manifests) + updateInternalCatalog(GinkgoT(), kubeClient, crClient, catalogSourceName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{crd, crd2}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB, csvNewA, csvNewB}, manifests) _, err = fetchSubscription(crClient, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanDifferentChecker(subscription.Status.InstallPlanRef.Name)) require.NoError(GinkgoT(), err) @@ -2156,7 +2156,7 @@ var _ = Describe("Subscription", func() { DefaultChannelName: "alpha", }, } - csvA = newCSV("csvA", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), nil, []apiextensions.CustomResourceDefinition{crd}, nil) + csvA = newCSV("csvA", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), nil, []apiextensionsv1.CustomResourceDefinition{crd}, nil) _, teardown = createInternalCatalogSource(c, ctx.Ctx().OperatorClient(), catSrcName, generatedNamespace.GetName(), packages, nil, []operatorsv1alpha1.ClusterServiceVersion{csvA}) @@ -2194,9 +2194,9 @@ var _ = Describe("Subscription", func() { } packages = append(packages, newPkg) - csvB = newCSV("csvB", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) + csvB = newCSV("csvB", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, nil) - updateInternalCatalog(GinkgoT(), c, crc, catSrcName, generatedNamespace.GetName(), []apiextensions.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}, packages) + updateInternalCatalog(GinkgoT(), c, crc, catSrcName, generatedNamespace.GetName(), []apiextensionsv1.CustomResourceDefinition{crd}, []operatorsv1alpha1.ClusterServiceVersion{csvA, csvB}, packages) }) It("the ResolutionFailed condition previously set in its status that indicated the resolution error is cleared off", func() { @@ -2290,7 +2290,7 @@ var _ = Describe("Subscription", func() { }, } - crds := []apiextensions.CustomResourceDefinition{newCRD(genName("crd-"))} + crds := []apiextensionsv1.CustomResourceDefinition{newCRD(genName("crd-"))} csvs := []operatorsv1alpha1.ClusterServiceVersion{ newCSV("csv-dependency", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), crds, nil, nil), newCSV("csv-root", generatedNamespace.GetName(), "", semver.MustParse("1.0.0"), nil, crds, nil), @@ -2658,6 +2658,32 @@ func subscriptionHasCondition(condType operatorsv1alpha1.SubscriptionConditionTy } } +func subscriptionDoesNotHaveCondition(condType operatorsv1alpha1.SubscriptionConditionType) subscriptionStateChecker { + var lastStatus corev1.ConditionStatus + lastTime := time.Now() + // if status meets expectations, then subscription state is considered met/true + // IFF this is the result of a recent change of status + // else, cache the current status for next loop/comparison + return func(subscription *operatorsv1alpha1.Subscription) bool { + cond := subscription.Status.GetCondition(condType) + if cond.Status == corev1.ConditionUnknown { + if cond.Status != lastStatus { + GinkgoT().Logf("waited %s subscription condition not found\n", time.Since(lastTime)) + lastStatus = cond.Status + lastTime = time.Now() + } + return true + } + + if cond.Status != lastStatus { + GinkgoT().Logf("waited %s subscription condition found: %v\n", time.Since(lastTime), cond) + lastStatus = cond.Status + lastTime = time.Now() + } + return false + } +} + func fetchSubscription(crc versioned.Interface, namespace, name string, checker subscriptionStateChecker) (*operatorsv1alpha1.Subscription, error) { var fetchedSubscription *operatorsv1alpha1.Subscription var err error @@ -2764,6 +2790,35 @@ func createSubscriptionForCatalogWithSpec(t GinkgoTInterface, crc versioned.Inte return buildSubscriptionCleanupFunc(crc, subscription) } +func waitForSubscriptionToDelete(namespace, name string, c versioned.Interface) error { + var lastState operatorsv1alpha1.SubscriptionState + var lastReason operatorsv1alpha1.ConditionReason + lastTime := time.Now() + + ctx.Ctx().Logf("waiting for subscription %s/%s to delete", namespace, name) + err := wait.Poll(pollInterval, pollDuration, func() (bool, error) { + sub, err := c.OperatorsV1alpha1().Subscriptions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + ctx.Ctx().Logf("subscription %s/%s deleted", namespace, name) + return true, nil + } + if err != nil { + ctx.Ctx().Logf("error getting subscription %s/%s: %v", namespace, name, err) + } + if sub != nil { + state, reason := sub.Status.State, sub.Status.Reason + if state != lastState || reason != lastReason { + ctx.Ctx().Logf("waited %s for subscription %s/%s status: %s (%s)", time.Since(lastTime), namespace, name, state, reason) + lastState, lastReason = state, reason + lastTime = time.Now() + } + } + return false, nil + }) + + return err +} + func checkDeploymentHasPodConfigNodeSelector(t GinkgoTInterface, client operatorclient.ClientInterface, csv *operatorsv1alpha1.ClusterServiceVersion, nodeSelector map[string]string) error { resolver := install.StrategyResolver{} @@ -2913,7 +2968,7 @@ func checkDeploymentWithPodConfiguration(client operatorclient.ClientInterface, return nil } -func updateInternalCatalog(t GinkgoTInterface, c operatorclient.ClientInterface, crc versioned.Interface, catalogSourceName, namespace string, crds []apiextensions.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, packages []registry.PackageManifest) { +func updateInternalCatalog(t GinkgoTInterface, c operatorclient.ClientInterface, crc versioned.Interface, catalogSourceName, namespace string, crds []apiextensionsv1.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, packages []registry.PackageManifest) { fetchedInitialCatalog, err := fetchCatalogSourceOnStatus(crc, catalogSourceName, namespace, catalogSourceRegistryPodSynced) require.NoError(t, err) diff --git a/staging/operator-lifecycle-manager/test/e2e/user_defined_sa_test.go b/staging/operator-lifecycle-manager/test/e2e/user_defined_sa_test.go index b4a9806032..45e8e49b02 100644 --- a/staging/operator-lifecycle-manager/test/e2e/user_defined_sa_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/user_defined_sa_test.go @@ -18,7 +18,7 @@ import ( "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -86,16 +86,12 @@ var _ = Describe("User defined service account", func() { ipGot, err := fetchInstallPlanWithNamespace(GinkgoT(), crc, ipName, generatedNamespace.GetName(), ipPhaseCheckerFunc) require.NoError(GinkgoT(), err) - conditionGot := mustHaveCondition(GinkgoT(), ipGot, v1alpha1.InstallPlanInstalled) - assert.Equal(GinkgoT(), corev1.ConditionFalse, conditionGot.Status) - 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 @@ -279,32 +275,32 @@ func newCatalogSource(t GinkgoTInterface, kubeclient operatorclient.ClientInterf crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -317,8 +313,8 @@ func newCatalogSource(t GinkgoTInterface, kubeclient operatorclient.ClientInterf stableChannel := "stable" namedStrategy := newNginxInstallStrategy(genName(prefixFunc("dep")), permissions, nil) - csvA := newCSV("nginx-a", namespace, "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &namedStrategy) - csvB := newCSV("nginx-b", namespace, "nginx-a", semver.MustParse("0.2.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &namedStrategy) + csvA := newCSV("nginx-a", namespace, "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &namedStrategy) + csvB := newCSV("nginx-b", namespace, "nginx-a", semver.MustParse("0.2.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &namedStrategy) // Create PackageManifests manifests := []registry.PackageManifest{ @@ -332,7 +328,7 @@ func newCatalogSource(t GinkgoTInterface, kubeclient operatorclient.ClientInterf } catalogSourceName := genName(prefixFunc("catsrc")) - catsrc, cleanup = createInternalCatalogSource(kubeclient, crclient, catalogSourceName, namespace, manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) + catsrc, cleanup = createInternalCatalogSource(kubeclient, crclient, catalogSourceName, namespace, manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) require.NotNil(t, catsrc) require.NotNil(t, cleanup) @@ -351,32 +347,32 @@ func newCatalogSourceWithDependencies(t GinkgoTInterface, kubeclient operatorcli crdPlural := genName("ins") crdName := crdPlural + ".cluster.com" - crd := apiextensions.CustomResourceDefinition{ + crd := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha1", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, }, }, }, - Names: apiextensions.CustomResourceDefinitionNames{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: crdPlural, Singular: crdPlural, Kind: crdPlural, ListKind: "list" + crdPlural, }, - Scope: apiextensions.NamespaceScoped, + Scope: apiextensionsv1.NamespaceScoped, }, } @@ -390,8 +386,8 @@ func newCatalogSourceWithDependencies(t GinkgoTInterface, kubeclient operatorcli stableChannel := "stable" namedStrategy := newNginxInstallStrategy(genName(prefixFunc("dep")), permissions, nil) - csvA := newCSV("nginx-req-dep", namespace, "", semver.MustParse("0.1.0"), nil, []apiextensions.CustomResourceDefinition{crd}, &namedStrategy) - csvB := newCSV("nginx-dependency", namespace, "", semver.MustParse("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, &namedStrategy) + csvA := newCSV("nginx-req-dep", namespace, "", semver.MustParse("0.1.0"), nil, []apiextensionsv1.CustomResourceDefinition{crd}, &namedStrategy) + csvB := newCSV("nginx-dependency", namespace, "", semver.MustParse("0.1.0"), []apiextensionsv1.CustomResourceDefinition{crd}, nil, &namedStrategy) // Create PackageManifests manifests := []registry.PackageManifest{ @@ -412,7 +408,7 @@ func newCatalogSourceWithDependencies(t GinkgoTInterface, kubeclient operatorcli } catalogSourceName := genName(prefixFunc("catsrc")) - catsrc, cleanup = createInternalCatalogSource(kubeclient, crclient, catalogSourceName, namespace, manifests, []apiextensions.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) + catsrc, cleanup = createInternalCatalogSource(kubeclient, crclient, catalogSourceName, namespace, manifests, []apiextensionsv1.CustomResourceDefinition{crd}, []v1alpha1.ClusterServiceVersion{csvA, csvB}) require.NotNil(t, catsrc) require.NotNil(t, cleanup) diff --git a/staging/operator-lifecycle-manager/test/e2e/util.go b/staging/operator-lifecycle-manager/test/e2e/util.go index 9b0943aaab..46b20b9e1f 100644 --- a/staging/operator-lifecycle-manager/test/e2e/util.go +++ b/staging/operator-lifecycle-manager/test/e2e/util.go @@ -15,7 +15,6 @@ import ( "google.golang.org/grpc" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extScheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -601,7 +600,7 @@ func createInternalCatalogSource( name, namespace string, manifests []registry.PackageManifest, - crds []apiextensions.CustomResourceDefinition, + crds []apiextensionsv1.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, ) (*operatorsv1alpha1.CatalogSource, cleanupFunc) { configMap, configMapCleanup := createConfigMapForCatalogData(c, name, namespace, manifests, crds, csvs) @@ -633,8 +632,10 @@ func createInternalCatalogSource( ctx.Ctx().Logf("Catalog source %s created", name) cleanupInternalCatalogSource := func() { + ctx.Ctx().Logf("Cleaning catalog source %s", name) configMapCleanup() buildCatalogSourceCleanupFunc(c, crc, namespace, catalogSource)() + ctx.Ctx().Logf("Done cleaning catalog source %s", name) } return catalogSource, cleanupInternalCatalogSource } @@ -644,7 +645,7 @@ func createInternalCatalogSourceWithPriority(c operatorclient.ClientInterface, name, namespace string, manifests []registry.PackageManifest, - crds []apiextensions.CustomResourceDefinition, + crds []apiextensionsv1.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, priority int, ) (*operatorsv1alpha1.CatalogSource, cleanupFunc) { @@ -735,7 +736,7 @@ func createConfigMapForCatalogData( name, namespace string, manifests []registry.PackageManifest, - crds []apiextensions.CustomResourceDefinition, + crds []apiextensionsv1.CustomResourceDefinition, csvs []operatorsv1alpha1.ClusterServiceVersion, ) (*corev1.ConfigMap, cleanupFunc) { // Create a config map containing the PackageManifests and CSVs @@ -839,7 +840,7 @@ func createV1CRDConfigMapForCatalogData( return createdConfigMap, buildConfigMapCleanupFunc(c, namespace, createdConfigMap) } -func serializeCRD(crd apiextensions.CustomResourceDefinition) string { +func serializeCRD(crd apiextensionsv1.CustomResourceDefinition) string { scheme := runtime.NewScheme() Expect(extScheme.AddToScheme(scheme)).Should(Succeed()) diff --git a/staging/operator-lifecycle-manager/test/e2e/webhook_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/webhook_e2e_test.go index 71423796ca..884b87d639 100644 --- a/staging/operator-lifecycle-manager/test/e2e/webhook_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/webhook_e2e_test.go @@ -834,14 +834,14 @@ var _ = Describe("CSVs with a Webhook", func() { // create CRD (crdA) crdAPlural := genName("mockcrda") crdA := newV1CRD(crdAPlural) - cleanupCRD, er := createV1CRD(c, crdA) + cleanupCRD, er := createCRD(c, crdA) require.NoError(GinkgoT(), er) defer cleanupCRD() // create another CRD (crdB) crdBPlural := genName("mockcrdb") crdB := newV1CRD(crdBPlural) - cleanupCRD2, er := createV1CRD(c, crdB) + cleanupCRD2, er := createCRD(c, crdB) require.NoError(GinkgoT(), er) defer cleanupCRD2() @@ -903,7 +903,7 @@ var _ = Describe("CSVs with a Webhook", func() { // create CRD (crdA) crdAPlural := genName("mockcrda") crdA := newV1CRD(crdAPlural) - cleanupCRD, er := createV1CRD(c, crdA) + cleanupCRD, er := createCRD(c, crdA) require.NoError(GinkgoT(), er) defer cleanupCRD()