github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/resources/services/elasticsearch.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  	"fmt"
     8  	vmcontrollerv1 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/apis/vmcontroller/v1"
     9  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/config"
    10  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/constants"
    11  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources"
    12  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources/nodes"
    13  	corev1 "k8s.io/api/core/v1"
    14  	"k8s.io/apimachinery/pkg/util/intstr"
    15  )
    16  
    17  // Creates OpenSearch Client service element
    18  func createOpenSearchIngestServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service {
    19  	var openSearchIngestService = createServiceElement(vmo, config.OpensearchIngest)
    20  	if nodes.IsSingleNodeCluster(vmo) {
    21  		openSearchIngestService.Spec.Selector = resources.GetSpecID(vmo.Name, config.ElasticsearchMaster.Name)
    22  		// In dev mode, only a single node/pod all ingest/data goes to the 9200 port on the back end node
    23  		openSearchIngestService.Spec.Ports = []corev1.ServicePort{resources.GetServicePort(config.ElasticsearchData)}
    24  	}
    25  	return openSearchIngestService
    26  }
    27  
    28  // Creates OpenSearch MasterNodes service element
    29  func createOpenSearchMasterServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service {
    30  	openSearchMasterService := createServiceElement(vmo, config.ElasticsearchMaster)
    31  	if !nodes.IsSingleNodeCluster(vmo) {
    32  		// MasterNodes service is headless
    33  		openSearchMasterService.Spec.Type = corev1.ServiceTypeClusterIP
    34  		openSearchMasterService.Spec.ClusterIP = corev1.ClusterIPNone
    35  	}
    36  	return openSearchMasterService
    37  }
    38  
    39  // Creates OpenSearch DataNodes service element
    40  func createOpenSearchDataServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service {
    41  	var openSearchDataService = createServiceElement(vmo, config.ElasticsearchData)
    42  	if nodes.IsSingleNodeCluster(vmo) {
    43  		// In dev mode, only a single node/pod all ingest/data goes to the 9200 port on the back end node
    44  		openSearchDataService.Spec.Selector = resources.GetSpecID(vmo.Name, config.ElasticsearchMaster.Name)
    45  		openSearchDataService.Spec.Ports[0].TargetPort = intstr.FromInt(constants.OSHTTPPort)
    46  	}
    47  	return openSearchDataService
    48  }
    49  
    50  // Creates the master HTTP Service with Cluster IP
    51  func createMasterServiceHTTP(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service {
    52  	masterHTTPService := createServiceElement(vmo, config.ElasticsearchMaster)
    53  	masterHTTPService.Name = masterHTTPService.Name + "-http"
    54  	masterHTTPService.Spec.Ports[0].Name = "http-" + config.ElasticsearchMaster.Name
    55  	masterHTTPService.Spec.Ports[0].Port = constants.OSHTTPPort
    56  	masterHTTPService.Spec.Ports[0].TargetPort = intstr.FromInt(constants.OSHTTPPort)
    57  	return masterHTTPService
    58  }
    59  
    60  // Creates *all* OpenSearch service elements
    61  func createOpenSearchServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance, useNodeRoleSelectors bool) []*corev1.Service {
    62  	masterService := createOpenSearchMasterServiceElements(vmo)
    63  	masterServiceHTTP := createMasterServiceHTTP(vmo)
    64  	dataService := createOpenSearchDataServiceElements(vmo)
    65  	ingestService := createOpenSearchIngestServiceElements(vmo)
    66  
    67  	// if the cluster supports node role selectors, use those instead of service app selectors
    68  	if useNodeRoleSelectors {
    69  		masterService.Spec.Selector = map[string]string{nodes.RoleMaster: nodes.RoleAssigned}
    70  		masterServiceHTTP.Spec.Selector = map[string]string{nodes.RoleMaster: nodes.RoleAssigned}
    71  		dataService.Spec.Selector = map[string]string{nodes.RoleData: nodes.RoleAssigned}
    72  		ingestService.Spec.Selector = map[string]string{nodes.RoleIngest: nodes.RoleAssigned}
    73  	}
    74  
    75  	return []*corev1.Service{
    76  		masterService,
    77  		masterServiceHTTP,
    78  		dataService,
    79  		ingestService,
    80  	}
    81  }
    82  
    83  // OpenSearchPodSelector creates a pod selector like
    84  // 'app in (system-es-master, system-es-data, system-es-ingest)'
    85  // to select all pods in the vmi cluster
    86  func OpenSearchPodSelector(vmoName string) string {
    87  	return fmt.Sprintf("%s in (%s, %s, %s)",
    88  		constants.ServiceAppLabel,
    89  		fmt.Sprintf("%s-%s", vmoName, config.ElasticsearchMaster.Name),
    90  		fmt.Sprintf("%s-%s", vmoName, config.ElasticsearchData.Name),
    91  		fmt.Sprintf("%s-%s", vmoName, config.OpensearchIngest.Name),
    92  	)
    93  }
    94  
    95  // UseNodeRoleSelector verifies if all OpenSearch pods are using node role selectors.
    96  // If all pods are using node role selectors, this implies service selectors can be updated
    97  // to use node roles instead of service app labels.
    98  func UseNodeRoleSelector(pods *corev1.PodList) bool {
    99  	for _, pod := range pods.Items {
   100  		_, isData := pod.Labels[nodes.RoleData]
   101  		_, isIngest := pod.Labels[nodes.RoleIngest]
   102  		_, isMaster := pod.Labels[nodes.RoleMaster]
   103  
   104  		if !isData && !isIngest && !isMaster {
   105  			return false
   106  		}
   107  	}
   108  	return true
   109  }