Replies: 1 comment
|
My lean: adopt this RFC, with two constraints that should be explicit in the ADR:
Reasoning, anchored on the EBU whitepaper as north star:
My answers to the open questions: 1. Single vs multi workload membership Use exactly zero or one If a future function genuinely serves multiple productions, I would model that through connection/flow intent or explicit shared-resource semantics, not by making one instance silently belong to multiple workloads. Shared support/control systems like NMOS should remain shared facility/support functions unless deliberately instantiated into one production workload. 2. Which lifecycle stages v0.2 derives Derive only stages the current signals can support:
For 3. Console IA / API Yes: reserve Media Workloads for the assembly. Rename the flat per-function surface to Media Functions or Function Instances. API preference: do not silently reshape the existing
During migration, either keep the current flat 4. Preserve foreign tags vs re-stamp workload Choose option a: launchers preserve foreign/non-owned tags. The launcher owns lifecycle replacement plus deliberate static/monitoring stamp domains; it should not erase Threading Last point: I agree with the narrow vertical correction. The EBU verticals are cross-cutting, so |
Uh oh!
There was an error while loading. Please reload this page.
RFC: First-class Media Workload entity (assembly of Media Functions) via NetBox tags
Category: RFC (→ ADR when converged, per CONTRIBUTING RFC→ADR pipeline)
Author: @znerol2 (with Claude)
Date: 2026-07-08 (rev 3 — codex R2 consistency fixes: #185 state, vertical acceptance)
Amends: ADR-0037 (Media Workloads = NetBox Media Function instance inventory) — as a tag-derived virtual grouping; no NetBox graph object
Touches: ADR-0003 (EBU v2 taxonomy), ADR-0013 (catalog model), ADR-0027 (catalog/instance separation), ADR-0032 (scoped NetBox writer)
Status: Draft for discussion
Summary
Introduce a Media Workload as a first-class grouping in DMF: an assembly of
Media Functions that together serve a specific production (EBU DMF Reference
Architecture V2.0: "Media Functions are combined to implement Media Workloads";
Annex B Figure B1). Membership is a derived grouping over existing NetBox
instance records, keyed by a
workload:<slug>tag — not a new NetBox graphobject. The
videotestworkload (mxl-videotestsrc+mxl-videotest-view) isthe first worked example.
The RFC also corrects two vocabulary drifts (loosely "L1/L2") — but narrowly,
per the whitepaper: the six-stage lifecycle is workload-scoped (Fig 1 is titled
Media Workload Lifecycle), and the catalog
verticalbug is only thenon-vertical values on media-processing entries, not a claim that Layer-5
functions can't carry a vertical.
Context / problem
Canon agrees with the whitepaper (
docs/architecture/DMF EBU Mapping): a MediaWorkload = assembly of Media Functions for a production; a Media Function =
a unit acting on media streams/files/objects, provisioned as one or more
Containers.
DMF has no Media Workload entity. ADR-0037 deliberately modelled the
console's "Media Workloads" page as a NetBox-driven Media Function instance
inventory and deferred the assembly (it explicitly declines to model a workload
graph object). As the MXL demo grows past one function, the assembly is the unit
the operator reasons about — its lifecycle, its future switch target, its
resource budget — and there is nowhere to hang those.
Proposal
1. The entity (a derived grouping, not a graph object)
A Media Workload is a named assembly of Media Functions serving one
production. It is derived from instance records; it owns no persisted graph.
It has: a scoped identity, its member functions, and (as a non-persisted
overlay) the flows among them.
2. Membership via NetBox tag — with a durability contract
Each member service carries
workload:<slug>alongsideapp:/lifecycle:tags.This fits ADR-0037's three-store model (NetBox owns the instance record).
P1 blocker to resolve before implementation — tag durability. The current
launchers PATCH exact tag lists, so a separately-stamped
workload:tag iserased mid-lifecycle. Concretely (
dmf-runbooks/roles/mxl): provision PATCHesnetbox_service_tags + netbox_service_monitoring_tags; configure PATCHesnetbox_service_active_tags + netbox_service_monitoring_tags; finalise PATCHesnetbox_service_tags— none preserve a foreignworkload:tag. Acceptancerequirement: either (a) make every launcher tag-flip preserve unknown/
non-owned tags and only replace its owned prefixes (
lifecycle:*+ thedeliberate monitoring stamp), or (b) thread
workloadthrough launcherdefaults/catalog metadata so it is re-stamped on every flip. Ship a
backfill/migration test proving
workload:videotestsurvives a fullprovision→configure→finalise cycle on both MXL services.
3. Identity & cardinality contract
(tenant/site/scope, workload_slug);workload:<slug>is agrouping key applied only after the console's existing tenant/site scoping.
workload:*per service for v0.2. Two ormore is invalid/degraded, surfaced as such — never silently multi-member.
workload:tag isshown in an explicit
unassignedbucket (not a synthetic single-functionworkload). One code path, not two.
4. Flows are an overlay, never the membership source (ADR-0037 preserved)
Membership is the tag. Flow edges are a separate overlay and are never
persisted to NetBox:
carry
mxl_flows.produces/consumeson source/view).Do not derive membership from live flow observation. And do not define a
Workload as only the flows between its members — Annex B Figure B2 shows
workloads interconnecting/feeding each other, so future flow edges may cross
workload boundaries.
5. Worked example — the
videotestworkloadTwo functions + one flow: the smallest demonstrator of the B1 pattern — not a
literal miniature (B1 is a many-role, multi-vendor production with UI surfaces and
outputs).
6. Console (reframes L1) — with a rollup caveat
The "Media Workloads" page becomes workload-first: top level lists Workloads;
each expands to its member Functions (WP-C's tile/table becomes per-function
detail inside a workload). The workload shows an EBU lifecycle stage; each
function keeps its run-state.
Lifecycle, but the whitepaper also defines function-orchestration activities
(identify → download/update → assign licences → launch → configure →
stop/release). So: a function-instance
lifecycle:*tag is desired/run intent;the six-stage journey is the workload's. This is a useful console framing, not
an absolute ontology claim.
running/failingcannot yieldDesign/Plan/ Finalise & Review. v0.2 derives only the stages telemetry can support (roughlyProvision/Configure/Operate) and shows the rest as declared or unknown — or
defers workload-stage derivation entirely until instance-level telemetry exists.
dmf-cms/media_workloads.pycurrently rolls observedstate up by Prometheus
applabel and collapses multiple instances per app.That cannot drive per-workload health/lifecycle once two instances of one
function key live in different workloads. Acceptance gate: workload grouping
and health/lifecycle rollups must join by NetBox service/instance identity,
or the RFC must explicitly defer lifecycle derivation until instance-level
telemetry lands.
7. Classification (reframes L2) — narrowly
Verticals are cross-cutting and apply at every layer (mapping doc §verticals;
the whitepaper's Media Functions chapter itself has Orchestration/Control/
Monitoring/Security subsections). So:
nmos-cpp(layer:5,orchestration) andnmos-crosspoint(layer:5,control) are not invalid.(
mxl-videotestsrc/view→media-functions;mxl-hello→media-processing).layer:5+ amedia_function_type/role (source, view, mixer, output, render, …) andomits
vertical; the catalog schema check enforces this without breakingthe legitimate support-function verticals.
mxl-hellois a separate case: it islayer:4,vertical:media-processing— decide whether it is reclassified (layer + type) or merely has its invalid
vertical removed. Call it out explicitly in the migration.
Consequences
switch target, and L3 preflight/rollback; the catalog stops mis-tagging
media-processing functions; minimal new infrastructure (one tag).
console IA change (workload-first) and a catalog schema migration; a one-time
backfill of the two MXL services.
assumed for v0.2.
Alternatives considered
adds a new store/authority duplicating NetBox's instance record. Rejected for
the demo; revisit if workloads need design-time definition before deployment.
lifecycle/switch/budget nowhere to live. Rejected.
Open questions
"Media Workloads" for the assembly? Backwards-compatible
/api/media-workloadspayload transition vs a new grouping endpoint?
workload(option b)? (a) is more general; (b) is more explicit.
Scope / non-goals
cardinality, flow-as-overlay, the
videotestbundle, workload-first consolegrouping, the narrow L1 and L2 reframes, the catalog schema check.
Design/Plan authoring, switching (the v0.2b connection-intent seam), licence
enforcement.
Relationship to #185 / v0.2a
This supersedes the loose "L1/L2" additions and pulls them into this RFC → ADR.
State (resolved 2026-07-08): the A–E demo set is complete (dmf-cms#26 merged),
so #185 is closed; a fresh tracking issue #189 (v0.2 EBU re-anchor) now
carries L3 + this Media Workload entity (+ reframed L1/L2) + v0.2b + licensing, and
the re-anchor plan's
tracking_issuewas moved to #189. No active plan points at aclosed issue. This RFC's own implementation work opens its own issue under #189
once it converges to an ADR.
All reactions