github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/uninstall/verifycrds/verify_crds_test.go (about) 1 // Copyright (c) 2022, 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package verifycrds 5 6 import ( 7 "fmt" 8 "strings" 9 10 . "github.com/onsi/ginkgo/v2" 11 . "github.com/onsi/gomega" 12 "github.com/verrazzano/verrazzano/tests/e2e/pkg" 13 "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework" 14 apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" 15 ) 16 17 // Expected verrazzano.io CRDs after uninstall 18 var verrazzanoiocrds = map[string]bool{ 19 "ingresstraits.oam.verrazzano.io": false, 20 "loggingtraits.oam.verrazzano.io": false, 21 "metricsbindings.app.verrazzano.io": false, 22 "metricstemplates.app.verrazzano.io": false, 23 "metricstraits.oam.verrazzano.io": false, 24 "multiclusterapplicationconfigurations.clusters.verrazzano.io": false, 25 "multiclustercomponents.clusters.verrazzano.io": false, 26 "multiclusterconfigmaps.clusters.verrazzano.io": false, 27 "multiclustersecrets.clusters.verrazzano.io": false, 28 "verrazzanocoherenceworkloads.oam.verrazzano.io": false, 29 "verrazzanohelidonworkloads.oam.verrazzano.io": false, 30 "verrazzanoprojects.clusters.verrazzano.io": false, 31 "verrazzanoweblogicworkloads.oam.verrazzano.io": false, 32 "ocneociquickcreates.clusters.verrazzano.io": false, 33 "okequickcreates.clusters.verrazzano.io": false, 34 } 35 36 // These CRDs are not deleted when using vz uninstall but are deleted when deleting the platform-operator.yaml. 37 // Therefore, they may or may not be present after an uninstall. 38 var optionalverrazzanoiocrds = []string{ 39 "verrazzanomanagedclusters.clusters.verrazzano.io", 40 "verrazzanos.install.verrazzano.io", 41 "modules.platform.verrazzano.io", 42 } 43 44 // Expected istio.io CRDs after uninstall 45 var istioiocrds = map[string]bool{ 46 "authorizationpolicies.security.istio.io": false, 47 "destinationrules.networking.istio.io": false, 48 "envoyfilters.networking.istio.io": false, 49 "gateways.networking.istio.io": false, 50 "istiooperators.install.istio.io": false, 51 "peerauthentications.security.istio.io": false, 52 "proxyconfigs.networking.istio.io": false, 53 "requestauthentications.security.istio.io": false, 54 "serviceentries.networking.istio.io": false, 55 "sidecars.networking.istio.io": false, 56 "telemetries.telemetry.istio.io": false, 57 "virtualservices.networking.istio.io": false, 58 "wasmplugins.extensions.istio.io": false, 59 "workloadentries.networking.istio.io": false, 60 "workloadgroups.networking.istio.io": false, 61 } 62 63 // Expected oam.dev CRDs after uninstall 64 var oamdevcrds = map[string]bool{ 65 "applicationconfigurations.core.oam.dev": false, 66 "components.core.oam.dev": false, 67 "containerizedworkloads.core.oam.dev": false, 68 "healthscopes.core.oam.dev": false, 69 "manualscalertraits.core.oam.dev": false, 70 "scopedefinitions.core.oam.dev": false, 71 "traitdefinitions.core.oam.dev": false, 72 "workloaddefinitions.core.oam.dev": false, 73 } 74 75 // Expected cert-manager.io CRDs after uninstall 76 var certmanageriocrds = map[string]bool{ 77 "certificaterequests.cert-manager.io": false, 78 "certificates.cert-manager.io": false, 79 "challenges.acme.cert-manager.io": false, 80 "clusterissuers.cert-manager.io": false, 81 "issuers.cert-manager.io": false, 82 "orders.acme.cert-manager.io": false, 83 } 84 85 // Expected monitoring.coreis.com CRDs after uninstall 86 var monitoringcoreoscomcrds = map[string]bool{ 87 "alertmanagerconfigs.monitoring.coreos.com": false, 88 "alertmanagers.monitoring.coreos.com": false, 89 "podmonitors.monitoring.coreos.com": false, 90 "probes.monitoring.coreos.com": false, 91 "prometheuses.monitoring.coreos.com": false, 92 "prometheusrules.monitoring.coreos.com": false, 93 "servicemonitors.monitoring.coreos.com": false, 94 "thanosrulers.monitoring.coreos.com": false, 95 } 96 97 // Expected MySQL Operator CRDs after uninstall 98 var mysqloperatorcrds = map[string]bool{ 99 "innodbclusters.mysql.oracle.com": false, 100 "mysqlbackups.mysql.oracle.com": false, 101 "clusterkopfpeerings.zalando.org": false, 102 "kopfpeerings.zalando.org": false, 103 } 104 105 var vmoCRDs = map[string]bool{ 106 "verrazzanomonitoringinstances.verrazzano.io": false, 107 } 108 109 var opensearchOperatorCRDs = map[string]bool{ 110 "opensearchclusters.opensearch.opster.io": false, 111 "opensearchroles.opensearch.opster.io": false, 112 "opensearchuserrolebindings.opensearch.opster.io": false, 113 "opensearchusers.opensearch.opster.io": false, 114 "opensearchtenants.opensearch.opster.io": false, 115 "opensearchactiongroups.opensearch.opster.io": false, 116 } 117 118 var t = framework.NewTestFramework("uninstall verify crds") 119 120 // This test verifies the CRDs found after an uninstall of Verrazzano are what is expected 121 var _ = t.Describe("Verify CRDs after uninstall.", Label("f:platform-lcm.unnstall"), func() { 122 crds, err := pkg.ListCRDs() 123 if err != nil { 124 Fail(err.Error()) 125 } 126 if !isManagedCluster { 127 for key, value := range vmoCRDs { 128 verrazzanoiocrds[key] = value 129 } 130 } 131 t.It("Check for expected verrazzano.io CRDs", func() { 132 checkCrds(crds, verrazzanoiocrds, "verrazzano.io") 133 }) 134 135 t.It("Check for expected istio.io CRDs", func() { 136 checkCrds(crds, istioiocrds, "istio.io") 137 }) 138 139 t.It("Check for expected oam.dev CRDs", func() { 140 checkCrds(crds, oamdevcrds, "oam.dev") 141 }) 142 143 t.It("Check for expected cert-manager.io CRDs", func() { 144 checkCrds(crds, certmanageriocrds, "cert-manager.io") 145 }) 146 147 t.It("Check for expected monitoring.coreos.com CRDs", func() { 148 checkCrds(crds, monitoringcoreoscomcrds, "monitoring.coreos.com") 149 }) 150 151 t.It("Check for expected domains.weblogic.oracle CRD", func() { 152 checkCrds(crds, map[string]bool{"domains.weblogic.oracle": false}, "domains.weblogic.oracle") 153 }) 154 155 t.It("Check for expected clusters.weblogic.oracle CRD", func() { 156 checkCrds(crds, map[string]bool{"clusters.weblogic.oracle": false}, "clusters.weblogic.oracle") 157 }) 158 159 t.It("Check for expected coherence.coherence.oracle.com CRD", func() { 160 checkCrds(crds, map[string]bool{"coherence.coherence.oracle.com": false}, "coherence.coherence.oracle.com") 161 }) 162 163 if !isManagedCluster { 164 t.It("Check for expected MySQL Operator CRDs", func() { 165 checkCrds(crds, mysqloperatorcrds, "mysql.oracle.com") 166 checkCrds(crds, mysqloperatorcrds, "zalando.org") 167 }) 168 t.It("Check for expected opensearchOperator CRDs", func() { 169 checkCrds(crds, opensearchOperatorCRDs, "opensearch.opster.io") 170 }) 171 } 172 173 t.It("Check for unexpected CRDs", func() { 174 var unexpectedCRDs []string 175 for _, crd := range crds.Items { 176 // Anything other than these CRDs being checked are unexpected after an uninstall 177 if strings.HasSuffix(crd.Name, "projectcalico.org") || 178 strings.HasSuffix(crd.Name, "verrazzano.io") || 179 strings.HasSuffix(crd.Name, "istio.io") || 180 strings.HasSuffix(crd.Name, "monitoring.coreos.com") || 181 strings.HasSuffix(crd.Name, "oam.dev") || 182 strings.HasSuffix(crd.Name, "cert-manager.io") || 183 strings.HasSuffix(crd.Name, "cluster.x-k8s.io") || 184 strings.HasSuffix(crd.Name, "cattle.io") || 185 strings.HasSuffix(crd.Name, "mysql.oracle.com") || 186 strings.HasSuffix(crd.Name, "zalando.org") || 187 strings.HasSuffix(crd.Name, "metallb.io") || 188 strings.HasSuffix(crd.Name, "weblogic.oracle") || 189 strings.HasSuffix(crd.Name, "coherence.oracle.com") || 190 strings.HasSuffix(crd.Name, "opensearch.opster.io") { 191 continue 192 } 193 unexpectedCRDs = append(unexpectedCRDs, crd.Name) 194 } 195 Expect(unexpectedCRDs).To(BeEmpty(), "Found unexpected CRDs remaining after uninstall") 196 }) 197 }) 198 199 // checkCRds checks for both expected CRDs and unexpected CRDs for a given CRDs suffix (for example, verrazzano.io) 200 func checkCrds(crds *apiextv1.CustomResourceDefinitionList, expectdCrds map[string]bool, suffix string) { 201 unexpectedCrd := false 202 for _, crd := range crds.Items { 203 _, ok := expectdCrds[crd.Name] 204 if ok { 205 expectdCrds[crd.Name] = true 206 } else { 207 if strings.HasSuffix(crd.Name, suffix) { 208 optionalCrdFound := crdExistsInList(crd.Name, optionalverrazzanoiocrds) 209 if optionalCrdFound { 210 continue 211 } 212 unexpectedCrd = true 213 pkg.Log(pkg.Error, fmt.Sprintf("Unexpected CRD was found: %s", crd.Name)) 214 } 215 } 216 } 217 218 crdNotFound := false 219 for crdName, wasFound := range expectdCrds { 220 if !wasFound { 221 crdNotFound = true 222 pkg.Log(pkg.Error, fmt.Sprintf("Expected CRD was not found: %s", crdName)) 223 } 224 } 225 226 if unexpectedCrd || crdNotFound { 227 Fail(fmt.Sprintf("Failed to verify %s CRDs", suffix)) 228 } 229 } 230 231 func crdExistsInList(crdNameToCheck string, listOfCrds []string) bool { 232 crdFound := false 233 for _, crdName := range listOfCrds { 234 if crdNameToCheck == crdName { 235 crdFound = true 236 break 237 } 238 } 239 return crdFound 240 }