@@ -96,20 +96,21 @@ func (rm *resourceManager) customUpdateFunction(
96
96
// UpdateFunctionCode because both of them can put the function in a
97
97
// Pending state.
98
98
switch {
99
- case delta .DifferentAt ("Spec.Code" ):
100
- err = rm .updateFunctionCode (ctx , desired , delta )
101
- if err != nil {
102
- return nil , err
103
- }
104
99
case delta .DifferentExcept (
105
100
"Spec.Code" ,
106
101
"Spec.Tags" ,
107
102
"Spec.ReservedConcurrentExecutions" ,
108
- "Spec.CodeSigningConfigARN" ):
103
+ "Spec.CodeSigningConfigARN" ,
104
+ "Spec.CodeS3SHA256" ):
109
105
err = rm .updateFunctionConfiguration (ctx , desired , delta )
110
106
if err != nil {
111
107
return nil , err
112
108
}
109
+ case delta .DifferentAt ("Spec.Code" ) || delta .DifferentAt ("Spec.CodeS3SHA256" ):
110
+ err = rm .updateFunctionCode (ctx , desired , delta )
111
+ if err != nil {
112
+ return nil , err
113
+ }
113
114
}
114
115
115
116
readOneLatest , err := rm .ReadOne (ctx , desired )
@@ -335,33 +336,57 @@ func (rm *resourceManager) updateFunctionCode(
335
336
exit := rlog .Trace ("rm.updateFunctionCode" )
336
337
defer exit (err )
337
338
338
- if delta .DifferentAt ("Spec.Code.S3Key" ) &&
339
- ! delta .DifferentAt ("Spec.Code.S3Bucket" ) &&
340
- ! delta .DifferentAt ("Spec.Code.S3ObjectVersion" ) &&
341
- ! delta .DifferentAt ("Spec.Code.ImageURI" ) {
342
- log := ackrtlog .FromContext (ctx )
343
- log .Info ("updating code.s3Key field is not currently supported." )
344
- return nil
345
- }
346
-
347
339
dspec := desired .ko .Spec
348
340
input := & svcsdk.UpdateFunctionCodeInput {
349
341
FunctionName : aws .String (* dspec .Name ),
350
342
}
351
343
352
344
if dspec .Code != nil {
353
- switch {
354
- case dspec .Code .ImageURI != nil :
355
- input .ImageUri = dspec .Code .ImageURI
356
- case dspec .Code .S3Bucket != nil ,
357
- dspec .Code .S3Key != nil ,
358
- dspec .Code .S3ObjectVersion != nil :
359
- input .S3Bucket = dspec .Code .S3Bucket
360
- input .S3Key = dspec .Code .S3Key
361
- input .S3ObjectVersion = dspec .Code .S3ObjectVersion
345
+ if delta .DifferentAt ("Spec.CodeS3SHA256" ) && dspec .CodeS3SHA256 != nil {
346
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
347
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
348
+ if dspec .Code .ImageURI != nil {
349
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
350
+ }
351
+ }
352
+ } else if dspec .PackageType != nil && * dspec .PackageType == "Zip" {
353
+ if dspec .Code .S3Key != nil {
354
+ input .S3Key = aws .String (* dspec .Code .S3Key )
355
+ }
356
+ if dspec .Code .S3Bucket != nil {
357
+ input .S3Bucket = aws .String (* dspec .Code .S3Bucket )
358
+ }
359
+ if dspec .Code .S3ObjectVersion != nil {
360
+ input .S3ObjectVersion = aws .String (* dspec .Code .S3ObjectVersion )
361
+ }
362
+ }
363
+ } else {
364
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
365
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
366
+ if dspec .Code .ImageURI != nil {
367
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
368
+ }
369
+ }
370
+ }
362
371
}
363
372
}
364
373
374
+ // if delta.DifferentAt("Spec.Code.ImageURI") {
375
+ // if dspec.Code.ImageURI != nil {
376
+ // input.ImageUri = aws.String(*dspec.Code.ImageURI)
377
+ // }
378
+ // } else if delta.DifferentAt("Spec.CodeS3SHA256") {
379
+ // if dspec.Code.S3Key != nil {
380
+ // input.S3Key = aws.String(*dspec.Code.S3Key)
381
+ // }
382
+ // if dspec.Code.S3Bucket != nil {
383
+ // input.S3Bucket = aws.String(*dspec.Code.S3Bucket)
384
+ // }
385
+ // if dspec.Code.S3ObjectVersion != nil {
386
+ // input.S3ObjectVersion = aws.String(*dspec.Code.S3ObjectVersion)
387
+ // }
388
+ // }
389
+
365
390
_ , err = rm .sdkapi .UpdateFunctionCodeWithContext (ctx , input )
366
391
rm .metrics .RecordAPICall ("UPDATE" , "UpdateFunctionCode" , err )
367
392
if err != nil {
@@ -409,13 +434,44 @@ func customPreCompare(
409
434
if ackcompare .HasNilDifference (a .ko .Spec .Code , b .ko .Spec .Code ) {
410
435
delta .Add ("Spec.Code" , a .ko .Spec .Code , b .ko .Spec .Code )
411
436
} else if a .ko .Spec .Code != nil && b .ko .Spec .Code != nil {
412
- if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
413
- delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
414
- } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
415
- if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
437
+ if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Image" {
438
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
416
439
delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
440
+ } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
441
+ if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
442
+ delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
443
+ }
444
+ }
445
+ if a .ko .Spec .CodeS3SHA256 != nil {
446
+ if ackcompare .HasNilDifference (a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 ) {
447
+ delta .Add ("Spec.CodeS3SHA256" , a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 )
448
+ } else if a .ko .Spec .CodeS3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
449
+ if * a .ko .Spec .CodeS3SHA256 != * b .ko .Status .CodeSHA256 {
450
+ delta .Add ("Spec.CodeS3SHA256" , a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 )
451
+ }
452
+ }
453
+ }
454
+ } else if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Zip" {
455
+ if a .ko .Spec .CodeS3SHA256 != nil {
456
+ if ackcompare .HasNilDifference (a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 ) {
457
+ delta .Add ("Spec.CodeS3SHA256" , a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 )
458
+ } else if a .ko .Spec .CodeS3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
459
+ if * a .ko .Spec .CodeS3SHA256 != * b .ko .Status .CodeSHA256 {
460
+ delta .Add ("Spec.CodeS3SHA256" , a .ko .Spec .CodeS3SHA256 , b .ko .Status .CodeSHA256 )
461
+ }
462
+ }
417
463
}
418
464
}
465
+
466
+ // No need to compare difference in S3 Key/Bucket/ObjectVersion. As in sdkFind() there is a copy 'ko := r.ko.DeepCopy()'
467
+ // of S3 Key/Bucket/ObjectVersion passed. This 'ko' then stores the values of latest S3 fields which API returns
468
+ // and compares it with desired field values. Since the API doesn't return values of S3 fields, it doesn't
469
+ // notice any changes between desired and latest, hence fails to recognize the update in the values.
470
+
471
+ // To solve this we created a new field 'CodeS3SHA256' to store the hash value of deployment package. Any change
472
+ // in hash value refers to change in S3 Key/Bucket/ObjectVersion and controller can recognize the change in
473
+ // desired and latest value of 'CodeS3SHA256' and hence calls the update function.
474
+
419
475
//TODO(hialylmh) handle Spec.Code.S3bucket changes
420
476
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
421
477
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -424,20 +480,20 @@ func customPreCompare(
424
480
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
425
481
// }
426
482
// }
427
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key ) {
428
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
429
- } else if a .ko .Spec .Code .S3Key != nil && b .ko .Spec .Code .S3Key != nil {
430
- if * a .ko .Spec .Code .S3Key != * b .ko .Spec .Code .S3Key {
431
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
432
- }
433
- }
434
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion ) {
435
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
436
- } else if a .ko .Spec .Code .S3ObjectVersion != nil && b .ko .Spec .Code .S3ObjectVersion != nil {
437
- if * a .ko .Spec .Code .S3ObjectVersion != * b .ko .Spec .Code .S3ObjectVersion {
438
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
439
- }
440
- }
483
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key) {
484
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
485
+ // } else if a.ko.Spec.Code.S3Key != nil && b.ko.Spec.Code.S3Key != nil {
486
+ // if *a.ko.Spec.Code.S3Key != *b.ko.Spec.Code.S3Key {
487
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
488
+ // }
489
+ // }
490
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion) {
491
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
492
+ // } else if a.ko.Spec.Code.S3ObjectVersion != nil && b.ko.Spec.Code.S3ObjectVersion != nil {
493
+ // if *a.ko.Spec.Code.S3ObjectVersion != *b.ko.Spec.Code.S3ObjectVersion {
494
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
495
+ // }
496
+ // }
441
497
}
442
498
}
443
499
0 commit comments