Add inbound QoD session support (UC-FM-04)
Delivers UC-FM-04 (Inbound Federated Network Capability). A partner operator can now open, inspect and close a QoD session against one of our subscribers, over the same APIForwarding route that already carries Device Location.
What a partner can now do
POST /operatorplatform/federation/v1/{federationContextId}/apiservice/QualityOnDemand
GET /operatorplatform/federation/v1/{federationContextId}/apiservice/connid/{connectID}/custid/{customerID}
DELETE /operatorplatform/federation/v1/{federationContextId}/apiservice/connid/{connectID}/custid/{customerID}APIForwarding dispatches on serviceAPINameVal: DeviceLocation goes to the query service as before, QualityOnDemand to the new capability service. Everything else still returns 404 service-api-unsupported, because there is nothing below SRM yet.
Opening a session mints a connectID, writes a federation_transactions row and publishes command.srm.capability.activate. Closing publishes command.srm.capability.deactivate. Both commands were validated against SRM's own Pydantic models before the service was written, the same way the deploy and terminate commands were.
Known Limitations
- Not verified against a live SRM. SRM's deploy path has a
# TODO: TF-SDK CapabilityExecutionAdapter.activate_capability(...)atdeploy_service.py:391and its control path registry is built withfactory=Noneatmain.py:97, so no adapter can be constructed at all. Nothing acts on either capability command yet. FM's side is complete. - No completion handling for sessions.
command.srm.capability.activatereturns an operation id, but SRM emits no completion for it today, so the transaction row staysin_progress. The existing consumer will finalise it unchanged once SRM emits. ipv4Addressis not mapped. CAMARA models it as an object rather than a string, so it does not fit SRM'sDeviceTarget.ipv4. Phone number, IPv6 and network access identifier are mapped; a request carrying only an IPv4 address is403.