Compare commits

...

15 Commits

Author SHA1 Message Date
Ruben Fiszel
020e5f7b32 update metrics 2023-02-27 11:56:55 +01:00
Ruben Fiszel
1414030afe chore(main): release 1.70.1 (#1241) 2023-02-27 10:41:23 +01:00
Ruben Fiszel
92bf928b78 chore(main): release 1.70.1 (#1239)
* chore(main): release 1.70.1

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <rubenfiszel@users.noreply.github.com>
2023-02-27 10:41:23 +01:00
Faton Ramadani
0bcc036a84 fix(frontend): Fix inline scripts list (#1240) 2023-02-27 10:41:23 +01:00
Faton Ramadani
6277188c1b fix(frontend): Fix subgrid lock (#1232)
* fix(frontend): Fix subgrid lock

* feat(frontend): restore
2023-02-27 10:41:23 +01:00
Ruben Fiszel
65c9d43419 fix findGridItemById 2023-02-27 10:41:23 +01:00
Faton Ramadani
cc5744ee2d fix(frontend): Disable move in nested subgrid (#1238)
* fix(frontend): Disable move in nested subgrid

* fix(frontend): Disable move in nested subgrid
2023-02-27 10:41:23 +01:00
Ruben Fiszel
1e796881b3 fix(cli): make cli resilient to systems without openable browsers 2023-02-27 10:41:23 +01:00
Ruben Fiszel
a55d99a8b7 chore(main): release 1.70.0 (#1236)
* chore(main): release 1.70.0

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <rubenfiszel@users.noreply.github.com>
2023-02-27 10:41:23 +01:00
Ruben Fiszel
07477f9e35 fix(cli): bump cli to non broken client 1.69.3 2023-02-27 10:41:23 +01:00
Ruben Fiszel
9409d5e266 update 2023-02-27 10:41:23 +01:00
Ruben Fiszel
2d71ebbe09 fix stripe checkout 2023-02-27 10:41:23 +01:00
Ruben Fiszel
c1673ac036 update 2023-02-27 08:27:08 +01:00
Ruben Fiszel
8ca54e02c0 Merge branch 'main' into rf/diff3 2023-02-27 08:23:29 +01:00
Ruben Fiszel
53ddf013df foo 2023-02-24 11:01:45 +01:00
27 changed files with 1390 additions and 167 deletions

View File

@@ -1,6 +1,40 @@
# Changelog # Changelog
## [1.70.1](https://github.com/windmill-labs/windmill/compare/v1.70.0...v1.70.1) (2023-02-27)
### Bug Fixes
* **cli:** make cli resilient to systems without openable browsers ([c051ffe](https://github.com/windmill-labs/windmill/commit/c051ffeb42c1cff609f93da7745036ea722e17d4))
* **frontend:** Disable move in nested subgrid ([#1238](https://github.com/windmill-labs/windmill/issues/1238)) ([70eab30](https://github.com/windmill-labs/windmill/commit/70eab303bd45111ae198d9b710bfd6f9f59e53b0))
* **frontend:** Fix inline scripts list ([#1240](https://github.com/windmill-labs/windmill/issues/1240)) ([97602ac](https://github.com/windmill-labs/windmill/commit/97602ac6db1404d36d160a431ffcea6c0f567a48))
* **frontend:** Fix subgrid lock ([#1232](https://github.com/windmill-labs/windmill/issues/1232)) ([8ee9d67](https://github.com/windmill-labs/windmill/commit/8ee9d67f4faa91446338b41c664ef91913eb8b81))
## [1.70.1](https://github.com/windmill-labs/windmill/compare/v1.70.0...v1.70.1) (2023-02-27)
### Bug Fixes
* **cli:** make cli resilient to systems without openable browsers ([c051ffe](https://github.com/windmill-labs/windmill/commit/c051ffeb42c1cff609f93da7745036ea722e17d4))
* **frontend:** Disable move in nested subgrid ([#1238](https://github.com/windmill-labs/windmill/issues/1238)) ([70eab30](https://github.com/windmill-labs/windmill/commit/70eab303bd45111ae198d9b710bfd6f9f59e53b0))
* **frontend:** Fix subgrid lock ([#1232](https://github.com/windmill-labs/windmill/issues/1232)) ([8ee9d67](https://github.com/windmill-labs/windmill/commit/8ee9d67f4faa91446338b41c664ef91913eb8b81))
## [1.70.0](https://github.com/windmill-labs/windmill/compare/v1.69.3...v1.70.0) (2023-02-27)
### Features
* **apps:** add ag grid ([b690d80](https://github.com/windmill-labs/windmill/commit/b690d801d4aa5695ee558e81d1ed114074dfcb83))
* **frontend:** move to other grid ([#1230](https://github.com/windmill-labs/windmill/issues/1230)) ([104e4ac](https://github.com/windmill-labs/windmill/commit/104e4ac5e790c30e6fb6b27726776693038d4f19))
### Bug Fixes
* app setup and sync now uses 1.69.3 ([d38aff2](https://github.com/windmill-labs/windmill/commit/d38aff2fe228f23eb18c3991392928c064e6aca2))
* **frontend:** Fix duplication ([#1237](https://github.com/windmill-labs/windmill/issues/1237)) ([e87f4fc](https://github.com/windmill-labs/windmill/commit/e87f4fc44b847a573f5acafc0348fbcbfcb2258f))
* **frontend:** fix graph viewer id assignment ([e1f686d](https://github.com/windmill-labs/windmill/commit/e1f686d8508cfc1f73c43be08facc44217ca8de0))
## [1.69.3](https://github.com/windmill-labs/windmill/compare/v1.69.2...v1.69.3) (2023-02-24) ## [1.69.3](https://github.com/windmill-labs/windmill/compare/v1.69.2...v1.69.3) (2023-02-24)

104
backend/Cargo.lock generated
View File

@@ -255,9 +255,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "axum" name = "axum"
version = "0.6.8" version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bd379e511536bad07447f899300aa526e9bae8e6f66dc5e5ca45d7587b7c1ec" checksum = "6137c6234afb339e75e764c866e3594900f0211e1315d33779f269bbe2ec6967"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"axum-core", "axum-core",
@@ -282,7 +282,7 @@ dependencies = [
"sync_wrapper", "sync_wrapper",
"tokio", "tokio",
"tower", "tower",
"tower-http 0.3.5", "tower-http",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
] ]
@@ -324,9 +324,9 @@ checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
[[package]] [[package]]
name = "base64ct" name = "base64ct"
version = "1.5.3" version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]] [[package]]
name = "better_scoped_tls" name = "better_scoped_tls"
@@ -581,9 +581,9 @@ dependencies = [
[[package]] [[package]]
name = "const-oid" name = "const-oid"
version = "0.9.1" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913"
[[package]] [[package]]
name = "const_format" name = "const_format"
@@ -619,7 +619,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
"time 0.3.19", "time 0.3.20",
"version_check", "version_check",
] ]
@@ -2798,15 +2798,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "remove_dir_all"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.14" version = "0.11.14"
@@ -3003,7 +2994,7 @@ dependencies = [
[[package]] [[package]]
name = "rustpython-ast" name = "rustpython-ast"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/RustPython/RustPython#f51764f8d0c33e8e3b423e8a80dba00926715360" source = "git+https://github.com/RustPython/RustPython#351d464448607413dc12de6905f1165f8d45af54"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"rustpython-compiler-core", "rustpython-compiler-core",
@@ -3012,7 +3003,7 @@ dependencies = [
[[package]] [[package]]
name = "rustpython-compiler-core" name = "rustpython-compiler-core"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/RustPython/RustPython#f51764f8d0c33e8e3b423e8a80dba00926715360" source = "git+https://github.com/RustPython/RustPython#351d464448607413dc12de6905f1165f8d45af54"
dependencies = [ dependencies = [
"bincode", "bincode",
"bitflags", "bitflags",
@@ -3029,7 +3020,7 @@ dependencies = [
[[package]] [[package]]
name = "rustpython-parser" name = "rustpython-parser"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/RustPython/RustPython#f51764f8d0c33e8e3b423e8a80dba00926715360" source = "git+https://github.com/RustPython/RustPython#351d464448607413dc12de6905f1165f8d45af54"
dependencies = [ dependencies = [
"ahash", "ahash",
"anyhow", "anyhow",
@@ -3083,9 +3074,9 @@ dependencies = [
[[package]] [[package]]
name = "schemars" name = "schemars"
version = "0.8.11" version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a5fb6c61f29e723026dc8e923d94c694313212abbecbbe5f55a7748eec5b307" checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f"
dependencies = [ dependencies = [
"chrono", "chrono",
"dyn-clone", "dyn-clone",
@@ -3097,9 +3088,9 @@ dependencies = [
[[package]] [[package]]
name = "schemars_derive" name = "schemars_derive"
version = "0.8.11" version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f188d036977451159430f3b8dc82ec76364a42b7e289c2b18a9a18f4470058e9" checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -3840,16 +3831,15 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.3.0" version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"libc",
"redox_syscall", "redox_syscall",
"remove_dir_all", "rustix",
"winapi", "windows-sys 0.42.0",
] ]
[[package]] [[package]]
@@ -3926,9 +3916,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.19" version = "0.3.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2" checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
dependencies = [ dependencies = [
"itoa", "itoa",
"serde", "serde",
@@ -3944,9 +3934,9 @@ checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
[[package]] [[package]]
name = "time-macros" name = "time-macros"
version = "0.2.7" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c" checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
dependencies = [ dependencies = [
"time-core", "time-core",
] ]
@@ -4151,25 +4141,6 @@ dependencies = [
"tower-service", "tower-service",
] ]
[[package]]
name = "tower-http"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
dependencies = [
"bitflags",
"bytes",
"futures-core",
"futures-util",
"http",
"http-body",
"http-range-header",
"pin-project-lite",
"tower",
"tower-layer",
"tower-service",
]
[[package]] [[package]]
name = "tower-http" name = "tower-http"
version = "0.4.0" version = "0.4.0"
@@ -4184,6 +4155,7 @@ dependencies = [
"http-body", "http-body",
"http-range-header", "http-range-header",
"pin-project-lite", "pin-project-lite",
"tower",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
"tracing", "tracing",
@@ -4784,7 +4756,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windmill" name = "windmill"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
@@ -4811,7 +4783,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-api" name = "windmill-api"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"argon2", "argon2",
@@ -4844,13 +4816,13 @@ dependencies = [
"sql-builder", "sql-builder",
"sqlx", "sqlx",
"tempfile", "tempfile",
"time 0.3.19", "time 0.3.20",
"tokio", "tokio",
"tokio-tar", "tokio-tar",
"tokio-util", "tokio-util",
"tower", "tower",
"tower-cookies", "tower-cookies",
"tower-http 0.4.0", "tower-http",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"urlencoding", "urlencoding",
@@ -4866,7 +4838,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-api-client" name = "windmill-api-client"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"base64 0.21.0", "base64 0.21.0",
"chrono", "chrono",
@@ -4881,7 +4853,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-audit" name = "windmill-audit"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"chrono", "chrono",
"serde", "serde",
@@ -4894,7 +4866,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-common" name = "windmill-common"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
@@ -4919,7 +4891,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-parser" name = "windmill-parser"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@@ -4927,7 +4899,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-parser-bash" name = "windmill-parser-bash"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools", "itertools",
@@ -4941,7 +4913,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-parser-go" name = "windmill-parser-go"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools", "itertools",
@@ -4953,7 +4925,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-parser-py" name = "windmill-parser-py"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools", "itertools",
@@ -4968,7 +4940,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-parser-ts" name = "windmill-parser-ts"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"deno_core", "deno_core",
@@ -4982,7 +4954,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-queue" name = "windmill-queue"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@@ -5005,7 +4977,7 @@ dependencies = [
[[package]] [[package]]
name = "windmill-worker" name = "windmill-worker"
version = "1.69.2" version = "1.70.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-recursion", "async-recursion",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "windmill" name = "windmill"
version = "1.69.2" version = "1.70.1"
authors.workspace = true authors.workspace = true
edition.workspace = true edition.workspace = true
@@ -19,7 +19,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "1.69.2" version = "1.70.1"
authors = ["Ruben Fiszel <ruben@windmill.dev>"] authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021" edition = "2021"

View File

@@ -0,0 +1 @@
-- Add down migration script here

View File

@@ -1,7 +1,7 @@
openapi: "3.0.3" openapi: "3.0.3"
info: info:
version: 1.69.2 version: 1.70.1
title: Windmill API title: Windmill API
contact: contact:

View File

@@ -6,10 +6,10 @@
* LICENSE-AGPL for a copy of the license. * LICENSE-AGPL for a copy of the license.
*/ */
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
use std::str::FromStr; use std::str::FromStr;
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
use crate::BASE_URL; use crate::BASE_URL;
use crate::{ use crate::{
apps::AppWithLastVersion, apps::AppWithLastVersion,
@@ -20,7 +20,7 @@ use crate::{
utils::require_super_admin, utils::require_super_admin,
HTTP_CLIENT, HTTP_CLIENT,
}; };
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
use axum::response::Redirect; use axum::response::Redirect;
use axum::{ use axum::{
body::StreamBody, body::StreamBody,
@@ -30,7 +30,7 @@ use axum::{
routing::{delete, get, post}, routing::{delete, get, post},
Json, Router, Json, Router,
}; };
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
use stripe::CustomerId; use stripe::CustomerId;
use windmill_audit::{audit_log, ActionKind}; use windmill_audit::{audit_log, ActionKind};
use windmill_common::{ use windmill_common::{
@@ -63,12 +63,13 @@ pub fn workspaced_service() -> Router {
.route("/tarball", get(tarball_workspace)) .route("/tarball", get(tarball_workspace))
.route("/premium_info", get(premium_info)); .route("/premium_info", get(premium_info));
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
let router = { tracing::info!("stripe enabled");
router
.route("/checkout", get(stripe_checkout)) #[cfg(feature = "enterprise")]
.route("/billing_portal", get(stripe_portal)); let router = router
}; .route("/checkout", get(stripe_checkout))
.route("/billing_portal", get(stripe_portal));
router router
} }
@@ -230,13 +231,13 @@ async fn premium_info(
Ok(Json(row)) Ok(Json(row))
} }
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
#[derive(Deserialize)] #[derive(Deserialize)]
struct PlanQuery { struct PlanQuery {
plan: String, plan: String,
} }
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
async fn stripe_checkout( async fn stripe_checkout(
authed: Authed, authed: Authed,
Path(w_id): Path<String>, Path(w_id): Path<String>,
@@ -302,7 +303,7 @@ async fn stripe_checkout(
} }
} }
#[cfg(enterprise)] #[cfg(feature = "enterprise")]
async fn stripe_portal( async fn stripe_portal(
authed: Authed, authed: Authed,
Path(w_id): Path<String>, Path(w_id): Path<String>,

View File

@@ -351,7 +351,10 @@ pub async fn push<'c>(
.unwrap_or(false); .unwrap_or(false);
if !is_super_admin { if !is_super_admin {
if usage > MAX_FREE_EXECS { if usage > MAX_FREE_EXECS
&& !matches!(job_payload, JobPayload::Dependencies { .. })
&& !matches!(job_payload, JobPayload::FlowDependencies { .. })
{
return Err(error::Error::BadRequest(format!( return Err(error::Error::BadRequest(format!(
"User {email} has exceeded the free usage limit of {MAX_FREE_EXECS} that applies outside of premium workspaces." "User {email} has exceeded the free usage limit of {MAX_FREE_EXECS} that applies outside of premium workspaces."
))); )));
@@ -466,10 +469,10 @@ pub async fn push<'c>(
} }
JobPayload::Flow(flow) => { JobPayload::Flow(flow) => {
let value_json = sqlx::query_scalar!( let value_json = sqlx::query_scalar!(
"SELECT value FROM flow WHERE path = $1 AND workspace_id = $2", "SELECT value FROM flow WHERE path = $1 AND workspace_id = $2",
flow, flow,
workspace_id workspace_id
) )
.fetch_optional(&mut tx) .fetch_optional(&mut tx)
.await? .await?
.ok_or_else(|| Error::InternalErr(format!("not found flow at path {:?}", flow)))?; .ok_or_else(|| Error::InternalErr(format!("not found flow at path {:?}", flow)))?;

View File

@@ -383,7 +383,7 @@ lazy_static::lazy_static! {
.unwrap(); .unwrap();
static ref WORKER_UPTIME_OPTS: prometheus::Opts = prometheus::opts!( static ref WORKER_UPTIME_OPTS: prometheus::Opts = prometheus::opts!(
"worker_uptime", "worker_uptime",
"Total number of milliseconds since the worker has started" "Total number of seconds since the worker has started"
); );
static ref TIMEOUT: u16 = std::env::var("TIMEOUT") static ref TIMEOUT: u16 = std::env::var("TIMEOUT")
@@ -445,15 +445,11 @@ pub async fn run_worker(
insert_initial_ping(worker_instance, &worker_name, ip, db).await; insert_initial_ping(worker_instance, &worker_name, ip, db).await;
let uptime_metric = prometheus::register_int_counter!(WORKER_UPTIME_OPTS let uptime_metric = prometheus::register_counter!(WORKER_UPTIME_OPTS
.clone() .clone()
.const_label("name", &worker_name)) .const_label("name", &worker_name))
.unwrap(); .unwrap();
uptime_metric.inc_by(
((Instant::now() - start_time).as_millis() - uptime_metric.get() as u128)
.try_into()
.unwrap(),
);
let worker_execution_duration = prometheus::register_histogram_vec!( let worker_execution_duration = prometheus::register_histogram_vec!(
prometheus::HistogramOpts::new( prometheus::HistogramOpts::new(
@@ -465,6 +461,14 @@ pub async fn run_worker(
) )
.expect("register prometheus metric"); .expect("register prometheus metric");
let worker_execution_duration_counter = prometheus::register_counter!(prometheus::opts!(
"worker_execution_duration_counter",
"Total number of seconds spent executing jobs"
)
.const_label("name", &worker_name))
.expect("register prometheus metric");
let worker_sleep_duration = prometheus::register_histogram!(prometheus::HistogramOpts::new( let worker_sleep_duration = prometheus::register_histogram!(prometheus::HistogramOpts::new(
"worker_sleep_duration", "worker_sleep_duration",
"Duration sleeping waiting for job", "Duration sleeping waiting for job",
@@ -472,6 +476,15 @@ pub async fn run_worker(
.const_label("name", &worker_name),) .const_label("name", &worker_name),)
.expect("register prometheus metric"); .expect("register prometheus metric");
let worker_sleep_duration_counter = prometheus::register_counter!(prometheus::opts!(
"worker_execution_sleep_counter",
"Total number of seconds spent sleeping between pulling jobs from the queue"
)
.const_label("name", &worker_name))
.expect("register prometheus metric");
let worker_pull_duration = prometheus::register_histogram!(prometheus::HistogramOpts::new( let worker_pull_duration = prometheus::register_histogram!(prometheus::HistogramOpts::new(
"worker_pull_duration", "worker_pull_duration",
"Duration pulling next job", "Duration pulling next job",
@@ -479,6 +492,13 @@ pub async fn run_worker(
.const_label("name", &worker_name),) .const_label("name", &worker_name),)
.expect("register prometheus metric"); .expect("register prometheus metric");
let worker_pull_duration_counter = prometheus::register_counter!(prometheus::opts!(
"worker_pull_sleep_counter",
"Total number of seconds spent pulling jobs (if growing large the db is undersized)"
)
.const_label("name", &worker_name))
.expect("register prometheus metric");
let worker_execution_failed = prometheus::register_int_counter_vec!( let worker_execution_failed = prometheus::register_int_counter_vec!(
prometheus::Opts::new("worker_execution_failed", "Number of failed jobs",) prometheus::Opts::new("worker_execution_failed", "Number of failed jobs",)
.const_label("name", &worker_name), .const_label("name", &worker_name),
@@ -526,11 +546,12 @@ pub async fn run_worker(
worker_busy.set(0); worker_busy.set(0);
uptime_metric.inc_by( uptime_metric.inc_by(
((Instant::now() - start_time).as_millis() - uptime_metric.get() as u128) (((Instant::now() - start_time).as_millis() as f64)/1000.0 - uptime_metric.get())
.try_into() .try_into()
.unwrap(), .unwrap(),
); );
let do_break = async { let do_break = async {
if last_ping.elapsed().as_secs() > NUM_SECS_ENV_CHECK { if last_ping.elapsed().as_secs() > NUM_SECS_ENV_CHECK {
sqlx::query!( sqlx::query!(
@@ -574,7 +595,8 @@ pub async fn run_worker(
(job, timer) = { (job, timer) = {
let timer = worker_pull_duration.start_timer(); let timer = worker_pull_duration.start_timer();
pull(&db, WHITELIST_WORKSPACES.clone(), BLACKLIST_WORKSPACES.clone()).map(|x| (x, timer)) } => { pull(&db, WHITELIST_WORKSPACES.clone(), BLACKLIST_WORKSPACES.clone()).map(|x| (x, timer)) } => {
drop(timer); let duration_pull_s = timer.stop_and_record();
worker_pull_duration_counter.inc_by(duration_pull_s);
(false, job) (false, job)
}, },
} }
@@ -680,6 +702,8 @@ pub async fn run_worker(
.await; .await;
}; };
let duration = _timer.stop_and_record();
worker_execution_duration_counter.inc_by(duration);
if !*KEEP_JOB_DIR && !(is_flow && same_worker) { if !*KEEP_JOB_DIR && !(is_flow && same_worker) {
let _ = tokio::fs::remove_dir_all(job_dir).await; let _ = tokio::fs::remove_dir_all(job_dir).await;
@@ -689,9 +713,9 @@ pub async fn run_worker(
let _timer = worker_sleep_duration let _timer = worker_sleep_duration
.start_timer(); .start_timer();
tokio::time::sleep(Duration::from_millis(*SLEEP_QUEUE)).await; tokio::time::sleep(Duration::from_millis(*SLEEP_QUEUE)).await;
let duration = _timer.stop_and_record();
worker_sleep_duration_counter.inc_by(duration);
} }
Err(err) => { Err(err) => {
tracing::error!(worker = %worker_name, "run_worker: pulling jobs: {}", err); tracing::error!(worker = %worker_name, "run_worker: pulling jobs: {}", err);

View File

@@ -1,6 +1,6 @@
// windmill // windmill
export { setClient } from "https://deno.land/x/windmill@v1.66.0/mod.ts"; export { setClient } from "https://deno.land/x/windmill@v1.69.3/mod.ts";
export * from "https://deno.land/x/windmill@v1.66.0/windmill-api/index.ts"; export * from "https://deno.land/x/windmill@v1.69.3/windmill-api/index.ts";
// cliffy // cliffy
export { Command } from "https://deno.land/x/cliffy@v0.25.7/command/command.ts"; export { Command } from "https://deno.land/x/cliffy@v0.25.7/command/command.ts";

View File

@@ -51,9 +51,11 @@ export async function browserLogin(
const url = `${baseUrl}user/cli?port=${port}` const url = `${baseUrl}user/cli?port=${port}`
console.log(`Login by going to ${url}`); console.log(`Login by going to ${url}`);
try { try {
open(url) await open(url)
console.log("Opened browser for you"); console.log("Opened browser for you");
} catch { } } catch {
console.error(`Failed to open browser, please navigate to ${url}`)
}
const firstConnection = await server.accept(); const firstConnection = await server.accept();
const httpFirstConnection = Deno.serveHttp(firstConnection); const httpFirstConnection = Deno.serveHttp(firstConnection);
const firstRequest = (await httpFirstConnection.nextRequest())!; const firstRequest = (await httpFirstConnection.nextRequest())!;

View File

@@ -13,7 +13,7 @@ import sync from "./sync.ts";
import { tryResolveVersion } from "./context.ts"; import { tryResolveVersion } from "./context.ts";
import { GlobalOptions } from "./types.ts"; import { GlobalOptions } from "./types.ts";
const VERSION = "v1.69.2"; const VERSION = "v1.70.1";
let command: any = new Command() let command: any = new Command()
.name("wmill") .name("wmill")

View File

@@ -9,7 +9,7 @@
"lock": "", "lock": "",
"path": null, "path": null,
"type": "rawscript", "type": "rawscript",
"content": "// import * as wmill from \"https://deno.land/x/windmill@v1.50.0/mod.ts\"\n\nexport async function main(x: string) {\n console.log(\"Hello from Deno! The argument x is \" + x);\n return x;\n}\n", "content": "// import * as wmill from \"https://deno.land/x/windmill@v1.69.3/mod.ts\"\n\nexport async function main(x: string) {\n console.log(\"Hello from Deno! The argument x is \" + x);\n return x;\n}\n",
"language": "deno", "language": "deno",
"input_transforms": { "input_transforms": {
"x": { "x": {

View File

@@ -1,12 +1,12 @@
{ {
"name": "windmill", "name": "windmill",
"version": "1.69.2", "version": "1.70.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "windmill", "name": "windmill",
"version": "1.69.2", "version": "1.70.1",
"dependencies": { "dependencies": {
"@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1",

View File

@@ -1,6 +1,6 @@
{ {
"name": "windmill", "name": "windmill",
"version": "1.69.2", "version": "1.70.1",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "vite build", "build": "vite build",

View File

@@ -36,7 +36,6 @@
import UnsavedConfirmationModal from '$lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte' import UnsavedConfirmationModal from '$lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte'
import { page } from '$app/stores' import { page } from '$app/stores'
import CssSettings from './componentsPanel/CssSettings.svelte' import CssSettings from './componentsPanel/CssSettings.svelte'
import { findGridItem } from './appUtils'
export let app: App export let app: App
export let path: string export let path: string

View File

@@ -5,6 +5,7 @@
import { columnConfiguration, isFixed, toggleFixed } from '../gridUtils' import { columnConfiguration, isFixed, toggleFixed } from '../gridUtils'
import type { AppEditorContext, GridItem } from '../types' import type { AppEditorContext, GridItem } from '../types'
import Component from './component/Component.svelte' import Component from './component/Component.svelte'
import { findGridItem } from './appUtils'
export let containerHeight: number export let containerHeight: number
export let noPadding = false export let noPadding = false
@@ -48,7 +49,7 @@
} }
function lock(gridComponent: GridItem) { function lock(gridComponent: GridItem) {
let fComponent = $app.grid.find((c) => c.id === gridComponent.id) let fComponent = findGridItem($app, gridComponent.data.id)
if (fComponent) { if (fComponent) {
fComponent = toggleFixed(fComponent) fComponent = toggleFixed(fComponent)
} }

View File

@@ -1,6 +1,6 @@
import { getNextId } from '$lib/components/flows/flowStateUtils' import { getNextId } from '$lib/components/flows/flowStateUtils'
import type { App, FocusedGrid, GridItem } from '../types' import type { App, FocusedGrid, GridItem } from '../types'
import { Component, getRecommendedDimensionsByComponent, type AppComponent } from './component' import { getRecommendedDimensionsByComponent, type AppComponent } from './component'
import gridHelp from '@windmill-labs/svelte-grid/src/utils/helper' import gridHelp from '@windmill-labs/svelte-grid/src/utils/helper'
import { gridColumns } from '../gridUtils' import { gridColumns } from '../gridUtils'
import { allItems } from '../utils' import { allItems } from '../utils'
@@ -10,27 +10,11 @@ function findGridItemById(
subGrids: Record<string, GridItem[]> | undefined, subGrids: Record<string, GridItem[]> | undefined,
id: string id: string
): GridItem | undefined { ): GridItem | undefined {
for (const gridItem of root) { for (const gridItem of allItems(root, subGrids)) {
if (gridItem.id === id) { if (gridItem.id === id) {
return gridItem return gridItem
} }
if (subGrids) {
const numberOfSubgrids = gridItem.data.numberOfSubgrids
if (numberOfSubgrids) {
for (let i = 0; i < numberOfSubgrids; i++) {
const subgrid = subGrids[`${gridItem.id}-${i}`] ?? []
const found = findGridItemById(subgrid, subGrids, id)
if (found) {
return found
}
}
}
}
} }
return undefined return undefined
} }

View File

@@ -21,7 +21,7 @@
} }
} }
$: runnables = getAppScripts($lazyGrid) $: runnables = getAppScripts($lazyGrid, $app.subgrids)
// When selected component changes, update selectedScriptComponentId // When selected component changes, update selectedScriptComponentId
$: if ($selectedComponent != selectedScriptComponentId) { $: if ($selectedComponent != selectedScriptComponentId) {

View File

@@ -1,11 +1,11 @@
import type { Schema } from "$lib/common"; import type { Schema } from '$lib/common'
import type { AppInputs, Runnable } from "../../inputType" import type { AppInputs, Runnable } from '../../inputType'
import type { GridItem } from "../../types" import type { GridItem } from '../../types'
import { fieldTypeToTsType, schemaToInputsSpec } from "../../utils"; import { fieldTypeToTsType, schemaToInputsSpec } from '../../utils'
import type { AppComponent } from "../component"; import type { AppComponent } from '../component'
export interface AppScriptsList { export interface AppScriptsList {
inline: { name: string; id: string }[], inline: { name: string; id: string }[]
imported: { name: string; id: string }[] imported: { name: string; id: string }[]
} }
@@ -42,38 +42,50 @@ export function computeFields(schema: Schema, defaultUserInput: boolean, fields:
return result return result
} }
export function getAppScripts(grid: GridItem[]) { function processGridItemRunnable(gridItem: GridItem, list: AppScriptsList): AppScriptsList {
return grid.reduce((acc, gridComponent) => { const component: AppComponent = gridItem.data
const component: AppComponent = gridComponent.data const componentInput = component.componentInput
const componentInput = component.componentInput if (component.type === 'tablecomponent') {
component.actionButtons.forEach((actionButton) => {
if (actionButton.componentInput?.type !== 'runnable') {
return
}
processRunnable(actionButton.componentInput.runnable, actionButton.id, list)
})
}
if (componentInput?.type === 'runnable') {
processRunnable(componentInput.runnable, gridItem.id, list)
}
return list
}
if (component.type === 'tablecomponent') { export function getAppScripts(
component.actionButtons.forEach((actionButton) => { lazyGrid: GridItem[],
if (actionButton.componentInput?.type !== 'runnable') { return } subgrids: Record<string, GridItem[]> | undefined
processRunnable( ): AppScriptsList {
actionButton.componentInput.runnable, const scriptsList = lazyGrid.reduce(
actionButton.id, (acc, gridComponent) => processGridItemRunnable(gridComponent, acc),
acc { inline: [], imported: [] } as AppScriptsList
) )
if (subgrids) {
Object.values(subgrids).forEach((subgrid: GridItem[]) => {
subgrid.forEach((subgridComponent: GridItem) => {
processGridItemRunnable(subgridComponent, scriptsList)
}) })
} })
if (componentInput?.type === 'runnable') { }
processRunnable(
componentInput.runnable,
gridComponent.id,
acc
)
}
return acc return scriptsList
}, { inline: [], imported: [] } as AppScriptsList)
} }
function processRunnable(runnable: Runnable, id: string, list: AppScriptsList) { function processRunnable(runnable: Runnable, id: string, list: AppScriptsList) {
if (runnable?.type === undefined) { return } if (runnable?.type === undefined) {
return
}
const type: keyof AppScriptsList = runnable.type === 'runnableByPath' ? 'imported' : 'inline' const type: keyof AppScriptsList = runnable.type === 'runnableByPath' ? 'imported' : 'inline'
list[type].push({ list[type].push({
name: runnable[runnable.type === 'runnableByPath' ? 'path' : 'name'], name: runnable[runnable.type === 'runnableByPath' ? 'path' : 'name'],
id id
}) })
} }

View File

@@ -4,7 +4,13 @@
import { faCopy } from '@fortawesome/free-solid-svg-icons' import { faCopy } from '@fortawesome/free-solid-svg-icons'
import { getContext } from 'svelte' import { getContext } from 'svelte'
import type { App, AppEditorContext } from '../../types' import type { App, AppEditorContext } from '../../types'
import { createNewGridItem, deleteGridItem, findGridItem, insertNewGridItem } from '../appUtils' import {
createNewGridItem,
deleteGridItem,
findGridItem,
getAllSubgridsAndComponentIds,
insertNewGridItem
} from '../appUtils'
import type { AppComponent } from '../component' import type { AppComponent } from '../component'
export let component: AppComponent | undefined export let component: AppComponent | undefined
@@ -73,6 +79,8 @@
value: 'main-grid', value: 'main-grid',
disabled: parent === undefined disabled: parent === undefined
} }
$: [subgrids] = component ? getAllSubgridsAndComponentIds($app, component) : [[], []]
$: availableGrids = listAllSubGrids($app) $: availableGrids = listAllSubGrids($app)
$: options = availableGrids $: options = availableGrids
? [ ? [
@@ -80,7 +88,7 @@
...availableGrids?.map((grid) => ({ ...availableGrids?.map((grid) => ({
label: grid, label: grid,
value: grid, value: grid,
disabled: grid === parent || (component && grid.startsWith(component.id)) disabled: grid === parent || subgrids.includes(grid)
})) }))
] ]
: [defaultOption] : [defaultOption]

View File

@@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi" name = "pypi"
[packages] [packages]
wmill = ">=1.69.2" wmill = ">=1.70.1"
wmill_pg = ">=1.69.2" wmill_pg = ">=1.70.1"
sendgrid = "*" sendgrid = "*"
mysql-connector-python = "*" mysql-connector-python = "*"
pymongo = "*" pymongo = "*"

View File

@@ -1,7 +1,7 @@
openapi: "3.0.3" openapi: "3.0.3"
info: info:
version: 1.69.2 version: 1.70.1
title: OpenFlow Spec title: OpenFlow Spec
contact: contact:
name: Ruben Fiszel name: Ruben Fiszel

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "wmill" name = "wmill"
version = "1.69.2" version = "1.70.1"
description = "A client library for accessing Windmill server wrapping the Windmill client API" description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://windmill.dev" homepage = "https://windmill.dev"
@@ -16,7 +16,7 @@ include = ["wmill/py.typed"]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.7" python = "^3.7"
windmill-api = "^1.69.2" windmill-api = "^1.70.1"
[build-system] [build-system]
requires = ["poetry>=1.0.2", "poetry-dynamic-versioning"] requires = ["poetry>=1.0.2", "poetry-dynamic-versioning"]

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "wmill-pg" name = "wmill-pg"
version = "1.69.2" version = "1.70.1"
description = "An extension client for the wmill client library focused on pg" description = "An extension client for the wmill client library focused on pg"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://windmill.dev" homepage = "https://windmill.dev"

View File

@@ -1 +1 @@
1.69.3 1.70.1