105 lines
3.5 KiB
Go
105 lines
3.5 KiB
Go
package resources
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/jenkinsci/kubernetes-operator/api/v1alpha2"
|
|
"github.com/jenkinsci/kubernetes-operator/pkg/constants"
|
|
|
|
stackerr "github.com/pkg/errors"
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/util/intstr"
|
|
)
|
|
|
|
// ServiceKind the kind name for Service
|
|
const ServiceKind = "Service"
|
|
|
|
// UpdateService returns new service with override fields from config
|
|
func UpdateService(actual corev1.Service, config v1alpha2.Service, targetPort int32) corev1.Service {
|
|
actual.ObjectMeta.Annotations = config.Annotations
|
|
for key, value := range config.Labels {
|
|
actual.ObjectMeta.Labels[key] = value
|
|
}
|
|
actual.Spec.Type = config.Type
|
|
actual.Spec.LoadBalancerIP = config.LoadBalancerIP
|
|
actual.Spec.LoadBalancerSourceRanges = config.LoadBalancerSourceRanges
|
|
if len(actual.Spec.Ports) == 0 {
|
|
actual.Spec.Ports = []corev1.ServicePort{{}}
|
|
}
|
|
actual.Spec.Ports[0].Port = config.Port
|
|
actual.Spec.Ports[0].TargetPort = intstr.IntOrString{IntVal: targetPort, Type: intstr.Int}
|
|
if config.NodePort != 0 {
|
|
actual.Spec.Ports[0].NodePort = config.NodePort
|
|
}
|
|
|
|
return actual
|
|
}
|
|
|
|
// GetJenkinsHTTPServiceName returns Kubernetes service name used for expose Jenkins HTTP endpoint
|
|
func GetJenkinsHTTPServiceName(jenkins *v1alpha2.Jenkins) string {
|
|
return fmt.Sprintf("%s-http-%s", constants.OperatorName, jenkins.ObjectMeta.Name)
|
|
}
|
|
|
|
// GetJenkinsSlavesServiceName returns Kubernetes service name used for expose Jenkins slave endpoint
|
|
func GetJenkinsSlavesServiceName(jenkins *v1alpha2.Jenkins) string {
|
|
return fmt.Sprintf("%s-slave-%s", constants.OperatorName, jenkins.ObjectMeta.Name)
|
|
}
|
|
|
|
// GetJenkinsHTTPServiceFQDN returns Kubernetes service FQDN used for expose Jenkins HTTP endpoint
|
|
func GetJenkinsHTTPServiceFQDN(jenkins *v1alpha2.Jenkins, kubernetesClusterDomain string) (string, error) {
|
|
clusterDomain, err := getClusterDomain(kubernetesClusterDomain)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fmt.Sprintf("%s-http-%s.%s.svc.%s", constants.OperatorName, jenkins.ObjectMeta.Name, jenkins.ObjectMeta.Namespace, clusterDomain), nil
|
|
}
|
|
|
|
// GetJenkinsSlavesServiceFQDN returns Kubernetes service FQDN used for expose Jenkins slave endpoint
|
|
func GetJenkinsSlavesServiceFQDN(jenkins *v1alpha2.Jenkins, kubernetesClusterDomain string) (string, error) {
|
|
clusterDomain, err := getClusterDomain(kubernetesClusterDomain)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fmt.Sprintf("%s-slave-%s.%s.svc.%s", constants.OperatorName, jenkins.ObjectMeta.Name, jenkins.ObjectMeta.Namespace, clusterDomain), nil
|
|
}
|
|
|
|
// GetClusterDomain returns Kubernetes cluster domain, default to "cluster.local"
|
|
func getClusterDomain(kubernetesClusterDomain string) (string, error) {
|
|
isRunningInCluster, err := IsRunningInCluster()
|
|
if !isRunningInCluster {
|
|
return kubernetesClusterDomain, nil
|
|
}
|
|
if err != nil {
|
|
return "", nil
|
|
}
|
|
|
|
apiSvc := "kubernetes.default.svc"
|
|
|
|
cname, err := net.LookupCNAME(apiSvc)
|
|
if err != nil {
|
|
return "", stackerr.WithStack(err)
|
|
}
|
|
|
|
kubernetesClusterDomain = strings.TrimPrefix(cname, "kubernetes.default.svc")
|
|
kubernetesClusterDomain = strings.TrimPrefix(kubernetesClusterDomain, ".")
|
|
kubernetesClusterDomain = strings.TrimSuffix(kubernetesClusterDomain, ".")
|
|
|
|
return kubernetesClusterDomain, nil
|
|
}
|
|
|
|
func IsRunningInCluster() (bool, error) {
|
|
const inClusterNamespacePath = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
|
|
_, err := os.Stat(inClusterNamespacePath)
|
|
if os.IsNotExist(err) {
|
|
return false, nil
|
|
} else if err == nil {
|
|
return true, nil
|
|
}
|
|
return false, err
|
|
}
|