1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package kcp
import (
"cmp"
"strings"
)
const (
RootWorkspace = "root"
ClusterAnnotation = "kcp.io/cluster"
PathAnnotation = "kcp.io/path"
DefaultServiceDomain = "kcp.local"
ServiceSegment = "svc"
)
func ServiceLabels(logicalCluster string) string {
parts := strings.Split(logicalCluster, ":")
out := make([]string, 0, len(parts))
for i := len(parts) - 1; i >= 0; i-- {
if parts[i] == "" || parts[i] == RootWorkspace {
continue
}
out = append(out, parts[i])
}
return strings.Join(out, ".")
}
func ServiceFQDN(name, namespace, logicalCluster, domain string) string {
labels := ServiceLabels(logicalCluster)
namespace = cmp.Or(namespace, "default")
host := name + "." + namespace
if labels != "" {
host += "." + labels
}
return host + "." + ServiceSegment + "." + domain
}
func KindServiceHost(kind, logicalCluster string) string {
kind = strings.ToLower(strings.TrimSpace(kind))
if kind == "" {
return ""
}
return ServiceFQDN(kind, "default", logicalCluster, DefaultServiceDomain)
}
func HandlerURL(logicalCluster, kind, name string) string {
host := KindServiceHost(kind, logicalCluster)
if host == "" || strings.TrimSpace(name) == "" {
return ""
}
return "http://" + host
}