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 }