mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-06 09:35:41 -05:00
Add azurecore HTTP typings (#22828)
* Add azurecore HTTP typings * undo + spelling fix
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
import { ResourceGraphClient } from '@azure/arm-resourcegraph';
|
||||
import { TokenCredentials } from '@azure/ms-rest-js';
|
||||
import * as azdata from 'azdata';
|
||||
import { AzureRestResponse, GetResourceGroupsResult, GetSubscriptionsResult, ResourceQueryResult, GetBlobContainersResult, GetFileSharesResult, HttpRequestMethod, GetLocationsResult, GetManagedDatabasesResult, CreateResourceGroupResult, GetBlobsResult, GetStorageAccountAccessKeyResult, AzureAccount, azureResource, AzureAccountProviderMetadata } from 'azurecore';
|
||||
import { AzureRestResponse, GetResourceGroupsResult, GetSubscriptionsResult, ResourceQueryResult, GetBlobContainersResult, GetFileSharesResult, HttpRequestMethod, GetLocationsResult, GetManagedDatabasesResult, CreateResourceGroupResult, GetBlobsResult, GetStorageAccountAccessKeyResult, AzureAccount, azureResource, AzureAccountProviderMetadata, AzureNetworkResponse, HttpClientResponse } from 'azurecore';
|
||||
import { EOL } from 'os';
|
||||
import * as nls from 'vscode-nls';
|
||||
import { AppContext } from '../appContext';
|
||||
@@ -23,11 +23,31 @@ import { NetworkRequestOptions } from '@azure/msal-common';
|
||||
|
||||
const localize = nls.loadMessageBundle();
|
||||
|
||||
export interface HttpClientResponse {
|
||||
body: any;
|
||||
headers: any;
|
||||
status: Number;
|
||||
error: any;
|
||||
/**
|
||||
* Shape of list operation responses
|
||||
* e.g. https://learn.microsoft.com/en-us/rest/api/storagerp/srp_json_list_operations#response-body
|
||||
*/
|
||||
declare type AzureListOperationResponse<T> = {
|
||||
value: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* An access key for the storage account.
|
||||
* https://learn.microsoft.com/en-us/rest/api/storagerp/storage-accounts/list-keys?tabs=HTTP#storageaccountkey
|
||||
*/
|
||||
declare type StorageAccountKey = {
|
||||
creationTime: string;
|
||||
keyName: string;
|
||||
// permissions: KeyPermission Can add this if ever needed
|
||||
value: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* The response from the ListKeys operation.
|
||||
* https://learn.microsoft.com/en-us/rest/api/storagerp/storage-accounts/list-keys?tabs=HTTP#storageaccountlistkeysresult
|
||||
*/
|
||||
declare type StorageAccountListKeysResult = {
|
||||
keys: StorageAccountKey[];
|
||||
}
|
||||
|
||||
function getErrorMessage(error: Error | string): string {
|
||||
@@ -170,8 +190,8 @@ export async function getLocations(appContext: AppContext, account?: AzureAccoun
|
||||
try {
|
||||
const path = `/subscriptions/${subscription.id}/locations?api-version=2020-01-01`;
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
result.locations.push(...response.response.data.value);
|
||||
const response = await makeHttpRequest<AzureListOperationResponse<azureResource.AzureLocation[]>>(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
result.locations.push(...response.response?.data.value || []);
|
||||
result.errors.push(...response.errors);
|
||||
} catch (err) {
|
||||
const error = new Error(localize('azure.accounts.getLocations.queryError', "Error fetching locations for account {0} ({1}) subscription {2} ({3}) tenant {4} : {5}",
|
||||
@@ -348,8 +368,17 @@ export async function getSelectedSubscriptions(appContext: AppContext, account?:
|
||||
* @param host Use this to override the host. The default host is https://management.azure.com
|
||||
* @param requestHeaders Provide additional request headers
|
||||
*/
|
||||
export async function makeHttpRequest(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, path: string, requestType: HttpRequestMethod, requestBody?: any, ignoreErrors: boolean = false, host: string = 'https://management.azure.com', requestHeaders: { [key: string]: string } = {}): Promise<AzureRestResponse> {
|
||||
const result: AzureRestResponse = { response: {}, errors: [] };
|
||||
export async function makeHttpRequest<B>(
|
||||
account: AzureAccount,
|
||||
subscription: azureResource.AzureResourceSubscription,
|
||||
path: string,
|
||||
requestType: HttpRequestMethod,
|
||||
requestBody?: any,
|
||||
ignoreErrors: boolean = false,
|
||||
host: string = 'https://management.azure.com',
|
||||
requestHeaders: Record<string, string> = {}
|
||||
): Promise<AzureRestResponse<B>> {
|
||||
const result: AzureRestResponse<B> = { response: undefined, errors: [] };
|
||||
const httpClient: HttpClient = getProxyEnabledHttpClient();
|
||||
|
||||
if (!account?.properties?.tenants || !Array.isArray(account.properties.tenants)) {
|
||||
@@ -414,21 +443,21 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
|
||||
requestUrl = `${account.properties.providerSettings.settings.armResource.endpoint}${path}`;
|
||||
}
|
||||
|
||||
let response;
|
||||
let response: AzureNetworkResponse<HttpClientResponse<B>> | undefined = undefined;
|
||||
switch (requestType) {
|
||||
case HttpRequestMethod.GET:
|
||||
response = await httpClient.sendGetRequestAsync<any>(requestUrl, {
|
||||
response = await httpClient.sendGetRequestAsync<HttpClientResponse<B>>(requestUrl, {
|
||||
headers: reqHeaders
|
||||
});
|
||||
break;
|
||||
case HttpRequestMethod.POST:
|
||||
response = await httpClient.sendPostRequestAsync<HttpClientResponse>(requestUrl, networkRequestOptions);
|
||||
response = await httpClient.sendPostRequestAsync<HttpClientResponse<B>>(requestUrl, networkRequestOptions);
|
||||
break;
|
||||
case HttpRequestMethod.PUT:
|
||||
response = await httpClient.sendPutRequestAsync<HttpClientResponse>(requestUrl, networkRequestOptions);
|
||||
response = await httpClient.sendPutRequestAsync<HttpClientResponse<B>>(requestUrl, networkRequestOptions);
|
||||
break;
|
||||
case HttpRequestMethod.DELETE:
|
||||
response = await httpClient.sendDeleteRequestAsync<any>(requestUrl, {
|
||||
response = await httpClient.sendDeleteRequestAsync<HttpClientResponse<B>>(requestUrl, {
|
||||
headers: reqHeaders
|
||||
});
|
||||
break;
|
||||
@@ -459,7 +488,13 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
|
||||
result.errors.push(error);
|
||||
}
|
||||
|
||||
result.response = response;
|
||||
if (response) {
|
||||
result.response = {
|
||||
headers: response.headers,
|
||||
data: response.data.body,
|
||||
status: response.status
|
||||
};
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -467,7 +502,7 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
|
||||
export async function getManagedDatabases(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, managedInstance: azureResource.AzureSqlManagedInstance, ignoreErrors: boolean): Promise<GetManagedDatabasesResult> {
|
||||
const path = `/subscriptions/${subscription.id}/resourceGroups/${managedInstance.resourceGroup}/providers/Microsoft.Sql/managedInstances/${managedInstance.name}/databases?api-version=2020-02-02-preview`;
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
const response = await makeHttpRequest<AzureListOperationResponse<azureResource.ManagedDatabase[]>>(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
return {
|
||||
databases: response?.response?.data?.value ?? [],
|
||||
errors: response.errors ? response.errors : []
|
||||
@@ -477,7 +512,7 @@ export async function getManagedDatabases(account: AzureAccount, subscription: a
|
||||
export async function getBlobContainers(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, storageAccount: azureResource.AzureGraphResource, ignoreErrors: boolean): Promise<GetBlobContainersResult> {
|
||||
const path = `/subscriptions/${subscription.id}/resourceGroups/${storageAccount.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${storageAccount.name}/blobServices/default/containers?api-version=2019-06-01`;
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
const response = await makeHttpRequest<AzureListOperationResponse<azureResource.BlobContainer[]>>(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
return {
|
||||
blobContainers: response?.response?.data?.value ?? [],
|
||||
errors: response.errors ? response.errors : []
|
||||
@@ -487,7 +522,7 @@ export async function getBlobContainers(account: AzureAccount, subscription: azu
|
||||
export async function getFileShares(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, storageAccount: azureResource.AzureGraphResource, ignoreErrors: boolean): Promise<GetFileSharesResult> {
|
||||
const path = `/subscriptions/${subscription.id}/resourceGroups/${storageAccount.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${storageAccount.name}/fileServices/default/shares?api-version=2019-06-01`;
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
const response = await makeHttpRequest<AzureListOperationResponse<azureResource.FileShare[]>>(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
|
||||
return {
|
||||
fileShares: response?.response?.data?.value ?? [],
|
||||
errors: response.errors ? response.errors : []
|
||||
@@ -500,7 +535,7 @@ export async function createResourceGroup(account: AzureAccount, subscription: a
|
||||
location: location
|
||||
};
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.PUT, requestBody, ignoreErrors, host);
|
||||
const response = await makeHttpRequest<azureResource.AzureResourceResourceGroup>(account, subscription, path, HttpRequestMethod.PUT, requestBody, ignoreErrors, host);
|
||||
return {
|
||||
resourceGroup: response?.response?.data,
|
||||
errors: response.errors ? response.errors : []
|
||||
@@ -510,7 +545,7 @@ export async function createResourceGroup(account: AzureAccount, subscription: a
|
||||
export async function getStorageAccountAccessKey(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, storageAccount: azureResource.AzureGraphResource, ignoreErrors: boolean): Promise<GetStorageAccountAccessKeyResult> {
|
||||
const path = `/subscriptions/${subscription.id}/resourceGroups/${storageAccount.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${storageAccount.name}/listKeys?api-version=2019-06-01`;
|
||||
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
|
||||
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.POST, undefined, ignoreErrors, host);
|
||||
const response = await makeHttpRequest<StorageAccountListKeysResult>(account, subscription, path, HttpRequestMethod.POST, undefined, ignoreErrors, host);
|
||||
return {
|
||||
keyName1: response?.response?.data?.keys[0].value ?? '',
|
||||
keyName2: response?.response?.data?.keys[0].value ?? '',
|
||||
|
||||
Reference in New Issue
Block a user