mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2026-01-07 19:46:53 +00:00
* src/SelfServe/Example/SelfServeExample.rp.ts. Portal changes for DedicatedGateway 1. Change Sqlx endpoints to SqlDedicatedGateway endpoint 2. Remove D32s from the SKU list 3. Add telemetry 4. Remove SKU details field per discussion 5. Support dynamic instance scaling. * format files to ensure format check and lint tests pass * Lint fixes * Lint fixes * Added metrics blade link * updated conditions for warning banner * fixed lint error * Incorporate metrics link and CR feedback * Lint fixes * CR feedback and fix links * CR feedback and fix links * Link fix Co-authored-by: Srinath Narayanan <srnara@microsoft.com>
128 lines
4.9 KiB
TypeScript
128 lines
4.9 KiB
TypeScript
import { configContext } from "../../ConfigContext";
|
|
import { userContext } from "../../UserContext";
|
|
import { armRequestWithoutPolling } from "../../Utils/arm/request";
|
|
import { selfServeTraceFailure, selfServeTraceStart, selfServeTraceSuccess } from "../SelfServeTelemetryProcessor";
|
|
import { RefreshResult } from "../SelfServeTypes";
|
|
import SqlX from "./SqlX";
|
|
import { SqlxServiceResource, UpdateDedicatedGatewayRequestParameters } from "./SqlxTypes";
|
|
|
|
const apiVersion = "2021-04-01-preview";
|
|
|
|
export enum ResourceStatus {
|
|
Running = "Running",
|
|
Creating = "Creating",
|
|
Updating = "Updating",
|
|
Deleting = "Deleting",
|
|
}
|
|
|
|
export interface DedicatedGatewayResponse {
|
|
sku: string;
|
|
instances: number;
|
|
status: string;
|
|
endpoint: string;
|
|
}
|
|
|
|
export const getPath = (subscriptionId: string, resourceGroup: string, name: string): string => {
|
|
return `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.DocumentDB/databaseAccounts/${name}/services/SqlDedicatedGateway`;
|
|
};
|
|
|
|
export const updateDedicatedGatewayResource = async (sku: string, instances: number): Promise<string> => {
|
|
const path = getPath(userContext.subscriptionId, userContext.resourceGroup, userContext.databaseAccount.name);
|
|
const body: UpdateDedicatedGatewayRequestParameters = {
|
|
properties: {
|
|
instanceSize: sku,
|
|
instanceCount: instances,
|
|
serviceType: "SqlDedicatedGateway",
|
|
},
|
|
};
|
|
const telemetryData = { ...body, httpMethod: "PUT", selfServeClassName: SqlX.name };
|
|
const updateTimeStamp = selfServeTraceStart(telemetryData);
|
|
let armRequestResult;
|
|
try {
|
|
armRequestResult = await armRequestWithoutPolling({
|
|
host: configContext.ARM_ENDPOINT,
|
|
path,
|
|
method: "PUT",
|
|
apiVersion,
|
|
body,
|
|
});
|
|
selfServeTraceSuccess(telemetryData, updateTimeStamp);
|
|
} catch (e) {
|
|
const failureTelemetry = { ...body, e, selfServeClassName: SqlX.name };
|
|
selfServeTraceFailure(failureTelemetry, updateTimeStamp);
|
|
}
|
|
return armRequestResult?.operationStatusUrl;
|
|
};
|
|
|
|
export const deleteDedicatedGatewayResource = async (): Promise<string> => {
|
|
const path = getPath(userContext.subscriptionId, userContext.resourceGroup, userContext.databaseAccount.name);
|
|
const telemetryData = { httpMethod: "DELETE", selfServeClassName: SqlX.name };
|
|
const deleteTimeStamp = selfServeTraceStart(telemetryData);
|
|
let armRequestResult;
|
|
try {
|
|
armRequestResult = await armRequestWithoutPolling({
|
|
host: configContext.ARM_ENDPOINT,
|
|
path,
|
|
method: "DELETE",
|
|
apiVersion,
|
|
});
|
|
selfServeTraceSuccess(telemetryData, deleteTimeStamp);
|
|
} catch (e) {
|
|
const failureTelemetry = { e, selfServeClassName: SqlX.name };
|
|
selfServeTraceFailure(failureTelemetry, deleteTimeStamp);
|
|
}
|
|
return armRequestResult?.operationStatusUrl;
|
|
};
|
|
|
|
export const getDedicatedGatewayResource = async (): Promise<SqlxServiceResource> => {
|
|
const path = getPath(userContext.subscriptionId, userContext.resourceGroup, userContext.databaseAccount.name);
|
|
const telemetryData = { httpMethod: "GET", selfServeClassName: SqlX.name };
|
|
const getResourceTimeStamp = selfServeTraceStart(telemetryData);
|
|
let armRequestResult;
|
|
try {
|
|
armRequestResult = await armRequestWithoutPolling<SqlxServiceResource>({
|
|
host: configContext.ARM_ENDPOINT,
|
|
path,
|
|
method: "GET",
|
|
apiVersion,
|
|
});
|
|
selfServeTraceSuccess(telemetryData, getResourceTimeStamp);
|
|
} catch (e) {
|
|
const failureTelemetry = { e, selfServeClassName: SqlX.name };
|
|
selfServeTraceFailure(failureTelemetry, getResourceTimeStamp);
|
|
}
|
|
return armRequestResult?.result;
|
|
};
|
|
|
|
export const getCurrentProvisioningState = async (): Promise<DedicatedGatewayResponse> => {
|
|
try {
|
|
const response = await getDedicatedGatewayResource();
|
|
return {
|
|
sku: response.properties.instanceSize,
|
|
instances: response.properties.instanceCount,
|
|
status: response.properties.status,
|
|
endpoint: response.properties.sqlxEndPoint,
|
|
};
|
|
} catch (e) {
|
|
return { sku: undefined, instances: undefined, status: undefined, endpoint: undefined };
|
|
}
|
|
};
|
|
|
|
export const refreshDedicatedGatewayProvisioning = async (): Promise<RefreshResult> => {
|
|
try {
|
|
const response = await getDedicatedGatewayResource();
|
|
if (response.properties.status === ResourceStatus.Running.toString()) {
|
|
return { isUpdateInProgress: false, updateInProgressMessageTKey: undefined };
|
|
} else if (response.properties.status === ResourceStatus.Creating.toString()) {
|
|
return { isUpdateInProgress: true, updateInProgressMessageTKey: "CreateMessage" };
|
|
} else if (response.properties.status === ResourceStatus.Deleting.toString()) {
|
|
return { isUpdateInProgress: true, updateInProgressMessageTKey: "DeleteMessage" };
|
|
} else {
|
|
return { isUpdateInProgress: true, updateInProgressMessageTKey: "UpdateMessage" };
|
|
}
|
|
} catch {
|
|
//TODO differentiate between different failures
|
|
return { isUpdateInProgress: false, updateInProgressMessageTKey: undefined };
|
|
}
|
|
};
|