...
1
2
3
4 package accumulator
5
6 import (
7 "fmt"
8 "log"
9
10 "sigs.k8s.io/kustomize/api/filters/nameref"
11 "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig"
12 "sigs.k8s.io/kustomize/api/resmap"
13 "sigs.k8s.io/kustomize/api/resource"
14 "sigs.k8s.io/kustomize/kyaml/resid"
15 )
16
17 type nameReferenceTransformer struct {
18 backRefs []builtinconfig.NameBackReferences
19 }
20
21 const doDebug = false
22
23 var _ resmap.Transformer = &nameReferenceTransformer{}
24
25 type filterMap map[*resource.Resource][]nameref.Filter
26
27
28
29 func newNameReferenceTransformer(
30 br []builtinconfig.NameBackReferences) resmap.Transformer {
31 if br == nil {
32 log.Fatal("backrefs not expected to be nil")
33 }
34 return &nameReferenceTransformer{backRefs: br}
35 }
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 func (t *nameReferenceTransformer) Transform(m resmap.ResMap) error {
52 fMap := t.determineFilters(m.Resources())
53 debug(fMap)
54 for r, fList := range fMap {
55 c, err := m.SubsetThatCouldBeReferencedByResource(r)
56 if err != nil {
57 return err
58 }
59 for _, f := range fList {
60 f.Referrer = r
61 f.ReferralCandidates = c
62 if err := f.Referrer.ApplyFilter(f); err != nil {
63 return err
64 }
65 }
66 }
67 return nil
68 }
69
70 func debug(fMap filterMap) {
71 if !doDebug {
72 return
73 }
74 fmt.Printf("filterMap has %d entries:\n", len(fMap))
75 rCount := 0
76 for r, fList := range fMap {
77 yml, _ := r.AsYAML()
78 rCount++
79 fmt.Printf(`
80 ---- %3d. possible referrer -------------
81 %s
82 ---------`, rCount, string(yml),
83 )
84 for i, f := range fList {
85 fmt.Printf(`
86 %3d/%3d update: %s
87 from: %s
88 `, rCount, i+1, f.NameFieldToUpdate.Path, f.ReferralTarget,
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 func (t *nameReferenceTransformer) determineFilters(
115 resources []*resource.Resource) (fMap filterMap) {
116
117 resourceOrgIds := make([]resid.ResId, len(resources))
118 for i, resource := range resources {
119 resourceOrgIds[i] = resource.OrgId()
120 }
121
122 fMap = make(filterMap)
123 for _, backReference := range t.backRefs {
124 for _, referrerSpec := range backReference.Referrers {
125 for i, res := range resources {
126 if resourceOrgIds[i].IsSelected(&referrerSpec.Gvk) {
127
128
129 if resHasField(res, referrerSpec.Path) {
130
131
132 fMap[res] = append(fMap[res], nameref.Filter{
133
134
135
136
137 NameFieldToUpdate: referrerSpec,
138
139
140 ReferralTarget: backReference.Gvk,
141 })
142 }
143 }
144 }
145 }
146 }
147 return fMap
148 }
149
150
151
152
153
154
155
156
157
158
159 func resHasField(res *resource.Resource, path string) bool {
160 return true
161
162
163
164 }
165
View as plain text