Commit 0ebba1d9 authored by Paris Stentoumis's avatar Paris Stentoumis
Browse files

feat: cpu_millicores and memory are now optional

parent 4d63c838
Loading
Loading
Loading
Loading
Loading
+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
@@ -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

@@ -79,7 +79,7 @@ class ComputeRequirements(DomainModel):

    compute: ComputeResources

    topology: TopologyConstraints
    topology: TopologyConstraints | None = None

    interfaces: list[NetworkInterface] = Field(default_factory=list)

+46 −0
Changes for tests/api/rest/test_catalog.py: 46 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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(
@@ -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()}")