...
1
2
3
4 package types
5
6 import (
7 "fmt"
8 "reflect"
9 "sort"
10 "strings"
11
12 "sigs.k8s.io/kustomize/kyaml/resid"
13 )
14
15
16
17 type Var struct {
18
19
20 Name string `json:"name" yaml:"name"`
21
22
23
24
25
26 ObjRef Target `json:"objref" yaml:"objref"`
27
28
29
30
31
32 FieldRef FieldSelector `json:"fieldref,omitempty" yaml:"fieldref,omitempty"`
33 }
34
35
36
37
38
39 type Target struct {
40 APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"`
41 resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"`
42 Name string `json:"name" yaml:"name"`
43 Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
44 }
45
46
47 func (t *Target) GVK() resid.Gvk {
48 if t.APIVersion == "" {
49 return t.Gvk
50 }
51 versions := strings.Split(t.APIVersion, "/")
52 if len(versions) == 2 {
53 t.Group = versions[0]
54 t.Version = versions[1]
55 }
56 if len(versions) == 1 {
57 t.Version = versions[0]
58 }
59 return t.Gvk
60 }
61
62
63
64
65 type FieldSelector struct {
66 FieldPath string `json:"fieldPath,omitempty" yaml:"fieldPath,omitempty"`
67 }
68
69
70 func (v *Var) Defaulting() {
71 if v.FieldRef.FieldPath == "" {
72 v.FieldRef.FieldPath = DefaultReplacementFieldPath
73 }
74 v.ObjRef.GVK()
75 }
76
77
78
79
80
81
82 func (v Var) DeepEqual(other Var) bool {
83 v.Defaulting()
84 other.Defaulting()
85 return reflect.DeepEqual(v, other)
86 }
87
88
89 type VarSet struct {
90 set map[string]Var
91 }
92
93
94 func NewVarSet() VarSet {
95 return VarSet{set: map[string]Var{}}
96 }
97
98
99 func (vs *VarSet) AsSlice() []Var {
100 s := make([]Var, len(vs.set))
101 i := 0
102 for _, v := range vs.set {
103 s[i] = v
104 i++
105 }
106 sort.Sort(byName(s))
107 return s
108 }
109
110
111 func (vs *VarSet) Copy() VarSet {
112 newSet := make(map[string]Var, len(vs.set))
113 for k, v := range vs.set {
114 newSet[k] = v
115 }
116 return VarSet{set: newSet}
117 }
118
119
120 func (vs *VarSet) MergeSet(incoming VarSet) error {
121 for _, incomingVar := range incoming.set {
122 if err := vs.Merge(incomingVar); err != nil {
123 return err
124 }
125 }
126 return nil
127 }
128
129
130
131 func (vs *VarSet) MergeSlice(incoming []Var) error {
132 for _, v := range incoming {
133 if err := vs.Merge(v); err != nil {
134 return err
135 }
136 }
137 return nil
138 }
139
140
141
142 func (vs *VarSet) Merge(v Var) error {
143 if vs.Contains(v) {
144 return fmt.Errorf(
145 "var '%s' already encountered", v.Name)
146 }
147 v.Defaulting()
148 vs.set[v.Name] = v
149 return nil
150 }
151
152
153 func (vs *VarSet) AbsorbSet(incoming VarSet) error {
154 for _, v := range incoming.set {
155 if err := vs.Absorb(v); err != nil {
156 return err
157 }
158 }
159 return nil
160 }
161
162
163
164 func (vs *VarSet) AbsorbSlice(incoming []Var) error {
165 for _, v := range incoming {
166 if err := vs.Absorb(v); err != nil {
167 return err
168 }
169 }
170 return nil
171 }
172
173
174
175 func (vs *VarSet) Absorb(v Var) error {
176 conflicting := vs.Get(v.Name)
177 if conflicting == nil {
178
179 v.Defaulting()
180 vs.set[v.Name] = v
181 return nil
182 }
183
184 if !reflect.DeepEqual(v, *conflicting) {
185
186
187 return fmt.Errorf(
188 "var '%s' already encountered", v.Name)
189 }
190 return nil
191 }
192
193
194 func (vs *VarSet) Contains(other Var) bool {
195 return vs.Get(other.Name) != nil
196 }
197
198
199 func (vs *VarSet) Get(name string) *Var {
200 if v, found := vs.set[name]; found {
201 return &v
202 }
203 return nil
204 }
205
206
207 type byName []Var
208
209 func (v byName) Len() int { return len(v) }
210 func (v byName) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
211 func (v byName) Less(i, j int) bool { return v[i].Name < v[j].Name }
212
View as plain text