mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-13 17:22:15 -05:00
Remove sql edge container option from sql projects publish (#24499)
* remove sql edge container option from sql projects publish * undo testing change * remove base image dropdown from publish dialog
This commit is contained in:
@@ -190,12 +190,10 @@ export const SqlServerName = 'SQL server';
|
||||
export const AzureSqlServerName = 'Azure SQL server';
|
||||
export const SqlServerDockerImageName = 'Microsoft SQL Server';
|
||||
export const SqlServerDocker2022ImageName = 'Microsoft SQL Server 2022';
|
||||
export const AzureSqlDbFullDockerImageName = 'Azure SQL Database emulator Full';
|
||||
export const AzureSqlDbLiteDockerImageName = 'Azure SQL Database emulator Lite';
|
||||
export const AzureSqlDbFullDockerImageName = 'Azure SQL Database emulator';
|
||||
export const AzureSqlLogicalServerName = 'Azure SQL logical server';
|
||||
export const selectPublishOption = localize('selectPublishOption', "Select where to publish the project to");
|
||||
export const defaultQuickPickItem = localize('defaultQuickPickItem', "Default - image defined as default in the container registry");
|
||||
export function dockerImagesPlaceHolder(name: string) { return localize('dockerImagesPlaceHolder', 'Use {0} on local arm64/Apple Silicon', name); }
|
||||
export function publishToExistingServer(name: string) { return localize('publishToExistingServer', "Publish to an existing {0}", name); }
|
||||
export function publishToDockerContainer(name: string) { return localize('publishToDockerContainer', "Publish to new {0} local development container", name); }
|
||||
export function publishToDockerContainerPreview(name: string) { return localize('publishToDockerContainerPreview', "Publish to new {0} local development container (Preview)", name); }
|
||||
@@ -234,13 +232,10 @@ export const dockerImageDefaultTag = 'latest';
|
||||
export const eulaAgreementTemplate = localize({ key: 'eulaAgreementTemplate', comment: ['The placeholders are contents of the line and should not be translated.'] }, "I accept the {0}.");
|
||||
export function eulaAgreementText(name: string) { return localize({ key: 'eulaAgreementText', comment: ['The placeholders are contents of the line and should not be translated.'] }, "I accept the {0}.", name); }
|
||||
export const eulaAgreementTitle = localize('eulaAgreementTitle', "Microsoft SQL Server License Agreement");
|
||||
export const edgeEulaAgreementTitle = localize('edgeEulaAgreementTitle', "Microsoft Azure SQL Edge License Agreement");
|
||||
export const sqlServerEulaLink = 'https://aka.ms/mcr/osslegalnotice';
|
||||
export const sqlServerEdgeEulaLink = 'https://aka.ms/mcr/osslegalnotice';
|
||||
export const connectionNamePrefix = 'SQLDbProject';
|
||||
export const sqlServerDockerRegistry = 'mcr.microsoft.com';
|
||||
export const sqlServerDockerRepository = 'mssql/server';
|
||||
export const azureSqlEdgeDockerRepository = 'azure-sql-edge';
|
||||
export const commandsFolderName = 'commands';
|
||||
export const mssqlFolderName = '.mssql';
|
||||
export const dockerFileName = 'Dockerfile';
|
||||
|
||||
@@ -15,7 +15,7 @@ import { SqlConnectionDataSource } from '../models/dataSources/sqlConnectionStri
|
||||
import { DeploymentOptions } from 'mssql';
|
||||
import { IconPathHelper } from '../common/iconHelper';
|
||||
import { cssStyles } from '../common/uiConstants';
|
||||
import { getAgreementDisplayText, getConnectionName, getDockerBaseImages, getPublishServerName } from './utils';
|
||||
import { getAgreementDisplayText, getConnectionName, getDockerBaseImage, getPublishServerName } from './utils';
|
||||
import { TelemetryActions, TelemetryReporter, TelemetryViews } from '../common/telemetry';
|
||||
import { Deferred } from '../common/promise';
|
||||
import { PublishOptionsDialog } from './publishOptionsDialog';
|
||||
@@ -46,7 +46,6 @@ export class PublishDatabaseDialog {
|
||||
private connectionRow: azdataType.FlexContainer | undefined;
|
||||
private databaseRow: azdataType.FlexContainer | undefined;
|
||||
private localDbSection: azdataType.FlexContainer | undefined;
|
||||
private baseDockerImageDropDown: azdataType.DropDownComponent | undefined;
|
||||
private imageTagDropDown: azdataType.DropDownComponent | undefined;
|
||||
private serverAdminPasswordTextBox: azdataType.InputBoxComponent | undefined;
|
||||
private serverConfigAdminPasswordTextBox: azdataType.InputBoxComponent | undefined;
|
||||
@@ -250,11 +249,10 @@ export class PublishDatabaseDialog {
|
||||
utils.getAzdataApi()!.window.closeDialog(this.dialog);
|
||||
await this.publish!(this.project, settings);
|
||||
} else {
|
||||
let dockerBaseImage = this.getBaseDockerImageName();
|
||||
const baseImages = getDockerBaseImages(this.project.getProjectTargetVersion());
|
||||
const imageInfo = baseImages.find(x => x.name === dockerBaseImage);
|
||||
const imageInfo = getDockerBaseImage(this.project.getProjectTargetVersion());
|
||||
const imageName = imageInfo?.name;
|
||||
const imageTag = this.imageTagDropDown?.value;
|
||||
let dockerBaseImage = imageName;
|
||||
|
||||
// Add the image tag if it's not the latest
|
||||
if (imageTag && imageTag !== constants.dockerImageDefaultTag) {
|
||||
@@ -340,10 +338,6 @@ export class PublishDatabaseDialog {
|
||||
}
|
||||
}
|
||||
|
||||
public getBaseDockerImageName(): string {
|
||||
return (<azdataType.CategoryValue>this.baseDockerImageDropDown?.value)?.name ?? '';
|
||||
}
|
||||
|
||||
public getDefaultDatabaseName(): string {
|
||||
return this.project.projectFileName;
|
||||
}
|
||||
@@ -528,18 +522,7 @@ export class PublishDatabaseDialog {
|
||||
});
|
||||
const serverConfirmPasswordRow = this.createFormRow(view, constants.confirmServerPassword(name), this.serverConfigAdminPasswordTextBox);
|
||||
|
||||
const baseImages = getDockerBaseImages(this.project.getProjectTargetVersion());
|
||||
const baseImagesValues: azdataType.CategoryValue[] = baseImages.map(x => { return { name: x.name, displayName: x.displayName }; });
|
||||
|
||||
this.baseDockerImageDropDown = view.modelBuilder.dropDown().withProps({
|
||||
values: baseImagesValues,
|
||||
ariaLabel: constants.baseDockerImage(name),
|
||||
width: cssStyles.publishDialogTextboxWidth,
|
||||
enabled: true,
|
||||
required: true
|
||||
}).component();
|
||||
|
||||
const imageInfo = baseImages.find(x => x.displayName === (<azdataType.CategoryValue>this.baseDockerImageDropDown?.value)?.displayName);
|
||||
const imageInfo = getDockerBaseImage(this.project.getProjectTargetVersion());
|
||||
const imageTags = await uiUtils.getImageTags(imageInfo!, this.project.getProjectTargetVersion(), true);
|
||||
|
||||
this.imageTagDropDown = view.modelBuilder.dropDown().withProps({
|
||||
@@ -557,8 +540,7 @@ export class PublishDatabaseDialog {
|
||||
this.tryEnableGenerateScriptAndPublishButtons();
|
||||
});
|
||||
|
||||
const agreementInfo = baseImages[0].agreementInfo;
|
||||
const baseImageDropDownRow = this.createFormRow(view, constants.baseDockerImage(name), this.baseDockerImageDropDown);
|
||||
const agreementInfo = imageInfo.agreementInfo;
|
||||
const imageTagDropDownRow = this.createFormRow(view, constants.imageTag, this.imageTagDropDown);
|
||||
|
||||
this.eulaCheckBox = view.modelBuilder.checkBox().withProps({
|
||||
@@ -572,16 +554,13 @@ export class PublishDatabaseDialog {
|
||||
const eulaRow = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'row', alignItems: 'center' }).component();
|
||||
|
||||
this.localDbSection = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'column' }).component();
|
||||
this.localDbSection.addItems([serverPortRow, serverPasswordRow, serverConfirmPasswordRow, baseImageDropDownRow, imageTagDropDownRow, eulaRow]);
|
||||
this.baseDockerImageDropDown.onValueChanged(async () => {
|
||||
if (this.eulaCheckBox) {
|
||||
this.localDbSection.addItems([serverPortRow, serverPasswordRow, serverConfirmPasswordRow, imageTagDropDownRow, eulaRow]);
|
||||
|
||||
this.eulaCheckBox.checked = false;
|
||||
}
|
||||
const baseImage = getDockerBaseImages(this.project.getProjectTargetVersion()).find(x => x.name === (<azdataType.CategoryValue>this.baseDockerImageDropDown?.value).name);
|
||||
if (baseImage?.agreementInfo.link) {
|
||||
if (imageInfo?.agreementInfo.link) {
|
||||
const text = view.modelBuilder.text().withProps({
|
||||
value: constants.eulaAgreementTemplate,
|
||||
links: [baseImage.agreementInfo.link],
|
||||
links: [imageInfo.agreementInfo.link],
|
||||
requiredIndicator: true
|
||||
}).component();
|
||||
|
||||
@@ -590,13 +569,6 @@ export class PublishDatabaseDialog {
|
||||
eulaRow?.addItems([this.eulaCheckBox, text], { flex: '0 0 auto', CSSStyles: { 'margin-right': '10px' } });
|
||||
}
|
||||
}
|
||||
|
||||
// update image tag dropdown with the image tags for the selected base image
|
||||
const imageInfo = baseImages.find(x => x.displayName === baseImage?.displayName);
|
||||
const imageTags = await uiUtils.getImageTags(imageInfo!, this.project.getProjectTargetVersion(), true);
|
||||
this.imageTagDropDown!.values = imageTags;
|
||||
this.imageTagDropDown!.value = imageTags[0];
|
||||
});
|
||||
return this.localDbSection;
|
||||
}
|
||||
|
||||
|
||||
@@ -61,17 +61,7 @@ export async function getPublishToDockerSettings(project: ISqlProject): Promise<
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const baseImages = uiUtils.getDockerBaseImages(target);
|
||||
const baseImage = await vscode.window.showQuickPick(
|
||||
baseImages.map(x => x.displayName),
|
||||
{ title: constants.selectBaseImage(name), ignoreFocusOut: true, placeHolder: uiUtils.getDockerImagePlaceHolder(target) });
|
||||
|
||||
// Return when user hits escape
|
||||
if (!baseImage) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const imageInfo = baseImages.find(x => x.displayName === baseImage);
|
||||
const imageInfo = uiUtils.getDockerBaseImage(target);
|
||||
|
||||
if (!imageInfo) {
|
||||
return undefined;
|
||||
|
||||
@@ -43,15 +43,6 @@ export function getPublishServerName(target: string): string {
|
||||
return target === constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlAzure) ? constants.AzureSqlServerName : constants.SqlServerName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the docker image place holder based on the target version
|
||||
*/
|
||||
export function getDockerImagePlaceHolder(target: string): string {
|
||||
return target === constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlAzure) ?
|
||||
constants.dockerImagesPlaceHolder(constants.AzureSqlDbLiteDockerImageName) :
|
||||
constants.dockerImagesPlaceHolder(SqlTargetPlatform.sqlEdge);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of image tags for given target
|
||||
* @param imageInfo docker image info
|
||||
@@ -109,13 +100,13 @@ export async function getImageTags(imageInfo: DockerImageInfo, target: string, d
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of base images for given target version
|
||||
* Returns the base image for given target version
|
||||
* @param target
|
||||
* @returns list of image info
|
||||
* @returns image info
|
||||
*/
|
||||
export function getDockerBaseImages(target: string): DockerImageInfo[] {
|
||||
export function getDockerBaseImage(target: string): DockerImageInfo {
|
||||
if (target === constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlAzure)) {
|
||||
return [{
|
||||
return {
|
||||
name: `${constants.sqlServerDockerRegistry}/${constants.sqlServerDockerRepository}`,
|
||||
displayName: constants.AzureSqlDbFullDockerImageName,
|
||||
agreementInfo: {
|
||||
@@ -126,21 +117,9 @@ export function getDockerBaseImages(target: string): DockerImageInfo[] {
|
||||
},
|
||||
tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.sqlServerDockerRepository}/tags/list`,
|
||||
defaultTag: constants.dockerImageDefaultTag
|
||||
}, {
|
||||
name: `${constants.sqlServerDockerRegistry}/${constants.azureSqlEdgeDockerRepository}`,
|
||||
displayName: constants.AzureSqlDbLiteDockerImageName,
|
||||
agreementInfo: {
|
||||
link: {
|
||||
text: constants.edgeEulaAgreementTitle,
|
||||
url: constants.sqlServerEdgeEulaLink,
|
||||
}
|
||||
},
|
||||
tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.azureSqlEdgeDockerRepository}/tags/list`,
|
||||
defaultTag: constants.dockerImageDefaultTag
|
||||
}];
|
||||
};
|
||||
} else {
|
||||
return [
|
||||
{
|
||||
return {
|
||||
name: `${constants.sqlServerDockerRegistry}/${constants.sqlServerDockerRepository}`,
|
||||
displayName: constants.SqlServerDockerImageName,
|
||||
agreementInfo: {
|
||||
@@ -151,20 +130,7 @@ export function getDockerBaseImages(target: string): DockerImageInfo[] {
|
||||
},
|
||||
tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.sqlServerDockerRepository}/tags/list`,
|
||||
defaultTag: constants.dockerImageDefaultTag
|
||||
},
|
||||
{
|
||||
name: `${constants.sqlServerDockerRegistry}/${constants.azureSqlEdgeDockerRepository}`,
|
||||
displayName: SqlTargetPlatform.sqlEdge,
|
||||
agreementInfo: {
|
||||
link: {
|
||||
text: constants.edgeEulaAgreementTitle,
|
||||
url: constants.sqlServerEdgeEulaLink,
|
||||
}
|
||||
},
|
||||
tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.azureSqlEdgeDockerRepository}/tags/list`,
|
||||
defaultTag: constants.dockerImageDefaultTag
|
||||
},
|
||||
];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -116,12 +116,12 @@ describe('Publish Database Dialog', () => {
|
||||
const expectedContainerPublishProfile: IPublishToDockerSettings = {
|
||||
dockerSettings: {
|
||||
dbName: 'MockDatabaseName',
|
||||
dockerBaseImage: '',
|
||||
dockerBaseImage: 'mcr.microsoft.com/mssql/server',
|
||||
password: '',
|
||||
port: 1433,
|
||||
serverName: 'localhost',
|
||||
userName: 'sa',
|
||||
dockerBaseImageEula: ''
|
||||
dockerBaseImageEula: 'https://aka.ms/mcr/osslegalnotice'
|
||||
|
||||
},
|
||||
sqlProjectPublishSettings: {
|
||||
|
||||
@@ -6,26 +6,20 @@
|
||||
import * as should from 'should';
|
||||
import * as constants from '../../common/constants';
|
||||
import { SqlTargetPlatform } from 'sqldbproj';
|
||||
import { getDefaultDockerImageWithTag, getDockerBaseImages } from '../../dialogs/utils';
|
||||
import { getDefaultDockerImageWithTag, getDockerBaseImage } from '../../dialogs/utils';
|
||||
|
||||
describe('Tests to verify dialog utils functions', function (): void {
|
||||
it('getDefaultDockerImageWithTag should return correct image', () => {
|
||||
const baseImages = getDockerBaseImages(constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlServer2022)!);
|
||||
const sqlServerImageInfo = baseImages.find(image => image.displayName === constants.SqlServerDockerImageName);
|
||||
const edgeImageInfo = baseImages.find(image => image.displayName === SqlTargetPlatform.sqlEdge);
|
||||
const sqlServerImageInfo = getDockerBaseImage(constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlServer2022)!);
|
||||
|
||||
should(getDefaultDockerImageWithTag('160', 'mcr.microsoft.com/mssql/server', sqlServerImageInfo)).equals(`${sqlServerImageInfo?.name}:2022-latest`, 'Unexpected docker image returned for target platform SQL Server 2022 and SQL Server base image');
|
||||
should(getDefaultDockerImageWithTag('150', 'mcr.microsoft.com/mssql/server', sqlServerImageInfo)).equals(`${sqlServerImageInfo?.name}:2019-latest`, 'Unexpected docker image returned for target platform SQL Server 2019 and SQL Server base image');
|
||||
should(getDefaultDockerImageWithTag('140', 'mcr.microsoft.com/mssql/server', sqlServerImageInfo)).equals(`${sqlServerImageInfo?.name}:2017-latest`, 'Unexpected docker image returned for target platform SQL Server 2017 and SQL Server base image');
|
||||
should(getDefaultDockerImageWithTag('130', 'mcr.microsoft.com/mssql/server', sqlServerImageInfo)).equals(`${sqlServerImageInfo?.name}`, 'Unexpected docker image returned for target platform SQL Server 2016 and SQL Server base image');
|
||||
should(getDefaultDockerImageWithTag('150', 'mcr.microsoft.com/azure-sql-edge', edgeImageInfo)).equals(`${edgeImageInfo?.name}`, 'Unexpected docker image returned for target platform SQL Server 2019 and Edge base image');
|
||||
|
||||
// different display names are returned when a project's target platform is Azure, but currently the Azure full image points to mcr.microsoft.com/mssql/server
|
||||
const azureBaseImages = getDockerBaseImages(constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlAzure)!);
|
||||
const azureFullImageInfo = azureBaseImages.find(image => image.displayName === constants.AzureSqlDbFullDockerImageName);
|
||||
const azureLiteImageInfo = azureBaseImages.find(image => image.displayName === constants.AzureSqlDbLiteDockerImageName);
|
||||
const azureFullImageInfo = getDockerBaseImage(constants.targetPlatformToVersion.get(SqlTargetPlatform.sqlAzure)!);
|
||||
|
||||
should(getDefaultDockerImageWithTag('AzureV12', 'mcr.microsoft.com/mssql/server', azureFullImageInfo)).equals(`${azureFullImageInfo?.name}`, 'Unexpected docker image returned for target platform Azure and Azure full base image');
|
||||
should(getDefaultDockerImageWithTag('AzureV12', 'mcr.microsoft.com/azure-sql-edge', azureLiteImageInfo)).equals(`${azureLiteImageInfo?.name}`, 'Unexpected docker image returned for target platform Azure Azure lite base image');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user