-
Notifications
You must be signed in to change notification settings - Fork 90
dnm: test olmv1 deployment #2160
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: oadp-dev
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| tmp/ |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,264 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| package olmv1_test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "context" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "log" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "time" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github.com/onsi/ginkgo/v2" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github.com/onsi/gomega" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| corev1 "k8s.io/api/core/v1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| apierrors "k8s.io/apimachinery/pkg/api/errors" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| clusterExtensionName = "oadp-operator" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| oadpCRDName = "dataprotectionapplications.oadp.openshift.io" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| veleroCRDName = "backups.velero.io" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| restoreCRDName = "restores.velero.io" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| managerLabelSelector = "control-plane=controller-manager" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var _ = ginkgo.Describe("OADP OLMv1 lifecycle", ginkgo.Ordered, ginkgo.Label("olmv1"), func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ctx := context.Background() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.BeforeAll(func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Cleaning up orphaned OADP/Velero CRDs from previous installs") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cleanupOrphanedCRDs(ctx) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Setting up namespace, ServiceAccount, and RBAC") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ensureNamespace(ctx, namespace) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ensureServiceAccount(ctx, serviceAccountName, namespace) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ensureClusterAdminBinding(ctx, serviceAccountName, namespace) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if catalogImage != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By(fmt.Sprintf("Creating ClusterCatalog %s from image %s", catalogName, catalogImage)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ensureClusterCatalog(ctx, catalogName, catalogImage) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| waitForClusterCatalogServing(ctx, catalogName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.AfterAll(func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Cleaning up OLMv1 test resources") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| err := deleteClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Warning: failed to delete ClusterExtension: %v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Eventually(func() bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return apierrors.IsNotFound(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, 3*time.Minute, 5*time.Second).Should(gomega.BeTrue(), "ClusterExtension should be deleted") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if createdCatalog { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By(fmt.Sprintf("Deleting ClusterCatalog %s", catalogName)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| deleteClusterCatalog(ctx, catalogName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cleanupClusterRoleBinding(ctx, serviceAccountName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.It("should install OADP operator via ClusterExtension", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Creating the ClusterExtension") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ce := buildClusterExtension(clusterExtensionName, packageName, namespace, serviceAccountName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _, err := dynamicClient.Resource(clusterExtensionGVR).Create(ctx, ce, metav1.CreateOptions{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Created ClusterExtension %s (package=%s, namespace=%s)", clusterExtensionName, packageName, namespace) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Waiting for ClusterExtension to be installed") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| terminalReasons := map[string]bool{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "InvalidConfiguration": true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "Failed": true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Eventually(func(g gomega.Gomega) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| obj, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| g.Expect(err).NotTo(gomega.HaveOccurred(), "ClusterExtension should exist") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| logAllConditions(obj) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| progCond, progFound := getCondition(obj, "Progressing") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if progFound { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| reason, _ := progCond["reason"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| message, _ := progCond["message"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| g.Expect(terminalReasons[reason]).NotTo(gomega.BeTrue(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "ClusterExtension has terminal error on Progressing: reason=%s message=%s", reason, message) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| instCond, instFound := getCondition(obj, "Installed") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| g.Expect(instFound).To(gomega.BeTrue(), "Installed condition should be present") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| status, _ := instCond["status"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| g.Expect(status).To(gomega.Equal("True"), "Installed condition should be True") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, 10*time.Minute, 10*time.Second).Should(gomega.Succeed()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Checking installed bundle info") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| obj, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| bundleName, bundleVersion, found := getInstalledBundle(obj) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(found).To(gomega.BeTrue(), "installed bundle should be present in status") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Installed bundle: name=%s version=%s", bundleName, bundleVersion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.It("should have the OADP controller-manager pod running", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Waiting for controller-manager pod to be Running") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Eventually(func() (bool, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pods, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| LabelSelector: managerLabelSelector, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false, err | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, pod := range pods.Items { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if pod.Status.Phase == corev1.PodRunning { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Controller-manager pod %s is Running", pod.Name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return true, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Controller-manager pod %s phase: %s", pod.Name, pod.Status.Phase) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, 5*time.Minute, 10*time.Second).Should(gomega.BeTrue(), "controller-manager pod should be Running") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
weshayutin marked this conversation as resolved.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.It("should have OADP CRDs installed", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| expectedCRDs := []string{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| oadpCRDName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| veleroCRDName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| restoreCRDName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "schedules.velero.io", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "backupstoragelocations.velero.io", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "volumesnapshotlocations.velero.io", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, crdName := range expectedCRDs { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By(fmt.Sprintf("Checking CRD %s exists", crdName)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exists, err := crdExists(ctx, crdName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(exists).To(gomega.BeTrue(), fmt.Sprintf("CRD %s should exist", crdName)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("CRD %s exists", crdName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.It("should not report deprecation warnings", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| obj, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, condType := range []string{"Deprecated", "PackageDeprecated", "ChannelDeprecated", "BundleDeprecated"} { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cond, found := getCondition(obj, condType) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if found { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| status, _ := cond["status"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(status).To(gomega.Equal("False"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fmt.Sprintf("%s condition should be False, got %s", condType, status)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.When("upgrading the operator", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.BeforeAll(func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if upgradeVersion == "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.Skip("No --upgrade-version specified, skipping upgrade tests") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.It("should upgrade the ClusterExtension to the target version", func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By(fmt.Sprintf("Patching ClusterExtension version to %s", upgradeVersion)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| obj, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| previousBundleName, previousVersion, _ := getInstalledBundle(obj) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Current installed bundle: name=%s version=%s", previousBundleName, previousVersion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| catalogSpec, _, _ := unstructuredNestedMap(obj.Object, "spec", "source", "catalog") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(catalogSpec).NotTo(gomega.BeNil()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| catalogSpec["version"] = upgradeVersion | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| catalogSpec["upgradeConstraintPolicy"] = "SelfCertified" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| err = unstructuredSetNestedMap(obj.Object, catalogSpec, "spec", "source", "catalog") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _, err = dynamicClient.Resource(clusterExtensionGVR).Update(ctx, obj, metav1.UpdateOptions{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Expect(err).NotTo(gomega.HaveOccurred()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+167
to
+181
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Patch
Example using a merge patch- catalogSpec, _, _ := unstructuredNestedMap(obj.Object, "spec", "source", "catalog")
- gomega.Expect(catalogSpec).NotTo(gomega.BeNil())
- catalogSpec["version"] = upgradeVersion
- catalogSpec["upgradeConstraintPolicy"] = "SelfCertified"
- err = unstructuredSetNestedMap(obj.Object, catalogSpec, "spec", "source", "catalog")
- gomega.Expect(err).NotTo(gomega.HaveOccurred())
-
- _, err = dynamicClient.Resource(clusterExtensionGVR).Update(ctx, obj, metav1.UpdateOptions{})
+ patch := []byte(fmt.Sprintf(
+ `{"spec":{"source":{"catalog":{"version":%q,"upgradeConstraintPolicy":"SelfCertified"}}}}`,
+ upgradeVersion,
+ ))
+ _, err = dynamicClient.Resource(clusterExtensionGVR).Patch(
+ ctx,
+ clusterExtensionName,
+ types.MergePatchType,
+ patch,
+ metav1.PatchOptions{},
+ )
gomega.Expect(err).NotTo(gomega.HaveOccurred())Add: import "k8s.io/apimachinery/pkg/types"📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Patched ClusterExtension version to %s", upgradeVersion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Waiting for upgrade to complete") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Eventually(func() string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| updated, err := getClusterExtension(ctx, clusterExtensionName) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cond, found := getCondition(updated, "Installed") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !found { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| status, _ := cond["status"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if status != "True" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| reason, _ := cond["reason"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| message, _ := cond["message"].(string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Installed condition: status=%s reason=%s message=%s", status, reason, message) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _, bundleVer, found := getInstalledBundle(updated) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !found { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| log.Printf("Installed bundle version: %s", bundleVer) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return bundleVer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, 10*time.Minute, 10*time.Second).ShouldNot(gomega.Equal(previousVersion), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "Installed bundle version should change after upgrade") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ginkgo.By("Verifying controller-manager pod is running after upgrade") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gomega.Eventually(func() (bool, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pods, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| LabelSelector: managerLabelSelector, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false, err | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, pod := range pods.Items { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if pod.Status.Phase == corev1.PodRunning { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return true, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, 5*time.Minute, 10*time.Second).Should(gomega.BeTrue()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func unstructuredNestedMap(obj map[string]interface{}, fields ...string) (map[string]interface{}, bool, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var current interface{} = obj | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, field := range fields { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| m, ok := current.(map[string]interface{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return nil, false, fmt.Errorf("expected map at field %s", field) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| current, ok = m[field] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return nil, false, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result, ok := current.(map[string]interface{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return nil, false, fmt.Errorf("final value is not a map") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return result, true, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func unstructuredSetNestedMap(obj map[string]interface{}, value map[string]interface{}, fields ...string) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if len(fields) == 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return fmt.Errorf("no fields specified") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| current := obj | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _, field := range fields[:len(fields)-1] { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| next, ok := current[field].(map[string]interface{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return fmt.Errorf("expected map at field %s", field) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| current = next | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| current[fields[len(fields)-1]] = value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.