@@ -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 )
@@ -430,33 +422,57 @@ func (rm *resourceManager) updateFunctionCode(
430
422
exit := rlog .Trace ("rm.updateFunctionCode" )
431
423
defer exit (err )
432
424
433
- if delta .DifferentAt ("Spec.Code.S3Key" ) &&
434
- ! delta .DifferentAt ("Spec.Code.S3Bucket" ) &&
435
- ! delta .DifferentAt ("Spec.Code.S3ObjectVersion" ) &&
436
- ! delta .DifferentAt ("Spec.Code.ImageURI" ) {
437
- log := ackrtlog .FromContext (ctx )
438
- log .Info ("updating code.s3Key field is not currently supported." )
439
- return nil
440
- }
441
-
442
425
dspec := desired .ko .Spec
443
426
input := & svcsdk.UpdateFunctionCodeInput {
444
427
FunctionName : aws .String (* dspec .Name ),
445
428
}
446
429
447
430
if dspec .Code != nil {
448
- switch {
449
- case dspec .Code .ImageURI != nil :
450
- input .ImageUri = dspec .Code .ImageURI
451
- case dspec .Code .S3Bucket != nil ,
452
- dspec .Code .S3Key != nil ,
453
- dspec .Code .S3ObjectVersion != nil :
454
- input .S3Bucket = dspec .Code .S3Bucket
455
- input .S3Key = dspec .Code .S3Key
456
- input .S3ObjectVersion = dspec .Code .S3ObjectVersion
431
+ if delta .DifferentAt ("Spec.Code.S3SHA256" ) && dspec .Code .S3SHA256 != nil {
432
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
433
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
434
+ if dspec .Code .ImageURI != nil {
435
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
436
+ }
437
+ }
438
+ } else if dspec .PackageType != nil && * dspec .PackageType == "Zip" {
439
+ if dspec .Code .S3Key != nil {
440
+ input .S3Key = aws .String (* dspec .Code .S3Key )
441
+ }
442
+ if dspec .Code .S3Bucket != nil {
443
+ input .S3Bucket = aws .String (* dspec .Code .S3Bucket )
444
+ }
445
+ if dspec .Code .S3ObjectVersion != nil {
446
+ input .S3ObjectVersion = aws .String (* dspec .Code .S3ObjectVersion )
447
+ }
448
+ }
449
+ } else {
450
+ if dspec .PackageType != nil && * dspec .PackageType == "Image" {
451
+ if delta .DifferentAt ("Spec.Code.ImageURI" ) {
452
+ if dspec .Code .ImageURI != nil {
453
+ input .ImageUri = aws .String (* dspec .Code .ImageURI )
454
+ }
455
+ }
456
+ }
457
457
}
458
458
}
459
459
460
+ // if delta.DifferentAt("Spec.Code.ImageURI") {
461
+ // if dspec.Code.ImageURI != nil {
462
+ // input.ImageUri = aws.String(*dspec.Code.ImageURI)
463
+ // }
464
+ // } else if delta.DifferentAt("Spec.CodeS3SHA256") {
465
+ // if dspec.Code.S3Key != nil {
466
+ // input.S3Key = aws.String(*dspec.Code.S3Key)
467
+ // }
468
+ // if dspec.Code.S3Bucket != nil {
469
+ // input.S3Bucket = aws.String(*dspec.Code.S3Bucket)
470
+ // }
471
+ // if dspec.Code.S3ObjectVersion != nil {
472
+ // input.S3ObjectVersion = aws.String(*dspec.Code.S3ObjectVersion)
473
+ // }
474
+ // }
475
+
460
476
_ , err = rm .sdkapi .UpdateFunctionCodeWithContext (ctx , input )
461
477
rm .metrics .RecordAPICall ("UPDATE" , "UpdateFunctionCode" , err )
462
478
if err != nil {
@@ -504,13 +520,44 @@ func customPreCompare(
504
520
if ackcompare .HasNilDifference (a .ko .Spec .Code , b .ko .Spec .Code ) {
505
521
delta .Add ("Spec.Code" , a .ko .Spec .Code , b .ko .Spec .Code )
506
522
} else if a .ko .Spec .Code != nil && b .ko .Spec .Code != nil {
507
- if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
508
- delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
509
- } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
510
- if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
523
+ if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Image" {
524
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI ) {
511
525
delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
526
+ } else if a .ko .Spec .Code .ImageURI != nil && b .ko .Spec .Code .ImageURI != nil {
527
+ if * a .ko .Spec .Code .ImageURI != * b .ko .Spec .Code .ImageURI {
528
+ delta .Add ("Spec.Code.ImageURI" , a .ko .Spec .Code .ImageURI , b .ko .Spec .Code .ImageURI )
529
+ }
530
+ }
531
+ if a .ko .Spec .Code .S3SHA256 != nil {
532
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 ) {
533
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
534
+ } else if a .ko .Spec .Code .S3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
535
+ if * a .ko .Spec .Code .S3SHA256 != * b .ko .Status .CodeSHA256 {
536
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
537
+ }
538
+ }
539
+ }
540
+ } else if a .ko .Spec .PackageType != nil && * a .ko .Spec .PackageType == "Zip" {
541
+ if a .ko .Spec .Code .S3SHA256 != nil {
542
+ if ackcompare .HasNilDifference (a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 ) {
543
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
544
+ } else if a .ko .Spec .Code .S3SHA256 != nil && b .ko .Status .CodeSHA256 != nil {
545
+ if * a .ko .Spec .Code .S3SHA256 != * b .ko .Status .CodeSHA256 {
546
+ delta .Add ("Spec.Code.S3SHA256" , a .ko .Spec .Code .S3SHA256 , b .ko .Status .CodeSHA256 )
547
+ }
548
+ }
512
549
}
513
550
}
551
+
552
+ // No need to compare difference in S3 Key/Bucket/ObjectVersion. As in sdkFind() there is a copy 'ko := r.ko.DeepCopy()'
553
+ // of S3 Key/Bucket/ObjectVersion passed. This 'ko' then stores the values of latest S3 fields which API returns
554
+ // and compares it with desired field values. Since the API doesn't return values of S3 fields, it doesn't
555
+ // notice any changes between desired and latest, hence fails to recognize the update in the values.
556
+
557
+ // To solve this we created a new field 'Code.S3SHA256' to store the hash value of deployment package. Any change
558
+ // in hash value refers to change in S3 Key/Bucket/ObjectVersion and controller can recognize the change in
559
+ // desired and latest value of 'Code.S3SHA256' and hence calls the update function.
560
+
514
561
//TODO(hialylmh) handle Spec.Code.S3bucket changes
515
562
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
516
563
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -519,20 +566,20 @@ func customPreCompare(
519
566
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
520
567
// }
521
568
// }
522
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key ) {
523
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
524
- } else if a .ko .Spec .Code .S3Key != nil && b .ko .Spec .Code .S3Key != nil {
525
- if * a .ko .Spec .Code .S3Key != * b .ko .Spec .Code .S3Key {
526
- delta .Add ("Spec.Code.S3Key" , a .ko .Spec .Code .S3Key , b .ko .Spec .Code .S3Key )
527
- }
528
- }
529
- if ackcompare .HasNilDifference (a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion ) {
530
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
531
- } else if a .ko .Spec .Code .S3ObjectVersion != nil && b .ko .Spec .Code .S3ObjectVersion != nil {
532
- if * a .ko .Spec .Code .S3ObjectVersion != * b .ko .Spec .Code .S3ObjectVersion {
533
- delta .Add ("Spec.Code.S3ObjectVersion" , a .ko .Spec .Code .S3ObjectVersion , b .ko .Spec .Code .S3ObjectVersion )
534
- }
535
- }
569
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key) {
570
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
571
+ // } else if a.ko.Spec.Code.S3Key != nil && b.ko.Spec.Code.S3Key != nil {
572
+ // if *a.ko.Spec.Code.S3Key != *b.ko.Spec.Code.S3Key {
573
+ // delta.Add("Spec.Code.S3Key", a.ko.Spec.Code.S3Key, b.ko.Spec.Code.S3Key)
574
+ // }
575
+ // }
576
+ // if ackcompare.HasNilDifference(a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion) {
577
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
578
+ // } else if a.ko.Spec.Code.S3ObjectVersion != nil && b.ko.Spec.Code.S3ObjectVersion != nil {
579
+ // if *a.ko.Spec.Code.S3ObjectVersion != *b.ko.Spec.Code.S3ObjectVersion {
580
+ // delta.Add("Spec.Code.S3ObjectVersion", a.ko.Spec.Code.S3ObjectVersion, b.ko.Spec.Code.S3ObjectVersion)
581
+ // }
582
+ // }
536
583
}
537
584
}
538
585
0 commit comments