/
model_converter.go
129 lines (103 loc) · 3.62 KB
/
model_converter.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
121
122
123
124
125
126
127
128
129
package model
import (
"encoding/base64"
"fmt"
"github.com/buger/jsonparser"
"github.com/google/uuid"
"github.com/khulnasoft/meshplay/meshkit/utils"
"github.com/khulnasoft/meshplay/meshsync/internal/config"
iutils "github.com/khulnasoft/meshplay/meshsync/pkg/utils"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
func ParseList(object unstructured.Unstructured) KubernetesResource {
data, _ := object.MarshalJSON()
result := KubernetesResource{}
_ = utils.Unmarshal(string(data), &result)
// ObjectMeta internal models
labels := make([]*KubernetesKeyValue, 0)
_ = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
labels = append(labels, &KubernetesKeyValue{
Kind: KindLabel,
Key: string(key),
Value: string(value),
})
if string(key) == config.PatternResourceIDLabelKey {
id, _ := uuid.FromBytes(value)
result.PatternResource = &id
}
return nil
}, "metadata", "labels")
result.KubernetesResourceMeta.Labels = labels
annotations := make([]*KubernetesKeyValue, 0)
_ = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
annotations = append(annotations, &KubernetesKeyValue{
Kind: KindAnnotation,
Key: string(key),
Value: string(value),
})
return nil
}, "metadata", "annotations")
result.KubernetesResourceMeta.Annotations = annotations
if finalizers, _, _, err := jsonparser.Get(data, "metadata", "finalizers"); err == nil {
result.KubernetesResourceMeta.Finalizers = string(finalizers)
}
if managedFields, _, _, err := jsonparser.Get(data, "metadata", "managedFields"); err == nil {
result.KubernetesResourceMeta.ManagedFields = string(managedFields)
}
if ownerReferences, _, _, err := jsonparser.Get(data, "metadata", "ownerReferences"); err == nil {
result.KubernetesResourceMeta.OwnerReferences = string(ownerReferences)
}
if spec, _, _, err := jsonparser.Get(data, "spec"); err == nil {
result.Spec.Attribute = string(spec)
}
if status, _, _, err := jsonparser.Get(data, "status"); err == nil {
result.Status.Attribute = string(status)
}
if immutable, _, _, err := jsonparser.Get(data, "immutable"); err == nil {
result.Immutable = string(immutable)
}
if objData, _, _, err := jsonparser.Get(data, "data"); err == nil {
result.Data = string(objData)
}
if binaryData, _, _, err := jsonparser.Get(data, "binaryData"); err == nil {
result.BinaryData = string(binaryData)
}
if stringData, _, _, err := jsonparser.Get(data, "stringData"); err == nil {
result.StringData = string(stringData)
}
if objType, _, _, err := jsonparser.Get(data, "type"); err == nil {
result.Type = string(objType)
}
result.ClusterID = iutils.GetClusterID()
return result
}
func IsObject(obj KubernetesResource) bool {
return obj.KubernetesResourceMeta != nil
}
func SetID(obj *KubernetesResource) {
if obj != nil && IsObject(*obj) {
id := base64.StdEncoding.EncodeToString([]byte(
fmt.Sprintf("%s.%s.%s.%s.%s", obj.ClusterID, obj.Kind, obj.APIVersion, obj.KubernetesResourceMeta.Namespace, obj.KubernetesResourceMeta.Name),
))
obj.ID = id
obj.KubernetesResourceMeta.ID = id
if len(obj.KubernetesResourceMeta.Labels) > 0 {
for _, label := range obj.KubernetesResourceMeta.Labels {
label.ID = id
label.UniqueID = uuid.New().String()
}
}
if len(obj.KubernetesResourceMeta.Annotations) > 0 {
for _, annotation := range obj.KubernetesResourceMeta.Annotations {
annotation.ID = id
annotation.UniqueID = uuid.New().String()
}
}
if obj.Spec != nil {
obj.Spec.ID = id
}
if obj.Status != nil {
obj.Status.ID = id
}
}
}