Skip to content

Commit 85042fb

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 e7c6f68 commit 85042fb

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
@@ -36,6 +36,13 @@ resources:
3636
- path: Status.State
3737
in: [ "Active" ]
3838
fields:
39+
Code.S3SHA256:
40+
type: string
41+
compare:
42+
is_ignored: true
43+
set:
44+
- method: Create
45+
ignore: true
3946
Code.S3Bucket:
4047
references:
4148
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
@@ -36,6 +36,13 @@ resources:
3636
- path: Status.State
3737
in: [ "Active" ]
3838
fields:
39+
Code.S3SHA256:
40+
type: string
41+
compare:
42+
is_ignored: true
43+
set:
44+
- method: Create
45+
ignore: true
3946
Code.S3Bucket:
4047
references:
4148
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)
@@ -402,33 +394,57 @@ func (rm *resourceManager) updateFunctionCode(
402394
exit := rlog.Trace("rm.updateFunctionCode")
403395
defer exit(err)
404396

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-
414397
dspec := desired.ko.Spec
415398
input := &svcsdk.UpdateFunctionCodeInput{
416399
FunctionName: aws.String(*dspec.Name),
417400
}
418401

419402
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+
}
429429
}
430430
}
431431

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+
432448
_, err = rm.sdkapi.UpdateFunctionCodeWithContext(ctx, input)
433449
rm.metrics.RecordAPICall("UPDATE", "UpdateFunctionCode", err)
434450
if err != nil {
@@ -476,13 +492,44 @@ func customPreCompare(
476492
if ackcompare.HasNilDifference(a.ko.Spec.Code, b.ko.Spec.Code) {
477493
delta.Add("Spec.Code", a.ko.Spec.Code, b.ko.Spec.Code)
478494
} 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) {
483497
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+
}
484521
}
485522
}
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+
486533
//TODO(hialylmh) handle Spec.Code.S3bucket changes
487534
// if ackcompare.HasNilDifference(a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket) {
488535
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
@@ -491,20 +538,20 @@ func customPreCompare(
491538
// delta.Add("Spec.Code.S3Bucket", a.ko.Spec.Code.S3Bucket, b.ko.Spec.Code.S3Bucket)
492539
// }
493540
// }
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+
// }
508555
}
509556
}
510557

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)