Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
526 changes: 526 additions & 0 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,7 @@
"@aws-sdk/client-ssm": "<3.696.0",
"@aws-sdk/client-sso": "<3.696.0",
"@aws-sdk/client-sso-oidc": "<3.696.0",
"@aws-sdk/client-cloudcontrol": "<3.696.0",
"@aws-sdk/credential-provider-env": "<3.696.0",
"@aws-sdk/credential-provider-process": "<3.696.0",
"@aws-sdk/credential-provider-sso": "<3.696.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import * as vscode from 'vscode'
import * as nls from 'vscode-nls'
import { getLogger } from '../../shared/logger/logger'
import { showConfirmationMessage, showViewLogsMessage } from '../../shared/utilities/messages'
import { CloudControlClient } from '../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../shared/clients/cloudControl'
import globals from '../../shared/extensionGlobals'
import { telemetry } from '../../shared/telemetry/telemetry'
import { millisecondsSince, Result } from '../../shared/telemetry/telemetry'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { compare, Operation } from 'fast-json-patch'
import { ResourceNode } from '../explorer/nodes/resourceNode'
import { ResourceTypeNode } from '../explorer/nodes/resourceTypeNode'
import { AwsResourceManager } from '../awsResourceManager'
import { CloudControlClient } from '../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../shared/clients/cloudControl'
import { CloudControl } from 'aws-sdk'
import globals from '../../shared/extensionGlobals'
import { telemetry } from '../../shared/telemetry/telemetry'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import * as vscode from 'vscode'
import { ChildNodeLoader, ChildNodePage } from '../../../awsexplorer/childNodeLoader'
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { getLogger } from '../../../shared/logger/logger'
import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase'
import { LoadMoreNode } from '../../../shared/treeview/nodes/loadMoreNode'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { makeChildrenNodes } from '../../../shared/treeview/utils'
import { toArrayAsync, updateInPlace } from '../../../shared/utilities/collectionUtils'
import { ResourceTypeNode } from './resourceTypeNode'
import { CloudFormation } from 'aws-sdk'
import { CloudControlClient, DefaultCloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { memoizedGetResourceTypes, ResourceTypeMetadata } from '../../model/resources'
import { ResourcesSettings } from '../../commands/configure'

Expand All @@ -24,7 +24,7 @@ export class ResourcesNode extends AWSTreeNodeBase {
public constructor(
public readonly region: string,
public readonly cloudFormation: CloudFormationClient = new DefaultCloudFormationClient(region),
private readonly cloudControl: CloudControlClient = new DefaultCloudControlClient(region),
private readonly cloudControl: CloudControlClient = new CloudControlClient(region),
private readonly settings = new ResourcesSettings()
) {
super(localize('AWS.explorerNode.resources.label', 'Resources'), vscode.TreeItemCollapsibleState.Collapsed)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,59 @@
* SPDX-License-Identifier: Apache-2.0
*/

import { CloudControl } from 'aws-sdk'
import * as CloudControl from '@aws-sdk/client-cloudcontrol'
import globals from '../extensionGlobals'
import { ClassToInterfaceType } from '../utilities/tsUtils'
import { localize } from '../utilities/vsCodeUtils'
import { ClientWrapper } from './clientWrapper'

export type CloudControlClient = ClassToInterfaceType<DefaultCloudControlClient>
export class DefaultCloudControlClient implements CloudControlClient {
public constructor(public readonly regionCode: string) {}
export class CloudControlClient extends ClientWrapper<CloudControl.CloudControlClient> {
public constructor(regionCode: string) {
super(regionCode, CloudControl.CloudControlClient)
}

public async createResource(request: CloudControl.CreateResourceInput): Promise<CloudControl.CreateResourceOutput> {
const client = await this.createSdkClient()

const createResponse = await client.createResource(request).promise()
const createResponse: CloudControl.CreateResourceOutput = await this.makeRequest(
CloudControl.CreateResourceCommand,
request
)

await this.pollForCompletion(client, createResponse.ProgressEvent!)
await this.pollForCompletion(createResponse.ProgressEvent!)
return createResponse
}

public async deleteResource(request: CloudControl.DeleteResourceInput): Promise<void> {
const client = await this.createSdkClient()

const deleteResponse = await client.deleteResource(request).promise()
const deleteResponse: CloudControl.DeleteResourceOutput = await this.makeRequest(
CloudControl.DeleteResourceCommand,
request
)

await this.pollForCompletion(client, deleteResponse.ProgressEvent!)
await this.pollForCompletion(deleteResponse.ProgressEvent!)
}

public async listResources(request: CloudControl.ListResourcesInput): Promise<CloudControl.ListResourcesOutput> {
const client = await this.createSdkClient()

return await client.listResources(request).promise()
return await this.makeRequest(CloudControl.ListResourcesCommand, request)
}

public async getResource(request: CloudControl.GetResourceInput): Promise<CloudControl.GetResourceOutput> {
const client = await this.createSdkClient()

return await client.getResource(request).promise()
return await this.makeRequest(CloudControl.GetResourceCommand, request)
}

public async updateResource(request: CloudControl.UpdateResourceInput): Promise<void> {
const client = await this.createSdkClient()
const updateResponse: CloudControl.UpdateResourceOutput = await this.makeRequest(
CloudControl.UpdateResourceCommand,
request
)

const updateResponse = await client.updateResource(request).promise()
await this.pollForCompletion(updateResponse.ProgressEvent!)
}

await this.pollForCompletion(client, updateResponse.ProgressEvent!)
private async getResourceRequestStatus(
request: CloudControl.GetResourceRequestStatusInput
): Promise<CloudControl.GetResourceRequestStatusOutput> {
return await this.makeRequest(CloudControl.GetResourceRequestStatusCommand, request)
}

private async pollForCompletion(
client: CloudControl,
progressEvent: CloudControl.ProgressEvent,
baseDelay: number = 500,
maxRetries: number = 10
Expand Down Expand Up @@ -94,11 +99,9 @@ export class DefaultCloudControlClient implements CloudControlClient {

if (i + 1 < maxRetries) {
await new Promise<void>((resolve) => globals.clock.setTimeout(resolve, baseDelay * 2 ** i))
const resourceRequestStatus = await client
.getResourceRequestStatus({
RequestToken: progressEvent.RequestToken!,
})
.promise()
const resourceRequestStatus = await this.getResourceRequestStatus({
RequestToken: progressEvent.RequestToken,
})
progressEvent = resourceRequestStatus.ProgressEvent!
}
}
Expand All @@ -110,8 +113,4 @@ export class DefaultCloudControlClient implements CloudControlClient {
)
)
}

private async createSdkClient(): Promise<CloudControl> {
return await globals.sdkClientBuilder.createAwsService(CloudControl, undefined, this.regionCode)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,16 @@ import { ResourcesNode } from '../../dynamicResources/explorer/nodes/resourcesNo
import { ResourceNode } from '../../dynamicResources/explorer/nodes/resourceNode'
import { ResourceTypeNode } from '../../dynamicResources/explorer/nodes/resourceTypeNode'
import { formatResourceModel, AwsResourceManager } from '../../dynamicResources/awsResourceManager'
import { CloudControlClient, DefaultCloudControlClient } from '../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../shared/clients/cloudControl'
import { CloudFormationClient, DefaultCloudFormationClient } from '../../shared/clients/cloudFormationClient'
import { makeTemporaryToolkitFolder, readFileAsString } from '../../shared/filesystemUtilities'
import { FakeExtensionContext } from '../fakeExtensionContext'
import { existsSync } from 'fs' // eslint-disable-line no-restricted-imports
import { ResourceTypeMetadata } from '../../dynamicResources/model/resources'
import globals from '../../shared/extensionGlobals'
import { Stub, stub } from '../utilities/stubber'
import { CloudControl, CloudFormation } from 'aws-sdk'
import { CloudFormation } from 'aws-sdk'
import * as CloudControl from '@aws-sdk/client-cloudcontrol'
import { fs } from '../../shared'

describe('ResourceManager', function () {
Expand Down Expand Up @@ -48,7 +49,7 @@ describe('ResourceManager', function () {
}

beforeEach(async function () {
cloudControl = stub(DefaultCloudControlClient, {
cloudControl = stub(CloudControlClient, {
regionCode: '',
})
cloudFormation = stub(DefaultCloudFormationClient, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
import * as sinon from 'sinon'
import assert from 'assert'
import { deleteResource } from '../../../dynamicResources/commands/deleteResource'
import { DefaultCloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { assertNoErrorMessages, getTestWindow } from '../../shared/vscode/window'

describe('deleteResource', function () {
const fakeType = 'fakeType'
const fakeIdentifier = 'fakeIdentifier'
const cloudControl = new DefaultCloudControlClient('')
const cloudControl = new CloudControlClient('')
let sandbox: sinon.SinonSandbox

beforeEach(function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import assert from 'assert'
import { createResource, updateResource } from '../../../dynamicResources/commands/saveResource'
import { AddOperation } from 'fast-json-patch'
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { getTestWindow } from '../../shared/vscode/window'
import sinon from 'sinon'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { CloudFormationClient } from '../../../shared/clients/cloudFormationClie
import { assertNodeListOnlyHasPlaceholderNode } from '../../utilities/explorerNodeAssertions'
import { asyncGenerator } from '../../../shared/utilities/collectionUtils'
import { CloudFormation } from 'aws-sdk'
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { Settings } from '../../../shared/settings'
import { ResourcesSettings } from '../../../dynamicResources/commands/configure'
import sinon from 'sinon'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
assertNodeListOnlyHasErrorNode,
assertNodeListOnlyHasPlaceholderNode,
} from '../../utilities/explorerNodeAssertions'
import { CloudControlClient } from '../../../shared/clients/cloudControlClient'
import { CloudControlClient } from '../../../shared/clients/cloudControl'
import { CloudControl } from 'aws-sdk'
import { ResourceTypeMetadata } from '../../../dynamicResources/model/resources'
import sinon from 'sinon'
Expand Down
Loading