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  }