Files
PandaX/apps/devops/services/k8s/common/endpoint.go
2022-01-22 17:07:04 +08:00

67 lines
1.8 KiB
Go

package common
import (
"bytes"
api "k8s.io/api/core/v1"
)
// Endpoint describes an endpoint that is host and a list of available ports for that host.
type Endpoint struct {
// Hostname, either as a domain name or IP address.
Host string `json:"host"`
// List of ports opened for this endpoint on the hostname.
Ports []ServicePort `json:"ports"`
}
// GetExternalEndpoints returns endpoints that are externally reachable for a service.
func GetExternalEndpoints(service *api.Service) []Endpoint {
externalEndpoints := make([]Endpoint, 0)
if service.Spec.Type == api.ServiceTypeLoadBalancer {
for _, ingress := range service.Status.LoadBalancer.Ingress {
externalEndpoints = append(externalEndpoints, getExternalEndpoint(ingress, service.Spec.Ports))
}
}
for _, ip := range service.Spec.ExternalIPs {
externalEndpoints = append(externalEndpoints, Endpoint{
Host: ip,
Ports: GetServicePorts(service.Spec.Ports),
})
}
return externalEndpoints
}
// GetInternalEndpoint returns internal endpoint name for the given service properties, e.g.,
// "my-service.namespace 80/TCP" or "my-service 53/TCP,53/UDP".
func GetInternalEndpoint(serviceName, namespace string, ports []api.ServicePort) Endpoint {
name := serviceName
if namespace != api.NamespaceDefault && len(namespace) > 0 && len(serviceName) > 0 {
bufferName := bytes.NewBufferString(name)
bufferName.WriteString(".")
bufferName.WriteString(namespace)
name = bufferName.String()
}
return Endpoint{
Host: name,
Ports: GetServicePorts(ports),
}
}
// Returns external endpoint name for the given service properties.
func getExternalEndpoint(ingress api.LoadBalancerIngress, ports []api.ServicePort) Endpoint {
var host string
if ingress.Hostname != "" {
host = ingress.Hostname
} else {
host = ingress.IP
}
return Endpoint{
Host: host,
Ports: GetServicePorts(ports),
}
}