Changes for fm/overview-and-architecture.md: 4 added lines, 4 removed lines.
Original line number
Diff line number
Diff line
@@ -430,7 +430,7 @@ A locally connected App Provider deploys to an Edge Cloud Zone that turns out to
1. OEG publishes `command.srm.service.deploy` unconditionally, as it does for every deploy (no locality check in OEG).
2. SRM checks its own zone inventory; not found locally, so it queries FM for federated zone/capability data.
3. FM returns the matching federated zone entry (from `shared_resource_catalogues`).
4. SRM forwards the deploy to FM using FM's internal schema (not raw GSMA/OPG.04) — exact request/response contract, retry, and timeout semantics are an open item (§G4).
4. SRM forwards the deploy to FM using FM's internal schema (not raw GSMA/OPG.04) via a synchronous `POST /internal/federation/deploy` answered `202`; the outcome returns later on `event.fm.operation.completed` (ADR-0052, §G4).
5. FM maps the request to OPG.04 `InstallApp` and executes the outbound EWBI call to the partner's FM, through the same code path used for inbound federation-originated deploys (UC-FM-01's fulfillment pipeline).
6. FM reports the result back to SRM, which resumes its normal `event.srm.operation.completed` lifecycle for the original command.
-**Why this exists:** Keeps placement (local-vs-federated) a single SRM-owned decision instead of splitting it between OEG and FM; see ADR-0044.
@@ -554,11 +554,11 @@ goes through OEG at all — see G4.
**Recommendation:** Internal HTTP from OEG to FM for all outbound federation hand-offs (synchronous queries). OEG calls FM with the routing identifiers and original request context; FM resolves the partner, forwards over EWBI, and returns the result to OEG. This keeps EWBI protocol knowledge inside FM and avoids a second async hop on the developer-facing latency path. Initially, OEG rejects non-local requests with a 400/404 (federation not yet available). The OEG spec already anticipates this pattern in UC-OEG-05.
### G4. SRM → FM Hand-off for Federated Deployment (ADR-0044)
### G4. SRM → FM Hand-off for Federated Deployment (resolved by ADR-0052)
**The question:** When SRM determines a deploy target zone is federated (UC-FM-07), what is the exact hand-off contract to FM — synchronous internal HTTP (matching every other FM↔SRM internal call in this document) or a new async DataBus command?
**The question was:** When SRM determines a deploy target zone is federated (UC-FM-07), what is the exact hand-off contract to FM — synchronous internal HTTP or a new async DataBus command?
**Status:** unresolved. The 2026-09-01 TSC+MDL meeting decided SRM (not OEG) owns this hand-off, but did not conclude the transport. **Recommendation:** default to synchronous internal HTTP for consistency with L.4's existing FM↔SRM pattern, with SRM treating the call as part of its own already-async `command.srm.service.deploy` handling (SRM owns retry/timeout toward FM, not OEG). Revisit once FM/SRM implementation work starts on UC-FM-07.
**Status:resolved (ADR-0052).** Both, split by hop, and extended to cover termination as well as deployment. The request hop is a synchronous internal HTTP `POST` to FM (`/internal/federation/deploy`, `/internal/federation/terminate`) answered `202`; the result hop is `event.fm.operation.completed` on `OOP_EVENTS`, which SRM consumes and republishes as `event.srm.operation.completed`. A second channel is unavoidable because OPG.04 `InstallApp` returns only `202` plus a later callback, and `RemoveApp` returns `200` with no callback at all; and FM cannot call back into SRM over HTTP because SRM exposes no HTTP lifecycle mutation endpoints. ADR-0052 also amends the SRM hand-off flow so SRM writes a `service_order` row (the idempotency anchor) while still writing no `service_instance` rows, and sets FM's deploy-callback deadline at a 30-minute default. See [srm/interface-contract.md §F.4a](/srm/interface-contract.md) and [fm/requirements-and-design.md §L.3a](/fm/requirements-and-design.md).
For zone-based deployment targeting, SRM — not OEG — determines locality and, when the target
zone is federated, hands off to FM. This is new surface introduced by ADR-0044; unlike L.3, exact
request/response contract, retry, and timeout semantics are an **open item** ([fm/overview-and-architecture.md §G4](/fm/overview-and-architecture.md)) — the shapes below are indicative, not final.
For zone-based deployment targeting, SRM — not OEG — determines locality and hands off to FM when
the work belongs to a partner. ADR-0044 established the ownership; ADR-0052 fixes the transport:
a synchronous internal HTTP request here, and an asynchronous `event.fm.operation.completed` on
`OOP_EVENTS` for the result (§M.1). The two hops exist because OPG.04 returns no outcome on the
request: `InstallApp` answers `202` and reports later via callback, and `RemoveApp` answers `200`
with no callback at all.
| Method | Path | Description |
|---|---|---|
| `GET` | `/internal/federated-zones/{zone_id}` | Look up a zone in `shared_resource_catalogues`; `404` if the zone is not federated with any partner |
| `POST` | `/internal/federation/deploy` | Hand off a deploy whose target zone resolved as federated; FM maps the request to OPG.04 `InstallApp` and executes the outbound EWBI call |
| `GET` | `/internal/federated-zones/{zone_id}` | Resolve a zone against `shared_resource_catalogues`; `404` if the zone is federated with no partner |
| `POST` | `/internal/federation/deploy` | Hand off a deploy whose target zone resolved as federated; FM maps it to OPG.04 `InstallApp` |
| `POST` | `/internal/federation/terminate` | Hand off a terminate for an instance absent from SRM inventory; FM maps it to OPG.04 `RemoveApp` |
| `event.fm.operation.completed` | OOP_EVENTS | `FmOperationCompletedV1` | Terminal outcome of an **outbound** federated deploy or terminate handed off by SRM (§L.3a, ADR-0052) |
`event.fm.operation.completed` is the result hop of the SRM→FM hand-off. It exists because OPG.04
returns no outcome on the request itself, and because SRM exposes no HTTP lifecycle mutation
endpoint for FM to call back into (SRM interface contract §A). SRM consumes it and republishes
`event.srm.operation.completed`, so OEG and the App Provider see one uniform terminal event whether
fulfillment was local or federated.
**`FmOperationCompletedV1`**
| Field | Type | Required | Description |
|---|---|---|---|
| `schema_version` | string | Yes | `"1.0"` until a breaking change |
| `operation_id` | UUID | Yes | Echoed from the originating `command.srm.*` envelope; SRM's correlation key |
| `correlation_id` | string | Yes | Tracing key, echoed from the envelope |
| `error` | RFC 7807 object or null | Cond. | Required when `status=failed` |
| `completed_at` | date-time | Yes | ISO-8601 UTC |
**`metadata.completion_basis`** states what "completed" is grounded in, because OPG.04 gives the two
operations different guarantees:
| Value | Emitted for | Means |
|---|---|---|
| `partner_confirmed` | deploy | The partner's `onInstanceStatusEvent` callback reported the instance running |
| `partner_accepted` | terminate | The partner answered `RemoveApp` with `200`. **Not** confirmation that removal finished — OPG.04 defines no callback for removal and no `TERMINATED` state to observe |
| `deadline_expired` | deploy | No callback arrived within FM's configured wait (default 30 minutes); `status` is `failed` |
Consumers must not treat `partner_accepted` as proof of removal. Detecting a termination a partner
accepted but never performed belongs to reconciliation (ADR-0052).
**Topology hiding applies to this event** (REQ-FED-13). `external_ref` is a partner-issued handle
and is safe; partner zone identifiers, endpoints and internal references are not carried.
The charging integration required by REQ-FED-18 needs its own contract/ADR; no DataBus subject or
"one record after every transaction" policy is defined yet.