pub enum Workload {
MesofactStatic(MesofactStaticWorkload),
Container(WorkloadSpec),
Almanac(AlmanacManifest),
StaticAsset(StaticAssetWorkload),
}Expand description
On-disk workload.toml manifest. Each variant matches one
ServiceComponent.kind value; the kind field on the wire is the serde
discriminator.
This is the on-disk envelope — distinct from WorkloadSpec, the
containerd wire format yubaba receives over RPC. A kind = "container"
workload deserializes its remaining fields as a WorkloadSpec; other
kinds carry their own per-reconciler payload shape.
Never put #[serde(skip_serializing_if = "Option::is_none")] on a field
of this enum or any type it reaches. These types ride the kamaji-proto
postcard wire, which is non-self-describing and positional:
skip_serializing_if omits the field’s byte on serialize while decode still
expects to read it at that offset, so the byte stream misaligns and the
round-trip fails. Use #[serde(default)] + #[ts(optional = nullable)]
instead — that still gives TOML/JSON back-compat (missing field → None)
while the field is always encoded. MesofactStaticWorkload::ssr_runtime and
::serve_bundle are the reference shape.
Two wire shapes, one type (R546-B7). Serialize/Deserialize are
hand-written and branch on is_human_readable:
- TOML/JSON (human-readable) → internally tagged on
kind, i.e. the flat shape every on-diskworkload.tomlactually uses (kind = "static-asset"besideschema_version,[[asset]],[aliases]). - postcard (binary) → externally tagged, byte-identical to the derived representation R590-B3 established for the kamaji UDS.
Why not just #[serde(tag = "kind")]: internal tagging buffers through
deserialize_any, which postcard (non-self-describing) refuses with
WontImplement — that is exactly the failure R590-B3 fixed by flipping this
enum to external tagging. But external tagging wants a single-key map, so
every flat on-disk file then failed with wanted exactly 1 element, more than 1 element and yah cloud apply broke for every static-asset
component. Branching on the format satisfies both, and mirrors what
ImageRef already does for its string-vs-struct form.
Variants§
MesofactStatic(MesofactStaticWorkload)
Static-site build that publishes an artifact directory to the
service’s static provider slot. Reconciled by the
mesofact-static reconciler — does not deploy to yubaba.
Container(WorkloadSpec)
Containerd workload handed to yubaba over RPC. The inline fields
are the full WorkloadSpec minus the kind discriminator.
This is also the shape of the W267 sovereign-public-ingress appliance
(R594-F2): a container-kind workload with archetype = Some(LifecycleArchetype::Appliance) and
requires_taint() == Some(PUBLIC_IP_TAINT), not a dedicated
Workload::ingress(..) variant. It runs an ordinary OCI image (the
passway proxy, R594-F4) supervised by kamaji exactly like any other
Container, so no admission-list or wire-codec change was needed to
let kamaji accept it. A new enum variant would have forced an
exhaustive-match update in every Workload consumer, including
peer-owned kamaji-proto/src/codec.rs — the archetype + annotation
combination expresses “this is the public ingress appliance” without
that blast radius. See WorkloadSpec::requires_taint and
LifecycleArchetype::Appliance.
Almanac(AlmanacManifest)
Data-pipeline job with declared I/O and a readiness policy. The
orchestrator checks all inputs are reachable before each run and
verifies outputs afterward. Generalises the OpenRouter JSON-cache
refresher (spawn_almanac_refresher) to the full manifest form.
StaticAsset(StaticAssetWorkload)
Content-addressed static files uploaded to the mirror’s object_store
provider slot. Wave-0 by default — gating mesofact and container waves.
Rollback is a pointer-flip via mirror.toml [asset_aliases]; bytes are
append-only and never re-pushed on rollback. See W160.
Implementations§
Source§impl Workload
impl Workload
Sourcepub fn kind_str(&self) -> &'static str
pub fn kind_str(&self) -> &'static str
The kind discriminator this variant serializes as — the same string a
workload.toml writes and a ServiceComponent.kind names.
Lives here rather than at a call site because this enum now has FIVE places that enumerate its variants (itself plus the four tagging mirrors below); a caller-local match would be a sixth, in another crate, with nothing to force it to keep up.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Workload
impl<'de> Deserialize<'de> for Workload
Source§fn deserialize<D>(de: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(de: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
impl StructuralPartialEq for Workload
Source§impl TS for Workload
impl TS for Workload
Source§type WithoutGenerics = Workload
type WithoutGenerics = Workload
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or (). The only requirement for these dummy types is that
EXPORT_TO must be None. Read moreSource§type OptionInnerType = Workload
type OptionInnerType = Workload
std::option::Option<T>, then this associated type is set to T.
All other implementations of TS should set this type to Self instead.Source§fn docs() -> Option<String>
fn docs() -> Option<String>
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn decl_concrete(cfg: &Config) -> String
fn decl_concrete(cfg: &Config) -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl(cfg: &Config) -> String
fn decl(cfg: &Config) -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline(cfg: &Config) -> String
fn inline(cfg: &Config) -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened(cfg: &Config) -> String
fn inline_flattened(cfg: &Config) -> String
Source§fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn output_path() -> Option<PathBuf>
fn output_path() -> Option<PathBuf>
T should be exported, relative to the output directory.
The returned path does not include any base directory. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
Source§fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export. Read more