From 1754a64cd677fd822d26d3b0e3c9bbbd0821d7ae Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 15 Feb 2026 15:05:23 +0100 Subject: [PATCH] feat: open-source worker group configuration UI (#7954) * feat: gate private registry configuration behind enterprise feature Add read_ee_registry helper that returns None and emits a job log in CE builds when a private registry is configured. Applied to all language executors: pip, npm/bun, deno, cargo, go, maven, nuget, powershell, and ruby. Maven settings.xml file write in monitor.rs is also gated. Co-Authored-By: Claude Opus 4.6 * feat: open-source worker group configuration UI Allow CE users to create worker group configs and edit worker_tags. EE-only features (dedicated workers, custom env vars, init/periodic scripts, autoscaling, priority tags, etc.) remain gated behind the enterprise license in the UI. Backend now filters CE config updates to only allow worker_tags and cache_clear fields instead of rejecting the entire request. Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- backend/windmill-api-configs/src/lib.rs | 17 +++--- .../src/lib/components/WorkerGroup.svelte | 61 +++++++++---------- .../(root)/(logged)/workers/+page.svelte | 12 +--- 3 files changed, 43 insertions(+), 47 deletions(-) diff --git a/backend/windmill-api-configs/src/lib.rs b/backend/windmill-api-configs/src/lib.rs index 35ace8d6a3..de4be9cf9c 100644 --- a/backend/windmill-api-configs/src/lib.rs +++ b/backend/windmill-api-configs/src/lib.rs @@ -23,7 +23,7 @@ use windmill_common::{ DB, }; -use windmill_api_auth::{ApiAuthed, require_devops_role}; +use windmill_api_auth::{require_devops_role, ApiAuthed}; pub fn global_service() -> Router { Router::new() @@ -128,12 +128,15 @@ async fn update_config( require_devops_role(&db, &authed.email).await?; #[cfg(not(feature = "enterprise"))] - if name.starts_with("worker__") { - return Err(error::Error::BadRequest( - "Worker groups configurable from UI available only in the enterprise version" - .to_string(), - )); - } + let config = if name.starts_with("worker__") { + // In CE, only allow setting worker_tags (and cache_clear for cache management) + serde_json::json!({ + "worker_tags": config.get("worker_tags"), + "cache_clear": config.get("cache_clear") + }) + } else { + config + }; if name.starts_with("worker__") { let periodic_script_bash = config diff --git a/frontend/src/lib/components/WorkerGroup.svelte b/frontend/src/lib/components/WorkerGroup.svelte index 820f21599e..7392ff4dc6 100644 --- a/frontend/src/lib/components/WorkerGroup.svelte +++ b/frontend/src/lib/components/WorkerGroup.svelte @@ -226,9 +226,9 @@ } // Centralized permission logic - let canEditConfig = $derived($enterpriseLicense && ($superadmin || $devopsRole)) + let canEditConfig = $derived($superadmin || $devopsRole) let hasEnterpriseFeatures = $derived($enterpriseLicense) - let isReadOnly = $derived(!canEditConfig) + let canEditEEConfig = $derived(canEditConfig && hasEnterpriseFeatures) const dispatch = createEventDispatcher() @@ -340,12 +340,11 @@ drawer?.closeDrawer()} title={canEditConfig ? `Edit worker config '${name}'` : `Worker config '${name}'`} - eeOnly > {#if !hasEnterpriseFeatures} - - Workers can still have their WORKER_TAGS, INIT_SCRIPT and WHITELIST_ENVS passed as env. - Dedicated workers are an enterprise only feature. + + Some worker management features require the enterprise edition. In CE, you can configure + worker tags. {:else if !canEditConfig} @@ -355,7 +354,7 @@