github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/resources/statefulsets/statefulset_test.go (about)

     1  // Copyright (C) 2020, 2022, 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 statefulsets
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources/nodes"
    10  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/util/logs/vzlog"
    11  	storagev1 "k8s.io/api/storage/v1"
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  
    14  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/constants"
    15  	appsv1 "k8s.io/api/apps/v1"
    16  	corev1 "k8s.io/api/core/v1"
    17  	"k8s.io/apimachinery/pkg/api/resource"
    18  
    19  	"github.com/stretchr/testify/assert"
    20  	vmcontrollerv1 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/apis/vmcontroller/v1"
    21  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/config"
    22  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources"
    23  )
    24  
    25  const defaultStorageClass = "default"
    26  
    27  var storageClass = storagev1.StorageClass{
    28  	ObjectMeta: metav1.ObjectMeta{
    29  		Name: defaultStorageClass,
    30  	},
    31  }
    32  
    33  // TestVMOEmptyStatefulSetSize tests the creation of a VMI without StatefulSets
    34  // GIVEN a VMI spec with an empty ElasticSearch spec
    35  //
    36  //	WHEN I call New
    37  //	THEN there should be no StatefulSets created
    38  func TestVMOEmptyStatefulSetSize(t *testing.T) {
    39  	vmo := &vmcontrollerv1.VerrazzanoMonitoringInstance{}
    40  	statefulsets, err := New(vzlog.DefaultLogger(), vmo, &storageClass, "vmi-system-es-master-0")
    41  	if err != nil {
    42  		t.Error(err)
    43  	}
    44  	assert.Equal(t, 0, len(statefulsets), "Incorrect number of statefulsets")
    45  }
    46  
    47  // TestVMOEmptyStatefulSetSize tests the creation of a VMI without StatefulSets
    48  // GIVEN a VMI spec with an ElasticSearch spec having 'enabled' set to false
    49  //
    50  //	WHEN I call New
    51  //	THEN there should be no StatefulSets created
    52  func TestVMODisabledSpecs(t *testing.T) {
    53  	vmo := &vmcontrollerv1.VerrazzanoMonitoringInstance{
    54  		Spec: vmcontrollerv1.VerrazzanoMonitoringInstanceSpec{
    55  			Elasticsearch: vmcontrollerv1.Elasticsearch{
    56  				Enabled: false,
    57  			},
    58  		},
    59  	}
    60  	statefulsets, err := New(vzlog.DefaultLogger(), vmo, &storageClass, "vmi-system-es-master-0")
    61  	if err != nil {
    62  		t.Error(err)
    63  	}
    64  	assert.Equal(t, 0, len(statefulsets), "Incorrect number of statefulsets")
    65  }
    66  
    67  // TestVMOProdProfile tests the creation of a VMI StatefulSets for a Production profile
    68  // GIVEN a VMI spec with an ElasticSearch spec
    69  //
    70  //	WHEN I call New
    71  //	THEN there should a StatefulSet for ElasticSearch
    72  //	 AND the object should have the expected values
    73  func TestVMOProdProfile(t *testing.T) {
    74  	runTestVMO(t, false)
    75  }
    76  
    77  // TestVMODevProfile tests the creation of a VMI StatefulSets for a Development/small-memory profile
    78  // GIVEN a VMI spec with an ElasticSearch spec
    79  //
    80  //	WHEN I call New
    81  //	THEN there should a StatefulSet for ElasticSearch
    82  //	 AND the object should have the expected values
    83  //	 AND ElasticSearch should be configured for a single-node cluster type
    84  func TestVMODevProfile(t *testing.T) {
    85  	runTestVMO(t, true)
    86  }
    87  
    88  func runTestVMO(t *testing.T, isDevProfileTest bool) {
    89  	// Initialize
    90  	var masterNodeReplicas int32 = 3
    91  	var dataNodeReplicas int32 = 2
    92  	var ingestNodeReplicas int32 = 1
    93  	storageSize := "50Gi"
    94  
    95  	if isDevProfileTest {
    96  		masterNodeReplicas = 1
    97  		dataNodeReplicas = 0
    98  		ingestNodeReplicas = 0
    99  		storageSize = ""
   100  	}
   101  
   102  	vmo := &vmcontrollerv1.VerrazzanoMonitoringInstance{
   103  		ObjectMeta: metav1.ObjectMeta{
   104  			Name: "system",
   105  		},
   106  		Spec: vmcontrollerv1.VerrazzanoMonitoringInstanceSpec{
   107  			Elasticsearch: vmcontrollerv1.Elasticsearch{
   108  				Enabled: true,
   109  				MasterNode: vmcontrollerv1.ElasticsearchNode{
   110  					Name:     "es-master",
   111  					Replicas: masterNodeReplicas,
   112  					Storage: &vmcontrollerv1.Storage{
   113  						Size: storageSize,
   114  					},
   115  					Roles: []vmcontrollerv1.NodeRole{
   116  						vmcontrollerv1.MasterRole,
   117  						vmcontrollerv1.DataRole,
   118  						vmcontrollerv1.IngestRole,
   119  					},
   120  				},
   121  				DataNode: vmcontrollerv1.ElasticsearchNode{
   122  					Name:     "es-data",
   123  					Replicas: dataNodeReplicas,
   124  					Storage: &vmcontrollerv1.Storage{
   125  						Size: storageSize,
   126  					},
   127  					Roles: []vmcontrollerv1.NodeRole{
   128  						vmcontrollerv1.DataRole,
   129  					},
   130  				},
   131  				IngestNode: vmcontrollerv1.ElasticsearchNode{
   132  					Name:     "es-ingest",
   133  					Replicas: ingestNodeReplicas,
   134  					Roles: []vmcontrollerv1.NodeRole{
   135  						vmcontrollerv1.IngestRole,
   136  					},
   137  				},
   138  			},
   139  		},
   140  	}
   141  
   142  	initialMasterNodes := nodes.InitialMasterNodes(vmo.Name, nodes.MasterNodes(vmo))
   143  	// Create the stateful sets
   144  	statefulsets, err := New(vzlog.DefaultLogger(), vmo, &storageClass, initialMasterNodes)
   145  	if err != nil {
   146  		t.Error(err)
   147  	}
   148  
   149  	if isDevProfileTest {
   150  		assert.True(t, nodes.IsSingleNodeCluster(vmo), "Single node ES setup, expected IsSingleNodeCluster to be true")
   151  		verifyDevProfileVMOComponents(t, statefulsets, vmo, masterNodeReplicas, storageSize)
   152  	} else {
   153  		assert.False(t, nodes.IsSingleNodeCluster(vmo), "Single node ES setup, expected IsSingleNodeCluster to be false")
   154  		verifyProdProfileVMOComponents(t, statefulsets, vmo, masterNodeReplicas, storageSize)
   155  	}
   156  }
   157  
   158  func verifyProdProfileVMOComponents(t *testing.T, statefulsets []*appsv1.StatefulSet, vmo *vmcontrollerv1.VerrazzanoMonitoringInstance, elasticSearchReplicas int32, storageSize string) {
   159  	// Do assertions
   160  	assert.Equal(t, 1, len(statefulsets), "Incorrect number of statefulsets")
   161  	for _, statefulset := range statefulsets {
   162  		switch statefulset.Name {
   163  		case resources.GetMetaName(vmo.Name, config.ElasticsearchMaster.Name):
   164  			verifyElasticSearch(t, vmo, statefulset, elasticSearchReplicas, storageSize)
   165  		default:
   166  			t.Error("Unknown Deployment Name: " + statefulset.Name)
   167  		}
   168  	}
   169  }
   170  
   171  func verifyDevProfileVMOComponents(t *testing.T, statefulsets []*appsv1.StatefulSet, vmo *vmcontrollerv1.VerrazzanoMonitoringInstance,
   172  	elasticSearchReplicas int32, storageSize string) {
   173  	// Do assertions
   174  	assert.Equal(t, 1, len(statefulsets), "Incorrect number of statefulsets")
   175  	for _, statefulset := range statefulsets {
   176  		switch statefulset.Name {
   177  		case resources.GetMetaName(vmo.Name, config.ElasticsearchMaster.Name):
   178  			verifyElasticSearchDevProfile(t, vmo, statefulset, elasticSearchReplicas, storageSize)
   179  		default:
   180  			t.Error("Unknown Deployment Name: " + statefulset.Name)
   181  		}
   182  	}
   183  }
   184  
   185  // Verify the Statefulset used by Elasticsearch master
   186  func verifyElasticSearch(t *testing.T, vmo *vmcontrollerv1.VerrazzanoMonitoringInstance,
   187  	sts *appsv1.StatefulSet, replicas int32, storageSize string) {
   188  
   189  	assert := assert.New(t)
   190  	const esMasterVolName = "elasticsearch-master"
   191  	const esMasterData = "/usr/share/opensearch/data"
   192  
   193  	assert.Equal(*resources.NewVal(replicas), *sts.Spec.Replicas, "Incorrect Elasticsearch MasterNodes replicas count")
   194  	affin := resources.CreateZoneAntiAffinityElement(vmo.Name, config.ElasticsearchMaster.Name)
   195  	assert.Equal(affin, sts.Spec.Template.Spec.Affinity, "Incorrect Elasticsearch affinity")
   196  	var elasticsearchUID int64 = 1000
   197  	assert.Equal(elasticsearchUID, *sts.Spec.Template.Spec.Containers[0].SecurityContext.RunAsUser,
   198  		"Incorrect Elasticsearch.SecurityContext.RunAsUser")
   199  
   200  	assert.Len(sts.Spec.Template.Spec.Containers, 1, "Incorrect number of Containers")
   201  	assert.Len(sts.Spec.Template.Spec.Containers[0].Ports, 2, "Incorrect number of Ports")
   202  	assert.Equal("transport", sts.Spec.Template.Spec.Containers[0].Ports[0].Name, "Incorrect Container Port")
   203  	assert.Zero(sts.Spec.Template.Spec.Containers[0].Ports[0].HostPort, "Incorrect Container HostPort")
   204  	assert.Equal(int32(constants.OSTransportPort), sts.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort, "Incorrect Container HostPort")
   205  	assert.Equal("http", sts.Spec.Template.Spec.Containers[0].Ports[1].Name, "Incorrect Container Port")
   206  	assert.Zero(sts.Spec.Template.Spec.Containers[0].Ports[1].HostPort, "Incorrect Container HostPort")
   207  	assert.Equal(int32(constants.OSHTTPPort), sts.Spec.Template.Spec.Containers[0].Ports[1].ContainerPort, "Incorrect Container HostPort")
   208  
   209  	env := sts.Spec.Template.Spec.Containers[0].Env
   210  	assert.Len(env, 10, "Incorrect number of Env Vars")
   211  	assert.Equal("node.name", env[0].Name, "Incorrect Env[0].Name")
   212  	assert.Equal("metadata.name", env[0].ValueFrom.FieldRef.FieldPath,
   213  		"Incorrect Env[0].ValueFrom")
   214  	assert.Equal("cluster.name", env[1].Name, "Incorrect Env[1].Name")
   215  	assert.Equal(vmo.Name, env[1].Value, "Incorrect Env[1].Value")
   216  	assert.Equal("HTTP_ENABLE", env[2].Name, "Incorrect Env[2].Name")
   217  	assert.Equal("true", env[2].Value, "Incorrect Env[2].Value")
   218  	assert.Equal("logger.org.opensearch", env[3].Name, "Incorrect Env[3].Name")
   219  	assert.Equal("info", env[3].Value, "Incorrect Env[3].Value")
   220  	assert.Equal(constants.ObjectStoreAccessKeyVarName, env[4].Name, "Incorrect Env[4].Name")
   221  	assert.Equal(constants.ObjectStoreAccessKey, env[4].ValueFrom.SecretKeyRef.Key, "Incorrect Env[4] Secret Key name")
   222  	assert.Equal(constants.VerrazzanoBackupScrtName, env[4].ValueFrom.SecretKeyRef.Name, "Incorrect Env[4] Secret name")
   223  	assert.Equal(constants.ObjectStoreCustomerKeyVarName, env[5].Name, "Incorrect Env[5].Name")
   224  	assert.Equal(constants.ObjectStoreCustomerKey, env[5].ValueFrom.SecretKeyRef.Key, "Incorrect Env[5] Secret Key name")
   225  	assert.Equal(constants.VerrazzanoBackupScrtName, env[5].ValueFrom.SecretKeyRef.Name, "Incorrect Env[5] Secret name")
   226  	assert.Equal("OPENSEARCH_JAVA_OPTS", env[6].Name, "Incorrect Env[6].Name")
   227  	assert.Equal("-Xms700m -Xmx700m", env[6].Value, "Incorrect Env[6].Value")
   228  	assert.Equal("node.roles", env[7].Name, "Incorrect Env[7].Name")
   229  	assert.Equal("master,data,ingest", env[7].Value, "Incorrect Env[7].Value")
   230  	assert.Equal("discovery.seed_hosts", env[8].Name, "Incorrect Env[8].Name")
   231  	assert.Equal(resources.GetMetaName(vmo.Name, config.ElasticsearchMaster.Name), env[8].Value, "Incorrect Env[7].Value")
   232  	assert.Equal("cluster.initial_master_nodes", env[9].Name, "Incorrect Env[9].Name")
   233  	assert.Equal("vmi-system-es-master-0,vmi-system-es-master-1,vmi-system-es-master-2", env[9].Value, "Incorrect Env[9].Value")
   234  
   235  	assert.Equal(int32(90), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.InitialDelaySeconds,
   236  		"Incorrect Readiness Probe InitialDelaySeconds")
   237  	assert.Equal(int32(3), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.SuccessThreshold,
   238  		"Incorrect Readiness Probe SuccessThreshold")
   239  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.PeriodSeconds,
   240  		"Incorrect Readiness Probe PeriodSeconds")
   241  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.TimeoutSeconds,
   242  		"Incorrect Readiness Probe TimeoutSeconds")
   243  
   244  	assert.Equal(int32(int32(config.ElasticsearchMaster.Port)), sts.Spec.Template.Spec.Containers[0].LivenessProbe.ProbeHandler.TCPSocket.Port.IntVal,
   245  		"Incorrect LivenessProbe Probe Port")
   246  	assert.Equal(int32(30), sts.Spec.Template.Spec.Containers[0].LivenessProbe.InitialDelaySeconds,
   247  		"Incorrect LivenessProbe Probe InitialDelaySeconds")
   248  	assert.Equal(int32(10), sts.Spec.Template.Spec.Containers[0].LivenessProbe.PeriodSeconds,
   249  		"Incorrect LivenessProbe Probe PeriodSeconds")
   250  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].LivenessProbe.TimeoutSeconds,
   251  		"Incorrect LivenessProbe Probe TimeoutSeconds")
   252  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].LivenessProbe.FailureThreshold,
   253  		"Incorrect LivenessProbe Probe FailureThreshold")
   254  
   255  	assert.Len(sts.Spec.Template.Spec.Containers[0].VolumeMounts, 1, "Incorrect number of VolumeMounts")
   256  	assert.Equal(esMasterVolName, sts.Spec.Template.Spec.Containers[0].VolumeMounts[0].Name, "Incorrect VolumeMount name")
   257  	assert.Equal(esMasterData, sts.Spec.Template.Spec.Containers[0].VolumeMounts[0].MountPath, "Incorrect VolumeMount mount path")
   258  
   259  	assert.Len(sts.Spec.Template.Spec.InitContainers, 1, "Incorrect number of InitContainers")
   260  	assert.Len(sts.Spec.Template.Spec.InitContainers[0].VolumeMounts, 1, "Incorrect number of VolumeMounts")
   261  	assert.Equal(esMasterVolName, sts.Spec.Template.Spec.InitContainers[0].VolumeMounts[0].Name, "Incorrect VolumeMount name")
   262  	assert.Equal(esMasterData, sts.Spec.Template.Spec.InitContainers[0].VolumeMounts[0].MountPath, "Incorrect VolumeMount mount path")
   263  
   264  	assert.Len(sts.Spec.VolumeClaimTemplates, 1, "Incorrect number of VolumeClaimTemplates")
   265  	assert.Equal(sts.Spec.VolumeClaimTemplates[0].ObjectMeta.Name, esMasterVolName, "Incorrect VolumeClaimTemplate name")
   266  	assert.Equal(sts.Spec.VolumeClaimTemplates[0].ObjectMeta.Namespace, vmo.Namespace, "Incorrect VolumeClaimTemplate name")
   267  	assert.Len(sts.Spec.VolumeClaimTemplates[0].Spec.AccessModes, 1, "Incorrect number of VolumeClaimTemplate accesss modes")
   268  	assert.Equal(sts.Spec.VolumeClaimTemplates[0].Spec.AccessModes[0], corev1.ReadWriteOnce, "Incorrect VolumeClaimTemplate accesss modes")
   269  	assert.Equal(sts.Spec.VolumeClaimTemplates[0].Spec.Resources.Requests[corev1.ResourceStorage], resource.MustParse(storageSize),
   270  		"Incorrect VolumeClaimTemplate resource request size")
   271  }
   272  
   273  // Verify the Statefulset used by Elasticsearch master
   274  func verifyElasticSearchDevProfile(t *testing.T, vmo *vmcontrollerv1.VerrazzanoMonitoringInstance,
   275  	sts *appsv1.StatefulSet, replicas int32, storageSize string) {
   276  
   277  	assert := assert.New(t)
   278  	const esMasterVolName = "elasticsearch-master"
   279  	const esMasterData = "/usr/share/opensearch/data"
   280  
   281  	assert.Equal(nodes.RoleAssigned, sts.Spec.Template.ObjectMeta.Labels[nodes.RoleMaster])
   282  	assert.Equal(nodes.RoleAssigned, sts.Spec.Template.ObjectMeta.Labels[nodes.RoleData])
   283  	assert.Equal(nodes.RoleAssigned, sts.Spec.Template.ObjectMeta.Labels[nodes.RoleIngest])
   284  
   285  	assert.Equal(*resources.NewVal(int32(replicas)), *sts.Spec.Replicas, "Incorrect Elasticsearch MasterNodes replicas count")
   286  	affin := resources.CreateZoneAntiAffinityElement(vmo.Name, config.ElasticsearchMaster.Name)
   287  	assert.Equal(affin, sts.Spec.Template.Spec.Affinity, "Incorrect Elasticsearch affinity")
   288  	var elasticsearchUID int64 = 1000
   289  	assert.Equal(elasticsearchUID, *sts.Spec.Template.Spec.Containers[0].SecurityContext.RunAsUser,
   290  		"Incorrect Elasticsearch.SecurityContext.RunAsUser")
   291  
   292  	assert.Len(sts.Spec.Template.Spec.Containers, 1, "Incorrect number of Containers")
   293  	assert.Len(sts.Spec.Template.Spec.Containers[0].Ports, 2, "Incorrect number of Ports")
   294  	assert.Equal("transport", sts.Spec.Template.Spec.Containers[0].Ports[0].Name, "Incorrect Container Port")
   295  	assert.Zero(sts.Spec.Template.Spec.Containers[0].Ports[0].HostPort, "Incorrect Container HostPort")
   296  	assert.Equal(int32(constants.OSTransportPort), sts.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort, "Incorrect Container HostPort")
   297  	assert.Equal("http", sts.Spec.Template.Spec.Containers[0].Ports[1].Name, "Incorrect Container Port")
   298  	assert.Zero(sts.Spec.Template.Spec.Containers[0].Ports[1].HostPort, "Incorrect Container HostPort")
   299  	assert.Equal(int32(constants.OSHTTPPort), sts.Spec.Template.Spec.Containers[0].Ports[1].ContainerPort, "Incorrect Container HostPort")
   300  
   301  	env := sts.Spec.Template.Spec.Containers[0].Env
   302  	assert.Len(env, 9, "Incorrect number of Env Vars")
   303  	assert.Equal("node.name", env[0].Name, "Incorrect Env[0].Name")
   304  	assert.Equal("metadata.name", env[0].ValueFrom.FieldRef.FieldPath,
   305  		"Incorrect Env[0].ValueFrom")
   306  	assert.Equal("cluster.name", env[1].Name, "Incorrect Env[2].Name")
   307  	assert.Equal(vmo.Name, env[1].Value, "Incorrect Env[2].Value")
   308  	assert.Equal("HTTP_ENABLE", env[2].Name, "Incorrect Env[3].Name")
   309  	assert.Equal("true", env[2].Value, "Incorrect Env[3].Value")
   310  	assert.Equal("logger.org.opensearch", env[3].Name, "Incorrect Env[4].Name")
   311  	assert.Equal("info", env[3].Value, "Incorrect Env[4].Value")
   312  	assert.Equal(constants.ObjectStoreAccessKeyVarName, env[4].Name, "Incorrect Env[5].Name")
   313  	assert.Equal(constants.ObjectStoreAccessKey, env[4].ValueFrom.SecretKeyRef.Key, "Incorrect Env[5] Secret Key name")
   314  	assert.Equal(constants.VerrazzanoBackupScrtName, env[4].ValueFrom.SecretKeyRef.Name, "Incorrect Env[5] Secret name")
   315  	assert.Equal(constants.ObjectStoreCustomerKeyVarName, env[5].Name, "Incorrect Env[6].Name")
   316  	assert.Equal(constants.ObjectStoreCustomerKey, env[5].ValueFrom.SecretKeyRef.Key, "Incorrect Env[6] Secret Key name")
   317  	assert.Equal(constants.VerrazzanoBackupScrtName, env[5].ValueFrom.SecretKeyRef.Name, "Incorrect Env[6] Secret name")
   318  	assert.Equal("OPENSEARCH_JAVA_OPTS", env[6].Name, "Incorrect Env[6].Name")
   319  	assert.Equal("-Xms700m -Xmx700m", env[6].Value, "Incorrect Env[6].Value")
   320  	assert.Equal("node.roles", env[7].Name, "Incorrect Env[7].Name")
   321  	assert.Equal("master,data,ingest", env[7].Value, "Incorrect Env[7].Value")
   322  	assert.Equal("discovery.type", env[8].Name, "Incorrect Env[8].Name")
   323  	assert.Equal("single-node", env[8].Value, "Incorrect Env[8].Value")
   324  
   325  	assert.Equal(int32(90), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.InitialDelaySeconds,
   326  		"Incorrect Readiness Probe InitialDelaySeconds")
   327  	assert.Equal(int32(3), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.SuccessThreshold,
   328  		"Incorrect Readiness Probe SuccessThreshold")
   329  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.PeriodSeconds,
   330  		"Incorrect Readiness Probe PeriodSeconds")
   331  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].ReadinessProbe.TimeoutSeconds,
   332  		"Incorrect Readiness Probe TimeoutSeconds")
   333  
   334  	assert.Equal(int32(int32(config.ElasticsearchMaster.Port)), sts.Spec.Template.Spec.Containers[0].LivenessProbe.ProbeHandler.TCPSocket.Port.IntVal,
   335  		"Incorrect LivenessProbe Probe Port")
   336  	assert.Equal(int32(30), sts.Spec.Template.Spec.Containers[0].LivenessProbe.InitialDelaySeconds,
   337  		"Incorrect LivenessProbe Probe InitialDelaySeconds")
   338  	assert.Equal(int32(10), sts.Spec.Template.Spec.Containers[0].LivenessProbe.PeriodSeconds,
   339  		"Incorrect LivenessProbe Probe PeriodSeconds")
   340  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].LivenessProbe.TimeoutSeconds,
   341  		"Incorrect LivenessProbe Probe TimeoutSeconds")
   342  	assert.Equal(int32(5), sts.Spec.Template.Spec.Containers[0].LivenessProbe.FailureThreshold,
   343  		"Incorrect LivenessProbe Probe FailureThreshold")
   344  
   345  	assert.Len(sts.Spec.Template.Spec.Containers[0].VolumeMounts, 1, "Incorrect number of VolumeMounts")
   346  	assert.Equal(esMasterVolName, sts.Spec.Template.Spec.Containers[0].VolumeMounts[0].Name, "Incorrect VolumeMount name")
   347  	assert.Equal(esMasterData, sts.Spec.Template.Spec.Containers[0].VolumeMounts[0].MountPath, "Incorrect VolumeMount mount path")
   348  
   349  	assert.Len(sts.Spec.Template.Spec.InitContainers, 1, "Incorrect number of InitContainers")
   350  	assert.Len(sts.Spec.Template.Spec.InitContainers[0].VolumeMounts, 1, "Incorrect number of VolumeMounts")
   351  	assert.Equal(esMasterVolName, sts.Spec.Template.Spec.InitContainers[0].VolumeMounts[0].Name, "Incorrect VolumeMount name")
   352  	assert.Equal(esMasterData, sts.Spec.Template.Spec.InitContainers[0].VolumeMounts[0].MountPath, "Incorrect VolumeMount mount path")
   353  	assert.Len(sts.Spec.VolumeClaimTemplates, 0, "Incorrect number of VolumeClaimTemplates")
   354  
   355  	volumes := sts.Spec.Template.Spec.Volumes
   356  	assert.Len(volumes, 1)
   357  	assert.Equal(esMasterVolName, volumes[0].Name, "Incorrect name for master volume")
   358  	volumeSource := volumes[0].VolumeSource
   359  	assert.NotNil(volumeSource.EmptyDir, "volumeSource should be EmptyDir")
   360  }
   361  
   362  func TestCreateMultiMasterWithStorage(t *testing.T) {
   363  	vmi := &vmcontrollerv1.VerrazzanoMonitoringInstance{
   364  		ObjectMeta: metav1.ObjectMeta{
   365  			Name: "os",
   366  		},
   367  		Spec: vmcontrollerv1.VerrazzanoMonitoringInstanceSpec{
   368  			Elasticsearch: vmcontrollerv1.Elasticsearch{
   369  				Enabled: true,
   370  				Nodes: []vmcontrollerv1.ElasticsearchNode{
   371  					{
   372  						Name:     "leader",
   373  						Replicas: 3,
   374  						Roles: []vmcontrollerv1.NodeRole{
   375  							vmcontrollerv1.MasterRole,
   376  							vmcontrollerv1.DataRole,
   377  							vmcontrollerv1.IngestRole,
   378  						},
   379  						Storage: &vmcontrollerv1.Storage{
   380  							Size: "3Gi",
   381  						},
   382  					},
   383  				},
   384  			},
   385  		},
   386  	}
   387  
   388  	initialMasterNodes := nodes.InitialMasterNodes(vmi.Name, nodes.MasterNodes(vmi))
   389  	result, err := New(vzlog.DefaultLogger(), vmi, &storageClass, initialMasterNodes)
   390  	assert.NoError(t, err)
   391  	assert.Equal(t, 1, len(result))
   392  	sts := result[0]
   393  	// Storage should be configured
   394  	assert.Equal(t, "3Gi", sts.Spec.VolumeClaimTemplates[0].Spec.Resources.Requests.Storage().String())
   395  
   396  	// Expected labels must be present
   397  	assert.Equal(t, nodes.RoleAssigned, sts.Spec.Template.Labels[nodes.RoleMaster])
   398  	assert.Equal(t, nodes.RoleAssigned, sts.Spec.Template.Labels[nodes.RoleData])
   399  	assert.Equal(t, nodes.RoleAssigned, sts.Spec.Template.Labels[nodes.RoleIngest])
   400  	assert.Equal(t, constants.ComponentOpenSearchValue, sts.Spec.Template.Labels[constants.ComponentLabel])
   401  }