1
2
3
4
5 package dependson
6
7 import (
8 "fmt"
9 "strings"
10
11 "k8s.io/apimachinery/pkg/runtime/schema"
12 "sigs.k8s.io/cli-utils/pkg/object"
13 )
14
15 const (
16
17
18 numFieldsClusterScoped = 3
19
20
21 numFieldsNamespacedScoped = 5
22
23 annotationSeparator = ","
24
25 fieldSeparator = "/"
26 namespacesField = "namespaces"
27 )
28
29
30
31
32
33
34 func FormatDependencySet(depSet DependencySet) (string, error) {
35 var dependsOnStr string
36 for i, depObj := range depSet {
37 if i > 0 {
38 dependsOnStr += annotationSeparator
39 }
40 objStr, err := FormatObjMetadata(depObj)
41 if err != nil {
42 return "", fmt.Errorf("failed to format object metadata (index: %d): %w", i, err)
43 }
44 dependsOnStr += objStr
45 }
46 return dependsOnStr, nil
47 }
48
49
50
51
52
53
54
55 func ParseDependencySet(depsStr string) (DependencySet, error) {
56 objs := DependencySet{}
57 for i, objStr := range strings.Split(depsStr, annotationSeparator) {
58 obj, err := ParseObjMetadata(objStr)
59 if err != nil {
60 return objs, fmt.Errorf("failed to parse object reference (index: %d): %w", i, err)
61 }
62 objs = append(objs, obj)
63 }
64 return objs, nil
65 }
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 func FormatObjMetadata(obj object.ObjMetadata) (string, error) {
83 gk := obj.GroupKind
84
85 if gk.Kind == "" {
86 return "", fmt.Errorf("invalid object metadata: kind is empty")
87 }
88 if obj.Name == "" {
89 return "", fmt.Errorf("invalid object metadata: name is empty")
90 }
91 if obj.Namespace != "" {
92 return fmt.Sprintf("%s/namespaces/%s/%s/%s", gk.Group, obj.Namespace, gk.Kind, obj.Name), nil
93 }
94 return fmt.Sprintf("%s/%s/%s", gk.Group, gk.Kind, obj.Name), nil
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 func ParseObjMetadata(objStr string) (object.ObjMetadata, error) {
113 var obj object.ObjMetadata
114 var group, kind, namespace, name string
115 objStr = strings.TrimSpace(objStr)
116 fields := strings.Split(objStr, fieldSeparator)
117
118 if len(fields) != numFieldsClusterScoped && len(fields) != numFieldsNamespacedScoped {
119 return obj, fmt.Errorf("expected %d or %d fields, found %d: %q",
120 numFieldsClusterScoped, numFieldsNamespacedScoped, len(fields), objStr)
121 }
122
123 group = fields[0]
124 if len(fields) == 3 {
125 kind = fields[1]
126 name = fields[2]
127 } else {
128 if fields[1] != namespacesField {
129 return obj, fmt.Errorf("missing %q field: %q", namespacesField, objStr)
130 }
131 namespace = fields[2]
132 kind = fields[3]
133 name = fields[4]
134 }
135
136 id := object.ObjMetadata{
137 Namespace: namespace,
138 Name: name,
139 GroupKind: schema.GroupKind{
140 Group: group,
141 Kind: kind,
142 },
143 }
144 return id, nil
145 }
146
View as plain text