From 242c5f182f9f8eada962bdcec71311c43136f264 Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Mon, 16 Oct 2023 07:56:57 -0600 Subject: [PATCH 1/5] test/e2e: don't use internal versions of api extensions The internal versions of the API Extensions client objects are what client calls get converted into for processing within the server. This mechanism allows many different clients to use many different outward-facing versions, while the code within the server only ever runs against one type. There is no utility to these types outside of the server, especially for code that's making client calls. We can simply use the client-facing types and not require coversion anywhere. Signed-off-by: Steve Kuznetsov Upstream-repository: operator-lifecycle-manager Upstream-commit: 935fc47c13f21e505e1f52e82faeaccd70861425 --- .../test/e2e/catalog_e2e_test.go | 40 +- .../test/e2e/crd_e2e_test.go | 61 ++- .../test/e2e/csv_e2e_test.go | 181 ++++----- .../test/e2e/ctx/ctx.go | 3 +- ...tream_csv_namespace_labeler_plugin_test.go | 4 +- .../test/e2e/installplan_e2e_test.go | 379 +++++++++--------- .../test/e2e/metrics_e2e_test.go | 6 +- .../test/e2e/operator_condition_e2e_test.go | 16 +- .../test/e2e/operator_groups_e2e_test.go | 46 ++- .../test/e2e/packagemanifest_e2e_test.go | 6 +- .../test/e2e/subscription_e2e_test.go | 128 +++--- .../test/e2e/user_defined_sa_test.go | 50 ++- .../test/e2e/util.go | 9 +- .../test/e2e/webhook_e2e_test.go | 6 +- 14 files changed, 449 insertions(+), 486 deletions(-) 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..208f620848 100644 --- a/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go @@ -15,7 +15,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" @@ -124,19 +123,19 @@ var _ = Describe("CRD Versions", func() { crdPlural := genName("ins-") crdName := crdPlural + ".cluster.com" - oldCRD := apiextensions.CustomResourceDefinition{ + oldCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - 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", }, @@ -146,39 +145,39 @@ var _ = Describe("CRD Versions", func() { Name: "v2alpha1", 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, }, } alphaChannel := "alpha" mainPackageAlpha := fmt.Sprintf("%s-alpha", mainPackageName) - newCRD := apiextensions.CustomResourceDefinition{ + newCRD := apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: crdName, }, - Spec: apiextensions.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "cluster.com", - Versions: []apiextensions.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1alpha3", Served: true, Storage: true, - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ Type: "object", Description: "my crd schema", }, @@ -188,26 +187,26 @@ var _ = Describe("CRD Versions", func() { Name: "v2alpha2", 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, }, } - 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) + 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{ { @@ -221,7 +220,7 @@ var _ = Describe("CRD Versions", func() { } // Create the catalog sources - _, cleanupMainCatalogSource := createInternalCatalogSource(c, crc, mainCatalogName, generatedNamespace.GetName(), mainManifests, []apiextensions.CustomResourceDefinition{oldCRD, newCRD}, []operatorsv1alpha1.ClusterServiceVersion{oldCSV, newCSV}) + _, 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{}) @@ -365,39 +364,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 +414,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 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..532affa3c2 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() @@ -3794,32 +3792,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 +4283,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 } 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..fd2673bab9 100644 --- a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go @@ -22,7 +22,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" @@ -693,8 +692,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 +732,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 +817,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 +828,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 +884,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 +905,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 +981,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 +997,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 +1027,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 +1058,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 +1084,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 +1112,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 +1145,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 +1163,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 +1173,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 +1204,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 +1229,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 +1264,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 +1295,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 +1330,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 +1382,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 +1431,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 +1442,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 +1459,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 +1477,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 +1487,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 +1505,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 +1516,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 +1550,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 +1578,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 +1621,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 +1661,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 +1715,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 +1793,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 +1860,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 +1872,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 +1902,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 +1991,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 +2051,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 +2063,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 +2127,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 +2207,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 +2297,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 +2309,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 +2347,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 +2398,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 +2447,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 +2492,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 +2546,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 +2597,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 +2646,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 +2780,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,7 +2788,7 @@ 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 @@ -2969,25 +2968,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 +3000,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 +3021,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 +3036,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 +3170,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 +3209,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 +4270,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..1d29bef8b1 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) @@ -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), @@ -2913,7 +2913,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..758decdadc 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) @@ -644,7 +643,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 +734,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 +838,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() From ce50710e4f6b92961db9571f8a4a9478e700a70e Mon Sep 17 00:00:00 2001 From: Daniel Franz Date: Wed, 3 Jan 2024 17:51:49 -0800 Subject: [PATCH 2/5] Improve condition check for installplan (#3145) Signed-off-by: Daniel Franz Upstream-repository: operator-lifecycle-manager Upstream-commit: 6b6e3fbd724ddb6bfb1e31f75d3cac2a25cc5b86 --- .../test/e2e/subscription_e2e_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1d29bef8b1..271a4e427f 100644 --- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go @@ -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) From e5ed355344855e0917d881ce228c147b2fd11fd5 Mon Sep 17 00:00:00 2001 From: Todd Short Date: Wed, 3 Jan 2024 17:53:34 -0500 Subject: [PATCH 3/5] Fix Create InstallPlan with Permissions test (#3129) Fix #3108 The Subscription needs to be deleted before deleting the CSV, otherwise the Subscription will recreate the CSV, and subsequently, the CR/CRBs are not deleted. Update some test logging as well. Signed-off-by: Todd Short Upstream-repository: operator-lifecycle-manager Upstream-commit: 8215c7f3fe16b1135ddfc9de1d498fff2f75e659 --- .../test/e2e/csv_e2e_test.go | 37 ++++- .../test/e2e/installplan_e2e_test.go | 142 +++++++----------- .../test/e2e/subscription_e2e_test.go | 29 ++++ .../test/e2e/util.go | 2 + 4 files changed, 118 insertions(+), 92 deletions(-) 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 532affa3c2..cb410b0f97 100644 --- a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go @@ -4407,23 +4407,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) { @@ -4501,6 +4512,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/installplan_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go index fd2673bab9..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" @@ -31,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" @@ -2795,10 +2793,13 @@ var _ = Describe("Install Plan", func() { _, 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) @@ -2870,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 } - return nil - }, timeout, interval).Should(BeNil()) + + _, 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 true + }, pollDuration*2, pollInterval).Should(BeTrue()) + By("Cleaning up the test") }) It("CRD validation", func() { 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 271a4e427f..a74619fb4e 100644 --- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go @@ -2764,6 +2764,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{} diff --git a/staging/operator-lifecycle-manager/test/e2e/util.go b/staging/operator-lifecycle-manager/test/e2e/util.go index 758decdadc..46b20b9e1f 100644 --- a/staging/operator-lifecycle-manager/test/e2e/util.go +++ b/staging/operator-lifecycle-manager/test/e2e/util.go @@ -632,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 } From 657c138c0d7ac092954aabb454ce12a7e0b82410 Mon Sep 17 00:00:00 2001 From: Todd Short Date: Fri, 12 Jan 2024 12:49:39 -0500 Subject: [PATCH 4/5] Fix Condition check for Reconcile InstallPlan status (#3153) Fix #3151 Remove non-InstallPlan related checks for this test. Also: * Clean up some looping log messages * Clean up some logging added when comments were converted These comments/logs are at the beginning of the test, and are also part of the test sequence, so they are redundant (and possibly confusing) Signed-off-by: Todd Short Upstream-repository: operator-lifecycle-manager Upstream-commit: 5299830576c8e8e6cd728b08a3a2e60f212ba387 --- .../test/e2e/crd_e2e_test.go | 2 +- .../test/e2e/csv_e2e_test.go | 7 ----- .../test/e2e/subscription_e2e_test.go | 26 +++++++++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) 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 208f620848..2f036f9006 100644 --- a/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/crd_e2e_test.go @@ -271,7 +271,7 @@ var _ = Describe("CRD Versions", func() { return nil, err } return crc.OperatorsV1alpha1().InstallPlans(generatedNamespace.GetName()).Get(context.TODO(), s.Status.InstallPlanRef.Name, metav1.GetOptions{}) - }).Should(And( + }).Within(2 * time.Minute).Should(And( WithTransform( func(v *operatorsv1alpha1.InstallPlan) operatorsv1alpha1.InstallPlanPhase { return v.Status.Phase 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 cb410b0f97..ca7e21234e 100644 --- a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go @@ -3669,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) 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 a74619fb4e..5cf17a32f3 100644 --- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go @@ -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 From d15a55d35fb61685c12e8151a6133b6f0ca9cb5a Mon Sep 17 00:00:00 2001 From: Per Goncalves da Silva Date: Mon, 12 Feb 2024 15:50:59 +0100 Subject: [PATCH 5/5] fix crd data loss e2e test (#3173) Signed-off-by: Per Goncalves da Silva Co-authored-by: Per Goncalves da Silva Upstream-repository: operator-lifecycle-manager Upstream-commit: 85d9de20d53b025ed62ec2fa0ab7fd8980669fb8 Signed-off-by: Per Goncalves da Silva --- .../test/e2e/crd_e2e_test.go | 391 +++++++++--------- 1 file changed, 203 insertions(+), 188 deletions(-) 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 2f036f9006..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" @@ -30,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() { @@ -38,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-") @@ -113,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 := 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, - }, - } - - // 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{}) - }() - - // 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{}) - }).Within(2 * time.Minute).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" @@ -456,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 @@ -489,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"), + ), + )) + }) })