diff --git a/package.json b/package.json index 8369fe42c..05ec03bdf 100644 --- a/package.json +++ b/package.json @@ -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" }, { @@ -1007,8 +1007,7 @@ "when": "never" }, { - "command": "azureFunctions.durableTaskScheduler.createScheduler", - "when": "config.azureFunctions.durableTaskScheduler.enablePreviewFeatures == true" + "command": "azureFunctions.durableTaskScheduler.createScheduler" }, { "command": "azureFunctions.durableTaskScheduler.createTaskHub", @@ -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%", diff --git a/package.nls.json b/package.nls.json index 03682a1bf..07c2f44c0 100644 --- a/package.nls.json +++ b/package.nls.json @@ -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.", diff --git a/src/commands/createFunction/durableSteps/DurableStorageTypePromptStep.ts b/src/commands/createFunction/durableSteps/DurableStorageTypePromptStep.ts index 5903cd0b7..64a11a6f0 100644 --- a/src/commands/createFunction/durableSteps/DurableStorageTypePromptStep.ts +++ b/src/commands/createFunction/durableSteps/DurableStorageTypePromptStep.ts @@ -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"; @@ -17,7 +17,7 @@ export class DurableStorageTypeListStep extend const placeHolder: string = localize('chooseDurableStorageType', 'Choose a durable storage type.'); const picks: IAzureQuickPickItem[] = [ { 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 } ]; diff --git a/src/commands/durableTaskScheduler/createScheduler.ts b/src/commands/durableTaskScheduler/createScheduler.ts index d4b41d5e1..642b7d76d 100644 --- a/src/commands/durableTaskScheduler/createScheduler.ts +++ b/src/commands/durableTaskScheduler/createScheduler.ts @@ -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; } @@ -33,6 +35,22 @@ class SchedulerNamingStep extends AzureWizardPromptStep } } +class SchedulerSkuStep extends AzureWizardPromptStep { + async prompt(wizardContext: ICreateSchedulerContext): Promise { + const picks: IAzureQuickPickItem[] = [ + { label: localize('dtsSkuConsumption', 'Consumption'), description: defaultDescription, data: DurableTaskSchedulerSku.Consumption }, + { label: localize('dtsSkuDedicated', 'Dedicated'), data: DurableTaskSchedulerSku.Dedicated }, + ]; + 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 { priority: number = 1; @@ -47,7 +65,8 @@ class SchedulerCreationStep extends AzureWizardExecuteStep response.status.waitForCompletion(token), 1000 * 60 * 30); @@ -72,12 +91,6 @@ export async function createResourcesClient(context: AzExtClientContext): Promis } } -export function isDtsPreviewFeaturesEnabled(): boolean { - const configuration = workspace.getConfiguration('azureFunctions'); - - return configuration.get('durableTaskScheduler.enablePreviewFeatures') === true; -} - export async function isDtsProviderRegistered(context: AzExtClientContext): Promise { const resourcesClient = await createResourcesClient(context); @@ -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), @@ -115,6 +124,7 @@ export function createSchedulerCommandFactory(dataBranchProvider: DurableTaskSch const promptSteps: AzureWizardPromptStep[] = [ new SchedulerNamingStep(), + new SchedulerSkuStep(), new ResourceGroupListStep() ]; diff --git a/src/tree/durableTaskScheduler/DurableTaskSchedulerClient.ts b/src/tree/durableTaskScheduler/DurableTaskSchedulerClient.ts index 86ab328b6..a5b7e89da 100644 --- a/src/tree/durableTaskScheduler/DurableTaskSchedulerClient.ts +++ b/src/tree/durableTaskScheduler/DurableTaskSchedulerClient.ts @@ -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; + createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string, sku?: DurableTaskSchedulerSku): Promise; createTaskHub(subscription: AzureSubscription, resourceGroupName: string, schedulerName: string, taskHubName: string): Promise; deleteScheduler(subscription: AzureSubscription, resourceGroupName: string, schedulerName: string): Promise; @@ -81,7 +86,7 @@ export interface DurableTaskSchedulerClient { } export class HttpDurableTaskSchedulerClient implements DurableTaskSchedulerClient { - async createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string): Promise { + async createScheduler(subscription: AzureSubscription, resourceGroupName: string, location: string, schedulerName: string, sku: DurableTaskSchedulerSku = DurableTaskSchedulerSku.Consumption): Promise { const taskHubsUrl = HttpDurableTaskSchedulerClient.getBaseUrl(subscription, resourceGroupName, schedulerName); const request: DurableTaskSchedulerCreateRequest = { @@ -89,8 +94,8 @@ export class HttpDurableTaskSchedulerClient implements DurableTaskSchedulerClien properties: { ipAllowlist: ['0.0.0.0/0'], sku: { - name: 'Dedicated', - capacity: 1 + name: sku, + capacity: sku === DurableTaskSchedulerSku.Dedicated ? 1 : 0 } }, tags: {