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  })