Skip to content

Commit 0402545

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

File tree

4 files changed

+52
-17
lines changed

4 files changed

+52
-17
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: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ func (rm *resourceManager) syncEventInvokeConfig(
7171
return r, nil
7272
}
7373

74+
// updateProvisionedConcurrency calls `PutProvisionedConcurrencyConfig` to update the fields
75+
// or `DeleteProvisionedConcurrencyConfig` if users removes the fields
7476
func (rm *resourceManager) updateProvisionedConcurrency(
7577
ctx context.Context,
7678
desired *resource,
@@ -80,20 +82,29 @@ func (rm *resourceManager) updateProvisionedConcurrency(
8082
exit := rlog.Trace("rm.updateProvisionedConcurrency")
8183
defer exit(err)
8284

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

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)
106+
if dspec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions != nil {
107+
input.ProvisionedConcurrentExecutions = aws.Int64(*dspec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions)
97108
}
98109

99110
_, err = rm.sdkapi.PutProvisionedConcurrencyConfigWithContext(ctx, input)
@@ -104,10 +115,15 @@ func (rm *resourceManager) updateProvisionedConcurrency(
104115
return nil
105116
}
106117

107-
func (rm *resourceManager) getProvisionedConcurrencyConfig(
118+
// setProvisionedConcurrencyConfig sets the Provisioned Concurrency
119+
// for the Function's Alias
120+
func (rm *resourceManager) setProvisionedConcurrencyConfig(
108121
ctx context.Context,
109122
ko *svcapitypes.Alias,
110123
) (err error) {
124+
rlog := ackrtlog.FromContext(ctx)
125+
exit := rlog.Trace("rm.setProvisionedConcurrencyConfig")
126+
defer exit(err)
111127

112128
var getProvisionedConcurrencyConfigOutput *svcsdk.GetProvisionedConcurrencyConfigOutput
113129
getProvisionedConcurrencyConfigOutput, err = rm.sdkapi.GetProvisionedConcurrencyConfigWithContext(
@@ -126,12 +142,17 @@ func (rm *resourceManager) getProvisionedConcurrencyConfig(
126142
return err
127143
}
128144
} else {
129-
ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
145+
// creating ProvisionedConcurrency object to store the values returned from `Get` call
146+
cloudProvisionedConcurrency := &svcapitypes.PutProvisionedConcurrencyConfigInput{}
147+
cloudProvisionedConcurrency.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
148+
ko.Spec.ProvisionedConcurrencyConfig = cloudProvisionedConcurrency
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 the
208+
// getFunctionConfiguration API call
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

217+
// To set Asynchronous Invocations for the function's alias
194218
eic_err := rm.getFunctionEventInvokeConfig(ctx, ko)
195219
if eic_err != nil {
196220
return eic_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.setProvisionedConcurrencyConfig(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: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,6 @@ 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)
399398
# assert condition
400399
assert k8s.assert_condition_state_message(
401400
ref,

0 commit comments

Comments
 (0)