diff --git a/extensions/sql-migration/src/wizard/accountsSelectionPage.ts b/extensions/sql-migration/src/wizard/accountsSelectionPage.ts index 95266caf8b..6a1ab9fa3c 100644 --- a/extensions/sql-migration/src/wizard/accountsSelectionPage.ts +++ b/extensions/sql-migration/src/wizard/accountsSelectionPage.ts @@ -121,9 +121,11 @@ export class AccountsSelectionPage extends MigrationWizardPage { } } - this.migrationStateModel._subscriptions = undefined!; - this.migrationStateModel._targetSubscription = undefined!; - this.migrationStateModel._databaseBackup.subscription = undefined!; + if (!(this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.Summary)) { + this.migrationStateModel._subscriptions = undefined!; + this.migrationStateModel._targetSubscription = undefined!; + this.migrationStateModel._databaseBackup.subscription = undefined!; + } await this._azureAccountsDropdown.validate(); } })); diff --git a/extensions/sql-migration/src/wizard/databaseBackupPage.ts b/extensions/sql-migration/src/wizard/databaseBackupPage.ts index 258b9fcc08..b6d8d7702c 100644 --- a/extensions/sql-migration/src/wizard/databaseBackupPage.ts +++ b/extensions/sql-migration/src/wizard/databaseBackupPage.ts @@ -6,9 +6,9 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { EOL } from 'os'; -import { getStorageAccountAccessKeys, SqlManagedInstance, SqlVMServer } from '../api/azure'; +import { getStorageAccountAccessKeys, SqlManagedInstance, SqlVMServer, Subscription } from '../api/azure'; import { MigrationWizardPage } from '../models/migrationWizardPage'; -import { Blob, MigrationMode, MigrationSourceAuthenticationType, MigrationStateModel, MigrationTargetType, NetworkContainerType, Page, StateChangeEvent } from '../models/stateMachine'; +import { Blob, MigrationMode, MigrationSourceAuthenticationType, MigrationStateModel, MigrationTargetType, NetworkContainerType, NetworkShare, Page, StateChangeEvent } from '../models/stateMachine'; import * as constants from '../constants/strings'; import { IconPathHelper } from '../constants/iconPathHelper'; import { WIZARD_INPUT_COMPONENT_WIDTH } from './wizardController'; @@ -283,7 +283,7 @@ export class DatabaseBackupPage extends MigrationWizardPage { } return true; }).component(); - if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.MigrationMode)) { + if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup)) { this._networkSharePath.value = this.migrationStateModel.savedInfo.networkShare?.networkShareLocation; } this._disposables.push(this._networkSharePath.onTextChanged(async (value) => { @@ -755,6 +755,13 @@ export class DatabaseBackupPage extends MigrationWizardPage { } public async onPageEnter(pageChangeInfo: azdata.window.WizardPageChangeInfo): Promise { + if (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup) { + this.migrationStateModel._databaseBackup.networkContainerType = this.migrationStateModel.savedInfo.networkContainerType; + this.migrationStateModel._databaseBackup.networkShare = this.migrationStateModel.savedInfo.networkShare; + this.migrationStateModel._databaseBackup.subscription = this.migrationStateModel.savedInfo.targetSubscription; + this.migrationStateModel._databaseBackup.blobs = this.migrationStateModel.savedInfo.blobs; + this.migrationStateModel._targetDatabaseNames = this.migrationStateModel.savedInfo.targetDatabaseNames; + } if (this.migrationStateModel.refreshDatabaseBackupPage) { try { if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup)) { @@ -767,7 +774,7 @@ export class DatabaseBackupPage extends MigrationWizardPage { column.width = isOfflineMigration ? WIZARD_TABLE_COLUMN_WIDTH_SMALL : WIZARD_TABLE_COLUMN_WIDTH; }); - if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.MigrationMode)) { + if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup)) { if (this.migrationStateModel.savedInfo.networkContainerType === NetworkContainerType.NETWORK_SHARE) { this._networkShareButton.checked = true; } else { @@ -775,13 +782,9 @@ export class DatabaseBackupPage extends MigrationWizardPage { this._networkTableContainer.display = 'none'; await this._networkShareContainer.updateCssStyles({ 'display': 'none' }); } - } else { - this._networkShareButton.checked = false; - this._networkTableContainer.display = 'none'; - await this._networkShareContainer.updateCssStyles({ 'display': 'none' }); } - if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.MigrationMode)) { + if (this.migrationStateModel.retryMigration || (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup)) { if (this.migrationStateModel.savedInfo.networkContainerType === NetworkContainerType.BLOB_CONTAINER) { this._blobContainerButton.checked = true; } else { @@ -789,14 +792,12 @@ export class DatabaseBackupPage extends MigrationWizardPage { this._blobTableContainer.display = 'none'; await this._blobContainer.updateCssStyles({ 'display': 'none' }); } - } else { - this._blobContainerButton.checked = false; - this._blobTableContainer.display = 'none'; - await this._blobContainer.updateCssStyles({ 'display': 'none' }); } - await this._targetDatabaseContainer.updateCssStyles({ 'display': 'none' }); - await this._networkShareStorageAccountDetails.updateCssStyles({ 'display': 'none' }); + if (!(this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.DatabaseBackup)) { + await this._targetDatabaseContainer.updateCssStyles({ 'display': 'none' }); + await this._networkShareStorageAccountDetails.updateCssStyles({ 'display': 'none' }); + } const connectionProfile = await this.migrationStateModel.getSourceConnectionProfile(); const queryProvider = azdata.dataprotocol.getProvider((await this.migrationStateModel.getSourceConnectionProfile()).providerId, azdata.DataProviderType.QueryProvider); const query = 'select SUSER_NAME()'; diff --git a/extensions/sql-migration/src/wizard/migrationModePage.ts b/extensions/sql-migration/src/wizard/migrationModePage.ts index fca2167ea8..e87b8a77b5 100644 --- a/extensions/sql-migration/src/wizard/migrationModePage.ts +++ b/extensions/sql-migration/src/wizard/migrationModePage.ts @@ -59,7 +59,7 @@ export class MigrationModePage extends MigrationWizardPage { }); } public async onPageLeave(pageChangeInfo: azdata.window.WizardPageChangeInfo): Promise { - if (this.originalMigrationMode !== this.migrationStateModel._databaseBackup.migrationMode) { + if (this.originalMigrationMode !== this.migrationStateModel._databaseBackup.migrationMode || this.migrationStateModel.resumeAssessment) { this.migrationStateModel.refreshDatabaseBackupPage = true; } diff --git a/extensions/sql-migration/src/wizard/skuRecommendationPage.ts b/extensions/sql-migration/src/wizard/skuRecommendationPage.ts index 56669964bd..3859fc0c16 100644 --- a/extensions/sql-migration/src/wizard/skuRecommendationPage.ts +++ b/extensions/sql-migration/src/wizard/skuRecommendationPage.ts @@ -625,7 +625,7 @@ export class SKURecommendationPage extends MigrationWizardPage { if (this.hasSavedInfo()) { this.migrationStateModel._azureAccount = this.migrationStateModel.savedInfo.azureAccount; } - if (!this.migrationStateModel._targetSubscription) { + if (!this.migrationStateModel._targetSubscription || this.migrationStateModel.resumeAssessment) { this._managedInstanceSubscriptionDropdown.loading = true; this._resourceDropdown.loading = true; try { diff --git a/extensions/sql-migration/src/wizard/summaryPage.ts b/extensions/sql-migration/src/wizard/summaryPage.ts index 9adbe93f91..8bade3632c 100644 --- a/extensions/sql-migration/src/wizard/summaryPage.ts +++ b/extensions/sql-migration/src/wizard/summaryPage.ts @@ -6,12 +6,14 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { MigrationWizardPage } from '../models/migrationWizardPage'; -import { MigrationMode, MigrationStateModel, MigrationTargetType, NetworkContainerType, StateChangeEvent } from '../models/stateMachine'; +import { MigrationMode, MigrationStateModel, MigrationTargetType, NetworkContainerType, NetworkShare, Page, StateChangeEvent } from '../models/stateMachine'; import * as constants from '../constants/strings'; import { createHeadingTextComponent, createInformationRow, createLabelTextComponent } from './wizardController'; -import { getResourceGroupFromId } from '../api/azure'; +import { getResourceGroupFromId, Subscription } from '../api/azure'; import { TargetDatabaseSummaryDialog } from '../dialog/targetDatabaseSummary/targetDatabaseSummaryDialog'; import * as styles from '../constants/styles'; +import { azureResource } from 'azureResource'; +import { Tenant } from 'azurecore'; export class SummaryPage extends MigrationWizardPage { private _view!: azdata.ModelView; @@ -45,6 +47,26 @@ export class SummaryPage extends MigrationWizardPage { } public async onPageEnter(pageChangeInfo: azdata.window.WizardPageChangeInfo): Promise { + if (this.migrationStateModel.resumeAssessment && this.migrationStateModel.savedInfo.closedPage >= Page.Summary) { + this.migrationStateModel._databaseBackup.networkContainerType = this.migrationStateModel.savedInfo.networkContainerType; + this.migrationStateModel._databaseBackup.networkShare = this.migrationStateModel.savedInfo.networkShare; + this.migrationStateModel._databaseBackup.subscription = this.migrationStateModel.savedInfo.targetSubscription; + this.migrationStateModel._databaseBackup.blobs = this.migrationStateModel.savedInfo.blobs; + this.migrationStateModel._targetDatabaseNames = this.migrationStateModel.savedInfo.targetDatabaseNames; + + this.migrationStateModel._targetType = this.migrationStateModel.savedInfo.migrationTargetType; + this.migrationStateModel._databaseAssessment = this.migrationStateModel.savedInfo.databaseAssessment; + this.migrationStateModel._migrationDbs = this.migrationStateModel.savedInfo.databaseList; + this.migrationStateModel._targetSubscription = this.migrationStateModel.savedInfo.subscription; + this.migrationStateModel._location = this.migrationStateModel.savedInfo.location; + this.migrationStateModel._resourceGroup = this.migrationStateModel.savedInfo.resourceGroup; + this.migrationStateModel._targetServerInstance = this.migrationStateModel.savedInfo.targetServerInstance; + + this.migrationStateModel.databaseSelectorTableValues = this.migrationStateModel.savedInfo.selectedDatabases; + + this.migrationStateModel._azureAccount = this.migrationStateModel.savedInfo.azureAccount; + this.migrationStateModel._azureTenant = this.migrationStateModel.savedInfo.azureTenant; + } const targetDatabaseSummary = new TargetDatabaseSummaryDialog(this.migrationStateModel); const targetDatabaseHyperlink = this._view.modelBuilder.hyperlink().withProps({ url: '', diff --git a/extensions/sql-migration/src/wizard/wizardController.ts b/extensions/sql-migration/src/wizard/wizardController.ts index bb9646c4da..86ac0655a2 100644 --- a/extensions/sql-migration/src/wizard/wizardController.ts +++ b/extensions/sql-migration/src/wizard/wizardController.ts @@ -5,7 +5,7 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import * as mssql from '../../../mssql'; -import { MigrationStateModel, Page } from '../models/stateMachine'; +import { MigrationStateModel, NetworkContainerType, Page } from '../models/stateMachine'; import * as loc from '../constants/strings'; import { MigrationWizardPage } from '../models/migrationWizardPage'; import { SKURecommendationPage } from './skuRecommendationPage'; @@ -68,8 +68,13 @@ export class WizardController { if (this._model.savedInfo.closedPage >= Page.MigrationMode) { this._model.refreshDatabaseBackupPage = true; } - wizardSetupPromises.push(this._wizardObject.setCurrentPage(this._model.savedInfo.closedPage)); - //TODO: switch statement here initializing important values? + // if the user selected network share and selected save & close afterwards, it should always return to the database backup page so that + // the user can input their password again + if (this._model.savedInfo.closedPage >= Page.DatabaseBackup && this._model.savedInfo.networkContainerType === NetworkContainerType.NETWORK_SHARE) { + wizardSetupPromises.push(this._wizardObject.setCurrentPage(Page.DatabaseBackup)); + } else { + wizardSetupPromises.push(this._wizardObject.setCurrentPage(this._model.savedInfo.closedPage)); + } } this._model.extensionContext.subscriptions.push(this._wizardObject.onPageChanged(async (pageChangeInfo: azdata.window.WizardPageChangeInfo) => {