Skip to content

Commit 166103d

Browse files
authored
Bug fix for EventInvokeConfig (#107)
Issue #, if available: Related PR: #92 #93 **Summary** Fixing deletion part for `EventInvokeConfig` field. **Description:** This PR is related to bug fixes in [previous PR](#97) related to `EventInvokeConfig` implementation. When the user deleted the set configurations for Function/Alias resource, the configurations were not deleted from the Console side, instead it used to throw an error. Fixed the bug by introducing a new condition to check if the desired configurations are nil or not, if yes then call the delete API. Example of changes for `EventInvokeConfig` in Alias resource is given below: ``` if r.ko.Spec.FunctionEventInvokeConfig == nil { input_delete := &svcsdk.DeleteFunctionEventInvokeConfigInput{ FunctionName: aws.String(*r.ko.Spec.FunctionName), Qualifier: aws.String(*r.ko.Spec.Name), } _, err = rm.sdkapi.DeleteFunctionEventInvokeConfigWithContext(ctx, input_delete) rm.metrics.RecordAPICall("DELETE", "DeleteFunctionEventInvokeConfig", err) if err != nil { return nil, err } return r, nil } ``` This PR contains implementation code and E2E test to validate the changes. **Acknowledgment** By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 330f753 commit 166103d

File tree

4 files changed

+217
-115
lines changed

4 files changed

+217
-115
lines changed

pkg/resource/alias/hooks.go

Lines changed: 64 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
svcapitypes "github.com/aws-controllers-k8s/lambda-controller/apis/v1alpha1"
2525
)
2626

27+
// syncEventInvokeConfig calls `PutFunctionEventInvokeConfig` to update the fields
28+
// or `DeleteFunctionEventInvokeConfig` if users removes the fields
2729
func (rm *resourceManager) syncEventInvokeConfig(
2830
ctx context.Context,
2931
r *resource,
@@ -32,42 +34,55 @@ func (rm *resourceManager) syncEventInvokeConfig(
3234
exit := rlog.Trace("rm.syncEventInvokeConfig")
3335
defer exit(err)
3436

37+
// Check if the user deleted the 'FunctionEventInvokeConfig' configuration
38+
// If yes, delete FunctionEventInvokeConfig
39+
if r.ko.Spec.FunctionEventInvokeConfig == nil {
40+
input_delete := &svcsdk.DeleteFunctionEventInvokeConfigInput{
41+
FunctionName: aws.String(*r.ko.Spec.FunctionName),
42+
Qualifier: aws.String(*r.ko.Spec.Name),
43+
}
44+
_, err = rm.sdkapi.DeleteFunctionEventInvokeConfigWithContext(ctx, input_delete)
45+
rm.metrics.RecordAPICall("DELETE", "DeleteFunctionEventInvokeConfig", err)
46+
if err != nil {
47+
return nil, err
48+
}
49+
return r, nil
50+
}
51+
3552
dspec := r.ko.Spec
3653
input := &svcsdk.PutFunctionEventInvokeConfigInput{
3754
FunctionName: aws.String(*dspec.FunctionName),
3855
Qualifier: aws.String(*dspec.Name),
3956
}
4057

41-
if r.ko.Spec.FunctionEventInvokeConfig != nil {
42-
if r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig != nil {
43-
destinations := &svcsdk.DestinationConfig{}
44-
if r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnFailure != nil {
45-
destinations.OnFailure = &svcsdk.OnFailure{}
46-
if r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination != nil {
47-
destinations.OnFailure.Destination = aws.String(*r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination)
48-
}
49-
}
50-
if r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess != nil {
51-
destinations.OnSuccess = &svcsdk.OnSuccess{}
52-
if r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination != nil {
53-
destinations.OnSuccess.Destination = aws.String(*r.ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination)
54-
}
58+
if dspec.FunctionEventInvokeConfig.DestinationConfig != nil {
59+
destinations := &svcsdk.DestinationConfig{}
60+
if dspec.FunctionEventInvokeConfig.DestinationConfig.OnFailure != nil {
61+
destinations.OnFailure = &svcsdk.OnFailure{}
62+
if dspec.FunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination != nil {
63+
destinations.OnFailure.Destination = aws.String(*dspec.FunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination)
5564
}
56-
input.DestinationConfig = destinations
5765
}
58-
if r.ko.Spec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds != nil {
59-
input.MaximumEventAgeInSeconds = aws.Int64(*r.ko.Spec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds)
60-
}
61-
if r.ko.Spec.FunctionEventInvokeConfig.MaximumRetryAttempts != nil {
62-
input.MaximumRetryAttempts = aws.Int64(*r.ko.Spec.FunctionEventInvokeConfig.MaximumRetryAttempts)
66+
if dspec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess != nil {
67+
destinations.OnSuccess = &svcsdk.OnSuccess{}
68+
if dspec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination != nil {
69+
destinations.OnSuccess.Destination = aws.String(*dspec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination)
70+
}
6371
}
72+
input.DestinationConfig = destinations
6473
}
74+
if dspec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds != nil {
75+
input.MaximumEventAgeInSeconds = aws.Int64(*dspec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds)
76+
}
77+
if dspec.FunctionEventInvokeConfig.MaximumRetryAttempts != nil {
78+
input.MaximumRetryAttempts = aws.Int64(*dspec.FunctionEventInvokeConfig.MaximumRetryAttempts)
79+
}
80+
6581
_, err = rm.sdkapi.PutFunctionEventInvokeConfigWithContext(ctx, input)
6682
rm.metrics.RecordAPICall("UPDATE", "SyncEventInvokeConfig", err)
6783
if err != nil {
6884
return nil, err
6985
}
70-
7186
return r, nil
7287
}
7388

@@ -148,12 +163,33 @@ func (rm *resourceManager) setProvisionedConcurrencyConfig(
148163
return nil
149164
}
150165

151-
// getFunctionEventInvokeConfig will describe the fields that are
152-
// custom to the Alias resource
153-
func (rm *resourceManager) getFunctionEventInvokeConfig(
166+
func (rm *resourceManager) setFunctionEventInvokeConfigFromResponse(
167+
ko *svcapitypes.Alias,
168+
getFunctionEventInvokeConfigOutput *svcsdk.GetFunctionEventInvokeConfigOutput,
169+
) {
170+
// creating FunctionEventInvokeConfig object to store the values returned from `Get` call
171+
cloudFunctionEventInvokeConfig := &svcapitypes.PutFunctionEventInvokeConfigInput{}
172+
cloudFunctionEventInvokeConfig.DestinationConfig = &svcapitypes.DestinationConfig{}
173+
cloudFunctionEventInvokeConfig.DestinationConfig.OnFailure = &svcapitypes.OnFailure{}
174+
cloudFunctionEventInvokeConfig.DestinationConfig.OnSuccess = &svcapitypes.OnSuccess{}
175+
cloudFunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination = getFunctionEventInvokeConfigOutput.DestinationConfig.OnFailure.Destination
176+
cloudFunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination = getFunctionEventInvokeConfigOutput.DestinationConfig.OnSuccess.Destination
177+
cloudFunctionEventInvokeConfig.MaximumEventAgeInSeconds = getFunctionEventInvokeConfigOutput.MaximumEventAgeInSeconds
178+
cloudFunctionEventInvokeConfig.MaximumRetryAttempts = getFunctionEventInvokeConfigOutput.MaximumRetryAttempts
179+
ko.Spec.FunctionEventInvokeConfig = cloudFunctionEventInvokeConfig
180+
181+
}
182+
183+
// setFunctionEventInvokeConfig sets the fields to set asynchronous invocation
184+
// for Function's Alias
185+
func (rm *resourceManager) setFunctionEventInvokeConfig(
154186
ctx context.Context,
155187
ko *svcapitypes.Alias,
156188
) (err error) {
189+
rlog := ackrtlog.FromContext(ctx)
190+
exit := rlog.Trace("rm.setFunctionEventInvokeConfig")
191+
defer exit(err)
192+
157193
var getFunctionEventInvokeConfigOutput *svcsdk.GetFunctionEventInvokeConfigOutput
158194
getFunctionEventInvokeConfigOutput, err = rm.sdkapi.GetFunctionEventInvokeConfigWithContext(
159195
ctx,
@@ -162,7 +198,6 @@ func (rm *resourceManager) getFunctionEventInvokeConfig(
162198
Qualifier: ko.Spec.Name,
163199
},
164200
)
165-
166201
rm.metrics.RecordAPICall("GET", "GetFunctionEventInvokeConfig", err)
167202

168203
if err != nil {
@@ -172,30 +207,7 @@ func (rm *resourceManager) getFunctionEventInvokeConfig(
172207
return err
173208
}
174209
} else {
175-
if getFunctionEventInvokeConfigOutput.DestinationConfig != nil {
176-
if getFunctionEventInvokeConfigOutput.DestinationConfig.OnFailure != nil {
177-
if getFunctionEventInvokeConfigOutput.DestinationConfig.OnFailure.Destination != nil {
178-
ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnFailure.Destination = getFunctionEventInvokeConfigOutput.DestinationConfig.OnFailure.Destination
179-
}
180-
}
181-
if getFunctionEventInvokeConfigOutput.DestinationConfig.OnSuccess != nil {
182-
if getFunctionEventInvokeConfigOutput.DestinationConfig.OnSuccess.Destination != nil {
183-
ko.Spec.FunctionEventInvokeConfig.DestinationConfig.OnSuccess.Destination = getFunctionEventInvokeConfigOutput.DestinationConfig.OnSuccess.Destination
184-
}
185-
}
186-
} else {
187-
ko.Spec.FunctionEventInvokeConfig.DestinationConfig = nil
188-
}
189-
if getFunctionEventInvokeConfigOutput.MaximumEventAgeInSeconds != nil {
190-
ko.Spec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds = getFunctionEventInvokeConfigOutput.MaximumEventAgeInSeconds
191-
} else {
192-
ko.Spec.FunctionEventInvokeConfig.MaximumEventAgeInSeconds = nil
193-
}
194-
if getFunctionEventInvokeConfigOutput.DestinationConfig != nil {
195-
ko.Spec.FunctionEventInvokeConfig.MaximumRetryAttempts = getFunctionEventInvokeConfigOutput.MaximumRetryAttempts
196-
} else {
197-
ko.Spec.FunctionEventInvokeConfig.MaximumRetryAttempts = nil
198-
}
210+
rm.setFunctionEventInvokeConfigFromResponse(ko, getFunctionEventInvokeConfigOutput)
199211
}
200212

201213
return nil
@@ -212,9 +224,9 @@ func (rm *resourceManager) setResourceAdditionalFields(
212224
defer exit(err)
213225

214226
// To set Asynchronous Invocations for the function's alias
215-
eic_err := rm.getFunctionEventInvokeConfig(ctx, ko)
216-
if eic_err != nil {
217-
return eic_err
227+
err = rm.setFunctionEventInvokeConfig(ctx, ko)
228+
if err != nil {
229+
return err
218230
}
219231

220232
// To set Provisioned Concurrency for the function's alias

0 commit comments

Comments
 (0)