@@ -16,7 +16,6 @@ package function
16
16
import (
17
17
"context"
18
18
"errors"
19
- "strings"
20
19
"time"
21
20
22
21
ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare"
@@ -114,28 +113,21 @@ func (rm *resourceManager) customUpdateFunction(
114
113
// UpdateFunctionCode because both of them can put the function in a
115
114
// Pending state.
116
115
switch {
117
- case delta .DifferentAt ("Spec.Code" ):
118
- err = rm .updateFunctionCode (ctx , desired , delta )
119
- if err != nil {
120
- // If the source image is not available, we get an error like this:
121
- // "InvalidParameterValueException: Source image 1234567890.dkr.ecr.us-east-2.amazonaws.com/my-lambda:my-tag does not exist. Provide a valid source image."
122
- // Because this may be recoverable (i.e. the image may be pushed once a build completes),
123
- // we requeue the function for reconciliation after one minute.
124
- if strings .Contains (err .Error (), "Provide a valid source image." ) {
125
- return nil , requeueWaitWhileSourceImageDoesNotExist
126
- } else {
127
- return nil , err
128
- }
129
- }
130
116
case delta .DifferentExcept (
131
117
"Spec.Code" ,
132
118
"Spec.Tags" ,
133
119
"Spec.ReservedConcurrentExecutions" ,
134
- "Spec.CodeSigningConfigARN" ):
120
+ "Spec.CodeSigningConfigARN" ,
121
+ "Spec.Code.S3SHA256" ):
135
122
err = rm .updateFunctionConfiguration (ctx , desired , delta )
136
123
if err != nil {
137
124
return nil , err
138
125
}
126
+ case delta .DifferentAt ("Spec.Code" ) || delta .DifferentAt ("Spec.Code.S3SHA256" ):
127
+ err = rm .updateFunctionCode (ctx , desired , delta )
128
+ if err != nil {
129
+ return nil , err
130
+ }
139
131
}
140
132
141
133
readOneLatest , err := rm .ReadOne (ctx , desired )
@@ -402,33 +394,57 @@ func (rm *resourceManager) updateFunctionCode(
402
394
exit := rlog .Trace ("rm.updateFunctionCode" )
403
395
defer exit (err )
404
396
405
- if delta .DifferentAt ("Spec.Code.S3Key" ) &&
406
- ! delta .DifferentAt ("Spec.Code.S3Bucket" ) &&
407
- ! delta .DifferentAt ("Spec.Code.S3ObjectVersion" ) &&
408
- ! delta .DifferentAt ("Spec.Code.ImageURI" ) {
409
- log := ackrtlog .FromContext (ctx )
410
- log .Info ("updating code.s3Key field is not currently supported." )
411
- return nil
412
- }
413
-
414
397
dspec := desired .ko .Spec
415
398
input := & svcsdk.UpdateFunctionCodeInput {
416
399
FunctionName : aws .String (* dspec .Name ),
417
400
}
418
401
419
402
if dspec .Code != nil {
420
- switch {
421
- case dspec .Code .ImageURI != nil :
422
- input .ImageUri = dspec .Code .ImageURI
423
- case dspec .Code .S3Bucket != nil ,
424
- dspec .Code .S3Key != nil ,
425
- dspec .Code .S3ObjectVersion != nil :
426
- input .S3Bucket = dspec .Code .S3Bucket
427
- input .S3Key = dspec .Code .S3Key
428
- input .S3ObjectVersion = dspec .Code .S3ObjectVersion
403
+ if delta .DifferentAt ("Spec.Code.S3SHA256" ) && dspec .Code .S3SHA256 != nil {
404
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
405
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
406
+ if dspec .Code .ImageURI != nil {
407
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
408
+ }
409
+ }
410
+ } else if dspec .PackageType != nil && * dspec .PackageType == "Zip" {
411
+ if dspec .Code .S3Key != nil {
412
+ input .S3Key = aws .String (* dspec .Code .S3Key )
413
+ }
414
+ if dspec .Code .S3Bucket != nil {
415
+ input .S3Bucket = aws .String (* dspec .Code .S3Bucket )
416
+ }
417
+ if dspec .Code .S3ObjectVersion != nil {
418
+ input .S3ObjectVersion = aws .String (* dspec .Code .S3ObjectVersion )
419
+ }
420
+ }
421
+ } else {
422
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
423
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
424
+ if dspec .Code .ImageURI != nil {
425
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
426
+ }
427
+ }
428
+ }
429
429
}
430
430
}
431
431
432
+ // if delta.DifferentAt("Spec.Code.ImageURI") {
433
+ // if dspec.Code.ImageURI != nil {
434
+ // input.ImageUri = aws.String(*dspec.Code.ImageURI)
435
+ // }
436
+ // } else if delta.DifferentAt("Spec.CodeS3SHA256") {
437
+ // if dspec.Code.S3Key != nil {
438
+ // input.S3Key = aws.String(*dspec.Code.S3Key)
439
+ // }
440
+ // if dspec.Code.S3Bucket != nil {
441
+ // input.S3Bucket = aws.String(*dspec.Code.S3Bucket)
442
+ // }
443
+ // if dspec.Code.S3ObjectVersion != nil {
444
+ // input.S3ObjectVersion = aws.String(*dspec.Code.S3ObjectVersion)
445
+ // }
446
+ // }
447
+
432
448
_ , err = rm .sdkapi .UpdateFunctionCodeWithContext (ctx , input )
433
449
rm .metrics .RecordAPICall ("UPDATE" , "UpdateFunctionCode" , err )
434
450
if err != nil {
@@ -476,13 +492,44 @@ func customPreCompare(
476
492
if ackcompare .HasNilDifference (a .ko .Spec .Code , b .ko .Spec .Code ) {
477
493
delta .Add ("Spec.Code" , a .ko .Spec .Code , b .ko .Spec .Code )
478
494
} else if a .ko .Spec .Code != nil && b .ko .Spec .Code != nil {
479
- if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
480
- delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
481
- } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
482
- if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
495
+ if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Image" {
496
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
483
497
delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
498
+ } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
499
+ if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
500
+ delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
501
+ }
502
+ }
503
+ if a .ko .Spec .Code .S3SHA256 != nil {
504
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 ) {
505
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
506
+ } else if a .ko .Spec .Code .S3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
507
+ if * a .ko .Spec .Code .S3SHA256 != * b .ko .Status .CodeSHA256 {
508
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
509
+ }
510
+ }
511
+ }
512
+ } else if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Zip" {
513
+ if a .ko .Spec .Code .S3SHA256 != nil {
514
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 ) {
515
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
516
+ } else if a .ko .Spec .Code .S3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
517
+ if * a .ko .Spec .Code .S3SHA256 != * b .ko .Status .CodeSHA256 {
518
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
519
+ }
520
+ }
484
521
}
485
522
}
523
+
524
+ // No need to compare difference in S3 Key/Bucket/ObjectVersion. As in sdkFind() there is a copy 'ko := r.ko.DeepCopy()'
525
+ // of S3 Key/Bucket/ObjectVersion passed. This 'ko' then stores the values of latest S3 fields which API returns
526
+ // and compares it with desired field values. Since the API doesn't return values of S3 fields, it doesn't
527
+ // notice any changes between desired and latest, hence fails to recognize the update in the values.
528
+
529
+ // To solve this we created a new field 'Code.S3SHA256' to store the hash value of deployment package. Any change
530
+ // in hash value refers to change in S3 Key/Bucket/ObjectVersion and controller can recognize the change in
531
+ // desired and latest value of 'Code.S3SHA256' and hence calls the update function.
532
+
486
533
//TODO(hialylmh) handle Spec.Code.S3bucket changes
487
534
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
488
535
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -491,20 +538,20 @@ func customPreCompare(
491
538
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
492
539
// }
493
540
// }
494
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key ) {
495
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
496
- } else if a .ko .Spec .Code .S3Key != nil && b .ko .Spec .Code .S3Key != nil {
497
- if * a .ko .Spec .Code .S3Key != * b .ko .Spec .Code .S3Key {
498
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
499
- }
500
- }
501
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion ) {
502
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
503
- } else if a .ko .Spec .Code .S3ObjectVersion != nil && b .ko .Spec .Code .S3ObjectVersion != nil {
504
- if * a .ko .Spec .Code .S3ObjectVersion != * b .ko .Spec .Code .S3ObjectVersion {
505
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
506
- }
507
- }
541
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key) {
542
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
543
+ // } else if a.ko.Spec.Code.S3Key != nil && b.ko.Spec.Code.S3Key != nil {
544
+ // if *a.ko.Spec.Code.S3Key != *b.ko.Spec.Code.S3Key {
545
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
546
+ // }
547
+ // }
548
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion) {
549
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
550
+ // } else if a.ko.Spec.Code.S3ObjectVersion != nil && b.ko.Spec.Code.S3ObjectVersion != nil {
551
+ // if *a.ko.Spec.Code.S3ObjectVersion != *b.ko.Spec.Code.S3ObjectVersion {
552
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
553
+ // }
554
+ // }
508
555
}
509
556
}
510
557
0 commit comments