aws-cloudformation / aws-cloudformation/cloudformation-cli

FlatteningError while working with remote "$ref" in typeConfiguration

Open
#1,084 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
336
Forks
172
Avg merge
3d 5m
Merged PRs (30d)
3

Description

I am working on a set of custom resource types that share two pieces of configuration over all planned types:
- The Environment property
- The EnvironmentMapping typeConfiguration

To limit the amount of duplicate JSON definitions, I took a page out of the teams book and created a bucket where I placed my remote definitions. And uploaded the shared definitions in that bucket.

Resulting in a definition JSON like follows:
```json
{
"$schema": "https://schema.cloudformation.us-east-1.amazonaws.com/provider.definition.schema.v1.json#",
"properties": {
"Title": {
"description": "Title/Name of the folder.",
"type": "string"
},
"Environment": {
"$ref": "https://s3.eu-west-1.amazonaws.com/my.fake.schemas.bucket/environment.def.v0.json"
}
},
...
"typeConfiguration": {
"additionalProperties": false,
"properties": {
"EnvironmentMapping":{
"description": "A list of environment definitions detailing which secret is bound to which host.",
"type":"array",
"insertionOrder": false,
"items": {
"$ref": "https://s3.eu-west-1.amazonaws.com/my.fake.schemas.bucket/environment-config.def.v0.json"
}
}
},
"required": ["EnvironmentConfiguration"]
}
}
```

It works for the Environment property. That by itself and `cfn generate` finishes without problem. But when I add the reference to the `typeConfiguration`, `cfn generate` will produce the following error:
`rpdk.core.jsonutils.utils.FlatteningError: Invalid ref: ('remote', 'schema1')`

When perusing through the logs, I do see both schema's being picked up and verified. Both written to `remote/schema0` and `remote/schema1`. And files are generated, but the config JSON looks as follows:
```json
{
"additionalProperties": false,
"properties": {
"EnvironmentConfiguration": {
"type": "array",
"insertionOrder": false,
"items": {
"$ref": "#/remote/schema1"
}
}
},
"required": [
"EnvironmentConfiguration"
],
"definitions": {},
"typeName": "ORG::App::Folder"
}
```

I tried a few things:
- I swapped both `$ref`-s: Flattening error. Resulting generated code did reflect the swapped configuration.
- I added an extra object layer to the config definition json: Flattening error.
- Move external property into the definitions block: Works, generation successful. But it defeats the effort of keeping the amount of copied schema low.

I might dive into the code and see how both blocks are rendered and how they differ. But it is late for me, at the time of writing this issue, and maybe someone will see an obvious mistake I missed.

Thanks in advance.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.