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:
Kim Santiago
2023-09-25 09:34:56 -07:00
committed by GitHub
parent a1f7bddb3a
commit a612781638
6 changed files with 38 additions and 121 deletions

View File

@@ -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';

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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
},
];
};
}
}

View File

@@ -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: {

View File

@@ -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');
});
});