mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
67 lines
1.8 KiB
Go
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),
|
|
}
|
|
}
|