Skip to content

Commit f09171b

Browse files
committed
Fix GoCodeSetResourceForStruct for non-CRD fields
Previously, the code-generator was unable to use `GoCodeSetResourceForStruct` for fields that are not part of a CRD spec or status. This caused issues when trying to generate custom code that transforms an eventbridge `v1alpha1.Target` to an `svcsdk.Target`. This patch fixes the issue by allowing users to call `GoCodeSetResourceForStruct` for any field, not just CRD top level fields. In addition, unit tests have been added to ensure the correct behavior. Signed-off-by: Amine Hilaly <hilalyamine@gmail.com>
1 parent 97912dd commit f09171b

File tree

3 files changed

+347
-6
lines changed

3 files changed

+347
-6
lines changed

pkg/generate/ack/controller.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,13 @@ var (
111111
return code.SetSDKForStruct(r.Config(), r, targetFieldName, targetVarName, targetShapeRef, sourceFieldPath, sourceVarName, indentLevel)
112112
},
113113
"GoCodeSetResourceForStruct": func(r *ackmodel.CRD, targetFieldName string, targetVarName string, targetShapeRef *awssdkmodel.ShapeRef, sourceVarName string, sourceShapeRef *awssdkmodel.ShapeRef, indentLevel int) string {
114-
f, ok := r.Fields[targetFieldName]
115-
if !ok {
116-
return ""
117-
}
114+
var setCfg *ackgenconfig.SetFieldConfig = nil
118115
// We may have some special instructions for how to handle setting the
119116
// field value...
120-
setCfg := f.GetSetterConfig(model.OpTypeList)
121-
117+
f, ok := r.Fields[targetFieldName]
118+
if ok {
119+
setCfg = f.GetSetterConfig(ackmodel.OpTypeList)
120+
}
122121
if setCfg != nil && setCfg.Ignore {
123122
return ""
124123
}

pkg/generate/code/set_resource_test.go

Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3273,6 +3273,336 @@ func TestSetResource_EC2_DHCPOptions_NestedSetConfig(t *testing.T) {
32733273
)
32743274
}
32753275

3276+
func TestSetResource_EventBridge_Rule_SetResourceForStruct(t *testing.T) {
3277+
assert := assert.New(t)
3278+
require := require.New(t)
3279+
3280+
g := testutil.NewModelForService(t, "eventbridge")
3281+
3282+
crd := testutil.GetCRDByName(t, g, "Rule")
3283+
require.NotNil(crd)
3284+
3285+
// Getting CRD Target shape
3286+
field, ok := crd.SpecFields["Targets"]
3287+
require.True(ok)
3288+
koShape := &field.ShapeRef.Shape.MemberRef
3289+
3290+
// Getting SDK Target shape
3291+
putTargetsOP, ok := g.SDKAPI.API.Operations["PutTargets"]
3292+
require.True(ok)
3293+
targetsShape, ok := putTargetsOP.InputRef.Shape.MemberRefs["Targets"]
3294+
require.True(ok)
3295+
targetShape := &targetsShape.Shape.MemberRef
3296+
3297+
expected := ` if resp.Arn != nil {
3298+
ko.ARN = resp.Arn
3299+
}
3300+
if resp.BatchParameters != nil {
3301+
kof1 := &svcapitypes.BatchParameters{}
3302+
if resp.BatchParameters.ArrayProperties != nil {
3303+
kof1f0 := &svcapitypes.BatchArrayProperties{}
3304+
if resp.BatchParameters.ArrayProperties.Size != nil {
3305+
kof1f0.Size = resp.BatchParameters.ArrayProperties.Size
3306+
}
3307+
kof1.ArrayProperties = kof1f0
3308+
}
3309+
if resp.BatchParameters.JobDefinition != nil {
3310+
kof1.JobDefinition = resp.BatchParameters.JobDefinition
3311+
}
3312+
if resp.BatchParameters.JobName != nil {
3313+
kof1.JobName = resp.BatchParameters.JobName
3314+
}
3315+
if resp.BatchParameters.RetryStrategy != nil {
3316+
kof1f3 := &svcapitypes.BatchRetryStrategy{}
3317+
if resp.BatchParameters.RetryStrategy.Attempts != nil {
3318+
kof1f3.Attempts = resp.BatchParameters.RetryStrategy.Attempts
3319+
}
3320+
kof1.RetryStrategy = kof1f3
3321+
}
3322+
ko.BatchParameters = kof1
3323+
}
3324+
if resp.DeadLetterConfig != nil {
3325+
kof2 := &svcapitypes.DeadLetterConfig{}
3326+
if resp.DeadLetterConfig.Arn != nil {
3327+
kof2.ARN = resp.DeadLetterConfig.Arn
3328+
}
3329+
ko.DeadLetterConfig = kof2
3330+
}
3331+
if resp.EcsParameters != nil {
3332+
kof3 := &svcapitypes.EcsParameters{}
3333+
if resp.EcsParameters.CapacityProviderStrategy != nil {
3334+
kof3f0 := []*svcapitypes.CapacityProviderStrategyItem{}
3335+
for _, kof3f0iter := range resp.EcsParameters.CapacityProviderStrategy {
3336+
kof3f0elem := &svcapitypes.CapacityProviderStrategyItem{}
3337+
if kof3f0iter.Base != nil {
3338+
kof3f0elem.Base = kof3f0iter.Base
3339+
}
3340+
if kof3f0iter.CapacityProvider != nil {
3341+
kof3f0elem.CapacityProvider = kof3f0iter.CapacityProvider
3342+
}
3343+
if kof3f0iter.Weight != nil {
3344+
kof3f0elem.Weight = kof3f0iter.Weight
3345+
}
3346+
kof3f0 = append(kof3f0, kof3f0elem)
3347+
}
3348+
kof3.CapacityProviderStrategy = kof3f0
3349+
}
3350+
if resp.EcsParameters.EnableECSManagedTags != nil {
3351+
kof3.EnableECSManagedTags = resp.EcsParameters.EnableECSManagedTags
3352+
}
3353+
if resp.EcsParameters.EnableExecuteCommand != nil {
3354+
kof3.EnableExecuteCommand = resp.EcsParameters.EnableExecuteCommand
3355+
}
3356+
if resp.EcsParameters.Group != nil {
3357+
kof3.Group = resp.EcsParameters.Group
3358+
}
3359+
if resp.EcsParameters.LaunchType != nil {
3360+
kof3.LaunchType = resp.EcsParameters.LaunchType
3361+
}
3362+
if resp.EcsParameters.NetworkConfiguration != nil {
3363+
kof3f5 := &svcapitypes.NetworkConfiguration{}
3364+
if resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration != nil {
3365+
kof3f5f0 := &svcapitypes.AWSVPCConfiguration{}
3366+
if resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.AssignPublicIp != nil {
3367+
kof3f5f0.AssignPublicIP = resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.AssignPublicIp
3368+
}
3369+
if resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.SecurityGroups != nil {
3370+
kof3f5f0f1 := []*string{}
3371+
for _, kof3f5f0f1iter := range resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.SecurityGroups {
3372+
var kof3f5f0f1elem string
3373+
kof3f5f0f1elem = *kof3f5f0f1iter
3374+
kof3f5f0f1 = append(kof3f5f0f1, &kof3f5f0f1elem)
3375+
}
3376+
kof3f5f0.SecurityGroups = kof3f5f0f1
3377+
}
3378+
if resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.Subnets != nil {
3379+
kof3f5f0f2 := []*string{}
3380+
for _, kof3f5f0f2iter := range resp.EcsParameters.NetworkConfiguration.AwsvpcConfiguration.Subnets {
3381+
var kof3f5f0f2elem string
3382+
kof3f5f0f2elem = *kof3f5f0f2iter
3383+
kof3f5f0f2 = append(kof3f5f0f2, &kof3f5f0f2elem)
3384+
}
3385+
kof3f5f0.Subnets = kof3f5f0f2
3386+
}
3387+
kof3f5.AWSvpcConfiguration = kof3f5f0
3388+
}
3389+
kof3.NetworkConfiguration = kof3f5
3390+
}
3391+
if resp.EcsParameters.PlacementConstraints != nil {
3392+
kof3f6 := []*svcapitypes.PlacementConstraint{}
3393+
for _, kof3f6iter := range resp.EcsParameters.PlacementConstraints {
3394+
kof3f6elem := &svcapitypes.PlacementConstraint{}
3395+
if kof3f6iter.Expression != nil {
3396+
kof3f6elem.Expression = kof3f6iter.Expression
3397+
}
3398+
if kof3f6iter.Type != nil {
3399+
kof3f6elem.Type = kof3f6iter.Type
3400+
}
3401+
kof3f6 = append(kof3f6, kof3f6elem)
3402+
}
3403+
kof3.PlacementConstraints = kof3f6
3404+
}
3405+
if resp.EcsParameters.PlacementStrategy != nil {
3406+
kof3f7 := []*svcapitypes.PlacementStrategy{}
3407+
for _, kof3f7iter := range resp.EcsParameters.PlacementStrategy {
3408+
kof3f7elem := &svcapitypes.PlacementStrategy{}
3409+
if kof3f7iter.Field != nil {
3410+
kof3f7elem.Field = kof3f7iter.Field
3411+
}
3412+
if kof3f7iter.Type != nil {
3413+
kof3f7elem.Type = kof3f7iter.Type
3414+
}
3415+
kof3f7 = append(kof3f7, kof3f7elem)
3416+
}
3417+
kof3.PlacementStrategy = kof3f7
3418+
}
3419+
if resp.EcsParameters.PlatformVersion != nil {
3420+
kof3.PlatformVersion = resp.EcsParameters.PlatformVersion
3421+
}
3422+
if resp.EcsParameters.PropagateTags != nil {
3423+
kof3.PropagateTags = resp.EcsParameters.PropagateTags
3424+
}
3425+
if resp.EcsParameters.ReferenceId != nil {
3426+
kof3.ReferenceID = resp.EcsParameters.ReferenceId
3427+
}
3428+
if resp.EcsParameters.Tags != nil {
3429+
kof3f11 := []*svcapitypes.Tag{}
3430+
for _, kof3f11iter := range resp.EcsParameters.Tags {
3431+
kof3f11elem := &svcapitypes.Tag{}
3432+
if kof3f11iter.Key != nil {
3433+
kof3f11elem.Key = kof3f11iter.Key
3434+
}
3435+
if kof3f11iter.Value != nil {
3436+
kof3f11elem.Value = kof3f11iter.Value
3437+
}
3438+
kof3f11 = append(kof3f11, kof3f11elem)
3439+
}
3440+
kof3.Tags = kof3f11
3441+
}
3442+
if resp.EcsParameters.TaskCount != nil {
3443+
kof3.TaskCount = resp.EcsParameters.TaskCount
3444+
}
3445+
if resp.EcsParameters.TaskDefinitionArn != nil {
3446+
kof3.TaskDefinitionARN = resp.EcsParameters.TaskDefinitionArn
3447+
}
3448+
ko.EcsParameters = kof3
3449+
}
3450+
if resp.HttpParameters != nil {
3451+
kof4 := &svcapitypes.HTTPParameters{}
3452+
if resp.HttpParameters.HeaderParameters != nil {
3453+
kof4f0 := map[string]*string{}
3454+
for kof4f0key, kof4f0valiter := range resp.HttpParameters.HeaderParameters {
3455+
var kof4f0val string
3456+
kof4f0val = *kof4f0valiter
3457+
kof4f0[kof4f0key] = &kof4f0val
3458+
}
3459+
kof4.HeaderParameters = kof4f0
3460+
}
3461+
if resp.HttpParameters.PathParameterValues != nil {
3462+
kof4f1 := []*string{}
3463+
for _, kof4f1iter := range resp.HttpParameters.PathParameterValues {
3464+
var kof4f1elem string
3465+
kof4f1elem = *kof4f1iter
3466+
kof4f1 = append(kof4f1, &kof4f1elem)
3467+
}
3468+
kof4.PathParameterValues = kof4f1
3469+
}
3470+
if resp.HttpParameters.QueryStringParameters != nil {
3471+
kof4f2 := map[string]*string{}
3472+
for kof4f2key, kof4f2valiter := range resp.HttpParameters.QueryStringParameters {
3473+
var kof4f2val string
3474+
kof4f2val = *kof4f2valiter
3475+
kof4f2[kof4f2key] = &kof4f2val
3476+
}
3477+
kof4.QueryStringParameters = kof4f2
3478+
}
3479+
ko.HTTPParameters = kof4
3480+
}
3481+
if resp.Id != nil {
3482+
ko.ID = resp.Id
3483+
}
3484+
if resp.Input != nil {
3485+
ko.Input = resp.Input
3486+
}
3487+
if resp.InputPath != nil {
3488+
ko.InputPath = resp.InputPath
3489+
}
3490+
if resp.InputTransformer != nil {
3491+
kof8 := &svcapitypes.InputTransformer{}
3492+
if resp.InputTransformer.InputPathsMap != nil {
3493+
kof8f0 := map[string]*string{}
3494+
for kof8f0key, kof8f0valiter := range resp.InputTransformer.InputPathsMap {
3495+
var kof8f0val string
3496+
kof8f0val = *kof8f0valiter
3497+
kof8f0[kof8f0key] = &kof8f0val
3498+
}
3499+
kof8.InputPathsMap = kof8f0
3500+
}
3501+
if resp.InputTransformer.InputTemplate != nil {
3502+
kof8.InputTemplate = resp.InputTransformer.InputTemplate
3503+
}
3504+
ko.InputTransformer = kof8
3505+
}
3506+
if resp.KinesisParameters != nil {
3507+
kof9 := &svcapitypes.KinesisParameters{}
3508+
if resp.KinesisParameters.PartitionKeyPath != nil {
3509+
kof9.PartitionKeyPath = resp.KinesisParameters.PartitionKeyPath
3510+
}
3511+
ko.KinesisParameters = kof9
3512+
}
3513+
if resp.RedshiftDataParameters != nil {
3514+
kof10 := &svcapitypes.RedshiftDataParameters{}
3515+
if resp.RedshiftDataParameters.Database != nil {
3516+
kof10.Database = resp.RedshiftDataParameters.Database
3517+
}
3518+
if resp.RedshiftDataParameters.DbUser != nil {
3519+
kof10.DBUser = resp.RedshiftDataParameters.DbUser
3520+
}
3521+
if resp.RedshiftDataParameters.SecretManagerArn != nil {
3522+
kof10.SecretManagerARN = resp.RedshiftDataParameters.SecretManagerArn
3523+
}
3524+
if resp.RedshiftDataParameters.Sql != nil {
3525+
kof10.Sql = resp.RedshiftDataParameters.Sql
3526+
}
3527+
if resp.RedshiftDataParameters.StatementName != nil {
3528+
kof10.StatementName = resp.RedshiftDataParameters.StatementName
3529+
}
3530+
if resp.RedshiftDataParameters.WithEvent != nil {
3531+
kof10.WithEvent = resp.RedshiftDataParameters.WithEvent
3532+
}
3533+
ko.RedshiftDataParameters = kof10
3534+
}
3535+
if resp.RetryPolicy != nil {
3536+
kof11 := &svcapitypes.RetryPolicy{}
3537+
if resp.RetryPolicy.MaximumEventAgeInSeconds != nil {
3538+
kof11.MaximumEventAgeInSeconds = resp.RetryPolicy.MaximumEventAgeInSeconds
3539+
}
3540+
if resp.RetryPolicy.MaximumRetryAttempts != nil {
3541+
kof11.MaximumRetryAttempts = resp.RetryPolicy.MaximumRetryAttempts
3542+
}
3543+
ko.RetryPolicy = kof11
3544+
}
3545+
if resp.RoleArn != nil {
3546+
ko.RoleARN = resp.RoleArn
3547+
}
3548+
if resp.RunCommandParameters != nil {
3549+
kof13 := &svcapitypes.RunCommandParameters{}
3550+
if resp.RunCommandParameters.RunCommandTargets != nil {
3551+
kof13f0 := []*svcapitypes.RunCommandTarget{}
3552+
for _, kof13f0iter := range resp.RunCommandParameters.RunCommandTargets {
3553+
kof13f0elem := &svcapitypes.RunCommandTarget{}
3554+
if kof13f0iter.Key != nil {
3555+
kof13f0elem.Key = kof13f0iter.Key
3556+
}
3557+
if kof13f0iter.Values != nil {
3558+
kof13f0elemf1 := []*string{}
3559+
for _, kof13f0elemf1iter := range kof13f0iter.Values {
3560+
var kof13f0elemf1elem string
3561+
kof13f0elemf1elem = *kof13f0elemf1iter
3562+
kof13f0elemf1 = append(kof13f0elemf1, &kof13f0elemf1elem)
3563+
}
3564+
kof13f0elem.Values = kof13f0elemf1
3565+
}
3566+
kof13f0 = append(kof13f0, kof13f0elem)
3567+
}
3568+
kof13.RunCommandTargets = kof13f0
3569+
}
3570+
ko.RunCommandParameters = kof13
3571+
}
3572+
if resp.SageMakerPipelineParameters != nil {
3573+
kof14 := &svcapitypes.SageMakerPipelineParameters{}
3574+
if resp.SageMakerPipelineParameters.PipelineParameterList != nil {
3575+
kof14f0 := []*svcapitypes.SageMakerPipelineParameter{}
3576+
for _, kof14f0iter := range resp.SageMakerPipelineParameters.PipelineParameterList {
3577+
kof14f0elem := &svcapitypes.SageMakerPipelineParameter{}
3578+
if kof14f0iter.Name != nil {
3579+
kof14f0elem.Name = kof14f0iter.Name
3580+
}
3581+
if kof14f0iter.Value != nil {
3582+
kof14f0elem.Value = kof14f0iter.Value
3583+
}
3584+
kof14f0 = append(kof14f0, kof14f0elem)
3585+
}
3586+
kof14.PipelineParameterList = kof14f0
3587+
}
3588+
ko.SageMakerPipelineParameters = kof14
3589+
}
3590+
if resp.SqsParameters != nil {
3591+
kof15 := &svcapitypes.SQSParameters{}
3592+
if resp.SqsParameters.MessageGroupId != nil {
3593+
kof15.MessageGroupID = resp.SqsParameters.MessageGroupId
3594+
}
3595+
ko.SQSParameters = kof15
3596+
}
3597+
`
3598+
assert.Equal(
3599+
expected,
3600+
code.SetResourceForStruct(
3601+
crd.Config(), crd, "", "ko", koShape, nil, "resp", targetShape, "", model.OpTypeList, 1,
3602+
),
3603+
)
3604+
}
3605+
32763606
func TestSetResource_EC2_Instance_Create(t *testing.T) {
32773607
// Check that the RunInstances output (Reservation)
32783608
// uses the first element of the returned list of Instances
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
operations:
2+
PutRule:
3+
operation_type:
4+
- Create
5+
- Update
6+
resource_name: Rule
7+
resources:
8+
Rule:
9+
fields:
10+
Targets:
11+
custom_field:
12+
list_of: Target

0 commit comments

Comments
 (0)