github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/resources/services/elasticsearch_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 services 5 6 import ( 7 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources/nodes" 8 corev1 "k8s.io/api/core/v1" 9 "testing" 10 11 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/config" 12 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/constants" 13 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources" 14 "k8s.io/apimachinery/pkg/util/intstr" 15 16 "github.com/stretchr/testify/assert" 17 vmcontrollerv1 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/apis/vmcontroller/v1" 18 v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 19 ) 20 21 func TestOpenSearchServices1(t *testing.T) { 22 vmo := &vmcontrollerv1.VerrazzanoMonitoringInstance{ 23 ObjectMeta: v1.ObjectMeta{ 24 Name: "myVMO", 25 }, 26 Spec: vmcontrollerv1.VerrazzanoMonitoringInstanceSpec{ 27 Elasticsearch: vmcontrollerv1.Elasticsearch{ 28 IngestNode: vmcontrollerv1.ElasticsearchNode{Replicas: 5}, 29 MasterNode: vmcontrollerv1.ElasticsearchNode{Replicas: 4}, 30 DataNode: vmcontrollerv1.ElasticsearchNode{Replicas: 3}, 31 Enabled: true, 32 }, 33 }, 34 } 35 services := createOpenSearchServiceElements(vmo, false) 36 assert.Equal(t, 4, len(services), "Length of generated services") 37 } 38 39 func TestOpenSearchDevProfileDefaultServices(t *testing.T) { 40 vmo := createDevProfileOS() 41 42 services := createOpenSearchServiceElements(vmo, false) 43 assert.Equal(t, 4, len(services), "Length of generated services") 44 45 masterService := services[0] 46 masterHTTPService := services[1] 47 dataService := services[2] 48 ingestService := services[3] 49 50 expectedSelector := resources.GetSpecID(vmo.Name, config.ElasticsearchMaster.Name) 51 52 assert.Equal(t, ingestService.Spec.Selector, expectedSelector) 53 assert.EqualValues(t, ingestService.Spec.Ports[0].Port, constants.OSHTTPPort) 54 55 assert.EqualValues(t, masterService.Spec.Ports[0].Port, constants.OSTransportPort) 56 57 assert.EqualValues(t, dataService.Spec.Ports[0].Port, constants.OSHTTPPort) 58 assert.Equal(t, dataService.Spec.Ports[0].TargetPort, intstr.FromInt(constants.OSHTTPPort)) 59 assert.Equal(t, dataService.Spec.Selector, expectedSelector) 60 61 assert.EqualValues(t, constants.OSHTTPPort, masterHTTPService.Spec.Ports[0].Port) 62 assert.EqualValues(t, intstr.FromInt(constants.OSHTTPPort), masterHTTPService.Spec.Ports[0].TargetPort) 63 } 64 65 func TestCreateOpenSearchServicesWithNodeRoles(t *testing.T) { 66 vmo := createDevProfileOS() 67 services := createOpenSearchServiceElements(vmo, true) 68 assert.Equal(t, 4, len(services)) 69 assert.EqualValues(t, map[string]string{nodes.RoleMaster: nodes.RoleAssigned}, services[0].Spec.Selector) 70 assert.EqualValues(t, map[string]string{nodes.RoleMaster: nodes.RoleAssigned}, services[1].Spec.Selector) 71 assert.EqualValues(t, map[string]string{nodes.RoleData: nodes.RoleAssigned}, services[2].Spec.Selector) 72 assert.EqualValues(t, map[string]string{nodes.RoleIngest: nodes.RoleAssigned}, services[3].Spec.Selector) 73 } 74 75 func createDevProfileOS() *vmcontrollerv1.VerrazzanoMonitoringInstance { 76 vmo := &vmcontrollerv1.VerrazzanoMonitoringInstance{ 77 ObjectMeta: v1.ObjectMeta{ 78 Name: "myDevVMO", 79 }, 80 Spec: vmcontrollerv1.VerrazzanoMonitoringInstanceSpec{ 81 Elasticsearch: vmcontrollerv1.Elasticsearch{ 82 Enabled: true, 83 Storage: vmcontrollerv1.Storage{Size: ""}, 84 MasterNode: vmcontrollerv1.ElasticsearchNode{ 85 Replicas: 1, 86 Roles: []vmcontrollerv1.NodeRole{ 87 vmcontrollerv1.MasterRole, 88 vmcontrollerv1.IngestRole, 89 vmcontrollerv1.DataRole, 90 }, 91 }, 92 }, 93 }, 94 } 95 return vmo 96 } 97 98 func TestOpenSearchPodSelector(t *testing.T) { 99 selector := OpenSearchPodSelector("system") 100 expected := "app in (system-es-master, system-es-data, system-os-ingest)" 101 assert.Equal(t, expected, selector) 102 } 103 104 func createTestPod(labels map[string]string) corev1.Pod { 105 return corev1.Pod{ 106 ObjectMeta: v1.ObjectMeta{ 107 Labels: labels, 108 }, 109 } 110 } 111 112 func TestUseNodeRoleSelectors(t *testing.T) { 113 114 var tests = []struct { 115 name string 116 pods *corev1.PodList 117 useNodeRoleSelector bool 118 }{ 119 { 120 "use selector if no pods present", 121 &corev1.PodList{}, 122 true, 123 }, 124 { 125 "use selector if all pods match", 126 &corev1.PodList{ 127 Items: []corev1.Pod{ 128 createTestPod(map[string]string{nodes.RoleData: nodes.RoleAssigned}), 129 createTestPod(map[string]string{nodes.RoleMaster: nodes.RoleAssigned}), 130 createTestPod(map[string]string{nodes.RoleIngest: nodes.RoleAssigned}), 131 }, 132 }, 133 true, 134 }, 135 { 136 "use selector if all pods match using multi-role pods", 137 &corev1.PodList{ 138 Items: []corev1.Pod{ 139 createTestPod(map[string]string{ 140 nodes.RoleMaster: nodes.RoleAssigned, 141 nodes.RoleData: nodes.RoleAssigned, 142 nodes.RoleIngest: nodes.RoleAssigned, 143 }), 144 }, 145 }, 146 true, 147 }, 148 { 149 "don't use selector if no matching pods", 150 &corev1.PodList{ 151 Items: []corev1.Pod{ 152 createTestPod(map[string]string{}), 153 }, 154 }, 155 false, 156 }, 157 { 158 "don't use selector if only some pods match", 159 &corev1.PodList{ 160 Items: []corev1.Pod{ 161 createTestPod(map[string]string{nodes.RoleData: nodes.RoleAssigned}), 162 createTestPod(map[string]string{nodes.RoleMaster: nodes.RoleAssigned}), 163 createTestPod(map[string]string{nodes.RoleIngest: nodes.RoleAssigned}), 164 createTestPod(map[string]string{}), 165 }, 166 }, 167 false, 168 }, 169 } 170 171 for _, tt := range tests { 172 t.Run(tt.name, func(t *testing.T) { 173 assert.Equal(t, tt.useNodeRoleSelector, UseNodeRoleSelector(tt.pods)) 174 }) 175 } 176 }