-
Notifications
You must be signed in to change notification settings - Fork 68
Description
Describe the bug
When running cdk destroy --all or cdk deploy --all against a configuration with no top-level stacks (nested stages only), the following error occurs. This PR fixes the behavior.
const app = new cdk.App();
new MyStage(app, 'MyStage'); // This has CdkSampleStack> cdk deploy
Since this app includes more than a single stack, specify which stacks to use (wildcards are supported) or specify `--all`
Stacks: MyStage/CdkSampleStack
> cdk deploy --all # exits with status code 1 (error)
...
No stack found in the main cloud assembly. Use "list" to print manifest
> cdk destroy --all # exits with status code 1 (error)
...
No stack found in the main cloud assembly. Use "list" to print manifest
Regression Issue
- Select this option if this issue appears to be a regression.
Last Known Working CDK Version
No response
Expected Behavior
It can deploy/destroy all the stacks, or no errors occur, or a correct message / documentation is needed.
Current Behavior
It doesn't deploy/destroy all the stacks, and it exits with status code 1 (error).
Reproduction Steps
const app = new cdk.App();
new MyStage(app, 'MyStage'); // This has CdkSampleStack
export class MyStage extends Stage {
constructor(scope: Construct, id: string, props?: StageProps) {
super(scope, id, props);
new CdkSampleStack(this, 'CdkSampleStack');
}
}> cdk deploy --all
> cdk destroy --all
Possible Solution
- Make it deployable / destroyable
- Or any of the following approaches:
- Prevent errors
- Correct messages
- Correct documentation
Additional Information/Context
No response
CDK CLI Version
2.1100.1
Framework Version
No response
Node.js Version
24
OS
mac
Language
TypeScript
Language Version
No response
Other information
Is this a bug or by design?
The error message by cdk deploy/destroy (without --all) on the app
Since this app includes more than a single stack, specify which stacks to use (wildcards are supported) or specify
--all
Since it says specify --all on the command, it may not be by design, or this message may not be appropriate.
Code
The --all option says that Deploy all available stacks or Deploy all stacks.
see: https://github.com/aws/aws-cdk-cli/blob/cdk%40v2.1100.1/packages/aws-cdk/lib/cli/cli-config.ts#L141
'all': { type: 'boolean', desc: 'Deploy all available stacks', default: false },
/**
* Deploy all stacks
*
* Requried if `stacks` is not set
*
* @default - false
*/
readonly all?: boolean;The --all is passed into allTopLevel.
see: https://github.com/aws/aws-cdk-cli/blob/cdk%40v2.1100.1/packages/aws-cdk/lib/cli/cli.ts#L244
const selector: StackSelector = {
allTopLevel: args.all,
patterns: args.STACKS,
};But the allTopLevel says that all stacks at the top level assembly. Looking at the doc, it seems like this is by design.
export interface StackSelector {
/**
* Whether all stacks at the top level assembly should
* be selected and nothing else
*/
allTopLevel?: boolean;There also appears to be a test that verifies this.
test('select all top level stacks in the presence of nested assemblies', async () => {
// GIVEN
const cxasm = await testNestedCloudAssembly();
// WHEN
const x = await cxasm.selectStacks({ allTopLevel: true, patterns: [] }, { defaultBehavior: DefaultSelection.AllStacks });
// THEN
expect(x.stackCount).toBe(2);
expect(x.stackIds).toContain('witherrors');
expect(x.stackIds).toContain('withouterrors');
});If it is by design
However, if it is by design that the Stage stacks cannot be deployed or deleted with --all, it is a bit confusing.
There is no documentation to understand that, and the error message says to specify --all. Furthermore, it seems like a bug that it terminates abnormally instead of normally.
Isn't some kind of action necessary?