github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/controller/builder/builder_service.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package builder 21 22 import ( 23 corev1 "k8s.io/api/core/v1" 24 "k8s.io/apimachinery/pkg/util/intstr" 25 ) 26 27 type ServiceBuilder struct { 28 BaseBuilder[corev1.Service, *corev1.Service, ServiceBuilder] 29 } 30 31 func NewServiceBuilder(namespace, name string) *ServiceBuilder { 32 builder := &ServiceBuilder{} 33 builder.init(namespace, name, &corev1.Service{}, builder) 34 return builder 35 } 36 37 func NewHeadlessServiceBuilder(namespace, name string) *ServiceBuilder { 38 builder := &ServiceBuilder{} 39 builder.init(namespace, name, &corev1.Service{}, builder) 40 builder.SetType(corev1.ServiceTypeClusterIP) 41 builder.get().Spec.ClusterIP = corev1.ClusterIPNone 42 return builder 43 } 44 45 func (builder *ServiceBuilder) AddSelector(key, value string) *ServiceBuilder { 46 keyValues := make(map[string]string, 1) 47 keyValues[key] = value 48 return builder.AddSelectorsInMap(keyValues) 49 } 50 51 func (builder *ServiceBuilder) AddSelectors(keyValues ...string) *ServiceBuilder { 52 return builder.AddSelectorsInMap(WithMap(keyValues...)) 53 } 54 55 func (builder *ServiceBuilder) AddSelectorsInMap(keyValues map[string]string) *ServiceBuilder { 56 selectors := builder.get().Spec.Selector 57 if selectors == nil { 58 selectors = make(map[string]string, 0) 59 } 60 for k, v := range keyValues { 61 selectors[k] = v 62 } 63 builder.get().Spec.Selector = selectors 64 return builder 65 } 66 67 func (builder *ServiceBuilder) AddPorts(ports ...corev1.ServicePort) *ServiceBuilder { 68 portList := builder.get().Spec.Ports 69 if portList == nil { 70 portList = make([]corev1.ServicePort, 0) 71 } 72 portList = append(portList, ports...) 73 builder.get().Spec.Ports = portList 74 return builder 75 } 76 77 func (builder *ServiceBuilder) AddContainerPorts(ports ...corev1.ContainerPort) *ServiceBuilder { 78 servicePorts := make([]corev1.ServicePort, 0) 79 for _, containerPort := range ports { 80 servicePort := corev1.ServicePort{ 81 Name: containerPort.Name, 82 Protocol: containerPort.Protocol, 83 Port: containerPort.ContainerPort, 84 TargetPort: intstr.FromString(containerPort.Name), 85 } 86 servicePorts = append(servicePorts, servicePort) 87 } 88 return builder.AddPorts(servicePorts...) 89 } 90 91 func (builder *ServiceBuilder) SetType(serviceType corev1.ServiceType) *ServiceBuilder { 92 if serviceType == "" { 93 return builder 94 } 95 builder.get().Spec.Type = serviceType 96 if serviceType == corev1.ServiceTypeLoadBalancer { 97 // Set externalTrafficPolicy to Local has two benefits: 98 // 1. preserve client IP 99 // 2. improve network performance by reducing one hop 100 builder.get().Spec.ExternalTrafficPolicy = corev1.ServiceExternalTrafficPolicyTypeLocal 101 } 102 return builder 103 }