Skip to content

Commit ee6ee02

Browse files
chrisqm-devkddejong
authored andcommitted
Fix deletion workflow lsp request and pagination
1 parent 5beb01f commit ee6ee02

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

src/server/CfnServer.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ import {
3838
describeValidationStatusHandler,
3939
describeDeploymentStatusHandler,
4040
getTemplateResourcesHandler,
41+
deleteChangeSetHandler,
42+
getChangeSetDeletionStatusHandler,
43+
describeChangeSetDeletionStatusHandler,
4144
} from '../handlers/StackHandler';
4245
import { LspComponents } from '../protocol/LspComponents';
4346
import { closeSafely } from '../utils/Closeable';
@@ -109,6 +112,11 @@ export class CfnServer {
109112
this.lsp.stackHandlers.onGetDeploymentStatus(getDeploymentStatusHandler(this.components));
110113
this.lsp.stackHandlers.onDescribeValidationStatus(describeValidationStatusHandler(this.components));
111114
this.lsp.stackHandlers.onDescribeDeploymentStatus(describeDeploymentStatusHandler(this.components));
115+
this.lsp.stackHandlers.onDeleteChangeSet(deleteChangeSetHandler(this.components));
116+
this.lsp.stackHandlers.onGetChangeSetDeletionStatus(getChangeSetDeletionStatusHandler(this.components));
117+
this.lsp.stackHandlers.onDescribeChangeSetDeletionStatus(
118+
describeChangeSetDeletionStatusHandler(this.components),
119+
);
112120
this.lsp.stackHandlers.onListStacks(listStacksHandler(this.components));
113121
this.lsp.stackHandlers.onListChangeSets(listChangeSetsHandler(this.components));
114122
this.lsp.stackHandlers.onGetStackTemplate(getManagedResourceStackTemplateHandler(this.components));

src/stacks/actions/ChangeSetDeletionWorkflow.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -193,21 +193,15 @@ export class ChangeSetDeletionWorkflow
193193
}
194194

195195
private async hasMultipleChangeSets(stackName: string): Promise<boolean> {
196-
let nextToken: string | undefined;
197-
let changeSetCount = 0;
196+
const result = await this.cfnService.listChangeSets(stackName);
198197

199-
do {
200-
const result = await this.cfnService.listChangeSets(stackName, nextToken);
198+
const changeSetCount = result.changeSets.length;
201199

202-
changeSetCount += result.changeSets.length ?? 0;
203-
204-
if (changeSetCount > 1) {
205-
return true;
206-
}
207-
208-
nextToken = result.nextToken;
209-
} while (nextToken);
210-
211-
return false;
200+
// Minimum one change set per page, if nextToken is defined there is at least two change sets
201+
if (changeSetCount > 1 || result.nextToken) {
202+
return true;
203+
} else {
204+
return false;
205+
}
212206
}
213207
}

tst/unit/stackActions/ChangeSetDeletionWorkflow.test.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -292,17 +292,11 @@ describe('ChangeSetDeletionWorkflow', () => {
292292
mockCfnService.waitUntilStackDeleteComplete = vi.fn().mockResolvedValue({
293293
state: WaiterState.SUCCESS,
294294
});
295-
// Mock pagination: first call returns 1 changeset + nextToken, second call returns 1 changeset
296-
mockCfnService.listChangeSets = vi
297-
.fn()
298-
.mockResolvedValueOnce({
299-
changeSets: [{ ChangeSetName: 'changeset1' }],
300-
nextToken: 'token123',
301-
})
302-
.mockResolvedValueOnce({
303-
changeSets: [{ ChangeSetName: 'changeset3' }],
304-
nextToken: undefined,
305-
});
295+
296+
mockCfnService.listChangeSets = vi.fn().mockResolvedValue({
297+
changeSets: [{ ChangeSetName: 'changeset1' }],
298+
nextToken: 'token123',
299+
});
306300
(isStackInReview as any).mockResolvedValue(true);
307301
(mapChangesToStackChanges as any).mockReturnValue([]);
308302
});
@@ -322,7 +316,7 @@ describe('ChangeSetDeletionWorkflow', () => {
322316
ChangeSetName: testChangeSetName,
323317
});
324318

325-
expect(mockCfnService.listChangeSets).toBeCalledTimes(2);
319+
expect(mockCfnService.listChangeSets).toBeCalledTimes(1);
326320
const workflow = (deletionWorkflow as any).workflows.get(testId);
327321
expect(workflow.state).toBe(StackActionState.SUCCESSFUL);
328322
expect(workflow.phase).toBe(StackActionPhase.DELETION_COMPLETE);

0 commit comments

Comments
 (0)