Skip to content

Commit c4c0fc4

Browse files
committed
Bug fix for Provisioned Concurrency
1 parent 4a0b79d commit c4c0fc4

File tree

4 files changed

+55
-19
lines changed

4 files changed

+55
-19
lines changed

apis/v1alpha1/ack-generate-metadata.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
ack_generate_info:
2-
build_date: "2023-07-24T18:19:28Z"
2+
build_date: "2023-08-02T20:25:36Z"
33
build_hash: e9b68590da73ce9143ba1e4361cebdc1d876c81e
44
go_version: go1.19
55
version: v0.26.1-7-ge9b6859

pkg/resource/alias/hooks.go

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,20 +80,29 @@ func (rm *resourceManager) updateProvisionedConcurrency(
8080
exit := rlog.Trace("rm.updateProvisionedConcurrency")
8181
defer exit(err)
8282

83+
// Check if the user deleted the 'ProvisionedConcurrency' configuration
84+
// If yes, delete ProvisionedConcurrencyConfig
85+
if desired.ko.Spec.ProvisionedConcurrencyConfig == nil {
86+
input_delete := &svcsdk.DeleteProvisionedConcurrencyConfigInput{
87+
FunctionName: aws.String(*desired.ko.Spec.FunctionName),
88+
Qualifier: aws.String(*desired.ko.Spec.Name),
89+
}
90+
_, err = rm.sdkapi.DeleteProvisionedConcurrencyConfigWithContext(ctx, input_delete)
91+
rm.metrics.RecordAPICall("DELETE", "DeleteProvisionedConcurrency", err)
92+
if err != nil {
93+
return err
94+
}
95+
return nil
96+
}
97+
8398
dspec := desired.ko.Spec
8499
input := &svcsdk.PutProvisionedConcurrencyConfigInput{
85100
FunctionName: aws.String(*dspec.FunctionName),
86101
Qualifier: aws.String(*dspec.Name),
87102
}
88103

89-
if desired.ko.Spec.ProvisionedConcurrencyConfig != nil {
90-
if desired.ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions != nil {
91-
input.ProvisionedConcurrentExecutions = aws.Int64(*desired.ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions)
92-
} else {
93-
input.ProvisionedConcurrentExecutions = aws.Int64(0)
94-
}
95-
} else {
96-
input.ProvisionedConcurrentExecutions = aws.Int64(0)
104+
if dspec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions != nil {
105+
input.ProvisionedConcurrentExecutions = aws.Int64(*dspec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions)
97106
}
98107

99108
_, err = rm.sdkapi.PutProvisionedConcurrencyConfigWithContext(ctx, input)
@@ -104,6 +113,8 @@ func (rm *resourceManager) updateProvisionedConcurrency(
104113
return nil
105114
}
106115

116+
// getProvisionedConcurrencyConfig will describe the fields that are
117+
// custom to the Alias resource
107118
func (rm *resourceManager) getProvisionedConcurrencyConfig(
108119
ctx context.Context,
109120
ko *svcapitypes.Alias,
@@ -126,12 +137,22 @@ func (rm *resourceManager) getProvisionedConcurrencyConfig(
126137
return err
127138
}
128139
} else {
129-
ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
140+
if ko.Spec.ProvisionedConcurrencyConfig != nil {
141+
if ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions != nil {
142+
ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
143+
}
144+
} else {
145+
cloudProvisionedConcurrency := &svcapitypes.PutProvisionedConcurrencyConfigInput{}
146+
cloudProvisionedConcurrency.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
147+
ko.Spec.ProvisionedConcurrencyConfig = cloudProvisionedConcurrency
148+
}
130149
}
131150

132151
return nil
133152
}
134153

154+
// getFunctionEventInvokeConfig will describe the fields that are
155+
// custom to the Alias resource
135156
func (rm *resourceManager) getFunctionEventInvokeConfig(
136157
ctx context.Context,
137158
ko *svcapitypes.Alias,
@@ -183,6 +204,8 @@ func (rm *resourceManager) getFunctionEventInvokeConfig(
183204
return nil
184205
}
185206

207+
// setResourceAdditionalFields will describe the fields that are not return by
208+
// API calls
186209
func (rm *resourceManager) setResourceAdditionalFields(
187210
ctx context.Context,
188211
ko *svcapitypes.Alias,
@@ -191,14 +214,16 @@ func (rm *resourceManager) setResourceAdditionalFields(
191214
exit := rlog.Trace("rm.setResourceAdditionalFields")
192215
defer exit(err)
193216

194-
eic_err := rm.getFunctionEventInvokeConfig(ctx, ko)
195-
if eic_err != nil {
196-
return eic_err
217+
// To set Asynchronous Invocations for the function's alias
218+
err = rm.getFunctionEventInvokeConfig(ctx, ko)
219+
if err != nil {
220+
return err
197221
}
198222

199-
pc_err := rm.getProvisionedConcurrencyConfig(ctx, ko)
200-
if pc_err != nil {
201-
return pc_err
223+
// To set Provisioned Concurrency for the function's alias
224+
err = rm.getProvisionedConcurrencyConfig(ctx, ko)
225+
if err != nil {
226+
return err
202227
}
203228

204229
return nil

test/e2e/tests/test_alias.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,17 +245,28 @@ def test_provisioned_concurrency_config(self, lambda_client, lambda_function):
245245
# Check alias exists
246246
assert lambda_validator.alias_exists(resource_name, lambda_function_name)
247247

248-
# Update cr
248+
# Update provisioned_concurrency
249249
cr["spec"]["provisionedConcurrencyConfig"]["provisionedConcurrentExecutions"] = 2
250250

251251
# Patch k8s resource
252252
k8s.patch_custom_resource(ref, cr)
253253
time.sleep(UPDATE_WAIT_AFTER_SECONDS)
254254

255-
#Check function_event_invoke_config update fields
255+
#Check provisioned_concurrency_config update fields
256256
provisioned_concurrency_config = lambda_validator.get_provisioned_concurrency_config(lambda_function_name,resource_name)
257257
assert provisioned_concurrency_config["RequestedProvisionedConcurrentExecutions"] == 2
258258

259+
# Delete provisioned_concurrency from alias
260+
cr = k8s.wait_resource_consumed_by_controller(ref)
261+
cr["spec"]["provisionedConcurrencyConfig"] = None
262+
263+
# Patch k8s resource
264+
k8s.patch_custom_resource(ref, cr)
265+
time.sleep(UPDATE_WAIT_AFTER_SECONDS)
266+
267+
#Check provisioned_concurrency_config is deleted
268+
assert not lambda_validator.get_provisioned_concurrency_config(lambda_function_name, resource_name)
269+
259270
# Delete k8s resource
260271
_, deleted = k8s.delete_custom_resource(ref)
261272
assert deleted

test/e2e/tests/test_function.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def test_function_package_type_image_with_signing_config(self, lambda_client):
395395

396396
time.sleep(UPDATE_WAIT_AFTER_SECONDS)
397397

398-
cr = k8s.wait_resource_consumed_by_controller(ref)
398+
# cr = k8s.wait_resource_consumed_by_controller(ref)
399399
# assert condition
400400
assert k8s.assert_condition_state_message(
401401
ref,

0 commit comments

Comments
 (0)