async def mock_retrieve_features(
    minimal_app: FastAPI,
    client: TestClient,
    service: Dict[str, Any],
    is_legacy: bool,
    scheduler_data_from_http_request: SchedulerData,
) -> AsyncIterator[Optional[MockRouter]]:
    with respx.mock(
            assert_all_called=False,
            assert_all_mocked=True,
    ) as respx_mock:
        if is_legacy:
            service_details = RunningDynamicServiceDetails.parse_obj(
                RunningDynamicServiceDetails.Config.schema_extra["examples"]
                [0])
            respx_mock.post(
                f"{service_details.legacy_service_url}/retrieve",
                name="retrieve").respond(json=RetrieveDataOutEnveloped.Config.
                                         schema_extra["examples"][0])

            yield respx_mock
            # no cleanup required
        else:
            dynamic_sidecar_scheduler = minimal_app.state.dynamic_sidecar_scheduler
            node_uuid = UUID(service["node_uuid"])
            serice_name = "serice_name"

            # pylint: disable=protected-access
            dynamic_sidecar_scheduler._inverse_search_mapping[
                node_uuid] = serice_name
            dynamic_sidecar_scheduler._to_observe[serice_name] = Namespace(
                scheduler_data=scheduler_data_from_http_request)

            respx_mock.post(
                f"{scheduler_data_from_http_request.dynamic_sidecar.endpoint}/v1/containers/ports/inputs:pull",
                name="service_pull_input_ports",
            ).respond(json=42)

            yield respx_mock

            dynamic_sidecar_scheduler._inverse_search_mapping.pop(node_uuid)
            dynamic_sidecar_scheduler._to_observe.pop(serice_name)
def test_regression_legacy_service_compatibility() -> None:
    api_response = {
        "published_port": None,
        "entry_point": "",
        "service_uuid": "e5aa2f7a-eac4-4522-bd4f-270b5d8d9fff",
        "service_key": "simcore/services/dynamic/mocked",
        "service_version": "1.6.10",
        "service_host": "mocked_e5aa2f7a-eac4-4522-bd4f-270b5d8d9fff",
        "service_port": 8888,
        "service_basepath": "/x/e5aa2f7a-eac4-4522-bd4f-270b5d8d9fff",
        "service_state": "running",
        "service_message": "",
        "user_id": "1",
        "project_id": "b1ec5c8e-f5bb-11eb-b1d5-02420a000006",
    }
    service_details = RunningDynamicServiceDetails.parse_obj(api_response)

    assert service_details

    service_url = f"http://{service_details.host}:{service_details.internal_port}{service_details.basepath}"
    assert service_url == service_details.legacy_service_url
    def get_stack_status(node_uuid: NodeID) -> RunningDynamicServiceDetails:
        if exp_status_code == status.HTTP_307_TEMPORARY_REDIRECT:
            raise DynamicSidecarNotFoundError(node_uuid)

        return RunningDynamicServiceDetails.parse_obj(
            RunningDynamicServiceDetails.Config.schema_extra["examples"][0])