mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-07 17:23:56 -05:00
deploy BDC wizard improvement for CU1 (#7756)
* unified admin user account (#7485) * azdata changes * spaces * error message * comments * support AD authentication for bdc deployment (#7518) * enable ad authentication * remove export for internal interface * add comments * more changes after testing * update notebooks * escape slash * more comments * Update deploy-bdc-aks.ipynb * Update deploy-bdc-existing-aks.ipynb * Update deploy-bdc-existing-kubeadm.ipynb * AD changes and review feedback (#7618) * enable ad authentication * remove export for internal interface * add comments * more changes after testing * update notebooks * escape slash * more comments * Update deploy-bdc-aks.ipynb * Update deploy-bdc-existing-aks.ipynb * Update deploy-bdc-existing-kubeadm.ipynb * address comments from scenario review (#7546) * support AD authentication for bdc deployment (#7518) * enable ad authentication * remove export for internal interface * add comments * more changes after testing * update notebooks * escape slash * more comments * Update deploy-bdc-aks.ipynb * Update deploy-bdc-existing-aks.ipynb * Update deploy-bdc-existing-kubeadm.ipynb * scenario review feedbacks * more fixes * adjust the display order of resource types * different way to implement left side buttons * revert unwanted changes * rename variable * more fixes for the scenario review feedback (#7589) * fix more issues * add help links * model view readonly text with links * fix size string * address comments * update notebooks * text update * address the feedback of 2nd round of deploy BDC wizard review (#7646) * 2nd review meeting comments * fix the unit test failure * recent changes in azdata * notebook background execution with azdata (#7741) * notebook background execution with azdata * prompt to open notebook in case of failure * fix path quote issue * better temp file handling * expose docker settings (#7751) * add docker settings * new icon for container image
This commit is contained in:
@@ -15,14 +15,20 @@ import { ClusterSettingsPage } from './pages/clusterSettingsPage';
|
||||
import { ServiceSettingsPage } from './pages/serviceSettingsPage';
|
||||
import { TargetClusterContextPage } from './pages/targetClusterPage';
|
||||
import { IKubeService } from '../../services/kubeService';
|
||||
import { IAzdataService } from '../../services/azdataService';
|
||||
import { IAzdataService, BdcEndpoint } from '../../services/azdataService';
|
||||
import { DeploymentProfilePage } from './pages/deploymentProfilePage';
|
||||
import { INotebookService } from '../../services/notebookService';
|
||||
import { DeployClusterWizardModel } from './deployClusterWizardModel';
|
||||
import { getErrorMessage, getDateTimeString } from '../../utils';
|
||||
import { DeployClusterWizardModel, AuthenticationMode } from './deployClusterWizardModel';
|
||||
import * as VariableNames from './constants';
|
||||
import * as os from 'os';
|
||||
import { join } from 'path';
|
||||
import * as fs from 'fs';
|
||||
const localize = nls.loadMessageBundle();
|
||||
|
||||
export class DeployClusterWizard extends WizardBase<DeployClusterWizard, DeployClusterWizardModel> {
|
||||
private _saveConfigButton: azdata.window.Button;
|
||||
private _scriptToNotebookButton: azdata.window.Button;
|
||||
|
||||
public get kubeService(): IKubeService {
|
||||
return this._kubeService;
|
||||
@@ -36,8 +42,24 @@ export class DeployClusterWizard extends WizardBase<DeployClusterWizard, DeployC
|
||||
return this._notebookService;
|
||||
}
|
||||
|
||||
public get saveConfigButton(): azdata.window.Button {
|
||||
return this._saveConfigButton;
|
||||
}
|
||||
|
||||
public get scriptToNotebookButton(): azdata.window.Button {
|
||||
return this._scriptToNotebookButton;
|
||||
}
|
||||
|
||||
constructor(private wizardInfo: WizardInfo, private _kubeService: IKubeService, private _azdataService: IAzdataService, private _notebookService: INotebookService) {
|
||||
super(DeployClusterWizard.getTitle(wizardInfo.type), new DeployClusterWizardModel(wizardInfo.type));
|
||||
this._saveConfigButton = azdata.window.createButton(localize('deployCluster.SaveConfigFiles', "Save config files"), 'left');
|
||||
this._saveConfigButton.hidden = true;
|
||||
this._scriptToNotebookButton = azdata.window.createButton(localize('deployCluster.ScriptToNotebook', 'Script to Notebook'), 'left');
|
||||
this._scriptToNotebookButton.hidden = true;
|
||||
this.addButton(this._saveConfigButton);
|
||||
this.addButton(this._scriptToNotebookButton);
|
||||
this.registerDisposable(this._saveConfigButton.onClick(() => this.saveConfigFiles()));
|
||||
this.registerDisposable(this._scriptToNotebookButton.onClick(() => this.scriptToNotebook()));
|
||||
}
|
||||
|
||||
public get deploymentType(): BdcDeploymentType {
|
||||
@@ -47,23 +69,79 @@ export class DeployClusterWizard extends WizardBase<DeployClusterWizard, DeployC
|
||||
protected initialize(): void {
|
||||
this.setPages(this.getPages());
|
||||
this.wizardObject.generateScriptButton.hidden = true;
|
||||
this.wizardObject.doneButton.label = localize('deployCluster.ScriptToNotebook', 'Script to Notebook');
|
||||
this.wizardObject.doneButton.label = localize('deployCluster.Deploy', "Deploy");
|
||||
}
|
||||
|
||||
protected onCancel(): void {
|
||||
}
|
||||
|
||||
protected onOk(): void {
|
||||
process.env[VariableNames.AdminPassword_VariableName] = this.model.getStringValue(VariableNames.AdminPassword_VariableName);
|
||||
this.notebookService.launchNotebook(this.wizardInfo.notebook).then((notebook: azdata.nb.NotebookEditor) => {
|
||||
notebook.edit((editBuilder: azdata.nb.NotebookEditorEdit) => {
|
||||
editBuilder.insertCell({
|
||||
const taskName = localize('resourceDeployment.DeployBDCTask', "Deploy SQL Server Big Data Cluster \"{0}\"", this.model.getStringValue(VariableNames.ClusterName_VariableName));
|
||||
azdata.tasks.startBackgroundOperation({
|
||||
displayName: taskName,
|
||||
description: taskName,
|
||||
isCancelable: false,
|
||||
operation: async op => {
|
||||
op.updateStatus(azdata.TaskStatus.InProgress);
|
||||
const env: NodeJS.ProcessEnv = {};
|
||||
this.setEnvironmentVariables(env);
|
||||
const notebook = await this.notebookService.getNotebook(this.wizardInfo.azdata_notebook);
|
||||
notebook.cells.splice(3, 0, {
|
||||
cell_type: 'code',
|
||||
source: this.model.getCodeCellContentForNotebook()
|
||||
}, 7);
|
||||
});
|
||||
}, (error) => {
|
||||
vscode.window.showErrorMessage(error);
|
||||
source: this.model.getCodeCellContentForNotebook(),
|
||||
metadata: {},
|
||||
execution_count: 0,
|
||||
outputs: []
|
||||
});
|
||||
const result = await this.notebookService.executeNotebook(notebook, env);
|
||||
if (result.succeeded) {
|
||||
op.updateStatus(azdata.TaskStatus.Succeeded);
|
||||
const connectToMasterSql = localize('resourceDeployment.ConnectToMasterSQLServer', "Connect to Master SQL Server");
|
||||
const selectedOption = await vscode.window.showInformationMessage(localize('resourceDeployment.DeploymentSucceeded', "Successfully deployed SQL Server Big Data Cluster: {0}",
|
||||
this.model.getStringValue(VariableNames.ClusterName_VariableName)),
|
||||
connectToMasterSql);
|
||||
if (selectedOption === connectToMasterSql) {
|
||||
let endpoints: BdcEndpoint[];
|
||||
try {
|
||||
endpoints = await this.azdataService.getEndpoints(this.model.getStringValue(VariableNames.ClusterName_VariableName)!,
|
||||
this.model.getStringValue(VariableNames.AdminUserName_VariableName)!,
|
||||
this.model.getStringValue(VariableNames.AdminPassword_VariableName)!);
|
||||
} catch (error) {
|
||||
vscode.window.showErrorMessage(localize('resourceDeployment.ErroRetrievingEndpoints', "Failed to retrieve the endpoint list. {0}{1}", os.EOL, getErrorMessage(error)));
|
||||
return;
|
||||
}
|
||||
const sqlEndpoint = endpoints.find(endpoint => endpoint.name === 'sql-server-master');
|
||||
if (sqlEndpoint) {
|
||||
vscode.commands.executeCommand('azdata.connect', {
|
||||
serverName: sqlEndpoint.endpoint,
|
||||
providerName: 'MSSQL',
|
||||
authenticationType: 'SqlLogin',
|
||||
userName: this.model.getStringValue(VariableNames.AdminUserName_VariableName)!,
|
||||
password: this.model.getStringValue(VariableNames.AdminPassword_VariableName)!
|
||||
});
|
||||
} else {
|
||||
vscode.window.showErrorMessage(localize('resourceDeployment.NoSQLEndpointFound', "Master SQL Server endpoint is not found."));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
op.updateStatus(azdata.TaskStatus.Failed, result.errorMessage);
|
||||
if (result.outputNotebook) {
|
||||
const viewErrorDetail = localize('resourceDeployment.ViewErrorDetail', "View error detail");
|
||||
const selectedOption = await vscode.window.showErrorMessage(localize('resourceDeployment.DeployFailed', "Failed to deploy SQL Server Big Data Cluster \"{0}\".",
|
||||
this.model.getStringValue(VariableNames.ClusterName_VariableName)),
|
||||
viewErrorDetail);
|
||||
if (selectedOption === viewErrorDetail) {
|
||||
try {
|
||||
this.notebookService.launchNotebookWithContent(`deploy-${getDateTimeString()}`, result.outputNotebook);
|
||||
} catch (error) {
|
||||
vscode.window.showErrorMessage(localize('resourceDeployment.FailedToOpenNotebook', "An error occured launching the output notebook. {1}{2}.", os.EOL, getErrorMessage(error)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
vscode.window.showErrorMessage(localize('resourceDeployment.DeployFailedNoOutputNotebook', "Failed to deploy SQL Server Big Data Cluster and no output notebook was generated."));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -100,6 +178,58 @@ export class DeployClusterWizard extends WizardBase<DeployClusterWizard, DeployC
|
||||
return pages;
|
||||
}
|
||||
|
||||
private async saveConfigFiles(): Promise<void> {
|
||||
const options: vscode.OpenDialogOptions = {
|
||||
defaultUri: vscode.Uri.file(os.homedir()),
|
||||
canSelectFiles: false,
|
||||
canSelectFolders: true,
|
||||
canSelectMany: false,
|
||||
openLabel: localize('deployCluster.SelectConfigFileFolder', "Save config files")
|
||||
};
|
||||
const pathArray = await vscode.window.showOpenDialog(options);
|
||||
if (pathArray && pathArray[0]) {
|
||||
const targetFolder = pathArray[0].fsPath;
|
||||
try {
|
||||
const profile = this.model.createTargetProfile();
|
||||
await fs.promises.writeFile(join(targetFolder, 'bdc.json'), profile.getBdcJson());
|
||||
await fs.promises.writeFile(join(targetFolder, 'control.json'), profile.getControlJson());
|
||||
this.wizardObject.message = {
|
||||
text: localize('deployCluster.SaveConfigFileSucceeded', "Config files saved to {0}", targetFolder),
|
||||
level: azdata.window.MessageLevel.Information
|
||||
};
|
||||
}
|
||||
catch (error) {
|
||||
this.wizardObject.message = {
|
||||
text: error.message,
|
||||
level: azdata.window.MessageLevel.Error
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private scriptToNotebook(): void {
|
||||
this.setEnvironmentVariables(process.env);
|
||||
this.notebookService.launchNotebook(this.wizardInfo.notebook).then((notebook: azdata.nb.NotebookEditor) => {
|
||||
notebook.edit((editBuilder: azdata.nb.NotebookEditorEdit) => {
|
||||
// 5 is the position after the 'Set variables' cell in the deployment notebooks
|
||||
editBuilder.insertCell({
|
||||
cell_type: 'code',
|
||||
source: this.model.getCodeCellContentForNotebook()
|
||||
}, 5);
|
||||
});
|
||||
}, (error) => {
|
||||
vscode.window.showErrorMessage(error);
|
||||
});
|
||||
}
|
||||
|
||||
private setEnvironmentVariables(env: NodeJS.ProcessEnv): void {
|
||||
env[VariableNames.AdminPassword_VariableName] = this.model.getStringValue(VariableNames.AdminPassword_VariableName);
|
||||
env[VariableNames.DockerPassword_VariableName] = this.model.getStringValue(VariableNames.DockerPassword_VariableName);
|
||||
if (this.model.authenticationMode === AuthenticationMode.ActiveDirectory) {
|
||||
env[VariableNames.DomainServiceAccountPassword_VariableName] = this.model.getStringValue(VariableNames.DomainServiceAccountPassword_VariableName);
|
||||
}
|
||||
}
|
||||
|
||||
static getTitle(type: BdcDeploymentType): string {
|
||||
switch (type) {
|
||||
case BdcDeploymentType.NewAKS:
|
||||
|
||||
Reference in New Issue
Block a user