Skip to content

Commit d7d9d0a

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

File tree

3 files changed

+51
-17
lines changed

3 files changed

+51
-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: 37 additions & 14 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,21 +82,28 @@ 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 || desired.ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions == 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)
97-
}
106+
input.ProvisionedConcurrentExecutions = aws.Int64(*dspec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions)
98107

99108
_, err = rm.sdkapi.PutProvisionedConcurrencyConfigWithContext(ctx, input)
100109
rm.metrics.RecordAPICall("UPDATE", "UpdateProvisionedConcurrency", err)
@@ -104,10 +113,15 @@ func (rm *resourceManager) updateProvisionedConcurrency(
104113
return nil
105114
}
106115

107-
func (rm *resourceManager) getProvisionedConcurrencyConfig(
116+
// setProvisionedConcurrencyConfig sets the Provisioned Concurrency
117+
// for the Function's Alias
118+
func (rm *resourceManager) setProvisionedConcurrencyConfig(
108119
ctx context.Context,
109120
ko *svcapitypes.Alias,
110121
) (err error) {
122+
rlog := ackrtlog.FromContext(ctx)
123+
exit := rlog.Trace("rm.setProvisionedConcurrencyConfig")
124+
defer exit(err)
111125

112126
var getProvisionedConcurrencyConfigOutput *svcsdk.GetProvisionedConcurrencyConfigOutput
113127
getProvisionedConcurrencyConfigOutput, err = rm.sdkapi.GetProvisionedConcurrencyConfigWithContext(
@@ -126,12 +140,17 @@ func (rm *resourceManager) getProvisionedConcurrencyConfig(
126140
return err
127141
}
128142
} else {
129-
ko.Spec.ProvisionedConcurrencyConfig.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
143+
// creating ProvisionedConcurrency object to store the values returned from `Get` call
144+
cloudProvisionedConcurrency := &svcapitypes.PutProvisionedConcurrencyConfigInput{}
145+
cloudProvisionedConcurrency.ProvisionedConcurrentExecutions = getProvisionedConcurrencyConfigOutput.RequestedProvisionedConcurrentExecutions
146+
ko.Spec.ProvisionedConcurrencyConfig = cloudProvisionedConcurrency
130147
}
131148

132149
return nil
133150
}
134151

152+
// getFunctionEventInvokeConfig will describe the fields that are
153+
// custom to the Alias resource
135154
func (rm *resourceManager) getFunctionEventInvokeConfig(
136155
ctx context.Context,
137156
ko *svcapitypes.Alias,
@@ -183,6 +202,8 @@ func (rm *resourceManager) getFunctionEventInvokeConfig(
183202
return nil
184203
}
185204

205+
// setResourceAdditionalFields will describe the fields that are not return by the
206+
// getFunctionConfiguration API call
186207
func (rm *resourceManager) setResourceAdditionalFields(
187208
ctx context.Context,
188209
ko *svcapitypes.Alias,
@@ -191,14 +212,16 @@ func (rm *resourceManager) setResourceAdditionalFields(
191212
exit := rlog.Trace("rm.setResourceAdditionalFields")
192213
defer exit(err)
193214

215+
// To set Asynchronous Invocations for the function's alias
194216
eic_err := rm.getFunctionEventInvokeConfig(ctx, ko)
195217
if eic_err != nil {
196218
return eic_err
197219
}
198220

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

204227
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

0 commit comments

Comments
 (0)