github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/upgrade/pre-upgrade/verify/verify_preupgrade_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 verify 5 6 import ( 7 "fmt" 8 "github.com/verrazzano/verrazzano/pkg/k8sutil" 9 dump "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/clusterdump" 10 "time" 11 12 "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework/metrics" 13 "gopkg.in/yaml.v3" 14 15 . "github.com/onsi/ginkgo/v2" 16 . "github.com/onsi/gomega" 17 vzconst "github.com/verrazzano/verrazzano/pkg/constants" 18 "github.com/verrazzano/verrazzano/tests/e2e/pkg" 19 "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework" 20 ) 21 22 var waitTimeout = 15 * time.Minute 23 var pollingInterval = 30 * time.Second 24 var shortPollingInterval = 10 * time.Second 25 26 var t = framework.NewTestFramework("verify") 27 28 var beforeSuite = t.BeforeSuiteFunc(func() { 29 start := time.Now() 30 updateConfigMap() 31 beforeSuitePassed = true 32 metrics.Emit(t.Metrics.With("before_suite_elapsed_time", time.Since(start).Milliseconds())) 33 }) 34 35 var _ = BeforeSuite(beforeSuite) 36 37 var failed = false 38 var beforeSuitePassed = false 39 40 var _ = t.AfterEach(func() { 41 failed = failed || framework.VzCurrentGinkgoTestDescription().Failed() 42 }) 43 44 var afterSuite = t.AfterSuiteFunc(func() { 45 start := time.Now() 46 if failed || !beforeSuitePassed { 47 dump.ExecuteBugReport() 48 } 49 metrics.Emit(t.Metrics.With("after_suite_elapsed_time", time.Since(start).Milliseconds())) 50 }) 51 52 var _ = AfterSuite(afterSuite) 53 54 func updateConfigMap() { 55 t.Logs.Info("Update prometheus configmap") 56 Eventually(func() error { 57 configMap, scrapeConfigs, configYaml, err := pkg.GetPrometheusConfig() 58 if err != nil { 59 pkg.Log(pkg.Error, fmt.Sprintf("Failed getting prometheus config: %v", err)) 60 return err 61 } 62 testJobFound := false 63 updateMap := false 64 for _, nsc := range scrapeConfigs { 65 scrapeConfig := nsc.(map[string]interface{}) 66 // Change the default value of an existing default job 67 if scrapeConfig[vzconst.PrometheusJobNameKey] == "prometheus" && scrapeConfig["scrape_interval"].(string) != vzconst.TestPrometheusJobScrapeInterval { 68 scrapeConfig["scrape_interval"] = vzconst.TestPrometheusJobScrapeInterval 69 updateMap = true 70 } 71 72 // Create test job only once 73 if scrapeConfig[vzconst.PrometheusJobNameKey] == vzconst.TestPrometheusScrapeJob { 74 testJobFound = true 75 } 76 } 77 78 if !testJobFound { 79 // Add a test scrape config 80 dummyScrapConfig := make(map[interface{}]interface{}) 81 dummyScrapConfig[vzconst.PrometheusJobNameKey] = vzconst.TestPrometheusScrapeJob 82 scrapeConfigs = append(scrapeConfigs, dummyScrapConfig) 83 updateMap = true 84 } 85 86 if updateMap { 87 configYaml["scrape_configs"] = scrapeConfigs 88 newConfigYaml, err := yaml.Marshal(&configYaml) 89 if err != nil { 90 pkg.Log(pkg.Error, fmt.Sprintf("Failed updating configmap yaml: %v", err)) 91 return err 92 } 93 94 configMap.Data["prometheus.yml"] = string(newConfigYaml) 95 err = pkg.UpdateConfigMap(configMap) 96 if err != nil { 97 pkg.Log(pkg.Error, fmt.Sprintf("Failed updating configmap: %v", err)) 98 return err 99 } 100 } 101 102 return nil 103 }, waitTimeout, shortPollingInterval).Should(BeNil()) 104 } 105 106 // 'It' Wrapper to only run spec if the VMI Prometheus is installed 107 func WhenVmiPrometheusInstalledIt(description string, f func()) { 108 kubeconfigPath, err := k8sutil.GetKubeConfigLocation() 109 if err != nil { 110 t.It(description, func() { 111 Fail(fmt.Sprintf("Failed to get default kubeconfig path: %s", err.Error())) 112 }) 113 } 114 notSupported, err := pkg.IsVerrazzanoMinVersion("1.4.0", kubeconfigPath) 115 if err != nil { 116 t.It(description, func() { 117 Fail(fmt.Sprintf("Failed to check Verrazzano version less than 1.4.0: %s", err.Error())) 118 }) 119 } 120 if notSupported { 121 t.Logs.Infof("Skipping check '%v', the VMI Prometheus is not installed", description) 122 } else { 123 t.It(description, f) 124 } 125 } 126 127 var _ = t.Describe("Update prometheus configmap", Label("f:platform-lcm.upgrade", "f:observability.monitoring.prom"), func() { 128 // Verify that prometheus configmap is updated 129 // GIVEN the prometheus configmap is created 130 // WHEN the upgrade has not started and vmo pod is not restarted 131 // THEN the file updated prometheus configmap contains updated scrape interval and test job 132 t.Context("check prometheus configmap", func() { 133 WhenVmiPrometheusInstalledIt("before upgrade", func() { 134 Eventually(func() bool { 135 _, scrapeConfigs, _, err := pkg.GetPrometheusConfig() 136 if err != nil { 137 pkg.Log(pkg.Error, fmt.Sprintf("Failed getting prometheus config: %v", err)) 138 return false 139 } 140 141 intervalUpdated := false 142 testJobFound := false 143 for _, nsc := range scrapeConfigs { 144 scrapeConfig := nsc.(map[string]interface{}) 145 // Check that interval is updated 146 if scrapeConfig[vzconst.PrometheusJobNameKey] == "prometheus" { 147 intervalUpdated = (scrapeConfig["scrape_interval"].(string) == vzconst.TestPrometheusJobScrapeInterval) 148 } 149 150 // Check that test scrape config is created 151 if scrapeConfig[vzconst.PrometheusJobNameKey] == vzconst.TestPrometheusScrapeJob { 152 testJobFound = true 153 } 154 } 155 return intervalUpdated && testJobFound 156 }, waitTimeout, pollingInterval).Should(BeTrue()) 157 }) 158 }) 159 160 })