Skip to content

Commit a3735b9

Browse files
authored
clean-up: remove ToolkitClientBuilder (#2748)
## Problem `ToolkitClientBuilder` doesn't do much and makes testing harder than it needs to be. If we want factory functions, just add a static method to the client class instead. This is simpler and easier to find. ## Solution Remove it and add a simple utility function for stubbing classes (`stubber.ts`).
1 parent 2554022 commit a3735b9

File tree

75 files changed

+731
-1389
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+731
-1389
lines changed

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3209,7 +3209,7 @@
32093209
"mocha-junit-reporter": "^2.0.0",
32103210
"mocha-multi-reporters": "^1.5.1",
32113211
"nyc": "^15.1.0",
3212-
"prettier": "^2.6.2",
3212+
"prettier": "^2.7.1",
32133213
"prettier-plugin-sh": "^0.8.1",
32143214
"pretty-quick": "^3.1.0",
32153215
"readline-sync": "^1.4.9",

src/apigateway/commands/copyUrl.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55

66
import { Window } from '../../shared/vscode/window'
7-
import { Env } from '../../shared/vscode/env'
87
import { copyToClipboard } from '../../shared/utilities/messages'
98
import * as nls from 'vscode-nls'
109
const localize = nls.loadMessageBundle()
@@ -14,12 +13,11 @@ import * as vscode from 'vscode'
1413
import { ProgressLocation } from 'vscode'
1514

1615
import { Stage } from 'aws-sdk/clients/apigateway'
17-
import { ApiGatewayClient } from '../../shared/clients/apiGatewayClient'
16+
import { DefaultApiGatewayClient } from '../../shared/clients/apiGatewayClient'
1817
import { RegionProvider } from '../../shared/regions/regionProvider'
1918
import { DEFAULT_DNS_SUFFIX } from '../../shared/regions/regionUtilities'
2019
import { getLogger } from '../../shared/logger'
2120
import { recordApigatewayCopyUrl } from '../../shared/telemetry/telemetry'
22-
import globals from '../../shared/extensionGlobals'
2321

2422
interface StageInvokeUrlQuickPick extends vscode.QuickPickItem {
2523
// override declaration so this can't be undefined
@@ -29,12 +27,11 @@ interface StageInvokeUrlQuickPick extends vscode.QuickPickItem {
2927
export async function copyUrlCommand(
3028
node: RestApiNode,
3129
regionProvider: RegionProvider,
32-
window = Window.vscode(),
33-
env = Env.vscode()
30+
window = Window.vscode()
3431
): Promise<void> {
3532
const region = node.regionCode
3633
const dnsSuffix = regionProvider.getDnsSuffixForRegion(region) || DEFAULT_DNS_SUFFIX
37-
const client: ApiGatewayClient = globals.toolkitClientBuilder.createApiGatewayClient(region)
34+
const client = new DefaultApiGatewayClient(region)
3835

3936
let stages: Stage[]
4037
try {

src/apigateway/explorer/apiGatewayNodes.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@ import * as vscode from 'vscode'
1111
import { AWSTreeNodeBase } from '../../shared/treeview/nodes/awsTreeNodeBase'
1212
import { PlaceholderNode } from '../../shared/treeview/nodes/placeholderNode'
1313
import { makeChildrenNodes } from '../../shared/treeview/utils'
14-
import { ApiGatewayClient } from '../../shared/clients/apiGatewayClient'
14+
import { DefaultApiGatewayClient } from '../../shared/clients/apiGatewayClient'
1515
import { RestApi } from 'aws-sdk/clients/apigateway'
1616
import { toArrayAsync, toMap, updateInPlace } from '../../shared/utilities/collectionUtils'
1717
import { RestApiNode } from './apiNodes'
18-
import globals from '../../shared/extensionGlobals'
1918

2019
/**
2120
* An AWS Explorer node representing the API Gateway (v1) service.
2221
*/
2322
export class ApiGatewayNode extends AWSTreeNodeBase {
2423
private readonly apiNodes: Map<string, RestApiNode>
2524

26-
public constructor(private readonly partitionId: string, public readonly regionCode: string) {
25+
public constructor(
26+
private readonly partitionId: string,
27+
public readonly regionCode: string,
28+
private readonly client = new DefaultApiGatewayClient(regionCode)
29+
) {
2730
super('API Gateway', vscode.TreeItemCollapsibleState.Collapsed)
2831
this.apiNodes = new Map<string, RestApiNode>()
2932
}
@@ -45,9 +48,8 @@ export class ApiGatewayNode extends AWSTreeNodeBase {
4548
}
4649

4750
public async updateChildren(): Promise<void> {
48-
const client: ApiGatewayClient = globals.toolkitClientBuilder.createApiGatewayClient(this.regionCode)
4951
const apis: Map<string, RestApi> = toMap(
50-
await toArrayAsync(client.listApis()),
52+
await toArrayAsync(this.client.listApis()),
5153
configuration => `${configuration.name} (${configuration.id})`
5254
)
5355

src/apigateway/vue/invokeRemoteRestApi.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { toArrayAsync } from '../../shared/utilities/collectionUtils'
1111
import { Resource } from 'aws-sdk/clients/apigateway'
1212
import { localize } from '../../shared/utilities/vsCodeUtils'
1313
import { recordApigatewayInvokeRemote, Result } from '../../shared/telemetry/telemetry'
14-
import globals from '../../shared/extensionGlobals'
1514
import { VueWebview } from '../../webviews/main'
1615
import { ExtContext } from '../../shared/extensions'
16+
import { DefaultApiGatewayClient } from '../../shared/clients/apiGatewayClient'
1717

1818
interface InvokeApiMessage {
1919
region: string
@@ -47,7 +47,8 @@ export class RemoteRestInvokeWebview extends VueWebview {
4747

4848
public constructor(
4949
private readonly data: InvokeRemoteRestApiInitialData,
50-
private readonly channel: vscode.OutputChannel
50+
private readonly channel: vscode.OutputChannel,
51+
private readonly client = new DefaultApiGatewayClient(data.Region)
5152
) {
5253
super()
5354
}
@@ -62,7 +63,6 @@ export class RemoteRestInvokeWebview extends VueWebview {
6263

6364
public async invokeApi(message: InvokeApiMessage): Promise<string> {
6465
let result: Result = 'Succeeded'
65-
const client = globals.toolkitClientBuilder.createApiGatewayClient(message.region)
6666

6767
this.logger.info('Invoking API Gateway resource:')
6868
this.logger.info(String(message.body))
@@ -73,7 +73,7 @@ export class RemoteRestInvokeWebview extends VueWebview {
7373
const path = message.selectedApiResource.path
7474
const pathWithQueryString = path && message.queryString ? `${path}?${message.queryString}` : undefined
7575
try {
76-
const response = await client.testInvokeMethod(
76+
const response = await this.client.testInvokeMethod(
7777
message.api,
7878
message.selectedApiResource.id!,
7979
message.selectedMethod,
@@ -113,7 +113,7 @@ export async function invokeRemoteRestApi(
113113
const logger: Logger = getLogger()
114114

115115
try {
116-
const client = globals.toolkitClientBuilder.createApiGatewayClient(params.apiNode.regionCode)
116+
const client = new DefaultApiGatewayClient(params.apiNode.regionCode)
117117
logger.info(`Loading API Resources for API ${params.apiNode.name} (id: ${params.apiNode.id})`)
118118
const resources = (await toArrayAsync(client.getResourcesForApi(params.apiNode.id)))
119119
.sort((a, b) => a.path!.localeCompare(b.path!))

src/apprunner/commands/createServiceFromEcr.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ import { EcrRepositoryNode } from '../../ecr/explorer/ecrRepositoryNode'
99
import { EcrTagNode } from '../../ecr/explorer/ecrTagNode'
1010

1111
import { CreateAppRunnerServiceWizard } from '../wizards/apprunnerCreateServiceWizard'
12-
import globals from '../../shared/extensionGlobals'
12+
import { DefaultAppRunnerClient } from '../../shared/clients/apprunnerClient'
1313

14-
export async function createFromEcr(node: EcrTagNode | EcrRepositoryNode): Promise<void> {
14+
export async function createFromEcr(
15+
node: EcrTagNode | EcrRepositoryNode,
16+
client = new DefaultAppRunnerClient(node.regionCode)
17+
): Promise<void> {
1518
let telemetryResult: telemetry.Result = 'Failed'
1619

1720
try {
1821
const ecrNode = (node as any).tag === undefined ? (node as EcrRepositoryNode) : (node as EcrTagNode).parent
19-
const client = globals.toolkitClientBuilder.createAppRunnerClient(ecrNode.regionCode)
20-
const wizard = new CreateAppRunnerServiceWizard(ecrNode.regionCode, {
22+
const wizard = new CreateAppRunnerServiceWizard(node.regionCode, {
2123
SourceConfiguration: {
2224
ImageRepository: {
2325
ImageIdentifier: `${ecrNode.repository.repositoryUri}:${(node as any).tag ?? 'latest'}`,

src/apprunner/explorer/apprunnerServiceNode.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import * as AsyncLock from 'async-lock'
77
import { AppRunnerClient } from '../../shared/clients/apprunnerClient'
88
import { AppRunner } from 'aws-sdk'
99
import { AppRunnerNode } from './apprunnerNode'
10-
import { CloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient'
1110

1211
import { toArrayAsync, toMap } from '../../shared/utilities/collectionUtils'
1312
import { CloudWatchLogsBase } from '../../cloudWatchLogs/explorer/cloudWatchLogsNode'
@@ -17,6 +16,7 @@ import { AWSResourceNode } from '../../shared/treeview/nodes/awsResourceNode'
1716
import * as nls from 'vscode-nls'
1817
import { getLogger } from '../../shared/logger'
1918
import { getIcon } from '../../shared/icons'
19+
import { DefaultCloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient'
2020
const localize = nls.loadMessageBundle()
2121

2222
const CONTEXT_BASE = 'awsAppRunnerServiceNode'
@@ -36,18 +36,17 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
3636
public readonly name: string
3737
public readonly arn: string
3838
private readonly lock: AsyncLock = new AsyncLock()
39+
protected readonly placeholderMessage = localize('AWS.explorerNode.apprunner.nologs', '[No App Runner logs found]')
3940

4041
constructor(
4142
public readonly parent: AppRunnerNode,
4243
private readonly client: AppRunnerClient,
4344
private _info: AppRunner.Service,
44-
private currentOperation: AppRunner.OperationSummary & { Type?: ServiceOperation } = {}
45+
private currentOperation: AppRunner.OperationSummary & { Type?: ServiceOperation } = {},
46+
cloudwatchClient = new DefaultCloudWatchLogsClient(client.regionCode)
4547
) {
46-
super(
47-
'App Runner Service',
48-
parent.regionCode,
49-
localize('AWS.explorerNode.apprunner.nologs', '[No App Runner logs found]')
50-
)
48+
super('App Runner Service', parent.regionCode, cloudwatchClient)
49+
5150
this.iconPath = getIcon('aws-apprunner-service')
5251
this.id = `AppRunnerService-${_info.ServiceArn}`
5352
this.name = _info.ServiceName
@@ -64,10 +63,10 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
6463
return `https://${this._info.ServiceUrl}`
6564
}
6665

67-
protected async getLogGroups(client: CloudWatchLogsClient): Promise<Map<string, CloudWatchLogs.LogGroup>> {
66+
protected async getLogGroups(): Promise<Map<string, CloudWatchLogs.LogGroup>> {
6867
return toMap(
6968
await toArrayAsync(
70-
client.describeLogGroups({
69+
this.cloudwatchClient.describeLogGroups({
7170
logGroupNamePrefix: `/aws/apprunner/${this._info.ServiceName}/${this._info.ServiceId}`,
7271
})
7372
),

src/apprunner/wizards/apprunnerCreateServiceWizard.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import { BasicExitPrompterProvider } from '../../shared/ui/common/exitPrompter'
1616
import { GitExtension } from '../../shared/extensions/git'
1717
import { makeDeploymentButton } from './deploymentButton'
1818
import { apprunnerCreateServiceDocsUrl } from '../../shared/constants'
19-
import globals from '../../shared/extensionGlobals'
19+
import { DefaultIamClient } from '../../shared/clients/iamClient'
20+
import { DefaultEcrClient } from '../../shared/clients/ecrClient'
21+
import { DefaultAppRunnerClient } from '../../shared/clients/apprunnerClient'
2022

2123
const localize = nls.loadMessageBundle()
2224

@@ -98,21 +100,27 @@ export class CreateAppRunnerServiceWizard extends Wizard<AppRunner.CreateService
98100
public constructor(
99101
region: string,
100102
initState: WizardState<AppRunner.CreateServiceRequest> = {},
101-
implicitState: WizardState<AppRunner.CreateServiceRequest> = {}
103+
implicitState: WizardState<AppRunner.CreateServiceRequest> = {},
104+
clients = {
105+
iam: new DefaultIamClient(region),
106+
ecr: new DefaultEcrClient(region),
107+
apprunner: new DefaultAppRunnerClient(region),
108+
}
102109
) {
103110
super({
104111
initState,
105112
implicitState,
106113
exitPrompterProvider: new BasicExitPrompterProvider(),
107114
})
108115

109-
const ecrClient = globals.toolkitClientBuilder.createEcrClient(region)
110-
const iamClient = globals.toolkitClientBuilder.createIamClient(region)
111-
const apprunnerClient = globals.toolkitClientBuilder.createAppRunnerClient(region)
112116
const autoDeployButton = makeDeploymentButton()
113117
const gitExtension = GitExtension.instance
114-
const codeRepositoryWizard = new AppRunnerCodeRepositoryWizard(apprunnerClient, gitExtension, autoDeployButton)
115-
const imageRepositoryWizard = new AppRunnerImageRepositoryWizard(ecrClient, iamClient, autoDeployButton)
118+
const codeRepositoryWizard = new AppRunnerCodeRepositoryWizard(
119+
clients.apprunner,
120+
gitExtension,
121+
autoDeployButton
122+
)
123+
const imageRepositoryWizard = new AppRunnerImageRepositoryWizard(clients.ecr, clients.iam, autoDeployButton)
116124

117125
const form = this.form
118126

src/awsexplorer/regionNode.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ import { SsmDocumentNode } from '../ssmDocument/explorer/ssmDocumentNode'
2323
import { ResourcesNode } from '../dynamicResources/explorer/nodes/resourcesNode'
2424
import { AppRunnerNode } from '../apprunner/explorer/apprunnerNode'
2525
import { LoadMoreNode } from '../shared/treeview/nodes/loadMoreNode'
26-
import globals from '../shared/extensionGlobals'
26+
import { DefaultAppRunnerClient } from '../shared/clients/apprunnerClient'
27+
import { DefaultEcrClient } from '../shared/clients/ecrClient'
28+
import { DefaultEcsClient } from '../shared/clients/ecsClient'
29+
import { DefaultIotClient } from '../shared/clients/iotClient'
30+
import { DefaultS3Client } from '../shared/clients/s3Client'
31+
import { DefaultSchemaClient } from '../shared/clients/schemaClient'
2732

2833
/**
2934
* An AWS Explorer node representing a region.
@@ -55,38 +60,33 @@ export class RegionNode extends AWSTreeNodeBase {
5560
{ serviceId: 'apigateway', createFn: () => new ApiGatewayNode(partitionId, this.regionCode) },
5661
{
5762
serviceId: 'apprunner',
58-
createFn: () =>
59-
new AppRunnerNode(
60-
this.regionCode,
61-
globals.toolkitClientBuilder.createAppRunnerClient(this.regionCode)
62-
),
63+
createFn: () => new AppRunnerNode(this.regionCode, new DefaultAppRunnerClient(this.regionCode)),
6364
},
6465
{ serviceId: 'cloudformation', createFn: () => new CloudFormationNode(this.regionCode) },
6566
{ serviceId: 'logs', createFn: () => new CloudWatchLogsNode(this.regionCode) },
6667
{
6768
serviceId: 'ecr',
68-
createFn: () => new EcrNode(globals.toolkitClientBuilder.createEcrClient(this.regionCode)),
69+
createFn: () => new EcrNode(new DefaultEcrClient(this.regionCode)),
6970
},
7071
{
7172
serviceId: 'ecs',
72-
createFn: () => new EcsNode(globals.toolkitClientBuilder.createEcsClient(this.regionCode)),
73+
createFn: () => new EcsNode(new DefaultEcsClient(this.regionCode)),
7374
},
7475
{
7576
serviceId: 'iot',
76-
createFn: () => new IotNode(globals.toolkitClientBuilder.createIotClient(this.regionCode)),
77+
createFn: () => new IotNode(new DefaultIotClient(this.regionCode)),
7778
},
7879
{ serviceId: 'lambda', createFn: () => new LambdaNode(this.regionCode) },
7980
{
8081
serviceId: 's3',
81-
createFn: () => new S3Node(globals.toolkitClientBuilder.createS3Client(this.regionCode)),
82+
createFn: () => new S3Node(new DefaultS3Client(this.regionCode)),
8283
},
8384
...(isCloud9()
8485
? []
8586
: [
8687
{
8788
serviceId: 'schemas',
88-
createFn: () =>
89-
new SchemasNode(globals.toolkitClientBuilder.createSchemaClient(this.regionCode)),
89+
createFn: () => new SchemasNode(new DefaultSchemaClient(this.regionCode)),
9090
},
9191
]),
9292
{ serviceId: 'states', createFn: () => new StepFunctionsNode(this.regionCode) },

src/cloudWatchLogs/commands/viewLogStream.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ import { MultiStepWizard, WIZARD_RETRY, WIZARD_TERMINATE, WizardStep } from '../
1313
import { LogGroupNode } from '../explorer/logGroupNode'
1414
import { CloudWatchLogs } from 'aws-sdk'
1515

16-
import { CloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient'
16+
import { DefaultCloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient'
1717
import * as telemetry from '../../shared/telemetry/telemetry'
1818
import { LOCALIZED_DATE_FORMAT } from '../../shared/constants'
1919
import { getPaginatedAwsCallIter, IteratorTransformer } from '../../shared/utilities/collectionUtils'
2020
import { LogStreamRegistry } from '../registry/logStreamRegistry'
2121
import { convertLogGroupInfoToUri } from '../cloudWatchLogsUtils'
22-
import globals from '../../shared/extensionGlobals'
2322

2423
export interface SelectLogStreamResponse {
2524
region: string
@@ -58,7 +57,7 @@ export class DefaultSelectLogStreamWizardContext implements SelectLogStreamWizar
5857
public async pickLogStream(): Promise<string | undefined> {
5958
let telemetryResult: telemetry.Result = 'Succeeded'
6059

61-
const client: CloudWatchLogsClient = globals.toolkitClientBuilder.createCloudWatchLogsClient(this.regionCode)
60+
const client = new DefaultCloudWatchLogsClient(this.regionCode)
6261
const request: CloudWatchLogs.DescribeLogStreamsRequest = {
6362
logGroupName: this.logGroupName,
6463
orderBy: 'LastEventTime',

0 commit comments

Comments
 (0)