Commit 561c74d1 authored by George Papathanail's avatar George Papathanail
Browse files

fix(fm): always forward the resolved X-correlator to FM

parent 155b1e99
Loading
Loading
Loading
Loading
Loading
+3 −12
Changes for src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py: 3 added lines, 12 removed lines.
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ from pydantic import BaseModel, ValidationError

from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError
from open_exposure_gateway.api.camara.common import XCorrelatorHeader
from open_exposure_gateway.api.error_handlers import x_correlator_header
from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.schemas import (
    FederationContextId,
    FederationContextIdResponse,
@@ -162,7 +163,6 @@ async def _relay(
    method: str,
    path: str,
    request: Request,
    x_correlator: str | None,
    request_schema: type[BaseModel] | None = None,
) -> Response:
    """Forward one federation-lifecycle operation to FM and relay its answer unaltered.
@@ -198,7 +198,7 @@ async def _relay(
            path,
            content=body or None,
            content_type=request.headers.get("content-type"),
            x_correlator=x_correlator,
            x_correlator=x_correlator_header(request),
            params=tuple(request.query_params.multi_items()),
        )
    except FmUnavailableError:
@@ -234,7 +234,6 @@ async def create_federation(
        "POST",
        f"/partners/{partnerOpId}/federations",
        request,
        x_correlator,
        request_schema=FederationRequestData,
    )

@@ -253,9 +252,7 @@ async def get_federation_context_id(
    fm_client: FmClientDep,
    x_correlator: XCorrelatorHeader = None,
) -> Response:
    return await _relay(
        fm_client, "GET", f"/partners/{partnerOpId}/federations", request, x_correlator
    )
    return await _relay(fm_client, "GET", f"/partners/{partnerOpId}/federations", request)


@router.get(
@@ -278,7 +275,6 @@ async def get_federation_details(
        "GET",
        f"/partners/{partnerOpId}/federations/{federationContextId}",
        request,
        x_correlator,
    )


@@ -302,7 +298,6 @@ async def delete_federation_details(
        "DELETE",
        f"/partners/{partnerOpId}/federations/{federationContextId}",
        request,
        x_correlator,
    )


@@ -327,7 +322,6 @@ async def get_zone_data(
        "GET",
        f"/partners/{partnerOpId}/federations/{federationContextId}/zones",
        request,
        x_correlator,
    )


@@ -351,7 +345,6 @@ async def zone_subscribe(
        "POST",
        f"/partners/{partnerOpId}/federations/{federationContextId}/zones",
        request,
        x_correlator,
        request_schema=ZoneRegistrationRequestData,
    )

@@ -380,7 +373,6 @@ async def get_zone_details(
        "GET",
        f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}",
        request,
        x_correlator,
    )


@@ -408,5 +400,4 @@ async def zone_unsubscribe(
        "DELETE",
        f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}",
        request,
        x_correlator,
    )
+14 −0
Changes for tests/unit/test_federation_manager_endpoints.py: 14 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -156,6 +156,20 @@ def test_get_zone_data_forwards_zone_id_query_string(
    assert ("zoneId", _ZONE) in fake_fm_client.calls[0]["params"]


@pytest.mark.parametrize("headers", [{}, {"x-correlator": ""}])
def test_generated_x_correlator_is_the_same_for_fm_and_the_caller(
    client: TestClient, fake_fm_client: _FakeFmClient, headers: dict[str, str]
) -> None:
    """No usable ``X-Correlator`` from the caller: the id OEG makes up must reach FM too,
    or OEG's and FM's logs for this request can't be matched."""
    response = client.get(f"{BASE_PATH}{_FEDERATIONS}/{_CTX}", headers=headers)

    assert response.status_code == 200
    generated = response.headers["x-correlator"]
    assert generated
    assert fake_fm_client.calls[0]["x_correlator"] == generated


def test_fm_error_response_is_relayed_unaltered(
    client: TestClient, fake_fm_client: _FakeFmClient
) -> None: