Skip to content

Commit 338ea67

Browse files
authored
fix(lambda): add artifact bucket source prompter in SAM sync wizards (#6065)
## Problem Unlike in SAM deploy wizard, SAM sync wizard skip a question about bucket source for sync artifact and go directly to question for bucket name. ## Solution Add prompter asking for bucket source option: 1) Create a SAM CLI managed S3 bucket 2) Specify an S3 bucket
1 parent cde861c commit 338ea67

File tree

3 files changed

+97
-38
lines changed

3 files changed

+97
-38
lines changed

packages/core/src/shared/sam/sync.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import { TemplateItem, createTemplatePrompter } from '../ui/sam/templatePrompter
5050
import { createStackPrompter } from '../ui/sam/stackPrompter'
5151
import { ParamsSource, createSyncParamsSourcePrompter } from '../ui/sam/paramsSourcePrompter'
5252
import { createEcrPrompter } from '../ui/sam/ecrPrompter'
53-
import { BucketSource, createBucketNamePrompter } from '../ui/sam/bucketPrompter'
53+
import { BucketSource, createBucketNamePrompter, createBucketSourcePrompter } from '../ui/sam/bucketPrompter'
5454
import { runInTerminal } from './processTerminal'
5555

5656
export interface SyncParams {
@@ -175,12 +175,15 @@ export class SyncWizard extends Wizard<SyncParams> {
175175
paramsSource === ParamsSource.Specify || paramsSource === ParamsSource.SpecifyAndSave,
176176
}
177177
)
178+
this.form.bucketSource.bindPrompter(() => createBucketSourcePrompter(), {
179+
showWhen: ({ paramsSource }) =>
180+
paramsSource === ParamsSource.Specify || paramsSource === ParamsSource.SpecifyAndSave,
181+
})
178182

179183
this.form.bucketName.bindPrompter(
180184
({ region }) => createBucketNamePrompter(new DefaultS3Client(region!), syncMementoRootKey),
181185
{
182-
showWhen: ({ paramsSource }) =>
183-
paramsSource === ParamsSource.Specify || paramsSource === ParamsSource.SpecifyAndSave,
186+
showWhen: ({ bucketSource }) => bucketSource === BucketSource.UserProvided,
184187
}
185188
)
186189

packages/core/src/test/shared/sam/sync.test.ts

Lines changed: 87 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -66,31 +66,12 @@ import { createTestRegionProvider } from '../regions/testUtil'
6666
import { ToolkitPromptSettings } from '../../../shared/settings'
6767
import { DefaultEcrClient } from '../../../shared/clients/ecrClient'
6868
import assert from 'assert'
69+
import { BucketSource } from '../../../shared/ui/sam/bucketPrompter'
6970

7071
describe('SAM SyncWizard', async function () {
7172
const createTester = async (params?: Partial<SyncParams>) =>
7273
createWizardTester(new SyncWizard({ deployType: 'code', ...params }, await globals.templateRegistry))
7374

74-
it('shows steps in correct order', async function () {
75-
const tester = await createTester()
76-
tester.template.assertShowFirst()
77-
tester.paramsSource.assertShowSecond()
78-
tester.projectRoot.assertDoesNotShow()
79-
80-
const workspaceUri = vscode.workspace.workspaceFolders?.[0]?.uri || vscode.Uri.file('/')
81-
const rootFolderUri = vscode.Uri.joinPath(workspaceUri, 'my')
82-
const templateUri = vscode.Uri.joinPath(rootFolderUri, 'template.yaml')
83-
const tester2 = await createTester({
84-
template: { uri: templateUri, data: createBaseTemplate() },
85-
paramsSource: ParamsSource.SpecifyAndSave,
86-
projectRoot: rootFolderUri,
87-
})
88-
tester2.region.assertShow(1)
89-
tester2.stackName.assertShow(2)
90-
tester2.bucketName.assertShow(3)
91-
tester2.projectRoot.assertDoesNotShow()
92-
})
93-
9475
it('skips prompts if user chooses samconfig file as params source', async function () {
9576
const workspaceUri = vscode.workspace.workspaceFolders?.[0]?.uri || vscode.Uri.file('/')
9677
const rootFolderUri = vscode.Uri.joinPath(workspaceUri, 'my')
@@ -190,7 +171,8 @@ describe('SAM SyncWizard', async () => {
190171
* - paramsSource : [Select] 1. ('Specify required parameters and save as defaults')
191172
* - region : [Select] 'us-west-2'
192173
* - stackName : [Select] 1. 'stack1'
193-
* - bucketName : [Select] 1. 'stack-1-bucket'
174+
* - bucketSource : [Select] 1. BucketSource.SamCliManaged
175+
* - bucketName : [Skip] undefined
194176
* - syncFlags : [Select] ["--dependency-layer","--use-container","--save-params"]
195177
*/
196178

@@ -221,12 +203,17 @@ describe('SAM SyncWizard', async () => {
221203
assert.strictEqual(quickPick.items[2].label, 'stack3')
222204
quickPick.acceptItem(quickPick.items[0])
223205
})
224-
.handleQuickPick('Select an S3 Bucket', async (picker) => {
206+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
225207
await picker.untilReady()
226-
assert.strictEqual(picker.items.length, 3)
227-
assert.strictEqual(picker.items[0].label, 'stack-1-bucket')
228-
assert.strictEqual(picker.items[1].label, 'stack-2-bucket')
229-
assert.strictEqual(picker.items[2].label, 'stack-3-bucket')
208+
assert.strictEqual(picker.items.length, 2)
209+
assert.deepEqual(picker.items[0], {
210+
label: 'Create a SAM CLI managed S3 bucket',
211+
data: BucketSource.SamCliManaged,
212+
})
213+
assert.deepEqual(picker.items[1], {
214+
label: 'Specify an S3 bucket',
215+
data: BucketSource.UserProvided,
216+
})
230217
picker.acceptItem(picker.items[0])
231218
})
232219
.handleQuickPick('Specify parameters for sync', async (picker) => {
@@ -248,8 +235,9 @@ describe('SAM SyncWizard', async () => {
248235
assert.strictEqual(parameters.paramsSource, ParamsSource.Specify)
249236
assert.strictEqual(parameters.region, 'us-west-2')
250237
assert.strictEqual(parameters.stackName, 'stack1')
238+
assert.strictEqual(parameters.bucketSource, BucketSource.SamCliManaged)
239+
assert(!parameters.bucketName)
251240
assert.strictEqual(parameters.deployType, 'infra')
252-
assert.strictEqual(parameters.bucketName, 'stack-1-bucket')
253241
assert.strictEqual(parameters.skipDependencyLayer, true)
254242
assert.strictEqual(parameters.syncFlags, '["--dependency-layer","--use-container","--save-params"]')
255243
prompterTester.assertCallAll()
@@ -263,6 +251,7 @@ describe('SAM SyncWizard', async () => {
263251
* - paramsSource : [Select] 3. ('Use default values from samconfig')
264252
* - region : [Skip] null; will use 'us-west-2' from samconfig
265253
* - stackName : [Skip] null; will use 'project-1' from samconfig
254+
* - bucketSource : [Skip] null;
266255
* - bucketName : [Skip] automatically set for bucketSource option 1
267256
* - syncFlags : [Skip] null; will use flags from samconfig
268257
*/
@@ -319,6 +308,7 @@ describe('SAM SyncWizard', async () => {
319308
* - paramsSource : [Select] 2. ('Specify required parameters')
320309
* - region : [Select] 'us-west-2'
321310
* - stackName : [Select] 2. 'stack2'
311+
* - bucketSource : [Select] 2. BucketSource.UserProvided
322312
* - bucketName : [select] 3. stack-3-bucket
323313
* - syncFlags : [Select] ["--save-params"]
324314
*/
@@ -346,6 +336,19 @@ describe('SAM SyncWizard', async () => {
346336
assert.strictEqual(picker.items[2].label, 'stack3')
347337
picker.acceptItem(picker.items[1])
348338
})
339+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
340+
await picker.untilReady()
341+
assert.strictEqual(picker.items.length, 2)
342+
assert.deepStrictEqual(picker.items[0], {
343+
label: 'Create a SAM CLI managed S3 bucket',
344+
data: BucketSource.SamCliManaged,
345+
})
346+
assert.deepStrictEqual(picker.items[1], {
347+
label: 'Specify an S3 bucket',
348+
data: BucketSource.UserProvided,
349+
})
350+
picker.acceptItem(picker.items[1])
351+
})
349352
.handleQuickPick('Select an S3 Bucket', async (picker) => {
350353
await picker.untilReady()
351354
assert.strictEqual(picker.items.length, 3)
@@ -371,6 +374,7 @@ describe('SAM SyncWizard', async () => {
371374
assert.strictEqual(parameters.paramsSource, ParamsSource.Specify)
372375
assert.strictEqual(parameters.region, 'us-west-2')
373376
assert.strictEqual(parameters.stackName, 'stack2')
377+
assert.strictEqual(parameters.bucketSource, BucketSource.UserProvided)
374378
assert.strictEqual(parameters.bucketName, 'stack-3-bucket')
375379
assert.strictEqual(parameters.deployType, 'infra')
376380
assert.strictEqual(parameters.skipDependencyLayer, true)
@@ -386,7 +390,8 @@ describe('SAM SyncWizard', async () => {
386390
* - paramsSource : [Select] 3. ('Use default values from samconfig')
387391
* - region : [Skip] null; will use value from samconfig file
388392
* - stackName : [Skip] null; will use value from samconfig file
389-
* - bucketName : [Skip] automatically set for bucketSource option 1
393+
* - bucketSource : [Skip] null;
394+
* - bucketName : [Skip] null; automatically set for bucketSource option 1
390395
* - syncFlags : [Skip] null; will use flags from samconfig
391396
*/
392397

@@ -417,6 +422,7 @@ describe('SAM SyncWizard', async () => {
417422
assert(!parameters.region)
418423
assert(!parameters.stackName)
419424
assert(!parameters.bucketSource)
425+
assert(!parameters.bucketName)
420426
assert.strictEqual(parameters.skipDependencyLayer, true)
421427
prompterTester.assertCallAll()
422428
})
@@ -471,6 +477,19 @@ describe('SAM SyncWizard', async () => {
471477
assert.strictEqual(picker.items[2].label, 'stack3')
472478
picker.acceptItem(picker.items[1])
473479
})
480+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
481+
await picker.untilReady()
482+
assert.strictEqual(picker.items.length, 2)
483+
assert.deepStrictEqual(picker.items[0], {
484+
label: 'Create a SAM CLI managed S3 bucket',
485+
data: BucketSource.SamCliManaged,
486+
})
487+
assert.deepStrictEqual(picker.items[1], {
488+
label: 'Specify an S3 bucket',
489+
data: BucketSource.UserProvided,
490+
})
491+
picker.acceptItem(picker.items[1])
492+
})
474493
.handleQuickPick('Select an S3 Bucket', async (picker) => {
475494
await picker.untilReady()
476495
assert.strictEqual(picker.items.length, 3)
@@ -497,6 +516,7 @@ describe('SAM SyncWizard', async () => {
497516
assert.strictEqual(parameters.paramsSource, ParamsSource.Specify)
498517
assert.strictEqual(parameters.region, 'us-west-2')
499518
assert.strictEqual(parameters.stackName, 'stack2')
519+
assert.strictEqual(parameters.bucketSource, BucketSource.UserProvided)
500520
assert.strictEqual(parameters.bucketName, 'stack-2-bucket')
501521
assert.strictEqual(parameters.deployType, 'infra')
502522
assert.strictEqual(parameters.skipDependencyLayer, true)
@@ -645,6 +665,19 @@ describe('SAM SyncWizard', async () => {
645665
const select = quickPick.items.filter((i) => i.detail === 'us-west-2')[0]
646666
quickPick.acceptItem(select || quickPick.items[0])
647667
})
668+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
669+
await picker.untilReady()
670+
assert.strictEqual(picker.items.length, 2)
671+
assert.deepStrictEqual(picker.items[0], {
672+
label: 'Create a SAM CLI managed S3 bucket',
673+
data: BucketSource.SamCliManaged,
674+
})
675+
assert.deepStrictEqual(picker.items[1], {
676+
label: 'Specify an S3 bucket',
677+
data: BucketSource.UserProvided,
678+
})
679+
picker.acceptItem(picker.items[1])
680+
})
648681
.handleQuickPick('Select an S3 Bucket', async (picker) => {
649682
await picker.untilReady()
650683
assert.strictEqual(picker.items.length, 3)
@@ -670,6 +703,7 @@ describe('SAM SyncWizard', async () => {
670703
assert.strictEqual(parameters.paramsSource, ParamsSource.Specify)
671704
assert.strictEqual(parameters.region, 'us-west-2')
672705
assert.strictEqual(parameters.stackName, 'stack2')
706+
assert.strictEqual(parameters.bucketSource, BucketSource.UserProvided)
673707
assert.strictEqual(parameters.bucketName, 'stack-2-bucket')
674708
assert.strictEqual(parameters.deployType, 'infra')
675709
assert.strictEqual(parameters.skipDependencyLayer, true)
@@ -720,13 +754,18 @@ describe('SAM SyncWizard', async () => {
720754
assert.strictEqual(picker.items[2].label, 'stack3')
721755
picker.acceptItem(picker.items[2])
722756
})
723-
.handleQuickPick('Select an S3 Bucket', async (picker) => {
757+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
724758
await picker.untilReady()
725-
assert.strictEqual(picker.items.length, 3)
726-
assert.strictEqual(picker.items[0].label, 'stack-1-bucket')
727-
assert.strictEqual(picker.items[1].label, 'stack-2-bucket')
728-
assert.strictEqual(picker.items[2].label, 'stack-3-bucket')
729-
picker.acceptItem(picker.items[2])
759+
assert.strictEqual(picker.items.length, 2)
760+
assert.deepStrictEqual(picker.items[0], {
761+
label: 'Create a SAM CLI managed S3 bucket',
762+
data: BucketSource.SamCliManaged,
763+
})
764+
assert.deepStrictEqual(picker.items[1], {
765+
label: 'Specify an S3 bucket',
766+
data: BucketSource.UserProvided,
767+
})
768+
picker.acceptItem(picker.items[0])
730769
})
731770
.handleQuickPick('Specify parameters for sync', async (picker) => {
732771
await picker.untilReady()
@@ -746,7 +785,8 @@ describe('SAM SyncWizard', async () => {
746785
assert.strictEqual(parameters.paramsSource, ParamsSource.SpecifyAndSave)
747786
assert.strictEqual(parameters.region, 'us-west-2')
748787
assert.strictEqual(parameters.stackName, 'stack3')
749-
assert.strictEqual(parameters.bucketName, 'stack-3-bucket')
788+
assert.strictEqual(parameters.bucketSource, BucketSource.SamCliManaged)
789+
assert(!parameters.bucketName)
750790
assert.strictEqual(parameters.deployType, 'infra')
751791
assert.strictEqual(parameters.skipDependencyLayer, true)
752792
assert.strictEqual(parameters.syncFlags, '["--dependency-layer","--use-container"]')
@@ -923,6 +963,12 @@ describe('SAM runSync', () => {
923963
assert.strictEqual(picker.items[2].label, 'stack3')
924964
picker.acceptItem(picker.items[2])
925965
})
966+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
967+
await picker.untilReady()
968+
assert.strictEqual(picker.items.length, 2)
969+
assert.strictEqual(picker.items[1].label, 'Specify an S3 bucket')
970+
picker.acceptItem(picker.items[1])
971+
})
926972
.handleQuickPick('Select an S3 Bucket', async (picker) => {
927973
await picker.untilReady()
928974
assert.strictEqual(picker.items.length, 3)
@@ -1002,6 +1048,12 @@ describe('SAM runSync', () => {
10021048
assert.strictEqual(quickPick.items[0].label, 'stack1')
10031049
quickPick.acceptItem(quickPick.items[0])
10041050
})
1051+
.handleQuickPick('Specify S3 bucket for deployment artifacts', async (picker) => {
1052+
await picker.untilReady()
1053+
assert.strictEqual(picker.items.length, 2)
1054+
assert.strictEqual(picker.items[1].label, 'Specify an S3 bucket')
1055+
picker.acceptItem(picker.items[1])
1056+
})
10051057
.handleQuickPick('Select an S3 Bucket', async (picker) => {
10061058
await picker.untilReady()
10071059
assert.strictEqual(picker.items[0].label, 'stack-1-bucket')
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "SAM: Add artifact bucket source prompter for SAM sync command"
4+
}

0 commit comments

Comments
 (0)