github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/opensearch-operator/install/install_test.go (about)

     1  // Copyright (C) 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 install
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	. "github.com/onsi/ginkgo/v2"
    11  	. "github.com/onsi/gomega"
    12  
    13  	"github.com/verrazzano/verrazzano/pkg/constants"
    14  	"github.com/verrazzano/verrazzano/pkg/k8sutil"
    15  	"github.com/verrazzano/verrazzano/platform-operator/apis/verrazzano/v1beta1"
    16  	"github.com/verrazzano/verrazzano/tests/e2e/jaeger"
    17  	"github.com/verrazzano/verrazzano/tests/e2e/pkg"
    18  	"github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework"
    19  	"github.com/verrazzano/verrazzano/tests/e2e/pkg/update"
    20  	"github.com/verrazzano/verrazzano/tests/e2e/update/fluentd"
    21  
    22  	v1 "k8s.io/api/core/v1"
    23  	"sigs.k8s.io/yaml"
    24  )
    25  
    26  const (
    27  	loggingNamespace = "verrazzano-logging"
    28  	clusterName      = "opensearch"
    29  	jaegerOSURLField = `
    30  jaeger:
    31    spec:
    32      storage:
    33        options:
    34          es.server-urls:`
    35  	longWaitTimeout      = 20 * time.Minute
    36  	longPollingInterval  = 20 * time.Second
    37  	shortPollingInterval = 10 * time.Second
    38  	shortWaitTimeout     = 5 * time.Minute
    39  )
    40  
    41  var (
    42  	t = framework.NewTestFramework("install")
    43  )
    44  
    45  type SwitchLoggingOutput struct {
    46  	OpenSearchURL string
    47  }
    48  
    49  func (s *SwitchLoggingOutput) ModifyCRV1beta1(cr *v1beta1.Verrazzano) {
    50  	cr.Spec.Components.Fluentd = &v1beta1.FluentdComponent{
    51  		OpenSearchURL: s.OpenSearchURL,
    52  	}
    53  	jaegerEnabled, _ := jaeger.IsJaegerEnabled()
    54  	if jaegerEnabled {
    55  		jaegerOSURLOverridesYaml := fmt.Sprintf(`%s %s`, jaegerOSURLField, s.OpenSearchURL)
    56  		cr.Spec.Components.JaegerOperator.ValueOverrides = pkg.CreateOverridesOrDie(jaegerOSURLOverridesYaml)
    57  	}
    58  	t.Logs.Debugf("ModifiedV1beta1 CR: %s", marshalCRToString(cr.Spec))
    59  }
    60  
    61  var _ = t.AfterEach(func() {})
    62  
    63  var _ = BeforeSuite(beforeSuite)
    64  
    65  var beforeSuite = t.BeforeSuiteFunc(func() {
    66  
    67  	t.Logs.Info(fmt.Sprintf("Creating %s namespace", loggingNamespace))
    68  	Eventually(func() (*v1.Namespace, error) {
    69  		nsLabels := map[string]string{
    70  			constants.LabelVerrazzanoNamespace: loggingNamespace,
    71  		}
    72  		return pkg.CreateNamespace(loggingNamespace, nsLabels)
    73  	}, shortWaitTimeout, shortPollingInterval).ShouldNot(BeNil())
    74  
    75  	t.Logs.Info("Installing opensearch-operator and cluster")
    76  	err := pkg.InstallOrUpdateOpenSearchOperator(t.Logs, 3, 3, 1)
    77  	Expect(err).NotTo(HaveOccurred())
    78  })
    79  
    80  var _ = t.Describe("Verify opensearch and configure VZ", func() {
    81  	t.It("verify opensearch pods are ready", func() {
    82  		// Check all pods with opensearch prefix
    83  		Eventually(func() bool {
    84  			isReady, err := pkg.PodsRunning(loggingNamespace, []string{clusterName})
    85  			if err != nil {
    86  				return false
    87  			}
    88  			return isReady
    89  		}, longWaitTimeout, longPollingInterval).Should(BeTrue(), "OpenSearch failed to get to ready state")
    90  
    91  		// Verify number of replicas for each nodepool
    92  		pkg.EventuallyPodsReady(t.Logs, 3, 3, 1)
    93  	})
    94  
    95  	updateTime := time.Now()
    96  	t.It("switch logging output", func() {
    97  		// Update VZ CR to use new OS url for fluentd and jaeger, if enabled
    98  		v1beta1Modifier := &SwitchLoggingOutput{OpenSearchURL: constants.DefaultOperatorOSURLWithNS}
    99  		Eventually(func() bool {
   100  			err := update.UpdateCRV1beta1(v1beta1Modifier)
   101  			if err != nil {
   102  				pkg.Log(pkg.Info, fmt.Sprintf("Update error: %v", err))
   103  				return false
   104  			}
   105  			return true
   106  		}, shortWaitTimeout, shortPollingInterval).Should(BeTrue(), "Failed to switch OS Url")
   107  	})
   108  
   109  	t.It("verify operator OS URL in fluentd", func() {
   110  		kubeconfigPath, err := k8sutil.GetKubeConfigLocation()
   111  		Expect(err).NotTo(HaveOccurred())
   112  
   113  		// Wait for VZ to be Ready after modifying the CR
   114  		update.WaitForReadyState(kubeconfigPath, updateTime, longPollingInterval, longWaitTimeout)
   115  
   116  		// Verify fluentd is up and ready with new OS URL
   117  		Eventually(func() bool {
   118  			return fluentd.ValidateDaemonsetV1beta1(constants.DefaultOperatorOSURLWithNS, constants.VerrazzanoESInternal, "")
   119  		}, shortWaitTimeout, shortPollingInterval).Should(BeTrue(), "Fluentd not ready for %s", constants.DefaultOperatorOSURLWithNS)
   120  	})
   121  })
   122  
   123  func marshalCRToString(cr interface{}) string {
   124  	data, err := yaml.Marshal(cr)
   125  	if err != nil {
   126  		t.Logs.Errorf("Error marshalling CR to string")
   127  		return ""
   128  	}
   129  	return string(data)
   130  }