func()

in iotdb-operator/internal/controller/datanode_controller.go [243:359]


func (r *DataNodeReconciler) constructServiceForDataNode(dataNode *iotdbv1.DataNode) ([]corev1.Service, error) {
	headlessService := &corev1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      DataNodeName + "-headless",
			Namespace: dataNode.Namespace,
			Labels:    map[string]string{"app": DataNodeName},
		},
		Spec: corev1.ServiceSpec{
			ClusterIP: "None",
			Ports: []corev1.ServicePort{
				{
					Name:       "dn-internal-port",
					Port:       10730,
					TargetPort: intstr.FromInt32(10730),
				},
				{
					Name:       "dn-mpp-data-exchange-port",
					Port:       10740,
					TargetPort: intstr.FromInt32(10750),
				},
				{
					Name:       "dn-data-region-consensus-port",
					Port:       10760,
					TargetPort: intstr.FromInt32(10760),
				},
				{
					Name:       "dn-schema-region-consensus-port",
					Port:       10750,
					TargetPort: intstr.FromInt32(10750),
				},
				{
					Name:       "dn-rpc-port",
					Port:       6667,
					TargetPort: intstr.FromInt32(6667),
				},
				{
					Name:       "rest-service-port",
					Port:       18080,
					TargetPort: intstr.FromInt32(18080),
				},
				{
					Name:       "dn-metric-prometheus-reporter-port",
					Port:       9092,
					TargetPort: intstr.FromInt32(9092),
				},
			},
			Selector: map[string]string{
				"app": DataNodeName,
			},
		},
	}
	err := SetControllerReference(dataNode, headlessService, r.Scheme)
	if err != nil {
		return nil, err
	}

	services := []corev1.Service{*headlessService}

	if dataNode.Spec.Service != nil && len(dataNode.Spec.Service.Ports) > 0 {
		ports := make([]corev1.ServicePort, len(dataNode.Spec.Service.Ports))
		i := 0
		for key, value := range dataNode.Spec.Service.Ports {
			port := value
			if key == "dn_metric_prometheus_reporter_port" {
				port = 9092
				ports[i] = corev1.ServicePort{
					Name:       strutil.ToKebabCase(key),
					Port:       port,
					NodePort:   value,
					TargetPort: intstr.FromInt32(port),
				}
				i++
			} else if key == "rest_service_port" {
				port = 18080
				ports[i] = corev1.ServicePort{
					Name:       strutil.ToKebabCase(key),
					Port:       port,
					NodePort:   value,
					TargetPort: intstr.FromInt32(port),
				}
				i++
			} else if key == "dn_rpc_port" {
				port = 6667
				ports[i] = corev1.ServicePort{
					Name:       strutil.ToKebabCase(key),
					Port:       port,
					NodePort:   value,
					TargetPort: intstr.FromInt32(port),
				}
				i++
			}
		}
		if i > 0 {
			nodePorts := ports[0:i]
			nodePortService := &corev1.Service{
				ObjectMeta: metav1.ObjectMeta{
					Name:      DataNodeName,
					Namespace: dataNode.Namespace,
					Labels:    map[string]string{"app": DataNodeName},
				},
				Spec: corev1.ServiceSpec{
					Type:  corev1.ServiceType(dataNode.Spec.Service.Type),
					Ports: nodePorts,
					Selector: map[string]string{
						"app": DataNodeName,
					},
				},
			}
			err := SetControllerReference(dataNode, nodePortService, r.Scheme)
			if err != nil {
				return nil, err
			}
			services = append(services, *nodePortService)
		}
	}
	return services, nil
}