diff --git a/extensions/sql-migration/src/api/azure.ts b/extensions/sql-migration/src/api/azure.ts index e747cc66cf..ed5a5c6037 100644 --- a/extensions/sql-migration/src/api/azure.ts +++ b/extensions/sql-migration/src/api/azure.ts @@ -438,10 +438,7 @@ export interface StartDatabaseMigrationRequest { password: string }, scope: string, - autoCutoverConfiguration?: { - autoCutover?: boolean, - lastBackupName?: string - }, + autoCutoverConfiguration: AutoCutoverConfiguration, } } @@ -507,7 +504,7 @@ export interface BackupConfiguration { export interface AutoCutoverConfiguration { autoCutover: boolean; - lastBackupName: string; + lastBackupName?: string; } export interface ErrorInfo { diff --git a/extensions/sql-migration/src/dialog/migrationCutover/migrationCutoverDialog.ts b/extensions/sql-migration/src/dialog/migrationCutover/migrationCutoverDialog.ts index d4b97b7492..2d40c2de93 100644 --- a/extensions/sql-migration/src/dialog/migrationCutover/migrationCutoverDialog.ts +++ b/extensions/sql-migration/src/dialog/migrationCutover/migrationCutoverDialog.ts @@ -12,7 +12,6 @@ import * as loc from '../../constants/strings'; import { convertByteSizeToReadableUnit, convertIsoTimeToLocalTime, getSqlServerName, getMigrationStatusImage, SupportedAutoRefreshIntervals, clearDialogMessage } from '../../api/utils'; import { EOL } from 'os'; import { ConfirmCutoverDialog } from './confirmCutoverDialog'; -import { MigrationMode } from '../../models/stateMachine'; const refreshFrequency: SupportedAutoRefreshIntervals = 30000; const statusImageSize: number = 14; @@ -278,7 +277,7 @@ export class MigrationCutoverDialog { enabled: false, CSSStyles: { 'font-size': '13px', - 'display': 'none' + 'display': this._isOnlineMigration() ? 'inline' : 'none' } }).component(); @@ -527,7 +526,7 @@ export class MigrationCutoverDialog { try { clearDialogMessage(this._dialogObject); - if (this._isProvisioned() && this._isOnlineMigration()) { + if (this._isOnlineMigration()) { this._cutoverButton.updateCssStyles({ 'display': 'inline' }); @@ -783,11 +782,7 @@ export class MigrationCutoverDialog { } private _isOnlineMigration(): boolean { - let migrationMode = null; - if (this._isProvisioned()) { - migrationMode = this._model._migration.migrationContext.properties.autoCutoverConfiguration?.autoCutover?.valueOf() ? MigrationMode.OFFLINE : MigrationMode.ONLINE; - } - return migrationMode === MigrationMode.ONLINE; + return this._model._migration.migrationContext.properties.autoCutoverConfiguration?.autoCutover?.valueOf() ? false : true; } private _shouldDisplayBackupFileTable(): boolean { diff --git a/extensions/sql-migration/src/dialog/migrationStatus/migrationStatusDialog.ts b/extensions/sql-migration/src/dialog/migrationStatus/migrationStatusDialog.ts index 4dc820db7b..557f796bdc 100644 --- a/extensions/sql-migration/src/dialog/migrationStatus/migrationStatusDialog.ts +++ b/extensions/sql-migration/src/dialog/migrationStatus/migrationStatusDialog.ts @@ -6,7 +6,7 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { IconPathHelper } from '../../constants/iconPathHelper'; -import { MigrationContext, MigrationLocalStorage, MigrationStatus, ProvisioningState } from '../../models/migrationLocalStorage'; +import { MigrationContext, MigrationLocalStorage, MigrationStatus } from '../../models/migrationLocalStorage'; import { MigrationCutoverDialog } from '../migrationCutover/migrationCutoverDialog'; import { AdsMigrationStatus, MigrationStatusDialogModel } from './migrationStatusDialogModel'; import * as loc from '../../constants/strings'; @@ -408,9 +408,6 @@ export class MigrationStatusDialog { } private _getMigrationMode(migration: MigrationContext): string { - if (migration.migrationContext.properties.provisioningState === ProvisioningState.Creating) { - return '---'; - } return migration.migrationContext.properties.autoCutoverConfiguration?.autoCutover?.valueOf() ? loc.OFFLINE : loc.ONLINE; } diff --git a/extensions/sql-migration/src/models/migrationLocalStorage.ts b/extensions/sql-migration/src/models/migrationLocalStorage.ts index 32ba8c26fb..10589c262f 100644 --- a/extensions/sql-migration/src/models/migrationLocalStorage.ts +++ b/extensions/sql-migration/src/models/migrationLocalStorage.ts @@ -27,6 +27,7 @@ export class MigrationLocalStorage { if (migration.sourceConnectionProfile.serverName === connectionProfile.serverName) { if (refreshStatus) { try { + const autoCutoverConfiguration = migration.migrationContext.properties.autoCutoverConfiguration; const backupConfiguration = migration.migrationContext.properties.backupConfiguration; const sourceDatabase = migration.migrationContext.properties.sourceDatabaseName; @@ -50,6 +51,7 @@ export class MigrationLocalStorage { migration.migrationContext.properties.sourceDatabaseName = sourceDatabase; migration.migrationContext.properties.backupConfiguration = backupConfiguration; + migration.migrationContext.properties.autoCutoverConfiguration = autoCutoverConfiguration; } } catch (e) { diff --git a/extensions/sql-migration/src/models/stateMachine.ts b/extensions/sql-migration/src/models/stateMachine.ts index ca1b9df1fd..ad27d32c7b 100644 --- a/extensions/sql-migration/src/models/stateMachine.ts +++ b/extensions/sql-migration/src/models/stateMachine.ts @@ -846,6 +846,8 @@ export class MigrationStateModel implements Model, vscode.Disposable { } }); + const isOfflineMigration = this._databaseBackup.migrationMode === MigrationMode.OFFLINE; + const requestBody: StartDatabaseMigrationRequest = { location: this._sqlMigrationService?.location!, properties: { @@ -859,7 +861,9 @@ export class MigrationStateModel implements Model, vscode.Disposable { password: this._sqlServerPassword }, scope: this._targetServerInstance.id, - autoCutoverConfiguration: {} + autoCutoverConfiguration: { + autoCutover: isOfflineMigration + } } }; @@ -878,9 +882,9 @@ export class MigrationStateModel implements Model, vscode.Disposable { } }; - if (this._databaseBackup.migrationMode === MigrationMode.OFFLINE) { + if (isOfflineMigration) { requestBody.properties.autoCutoverConfiguration = { - autoCutover: (this._databaseBackup.migrationMode === MigrationMode.OFFLINE ? true : false), + autoCutover: isOfflineMigration, lastBackupName: this._databaseBackup.blobs[i]?.lastBackupFile }; } @@ -899,12 +903,6 @@ export class MigrationStateModel implements Model, vscode.Disposable { } } }; - - if (this._databaseBackup.migrationMode === MigrationMode.OFFLINE) { - requestBody.properties.autoCutoverConfiguration = { - autoCutover: (this._databaseBackup.migrationMode === MigrationMode.OFFLINE ? true : false) - }; - } break; } requestBody.properties.sourceDatabaseName = this._migrationDbs[i]; @@ -919,15 +917,16 @@ export class MigrationStateModel implements Model, vscode.Disposable { ); response.databaseMigration.properties.sourceDatabaseName = this._migrationDbs[i]; response.databaseMigration.properties.backupConfiguration = requestBody.properties.backupConfiguration!; - if (response.status === 201 || response.status === 200) { + response.databaseMigration.properties.autoCutoverConfiguration = requestBody.properties.autoCutoverConfiguration!; + if (response.status === 201 || response.status === 200) { sendSqlMigrationActionEvent( TelemetryViews.MigrationWizardSummaryPage, TelemetryAction.StartMigration, { 'hashedServerName': hashString(this._assessmentApiResponse.assessmentResult.name), 'hashedDatabaseName': hashString(this._migrationDbs[i]), - 'migrationMode': requestBody.properties.autoCutoverConfiguration ? 'online' : 'offline', + 'migrationMode': isOfflineMigration ? 'offline' : 'online', 'sessionId': this._sessionId, 'migrationStartTime': new Date().toString(), 'targetDatabaseName': this._targetDatabaseNames[i],