- OEG does not terminate EWBI and does not make direct SBI (Southbound Interface) calls.
- Callbacks are CloudEvents (`application/cloudevents+json`), not proprietary JSON bodies; auth uses `sinkCredential` bearer tokens, not a platform shared secret (ADR-0008).
-`GET /platform/v1/operations/{operationId}` exposes `status` (not `state`) — 1:1 with `operations.status`. Do not confuse with `event.srm.operation.status`, whose payload field is named `state` per [srm/interface-contract.md](/srm/interface-contract.md) §C.1.
-`GET /apps` and `GET /edge-cloud-zones` have no partial-success shape — their `200` is a bare array with no metadata slot for a skipped-item count. One SRM entry that can't be mapped (e.g. a catalog entry with no `artifact_ref` anywhere, or a zone with a malformed id) fails the whole read with `503`/`UNAVAILABLE`; it is never silently omitted from the list.
Changes for oeg/persistence-model.md: 4 added lines, 4 removed lines.
Original line number
Diff line number
Diff line
@@ -176,7 +176,7 @@ in `app_instances.state`).
| `app_registration_id` | UUID FK -> `app_registrations` | NULLABLE (not all operations concern an app); resolved from the request's `appId` (ADR-0010) |
| `subject` | VARCHAR(128) | Published DataBus subject, e.g. `command.srm.service.deploy` |
| `result` | JSONB | NULLABLE; populated from `event.srm.operation.completed`. Holds the `instances[]` list — one entry per resulting app instance: `{app_instance_id, edge_cloud_zone_id, state}`, matching the `app_instances` column names (ADR-0005, ADR-0013). `app_instance_id` is OEG's own enrichment during the write — the raw event only carries `service_instance_id`; OEG maps it to the `app_instance_id` it minted. Example: `{"instances": [{"app_instance_id": "9a3f1c22-...", "edge_cloud_zone_id": "f47ac10b-...", "state": "ready"}]}` |
| `error` | JSONB | NULLABLE; RFC 7807 structure, stored as-is from the SRM event — this is OEG's internal error model, not exposed to the external CAMARA client (only Portal/operator tooling reads it, via `GET /platform/v1/operations/{operationId}` §K.2). Only synchronous request-validation errors returned directly in OEG's HTTP responses are CAMARA `ErrorInfo` (ADR-0030) |
-**Unit tests** cover domain policies, idempotency logic, and the error model split: CAMARA `ErrorInfo` on synchronous validation responses vs. RFC 7807 stored as-is in `operations.error`.
-**Integration tests** use PostgreSQL, Redis, and NATS testcontainers, publish a fake `event.srm.operation.completed`, and assert the resulting database state.
-**Contract tests** validate OpenAPI behavior with Schemathesis and validate shared `command.srm.service.deploy` JSON Schemas from `oop-commons`.
-**Fixtures** can use `oop_commons.testing` fake JWTs with roles.
@@ -424,7 +424,7 @@ phase above.
1. Epic: OEG FastAPI skeleton plus `oop-commons` integration
2. Epic: Operations persistence plus NATS publish and consume
3. Epic: Rate limiting plus usage metering
4. Epic: TMF (TM Forum) and CAMARA routes plus RFC 7807 handling
4. Epic: TMF (TM Forum) and CAMARA routes plus `ErrorInfo` handling
5. Epic: Callback delivery plus retry mechanism (TBD — see OQ-03)
6. Epic: Integration tests plus CI contracts
@@ -438,7 +438,7 @@ phase above.
## X. Final Recommendations
**Recommended MVP**
Ship JWT validation, RFC 7807, one async deploy path, `GET /platform/v1/operations/{operationId}`, `event.srm.operation.completed`, and metering rows first. Defer the broader TMF facade surface, federation-aware routing, and real-time SBI-CHF integration.
Ship JWT validation, `ErrorInfo`, one async deploy path, `GET /platform/v1/operations/{operationId}`, `event.srm.operation.completed`, and metering rows first. Defer the broader TMF facade surface, federation-aware routing, and real-time SBI-CHF integration.