Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions monitoring/mock_uss/f3548v21/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from monitoring.mock_uss.app import require_config_value, webapp
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
from monitoring.monitorlib import auth
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import utm_client_session_factory

require_config_value(KEY_DSS_URL)
require_config_value(KEY_AUTH_SPEC)

utm_client = UTMClientSession(
utm_client = utm_client_session_factory.get_session(
webapp.config[KEY_DSS_URL],
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
)
2 changes: 1 addition & 1 deletion monitoring/mock_uss/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
require_config_value(config.KEY_DSS_URL)
require_config_value(config.KEY_AUTH_SPEC)

utm_client = infrastructure.UTMClientSession(
utm_client = infrastructure.utm_client_session_factory.get_session(
webapp.config[config.KEY_DSS_URL],
auth.make_auth_adapter(webapp.config[config.KEY_AUTH_SPEC]),
)
4 changes: 2 additions & 2 deletions monitoring/mock_uss/riddp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
from monitoring.mock_uss.riddp.config import KEY_RID_VERSION
from monitoring.monitorlib import auth
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import utm_client_session_factory
from monitoring.monitorlib.rid import RIDVersion

from . import config as config
Expand All @@ -20,7 +20,7 @@
f"Cannot construct DSS base URL using RID version {webapp.config[KEY_RID_VERSION]}"
)

utm_client = UTMClientSession(
utm_client = utm_client_session_factory.get_session(
_dss_base_url,
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
)
6 changes: 4 additions & 2 deletions monitoring/mock_uss/ridsp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
from monitoring.mock_uss.riddp.config import KEY_RID_VERSION
from monitoring.monitorlib import auth
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
utm_client_session_factory,
)
from monitoring.monitorlib.rid import RIDVersion

require_config_value(KEY_DSS_URL)
Expand All @@ -18,7 +20,7 @@
f"Cannot construct DSS base URL using RID version {webapp.config[KEY_RID_VERSION]}"
)

utm_client = UTMClientSession(
utm_client = utm_client_session_factory.get_session(
_dss_base_url,
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
)
9 changes: 7 additions & 2 deletions monitoring/mock_uss/tracer/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@
from monitoring.monitorlib import infrastructure
from monitoring.monitorlib.auth import make_auth_adapter
from monitoring.monitorlib.fetch import scd
from monitoring.monitorlib.infrastructure import AuthAdapter, AuthSpec, UTMClientSession
from monitoring.monitorlib.infrastructure import (
AuthAdapter,
AuthSpec,
UTMClientSession,
utm_client_session_factory,
)
from monitoring.monitorlib.rid import RIDVersion

scd_cache: dict[ObservationAreaID, dict[str, scd.FetchedEntity]] = {}
Expand Down Expand Up @@ -84,4 +89,4 @@ def resolve_scd_dss_base_url(dss_base_url: str | None) -> str:
def get_client(auth_spec: AuthSpec, dss_base_url: str) -> UTMClientSession:
if auth_spec not in _adapters:
_adapters[auth_spec] = make_auth_adapter(auth_spec)
return UTMClientSession(dss_base_url, _adapters[auth_spec])
return utm_client_session_factory.get_session(dss_base_url, _adapters[auth_spec])
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@
RequestDescription,
ResponseDescription,
)
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
utm_client_session_factory,
)
from monitoring.uss_qualifier.configurations.configuration import ParticipantID

from .client_interuss import InterUSSVersioningClient, VersionQueryError


@pytest.fixture
def client():
return InterUSSVersioningClient(UTMClientSession(prefix_url="/"), ParticipantID())
return InterUSSVersioningClient(
utm_client_session_factory.get_session(prefix_url="/"), ParticipantID()
)


def build_query_response(code, data):
Expand Down
27 changes: 27 additions & 0 deletions monitoring/monitorlib/infrastructure.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ def __init__(
auth_adapter: AuthAdapter | None = None,
timeout_seconds: float | None = None,
):
"""Instances should usually be constructed using a factory to avoid unnecessary duplication."""

super().__init__()

with UTMClientSession._session_id_lock:
Expand Down Expand Up @@ -223,6 +225,31 @@ def delete(self, *args, **kwargs):
return super().delete(*args, **kwargs)


class UTMClientSessionFactory:
_sessions: dict[tuple, UTMClientSession]

def __init__(self):
self._sessions = {}

def get_session(
self,
prefix_url: str,
auth_adapter: AuthAdapter | None = None,
timeout_seconds: float | None = None,
) -> UTMClientSession:
key = (prefix_url, auth_adapter, timeout_seconds)
if key not in self._sessions:
self._sessions[key] = UTMClientSession(
prefix_url=prefix_url,
auth_adapter=auth_adapter,
timeout_seconds=timeout_seconds,
)
return self._sessions[key]


utm_client_session_factory = UTMClientSessionFactory()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I would have made it a class method and just use UTMClientSessionFactory.get_session(..) instead of having that shared variable

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This assumes that it could only ever make sense to have a single UTMClientSessionFactory and that doesn't seem necessarily true. I think it is probably true with the current implementation, but patterns of access (like UTMClientSessionFactory.get_session(..)) are part of the interface rather than the implementation and should therefore generally survive changes in the implementation. Since it doesn't seem necessarily non-sensical to have, e.g., 2 factories, then the choice to have just 1 factory currently doesn't seem like it should be part of the contract/interface of the factory.



class AsyncUTMTestSession:
"""
Requests Asyncio client session that provides additional functionality for running DSS concurrency tests:
Expand Down
10 changes: 8 additions & 2 deletions monitoring/prober/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
import uas_standards.astm.f3548.v21.constants as v21_constants

from monitoring.monitorlib import auth, scd
from monitoring.monitorlib.infrastructure import AsyncUTMTestSession, UTMClientSession
from monitoring.monitorlib.infrastructure import (
AsyncUTMTestSession,
UTMClientSession,
utm_client_session_factory,
)
from monitoring.prober.infrastructure import (
IDFactory,
ResourceType,
Expand Down Expand Up @@ -120,7 +124,9 @@ def make_session(
pytest.skip(f"{auth_option} option not set")
auth_adapter = auth.make_auth_adapter(auth_spec)

s = UTMClientSession(dss_endpoint + endpoint_suffix, auth_adapter)
s = utm_client_session_factory.get_session(
dss_endpoint + endpoint_suffix, auth_adapter
)
return s


Expand Down
2 changes: 1 addition & 1 deletion monitoring/uss_qualifier/resources/astm/f3411/dss.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def __init__(
specification.participant_id,
specification.base_url,
specification.rid_version,
infrastructure.UTMClientSession(
infrastructure.utm_client_session_factory.get_session(
specification.base_url, auth_adapter.adapter
),
)
Expand Down
9 changes: 6 additions & 3 deletions monitoring/uss_qualifier/resources/astm/f3548/v21/dss.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,10 @@
from monitoring.monitorlib.fetch import Query, QueryError, QueryType, query_and_describe
from monitoring.monitorlib.fetch import scd as fetch
from monitoring.monitorlib.fetch.scd import FetchedSubscription, FetchedSubscriptions
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
UTMClientSession,
utm_client_session_factory,
)
from monitoring.monitorlib.inspection import calling_function_name, fullname
from monitoring.monitorlib.mutate import scd as mutate
from monitoring.monitorlib.mutate.scd import MutatedSubscription
Expand Down Expand Up @@ -129,7 +132,7 @@ def with_different_auth(
participant_id=self.participant_id,
user_participant_ids=self.user_participant_ids,
base_url=self.base_url,
client=UTMClientSession(
client=utm_client_session_factory.get_session(
self.base_url,
auth_adapter=auth_adapter.adapter,
timeout_seconds=self.client.timeout_seconds,
Expand Down Expand Up @@ -717,7 +720,7 @@ def __init__(
if "timeout_seconds" in specification
else None
)
self._client = UTMClientSession(
self._client = utm_client_session_factory.get_session(
self._specification.base_url, auth_adapter.adapter, timeout_seconds
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ def to_client(
self, auth_adapter: infrastructure.AuthAdapter
) -> FlightPlannerClient:
if "scd_injection_base_url" in self and self.scd_injection_base_url:
session = infrastructure.UTMClientSession(
session = infrastructure.utm_client_session_factory.get_session(
self.scd_injection_base_url, auth_adapter, self.timeout_seconds
)
return SCDFlightPlannerClient(session, self.participant_id)
elif "v1_base_url" in self and self.v1_base_url:
session = infrastructure.UTMClientSession(
session = infrastructure.utm_client_session_factory.get_session(
self.v1_base_url, auth_adapter, self.timeout_seconds
)
return V1FlightPlannerClient(session, self.participant_id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from monitoring.monitorlib.clients.geospatial_info.client_geospatial_map import (
GeospatialMapClient,
)
from monitoring.monitorlib.infrastructure import AuthAdapter, UTMClientSession
from monitoring.monitorlib.infrastructure import AuthAdapter, utm_client_session_factory
from monitoring.uss_qualifier.configurations.configuration import ParticipantID
from monitoring.uss_qualifier.resources.communications import AuthAdapterResource
from monitoring.uss_qualifier.resources.resource import Resource
Expand Down Expand Up @@ -37,7 +37,7 @@ def __init__(self, *args, **kwargs):

def to_client(self, auth_adapter: AuthAdapter) -> GeospatialInfoClient:
if "geospatial_map_v1_base_url" in self and self.geospatial_map_v1_base_url:
session = UTMClientSession(
session = utm_client_session_factory.get_session(
self.geospatial_map_v1_base_url, auth_adapter, self.timeout_seconds
)
return GeospatialMapClient(session, self.participant_id)
Expand Down
14 changes: 11 additions & 3 deletions monitoring/uss_qualifier/resources/interuss/mock_uss/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
PutLocalityRequest,
)
from monitoring.monitorlib.fetch import QueryError, QueryType
from monitoring.monitorlib.infrastructure import AuthAdapter, UTMClientSession
from monitoring.monitorlib.infrastructure import (
AuthAdapter,
utm_client_session_factory,
)
from monitoring.monitorlib.locality import LocalityCode
from monitoring.monitorlib.scd_automated_testing.scd_injection_api import (
SCOPE_SCD_QUALIFIER_INJECT,
Expand All @@ -39,11 +42,16 @@ def __init__(
timeout_seconds: float | None = None,
):
self.base_url = base_url
self.session = UTMClientSession(base_url, auth_adapter, timeout_seconds)
self.session = utm_client_session_factory.get_session(
base_url, auth_adapter, timeout_seconds
)
self.participant_id = participant_id
v1_base_url = base_url + "/flight_planning/v1"
self.flight_planner = V1FlightPlannerClient(
UTMClientSession(v1_base_url, auth_adapter, timeout_seconds), participant_id
utm_client_session_factory.get_session(
v1_base_url, auth_adapter, timeout_seconds
),
participant_id,
)

def get_status(self) -> fetch.Query:
Expand Down
5 changes: 3 additions & 2 deletions monitoring/uss_qualifier/resources/netrid/observers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

from monitoring.monitorlib import fetch, infrastructure
from monitoring.monitorlib.fetch import QueryType
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.uss_qualifier.resources.communications import AuthAdapterResource
from monitoring.uss_qualifier.resources.resource import Resource

Expand All @@ -24,7 +23,9 @@ def __init__(
base_url: str,
auth_adapter: infrastructure.AuthAdapter,
):
self.session = UTMClientSession(base_url, auth_adapter)
self.session = infrastructure.utm_client_session_factory.get_session(
base_url, auth_adapter
)
self.participant_id = participant_id
self.base_url = base_url

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(
):
self.participant_id = participant_id
self.injection_base_url = injection_base_url
self.injection_client = infrastructure.UTMClientSession(
self.injection_client = infrastructure.utm_client_session_factory.get_session(
injection_base_url, auth_adapter
)

Expand Down
6 changes: 4 additions & 2 deletions monitoring/uss_qualifier/resources/versioning/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
from monitoring.monitorlib.clients.versioning.client_interuss import (
InterUSSVersioningClient,
)
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
utm_client_session_factory,
)
from monitoring.monitorlib.inspection import fullname
from monitoring.uss_qualifier.reports.report import ParticipantID
from monitoring.uss_qualifier.resources.communications import AuthAdapterResource
Expand Down Expand Up @@ -48,7 +50,7 @@ def __init__(
self.version_providers = []
for instance in specification.instances:
if "interuss" in instance and instance.interuss:
session = UTMClientSession(
session = utm_client_session_factory.get_session(
prefix_url=instance.interuss.base_url,
auth_adapter=auth_adapter.adapter,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,14 @@ def __init__(

# correctly formed and signed using an unrecognized private key
# (should cause requests to be rejected)
self._unsigned_token_session = infrastructure.UTMClientSession(
self._dss.base_url, InvalidTokenSignatureAuth()
self._unsigned_token_session = (
infrastructure.utm_client_session_factory.get_session(
self._dss.base_url, InvalidTokenSignatureAuth()
)
)
# Session that won't provide a token at all
# (should cause requests to be rejected)
self._no_token_session = infrastructure.UTMClientSession(
self._no_token_session = infrastructure.utm_client_session_factory.get_session(
self._dss.base_url, None
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
from monitoring.monitorlib import auth, geo
from monitoring.monitorlib.errors import stacktrace_string
from monitoring.monitorlib.fetch import rid
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
utm_client_session_factory,
)
from monitoring.monitorlib.rid import RIDVersion
from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstancesResource
from monitoring.uss_qualifier.resources.netrid import (
Expand Down Expand Up @@ -270,7 +272,7 @@ def _evaluate_and_test_authentication(
participant_id = mapping.injected_flight.uss_participant_id
flights_url = mapping.observed_flight.query.flights_url

invalid_session = UTMClientSession(flights_url, auth)
invalid_session = utm_client_session_factory.get_session(flights_url, auth)

self.record_note(
f"{participant_id}/{injection_id}/missing_credentials_queries",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@

from monitoring.monitorlib.auth import InvalidTokenSignatureAuth
from monitoring.monitorlib.fetch import QueryError
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.infrastructure import (
utm_client_session_factory,
)
from monitoring.monitorlib.inspection import fullname
from monitoring.prober.infrastructure import register_resource_type
from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import (
Expand Down Expand Up @@ -175,12 +177,12 @@ def __init__(
)

# Session that won't provide a token at all
self._no_auth_session = UTMClientSession(
self._no_auth_session = utm_client_session_factory.get_session(
self._scd_dss.base_url, auth_adapter=None
)

# Session that should provide a well-formed token with a wrong signature
self._invalid_token_session = UTMClientSession(
self._invalid_token_session = utm_client_session_factory.get_session(
self._scd_dss.base_url, auth_adapter=InvalidTokenSignatureAuth()
)

Expand Down
Loading
Loading