Skip to content

Commit 8be95a9

Browse files
authored
refactor(cloudcontrol): migrate client to use sdkv3. (aws#6789)
## Problem cloud control uses sdk v2. ## Solution - migrate to v3. ## Verification - Clicked the resource node in the explorer, scrolled through some resources. - Verified readonly locks still work. - Filtered resourced using multi-pick quickpick. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 9369f44 commit 8be95a9

File tree

12 files changed

+572
-45
lines changed

12 files changed

+572
-45
lines changed

package-lock.json

Lines changed: 526 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@
510510
"@aws-sdk/client-ssm": "<3.696.0",
511511
"@aws-sdk/client-sso": "<3.696.0",
512512
"@aws-sdk/client-sso-oidc": "<3.696.0",
513+
"@aws-sdk/client-cloudcontrol": "<3.696.0",
513514
"@aws-sdk/credential-provider-env": "<3.696.0",
514515
"@aws-sdk/credential-provider-process": "<3.696.0",
515516
"@aws-sdk/credential-provider-sso": "<3.696.0",

packages/core/src/dynamicResources/commands/deleteResource.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as vscode from 'vscode'
77
import * as nls from 'vscode-nls'
88
import { getLogger } from '../../shared/logger/logger'
99
import { showConfirmationMessage, showViewLogsMessage } from '../../shared/utilities/messages'
10-
import { CloudControlClient } from '../../shared/clients/cloudControlClient'
10+
import { CloudControlClient } from '../../shared/clients/cloudControl'
1111
import globals from '../../shared/extensionGlobals'
1212
import { telemetry } from '../../shared/telemetry/telemetry'
1313
import { millisecondsSince, Result } from '../../shared/telemetry/telemetry'

packages/core/src/dynamicResources/commands/saveResource.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { compare, Operation } from 'fast-json-patch'
1212
import { ResourceNode } from '../explorer/nodes/resourceNode'
1313
import { ResourceTypeNode } from '../explorer/nodes/resourceTypeNode'
1414
import { AwsResourceManager } from '../awsResourceManager'
15-
import { CloudControlClient } from '../../shared/clients/cloudControlClient'
15+
import { CloudControlClient } from '../../shared/clients/cloudControl'
1616
import { CloudControl } from 'aws-sdk'
1717
import globals from '../../shared/extensionGlobals'
1818
import { telemetry } from '../../shared/telemetry/telemetry'

packages/core/src/dynamicResources/explorer/nodes/resourceTypeNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as vscode from 'vscode'
77
import { ChildNodeLoader, ChildNodePage } from '../../../awsexplorer/childNodeLoader'
8-
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
8+
import { CloudControlClient } from '../../../shared/clients/cloudControl'
99
import { getLogger } from '../../../shared/logger/logger'
1010
import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase'
1111
import { LoadMoreNode } from '../../../shared/treeview/nodes/loadMoreNode'

packages/core/src/dynamicResources/explorer/nodes/resourcesNode.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { makeChildrenNodes } from '../../../shared/treeview/utils'
1212
import { toArrayAsync, updateInPlace } from '../../../shared/utilities/collectionUtils'
1313
import { ResourceTypeNode } from './resourceTypeNode'
1414
import { CloudFormation } from 'aws-sdk'
15-
import { CloudControlClient, DefaultCloudControlClient } from '../../../shared/clients/cloudControlClient'
15+
import { CloudControlClient } from '../../../shared/clients/cloudControl'
1616
import { memoizedGetResourceTypes, ResourceTypeMetadata } from '../../model/resources'
1717
import { ResourcesSettings } from '../../commands/configure'
1818

@@ -24,7 +24,7 @@ export class ResourcesNode extends AWSTreeNodeBase {
2424
public constructor(
2525
public readonly region: string,
2626
public readonly cloudFormation: CloudFormationClient = new DefaultCloudFormationClient(region),
27-
private readonly cloudControl: CloudControlClient = new DefaultCloudControlClient(region),
27+
private readonly cloudControl: CloudControlClient = new CloudControlClient(region),
2828
private readonly settings = new ResourcesSettings()
2929
) {
3030
super(localize('AWS.explorerNode.resources.label', 'Resources'), vscode.TreeItemCollapsibleState.Collapsed)

packages/core/src/shared/clients/cloudControlClient.ts renamed to packages/core/src/shared/clients/cloudControl.ts

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,59 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import { CloudControl } from 'aws-sdk'
6+
import * as CloudControl from '@aws-sdk/client-cloudcontrol'
77
import globals from '../extensionGlobals'
8-
import { ClassToInterfaceType } from '../utilities/tsUtils'
98
import { localize } from '../utilities/vsCodeUtils'
9+
import { ClientWrapper } from './clientWrapper'
1010

11-
export type CloudControlClient = ClassToInterfaceType<DefaultCloudControlClient>
12-
export class DefaultCloudControlClient implements CloudControlClient {
13-
public constructor(public readonly regionCode: string) {}
11+
export class CloudControlClient extends ClientWrapper<CloudControl.CloudControlClient> {
12+
public constructor(regionCode: string) {
13+
super(regionCode, CloudControl.CloudControlClient)
14+
}
1415

1516
public async createResource(request: CloudControl.CreateResourceInput): Promise<CloudControl.CreateResourceOutput> {
16-
const client = await this.createSdkClient()
17-
18-
const createResponse = await client.createResource(request).promise()
17+
const createResponse: CloudControl.CreateResourceOutput = await this.makeRequest(
18+
CloudControl.CreateResourceCommand,
19+
request
20+
)
1921

20-
await this.pollForCompletion(client, createResponse.ProgressEvent!)
22+
await this.pollForCompletion(createResponse.ProgressEvent!)
2123
return createResponse
2224
}
2325

2426
public async deleteResource(request: CloudControl.DeleteResourceInput): Promise<void> {
25-
const client = await this.createSdkClient()
26-
27-
const deleteResponse = await client.deleteResource(request).promise()
27+
const deleteResponse: CloudControl.DeleteResourceOutput = await this.makeRequest(
28+
CloudControl.DeleteResourceCommand,
29+
request
30+
)
2831

29-
await this.pollForCompletion(client, deleteResponse.ProgressEvent!)
32+
await this.pollForCompletion(deleteResponse.ProgressEvent!)
3033
}
3134

3235
public async listResources(request: CloudControl.ListResourcesInput): Promise<CloudControl.ListResourcesOutput> {
33-
const client = await this.createSdkClient()
34-
35-
return await client.listResources(request).promise()
36+
return await this.makeRequest(CloudControl.ListResourcesCommand, request)
3637
}
3738

3839
public async getResource(request: CloudControl.GetResourceInput): Promise<CloudControl.GetResourceOutput> {
39-
const client = await this.createSdkClient()
40-
41-
return await client.getResource(request).promise()
40+
return await this.makeRequest(CloudControl.GetResourceCommand, request)
4241
}
4342

4443
public async updateResource(request: CloudControl.UpdateResourceInput): Promise<void> {
45-
const client = await this.createSdkClient()
44+
const updateResponse: CloudControl.UpdateResourceOutput = await this.makeRequest(
45+
CloudControl.UpdateResourceCommand,
46+
request
47+
)
4648

47-
const updateResponse = await client.updateResource(request).promise()
49+
await this.pollForCompletion(updateResponse.ProgressEvent!)
50+
}
4851

49-
await this.pollForCompletion(client, updateResponse.ProgressEvent!)
52+
private async getResourceRequestStatus(
53+
request: CloudControl.GetResourceRequestStatusInput
54+
): Promise<CloudControl.GetResourceRequestStatusOutput> {
55+
return await this.makeRequest(CloudControl.GetResourceRequestStatusCommand, request)
5056
}
5157

5258
private async pollForCompletion(
53-
client: CloudControl,
5459
progressEvent: CloudControl.ProgressEvent,
5560
baseDelay: number = 500,
5661
maxRetries: number = 10
@@ -94,11 +99,9 @@ export class DefaultCloudControlClient implements CloudControlClient {
9499

95100
if (i + 1 < maxRetries) {
96101
await new Promise<void>((resolve) => globals.clock.setTimeout(resolve, baseDelay * 2 ** i))
97-
const resourceRequestStatus = await client
98-
.getResourceRequestStatus({
99-
RequestToken: progressEvent.RequestToken!,
100-
})
101-
.promise()
102+
const resourceRequestStatus = await this.getResourceRequestStatus({
103+
RequestToken: progressEvent.RequestToken,
104+
})
102105
progressEvent = resourceRequestStatus.ProgressEvent!
103106
}
104107
}
@@ -110,8 +113,4 @@ export class DefaultCloudControlClient implements CloudControlClient {
110113
)
111114
)
112115
}
113-
114-
private async createSdkClient(): Promise<CloudControl> {
115-
return await globals.sdkClientBuilder.createAwsService(CloudControl, undefined, this.regionCode)
116-
}
117116
}

packages/core/src/test/dynamicResources/awsResourceManager.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ import { ResourcesNode } from '../../dynamicResources/explorer/nodes/resourcesNo
1212
import { ResourceNode } from '../../dynamicResources/explorer/nodes/resourceNode'
1313
import { ResourceTypeNode } from '../../dynamicResources/explorer/nodes/resourceTypeNode'
1414
import { formatResourceModel, AwsResourceManager } from '../../dynamicResources/awsResourceManager'
15-
import { CloudControlClient, DefaultCloudControlClient } from '../../shared/clients/cloudControlClient'
15+
import { CloudControlClient } from '../../shared/clients/cloudControl'
1616
import { CloudFormationClient, DefaultCloudFormationClient } from '../../shared/clients/cloudFormationClient'
1717
import { makeTemporaryToolkitFolder, readFileAsString } from '../../shared/filesystemUtilities'
1818
import { FakeExtensionContext } from '../fakeExtensionContext'
1919
import { existsSync } from 'fs' // eslint-disable-line no-restricted-imports
2020
import { ResourceTypeMetadata } from '../../dynamicResources/model/resources'
2121
import globals from '../../shared/extensionGlobals'
2222
import { Stub, stub } from '../utilities/stubber'
23-
import { CloudControl, CloudFormation } from 'aws-sdk'
23+
import { CloudFormation } from 'aws-sdk'
24+
import * as CloudControl from '@aws-sdk/client-cloudcontrol'
2425
import { fs } from '../../shared'
2526

2627
describe('ResourceManager', function () {
@@ -48,7 +49,7 @@ describe('ResourceManager', function () {
4849
}
4950

5051
beforeEach(async function () {
51-
cloudControl = stub(DefaultCloudControlClient, {
52+
cloudControl = stub(CloudControlClient, {
5253
regionCode: '',
5354
})
5455
cloudFormation = stub(DefaultCloudFormationClient, {

packages/core/src/test/dynamicResources/commands/deleteResource.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
import * as sinon from 'sinon'
77
import assert from 'assert'
88
import { deleteResource } from '../../../dynamicResources/commands/deleteResource'
9-
import { DefaultCloudControlClient } from '../../../shared/clients/cloudControlClient'
9+
import { CloudControlClient } from '../../../shared/clients/cloudControl'
1010
import { assertNoErrorMessages, getTestWindow } from '../../shared/vscode/window'
1111

1212
describe('deleteResource', function () {
1313
const fakeType = 'fakeType'
1414
const fakeIdentifier = 'fakeIdentifier'
15-
const cloudControl = new DefaultCloudControlClient('')
15+
const cloudControl = new CloudControlClient('')
1616
let sandbox: sinon.SinonSandbox
1717

1818
beforeEach(function () {

packages/core/src/test/dynamicResources/commands/saveResource.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import assert from 'assert'
77
import { createResource, updateResource } from '../../../dynamicResources/commands/saveResource'
88
import { AddOperation } from 'fast-json-patch'
9-
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
9+
import { CloudControlClient } from '../../../shared/clients/cloudControl'
1010
import { getTestWindow } from '../../shared/vscode/window'
1111
import sinon from 'sinon'
1212

0 commit comments

Comments
 (0)