forked from loft-sh/vcluster-sdk
/
cluster_translator.go
120 lines (102 loc) · 3.94 KB
/
cluster_translator.go
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package translator
import (
context2 "context"
"crypto/sha256"
"encoding/hex"
"github.com/TylerGillson/vcluster-sdk/clienthelper"
"github.com/TylerGillson/vcluster-sdk/syncer/context"
"github.com/TylerGillson/vcluster-sdk/translate"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)
const (
IndexByPhysicalName = "IndexByPhysicalName"
)
func NewClusterTranslator(ctx *context.RegisterContext, name string, obj client.Object, nameTranslator PhysicalNameTranslator, excludedAnnotations ...string) Translator {
return &clusterTranslator{
name: name,
physicalNamespace: ctx.TargetNamespace,
excludedAnnotations: excludedAnnotations,
virtualClient: ctx.VirtualManager.GetClient(),
obj: obj,
nameTranslator: nameTranslator,
}
}
type clusterTranslator struct {
name string
physicalNamespace string
virtualClient client.Client
obj client.Object
nameTranslator PhysicalNameTranslator
excludedAnnotations []string
}
func (n *clusterTranslator) Name() string {
return n.name
}
func (n *clusterTranslator) Resource() client.Object {
return n.obj.DeepCopyObject().(client.Object)
}
func (n *clusterTranslator) IsManaged(pObj client.Object) (bool, error) {
return translate.IsManagedCluster(n.physicalNamespace, pObj), nil
}
func (n *clusterTranslator) VirtualToPhysical(req types.NamespacedName, vObj client.Object) types.NamespacedName {
return types.NamespacedName{
Name: n.nameTranslator(req.Name, vObj),
}
}
func (n *clusterTranslator) PhysicalToVirtual(pObj client.Object) types.NamespacedName {
pAnnotations := pObj.GetAnnotations()
if pAnnotations != nil && pAnnotations[NameAnnotation] != "" {
return types.NamespacedName{
Namespace: pAnnotations[NamespaceAnnotation],
Name: pAnnotations[NameAnnotation],
}
}
vObj := n.obj.DeepCopyObject().(client.Object)
err := clienthelper.GetByIndex(context2.Background(), n.virtualClient, vObj, IndexByPhysicalName, pObj.GetName())
if err != nil {
return types.NamespacedName{}
}
return types.NamespacedName{
Namespace: vObj.GetNamespace(),
Name: vObj.GetName(),
}
}
func (n *clusterTranslator) TranslateMetadata(vObj client.Object) client.Object {
pObj, err := setupMetadataWithName(n.physicalNamespace, vObj, n.nameTranslator)
if err != nil {
return nil
}
pObj.SetLabels(n.TranslateLabels(vObj, nil))
pObj.SetAnnotations(n.TranslateAnnotations(vObj, nil))
return pObj
}
func (n *clusterTranslator) TranslateMetadataUpdate(vObj client.Object, pObj client.Object) (changed bool, annotations map[string]string, labels map[string]string) {
updatedAnnotations := n.TranslateAnnotations(vObj, pObj)
updatedLabels := n.TranslateLabels(vObj, pObj)
return !equality.Semantic.DeepEqual(updatedAnnotations, pObj.GetAnnotations()) || !equality.Semantic.DeepEqual(updatedLabels, pObj.GetLabels()), updatedAnnotations, updatedLabels
}
func (n *clusterTranslator) TranslateLabels(vObj client.Object, pObj client.Object) map[string]string {
newLabels := map[string]string{}
if vObj != nil {
for k, v := range vObj.GetLabels() {
newLabels[convertNamespacedLabelKey(n.physicalNamespace, k)] = v
}
}
if pObj != nil {
pObjLabels := pObj.GetLabels()
if pObjLabels != nil && pObjLabels[translate.ControllerLabel] != "" {
newLabels[translate.ControllerLabel] = pObjLabels[translate.ControllerLabel]
}
}
newLabels[translate.MarkerLabel] = translate.SafeConcatName(n.physicalNamespace, "x", translate.Suffix)
return newLabels
}
func (n *clusterTranslator) TranslateAnnotations(vObj client.Object, pObj client.Object) map[string]string {
return translateAnnotations(vObj, pObj, n.excludedAnnotations)
}
func convertNamespacedLabelKey(physicalNamespace, key string) string {
digest := sha256.Sum256([]byte(key))
return translate.SafeConcatName(LabelPrefix, physicalNamespace, "x", translate.Suffix, "x", hex.EncodeToString(digest[0:])[0:10])
}