Skip to content

Commit 09227fa

Browse files
ack-botVandita2020
authored andcommitted
Update to ACK runtime v0.25.0, code-generator v0.25.0 (#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 39f35a1 commit 09227fa

12 files changed

+235
-45
lines changed

apis/v1alpha1/ack-generate-metadata.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ api_directory_checksum: a9fcef68210dd72b4b2e37052f2c1a9e971326c6
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.44.181
99
generator_config_info:
10-
file_checksum: 095af1082df5c34cdc12296dc085bc6b2b7eadb9
10+
file_checksum: e495db568ae64db031fcfa40b8a53f9866f22302
1111
original_file_name: generator.yaml
1212
last_modification:
1313
reason: API generation

apis/v1alpha1/function.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/v1alpha1/generator.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ resources:
1919
- path: Status.State
2020
in: [ "Active" ]
2121
fields:
22+
CodeS3SHA256:
23+
type: String
24+
compare:
25+
is_ignored: true
2226
Code.S3Bucket:
2327
references:
2428
resource: Bucket

apis/v1alpha1/zz_generated.deepcopy.go

+5
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

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ spec:
6969
format: byte
7070
type: string
7171
type: object
72+
codeS3SHA256:
73+
type: string
7274
codeSigningConfigARN:
7375
description: To enable code signing for this function, specify the
7476
ARN of a code-signing configuration. A code-signing configuration

generator.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ resources:
1919
- path: Status.State
2020
in: [ "Active" ]
2121
fields:
22+
CodeS3SHA256:
23+
type: String
24+
compare:
25+
is_ignored: true
2226
Code.S3Bucket:
2327
references:
2428
resource: Bucket

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

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ spec:
6969
format: byte
7070
type: string
7171
type: object
72+
codeS3SHA256:
73+
type: string
7274
codeSigningConfigARN:
7375
description: To enable code signing for this function, specify the
7476
ARN of a code-signing configuration. A code-signing configuration

pkg/resource/function/hooks.go

+98-42
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,21 @@ func (rm *resourceManager) customUpdateFunction(
9696
// UpdateFunctionCode because both of them can put the function in a
9797
// Pending state.
9898
switch {
99-
case delta.DifferentAt("Spec.Code"):
100-
err = rm.updateFunctionCode(ctx, desired, delta)
101-
if err != nil {
102-
return nil, err
103-
}
10499
case delta.DifferentExcept(
105100
"Spec.Code",
106101
"Spec.Tags",
107102
"Spec.ReservedConcurrentExecutions",
108-
"Spec.CodeSigningConfigARN"):
103+
"Spec.CodeSigningConfigARN",
104+
"Spec.CodeS3SHA256"):
109105
err = rm.updateFunctionConfiguration(ctx, desired, delta)
110106
if err != nil {
111107
return nil, err
112108
}
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+
}
113114
}
114115

115116
readOneLatest, err := rm.ReadOne(ctx, desired)
@@ -335,33 +336,57 @@ func (rm *resourceManager) updateFunctionCode(
335336
exit := rlog.Trace("rm.updateFunctionCode")
336337
defer exit(err)
337338

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-
347339
dspec := desired.ko.Spec
348340
input := &svcsdk.UpdateFunctionCodeInput{
349341
FunctionName: aws.String(*dspec.Name),
350342
}
351343

352344
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+
}
362371
}
363372
}
364373

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+
365390
_, err = rm.sdkapi.UpdateFunctionCodeWithContext(ctx, input)
366391
rm.metrics.RecordAPICall("UPDATE", "UpdateFunctionCode", err)
367392
if err != nil {
@@ -409,13 +434,44 @@ func customPreCompare(
409434
if ackcompare.HasNilDifference(a.ko.Spec.Code, b.ko.Spec.Code) {
410435
delta.Add("Spec.Code", a.ko.Spec.Code, b.ko.Spec.Code)
411436
} 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) {
416439
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+
}
417463
}
418464
}
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+
419475
//TODO(hialylmh) handle Spec.Code.S3bucket changes
420476
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
421477
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -424,20 +480,20 @@ func customPreCompare(
424480
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
425481
// }
426482
// }
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+
// }
441497
}
442498
}
443499

+18
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+
role: $LAMBDA_ROLE
13+
codeS3SHA256: $HASH
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"
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

+11
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
LAMBDA_FUNCTION_FILE_PATH = f"./resources/lambda_function/{LAMBDA_FUNCTION_FILE}"
4444
LAMBDA_FUNCTION_FILE_PATH_ZIP = f"./resources/lambda_function/{LAMBDA_FUNCTION_FILE_ZIP}"
4545

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

4853
def zip_function_file(src: str, dst: str):
@@ -127,6 +132,12 @@ def service_bootstrap() -> Resources:
127132
LAMBDA_FUNCTION_FILE_PATH_ZIP,
128133
resources.FunctionsBucket.name,
129134
)
135+
136+
zip_function_file(LAMBDA_FUNCTION_UPDATED_FILE_PATH, LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP)
137+
upload_function_to_bucket(
138+
LAMBDA_FUNCTION_UPDATED_FILE_PATH_ZIP,
139+
resources.FunctionsBucket.name,
140+
)
130141
except BootstrapFailureException as ex:
131142
exit(254)
132143
return resources

0 commit comments

Comments
 (0)