|
|
|
|
@@ -124,7 +124,7 @@ export type SqlVMServer = {
|
|
|
|
|
};
|
|
|
|
|
export async function getAvailableSqlVMs(account: azdata.Account, subscription: Subscription, resourceGroup: azureResource.AzureResourceResourceGroup): Promise<SqlVMServer[]> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroup.name}/providers/Microsoft.SqlVirtualMachine/sqlVirtualMachines?api-version=2017-03-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroup.name}/providers/Microsoft.SqlVirtualMachine/sqlVirtualMachines?api-version=2017-03-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true);
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -167,7 +167,7 @@ export async function getBlobs(account: azdata.Account, subscription: Subscripti
|
|
|
|
|
|
|
|
|
|
export async function getSqlMigrationService(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string, sessionId: string): Promise<SqlMigrationService> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -178,7 +178,7 @@ export async function getSqlMigrationService(account: azdata.Account, subscripti
|
|
|
|
|
|
|
|
|
|
export async function getSqlMigrationServices(account: azdata.Account, subscription: Subscription, resouceGroupName: string, sessionId: string): Promise<SqlMigrationService[]> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resouceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resouceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -192,7 +192,7 @@ export async function getSqlMigrationServices(account: azdata.Account, subscript
|
|
|
|
|
|
|
|
|
|
export async function createSqlMigrationService(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string, sessionId: string): Promise<SqlMigrationService> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}?api-version=2020-09-01-preview`);
|
|
|
|
|
const requestBody = {
|
|
|
|
|
'location': regionName
|
|
|
|
|
};
|
|
|
|
|
@@ -221,7 +221,7 @@ export async function createSqlMigrationService(account: azdata.Account, subscri
|
|
|
|
|
|
|
|
|
|
export async function getSqlMigrationServiceAuthKeys(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string, sessionId: string): Promise<SqlMigrationServiceAuthenticationKeys> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}/ListAuthKeys?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}/ListAuthKeys?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.POST, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -234,7 +234,7 @@ export async function getSqlMigrationServiceAuthKeys(account: azdata.Account, su
|
|
|
|
|
|
|
|
|
|
export async function regenerateSqlMigrationServiceAuthKey(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string, keyName: string, sessionId: string): Promise<SqlMigrationServiceAuthenticationKeys> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}/regenerateAuthKeys?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}/regenerateAuthKeys?api-version=2020-09-01-preview`);
|
|
|
|
|
const requestBody = {
|
|
|
|
|
'location': regionName,
|
|
|
|
|
'keyName': keyName,
|
|
|
|
|
@@ -264,7 +264,7 @@ export async function getStorageAccountAccessKeys(account: azdata.Account, subsc
|
|
|
|
|
|
|
|
|
|
export async function getSqlMigrationServiceMonitoringData(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationService: string, sessionId: string): Promise<IntegrationRuntimeMonitoringData> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationService}/monitoringData?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationService}/monitoringData?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -274,7 +274,7 @@ export async function getSqlMigrationServiceMonitoringData(account: azdata.Accou
|
|
|
|
|
|
|
|
|
|
export async function startDatabaseMigration(account: azdata.Account, subscription: Subscription, regionName: string, targetServer: SqlManagedInstance | SqlVMServer, targetDatabaseName: string, requestBody: StartDatabaseMigrationRequest, sessionId: string): Promise<StartDatabaseMigrationResponse> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `${targetServer.id}/providers/Microsoft.DataMigration/databaseMigrations/${targetDatabaseName}?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`${targetServer.id}/providers/Microsoft.DataMigration/databaseMigrations/${targetDatabaseName}?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.PUT, requestBody, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -287,27 +287,34 @@ export async function startDatabaseMigration(account: azdata.Account, subscripti
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function getMigrationStatus(account: azdata.Account, subscription: Subscription, migration: DatabaseMigration, sessionId: string, asyncUrl: string): Promise<DatabaseMigration> {
|
|
|
|
|
export async function getMigrationStatus(account: azdata.Account, subscription: Subscription, migration: DatabaseMigration, sessionId: string): Promise<DatabaseMigration> {
|
|
|
|
|
if (!migration.id) {
|
|
|
|
|
throw new Error('NullMigrationId');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const migrationOperationId = migration.properties?.migrationOperationId;
|
|
|
|
|
if (migrationOperationId === undefined &&
|
|
|
|
|
migration.properties.provisioningState === ProvisioningState.Failed) {
|
|
|
|
|
return migration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const path = migrationOperationId === undefined
|
|
|
|
|
? encodeURI(`${migration.id}?$expand=MigrationStatusDetails&api-version=2020-09-01-preview`)
|
|
|
|
|
: encodeURI(`${migration.id}?migrationOperationId=${migrationOperationId}&$expand=MigrationStatusDetails&api-version=2020-09-01-preview`);
|
|
|
|
|
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const migrationOperationId = getMigrationOperationId(migration, asyncUrl);
|
|
|
|
|
const path = `${migration.id}?migrationOperationId=${migrationOperationId}&$expand=MigrationStatusDetails&api-version=2020-09-01-preview`;
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
}
|
|
|
|
|
return response.response.data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getMigrationOperationId(migration: DatabaseMigration, asyncUrl: string): string {
|
|
|
|
|
// migrationOperationId may be undefined when provisioning has failed
|
|
|
|
|
// fall back to the operationId from the asyncUrl in the create migration response
|
|
|
|
|
if (migration.properties.migrationOperationId) {
|
|
|
|
|
return migration.properties.migrationOperationId;
|
|
|
|
|
const migrationUpdate: DatabaseMigration = response.response.data;
|
|
|
|
|
if (migration.properties) {
|
|
|
|
|
migrationUpdate.properties.sourceDatabaseName = migration.properties.sourceDatabaseName;
|
|
|
|
|
migrationUpdate.properties.backupConfiguration = migration.properties.backupConfiguration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return asyncUrl
|
|
|
|
|
? vscode.Uri.parse(asyncUrl)?.path?.split('/').reverse()[0]
|
|
|
|
|
: '';
|
|
|
|
|
return migrationUpdate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function getMigrationAsyncOperationDetails(account: azdata.Account, subscription: Subscription, url: string, sessionId: string): Promise<AzureAsyncOperationResource> {
|
|
|
|
|
@@ -321,7 +328,7 @@ export async function getMigrationAsyncOperationDetails(account: azdata.Account,
|
|
|
|
|
|
|
|
|
|
export async function listMigrationsBySqlMigrationService(account: azdata.Account, subscription: Subscription, sqlMigrationService: SqlMigrationService, sessionId: string): Promise<DatabaseMigration[]> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `${sqlMigrationService.id}/listMigrations?$expand=MigrationStatusDetails&api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`${sqlMigrationService.id}/listMigrations?$expand=MigrationStatusDetails&api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -331,7 +338,7 @@ export async function listMigrationsBySqlMigrationService(account: azdata.Accoun
|
|
|
|
|
|
|
|
|
|
export async function startMigrationCutover(account: azdata.Account, subscription: Subscription, migrationStatus: DatabaseMigration, sessionId: string): Promise<any> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `${migrationStatus.id}/operations/${migrationStatus.properties.migrationOperationId}/cutover?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`${migrationStatus.id}/operations/${migrationStatus.properties.migrationOperationId}/cutover?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.POST, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
@@ -341,7 +348,7 @@ export async function startMigrationCutover(account: azdata.Account, subscriptio
|
|
|
|
|
|
|
|
|
|
export async function stopMigration(account: azdata.Account, subscription: Subscription, migrationStatus: DatabaseMigration, sessionId: string): Promise<void> {
|
|
|
|
|
const api = await getAzureCoreAPI();
|
|
|
|
|
const path = `${migrationStatus.id}/operations/${migrationStatus.properties.migrationOperationId}/cancel?api-version=2020-09-01-preview`;
|
|
|
|
|
const path = encodeURI(`${migrationStatus.id}/operations/${migrationStatus.properties.migrationOperationId}/cancel?api-version=2020-09-01-preview`);
|
|
|
|
|
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.POST, undefined, true, undefined, getSessionIdHeader(sessionId));
|
|
|
|
|
if (response.errors.length > 0) {
|
|
|
|
|
throw new Error(response.errors.toString());
|
|
|
|
|
|