@@ -20,7 +20,6 @@ import (
20
20
"strings"
21
21
22
22
"go.uber.org/zap"
23
- "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
24
23
25
24
"github.com/pipe-cd/pipecd/pkg/app/pipedv1/plugin/kubernetes/config"
26
25
"github.com/pipe-cd/pipecd/pkg/app/pipedv1/plugin/kubernetes/provider"
@@ -51,32 +50,8 @@ func parseContainerImage(image string) (img containerImage) {
51
50
func determineVersions (manifests []provider.Manifest ) ([]* model.ArtifactVersion , error ) {
52
51
imageMap := map [string ]struct {}{}
53
52
for _ , m := range manifests {
54
- // TODO: we should consider other fields like spec.jobTempate.spec.template.spec.containers because CronJob uses this format.
55
- containers , ok , err := unstructured .NestedSlice (m .Body .Object , "spec" , "template" , "spec" , "containers" )
56
- if err != nil {
57
- // if the containers field is not an array, it will return an error.
58
- // we define this as error because the 'containers' is plural form, so it should be an array.
59
- return nil , err
60
- }
61
- if ! ok {
62
- continue
63
- }
64
- // Remove duplicate images on multiple manifests.
65
- for _ , c := range containers {
66
- m , ok := c .(map [string ]interface {})
67
- if ! ok {
68
- // TODO: Add logging.
69
- continue
70
- }
71
- img , ok := m ["image" ]
72
- if ! ok {
73
- continue
74
- }
75
- imgStr , ok := img .(string )
76
- if ! ok {
77
- return nil , fmt .Errorf ("invalid image format: %T(%v)" , img , img )
78
- }
79
- imageMap [imgStr ] = struct {}{}
53
+ for _ , c := range provider .FindContainerImages (m ) {
54
+ imageMap [c ] = struct {}{}
80
55
}
81
56
}
82
57
@@ -98,10 +73,10 @@ func determineVersions(manifests []provider.Manifest) ([]*model.ArtifactVersion,
98
73
func findManifests (kind , name string , manifests []provider.Manifest ) []provider.Manifest {
99
74
out := make ([]provider.Manifest , 0 , len (manifests ))
100
75
for _ , m := range manifests {
101
- if m .Body . GetKind () != kind {
76
+ if m .Key (). Kind () != kind {
102
77
continue
103
78
}
104
- if name != "" && m .Body . GetName () != name {
79
+ if name != "" && m .Key (). Name () != name {
105
80
continue
106
81
}
107
82
out = append (out , m )
@@ -133,47 +108,6 @@ type workloadPair struct {
133
108
new provider.Manifest
134
109
}
135
110
136
- func findUpdatedWorkloads (olds , news []provider.Manifest ) []workloadPair {
137
- pairs := make ([]workloadPair , 0 )
138
- oldMap := make (map [provider.ResourceKey ]provider.Manifest , len (olds ))
139
- nomalizeKey := func (k provider.ResourceKey ) provider.ResourceKey {
140
- // Ignoring APIVersion because user can upgrade to the new APIVersion for the same workload.
141
- k .APIVersion = ""
142
- if k .Namespace == provider .DefaultNamespace {
143
- k .Namespace = ""
144
- }
145
- return k
146
- }
147
- for _ , m := range olds {
148
- key := nomalizeKey (m .Key )
149
- oldMap [key ] = m
150
- }
151
- for _ , n := range news {
152
- key := nomalizeKey (n .Key )
153
- if o , ok := oldMap [key ]; ok {
154
- pairs = append (pairs , workloadPair {
155
- old : o ,
156
- new : n ,
157
- })
158
- }
159
- }
160
- return pairs
161
- }
162
-
163
- // findConfigsAndSecrets returns the manifests that are ConfigMap or Secret.
164
- func findConfigsAndSecrets (manifests []provider.Manifest ) map [provider.ResourceKey ]provider.Manifest {
165
- configs := make (map [provider.ResourceKey ]provider.Manifest )
166
- for _ , m := range manifests {
167
- if m .Key .IsConfigMap () {
168
- configs [m .Key ] = m
169
- }
170
- if m .Key .IsSecret () {
171
- configs [m .Key ] = m
172
- }
173
- }
174
- return configs
175
- }
176
-
177
111
func checkImageChange (ns diff.Nodes ) (string , bool ) {
178
112
const containerImageQuery = `^spec\.template\.spec\.containers\.\d+.image$`
179
113
nodes , _ := ns .Find (containerImageQuery )
@@ -234,32 +168,32 @@ func determineStrategy(olds, news []provider.Manifest, workloadRefs []config.K8s
234
168
return model .SyncStrategy_QUICK_SYNC , "Quick sync by applying all manifests because it was unable to find workloads in the new manifests"
235
169
}
236
170
237
- workloads := findUpdatedWorkloads (oldWorkloads , newWorkloads )
171
+ workloads := provider . FindSameManifests (oldWorkloads , newWorkloads )
238
172
diffs := make (map [provider.ResourceKey ]diff.Nodes , len (workloads ))
239
173
240
174
for _ , w := range workloads {
241
175
// If the workload's pod template was touched
242
176
// do progressive deployment with the specified pipeline.
243
- diffResult , err := provider .Diff (w .old , w .new , logger )
177
+ diffResult , err := provider .Diff (w .Old , w .New , logger )
244
178
if err != nil {
245
179
return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively due to an error while calculating the diff (%v)" , err )
246
180
}
247
181
diffNodes := diffResult .Nodes ()
248
- diffs [w .new .Key ] = diffNodes
182
+ diffs [w .New .Key () ] = diffNodes
249
183
250
184
templateDiffs := diffNodes .FindByPrefix ("spec.template" )
251
185
if len (templateDiffs ) > 0 {
252
186
if msg , changed := checkImageChange (templateDiffs ); changed {
253
187
return model .SyncStrategy_PIPELINE , msg
254
188
}
255
- return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because pod template of workload %s was changed" , w .new .Key .Name )
189
+ return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because pod template of workload %s was changed" , w .New .Key () .Name () )
256
190
}
257
191
}
258
192
259
193
// If the config/secret was touched, we also need to do progressive
260
194
// deployment to check run with the new config/secret content.
261
- oldConfigs := findConfigsAndSecrets (olds )
262
- newConfigs := findConfigsAndSecrets (news )
195
+ oldConfigs := provider . FindConfigsAndSecrets (olds )
196
+ newConfigs := provider . FindConfigsAndSecrets (news )
263
197
if len (oldConfigs ) > len (newConfigs ) {
264
198
return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because %d configmap/secret deleted" , len (oldConfigs )- len (newConfigs ))
265
199
}
@@ -269,22 +203,22 @@ func determineStrategy(olds, news []provider.Manifest, workloadRefs []config.K8s
269
203
for k , oc := range oldConfigs {
270
204
nc , ok := newConfigs [k ]
271
205
if ! ok {
272
- return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because %s %s was deleted" , oc .Key .Kind , oc .Key .Name )
206
+ return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because %s %s was deleted" , oc .Key () .Kind () , oc .Key () .Name () )
273
207
}
274
208
result , err := provider .Diff (oc , nc , logger )
275
209
if err != nil {
276
210
return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively due to an error while calculating the diff (%v)" , err )
277
211
}
278
212
if result .HasDiff () {
279
- return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because %s %s was updated" , oc .Key .Kind , oc .Key .Name )
213
+ return model .SyncStrategy_PIPELINE , fmt .Sprintf ("Sync progressively because %s %s was updated" , oc .Key () .Kind () , oc .Key () .Name () )
280
214
}
281
215
}
282
216
283
217
// Check if this is a scaling commit.
284
218
scales := make ([]string , 0 , len (diffs ))
285
219
for k , d := range diffs {
286
220
if before , after , changed := checkReplicasChange (d ); changed {
287
- scales = append (scales , fmt .Sprintf ("%s/%s from %s to %s" , k .Kind , k .Name , before , after ))
221
+ scales = append (scales , fmt .Sprintf ("%s/%s from %s to %s" , k .Kind () , k .Name () , before , after ))
288
222
}
289
223
290
224
}
0 commit comments