Skip to content

Commit b96bbd8

Browse files
committed
fix(cli-internal): address PR #14698 review comments
Remove unused buildNoopOperation/NO_OP_MESSAGE from _operation.ts and _plan.ts. Restore deleted comment in _validations.ts. Rename description to stack in forward resolveTarget. Extract resource type constants in auth, analytics, and storage forward files and reuse them in rollback files. Add REVIEW_IN_PROGRESS holding stack check and duplicate logical ID error in rollback afterMove. Update rollback test mock to differentiate Gen2 vs holding stack templates. All 19 refactor test suites pass (118 tests). --- Prompt: Address the comments in this PR: 14698
1 parent 5a735d8 commit b96bbd8

14 files changed

Lines changed: 76 additions & 48 deletions

File tree

packages/amplify-cli/src/__tests__/commands/gen2-migration/refactor/workflow/rollback-category-refactorer.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ describe('RollbackCategoryRefactorer.afterMove', () => {
4444
afterEach(() => cfnMock.restore());
4545

4646
it('returns operations to update holding stack and move resources back', async () => {
47+
const gen2Template: CFNTemplate = {
48+
AWSTemplateFormatVersion: '2010-09-09',
49+
Description: 'gen2',
50+
Resources: {
51+
MigrationPlaceholder: { Type: 'AWS::CloudFormation::WaitConditionHandle', Properties: {} },
52+
},
53+
Outputs: {},
54+
};
55+
4756
const holdingTemplate: CFNTemplate = {
4857
AWSTemplateFormatVersion: '2010-09-09',
4958
Description: 'holding',
@@ -56,7 +65,13 @@ describe('RollbackCategoryRefactorer.afterMove', () => {
5665
cfnMock.on(DescribeStacksCommand).resolves({
5766
Stacks: [{ StackName: 'holding', StackStatus: 'UPDATE_COMPLETE', CreationTime: new Date() }],
5867
});
59-
cfnMock.on(GetTemplateCommand).resolves({ TemplateBody: JSON.stringify(holdingTemplate) });
68+
cfnMock.on(GetTemplateCommand).callsFake((input) => {
69+
const stackName = input.StackName ?? '';
70+
if (stackName.includes('holding')) {
71+
return { TemplateBody: JSON.stringify(holdingTemplate) };
72+
}
73+
return { TemplateBody: JSON.stringify(gen2Template) };
74+
});
6075
cfnMock.on(UpdateStackCommand).resolves({});
6176
cfnMock.on(CreateStackRefactorCommand).resolves({ StackRefactorId: 'refactor-123' });
6277
cfnMock.on(DescribeStackRefactorCommand).resolves({

packages/amplify-cli/src/commands/gen2-migration/_operation.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,5 @@
11
import { DiscoveredResource } from './generate/_infra/gen1-app';
22

3-
export const NO_OP_MESSAGE = 'No-op\n';
4-
5-
/**
6-
* Creates a no-op operation for a resource with nothing to migrate.
7-
*/
8-
export function buildNoopOperation(resource: DiscoveredResource): AmplifyMigrationOperation {
9-
return {
10-
resource: resource,
11-
validate: () => undefined,
12-
execute: async () => {
13-
return;
14-
},
15-
describe: async () => {
16-
return [NO_OP_MESSAGE];
17-
},
18-
};
19-
}
20-
213
/**
224
* Result of a validation check.
235
*/

packages/amplify-cli/src/commands/gen2-migration/_plan.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AmplifyMigrationOperation, NO_OP_MESSAGE } from './_operation';
1+
import { AmplifyMigrationOperation } from './_operation';
22
import { SpinningLogger } from './_spinning-logger';
33
import { printer } from '@aws-amplify/amplify-prompts';
44
import chalk from 'chalk';
@@ -74,8 +74,6 @@ export class Plan {
7474
grouped.get(label)!.push(...lines);
7575
}
7676

77-
let hasRealImplications = false;
78-
7977
if (grouped.size > 0) {
8078
printer.info(chalk.bold(chalk.underline('Operations Summary')));
8179
printer.blankLine();
@@ -86,15 +84,12 @@ export class Plan {
8684
let step = 1;
8785
for (const description of descriptions) {
8886
printer.info(`${step}. ${description}`);
89-
if (description !== NO_OP_MESSAGE) {
90-
hasRealImplications = true;
91-
}
9287
step++;
9388
}
9489
}
9590
}
9691

97-
if (hasRealImplications && this.implications.length > 0) {
92+
if (grouped.size > 0 && this.implications.length > 0) {
9893
printer.info(chalk.bold(chalk.underline('Implications')));
9994
printer.blankLine();
10095
for (const implication of this.implications) {

packages/amplify-cli/src/commands/gen2-migration/_validations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export class AmplifyGen2MigrationValidations {
9797
const statefulRemoves: Array<{ category: string; resourceType: string; physicalId: string }> = [];
9898
for (const change of changeSet.Changes) {
9999
if (change.Type === 'Resource' && change.ResourceChange?.Action === 'Remove' && change.ResourceChange?.ResourceType) {
100+
// Skip deployment bucket only when explicitly requested (e.g., during decommission)
100101
if (
101102
deploymentBucketName &&
102103
change.ResourceChange.ResourceType === 'AWS::S3::Bucket' &&

packages/amplify-cli/src/commands/gen2-migration/refactor/analytics/analytics-forward.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { ForwardCategoryRefactorer } from '../workflow/forward-category-refactorer';
22

3-
export const ANALYTICS_RESOURCE_TYPES = ['AWS::Kinesis::Stream'];
3+
export const KINESIS_STREAM_TYPE = 'AWS::Kinesis::Stream';
4+
5+
export const ANALYTICS_RESOURCE_TYPES = [KINESIS_STREAM_TYPE];
46

57
/**
68
* Forward refactorer for the analytics category (Kinesis).

packages/amplify-cli/src/commands/gen2-migration/refactor/analytics/analytics-rollback.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CFNResource } from '../../cfn-template';
22
import { RollbackCategoryRefactorer } from '../workflow/rollback-category-refactorer';
3-
import { ANALYTICS_RESOURCE_TYPES } from './analytics-forward';
3+
import { ANALYTICS_RESOURCE_TYPES, KINESIS_STREAM_TYPE } from './analytics-forward';
44

55
/**
66
* Rollback refactorer for the analytics category (Kinesis).
@@ -22,7 +22,7 @@ export class AnalyticsKinesisRollbackRefactorer extends RollbackCategoryRefactor
2222

2323
protected targetLogicalId(sourceId: string, sourceResource: CFNResource): string | undefined {
2424
switch (sourceResource.Type) {
25-
case 'AWS::Kinesis::Stream':
25+
case KINESIS_STREAM_TYPE:
2626
return 'KinesisStream';
2727
default:
2828
return undefined;

packages/amplify-cli/src/commands/gen2-migration/refactor/auth/auth-cognito-forward.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ export const GEN2_NATIVE_APP_CLIENT = 'UserPoolNativeAppClient';
2020
export const GEN2_WEB_CLIENT = 'UserPoolAppClient';
2121

2222
export const USER_POOL_CLIENT_TYPE = 'AWS::Cognito::UserPoolClient';
23+
export const USER_POOL_TYPE = 'AWS::Cognito::UserPool';
24+
export const IDENTITY_POOL_TYPE = 'AWS::Cognito::IdentityPool';
25+
export const IDENTITY_POOL_ROLE_ATTACHMENT_TYPE = 'AWS::Cognito::IdentityPoolRoleAttachment';
26+
export const USER_POOL_DOMAIN_TYPE = 'AWS::Cognito::UserPoolDomain';
2327

2428
export const RESOURCE_TYPES = [
25-
'AWS::Cognito::UserPool',
29+
USER_POOL_TYPE,
2630
USER_POOL_CLIENT_TYPE,
27-
'AWS::Cognito::IdentityPool',
28-
'AWS::Cognito::IdentityPoolRoleAttachment',
29-
'AWS::Cognito::UserPoolDomain',
31+
IDENTITY_POOL_TYPE,
32+
IDENTITY_POOL_ROLE_ATTACHMENT_TYPE,
33+
USER_POOL_DOMAIN_TYPE,
3034
];
3135

3236
/**

packages/amplify-cli/src/commands/gen2-migration/refactor/auth/auth-cognito-rollback.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import {
88
GEN2_NATIVE_APP_CLIENT,
99
GEN2_WEB_CLIENT,
1010
USER_POOL_CLIENT_TYPE,
11+
USER_POOL_TYPE,
12+
IDENTITY_POOL_TYPE,
13+
IDENTITY_POOL_ROLE_ATTACHMENT_TYPE,
14+
USER_POOL_DOMAIN_TYPE,
1115
} from './auth-cognito-forward';
1216

1317
/**
@@ -41,13 +45,13 @@ export class AuthCognitoRollbackRefactorer extends RollbackCategoryRefactorer {
4145
message: `Unable to determine Gen1 logical ID for UserPoolClient '${sourceId}' — expected logical ID to contain '${GEN2_NATIVE_APP_CLIENT}' or '${GEN2_WEB_CLIENT}'`,
4246
});
4347
}
44-
case 'AWS::Cognito::UserPool':
48+
case USER_POOL_TYPE:
4549
return 'UserPool';
46-
case 'AWS::Cognito::IdentityPool':
50+
case IDENTITY_POOL_TYPE:
4751
return 'IdentityPool';
48-
case 'AWS::Cognito::IdentityPoolRoleAttachment':
52+
case IDENTITY_POOL_ROLE_ATTACHMENT_TYPE:
4953
return 'IdentityPoolRoleMap';
50-
case 'AWS::Cognito::UserPoolDomain':
54+
case USER_POOL_DOMAIN_TYPE:
5155
return 'UserPoolDomain';
5256
default:
5357
return undefined;

packages/amplify-cli/src/commands/gen2-migration/refactor/storage/storage-dynamo-forward.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { ForwardCategoryRefactorer } from '../workflow/forward-category-refactorer';
22

3+
export const DYNAMO_TABLE_TYPE = 'AWS::DynamoDB::Table';
4+
35
/**
46
* Forward refactorer for DynamoDB storage resources.
57
* Moves DynamoDB tables from Gen1 to Gen2.
@@ -15,6 +17,6 @@ export class StorageDynamoForwardRefactorer extends ForwardCategoryRefactorer {
1517
}
1618

1719
protected resourceTypes(): string[] {
18-
return ['AWS::DynamoDB::Table'];
20+
return [DYNAMO_TABLE_TYPE];
1921
}
2022
}

packages/amplify-cli/src/commands/gen2-migration/refactor/storage/storage-dynamo-rollback.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { CFNResource } from '../../cfn-template';
22
import { RollbackCategoryRefactorer } from '../workflow/rollback-category-refactorer';
3+
import { DYNAMO_TABLE_TYPE } from './storage-dynamo-forward';
34

45
/**
56
* Rollback refactorer for DynamoDB storage resources.
@@ -16,12 +17,12 @@ export class StorageDynamoRollbackRefactorer extends RollbackCategoryRefactorer
1617
}
1718

1819
protected resourceTypes(): string[] {
19-
return ['AWS::DynamoDB::Table'];
20+
return [DYNAMO_TABLE_TYPE];
2021
}
2122

2223
protected targetLogicalId(_sourceId: string, sourceResource: CFNResource): string | undefined {
2324
switch (sourceResource.Type) {
24-
case 'AWS::DynamoDB::Table':
25+
case DYNAMO_TABLE_TYPE:
2526
return 'DynamoDBTable';
2627
default:
2728
return undefined;

0 commit comments

Comments
 (0)