github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/update/dnsmc/dnsmc_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 dnsmc 5 6 import ( 7 "fmt" 8 "time" 9 10 . "github.com/onsi/ginkgo/v2" 11 "github.com/onsi/gomega" 12 vzapi "github.com/verrazzano/verrazzano/platform-operator/apis/verrazzano/v1alpha1" 13 "github.com/verrazzano/verrazzano/tests/e2e/multicluster" 14 "github.com/verrazzano/verrazzano/tests/e2e/pkg" 15 "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework" 16 "github.com/verrazzano/verrazzano/tests/e2e/pkg/update" 17 ) 18 19 var ( 20 t = framework.NewTestFramework("update dns") 21 adminCluster *multicluster.Cluster 22 managedClusters []*multicluster.Cluster 23 waitTimeout = 10 * time.Minute 24 pollingInterval = 5 * time.Second 25 ) 26 27 type DNSModifier struct { 28 DNS *vzapi.DNSComponent 29 } 30 31 func (m *DNSModifier) ModifyCR(cr *vzapi.Verrazzano) { 32 cr.Spec.Components.DNS = m.DNS 33 } 34 35 var beforeSuite = t.BeforeSuiteFunc(func() { 36 adminCluster = multicluster.AdminCluster() 37 managedClusters = multicluster.ManagedClusters() 38 verifyRegistration() 39 }) 40 41 var _ = BeforeSuite(beforeSuite) 42 43 var _ = t.Describe("Update managed-cluster dns", Serial, Ordered, Label("f:platform-lcm.update"), func() { 44 t.Describe("multicluster dns verify", Label("f:platform-lcm.multicluster-verify"), func() { 45 t.It("managed-cluster dns wildcard sslip.io config", func() { 46 updateManagedClusterDNS() 47 verifyPrometheusIngress() 48 verifyThanosIngress() 49 verifyThanosStore() 50 }) 51 }) 52 t.Describe("multicluster dns verify", Label("f:platform-lcm.multicluster-verify"), func() { 53 t.It("managed-cluster dns default nip.io config", func() { 54 updateManagedClusterDNS() 55 verifyPrometheusIngress() 56 verifyThanosIngress() 57 verifyThanosStore() 58 }) 59 }) 60 }) 61 62 var oldPromIngs = map[string]string{} 63 var oldThanosIngs = map[string]string{} 64 65 // updateManagedClusterDNS switch dns config to sslip.io or nip.io 66 func updateManagedClusterDNS() { 67 for _, managedCluster := range managedClusters { 68 var oldDNS = managedCluster.GetCR(true).Spec.Components.DNS 69 var newDNS *vzapi.DNSComponent 70 if pkg.IsDefaultDNS(oldDNS) { 71 newDNS = &vzapi.DNSComponent{Wildcard: &vzapi.Wildcard{Domain: pkg.SslipDomain}} 72 } 73 oldPromIngs[managedCluster.Name] = managedCluster.GetPrometheusIngress() 74 oldThanosIngs[managedCluster.Name] = managedCluster.GetThanosIngress() 75 m := &DNSModifier{DNS: newDNS} 76 update.RetryUpdate(m, managedCluster.KubeConfigPath, false, pollingInterval, waitTimeout) 77 } 78 } 79 func verifyPrometheusIngress() { 80 start := time.Now() 81 for _, managedCluster := range managedClusters { 82 oldPromIng := oldPromIngs[managedCluster.Name] 83 gomega.Eventually(func() bool { 84 newPromIng := managedCluster.GetPrometheusIngress() 85 pkg.Log(pkg.Info, fmt.Sprintf("Cluster %v PrometheusIngress updated %v from %v to %v for %v", managedCluster.Name, newPromIng != oldPromIng, oldPromIng, newPromIng, time.Since(start))) 86 return newPromIng != oldPromIng 87 }, waitTimeout, pollingInterval).Should(gomega.BeTrue(), fmt.Sprintf("%s of %s is not updated for %v", oldPromIng, managedCluster.Name, time.Since(start))) 88 } 89 } 90 91 func verifyThanosIngress() { 92 start := time.Now() 93 for _, managedCluster := range managedClusters { 94 oldThanosIng := oldThanosIngs[managedCluster.Name] 95 gomega.Eventually(func() bool { 96 newThanosIng := managedCluster.GetThanosIngress() 97 pkg.Log(pkg.Info, fmt.Sprintf("Cluster %v ThanosIngress updated %v from %v to %v for %v", managedCluster.Name, newThanosIng != oldThanosIng, oldThanosIng, newThanosIng, time.Since(start))) 98 return newThanosIng != oldThanosIng 99 }, waitTimeout, pollingInterval).Should(gomega.BeTrue(), fmt.Sprintf("%s of %s is not updated for %v", oldThanosIng, managedCluster.Name, time.Since(start))) 100 } 101 } 102 103 func verifyThanosStore() { 104 for _, managedCluster := range managedClusters { 105 gomega.Eventually(func() (bool, error) { 106 metricsTest, err := pkg.NewMetricsTest(adminCluster.KubeConfigPath, map[string]string{}, managedCluster.KubeConfigPath) 107 if err != nil { 108 t.Logs.Errorf("Failed to create metrics test object for cluster: %v", err) 109 return false, err 110 } 111 112 queryStores, err := metricsTest.Source.GetTargets() 113 if err != nil { 114 t.Logs.Errorf("Failed to create get metrics target source: %v", err) 115 return false, err 116 } 117 118 expectedName := fmt.Sprintf("%s:443", managedCluster.GetQueryIngress()) 119 for _, store := range queryStores { 120 storeMap, ok := store.(map[string]interface{}) 121 if !ok { 122 t.Logs.Infof("Thanos store empty, skipping entry") 123 continue 124 } 125 name, ok := storeMap["name"] 126 if !ok { 127 t.Logs.Infof("Name not found for store, skipping entry") 128 continue 129 } 130 nameString, nameOk := name.(string) 131 if !nameOk { 132 t.Logs.Infof("Name not valid format, skipping entry") 133 continue 134 } 135 if ok { 136 t.Logs.Infof("Found store in Thanos %s, want is equal to %s", nameString, expectedName) 137 } 138 if ok && nameString == expectedName { 139 return true, nil 140 } 141 } 142 return false, nil 143 }, waitTimeout, pollingInterval).Should(gomega.BeTrue(), fmt.Sprintf("store of %s is not ready", managedCluster.Name)) 144 } 145 } 146 147 func verifyRegistration() { 148 for _, managedCluster := range managedClusters { 149 reg, _ := adminCluster.GetRegistration(managedCluster.Name) 150 if reg == nil { 151 adminCluster.Register(managedCluster) 152 gomega.Eventually(func() bool { 153 reg, err := adminCluster.GetRegistration(managedCluster.Name) 154 return reg != nil && err == nil 155 }, waitTimeout, pollingInterval).Should(gomega.BeTrue(), fmt.Sprintf("%s is not registered", managedCluster.Name)) 156 } 157 } 158 }