Skip to content

Commit 7ca284c

Browse files
authored
Add comparison support for blob type fields (#171)
Issue N/A Description of changes: Currently the code-generator panics whenever a CRD/type field is of type blob (array of bytes). This PR adds support for blob type comparison. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent ea1222d commit 7ca284c

File tree

4 files changed

+212
-1
lines changed

4 files changed

+212
-1
lines changed

pkg/generate/code/compare.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,11 @@ func compareScalar(
323323
"%sif *%s != *%s {\n",
324324
indent, firstResVarName, secondResVarName,
325325
)
326+
case "blob":
327+
out += fmt.Sprintf(
328+
"%sif !bytes.Equal(%s, %s) {\n",
329+
indent, firstResVarName, secondResVarName,
330+
)
326331
case "timestamp":
327332
// if !a.ko.Spec.CreatedAt.Equal(b.ko.Spec.CreatedAt) {
328333
out += fmt.Sprintf(

pkg/generate/code/compare_test.go

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,207 @@ func TestCompareResource_Lambda_CodeSigningConfig(t *testing.T) {
172172
),
173173
)
174174
}
175+
176+
func TestCompareResource_Lambda_Function(t *testing.T) {
177+
assert := assert.New(t)
178+
require := require.New(t)
179+
180+
g := testutil.NewModelForService(t, "lambda")
181+
182+
crd := testutil.GetCRDByName(t, g, "Function")
183+
require.NotNil(crd)
184+
185+
expected := `
186+
if ackcompare.HasNilDifference(a.ko.Spec.Code, b.ko.Spec.Code) {
187+
delta.Add("Spec.Code", a.ko.Spec.Code, b.ko.Spec.Code)
188+
} else if a.ko.Spec.Code != nil && b.ko.Spec.Code != nil {
189+
if ackcompare.HasNilDifference(a.ko.Spec.Code.ImageURI, b.ko.Spec.Code.ImageURI) {
190+
delta.Add("Spec.Code.ImageURI", a.ko.Spec.Code.ImageURI, b.ko.Spec.Code.ImageURI)
191+
} else if a.ko.Spec.Code.ImageURI != nil && b.ko.Spec.Code.ImageURI != nil {
192+
if *a.ko.Spec.Code.ImageURI != *b.ko.Spec.Code.ImageURI {
193+
delta.Add("Spec.Code.ImageURI", a.ko.Spec.Code.ImageURI, b.ko.Spec.Code.ImageURI)
194+
}
195+
}
196+
if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
197+
delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
198+
} else if a.ko.Spec.Code.S3Bucket != nil && b.ko.Spec.Code.S3Bucket != nil {
199+
if *a.ko.Spec.Code.S3Bucket != *b.ko.Spec.Code.S3Bucket {
200+
delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
201+
}
202+
}
203+
if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key) {
204+
delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
205+
} else if a.ko.Spec.Code.S3Key != nil && b.ko.Spec.Code.S3Key != nil {
206+
if *a.ko.Spec.Code.S3Key != *b.ko.Spec.Code.S3Key {
207+
delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
208+
}
209+
}
210+
if ackcompare.HasNilDifference(a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion) {
211+
delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
212+
} else if a.ko.Spec.Code.S3ObjectVersion != nil && b.ko.Spec.Code.S3ObjectVersion != nil {
213+
if *a.ko.Spec.Code.S3ObjectVersion != *b.ko.Spec.Code.S3ObjectVersion {
214+
delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
215+
}
216+
}
217+
if !bytes.Equal(a.ko.Spec.Code.ZipFile, b.ko.Spec.Code.ZipFile) {
218+
delta.Add("Spec.Code.ZipFile", a.ko.Spec.Code.ZipFile, b.ko.Spec.Code.ZipFile)
219+
}
220+
}
221+
if ackcompare.HasNilDifference(a.ko.Spec.CodeSigningConfigARN, b.ko.Spec.CodeSigningConfigARN) {
222+
delta.Add("Spec.CodeSigningConfigARN", a.ko.Spec.CodeSigningConfigARN, b.ko.Spec.CodeSigningConfigARN)
223+
} else if a.ko.Spec.CodeSigningConfigARN != nil && b.ko.Spec.CodeSigningConfigARN != nil {
224+
if *a.ko.Spec.CodeSigningConfigARN != *b.ko.Spec.CodeSigningConfigARN {
225+
delta.Add("Spec.CodeSigningConfigARN", a.ko.Spec.CodeSigningConfigARN, b.ko.Spec.CodeSigningConfigARN)
226+
}
227+
}
228+
if ackcompare.HasNilDifference(a.ko.Spec.DeadLetterConfig, b.ko.Spec.DeadLetterConfig) {
229+
delta.Add("Spec.DeadLetterConfig", a.ko.Spec.DeadLetterConfig, b.ko.Spec.DeadLetterConfig)
230+
} else if a.ko.Spec.DeadLetterConfig != nil && b.ko.Spec.DeadLetterConfig != nil {
231+
if ackcompare.HasNilDifference(a.ko.Spec.DeadLetterConfig.TargetARN, b.ko.Spec.DeadLetterConfig.TargetARN) {
232+
delta.Add("Spec.DeadLetterConfig.TargetARN", a.ko.Spec.DeadLetterConfig.TargetARN, b.ko.Spec.DeadLetterConfig.TargetARN)
233+
} else if a.ko.Spec.DeadLetterConfig.TargetARN != nil && b.ko.Spec.DeadLetterConfig.TargetARN != nil {
234+
if *a.ko.Spec.DeadLetterConfig.TargetARN != *b.ko.Spec.DeadLetterConfig.TargetARN {
235+
delta.Add("Spec.DeadLetterConfig.TargetARN", a.ko.Spec.DeadLetterConfig.TargetARN, b.ko.Spec.DeadLetterConfig.TargetARN)
236+
}
237+
}
238+
}
239+
if ackcompare.HasNilDifference(a.ko.Spec.Description, b.ko.Spec.Description) {
240+
delta.Add("Spec.Description", a.ko.Spec.Description, b.ko.Spec.Description)
241+
} else if a.ko.Spec.Description != nil && b.ko.Spec.Description != nil {
242+
if *a.ko.Spec.Description != *b.ko.Spec.Description {
243+
delta.Add("Spec.Description", a.ko.Spec.Description, b.ko.Spec.Description)
244+
}
245+
}
246+
if ackcompare.HasNilDifference(a.ko.Spec.Environment, b.ko.Spec.Environment) {
247+
delta.Add("Spec.Environment", a.ko.Spec.Environment, b.ko.Spec.Environment)
248+
} else if a.ko.Spec.Environment != nil && b.ko.Spec.Environment != nil {
249+
if ackcompare.HasNilDifference(a.ko.Spec.Environment.Variables, b.ko.Spec.Environment.Variables) {
250+
delta.Add("Spec.Environment.Variables", a.ko.Spec.Environment.Variables, b.ko.Spec.Environment.Variables)
251+
} else if a.ko.Spec.Environment.Variables != nil && b.ko.Spec.Environment.Variables != nil {
252+
if !ackcompare.MapStringStringPEqual(a.ko.Spec.Environment.Variables, b.ko.Spec.Environment.Variables) {
253+
delta.Add("Spec.Environment.Variables", a.ko.Spec.Environment.Variables, b.ko.Spec.Environment.Variables)
254+
}
255+
}
256+
}
257+
if !reflect.DeepEqual(a.ko.Spec.FileSystemConfigs, b.ko.Spec.FileSystemConfigs) {
258+
delta.Add("Spec.FileSystemConfigs", a.ko.Spec.FileSystemConfigs, b.ko.Spec.FileSystemConfigs)
259+
}
260+
if ackcompare.HasNilDifference(a.ko.Spec.FunctionName, b.ko.Spec.FunctionName) {
261+
delta.Add("Spec.FunctionName", a.ko.Spec.FunctionName, b.ko.Spec.FunctionName)
262+
} else if a.ko.Spec.FunctionName != nil && b.ko.Spec.FunctionName != nil {
263+
if *a.ko.Spec.FunctionName != *b.ko.Spec.FunctionName {
264+
delta.Add("Spec.FunctionName", a.ko.Spec.FunctionName, b.ko.Spec.FunctionName)
265+
}
266+
}
267+
if ackcompare.HasNilDifference(a.ko.Spec.Handler, b.ko.Spec.Handler) {
268+
delta.Add("Spec.Handler", a.ko.Spec.Handler, b.ko.Spec.Handler)
269+
} else if a.ko.Spec.Handler != nil && b.ko.Spec.Handler != nil {
270+
if *a.ko.Spec.Handler != *b.ko.Spec.Handler {
271+
delta.Add("Spec.Handler", a.ko.Spec.Handler, b.ko.Spec.Handler)
272+
}
273+
}
274+
if ackcompare.HasNilDifference(a.ko.Spec.ImageConfig, b.ko.Spec.ImageConfig) {
275+
delta.Add("Spec.ImageConfig", a.ko.Spec.ImageConfig, b.ko.Spec.ImageConfig)
276+
} else if a.ko.Spec.ImageConfig != nil && b.ko.Spec.ImageConfig != nil {
277+
if !ackcompare.SliceStringPEqual(a.ko.Spec.ImageConfig.Command, b.ko.Spec.ImageConfig.Command) {
278+
delta.Add("Spec.ImageConfig.Command", a.ko.Spec.ImageConfig.Command, b.ko.Spec.ImageConfig.Command)
279+
}
280+
if !ackcompare.SliceStringPEqual(a.ko.Spec.ImageConfig.EntryPoint, b.ko.Spec.ImageConfig.EntryPoint) {
281+
delta.Add("Spec.ImageConfig.EntryPoint", a.ko.Spec.ImageConfig.EntryPoint, b.ko.Spec.ImageConfig.EntryPoint)
282+
}
283+
if ackcompare.HasNilDifference(a.ko.Spec.ImageConfig.WorkingDirectory, b.ko.Spec.ImageConfig.WorkingDirectory) {
284+
delta.Add("Spec.ImageConfig.WorkingDirectory", a.ko.Spec.ImageConfig.WorkingDirectory, b.ko.Spec.ImageConfig.WorkingDirectory)
285+
} else if a.ko.Spec.ImageConfig.WorkingDirectory != nil && b.ko.Spec.ImageConfig.WorkingDirectory != nil {
286+
if *a.ko.Spec.ImageConfig.WorkingDirectory != *b.ko.Spec.ImageConfig.WorkingDirectory {
287+
delta.Add("Spec.ImageConfig.WorkingDirectory", a.ko.Spec.ImageConfig.WorkingDirectory, b.ko.Spec.ImageConfig.WorkingDirectory)
288+
}
289+
}
290+
}
291+
if ackcompare.HasNilDifference(a.ko.Spec.KMSKeyARN, b.ko.Spec.KMSKeyARN) {
292+
delta.Add("Spec.KMSKeyARN", a.ko.Spec.KMSKeyARN, b.ko.Spec.KMSKeyARN)
293+
} else if a.ko.Spec.KMSKeyARN != nil && b.ko.Spec.KMSKeyARN != nil {
294+
if *a.ko.Spec.KMSKeyARN != *b.ko.Spec.KMSKeyARN {
295+
delta.Add("Spec.KMSKeyARN", a.ko.Spec.KMSKeyARN, b.ko.Spec.KMSKeyARN)
296+
}
297+
}
298+
if !ackcompare.SliceStringPEqual(a.ko.Spec.Layers, b.ko.Spec.Layers) {
299+
delta.Add("Spec.Layers", a.ko.Spec.Layers, b.ko.Spec.Layers)
300+
}
301+
if ackcompare.HasNilDifference(a.ko.Spec.MemorySize, b.ko.Spec.MemorySize) {
302+
delta.Add("Spec.MemorySize", a.ko.Spec.MemorySize, b.ko.Spec.MemorySize)
303+
} else if a.ko.Spec.MemorySize != nil && b.ko.Spec.MemorySize != nil {
304+
if *a.ko.Spec.MemorySize != *b.ko.Spec.MemorySize {
305+
delta.Add("Spec.MemorySize", a.ko.Spec.MemorySize, b.ko.Spec.MemorySize)
306+
}
307+
}
308+
if ackcompare.HasNilDifference(a.ko.Spec.PackageType, b.ko.Spec.PackageType) {
309+
delta.Add("Spec.PackageType", a.ko.Spec.PackageType, b.ko.Spec.PackageType)
310+
} else if a.ko.Spec.PackageType != nil && b.ko.Spec.PackageType != nil {
311+
if *a.ko.Spec.PackageType != *b.ko.Spec.PackageType {
312+
delta.Add("Spec.PackageType", a.ko.Spec.PackageType, b.ko.Spec.PackageType)
313+
}
314+
}
315+
if ackcompare.HasNilDifference(a.ko.Spec.Publish, b.ko.Spec.Publish) {
316+
delta.Add("Spec.Publish", a.ko.Spec.Publish, b.ko.Spec.Publish)
317+
} else if a.ko.Spec.Publish != nil && b.ko.Spec.Publish != nil {
318+
if *a.ko.Spec.Publish != *b.ko.Spec.Publish {
319+
delta.Add("Spec.Publish", a.ko.Spec.Publish, b.ko.Spec.Publish)
320+
}
321+
}
322+
if ackcompare.HasNilDifference(a.ko.Spec.Role, b.ko.Spec.Role) {
323+
delta.Add("Spec.Role", a.ko.Spec.Role, b.ko.Spec.Role)
324+
} else if a.ko.Spec.Role != nil && b.ko.Spec.Role != nil {
325+
if *a.ko.Spec.Role != *b.ko.Spec.Role {
326+
delta.Add("Spec.Role", a.ko.Spec.Role, b.ko.Spec.Role)
327+
}
328+
}
329+
if ackcompare.HasNilDifference(a.ko.Spec.Runtime, b.ko.Spec.Runtime) {
330+
delta.Add("Spec.Runtime", a.ko.Spec.Runtime, b.ko.Spec.Runtime)
331+
} else if a.ko.Spec.Runtime != nil && b.ko.Spec.Runtime != nil {
332+
if *a.ko.Spec.Runtime != *b.ko.Spec.Runtime {
333+
delta.Add("Spec.Runtime", a.ko.Spec.Runtime, b.ko.Spec.Runtime)
334+
}
335+
}
336+
if ackcompare.HasNilDifference(a.ko.Spec.Tags, b.ko.Spec.Tags) {
337+
delta.Add("Spec.Tags", a.ko.Spec.Tags, b.ko.Spec.Tags)
338+
} else if a.ko.Spec.Tags != nil && b.ko.Spec.Tags != nil {
339+
if !ackcompare.MapStringStringPEqual(a.ko.Spec.Tags, b.ko.Spec.Tags) {
340+
delta.Add("Spec.Tags", a.ko.Spec.Tags, b.ko.Spec.Tags)
341+
}
342+
}
343+
if ackcompare.HasNilDifference(a.ko.Spec.Timeout, b.ko.Spec.Timeout) {
344+
delta.Add("Spec.Timeout", a.ko.Spec.Timeout, b.ko.Spec.Timeout)
345+
} else if a.ko.Spec.Timeout != nil && b.ko.Spec.Timeout != nil {
346+
if *a.ko.Spec.Timeout != *b.ko.Spec.Timeout {
347+
delta.Add("Spec.Timeout", a.ko.Spec.Timeout, b.ko.Spec.Timeout)
348+
}
349+
}
350+
if ackcompare.HasNilDifference(a.ko.Spec.TracingConfig, b.ko.Spec.TracingConfig) {
351+
delta.Add("Spec.TracingConfig", a.ko.Spec.TracingConfig, b.ko.Spec.TracingConfig)
352+
} else if a.ko.Spec.TracingConfig != nil && b.ko.Spec.TracingConfig != nil {
353+
if ackcompare.HasNilDifference(a.ko.Spec.TracingConfig.Mode, b.ko.Spec.TracingConfig.Mode) {
354+
delta.Add("Spec.TracingConfig.Mode", a.ko.Spec.TracingConfig.Mode, b.ko.Spec.TracingConfig.Mode)
355+
} else if a.ko.Spec.TracingConfig.Mode != nil && b.ko.Spec.TracingConfig.Mode != nil {
356+
if *a.ko.Spec.TracingConfig.Mode != *b.ko.Spec.TracingConfig.Mode {
357+
delta.Add("Spec.TracingConfig.Mode", a.ko.Spec.TracingConfig.Mode, b.ko.Spec.TracingConfig.Mode)
358+
}
359+
}
360+
}
361+
if ackcompare.HasNilDifference(a.ko.Spec.VPCConfig, b.ko.Spec.VPCConfig) {
362+
delta.Add("Spec.VPCConfig", a.ko.Spec.VPCConfig, b.ko.Spec.VPCConfig)
363+
} else if a.ko.Spec.VPCConfig != nil && b.ko.Spec.VPCConfig != nil {
364+
if !ackcompare.SliceStringPEqual(a.ko.Spec.VPCConfig.SecurityGroupIDs, b.ko.Spec.VPCConfig.SecurityGroupIDs) {
365+
delta.Add("Spec.VPCConfig.SecurityGroupIDs", a.ko.Spec.VPCConfig.SecurityGroupIDs, b.ko.Spec.VPCConfig.SecurityGroupIDs)
366+
}
367+
if !ackcompare.SliceStringPEqual(a.ko.Spec.VPCConfig.SubnetIDs, b.ko.Spec.VPCConfig.SubnetIDs) {
368+
delta.Add("Spec.VPCConfig.SubnetIDs", a.ko.Spec.VPCConfig.SubnetIDs, b.ko.Spec.VPCConfig.SubnetIDs)
369+
}
370+
}
371+
`
372+
assert.Equal(
373+
expected,
374+
code.CompareResource(
375+
crd.Config(), crd, "delta", "a.ko", "b.ko", 1,
376+
),
377+
)
378+
}

pkg/model/model.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ func (m *Model) getShapeCleanGoType(shape *awssdkmodel.Shape) string {
346346
// If it's a map type we need to set the GoType to the cleaned-up
347347
// Camel-cased name
348348
return "map[string]" + m.getShapeCleanGoType(shape.ValueRef.Shape)
349-
case "list", "array", "blob":
349+
case "list", "array":
350350
// If it's a list type, we need to set the GoType to the cleaned-up
351351
// Camel-cased name
352352
return "[]" + m.getShapeCleanGoType(shape.MemberRef.Shape)

templates/pkg/resource/delta.go.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
package {{ .CRD.Names.Snake }}
44

55
import (
6+
"bytes"
67
"reflect"
78

89
ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare"
910
)
1011

1112
// Hack to avoid import errors during build...
1213
var (
14+
_ = &bytes.Buffer{}
1315
_ = &reflect.Method{}
1416
)
1517

0 commit comments

Comments
 (0)