1 package k8objectsutils
2
3 import (
4 "encoding/base64"
5 "encoding/json"
6 "fmt"
7
8 "edge-infra.dev/pkg/edge/api/utils"
9 clusterApi "edge-infra.dev/pkg/edge/apis/cluster/v1alpha1"
10 syncedobjectApi "edge-infra.dev/pkg/edge/apis/syncedobject/apis/v1alpha1"
11
12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13 "sigs.k8s.io/controller-runtime/pkg/client"
14 )
15
16 const (
17 SyncedObjectNameFormat = "%s-%s"
18 )
19
20 func NameWithPrefix(prefix, name string) string {
21 return fmt.Sprintf(SyncedObjectNameFormat, prefix, name)
22 }
23
24
25 func BuildClusterSyncedObject(cluster *clusterApi.Cluster, obj client.Object, prefix string) (*syncedobjectApi.SyncedObject, error) {
26 return BuildClusterSyncedObjectWithDir(cluster, obj, prefix, "")
27 }
28
29
30 func BuildClusterSyncedObjectWithDir(cluster *clusterApi.Cluster, obj client.Object, prefix, dir string) (*syncedobjectApi.SyncedObject, error) {
31 data, err := ToBase64JSONString(obj)
32 if err != nil {
33 return nil, err
34 }
35 return &syncedobjectApi.SyncedObject{
36 TypeMeta: metav1.TypeMeta{
37 Kind: "SyncedObject",
38 APIVersion: syncedobjectApi.GroupVersion.String(),
39 },
40 ObjectMeta: metav1.ObjectMeta{
41 Name: NameWithPrefix(prefix, cluster.Name),
42 Namespace: cluster.Name,
43 OwnerReferences: cluster.NewOwnerReference(),
44 },
45 Spec: syncedobjectApi.SyncedObjectSpec{
46 Banner: cluster.Spec.ProjectID,
47 Cluster: cluster.Name,
48 Object: data,
49 Directory: &dir,
50 },
51 }, nil
52 }
53
54
55 func ToBase64JSONString(obj client.Object) (string, error) {
56 data, err := json.Marshal(obj)
57 if err != nil {
58 return "", err
59 }
60 return base64.StdEncoding.EncodeToString(data), nil
61 }
62
63
64 func FromBase64JSONString(obj string, into client.Object) error {
65 data, err := base64.StdEncoding.DecodeString(obj)
66 if err != nil {
67 return err
68 }
69 return json.Unmarshal(data, into)
70 }
71
72
73 func BuildSyncedObject(obj client.Object, projectID, clusterEdgeID, namespace, name string) (*syncedobjectApi.SyncedObject, error) {
74 data, err := ToBase64JSONString(obj)
75 if err != nil {
76 return nil, err
77 }
78 return &syncedobjectApi.SyncedObject{
79 TypeMeta: metav1.TypeMeta{
80 Kind: syncedobjectApi.Kind,
81 APIVersion: syncedobjectApi.GroupVersion.String(),
82 },
83 ObjectMeta: metav1.ObjectMeta{
84 Name: name,
85 Namespace: namespace,
86 },
87 Spec: syncedobjectApi.SyncedObjectSpec{
88 Banner: projectID,
89 Cluster: clusterEdgeID,
90 Object: data,
91 },
92 }, nil
93 }
94
95
96
97
98 func BuildSyncedObjectCoreV1(s interface{}, projectID, clusterEdgeID, namespace, name string) (*syncedobjectApi.SyncedObject, error) {
99 data, err := utils.ConvertStructToBase64(s)
100 if err != nil {
101 return nil, err
102 }
103 return &syncedobjectApi.SyncedObject{
104 TypeMeta: metav1.TypeMeta{
105 Kind: syncedobjectApi.Kind,
106 APIVersion: syncedobjectApi.GroupVersion.String(),
107 },
108 ObjectMeta: metav1.ObjectMeta{
109 Name: name,
110 Namespace: namespace,
111 },
112 Spec: syncedobjectApi.SyncedObjectSpec{
113 Banner: projectID,
114 Cluster: clusterEdgeID,
115 Object: data,
116 },
117 }, nil
118 }
119
View as plain text