mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-21 17:22:55 -05:00
SQL Project Deploy to docker container - Adding a UI for user to select docker image tag (#19297)
This commit is contained in:
@@ -149,10 +149,16 @@ export const nameMustNotBeEmpty = localize('nameMustNotBeEmpty', "Name must not
|
||||
// Deploy
|
||||
export const SqlServerName = 'SQL server';
|
||||
export const AzureSqlServerName = 'Azure SQL server';
|
||||
export const SqlServerDockerImageName = 'Microsoft SQL Server';
|
||||
export const AzureSqlDbFullDockerImageName = 'Azure SQL Database emulator Full';
|
||||
export const AzureSqlDbLiteDockerImageName = 'Azure SQL Database emulator Lite';
|
||||
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 const publishToAzureEmulator = localize('publishToAzureEmulator', "Publish to new Azure SQL Database emulator");
|
||||
export const publishToNewAzureServer = localize('publishToNewAzureServer', "Publish to new Azure SQL logical server");
|
||||
export const azureServerName = localize('azureServerName', "Azure SQL server name");
|
||||
export const azureSubscription = localize('azureSubscription', "Azure subscription");
|
||||
@@ -171,12 +177,14 @@ export function enterUser(name: string) { return localize('enterUser', "Enter {0
|
||||
export function enterPassword(name: string) { return localize('enterPassword', "Enter {0} admin password", name); }
|
||||
export function confirmPassword(name: string) { return localize('confirmPassword', "Confirm {0} admin password", name); }
|
||||
export function selectBaseImage(name: string) { return localize('selectBaseImage', "Select the base {0} docker image", name); }
|
||||
export function selectImageTag(name: string) { return localize('selectImageTag', "Select the image tag or press enter to use the default value", name); }
|
||||
export function invalidSQLPasswordMessage(name: string) { return localize('invalidSQLPassword', "{0} password doesn't meet the password complexity requirement. For more information see https://docs.microsoft.com/sql/relational-databases/security/password-policy", name); }
|
||||
export function passwordNotMatch(name: string) { return localize('passwordNotMatch', "{0} password doesn't match the confirmation password", name); }
|
||||
export const portMustBeNumber = localize('portMustNotBeNumber', "Port must a be number");
|
||||
export const valueCannotBeEmpty = localize('valueCannotBeEmpty', "Value cannot be empty");
|
||||
export const dockerImageLabelPrefix = 'source=sqldbproject';
|
||||
export const dockerImageNamePrefix = 'sqldbproject';
|
||||
export const dockerImageDefaultTag = 'latest';
|
||||
|
||||
// Publish to Container
|
||||
export const eulaAgreementTemplate = localize({ key: 'eulaAgreementTemplate', comment: ['The placeholders are contents of the line and should not be translated.'] }, "I accept the {0}.");
|
||||
|
||||
51
extensions/sql-database-projects/src/common/httpClient.ts
Normal file
51
extensions/sql-database-projects/src/common/httpClient.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as os from 'os';
|
||||
import axios, { AxiosRequestConfig } from 'axios';
|
||||
|
||||
/**
|
||||
* Class includes method for making http request
|
||||
*/
|
||||
export class HttpClient {
|
||||
private static cache: Map<string, any> = new Map();
|
||||
|
||||
/**
|
||||
* Makes http GET request to the given url. If useCache is set to true, returns the result from cache if exists
|
||||
* @param url url to make http GET request against
|
||||
* @param useCache if true and result is already cached the cached value will be returned
|
||||
* @returns result of http GET request
|
||||
*/
|
||||
public static async getRequest(url: string, useCache = false): Promise<any> {
|
||||
|
||||
if (useCache) {
|
||||
if (HttpClient.cache.has(url)) {
|
||||
return HttpClient.cache.get(url);
|
||||
}
|
||||
}
|
||||
|
||||
const config: AxiosRequestConfig = {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
validateStatus: () => true // Never throw
|
||||
};
|
||||
const response = await axios.get(url, config);
|
||||
if (response.status !== 200) {
|
||||
let errorMessage: string[] = [];
|
||||
errorMessage.push(response.status.toString());
|
||||
errorMessage.push(response.statusText);
|
||||
if (response.data?.error) {
|
||||
errorMessage.push(`${response.data?.error?.code} : ${response.data?.error?.message}`);
|
||||
}
|
||||
throw new Error(errorMessage.join(os.EOL));
|
||||
}
|
||||
|
||||
if (useCache) {
|
||||
HttpClient.cache.set(url, response.data);
|
||||
}
|
||||
return response.data;
|
||||
}
|
||||
}
|
||||
@@ -641,3 +641,47 @@ export function getWellKnownDatabaseSources(databaseSourceValues: string[]): str
|
||||
|
||||
return Array.from(databaseSourceSet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns SQL version number from docker image name which is in the beginning of the image name
|
||||
* @param imageName docker image name
|
||||
* @returns SQL server version
|
||||
*/
|
||||
export function findSqlVersionInImageName(imageName: string): number | undefined {
|
||||
|
||||
// Regex to find the version in the beginning of the image name
|
||||
// e.g. 2017-CU16-ubuntu, 2019-latest
|
||||
const regex = new RegExp('^([0-9]+)[-].+$');
|
||||
|
||||
if (regex.test(imageName)) {
|
||||
const finds = regex.exec(imageName);
|
||||
if (finds) {
|
||||
|
||||
// 0 is the full match and 1 is the number with pattern inside the first ()
|
||||
return +finds[1];
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns SQL version number from target platform name
|
||||
* @param targetPlatform target platform
|
||||
* @returns SQL server version
|
||||
*/
|
||||
export function findSqlVersionInTargetPlatform(targetPlatform: string): number | undefined {
|
||||
|
||||
// Regex to find the version in target platform
|
||||
// e.g. SQL Server 2019
|
||||
const regex = new RegExp('([0-9]+)$');
|
||||
|
||||
if (regex.test(targetPlatform)) {
|
||||
const finds = regex.exec(targetPlatform);
|
||||
if (finds) {
|
||||
|
||||
// 0 is the full match and 1 is the number with pattern inside the first ()
|
||||
return +finds[1];
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user