Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -894,7 +894,7 @@
},
{
"command": "azureFunctions.durableTaskScheduler.createScheduler",
"when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /DurableTaskScheduler/i && viewItem =~ /azureResourceTypeGroup/i && config.azureFunctions.durableTaskScheduler.enablePreviewFeatures == true",
"when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /DurableTaskScheduler/i && viewItem =~ /azureResourceTypeGroup/i",
"group": "1@1"
},
{
Expand Down Expand Up @@ -1007,8 +1007,7 @@
"when": "never"
},
{
"command": "azureFunctions.durableTaskScheduler.createScheduler",
"when": "config.azureFunctions.durableTaskScheduler.enablePreviewFeatures == true"
"command": "azureFunctions.durableTaskScheduler.createScheduler"
},
{
"command": "azureFunctions.durableTaskScheduler.createTaskHub",
Expand Down Expand Up @@ -1161,11 +1160,6 @@
{
"title": "Durable Task Scheduler",
"properties": {
"azureFunctions.durableTaskScheduler.enablePreviewFeatures": {
"type": "boolean",
"default": false,
"description": "%azureFunctions.durableTaskScheduler.enablePreviewFeatures%"
},
"azureFunctions.durableTaskScheduler.emulatorRegistry": {
"type": "string",
"description": "%azureFunctions.durableTaskScheduler.emulatorRegistry%",
Expand Down
1 change: 0 additions & 1 deletion package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@
"azureFunctions.durableTaskScheduler.openTaskHubDashboard": "Open in Dashboard",
"azureFunctions.durableTaskScheduler.startEmulator": "Start Durable Task Emulator",
"azureFunctions.durableTaskScheduler.stopEmulator": "Stop Emulator",
"azureFunctions.durableTaskScheduler.enablePreviewFeatures": "Enable Durable Task Scheduler preview features",
"azureFunctions.durableTaskScheduler.emulatorRegistry": "The registry of the Durable Task Scheduler emulator image.",
"azureFunctions.durableTaskScheduler.emulatorImage": "The name of the Durable Task Scheduler emulator image.",
"azureFunctions.durableTaskScheduler.emulatorTag": "The tag of the Durable Task Scheduler emulator image.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import { AzureWizardPromptStep, openUrl, type IAzureQuickPickItem, type IWizardOptions } from "@microsoft/vscode-azext-utils";
import { DurableBackend } from "../../../constants";
import { defaultDescription, previewDescription } from "../../../constants-nls";
import { defaultDescription } from "../../../constants-nls";
import { localize } from "../../../localize";
import { type IFunctionWizardContext } from "../IFunctionWizardContext";
import { DurableProjectConfigureStep } from "./DurableProjectConfigureStep";
Expand All @@ -17,7 +17,7 @@ export class DurableStorageTypeListStep<T extends IFunctionWizardContext> extend
const placeHolder: string = localize('chooseDurableStorageType', 'Choose a durable storage type.');
const picks: IAzureQuickPickItem<DurableBackend | undefined>[] = [
{ label: 'Azure Storage', description: defaultDescription, data: DurableBackend.Storage },
{ label: 'Durable Task Scheduler', description: previewDescription, data: DurableBackend.DTS },
{ label: 'Durable Task Scheduler', data: DurableBackend.DTS },
{ label: 'MSSQL', data: DurableBackend.SQL },
{ label: durableStorageInfo, data: undefined }
];
Expand Down
38 changes: 24 additions & 14 deletions src/commands/durableTaskScheduler/createScheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,22 @@
*--------------------------------------------------------------------------------------------*/

import { type AzExtClientContext, createAzureClient, type ILocationWizardContext, type IResourceGroupWizardContext, LocationListStep, parseClientContext, ResourceGroupCreateStep, ResourceGroupListStep, VerifyProvidersStep } from "@microsoft/vscode-azext-azureutils";
import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, createSubscriptionContext, type ExecuteActivityContext, type IActionContext, type ISubscriptionActionContext, subscriptionExperience } from "@microsoft/vscode-azext-utils";
import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, createSubscriptionContext, type ExecuteActivityContext, type IAzureQuickPickItem, type IActionContext, type ISubscriptionActionContext, subscriptionExperience } from "@microsoft/vscode-azext-utils";
import { type AzureSubscription } from "@microsoft/vscode-azureresources-api";
import { DurableTaskProvider, DurableTaskSchedulersResourceType } from "../../constants";
import { defaultDescription } from "../../constants-nls";
import { ext } from '../../extensionVariables';
import { localize } from '../../localize';
import { type DurableTaskSchedulerClient } from "../../tree/durableTaskScheduler/DurableTaskSchedulerClient";
import { DurableTaskSchedulerSku, type DurableTaskSchedulerClient } from "../../tree/durableTaskScheduler/DurableTaskSchedulerClient";
import { type DurableTaskSchedulerDataBranchProvider } from "../../tree/durableTaskScheduler/DurableTaskSchedulerDataBranchProvider";
import { createActivityContext } from "../../utils/activityUtils";
import { withCancellation } from "../../utils/cancellation";
import { workspace, type Progress } from "vscode";
import { type Progress } from "vscode";
import { type ResourceManagementClient } from '@azure/arm-resources';

interface ICreateSchedulerContext extends ISubscriptionActionContext, ILocationWizardContext, IResourceGroupWizardContext, ExecuteActivityContext {
subscription?: AzureSubscription;
schedulerSku?: DurableTaskSchedulerSku;
schedulerName?: string;
}

Expand All @@ -33,6 +35,22 @@ class SchedulerNamingStep extends AzureWizardPromptStep<ICreateSchedulerContext>
}
}

class SchedulerSkuStep extends AzureWizardPromptStep<ICreateSchedulerContext> {
async prompt(wizardContext: ICreateSchedulerContext): Promise<void> {
const picks: IAzureQuickPickItem<DurableTaskSchedulerSku>[] = [
{ label: localize('consumption', 'Consumption'), description: defaultDescription, data: DurableTaskSchedulerSku.Consumption },
{ label: localize('dedicated', 'Dedicated'), data: DurableTaskSchedulerSku.Dedicated },
Comment thread
nturinski marked this conversation as resolved.
Outdated
];
wizardContext.schedulerSku = (await wizardContext.ui.showQuickPick(picks, {
placeHolder: localize('schedulerSkuPrompt', 'Select a plan for the scheduler'),
})).data;
}

shouldPrompt(wizardContext: ICreateSchedulerContext): boolean {
return !wizardContext.schedulerSku;
}
}

class SchedulerCreationStep extends AzureWizardExecuteStep<ICreateSchedulerContext> {
priority: number = 1;

Expand All @@ -47,7 +65,8 @@ class SchedulerCreationStep extends AzureWizardExecuteStep<ICreateSchedulerConte
wizardContext.subscription as AzureSubscription,
wizardContext.resourceGroup?.name as string,
location.name,
wizardContext.schedulerName as string
wizardContext.schedulerName as string,
wizardContext.schedulerSku
);

const status = await withCancellation(token => response.status.waitForCompletion(token), 1000 * 60 * 30);
Expand All @@ -72,12 +91,6 @@ export async function createResourcesClient(context: AzExtClientContext): Promis
}
}

export function isDtsPreviewFeaturesEnabled(): boolean {
const configuration = workspace.getConfiguration('azureFunctions');

return configuration.get<boolean>('durableTaskScheduler.enablePreviewFeatures') === true;
}

export async function isDtsProviderRegistered(context: AzExtClientContext): Promise<boolean> {
const resourcesClient = await createResourcesClient(context);

Expand All @@ -99,10 +112,6 @@ export function createSchedulerCommandFactory(dataBranchProvider: DurableTaskSch
...await createActivityContext()
};

if (!isDtsPreviewFeaturesEnabled()) {
throw new Error(localize('dtsPreviewFeaturesNotEnabled', 'Durable Task Scheduler preview features have not been enabled in settings.'));
}

if (!await isDtsProviderRegistered(wizardContext)) {
await actionContext.ui.showWarningMessage(
localize('dtsProviderNotRegistered', 'The Durable Task Scheduler provider ({0}) is not registered for the subscription ({1}).', DurableTaskProvider, subscription.subscriptionId),
Expand All @@ -115,6 +124,7 @@ export function createSchedulerCommandFactory(dataBranchProvider: DurableTaskSch

const promptSteps: AzureWizardPromptStep<ICreateSchedulerContext>[] = [
new SchedulerNamingStep(),
new SchedulerSkuStep(),
new ResourceGroupListStep()
];

Expand Down
13 changes: 9 additions & 4 deletions src/tree/durableTaskScheduler/DurableTaskSchedulerClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,13 @@ export interface DurableTaskSchedulerCreateResponse {
status: DurableTaskStatus;
}

export enum DurableTaskSchedulerSku {
Consumption = 'Consumption',
Dedicated = 'Dedicated',
}

export interface DurableTaskSchedulerClient {
createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string): Promise<DurableTaskSchedulerCreateResponse>;
createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string, sku?: DurableTaskSchedulerSku): Promise<DurableTaskSchedulerCreateResponse>;
createTaskHub(subscription: AzureSubscription, resourceGroupName: string, schedulerName: string, taskHubName: string): Promise<DurableTaskHubResource>;

deleteScheduler(subscription: AzureSubscription, resourceGroupName: string, schedulerName: string): Promise<DurableTaskStatus>;
Expand All @@ -81,16 +86,16 @@ export interface DurableTaskSchedulerClient {
}

export class HttpDurableTaskSchedulerClient implements DurableTaskSchedulerClient {
async createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string): Promise<DurableTaskSchedulerCreateResponse> {
async createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string, sku: DurableTaskSchedulerSku = DurableTaskSchedulerSku.Consumption): Promise<DurableTaskSchedulerCreateResponse> {
const taskHubsUrl = HttpDurableTaskSchedulerClient.getBaseUrl(subscription, resourceGroupName, schedulerName);

const request: DurableTaskSchedulerCreateRequest = {
location,
properties: {
ipAllowlist: ['0.0.0.0/0'],
sku: {
name: 'Dedicated',
capacity: 1
name: sku,
capacity: sku === DurableTaskSchedulerSku.Dedicated ? 1 : 0
}
},
tags: {
Expand Down
Loading