Skip to content

Commit e59f147

Browse files
[monitorlib] Obtain UTMClientSessions via factory rather than direct construction (#1413)
1 parent a136bbc commit e59f147

File tree

22 files changed

+117
-43
lines changed

22 files changed

+117
-43
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from monitoring.mock_uss.app import require_config_value, webapp
22
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
33
from monitoring.monitorlib import auth
4-
from monitoring.monitorlib.infrastructure import UTMClientSession
4+
from monitoring.monitorlib.infrastructure import utm_client_session_factory
55

66
require_config_value(KEY_DSS_URL)
77
require_config_value(KEY_AUTH_SPEC)
88

9-
utm_client = UTMClientSession(
9+
utm_client = utm_client_session_factory.get_session(
1010
webapp.config[KEY_DSS_URL],
1111
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
1212
)

monitoring/mock_uss/resources.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
require_config_value(config.KEY_DSS_URL)
77
require_config_value(config.KEY_AUTH_SPEC)
88

9-
utm_client = infrastructure.UTMClientSession(
9+
utm_client = infrastructure.utm_client_session_factory.get_session(
1010
webapp.config[config.KEY_DSS_URL],
1111
auth.make_auth_adapter(webapp.config[config.KEY_AUTH_SPEC]),
1212
)

monitoring/mock_uss/riddp/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
33
from monitoring.mock_uss.riddp.config import KEY_RID_VERSION
44
from monitoring.monitorlib import auth
5-
from monitoring.monitorlib.infrastructure import UTMClientSession
5+
from monitoring.monitorlib.infrastructure import utm_client_session_factory
66
from monitoring.monitorlib.rid import RIDVersion
77

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

23-
utm_client = UTMClientSession(
23+
utm_client = utm_client_session_factory.get_session(
2424
_dss_base_url,
2525
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
2626
)

monitoring/mock_uss/ridsp/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from monitoring.mock_uss.config import KEY_AUTH_SPEC, KEY_DSS_URL
33
from monitoring.mock_uss.riddp.config import KEY_RID_VERSION
44
from monitoring.monitorlib import auth
5-
from monitoring.monitorlib.infrastructure import UTMClientSession
5+
from monitoring.monitorlib.infrastructure import (
6+
utm_client_session_factory,
7+
)
68
from monitoring.monitorlib.rid import RIDVersion
79

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

21-
utm_client = UTMClientSession(
23+
utm_client = utm_client_session_factory.get_session(
2224
_dss_base_url,
2325
auth.make_auth_adapter(webapp.config[KEY_AUTH_SPEC]),
2426
)

monitoring/mock_uss/tracer/context.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
from monitoring.monitorlib import infrastructure
1111
from monitoring.monitorlib.auth import make_auth_adapter
1212
from monitoring.monitorlib.fetch import scd
13-
from monitoring.monitorlib.infrastructure import AuthAdapter, AuthSpec, UTMClientSession
13+
from monitoring.monitorlib.infrastructure import (
14+
AuthAdapter,
15+
AuthSpec,
16+
UTMClientSession,
17+
utm_client_session_factory,
18+
)
1419
from monitoring.monitorlib.rid import RIDVersion
1520

1621
scd_cache: dict[ObservationAreaID, dict[str, scd.FetchedEntity]] = {}
@@ -84,4 +89,4 @@ def resolve_scd_dss_base_url(dss_base_url: str | None) -> str:
8489
def get_client(auth_spec: AuthSpec, dss_base_url: str) -> UTMClientSession:
8590
if auth_spec not in _adapters:
8691
_adapters[auth_spec] = make_auth_adapter(auth_spec)
87-
return UTMClientSession(dss_base_url, _adapters[auth_spec])
92+
return utm_client_session_factory.get_session(dss_base_url, _adapters[auth_spec])

monitoring/monitorlib/clients/versioning/client_interuss_test.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@
88
RequestDescription,
99
ResponseDescription,
1010
)
11-
from monitoring.monitorlib.infrastructure import UTMClientSession
11+
from monitoring.monitorlib.infrastructure import (
12+
utm_client_session_factory,
13+
)
1214
from monitoring.uss_qualifier.configurations.configuration import ParticipantID
1315

1416
from .client_interuss import InterUSSVersioningClient, VersionQueryError
1517

1618

1719
@pytest.fixture
1820
def client():
19-
return InterUSSVersioningClient(UTMClientSession(prefix_url="/"), ParticipantID())
21+
return InterUSSVersioningClient(
22+
utm_client_session_factory.get_session(prefix_url="/"), ParticipantID()
23+
)
2024

2125

2226
def build_query_response(code, data):

monitoring/monitorlib/infrastructure.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ def __init__(
111111
auth_adapter: AuthAdapter | None = None,
112112
timeout_seconds: float | None = None,
113113
):
114+
"""Instances should usually be constructed using a factory to avoid unnecessary duplication."""
115+
114116
super().__init__()
115117

116118
with UTMClientSession._session_id_lock:
@@ -223,6 +225,31 @@ def delete(self, *args, **kwargs):
223225
return super().delete(*args, **kwargs)
224226

225227

228+
class UTMClientSessionFactory:
229+
_sessions: dict[tuple, UTMClientSession]
230+
231+
def __init__(self):
232+
self._sessions = {}
233+
234+
def get_session(
235+
self,
236+
prefix_url: str,
237+
auth_adapter: AuthAdapter | None = None,
238+
timeout_seconds: float | None = None,
239+
) -> UTMClientSession:
240+
key = (prefix_url, auth_adapter, timeout_seconds)
241+
if key not in self._sessions:
242+
self._sessions[key] = UTMClientSession(
243+
prefix_url=prefix_url,
244+
auth_adapter=auth_adapter,
245+
timeout_seconds=timeout_seconds,
246+
)
247+
return self._sessions[key]
248+
249+
250+
utm_client_session_factory = UTMClientSessionFactory()
251+
252+
226253
class AsyncUTMTestSession:
227254
"""
228255
Requests Asyncio client session that provides additional functionality for running DSS concurrency tests:

monitoring/prober/conftest.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
import uas_standards.astm.f3548.v21.constants as v21_constants
77

88
from monitoring.monitorlib import auth, scd
9-
from monitoring.monitorlib.infrastructure import AsyncUTMTestSession, UTMClientSession
9+
from monitoring.monitorlib.infrastructure import (
10+
AsyncUTMTestSession,
11+
UTMClientSession,
12+
utm_client_session_factory,
13+
)
1014
from monitoring.prober.infrastructure import (
1115
IDFactory,
1216
ResourceType,
@@ -120,7 +124,9 @@ def make_session(
120124
pytest.skip(f"{auth_option} option not set")
121125
auth_adapter = auth.make_auth_adapter(auth_spec)
122126

123-
s = UTMClientSession(dss_endpoint + endpoint_suffix, auth_adapter)
127+
s = utm_client_session_factory.get_session(
128+
dss_endpoint + endpoint_suffix, auth_adapter
129+
)
124130
return s
125131

126132

monitoring/uss_qualifier/resources/astm/f3411/dss.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def __init__(
8282
specification.participant_id,
8383
specification.base_url,
8484
specification.rid_version,
85-
infrastructure.UTMClientSession(
85+
infrastructure.utm_client_session_factory.get_session(
8686
specification.base_url, auth_adapter.adapter
8787
),
8888
)

monitoring/uss_qualifier/resources/astm/f3548/v21/dss.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@
4444
from monitoring.monitorlib.fetch import Query, QueryError, QueryType, query_and_describe
4545
from monitoring.monitorlib.fetch import scd as fetch
4646
from monitoring.monitorlib.fetch.scd import FetchedSubscription, FetchedSubscriptions
47-
from monitoring.monitorlib.infrastructure import UTMClientSession
47+
from monitoring.monitorlib.infrastructure import (
48+
UTMClientSession,
49+
utm_client_session_factory,
50+
)
4851
from monitoring.monitorlib.inspection import calling_function_name, fullname
4952
from monitoring.monitorlib.mutate import scd as mutate
5053
from monitoring.monitorlib.mutate.scd import MutatedSubscription
@@ -129,7 +132,7 @@ def with_different_auth(
129132
participant_id=self.participant_id,
130133
user_participant_ids=self.user_participant_ids,
131134
base_url=self.base_url,
132-
client=UTMClientSession(
135+
client=utm_client_session_factory.get_session(
133136
self.base_url,
134137
auth_adapter=auth_adapter.adapter,
135138
timeout_seconds=self.client.timeout_seconds,
@@ -717,7 +720,7 @@ def __init__(
717720
if "timeout_seconds" in specification
718721
else None
719722
)
720-
self._client = UTMClientSession(
723+
self._client = utm_client_session_factory.get_session(
721724
self._specification.base_url, auth_adapter.adapter, timeout_seconds
722725
)
723726

0 commit comments

Comments
 (0)