Loading src/open_exposure_gateway/application/services/quality_on_demand_service.py +2 −4 Original line number Diff line number Diff line Loading @@ -308,9 +308,7 @@ class QualityOnDemandService: qod_session = await self._qod_session_repo.get_by_id(UUID(session_id_raw)) if qod_session is None: logger.warning( "deactivate_completed_for_unknown_session", session_id=session_id_raw ) logger.warning("deactivate_completed_for_unknown_session", session_id=session_id_raw) return terminal_state = ( Loading Loading @@ -382,7 +380,7 @@ class QualityOnDemandService: raise RuntimeError("Operation/QodSession repositories are not available") qod_session = await self._qod_session_repo.get_by_id(UUID(session_id)) if qod_session is None: if qod_session is None or qod_session.state in _TERMINAL_STATES: raise NotFoundException(message=f"Session {session_id} not found") operation_id, correlation_id, requested_at = self._new_operation_metadata(x_correlator) Loading src/open_exposure_gateway/domain/quality_on_demand.py +7 −1 Original line number Diff line number Diff line Loading @@ -75,6 +75,12 @@ class SRMNetworkCapabilityDeactivateCommand(BaseModel): network_capability: NetworkCapabilityDeactivateTarget class NetworkCapabilityParametersSnapshot(BaseModel): schema_version: str | None = None target: NetworkCapabilityTarget parameters: dict[str, Any] = Field(default_factory=dict) class SRMNetworkCapability(BaseModel): service_instance_id: str capability_type: str Loading @@ -82,7 +88,7 @@ class SRMNetworkCapability(BaseModel): zone_id: str | None = None app_provider_id: str external_ref: str | None = None parameters_snapshot: NetworkCapabilityPayload parameters_snapshot: NetworkCapabilityParametersSnapshot result_summary: dict[str, Any] | None = None created_at: str | None = None updated_at: str | None = None Loading src/open_exposure_gateway/main.py +1 −3 Original line number Diff line number Diff line Loading @@ -175,9 +175,7 @@ async def default_lifespan(app: FastAPI) -> AsyncGenerator[None, None]: logger.warning( "qod_service_specification_id_defaulted", service_specification_id=str(settings.qod_settings.service_specification_id), detail=( "QOD_SETTINGS__SERVICE_SPECIFICATION_ID is unset; using a hardcoded id." ), detail=("QOD_SETTINGS__SERVICE_SPECIFICATION_ID is unset; using a hardcoded id."), ) else: logger.info( Loading tests/unit/fakes.py +10 −8 Original line number Diff line number Diff line Loading @@ -56,7 +56,8 @@ from open_exposure_gateway.domain.models import ( QodSession, ) from open_exposure_gateway.domain.quality_on_demand import ( NetworkCapabilityPayload, NetworkCapabilityParametersSnapshot, NetworkCapabilityTarget, QosStatusChangedCloudEvent, SRMNetworkCapability, ) Loading Loading @@ -247,22 +248,23 @@ def wire_srm_worker(bus: FakeDataBus, srm: FakeSRMClient) -> None: async def on_qod_activate(command: dict[str, Any]) -> None: service_instance_id = command["service_instance_id"] payload = command["network_capability"] srm.network_capabilities[service_instance_id] = SRMNetworkCapability( service_instance_id=service_instance_id, capability_type=command["network_capability"]["capability_type"], capability_type=payload["capability_type"], state="active", zone_id=command.get("zone_id"), app_provider_id=command["app_provider_id"], parameters_snapshot=NetworkCapabilityPayload.model_validate( command["network_capability"] parameters_snapshot=NetworkCapabilityParametersSnapshot( schema_version="srm.params/v1", target=NetworkCapabilityTarget.model_validate(payload["target"]), parameters={**payload["parameters"], "profile_ref": payload["profile_ref"]}, ), ) async def on_qod_deactivate(command: dict[str, Any]) -> None: external_ref = command["network_capability"]["external_ref"] for key, capability in list(srm.network_capabilities.items()): if capability.external_ref == external_ref: del srm.network_capabilities[key] service_instance_id = command["network_capability"]["service_instance_id"] srm.network_capabilities.pop(service_instance_id, None) bus.subscribe(Subject.TASK_DEPLOY, on_deploy) bus.subscribe(Subject.TASK_TERMINATE, on_terminate) Loading tests/unit/test_qod_flows.py +1 −3 Original line number Diff line number Diff line Loading @@ -195,9 +195,7 @@ class TestQodSessionFlow: command = SRMNetworkCapabilityDeactivateCommand.model_validate(deactivates[0]) assert command.network_capability.service_instance_id == session_id def test_get_session_returns_404_after_delete_requested( self, api_client: TestClient ) -> None: def test_get_session_returns_404_after_delete_requested(self, api_client: TestClient) -> None: session_id = api_client.post(f"{QOD_BASE}/sessions", json=SESSION_BODY).json()["sessionId"] api_client.delete(f"{QOD_BASE}/sessions/{session_id}") Loading Loading
src/open_exposure_gateway/application/services/quality_on_demand_service.py +2 −4 Original line number Diff line number Diff line Loading @@ -308,9 +308,7 @@ class QualityOnDemandService: qod_session = await self._qod_session_repo.get_by_id(UUID(session_id_raw)) if qod_session is None: logger.warning( "deactivate_completed_for_unknown_session", session_id=session_id_raw ) logger.warning("deactivate_completed_for_unknown_session", session_id=session_id_raw) return terminal_state = ( Loading Loading @@ -382,7 +380,7 @@ class QualityOnDemandService: raise RuntimeError("Operation/QodSession repositories are not available") qod_session = await self._qod_session_repo.get_by_id(UUID(session_id)) if qod_session is None: if qod_session is None or qod_session.state in _TERMINAL_STATES: raise NotFoundException(message=f"Session {session_id} not found") operation_id, correlation_id, requested_at = self._new_operation_metadata(x_correlator) Loading
src/open_exposure_gateway/domain/quality_on_demand.py +7 −1 Original line number Diff line number Diff line Loading @@ -75,6 +75,12 @@ class SRMNetworkCapabilityDeactivateCommand(BaseModel): network_capability: NetworkCapabilityDeactivateTarget class NetworkCapabilityParametersSnapshot(BaseModel): schema_version: str | None = None target: NetworkCapabilityTarget parameters: dict[str, Any] = Field(default_factory=dict) class SRMNetworkCapability(BaseModel): service_instance_id: str capability_type: str Loading @@ -82,7 +88,7 @@ class SRMNetworkCapability(BaseModel): zone_id: str | None = None app_provider_id: str external_ref: str | None = None parameters_snapshot: NetworkCapabilityPayload parameters_snapshot: NetworkCapabilityParametersSnapshot result_summary: dict[str, Any] | None = None created_at: str | None = None updated_at: str | None = None Loading
src/open_exposure_gateway/main.py +1 −3 Original line number Diff line number Diff line Loading @@ -175,9 +175,7 @@ async def default_lifespan(app: FastAPI) -> AsyncGenerator[None, None]: logger.warning( "qod_service_specification_id_defaulted", service_specification_id=str(settings.qod_settings.service_specification_id), detail=( "QOD_SETTINGS__SERVICE_SPECIFICATION_ID is unset; using a hardcoded id." ), detail=("QOD_SETTINGS__SERVICE_SPECIFICATION_ID is unset; using a hardcoded id."), ) else: logger.info( Loading
tests/unit/fakes.py +10 −8 Original line number Diff line number Diff line Loading @@ -56,7 +56,8 @@ from open_exposure_gateway.domain.models import ( QodSession, ) from open_exposure_gateway.domain.quality_on_demand import ( NetworkCapabilityPayload, NetworkCapabilityParametersSnapshot, NetworkCapabilityTarget, QosStatusChangedCloudEvent, SRMNetworkCapability, ) Loading Loading @@ -247,22 +248,23 @@ def wire_srm_worker(bus: FakeDataBus, srm: FakeSRMClient) -> None: async def on_qod_activate(command: dict[str, Any]) -> None: service_instance_id = command["service_instance_id"] payload = command["network_capability"] srm.network_capabilities[service_instance_id] = SRMNetworkCapability( service_instance_id=service_instance_id, capability_type=command["network_capability"]["capability_type"], capability_type=payload["capability_type"], state="active", zone_id=command.get("zone_id"), app_provider_id=command["app_provider_id"], parameters_snapshot=NetworkCapabilityPayload.model_validate( command["network_capability"] parameters_snapshot=NetworkCapabilityParametersSnapshot( schema_version="srm.params/v1", target=NetworkCapabilityTarget.model_validate(payload["target"]), parameters={**payload["parameters"], "profile_ref": payload["profile_ref"]}, ), ) async def on_qod_deactivate(command: dict[str, Any]) -> None: external_ref = command["network_capability"]["external_ref"] for key, capability in list(srm.network_capabilities.items()): if capability.external_ref == external_ref: del srm.network_capabilities[key] service_instance_id = command["network_capability"]["service_instance_id"] srm.network_capabilities.pop(service_instance_id, None) bus.subscribe(Subject.TASK_DEPLOY, on_deploy) bus.subscribe(Subject.TASK_TERMINATE, on_terminate) Loading
tests/unit/test_qod_flows.py +1 −3 Original line number Diff line number Diff line Loading @@ -195,9 +195,7 @@ class TestQodSessionFlow: command = SRMNetworkCapabilityDeactivateCommand.model_validate(deactivates[0]) assert command.network_capability.service_instance_id == session_id def test_get_session_returns_404_after_delete_requested( self, api_client: TestClient ) -> None: def test_get_session_returns_404_after_delete_requested(self, api_client: TestClient) -> None: session_id = api_client.post(f"{QOD_BASE}/sessions", json=SESSION_BODY).json()["sessionId"] api_client.delete(f"{QOD_BASE}/sessions/{session_id}") Loading