Skip to content

Commit 2a72310

Browse files
Make Azure resource provider mockable (#650)
1 parent 5597c23 commit 2a72310

File tree

2 files changed

+54
-29
lines changed

2 files changed

+54
-29
lines changed

src/api/DefaultAzureResourceProvider.ts

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { GenericResource, ResourceGroup } from '@azure/arm-resources';
7-
import { getResourceGroupFromId, uiUtils } from "@microsoft/vscode-azext-azureutils";
8-
import { callWithTelemetryAndErrorHandling, createSubscriptionContext, getAzExtResourceType, IActionContext, nonNullProp } from '@microsoft/vscode-azext-utils';
7+
import { getResourceGroupFromId } from "@microsoft/vscode-azext-azureutils";
8+
import { callWithTelemetryAndErrorHandling, getAzExtResourceType, IActionContext, nonNullProp } from '@microsoft/vscode-azext-utils';
99
import * as vscode from 'vscode';
1010
import { AzureResource, AzureSubscription } from '../../api/src/index';
1111
import { AzureResourceProvider } from '../../hostapi.v2.internal';
12-
import { createResourceClient } from '../utils/azureClients';
12+
import { getAzureResourcesService } from '../services/AzureResourcesService';
1313

1414
export class DefaultAzureResourceProvider implements AzureResourceProvider {
1515
private readonly onDidChangeResourceEmitter = new vscode.EventEmitter<AzureResource | undefined>();
@@ -18,35 +18,37 @@ export class DefaultAzureResourceProvider implements AzureResourceProvider {
1818
return callWithTelemetryAndErrorHandling(
1919
'defaultAzureResourceProvider.getResources',
2020
async (context: IActionContext) => {
21-
const azureResources = await listResources(context, subscription);
22-
const resourceGroups = await listResourceGroups(context, subscription);
21+
const azureResources = await this.listResources(context, subscription);
22+
const resourceGroups = await this.listResourceGroups(context, subscription);
2323
return [...azureResources, ...resourceGroups];
2424
});
2525
}
2626

2727
onDidChangeResource = this.onDidChangeResourceEmitter.event;
28-
}
2928

30-
/**
31-
* @returns Deduped list of Azure resources in the specified subscription
32-
*/
33-
async function listResources(context: IActionContext, subscription: AzureSubscription): Promise<AzureResource[]> {
34-
const subContext = createSubscriptionContext(subscription);
35-
const client = await createResourceClient([context, subContext]);
29+
/**
30+
* @returns Deduped list of Azure resources in the specified subscription
31+
*/
32+
private async listResources(context: IActionContext, subscription: AzureSubscription): Promise<AzureResource[]> {
33+
const allResources = await getAzureResourcesService().listResources(context, subscription);
3634

37-
// Load more currently broken https://github.com/Azure/azure-sdk-for-js/issues/20380
38-
const allResources = await uiUtils.listAllIterator(client.resources.list());
35+
// dedupe resources to fix https://github.com/microsoft/vscode-azureresourcegroups/issues/526
36+
const allResourcesDeduped: GenericResource[] = [...new Map(allResources.map((item) => [item.id, item])).values()];
37+
context.telemetry.measurements.resourceCount = allResourcesDeduped.length;
3938

40-
// dedupe resources to fix https://github.com/microsoft/vscode-azureresourcegroups/issues/526
41-
const allResourcesDeduped: GenericResource[] = [...new Map(allResources.map((item) => [item.id, item])).values()];
42-
context.telemetry.measurements.resourceCount = allResourcesDeduped.length;
39+
if (allResourcesDeduped.length !== allResources.length) {
40+
context.telemetry.properties.duplicateResources = 'true';
41+
context.telemetry.measurements.rawResourceCount = allResources.length;
42+
}
4343

44-
if (allResourcesDeduped.length !== allResources.length) {
45-
context.telemetry.properties.duplicateResources = 'true';
46-
context.telemetry.measurements.rawResourceCount = allResources.length;
44+
return allResourcesDeduped.map(resource => createAzureResource(subscription, resource));
4745
}
4846

49-
return allResourcesDeduped.map(resource => createAzureResource(subscription, resource));
47+
private async listResourceGroups(context: IActionContext, subscription: AzureSubscription): Promise<AzureResource[]> {
48+
const allResourceGroups: ResourceGroup[] = await getAzureResourcesService().listResourceGroups(context, subscription);
49+
context.telemetry.measurements.resourceGroupCount = allResourceGroups.length;
50+
return allResourceGroups.map(resource => createResourceGroup(subscription, resource));
51+
}
5052
}
5153

5254
function createAzureResource(subscription: AzureSubscription, resource: GenericResource): AzureResource {
@@ -71,15 +73,7 @@ function createAzureResource(subscription: AzureSubscription, resource: GenericR
7173
};
7274
}
7375

74-
async function listResourceGroups(context: IActionContext, subscription: AzureSubscription): Promise<AzureResource[]> {
75-
const subContext = createSubscriptionContext(subscription);
76-
const client = await createResourceClient([context, subContext]);
7776

78-
const allResourceGroups: ResourceGroup[] = await uiUtils.listAllIterator(client.resourceGroups.list());
79-
context.telemetry.measurements.resourceGroupCount = allResourceGroups.length;
80-
81-
return allResourceGroups.map(resource => createResourceGroup(subscription, resource));
82-
}
8377

8478
export function createResourceGroup(subscription: AzureSubscription, resourceGroup: ResourceGroup): AzureResource {
8579
return {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import type { GenericResource, ResourceGroup, ResourceManagementClient } from "@azure/arm-resources";
2+
import { uiUtils } from "@microsoft/vscode-azext-azureutils";
3+
import { createSubscriptionContext, IActionContext } from "@microsoft/vscode-azext-utils";
4+
import { AzureSubscription } from "api/src/resources/azure";
5+
import { createResourceClient } from "../utils/azureClients";
6+
7+
export interface AzureResourcesService {
8+
listResources(context: IActionContext, subscription: AzureSubscription): Promise<GenericResource[]>;
9+
listResourceGroups(context: IActionContext, subscription: AzureSubscription): Promise<ResourceGroup[]>;
10+
}
11+
12+
export const defaultAzureResourcesServiceFactory = (): AzureResourcesService => {
13+
async function createClient(context: IActionContext, subscription: AzureSubscription): Promise<ResourceManagementClient> {
14+
const subContext = createSubscriptionContext(subscription);
15+
return await createResourceClient([context, subContext]);
16+
}
17+
return {
18+
async listResources(context: IActionContext, subscription: AzureSubscription): Promise<GenericResource[]> {
19+
const client = await createClient(context, subscription);
20+
return uiUtils.listAllIterator(client.resources.list());
21+
},
22+
async listResourceGroups(context: IActionContext, subscription: AzureSubscription): Promise<ResourceGroup[]> {
23+
const client = await createClient(context, subscription);
24+
return uiUtils.listAllIterator(client.resourceGroups.list());
25+
},
26+
}
27+
}
28+
29+
export function getAzureResourcesService(): AzureResourcesService {
30+
return defaultAzureResourcesServiceFactory();
31+
}

0 commit comments

Comments
 (0)