Skip to content

Commit 8de6e2b

Browse files
authored
Merge pull request #5 from kbase/dev-client
Add dynamic service support
2 parents ec99db3 + d146ba5 commit 8de6e2b

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

src/kbase/sdk_baseclient.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ def __init__(
107107
if self.timeout < 1:
108108
raise ValueError("Timeout value must be at least 1 second")
109109

110-
def _call(self, url: str, method: str, params: list[Any], context: dict[str, Any] | None):
110+
def _call(
111+
self, url: str, method: str, params: list[Any], context: dict[str, Any] | None = None
112+
):
111113
arg_hash = {"method": method,
112114
"params": params,
113115
"version": "1.1",
@@ -149,6 +151,21 @@ def _call(self, url: str, method: str, params: list[Any], context: dict[str, Any
149151
return resp["result"][0]
150152
return resp["result"]
151153

154+
def _get_service_url(self, service_method: str, service_version: str | None):
155+
if not self.lookup_url:
156+
return self.url
157+
service = service_method.split(".")[0]
158+
service_status_ret = self._call(
159+
self.url, "ServiceWizard.get_service_status",
160+
[{"module_name": service, "version": service_version}]
161+
)
162+
return service_status_ret["url"]
163+
164+
def _set_up_context(self, service_ver: str = None):
165+
if service_ver:
166+
return {"service_ver": service_ver}
167+
return None
168+
152169
def call_method(self, service_method: str, args: list[Any], *, service_ver: str | None = None):
153170
"""
154171
Call a standard or dynamic service synchronously.
@@ -159,8 +176,6 @@ def call_method(self, service_method: str, args: list[Any], *, service_ver: str
159176
service_ver - the version of the service to run, e.g. a git hash
160177
or dev/beta/release.
161178
"""
162-
# TDOO NEXT implement dynamic methods
163-
#url = self._get_service_url(service_method, service_ver)
164-
#context = self._set_up_context(service_ver)
165-
url = self.url
166-
return self._call(url, service_method, args, None)
179+
url = self._get_service_url(service_method, service_ver)
180+
context = self._set_up_context(service_ver)
181+
return self._call(url, service_method, args, context)

test/test_sdk_baseclient.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,41 @@ def test_missing_error_key(mockserver):
213213
)
214214
assert got.value.code == 0
215215
assert got.value.data == ""
216+
217+
218+
###
219+
# Dynamic service tests
220+
#
221+
# All of the 3 ways of calling services use the same underlying _call method, so we don't
222+
# reiterate those tests every time.
223+
###
224+
225+
def test_dynamic_service(url_and_token):
226+
bc = sdk_baseclient.SDKBaseClient(
227+
url_and_token[0] + "/services/service_wizard", lookup_url=True
228+
)
229+
res = bc.call_method("HTMLFileSetServ.status", [])
230+
del res["git_commit_hash"]
231+
ver = res["version"]
232+
del res["version"]
233+
assert res == {
234+
'git_url': 'https://github.com/kbaseapps/HTMLFileSetServ',
235+
'message': '',
236+
'state': 'OK',
237+
}
238+
assert semver.Version.parse(ver) > semver.Version.parse("0.0.8")
239+
240+
241+
def test_dynamic_service_with_service_version(url_and_token):
242+
# Current version of HFS is 0.0.9 everywhere
243+
bc = sdk_baseclient.SDKBaseClient(
244+
url_and_token[0] + "/services/service_wizard", lookup_url=True
245+
)
246+
res = bc.call_method("HTMLFileSetServ.status", [], service_ver="0.0.8")
247+
del res["git_commit_hash"]
248+
assert res == {
249+
'git_url': 'https://github.com/kbaseapps/HTMLFileSetServ',
250+
'message': '',
251+
'state': 'OK',
252+
"version": "0.0.8"
253+
}

0 commit comments

Comments
 (0)