Skip to content

Commit b3144ae

Browse files
committed
refactor(cli): make internal agent client explicit
* issue #1151
1 parent 0e571a6 commit b3144ae

4 files changed

Lines changed: 84 additions & 19 deletions

File tree

cli/polyaxon/_client/client.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
)
2424
from polyaxon._sdk.async_client.api_client import AsyncApiClient
2525
from polyaxon._sdk.sync_client.api_client import ApiClient
26+
from polyaxon.exceptions import PolyaxonClientException
2627

2728
if TYPE_CHECKING:
2829
from polyaxon._schemas.client import ClientConfig
@@ -72,6 +73,7 @@ def __init__(
7273
config: Optional["ClientConfig"] = None,
7374
token: Optional[str] = None,
7475
is_async: bool = False,
76+
is_internal: bool = False,
7577
):
7678
self._config = config or settings.CLIENT_CONFIG
7779
token = token or self._config.token
@@ -83,6 +85,7 @@ def __init__(
8385
self._config.token = token
8486

8587
self.is_async = is_async
88+
self.is_internal = is_internal
8689
self.api_client = self._get_client()
8790
self._projects_v1 = None
8891
self._runs_v1 = None
@@ -92,7 +95,6 @@ def __init__(
9295
self._users_v1 = None
9396
self._versions_v1 = None
9497
self._agents_v1 = None
95-
self._internal_agents_v1 = None
9698
self._queues_v1 = None
9799
self._service_accounts_v1 = None
98100
self._presets_v1 = None
@@ -104,21 +106,18 @@ def __init__(
104106
self._organizations_v1 = None
105107

106108
def _get_client(self):
109+
if self.is_internal:
110+
headers = self.config.get_internal_header()
111+
if self.is_async:
112+
return AsyncApiClient(self.config.async_internal_sdk_config, **headers)
113+
return ApiClient(self.config.internal_sdk_config, **headers)
114+
107115
if self.is_async:
108116
return AsyncApiClient(
109117
self.config.async_sdk_config, **self.config.client_header
110118
)
111119
return ApiClient(self.config.sdk_config, **self.config.client_header)
112120

113-
def _get_internal_client(self):
114-
if self.is_async:
115-
return AsyncApiClient(
116-
self.config.async_internal_sdk_config, **self.config.get_internal_header()
117-
)
118-
return ApiClient(
119-
self.config.internal_sdk_config, **self.config.get_internal_header()
120-
)
121-
122121
def reset(self):
123122
self._projects_v1 = None
124123
self._runs_v1 = None
@@ -128,7 +127,6 @@ def reset(self):
128127
self._users_v1 = None
129128
self._versions_v1 = None
130129
self._agents_v1 = None
131-
self._internal_agents_v1 = None
132130
self._queues_v1 = None
133131
self._service_accounts_v1 = None
134132
self._presets_v1 = None
@@ -180,12 +178,6 @@ def agents_v1(self):
180178
self._agents_v1 = AgentsV1Api(self.api_client)
181179
return self._agents_v1
182180

183-
@property
184-
def internal_agents_v1(self):
185-
if not self._internal_agents_v1:
186-
self._internal_agents_v1 = AgentsV1Api(self._get_internal_client())
187-
return self._internal_agents_v1
188-
189181
@property
190182
def queues_v1(self):
191183
if not self._queues_v1:

cli/polyaxon/_runner/agent/client.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ def __init__(
1313
owner: Optional[str] = None,
1414
agent_uuid: Optional[str] = None,
1515
client: Optional[PolyaxonClient] = None,
16+
internal_client: Optional[PolyaxonClient] = None,
1617
is_async: bool = False,
1718
):
1819
self.owner = owner
1920
self.agent_uuid = agent_uuid
2021
self.is_async = is_async
2122
self._client = client
23+
self._internal_client = internal_client
2224

2325
@property
2426
def client(self):
@@ -27,6 +29,16 @@ def client(self):
2729
self._client = PolyaxonClient(is_async=self.is_async)
2830
return self._client
2931

32+
@property
33+
def internal_client(self):
34+
if self._internal_client:
35+
return self._internal_client
36+
self._internal_client = PolyaxonClient(
37+
is_async=self.is_async,
38+
is_internal=True,
39+
)
40+
return self._internal_client
41+
3042
@property
3143
def _is_managed(self):
3244
return self.owner is not None and self.agent_uuid is not None
@@ -68,7 +80,7 @@ def cron_agent(self):
6880
)
6981

7082
def collect_agent_data(self, namespace: str):
71-
return self.client.internal_agents_v1.collect_agent_data(
83+
return self.internal_client.agents_v1.collect_agent_data(
7284
owner=self.owner,
7385
uuid=self.agent_uuid,
7486
namespace=namespace,

cli/tests/test_client/test_polyaxon_client.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import pytest
22
import tempfile
33

4+
from mock import patch
5+
46
from polyaxon import settings
57
from polyaxon._client.client import PolyaxonClient
68
from polyaxon._constants.globals import NO_AUTH
@@ -10,9 +12,10 @@
1012
ProjectsV1Api,
1113
RunsV1Api,
1214
UsersV1Api,
13-
VersionsV1Api,
15+
VersionsV1Api, AgentsV1Api,
1416
)
1517
from polyaxon._utils.test_utils import BaseTestCase
18+
from polyaxon.exceptions import PolyaxonClientException
1619

1720

1821
@pytest.mark.client_mark
@@ -24,6 +27,7 @@ def setUp(self):
2427
def test_client_services(self):
2528
settings.AUTH_CONFIG.token = None
2629
client = PolyaxonClient(token=None)
30+
assert client.is_internal is False
2731
assert client.config.token is None
2832

2933
assert isinstance(client.config, ClientConfig)
@@ -34,6 +38,36 @@ def test_client_services(self):
3438
assert isinstance(client.runs_v1, RunsV1Api)
3539
assert isinstance(client.users_v1, UsersV1Api)
3640

41+
def test_internal_client_services(self):
42+
client = PolyaxonClient(is_internal=True)
43+
assert client.is_internal is True
44+
assert isinstance(client.agents_v1, AgentsV1Api)
45+
46+
def test_sync_internal_client_uses_internal_config(self):
47+
settings.CLIENT_CONFIG.token = "token"
48+
with patch("polyaxon._client.client.ApiClient") as api_client:
49+
PolyaxonClient(is_internal=True)
50+
51+
sdk_config = api_client.call_args.args[0]
52+
assert sdk_config.api_key_prefix["ApiKey"] == "InternalToken"
53+
assert (
54+
api_client.call_args.kwargs
55+
== settings.CLIENT_CONFIG.get_internal_header()
56+
)
57+
58+
def test_async_internal_client_uses_async_internal_config(self):
59+
settings.CLIENT_CONFIG.token = "token"
60+
with patch("polyaxon._client.client.AsyncApiClient") as api_client:
61+
PolyaxonClient(is_async=True, is_internal=True)
62+
63+
sdk_config = api_client.call_args.args[0]
64+
assert sdk_config.api_key_prefix["ApiKey"] == "InternalToken"
65+
assert sdk_config.connection_pool_maxsize == 100
66+
assert (
67+
api_client.call_args.kwargs
68+
== settings.CLIENT_CONFIG.get_internal_header()
69+
)
70+
3771
def test_from_config(self):
3872
settings.CLIENT_CONFIG.host = "localhost"
3973
client = PolyaxonClient(config=ClientConfig())

cli/tests/test_runner/test_base_agent.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,30 @@ def test_init_agent_component(self, register):
127127
assert isinstance(agent.executor, MagicMock)
128128
assert isinstance(agent.client, AgentClient)
129129
assert register.call_count == 1
130+
131+
def test_agent_client_uses_internal_client_for_collect_agent_data(self):
132+
public_client = MagicMock()
133+
internal_client = MagicMock()
134+
client = AgentClient(
135+
owner="foo",
136+
agent_uuid="uuid",
137+
client=public_client,
138+
internal_client=internal_client,
139+
)
140+
141+
client.collect_agent_data(namespace="default")
142+
143+
assert public_client.agents_v1.collect_agent_data.call_count == 0
144+
internal_client.agents_v1.collect_agent_data.assert_called_once_with(
145+
owner="foo",
146+
uuid="uuid",
147+
namespace="default",
148+
)
149+
150+
@patch("polyaxon._runner.agent.client.PolyaxonClient")
151+
def test_agent_client_creates_internal_client_with_internal_mode(self, client_cls):
152+
client = AgentClient(owner="foo", agent_uuid="uuid", is_async=True)
153+
154+
_ = client.internal_client
155+
156+
client_cls.assert_called_once_with(is_async=True, is_internal=True)

0 commit comments

Comments
 (0)