Skip to content

Commit f95c643

Browse files
committed
fix(deploy): pass stack selection to diff and deploy for --target filtering (#980)
1 parent ec92d3f commit f95c643

2 files changed

Lines changed: 76 additions & 19 deletions

File tree

src/cli/commands/deploy/__tests__/deploy.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { runCLI } from '../../../../test-utils/index.js';
2+
import { runDeploy, runDiff } from '../actions.js';
3+
import { StackSelectionStrategy } from '@aws-cdk/toolkit-lib';
24
import { randomUUID } from 'node:crypto';
35
import { mkdir, rm, writeFile } from 'node:fs/promises';
46
import { tmpdir } from 'node:os';
@@ -56,3 +58,37 @@ describe('deploy without agents', () => {
5658
expect(json.error.toLowerCase()).toContain('no resources defined');
5759
});
5860
});
61+
62+
describe('runDiff', () => {
63+
it('passes stack selection pattern to toolkit wrapper diff', async () => {
64+
let captured: unknown;
65+
const fakeWrapper = {
66+
diff: (opts?: unknown) => {
67+
captured = opts;
68+
},
69+
};
70+
71+
await runDiff(fakeWrapper as any, 'AgentCore-myapp-prod');
72+
73+
expect(captured).toEqual({
74+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: ['AgentCore-myapp-prod'] },
75+
});
76+
});
77+
});
78+
79+
describe('runDeploy', () => {
80+
it('passes stack selection pattern to toolkit wrapper deploy', async () => {
81+
let captured: unknown;
82+
const fakeWrapper = {
83+
deploy: (opts?: unknown) => {
84+
captured = opts;
85+
},
86+
};
87+
88+
await runDeploy(fakeWrapper as any, 'AgentCore-myapp-prod');
89+
90+
expect(captured).toEqual({
91+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: ['AgentCore-myapp-prod'] },
92+
});
93+
});
94+
});

src/cli/commands/deploy/actions.ts

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { ConfigIO, SecureCredentials } from '../../../lib';
22
import type { AgentCoreMcpSpec, DeployedState } from '../../../schema';
33
import { applyTargetRegionToEnv } from '../../aws';
44
import { validateAwsCredentials } from '../../aws/account';
5-
import { createSwitchableIoHost } from '../../cdk/toolkit-lib';
5+
import { CdkToolkitWrapper, createSwitchableIoHost } from '../../cdk/toolkit-lib';
6+
import type { SwitchableIoHost } from '../../cdk/toolkit-lib';
67
import {
78
buildDeployedState,
89
getStackOutputs,
@@ -40,7 +41,9 @@ import {
4041
} from '../../operations/deploy/post-deploy-config-bundles';
4142
import { setupHttpGateways } from '../../operations/deploy/post-deploy-http-gateways';
4243
import { enableOnlineEvalConfigs } from '../../operations/deploy/post-deploy-online-evals';
44+
import { toStackName } from '../import/import-utils';
4345
import type { DeployResult } from './types';
46+
import { StackSelectionStrategy } from '@aws-cdk/toolkit-lib';
4447

4548
export interface ValidatedDeployOptions {
4649
target: string;
@@ -55,6 +58,38 @@ export interface ValidatedDeployOptions {
5558
const AGENT_NEXT_STEPS = ['agentcore invoke', 'agentcore status'];
5659
const MEMORY_ONLY_NEXT_STEPS = ['agentcore add agent', 'agentcore status'];
5760

61+
export async function runDiff(
62+
toolkitWrapper: CdkToolkitWrapper,
63+
stackName: string,
64+
switchableIoHost?: SwitchableIoHost
65+
): Promise<void> {
66+
const diffIoHost = switchableIoHost ?? createSwitchableIoHost();
67+
let hasDiffContent = false;
68+
diffIoHost.setOnRawMessage((code, _level, message) => {
69+
if (!message) return;
70+
// I4002: formatted diff per stack, I4001: overall diff summary
71+
if (code === 'CDK_TOOLKIT_I4002' || code === 'CDK_TOOLKIT_I4001') {
72+
hasDiffContent = true;
73+
console.log(message);
74+
}
75+
});
76+
diffIoHost.setVerbose(true);
77+
await toolkitWrapper.diff({
78+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: [stackName] },
79+
});
80+
if (!hasDiffContent) {
81+
console.log('No stack differences detected.');
82+
}
83+
diffIoHost.setVerbose(false);
84+
diffIoHost.setOnRawMessage(null);
85+
}
86+
87+
export async function runDeploy(toolkitWrapper: CdkToolkitWrapper, stackName: string): Promise<void> {
88+
await toolkitWrapper.deploy({
89+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: [stackName] },
90+
});
91+
}
92+
5893
export async function handleDeploy(options: ValidatedDeployOptions): Promise<DeployResult> {
5994
let toolkitWrapper = null;
6095
let restoreEnv: (() => void) | null = null;
@@ -247,6 +282,8 @@ export async function handleDeploy(options: ValidatedDeployOptions): Promise<Dep
247282
const stackName = stackNames[0]!;
248283
endStep('success');
249284

285+
const targetStackName = toStackName(context.projectSpec.name, target.name);
286+
250287
// Check if bootstrap needed
251288
startStep('Check bootstrap status');
252289
const bootstrapCheck = await checkBootstrapNeeded(context.awsTargets);
@@ -296,23 +333,7 @@ export async function handleDeploy(options: ValidatedDeployOptions): Promise<Dep
296333
// Diff mode: run cdk diff and exit without deploying
297334
if (options.diff) {
298335
startStep('Run CDK diff');
299-
const diffIoHost = switchableIoHost ?? createSwitchableIoHost();
300-
let hasDiffContent = false;
301-
diffIoHost.setOnRawMessage((code, _level, message) => {
302-
if (!message) return;
303-
// I4002: formatted diff per stack, I4001: overall diff summary
304-
if (code === 'CDK_TOOLKIT_I4002' || code === 'CDK_TOOLKIT_I4001') {
305-
hasDiffContent = true;
306-
console.log(message);
307-
}
308-
});
309-
diffIoHost.setVerbose(true);
310-
await toolkitWrapper.diff();
311-
if (!hasDiffContent) {
312-
console.log('No stack differences detected.');
313-
}
314-
diffIoHost.setVerbose(false);
315-
diffIoHost.setOnRawMessage(null);
336+
await runDiff(toolkitWrapper, targetStackName, switchableIoHost);
316337
endStep('success');
317338

318339
logger.finalize(true);
@@ -339,7 +360,7 @@ export async function handleDeploy(options: ValidatedDeployOptions): Promise<Dep
339360
switchableIoHost.setVerbose(true);
340361
}
341362

342-
await toolkitWrapper.deploy();
363+
await runDeploy(toolkitWrapper, targetStackName);
343364

344365
// Disable verbose output
345366
if (switchableIoHost) {

0 commit comments

Comments
 (0)