diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ec50d9..570df7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ All notable changes to this project will be documented in this file. +## [1.8.0] - 2026-04-06 + +### Added + +- **wfe-kubernetes**: New crate -- Kubernetes executor for running workflow steps as K8s Jobs + - Namespace-per-workflow isolation with automatic cleanup + - Job manifest builder with env, resources, pull policy, node selector support + - Pod log streaming to LogSink with real-time output capture + - `##wfe[output key=value]` parsing from Job stdout + - Timeout handling with Job cleanup on expiry + - `KubernetesServiceProvider`: provisions infrastructure services as K8s Pods + Services with DNS resolution and readiness polling + - 100% test coverage on service provider, 91% overall crate coverage +- **wfe-core**: `ServiceDefinition`, `ServicePort`, `ReadinessProbe`, `ServiceEndpoint` types for declaring infrastructure services +- **wfe-core**: `ServiceProvider` trait for pluggable service provisioning +- **wfe-core**: `services` field on `WorkflowDefinition` for declaring required services +- **wfe**: Capability-based workflow routing -- hosts check `can_execute()` before accepting workflows + - Verifies all step types are registered in the StepRegistry + - Verifies ServiceProvider is configured and can provision required services + - Re-queues workflows that can't be handled by this host +- **wfe**: Service lifecycle in dequeue loop -- provision before execution, teardown after completion/failure +- **wfe**: `use_service_provider()` on `WorkflowHostBuilder` +- **wfe-containerd**: `ContainerdServiceProvider` for running services via containerd gRPC API on host network +- **wfe-yaml**: `services:` block in workflow YAML definitions with readiness probes (exec, tcp, http) +- **wfe-yaml**: `kubernetes`/`k8s` step type with lazy client creation + ## [1.7.0] - 2026-04-05 ### Added diff --git a/Cargo.toml b/Cargo.toml index d55c921..cb0cdbd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["wfe-core", "wfe-sqlite", "wfe-postgres", "wfe-opensearch", "wfe-valk resolver = "2" [workspace.package] -version = "1.7.0" +version = "1.8.0" edition = "2024" license = "MIT" repository = "https://src.sunbeam.pt/studio/wfe" @@ -38,16 +38,16 @@ redis = { version = "0.27", features = ["tokio-comp", "connection-manager"] } opensearch = "2" # Internal crates -wfe-core = { version = "1.7.0", path = "wfe-core", registry = "sunbeam" } -wfe-sqlite = { version = "1.7.0", path = "wfe-sqlite", registry = "sunbeam" } -wfe-postgres = { version = "1.7.0", path = "wfe-postgres", registry = "sunbeam" } -wfe-opensearch = { version = "1.7.0", path = "wfe-opensearch", registry = "sunbeam" } -wfe-valkey = { version = "1.7.0", path = "wfe-valkey", registry = "sunbeam" } -wfe-yaml = { version = "1.7.0", path = "wfe-yaml", registry = "sunbeam" } -wfe-buildkit = { version = "1.7.0", path = "wfe-buildkit", registry = "sunbeam" } -wfe-containerd = { version = "1.7.0", path = "wfe-containerd", registry = "sunbeam" } -wfe-rustlang = { version = "1.7.0", path = "wfe-rustlang", registry = "sunbeam" } -wfe-kubernetes = { version = "1.7.0", path = "wfe-kubernetes", registry = "sunbeam" } +wfe-core = { version = "1.8.0", path = "wfe-core", registry = "sunbeam" } +wfe-sqlite = { version = "1.8.0", path = "wfe-sqlite", registry = "sunbeam" } +wfe-postgres = { version = "1.8.0", path = "wfe-postgres", registry = "sunbeam" } +wfe-opensearch = { version = "1.8.0", path = "wfe-opensearch", registry = "sunbeam" } +wfe-valkey = { version = "1.8.0", path = "wfe-valkey", registry = "sunbeam" } +wfe-yaml = { version = "1.8.0", path = "wfe-yaml", registry = "sunbeam" } +wfe-buildkit = { version = "1.8.0", path = "wfe-buildkit", registry = "sunbeam" } +wfe-containerd = { version = "1.8.0", path = "wfe-containerd", registry = "sunbeam" } +wfe-rustlang = { version = "1.8.0", path = "wfe-rustlang", registry = "sunbeam" } +wfe-kubernetes = { version = "1.8.0", path = "wfe-kubernetes", registry = "sunbeam" } # YAML serde_yaml = "0.9" diff --git a/wfe-buildkit/Cargo.toml b/wfe-buildkit/Cargo.toml index 308ac7c..b0f74f4 100644 --- a/wfe-buildkit/Cargo.toml +++ b/wfe-buildkit/Cargo.toml @@ -16,7 +16,7 @@ async-trait = { workspace = true } tracing = { workspace = true } thiserror = { workspace = true } regex = { workspace = true } -wfe-buildkit-protos = { version = "1.7.0", path = "../wfe-buildkit-protos", registry = "sunbeam" } +wfe-buildkit-protos = { version = "1.8.0", path = "../wfe-buildkit-protos", registry = "sunbeam" } tonic = "0.14" tower = { version = "0.4", features = ["util"] } hyper-util = { version = "0.1", features = ["tokio"] } diff --git a/wfe-containerd/Cargo.toml b/wfe-containerd/Cargo.toml index cabd1d3..ac568c7 100644 --- a/wfe-containerd/Cargo.toml +++ b/wfe-containerd/Cargo.toml @@ -9,7 +9,7 @@ description = "containerd container runner executor for WFE" [dependencies] wfe-core = { workspace = true } -wfe-containerd-protos = { version = "1.7.0", path = "../wfe-containerd-protos", registry = "sunbeam" } +wfe-containerd-protos = { version = "1.8.0", path = "../wfe-containerd-protos", registry = "sunbeam" } tokio = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/wfe-deno/Cargo.toml b/wfe-deno/Cargo.toml index aa9237b..6cf6178 100644 --- a/wfe-deno/Cargo.toml +++ b/wfe-deno/Cargo.toml @@ -9,7 +9,7 @@ description = "Deno bindings for the WFE workflow engine" [dependencies] wfe-core = { workspace = true, features = ["test-support"] } -wfe = { version = "1.7.0", path = "../wfe", registry = "sunbeam" } +wfe = { version = "1.8.0", path = "../wfe", registry = "sunbeam" } deno_core = { workspace = true } deno_error = { workspace = true } tokio = { workspace = true } diff --git a/wfe-server/Cargo.toml b/wfe-server/Cargo.toml index d1bf11e..1c5a2bc 100644 --- a/wfe-server/Cargo.toml +++ b/wfe-server/Cargo.toml @@ -14,9 +14,9 @@ path = "src/main.rs" [dependencies] # Internal wfe-core = { workspace = true, features = ["test-support"] } -wfe = { version = "1.7.0", path = "../wfe", registry = "sunbeam" } -wfe-yaml = { version = "1.7.0", path = "../wfe-yaml", registry = "sunbeam", features = ["rustlang", "buildkit", "containerd"] } -wfe-server-protos = { version = "1.7.0", path = "../wfe-server-protos", registry = "sunbeam" } +wfe = { version = "1.8.0", path = "../wfe", registry = "sunbeam" } +wfe-yaml = { version = "1.8.0", path = "../wfe-yaml", registry = "sunbeam", features = ["rustlang", "buildkit", "containerd"] } +wfe-server-protos = { version = "1.8.0", path = "../wfe-server-protos", registry = "sunbeam" } wfe-sqlite = { workspace = true } wfe-postgres = { workspace = true } wfe-valkey = { workspace = true }