From c90fe387e882f7767c3b3621e5e230fc8acd80b0 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Feb 2025 17:59:32 +0100 Subject: [PATCH] fix: schedules do not accept 5 units cron syntax on update/create anymore --- backend/windmill-api/src/schedule.rs | 7 ++++--- backend/windmill-common/src/utils.rs | 14 ++++++++++++-- backend/windmill-queue/src/schedule.rs | 3 ++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/backend/windmill-api/src/schedule.rs b/backend/windmill-api/src/schedule.rs index 6754d5cfbaac5..a397eadf056ef 100644 --- a/backend/windmill-api/src/schedule.rs +++ b/backend/windmill-api/src/schedule.rs @@ -154,7 +154,7 @@ async fn create_schedule( let mut tx: Transaction<'_, Postgres> = user_db.begin(&authed).await?; // Check schedule for error - ScheduleType::from_str(&ns.schedule, ns.cron_version.as_deref())?; + ScheduleType::from_str(&ns.schedule, ns.cron_version.as_deref(), true)?; check_path_conflict(&mut tx, &w_id, &ns.path).await?; check_flow_conflict(&mut tx, &w_id, &ns.path, ns.is_flow, &ns.script_path).await?; @@ -249,7 +249,7 @@ async fn edit_schedule( let mut tx = user_db.begin(&authed).await?; // Check schedule for error - ScheduleType::from_str(&es.schedule, es.cron_version.as_deref())?; + ScheduleType::from_str(&es.schedule, es.cron_version.as_deref(), true)?; clear_schedule(&mut tx, path, &w_id).await?; let schedule = sqlx::query_as::<_, Schedule>( @@ -468,7 +468,8 @@ pub struct PreviewPayload { pub async fn preview_schedule( Json(payload): Json, ) -> JsonResult>> { - let schedule = ScheduleType::from_str(&payload.schedule, payload.cron_version.as_deref())?; + let schedule = + ScheduleType::from_str(&payload.schedule, payload.cron_version.as_deref(), true)?; let tz = chrono_tz::Tz::from_str(&payload.timezone).map_err(|e| Error::BadRequest(e.to_string()))?; diff --git a/backend/windmill-common/src/utils.rs b/backend/windmill-common/src/utils.rs index 0a6117999afa3..4295a0edaab93 100644 --- a/backend/windmill-common/src/utils.rs +++ b/backend/windmill-common/src/utils.rs @@ -424,7 +424,11 @@ impl ScheduleType { } } - pub fn from_str(schedule_str: &str, version: Option<&str>) -> Result { + pub fn from_str( + schedule_str: &str, + version: Option<&str>, + seconds_required: bool, + ) -> Result { tracing::debug!( "Attempting to parse schedule string: {}, with version: {:?}", schedule_str, @@ -448,7 +452,13 @@ impl ScheduleType { Some("v2") | Some(_) => { // Use Croner for v2 let schedule_type_result = panic::catch_unwind(AssertUnwindSafe(|| { - Cron::new(schedule_str).with_seconds_optional().parse() + let mut croner = Cron::new(schedule_str); + if seconds_required { + croner.with_seconds_required(); + } else { + croner.with_seconds_optional(); + }; + croner.parse() })) .map_err(|_| { tracing::error!( diff --git a/backend/windmill-queue/src/schedule.rs b/backend/windmill-queue/src/schedule.rs index f36722dbe9fc7..820c849a63c04 100644 --- a/backend/windmill-queue/src/schedule.rs +++ b/backend/windmill-queue/src/schedule.rs @@ -38,7 +38,8 @@ pub async fn push_scheduled_job<'c>( )); } - let sched = ScheduleType::from_str(&schedule.schedule, schedule.cron_version.as_deref())?; + let sched = + ScheduleType::from_str(&schedule.schedule, schedule.cron_version.as_deref(), false)?; let tz = chrono_tz::Tz::from_str(&schedule.timezone) .map_err(|e| error::Error::BadRequest(e.to_string()))?;