Renaming controller to migration service and other bug fixes/ validations. (#14751)

* - Added coming soon message for learn more.
- Potential fix for learn more message

* Renaming of controller to sqlMigrationService

* Surfacing some errors
-Azure account is stale error
-Migration Service creation error.

* Adding refresh azure token validation.

* Fixing some errors pointed during PR
-Fixing property names
-Fixing count

* Fixing migration status
- Adding special error handling for resource not found error
- Deleting unfound migrations from local cache
- Using prefetched migration status for view all

Misc fixes:
- Using SQL server version name instead of number
- Fixing Icons on sku recommendation page
- Fixing table column width in cutover dialog
- Adding spinner button to refresh.

* Fixing all strings in migration service page and dialog

* fixed a string error in create service dialog
This commit is contained in:
Aasim Khan
2021-03-17 14:55:24 -07:00
committed by GitHub
parent 5917f869ef
commit c7cca7e9f0
16 changed files with 558 additions and 418 deletions

View File

@@ -86,10 +86,10 @@ export async function getBlobContainers(account: azdata.Account, subscription: S
return blobContainers!;
}
export async function getMigrationController(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, controllerName: string): Promise<SqlMigrationController> {
export async function getSqlMigrationService(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string): Promise<SqlMigrationService> {
const api = await getAzureCoreAPI();
const host = `https://${regionName}.management.azure.com`;
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/Controllers/${controllerName}?api-version=2020-09-01-preview`;
const path = `/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, host);
if (response.errors.length > 0) {
throw new Error(response.errors.toString());
@@ -97,10 +97,10 @@ export async function getMigrationController(account: azdata.Account, subscripti
return response.response.data;
}
export async function getMigrationControllers(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string): Promise<SqlMigrationController[]> {
export async function getSqlMigrationServices(account: azdata.Account, subscription: Subscription, regionName: string): Promise<SqlMigrationService[]> {
const api = await getAzureCoreAPI();
const host = `https://${regionName}.management.azure.com`;
const path = `/subscriptions/${subscription.id}/providers/Microsoft.DataMigration/Controllers?api-version=2020-09-01-preview`;
const path = `/subscriptions/${subscription.id}/providers/Microsoft.DataMigration/sqlMigrationServices?api-version=2020-09-01-preview`;
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, host);
if (response.errors.length > 0) {
throw new Error(response.errors.toString());
@@ -109,10 +109,10 @@ export async function getMigrationControllers(account: azdata.Account, subscript
return response.response.data.value;
}
export async function createMigrationController(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, controllerName: string): Promise<SqlMigrationController> {
export async function createSqlMigrationService(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string): Promise<SqlMigrationService> {
const api = await getAzureCoreAPI();
const host = `https://${regionName}.management.azure.com`;
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/Controllers/${controllerName}?api-version=2020-09-01-preview`;
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/sqlMigrationServices/${sqlMigrationServiceName}?api-version=2020-09-01-preview`;
const requestBody = {
'location': regionName
};
@@ -123,10 +123,10 @@ export async function createMigrationController(account: azdata.Account, subscri
return response.response.data;
}
export async function getMigrationControllerAuthKeys(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, controllerName: string): Promise<GetMigrationControllerAuthKeysResult> {
export async function getSqlMigrationServiceAuthKeys(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationServiceName: string): Promise<SqlMigrationServiceAuthenticationKeys> {
const api = await getAzureCoreAPI();
const host = `https://${regionName}.management.azure.com`;
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/Controllers/${controllerName}/ListAuthKeys?api-version=2020-09-01-preview`;
const path = `/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, host);
if (response.errors.length > 0) {
throw new Error(response.errors.toString());
@@ -150,10 +150,10 @@ export async function getStorageAccountAccessKeys(account: azdata.Account, subsc
};
}
export async function getMigrationControllerMonitoringData(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, controllerName: string): Promise<GetMigrationControllerMonitoringData> {
export async function getSqlMigrationServiceMonitoringData(account: azdata.Account, subscription: Subscription, resourceGroupName: string, regionName: string, sqlMigrationService: string): Promise<IntegrationRuntimeMonitoringData> {
const api = await getAzureCoreAPI();
const host = `https://${regionName}.management.azure.com`;
const path = `/subscriptions/${subscription.id}/resourceGroups/${resourceGroupName}/providers/Microsoft.DataMigration/Controllers/${controllerName}/monitoringData?api-version=2020-09-01-preview`;
const path = `/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, host);
if (response.errors.length > 0) {
throw new Error(response.errors.toString());
@@ -182,6 +182,9 @@ export async function getDatabaseMigration(account: azdata.Account, subscription
const path = `${migrationId}?api-version=2020-09-01-preview`;
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, host);
if (response.errors.length > 0) {
if (response.response.status === 404 && response.response.data.error.code === 'ResourceDoesNotExist') {
throw new Error(response.response.data.error.code);
}
throw new Error(response.errors.toString());
}
return response.response.data;
@@ -198,10 +201,10 @@ export async function getMigrationStatus(account: azdata.Account, subscription:
return response.response.data;
}
export async function listMigrationsByController(account: azdata.Account, subscription: Subscription, controller: SqlMigrationController): Promise<DatabaseMigration[]> {
export async function listMigrationsBySqlMigrationService(account: azdata.Account, subscription: Subscription, sqlMigrationService: SqlMigrationService): Promise<DatabaseMigration[]> {
const api = await getAzureCoreAPI();
const host = `https://eastus2euap.management.azure.com`;
const path = `${controller.id}/listMigrations?$expand=MigrationStatusDetails&api-version=2020-09-01-preview`;
const path = `${sqlMigrationService.id}/listMigrations?$expand=MigrationStatusDetails&api-version=2020-09-01-preview`;
const response = await api.makeAzureRestRequest(account, subscription, path, azurecore.HttpRequestMethod.GET, undefined, true, host);
if (response.errors.length > 0) {
throw new Error(response.errors.toString());
@@ -233,7 +236,7 @@ export async function stopMigration(account: azdata.Account, subscription: Subsc
/**
* For now only east us euap is supported. Actual API calls will be added in the public release.
*/
export function getMigrationControllerRegions(): azdata.CategoryValue[] {
export function getSqlMigrationServiceRegions(): azdata.CategoryValue[] {
return [
{
displayName: loc.EASTUS2EUAP,
@@ -242,7 +245,7 @@ export function getMigrationControllerRegions(): azdata.CategoryValue[] {
];
}
type SortableAzureResources = AzureProduct | azureResource.FileShare | azureResource.BlobContainer | azureResource.AzureResourceSubscription | SqlMigrationController;
type SortableAzureResources = AzureProduct | azureResource.FileShare | azureResource.BlobContainer | azureResource.AzureResourceSubscription | SqlMigrationService;
function sortResourceArrayByName(resourceArray: SortableAzureResources[]): void {
if (!resourceArray) {
return;
@@ -258,7 +261,7 @@ function sortResourceArrayByName(resourceArray: SortableAzureResources[]): void
});
}
export interface MigrationControllerProperties {
export interface SqlMigrationServiceProperties {
name: string;
subscriptionId: string;
resourceGroup: string;
@@ -268,8 +271,8 @@ export interface MigrationControllerProperties {
isProvisioned?: boolean;
}
export interface SqlMigrationController {
properties: MigrationControllerProperties;
export interface SqlMigrationService {
properties: SqlMigrationServiceProperties;
location: string;
id: string;
name: string;
@@ -279,7 +282,7 @@ export interface SqlMigrationController {
}
}
export interface GetMigrationControllerAuthKeysResult {
export interface SqlMigrationServiceAuthenticationKeys {
authKey1: string,
authKey2: string
}
@@ -289,12 +292,12 @@ export interface GetStorageAccountAccessKeysResult {
keyName2: string
}
export interface GetMigrationControllerMonitoringData {
export interface IntegrationRuntimeMonitoringData {
name: string,
nodes: MigrationControllerNode[];
nodes: IntegrationRuntimeNode[];
}
export interface MigrationControllerNode {
export interface IntegrationRuntimeNode {
availableMemoryInMB: number,
concurrentJobsLimit: number
concurrentJobsRunning: number,
@@ -307,27 +310,32 @@ export interface MigrationControllerNode {
export interface StartDatabaseMigrationRequest {
location: string,
properties: {
SourceDatabaseName: string,
MigrationController: string,
BackupConfiguration: {
TargetLocation: {
StorageAccountResourceId: string,
AccountKey: string,
sourceDatabaseName: string,
migrationService: string,
backupConfiguration: {
targetLocation: {
storageAccountResourceId: string,
accountKey: string,
}
SourceLocation: {
FileShare: {
Path: string,
Username: string,
Password: string,
sourceLocation: {
fileShare?: {
path: string,
username: string,
password: string,
},
azureBlob?: {
storageAccountResourceId: string,
accountKey: string,
blobContainerName: string
}
},
},
SourceSqlConnection: {
DataSource: string,
Username: string,
Password: string
sourceSqlConnection: {
dataSource: string,
username: string,
password: string
},
Scope: string
scope: string
}
}
@@ -347,10 +355,12 @@ export interface DatabaseMigrationProperties {
provisioningState: string;
migrationStatus: string;
migrationStatusDetails?: MigrationStatusDetails;
startedOn: string;
endedOn: string;
sourceSqlConnection: SqlConnectionInfo;
sourceDatabaseName: string;
targetDatabaseCollation: string;
migrationController: string;
migrationService: string;
migrationOperationId: string;
backupConfiguration: BackupConfiguration;
autoCutoverConfiguration: AutoCutoverConfiguration;

View File

@@ -21,3 +21,22 @@ export function deepClone<T>(obj: T): T {
});
return result;
}
export function getSqlServerName(majorVersion: number): string | undefined {
switch (majorVersion) {
case 10:
return 'SQL Server 2008';
case 11:
return 'SQL Server 2012';
case 12:
return 'SQL Server 2014';
case 13:
return 'SQL Server 2016';
case 14:
return 'SQL Server 2017';
case 15:
return 'SQL Server 2019';
default:
return undefined;
}
}