diff --git a/backend/src/main.rs b/backend/src/main.rs index 20409b8a3d..853559167a 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -23,11 +23,11 @@ use windmill_common::ee::schedule_key_renewal; use windmill_common::{ global_settings::{ BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ERROR_CHANNELS_SETTING, - CUSTOM_TAGS_SETTING, DEFAULT_TAGS_PER_WORKSPACE_SETTING, ENV_SETTINGS, - EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, EXTRA_PIP_INDEX_URL_SETTING, - HUB_BASE_URL_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, JWT_SECRET_SETTING, - KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, NPM_CONFIG_REGISTRY_SETTING, OAUTH_SETTING, - PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, + CUSTOM_TAGS_SETTING, DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, + ENV_SETTINGS, EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, + EXTRA_PIP_INDEX_URL_SETTING, HUB_BASE_URL_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, + JWT_SECRET_SETTING, KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, NPM_CONFIG_REGISTRY_SETTING, + OAUTH_SETTING, PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, REQUIRE_PREEXISTING_USER_FOR_OAUTH_SETTING, RETENTION_PERIOD_SECS_SETTING, SAML_METADATA_SETTING, SCIM_TOKEN_SETTING, }, @@ -61,11 +61,11 @@ use windmill_worker::{ use crate::monitor::{ initial_load, load_keep_job_dir, load_metrics_debug_enabled, load_require_preexisting_user, - load_tag_per_workspace_enabled, monitor_db, monitor_pool, reload_base_url_setting, - reload_bunfig_install_scopes_setting, reload_critical_error_channels_setting, - reload_extra_pip_index_url_setting, reload_hub_base_url_setting, - reload_job_default_timeout_setting, reload_jwt_secret_setting, reload_license_key, - reload_npm_config_registry_setting, reload_pip_index_url_setting, + load_tag_per_workspace_enabled, load_tag_per_workspace_workspaces, monitor_db, monitor_pool, + reload_base_url_setting, reload_bunfig_install_scopes_setting, + reload_critical_error_channels_setting, reload_extra_pip_index_url_setting, + reload_hub_base_url_setting, reload_job_default_timeout_setting, reload_jwt_secret_setting, + reload_license_key, reload_npm_config_registry_setting, reload_pip_index_url_setting, reload_retention_period_setting, reload_scim_token_setting, reload_server_config, reload_worker_config, }; @@ -365,7 +365,7 @@ Windmill Community Edition {GIT_VERSION} #[cfg(feature = "tantivy")] let should_index_jobs = - mode == Mode::Indexer || (enable_standalone_indexer && mode == Mode::Standalone); + mode == Mode::Indexer || (enable_standalone_indexer && mode == Mode::Standalone); #[cfg(not(feature = "tantivy"))] let should_index_jobs = false; @@ -504,9 +504,14 @@ Windmill Community Edition {GIT_VERSION} }, DEFAULT_TAGS_PER_WORKSPACE_SETTING => { if let Err(e) = load_tag_per_workspace_enabled(&db).await { - tracing::error!("Error loading default tag per workpsace: {e:#}"); + tracing::error!("Error loading default tag per workspace: {e:#}"); } }, + DEFAULT_TAGS_WORKSPACES_SETTING => { + if let Err(e) = load_tag_per_workspace_workspaces(&db).await { + tracing::error!("Error loading default tag per workspace workspaces: {e:#}"); + } + } RETENTION_PERIOD_SECS_SETTING => { reload_retention_period_setting(&db).await }, diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 378a67804b..5aa6200061 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -28,10 +28,11 @@ use windmill_common::{ flow_status::FlowStatusModule, global_settings::{ BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ERROR_CHANNELS_SETTING, - DEFAULT_TAGS_PER_WORKSPACE_SETTING, EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, - EXTRA_PIP_INDEX_URL_SETTING, HUB_BASE_URL_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, - JWT_SECRET_SETTING, KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, NPM_CONFIG_REGISTRY_SETTING, - OAUTH_SETTING, PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, + DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, + EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, EXTRA_PIP_INDEX_URL_SETTING, + HUB_BASE_URL_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, JWT_SECRET_SETTING, + KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, NPM_CONFIG_REGISTRY_SETTING, OAUTH_SETTING, + PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, REQUIRE_PREEXISTING_USER_FOR_OAUTH_SETTING, RETENTION_PERIOD_SECS_SETTING, SAML_METADATA_SETTING, SCIM_TOKEN_SETTING, }, @@ -41,8 +42,8 @@ use windmill_common::{ users::truncate_token, utils::{now_from_db, rd_string}, worker::{ - load_worker_config, reload_custom_tags_setting, DEFAULT_TAGS_PER_WORKSPACE, SERVER_CONFIG, - WORKER_CONFIG, + load_worker_config, reload_custom_tags_setting, DEFAULT_TAGS_PER_WORKSPACE, + DEFAULT_TAGS_WORKSPACES, SERVER_CONFIG, WORKER_CONFIG, }, BASE_URL, CRITICAL_ERROR_CHANNELS, DB, DEFAULT_HUB_BASE_URL, HUB_BASE_URL, METRICS_DEBUG_ENABLED, METRICS_ENABLED, @@ -127,6 +128,10 @@ pub async fn initial_load( tracing::error!("Error loading default tag per workpsace: {e:#}"); } + if let Err(e) = load_tag_per_workspace_workspaces(db).await { + tracing::error!("Error loading default tag per workpsace workspaces: {e:#}"); + } + if server_mode { load_require_preexisting_user(db).await; } @@ -204,6 +209,28 @@ pub async fn load_tag_per_workspace_enabled(db: &DB) -> error::Result<()> { Ok(()) } +pub async fn load_tag_per_workspace_workspaces(db: &DB) -> error::Result<()> { + let workspaces = load_value_from_global_settings(db, DEFAULT_TAGS_WORKSPACES_SETTING).await; + + match workspaces { + Ok(Some(serde_json::Value::Array(t))) => { + let workspaces = t + .iter() + .filter_map(|x| x.as_str()) + .map(|x| x.to_string()) + .collect::>(); + let mut w = DEFAULT_TAGS_WORKSPACES.write().await; + *w = Some(workspaces); + } + Ok(None) => { + let mut w = DEFAULT_TAGS_WORKSPACES.write().await; + *w = None; + } + _ => (), + }; + Ok(()) +} + pub async fn load_metrics_debug_enabled(db: &DB) -> error::Result<()> { let metrics_enabled = load_value_from_global_settings(db, EXPOSE_DEBUG_METRICS_SETTING).await; match metrics_enabled { diff --git a/backend/windmill-common/src/global_settings.rs b/backend/windmill-common/src/global_settings.rs index 2dad18e8b9..6e86646dcc 100644 --- a/backend/windmill-common/src/global_settings.rs +++ b/backend/windmill-common/src/global_settings.rs @@ -1,5 +1,6 @@ pub const CUSTOM_TAGS_SETTING: &str = "custom_tags"; pub const DEFAULT_TAGS_PER_WORKSPACE_SETTING: &str = "default_tags_per_workspace"; +pub const DEFAULT_TAGS_WORKSPACES_SETTING: &str = "default_tags_workspaces"; pub const BASE_URL_SETTING: &str = "base_url"; pub const OAUTH_SETTING: &str = "oauths"; pub const RETENTION_PERIOD_SECS_SETTING: &str = "retention_period_secs"; diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index 872c357e26..680cd71059 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -43,6 +43,7 @@ lazy_static::lazy_static! { ]; pub static ref DEFAULT_TAGS_PER_WORKSPACE: AtomicBool = AtomicBool::new(false); + pub static ref DEFAULT_TAGS_WORKSPACES: Arc>>> = Arc::new(RwLock::new(None)); pub static ref WORKER_CONFIG: Arc> = Arc::new(RwLock::new(WorkerConfig { diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 5b3728ee09..3318815273 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -63,7 +63,9 @@ use windmill_common::{ scripts::{get_full_hub_script_by_path, ScriptHash, ScriptLang}, users::{SUPERADMIN_NOTIFICATION_EMAIL, SUPERADMIN_SECRET_EMAIL}, utils::{not_found_if_none, report_critical_error, StripPath}, - worker::{to_raw_value, DEFAULT_TAGS_PER_WORKSPACE, NO_LOGS, WORKER_CONFIG}, + worker::{ + to_raw_value, DEFAULT_TAGS_PER_WORKSPACE, DEFAULT_TAGS_WORKSPACES, NO_LOGS, WORKER_CONFIG, + }, BASE_URL, DB, METRICS_ENABLED, }; @@ -3640,7 +3642,13 @@ pub async fn push<'c, 'd, R: rsmq_async::RsmqConnection + Send + 'c>( .map(|e| (Some(e.0), e.1)) .unwrap_or_else(|| (None, None)); - let per_workspace: bool = DEFAULT_TAGS_PER_WORKSPACE.load(std::sync::atomic::Ordering::Relaxed); + let per_workspace_workspaces = DEFAULT_TAGS_WORKSPACES.read().await; + let per_workspace = DEFAULT_TAGS_PER_WORKSPACE.load(std::sync::atomic::Ordering::Relaxed) + && (per_workspace_workspaces.is_none() + || per_workspace_workspaces + .as_ref() + .unwrap() + .contains(&workspace_id.to_string())); let tag = if dedicated_worker.is_some_and(|x| x) { format!( diff --git a/frontend/src/lib/components/DefaultTags.svelte b/frontend/src/lib/components/DefaultTags.svelte index 3b42ea4d42..313a7ab120 100644 --- a/frontend/src/lib/components/DefaultTags.svelte +++ b/frontend/src/lib/components/DefaultTags.svelte @@ -6,6 +6,7 @@ import DefaultTagsInner from './DefaultTagsInner.svelte' export let defaultTagPerWorkspace: boolean | undefined = undefined + export let defaultTagWorkspaces: string[] | undefined = undefined let placement: 'bottom-end' | 'top-end' = 'bottom-end' @@ -24,5 +25,5 @@ > - + diff --git a/frontend/src/lib/components/DefaultTagsInner.svelte b/frontend/src/lib/components/DefaultTagsInner.svelte index ec0954a12a..e3649c5990 100644 --- a/frontend/src/lib/components/DefaultTagsInner.svelte +++ b/frontend/src/lib/components/DefaultTagsInner.svelte @@ -1,25 +1,39 @@
@@ -48,11 +62,17 @@
{/each} -
+
+ {#if defaultTagPerWorkspace} + + {#if limitToWorkspaces} + + {/if} + {/if}
- +