cdklabs / cdklabs/cdk-ssm-documents

StringList encoded incorrectly in the simulation

Open
#74 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
30
Forks
9
Avg merge
1d 16m
Merged PRs (30d)
7

Description

I have this block of code that gets the security groups from an EFS mount target and then creates a new mount target using that value:

``` typescript
this.restoreDocument.addStep(new AwsApiStep(this, 'DescribeSourceMountTargetSecurityGroups', {
service: AwsService.EFS,
pascalCaseApi: 'DescribeMountTargetSecurityGroups',
apiParams: {
MountTargetId: '{{ DescribeSourceMountTargets.SourceMountTargetId }}',
},
outputs: [
{
outputType: DataTypeEnum.STRING_LIST,
name: 'SourceSecurityGroups',
selector: '$.SecurityGroups',
}
]
}));
...
this.restoreDocument.addStep(new AwsApiStep(this, 'CreateMountTargetAZ1', {
service: AwsService.EFS,
pascalCaseApi: 'CreateMountTarget',
apiParams: {
FileSystemId: '{{ DescribeTargetFileSystem.TargetFileSystemId }}',
SubnetId: '{{ GetParameterPrivateSubnetAZ1.PrivateSubnetAZ1 }}',
SecurityGroups: '{{ DescribeSourceMountTargetSecurityGroups.SourceSecurityGroups }}',
},
outputs: []
}));
```

This deploys via CDK without any issues and works. However, the simulator throws an exception. I've mocked the target creation:

``` typescript
awsInvoker.whenThen(
{
awsApi: 'createMountTarget',
awsParams: {
SecurityGroups: 'sg-XXX',
FileSystemId: 'fs-YYY,
SubnetId: 'subnet-ZZZ'
},
service: AwsService.EFS,
},
{}
);
```

I added some debugging which revealed it's JSON.parse() throwing the exception, on this (invalid) generated string:

``` json
{"FileSystemId":"fs-YYY","SubnetId":"subnet-ZZZ","SecurityGroups":"["sg-XXX"]"}
````

Full log:

``` bash
SyntaxError: Expected ',' or '}' after property value in JSON at position 97
at JSON.parse ()
at DictFormat.resolveToDict (../node_modules/@cdklabs/cdk-ssm-documents/src/interface/variables/string-variable.ts:134:4)
at AwsApiSimulation.executeStep (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation/aws-api-simulation.ts:39:44)
at AutomationStepSimulation.tryExecute (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:233:42)
at AutomationStepSimulation.executeWithRetries (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:215:21)
at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:117:29)
at AutomationStepSimulation.invoke (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:107:17)
at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:122:80)
at AutomationStepSimulation.invoke (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:107:17)
at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:122:80)
```

Any guidance would be appreciated. Thanks for all the excellent work on this project!

Contributor guide

Open the contributing guide

Research direction

Start with the failing simulation and the stack trace locations in src/interface/variables/string-variable.ts and src/simulation/automation/aws-api-simulation.ts. Reproduce the EFS CreateMountTarget case using the shown StringList output and mocked parameters, then trace how the API parameter dictionary is serialized and resolved. Done means the simulator accepts the StringList value and the existing mock invocation completes without the JSON.parse exception.

Written by the indexing model from the issue text.

Assessment

Tech stack
aws, typescript
Domain
testing-qa
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.