diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 09bc764acb..2494bb8478 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -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'; diff --git a/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts b/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts index f895fd2d55..fae9827eb5 100644 --- a/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts +++ b/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts @@ -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 (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 === (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,31 +554,21 @@ 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.eulaCheckBox.checked = false; - } - const baseImage = getDockerBaseImages(this.project.getProjectTargetVersion()).find(x => x.name === (this.baseDockerImageDropDown?.value).name); - if (baseImage?.agreementInfo.link) { - const text = view.modelBuilder.text().withProps({ - value: constants.eulaAgreementTemplate, - links: [baseImage.agreementInfo.link], - requiredIndicator: true - }).component(); + this.localDbSection.addItems([serverPortRow, serverPasswordRow, serverConfirmPasswordRow, imageTagDropDownRow, eulaRow]); - if (eulaRow && this.eulaCheckBox) { - eulaRow?.clearItems(); - eulaRow?.addItems([this.eulaCheckBox, text], { flex: '0 0 auto', CSSStyles: { 'margin-right': '10px' } }); - } - } + this.eulaCheckBox.checked = false; + if (imageInfo?.agreementInfo.link) { + const text = view.modelBuilder.text().withProps({ + value: constants.eulaAgreementTemplate, + links: [imageInfo.agreementInfo.link], + requiredIndicator: true + }).component(); - // 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]; - }); + if (eulaRow && this.eulaCheckBox) { + eulaRow?.clearItems(); + eulaRow?.addItems([this.eulaCheckBox, text], { flex: '0 0 auto', CSSStyles: { 'margin-right': '10px' } }); + } + } return this.localDbSection; } diff --git a/extensions/sql-database-projects/src/dialogs/publishToDockerQuickpick.ts b/extensions/sql-database-projects/src/dialogs/publishToDockerQuickpick.ts index 8ea5432c2a..bcbd635b0d 100644 --- a/extensions/sql-database-projects/src/dialogs/publishToDockerQuickpick.ts +++ b/extensions/sql-database-projects/src/dialogs/publishToDockerQuickpick.ts @@ -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; diff --git a/extensions/sql-database-projects/src/dialogs/utils.ts b/extensions/sql-database-projects/src/dialogs/utils.ts index d2c798c939..139fef09b2 100644 --- a/extensions/sql-database-projects/src/dialogs/utils.ts +++ b/extensions/sql-database-projects/src/dialogs/utils.ts @@ -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,45 +117,20 @@ 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, + }; + } else { + return { + name: `${constants.sqlServerDockerRegistry}/${constants.sqlServerDockerRepository}`, + displayName: constants.SqlServerDockerImageName, agreementInfo: { link: { - text: constants.edgeEulaAgreementTitle, - url: constants.sqlServerEdgeEulaLink, + text: constants.eulaAgreementTitle, + url: constants.sqlServerEulaLink, } }, - tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.azureSqlEdgeDockerRepository}/tags/list`, + tagsUrl: `https://${constants.sqlServerDockerRegistry}/v2/${constants.sqlServerDockerRepository}/tags/list`, defaultTag: constants.dockerImageDefaultTag - }]; - } else { - return [ - { - name: `${constants.sqlServerDockerRegistry}/${constants.sqlServerDockerRepository}`, - displayName: constants.SqlServerDockerImageName, - agreementInfo: { - link: { - text: constants.eulaAgreementTitle, - url: constants.sqlServerEulaLink, - } - }, - 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 - }, - ]; + }; } } diff --git a/extensions/sql-database-projects/src/test/dialogs/publishDatabaseDialog.test.ts b/extensions/sql-database-projects/src/test/dialogs/publishDatabaseDialog.test.ts index ad45061c05..1ab646cc5b 100644 --- a/extensions/sql-database-projects/src/test/dialogs/publishDatabaseDialog.test.ts +++ b/extensions/sql-database-projects/src/test/dialogs/publishDatabaseDialog.test.ts @@ -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: { diff --git a/extensions/sql-database-projects/src/test/dialogs/utils.test.ts b/extensions/sql-database-projects/src/test/dialogs/utils.test.ts index aea0342aca..279989d6db 100644 --- a/extensions/sql-database-projects/src/test/dialogs/utils.test.ts +++ b/extensions/sql-database-projects/src/test/dialogs/utils.test.ts @@ -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'); }); });