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  }