Loading src/srm/domain/models/canonical_parameters/compute.py +3 −3 Changes for src/srm/domain/models/canonical_parameters/compute.py: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -34,9 +34,9 @@ class StorageVolume(DomainModel): class ComputeResources(DomainModel): cpu_millicores: int cpu_millicores: int | None = None memory_mb: int memory_mb: int | None = None accelerator: Accelerator | None = None Loading Loading @@ -79,7 +79,7 @@ class ComputeRequirements(DomainModel): compute: ComputeResources topology: TopologyConstraints topology: TopologyConstraints | None = None interfaces: list[NetworkInterface] = Field(default_factory=list) Loading tests/api/rest/test_catalog.py +46 −0 Changes for tests/api/rest/test_catalog.py: 46 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -103,6 +103,24 @@ def test_create_service_specification_generates_missing_id() -> None: assert specification.capability_requirements[0].service_specification_id == specification.id def test_create_service_specification_allows_omitted_cpu_memory_and_topology() -> None: """OEG dumps with exclude_none=True when pools/topology are absent.""" payload = _request_payload(service_specification_id=None) payload["service_deployment_units"][0]["resource_requirements"] = { "schema_version": "srm.compute/v1", "compute": {}, "standalone": False, } request = CreateServiceSpecificationRequest.model_validate(payload) specification = _to_domain(request) requirements = specification.deployment_units[0].resource_requirements assert requirements.compute.cpu_millicores is None assert requirements.compute.memory_mb is None assert requirements.topology is None def test_create_service_specification_preserves_supplied_id() -> None: service_specification_id = uuid4() request = CreateServiceSpecificationRequest.model_validate( Loading Loading @@ -224,6 +242,34 @@ async def test_create_unknown_deployment_unit_ref_returns_400(client_with_db: As assert body["detail"] @pytest.mark.integration async def test_create_accepts_omitted_cpu_memory_and_topology( client_with_db: AsyncClient, ) -> None: payload = _request_payload(service_specification_id=None) payload["service_deployment_units"][0]["resource_requirements"] = { "schema_version": "srm.compute/v1", "compute": {}, "standalone": False, } create_response = await client_with_db.post( "/internal/catalog/service-specifications", json=payload ) assert create_response.status_code == 201 specification_id = create_response.json()["id"] get_response = await client_with_db.get( f"/internal/catalog/service-specifications/{specification_id}" ) assert get_response.status_code == 200 requirements = get_response.json()["service_deployment_units"][0]["resource_requirements"] assert requirements["compute"].get("cpu_millicores") is None assert requirements["compute"].get("memory_mb") is None assert requirements.get("topology") is None @pytest.mark.integration async def test_get_missing_returns_404(client_with_db: AsyncClient) -> None: response = await client_with_db.get(f"/internal/catalog/service-specifications/{uuid4()}") Loading Loading
src/srm/domain/models/canonical_parameters/compute.py +3 −3 Changes for src/srm/domain/models/canonical_parameters/compute.py: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -34,9 +34,9 @@ class StorageVolume(DomainModel): class ComputeResources(DomainModel): cpu_millicores: int cpu_millicores: int | None = None memory_mb: int memory_mb: int | None = None accelerator: Accelerator | None = None Loading Loading @@ -79,7 +79,7 @@ class ComputeRequirements(DomainModel): compute: ComputeResources topology: TopologyConstraints topology: TopologyConstraints | None = None interfaces: list[NetworkInterface] = Field(default_factory=list) Loading
tests/api/rest/test_catalog.py +46 −0 Changes for tests/api/rest/test_catalog.py: 46 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -103,6 +103,24 @@ def test_create_service_specification_generates_missing_id() -> None: assert specification.capability_requirements[0].service_specification_id == specification.id def test_create_service_specification_allows_omitted_cpu_memory_and_topology() -> None: """OEG dumps with exclude_none=True when pools/topology are absent.""" payload = _request_payload(service_specification_id=None) payload["service_deployment_units"][0]["resource_requirements"] = { "schema_version": "srm.compute/v1", "compute": {}, "standalone": False, } request = CreateServiceSpecificationRequest.model_validate(payload) specification = _to_domain(request) requirements = specification.deployment_units[0].resource_requirements assert requirements.compute.cpu_millicores is None assert requirements.compute.memory_mb is None assert requirements.topology is None def test_create_service_specification_preserves_supplied_id() -> None: service_specification_id = uuid4() request = CreateServiceSpecificationRequest.model_validate( Loading Loading @@ -224,6 +242,34 @@ async def test_create_unknown_deployment_unit_ref_returns_400(client_with_db: As assert body["detail"] @pytest.mark.integration async def test_create_accepts_omitted_cpu_memory_and_topology( client_with_db: AsyncClient, ) -> None: payload = _request_payload(service_specification_id=None) payload["service_deployment_units"][0]["resource_requirements"] = { "schema_version": "srm.compute/v1", "compute": {}, "standalone": False, } create_response = await client_with_db.post( "/internal/catalog/service-specifications", json=payload ) assert create_response.status_code == 201 specification_id = create_response.json()["id"] get_response = await client_with_db.get( f"/internal/catalog/service-specifications/{specification_id}" ) assert get_response.status_code == 200 requirements = get_response.json()["service_deployment_units"][0]["resource_requirements"] assert requirements["compute"].get("cpu_millicores") is None assert requirements["compute"].get("memory_mb") is None assert requirements.get("topology") is None @pytest.mark.integration async def test_get_missing_returns_404(client_with_db: AsyncClient) -> None: response = await client_with_db.get(f"/internal/catalog/service-specifications/{uuid4()}") Loading