Skip to content

Commit 5fd9a01

Browse files
ack-botVandita2020
authored andcommitted
Update to ACK runtime v0.25.0, code-generator v0.25.0 (aws-controllers-k8s#87)
---------- * ACK code-generator `v0.25.0` [release notes](https://github.com/aws-controllers-k8s/code-generator/releases/tag/v0.25.0) * ACK runtime `v0.25.0` [release notes](https://github.com/aws-controllers-k8s/runtime/releases/tag/v0.25.0) ---------- NOTE: This PR increments the release version of service controller from `v0.1.6` to `v0.1.7` Once this PR is merged, release `v0.1.7` will be automatically created for `lambda-controller` **Please close this PR, if you do not want the new patch release for `lambda-controller`** ---------- ``` building ack-generate ... ok. ==== building lambda-controller ==== Copying common custom resource definitions into lambda Building Kubernetes API objects for lambda Generating deepcopy code for lambda Generating custom resource definitions for lambda Building service controller for lambda Generating RBAC manifests for lambda Running gofmt against generated code for lambda Updating additional GitHub repository maintenance files ==== building lambda-controller release artifacts ==== Building release artifacts for lambda-v0.1.7 Generating common custom resource definitions Generating custom resource definitions for lambda Generating RBAC manifests for lambda ``` ---------- By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 2653248 commit 5fd9a01

File tree

13 files changed

+160
-69
lines changed

13 files changed

+160
-69
lines changed

apis/v1alpha1/function.go

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/v1alpha1/generator.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ resources:
3838
- path: Status.State
3939
in: [ "Active" ]
4040
fields:
41+
Code.S3SHA256:
42+
type: string
43+
compare:
44+
is_ignored: true
45+
set:
46+
- method: Create
47+
ignore: true
4148
Code.S3Bucket:
4249
references:
4350
resource: Bucket

apis/v1alpha1/types.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/v1alpha1/zz_generated.deepcopy.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/lambda.services.k8s.aws_functions.yaml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ spec:
7070
type: string
7171
s3ObjectVersion:
7272
type: string
73+
s3SHA256:
74+
type: string
7375
zipFile:
7476
format: byte
7577
type: string
@@ -265,11 +267,6 @@ spec:
265267
description: Set to true to publish the first version of the function
266268
during creation.
267269
type: boolean
268-
reservedConcurrentExecutions:
269-
description: The number of simultaneous executions to reserve for
270-
the function.
271-
format: int64
272-
type: integer
273270
role:
274271
description: The Amazon Resource Name (ARN) of the function's execution
275272
role.

generator.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ resources:
3838
- path: Status.State
3939
in: [ "Active" ]
4040
fields:
41+
Code.S3SHA256:
42+
type: string
43+
compare:
44+
is_ignored: true
45+
set:
46+
- method: Create
47+
ignore: true
4148
Code.S3Bucket:
4249
references:
4350
resource: Bucket

helm/crds/lambda.services.k8s.aws_functions.yaml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ spec:
7070
type: string
7171
s3ObjectVersion:
7272
type: string
73+
s3SHA256:
74+
type: string
7375
zipFile:
7476
format: byte
7577
type: string
@@ -265,11 +267,6 @@ spec:
265267
description: Set to true to publish the first version of the function
266268
during creation.
267269
type: boolean
268-
reservedConcurrentExecutions:
269-
description: The number of simultaneous executions to reserve for
270-
the function.
271-
format: int64
272-
type: integer
273270
role:
274271
description: The Amazon Resource Name (ARN) of the function's execution
275272
role.

pkg/resource/function/hooks.go

Lines changed: 98 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package function
1616
import (
1717
"context"
1818
"errors"
19-
"strings"
2019
"time"
2120

2221
ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare"
@@ -114,28 +113,21 @@ func (rm *resourceManager) customUpdateFunction(
114113
// UpdateFunctionCode because both of them can put the function in a
115114
// Pending state.
116115
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-
}
130116
case delta.DifferentExcept(
131117
"Spec.Code",
132118
"Spec.Tags",
133119
"Spec.ReservedConcurrentExecutions",
134-
"Spec.CodeSigningConfigARN"):
120+
"Spec.CodeSigningConfigARN",
121+
"Spec.Code.S3SHA256"):
135122
err = rm.updateFunctionConfiguration(ctx, desired, delta)
136123
if err != nil {
137124
return nil, err
138125
}
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+
}
139131
}
140132

141133
readOneLatest, err := rm.ReadOne(ctx, desired)
@@ -430,33 +422,57 @@ func (rm *resourceManager) updateFunctionCode(
430422
exit := rlog.Trace("rm.updateFunctionCode")
431423
defer exit(err)
432424

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-
442425
dspec := desired.ko.Spec
443426
input := &svcsdk.UpdateFunctionCodeInput{
444427
FunctionName: aws.String(*dspec.Name),
445428
}
446429

447430
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+
}
457457
}
458458
}
459459

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+
460476
_, err = rm.sdkapi.UpdateFunctionCodeWithContext(ctx, input)
461477
rm.metrics.RecordAPICall("UPDATE", "UpdateFunctionCode", err)
462478
if err != nil {
@@ -504,13 +520,44 @@ func customPreCompare(
504520
if ackcompare.HasNilDifference(a.ko.Spec.Code, b.ko.Spec.Code) {
505521
delta.Add("Spec.Code", a.ko.Spec.Code, b.ko.Spec.Code)
506522
} 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) {
511525
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+
}
512549
}
513550
}
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+
514561
//TODO(hialylmh) handle Spec.Code.S3bucket changes
515562
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
516563
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -519,20 +566,20 @@ func customPreCompare(
519566
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
520567
// }
521568
// }
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+
// }
536583
}
537584
}
538585

pkg/resource/function/sdk.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: lambda.services.k8s.aws/v1alpha1
2+
kind: Function
3+
metadata:
4+
name: $FUNCTION_NAME
5+
annotations:
6+
services.k8s.aws/region: $AWS_REGION
7+
spec:
8+
name: $FUNCTION_NAME
9+
code:
10+
s3Bucket: $BUCKET_NAME
11+
s3Key: $LAMBDA_FILE_NAME
12+
s3SHA256: $HASH
13+
role: $LAMBDA_ROLE
14+
runtime: python3.9
15+
handler: main
16+
description: function created by ACK lambda-controller e2e tests
17+
reservedConcurrentExecutions: $RESERVED_CONCURRENT_EXECUTIONS
18+
codeSigningConfigARN: "$CODE_SIGNING_CONFIG_ARN"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
if __name__ == "__main__":
2+
print("Updated Hello ACK!")

test/e2e/service_bootstrap.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
LAMBDA_FUNCTION_FILE_PATH = f"./resources/lambda_function/{LAMBDA_FUNCTION_FILE}"
4545
LAMBDA_FUNCTION_FILE_PATH_ZIP = f"./resources/lambda_function/{LAMBDA_FUNCTION_FILE_ZIP}"
4646

47+
LAMBDA_FUNCTION_UPDATED_FILE = "updated_main.py"
48+
LAMBDA_FUNCTION_UPDATED_FILE_ZIP = "updated_main.zip"
49+
LAMBDA_FUNCTION_UPDATED_FILE_PATH = f"./resources/lambda_function/{LAMBDA_FUNCTION_UPDATED_FILE}"
50+
LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP = f"./resources/lambda_function/{LAMBDA_FUNCTION_UPDATED_FILE_ZIP}"
51+
4752
AWS_SIGNING_PLATFORM_ID = "AWSLambda-SHA384-ECDSA"
4853

4954
def zip_function_file(src: str, dst: str):
@@ -139,6 +144,12 @@ def service_bootstrap() -> Resources:
139144
LAMBDA_FUNCTION_FILE_PATH_ZIP,
140145
resources.FunctionsBucket.name,
141146
)
147+
148+
zip_function_file(LAMBDA_FUNCTION_UPDATED_FILE_PATH, LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP)
149+
upload_function_to_bucket(
150+
LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP,
151+
resources.FunctionsBucket.name,
152+
)
142153
except BootstrapFailureException as ex:
143154
exit(254)
144155
return resources

test/e2e/tests/test_function.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import pytest
1818
import time
1919
import logging
20+
import hashlib
21+
import base64
2022

2123
from acktest import tags
2224
from acktest.resources import random_suffix_name
@@ -26,7 +28,8 @@
2628
from e2e import service_marker, CRD_GROUP, CRD_VERSION, load_lambda_resource
2729
from e2e.replacement_values import REPLACEMENT_VALUES
2830
from e2e.bootstrap_resources import get_bootstrap_resources
29-
from e2e.service_bootstrap import LAMBDA_FUNCTION_FILE_ZIP
31+
from e2e.service_bootstrap import LAMBDA_FUNCTION_FILE_ZIP, LAMBDA_FUNCTION_FILE_PATH_ZIP
32+
from e2e.service_bootstrap import LAMBDA_FUNCTION_UPDATED_FILE_ZIP, LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP
3033
from e2e.tests.helper import LambdaValidator
3134

3235
RESOURCE_PLURAL = "functions"

0 commit comments

Comments
 (0)