cdklabs / cdklabs/cdk-ssm-documents
StringList encoded incorrectly in the simulation
- 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
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