diff --git a/test/e2e/storage/testsuites/provisioning.go b/test/e2e/storage/testsuites/provisioning.go index bb220b3ade0..a564a31cee2 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -19,6 +19,8 @@ package testsuites import ( "context" "fmt" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + crdclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "strconv" "strings" "sync" @@ -297,12 +299,34 @@ func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver, framework.ExpectNoError(err) ginkgo.DeferCleanup(f.DeleteNamespace, valNamespace.Name) - ginkgo.By("Deploying validator") valManifests := []string{ - "test/e2e/testing-manifests/storage-csi/any-volume-datasource/crd/populator.storage.k8s.io_volumepopulators.yaml", "test/e2e/testing-manifests/storage-csi/any-volume-datasource/volume-data-source-validator/rbac-data-source-validator.yaml", "test/e2e/testing-manifests/storage-csi/any-volume-datasource/volume-data-source-validator/setup-data-source-validator.yaml", } + + crdManifestPath := "test/e2e/testing-manifests/storage-csi/any-volume-datasource/crd/populator.storage.k8s.io_volumepopulators.yaml" + crdItems, err := storageutils.LoadFromManifests(crdManifestPath) + framework.ExpectNoError(err, "Failed to load VolumePopulator CRD manifest") + gomega.Expect(crdItems).To(gomega.HaveLen(1), "Expected exactly one CRD in manifest") + + crd, ok := crdItems[0].(*apiextensionsv1.CustomResourceDefinition) + gomega.Expect(ok).To(gomega.BeTrueBecause("Resource in loaded manifest file is not a CustomResourceDefinition: %s", crdManifestPath)) + + config, err := framework.LoadConfig() + framework.ExpectNoError(err) + apiExtensionClient, err := crdclientset.NewForConfig(config) + framework.ExpectNoError(err) + + ginkgo.By(fmt.Sprintf("Checking if %s CRD exists", crd.Name)) + _, err = apiExtensionClient.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, crd.Name, metav1.GetOptions{}) + if err != nil && apierrors.IsNotFound(err) { + ginkgo.By("VolumePopulator CRD not found, test will create it and remove when done") + valManifests = append(valManifests, crdManifestPath) + } else if err != nil { + framework.ExpectNoError(err, "Error checking for VolumePopulator CRD existence") + } + + ginkgo.By("Deploying validator") err = storageutils.CreateFromManifests(ctx, f, valNamespace, func(item interface{}) error { return nil }, valManifests...)