Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit dd09bfe

Browse files
committed
Add commands for experiments: start, stop, list, details
1 parent 2feb268 commit dd09bfe

File tree

4 files changed

+95
-22
lines changed

4 files changed

+95
-22
lines changed

paperspace/cli.py

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, type_map, case_sensitive=True):
1414
self.type_map = type_map
1515

1616
def convert(self, value, param, ctx):
17-
value = super(ChoiceType, self).convert(value, param, ctx)
17+
value = super(ChoiceType, self).convert(value, param, ctx).upper()
1818
return self.type_map[value]
1919

2020

@@ -101,6 +101,7 @@ def common_experiments_create_options(f):
101101
click.option(
102102
"--projectHandle",
103103
"projectHandle",
104+
required=True,
104105
),
105106
]
106107
return functools.reduce(lambda x, opt: opt(x), reversed(options), f)
@@ -156,10 +157,6 @@ def common_experiment_create_multi_node_options(f):
156157
type=int,
157158
required=True,
158159
),
159-
click.option(
160-
"--projectHandler",
161-
"projectHandler",
162-
),
163160
click.option(
164161
"--workerContainerUser",
165162
"workerContainerUser",
@@ -226,15 +223,15 @@ def common_experiments_create_single_node_options(f):
226223
@create.command(name="multinode")
227224
@common_experiments_create_options
228225
@common_experiment_create_multi_node_options
229-
def multi_node(**kwargs):
226+
def create_multi_node(**kwargs):
230227
del_if_value_is_none(kwargs)
231228
commands.create_experiments(kwargs)
232229

233230

234231
@create.command(name="singlenode")
235232
@common_experiments_create_options
236233
@common_experiments_create_single_node_options
237-
def single_node(**kwargs):
234+
def create_single_node(**kwargs):
238235
kwargs["experimentTypeId"] = constants.EXPERIMENT_TYPE_SINGLE_NODE_ID
239236
del_if_value_is_none(kwargs)
240237
commands.create_experiments(kwargs)
@@ -243,15 +240,42 @@ def single_node(**kwargs):
243240
@create_and_start.command(name="multinode")
244241
@common_experiments_create_options
245242
@common_experiment_create_multi_node_options
246-
def multi_node(**kwargs):
243+
def create_and_start_multi_node(**kwargs):
247244
del_if_value_is_none(kwargs)
248-
commands.create_experiments(kwargs)
245+
commands.create_and_start_experiments(kwargs)
249246

250247

251248
@create_and_start.command(name="singlenode")
252249
@common_experiments_create_options
253250
@common_experiments_create_single_node_options
254-
def single_node(**kwargs):
251+
def create_and_start_single_node(**kwargs):
255252
kwargs["experimentTypeId"] = constants.EXPERIMENT_TYPE_SINGLE_NODE_ID
256253
del_if_value_is_none(kwargs)
257-
commands.create_experiments(kwargs)
254+
commands.create_and_start_experiments(kwargs)
255+
256+
257+
@experiments.command()
258+
@click.argument("experiment-handle")
259+
def start(experiment_handle):
260+
commands.start_experiment(experiment_handle)
261+
262+
263+
@experiments.command()
264+
@click.argument("experiment-handle")
265+
def stop(experiment_handle):
266+
commands.stop_experiment(experiment_handle)
267+
268+
269+
@experiments.command("list")
270+
def list_experiments():
271+
commands.list_experiments()
272+
273+
274+
@experiments.command("details")
275+
@click.argument("experiment-handle")
276+
def get_experiment_details(experiment_handle):
277+
commands.get_experiment_details(experiment_handle)
278+
279+
# TODO: delete experiment - not implemented in the api
280+
# TODO: modify experiment - not implemented in the api
281+
# TODO: create experiment template?? What is the difference between experiment and experiment template?

paperspace/client.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import requests
22

3+
from paperspace import logger
4+
35

46
class API(object):
57
def __init__(self, api_url, headers=None):
@@ -13,5 +15,21 @@ def get_path(self, url):
1315

1416
def post(self, url, json=None, params=None):
1517
path = self.get_path(url)
18+
logger.debug("Sending POST: {}\nto: {}\nwith headers: {}".format(json, path, self.headers))
1619
response = requests.post(path, json=json, params=params, headers=self.headers)
20+
logger.debug("Response content: {}".format(response.content))
21+
return response
22+
23+
def put(self, url):
24+
path = self.get_path(url)
25+
logger.debug("Sending PUT to {}".format(path))
26+
response = requests.put(path, headers=self.headers)
27+
logger.debug("Response content: {}".format(response.content))
28+
return response
29+
30+
def get(self, url):
31+
path = self.get_path(url)
32+
logger.debug("Sending GET to {}".format(path))
33+
response = requests.get(path, headers=self.headers)
34+
logger.debug("Response content: {}".format(response.content))
1735
return response

paperspace/commands.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
from pprint import pformat
2+
13
from paperspace import version, logger
24
from paperspace.client import API
35
from paperspace.config import config
46

5-
default_headers = {"x-api-key": config.PAPERSPACE_API_KEY,
7+
default_headers = {"X-API-Key": config.PAPERSPACE_API_KEY,
68
"ps_client_name": "paperspace-python",
79
"ps_client_version": version.version}
810

911
experiments_api = API(config.CONFIG_EXPERIMENTS_HOST, headers=default_headers)
10-
jobs_api = API(config.CONFIG_HOST, headers=default_headers)
1112

1213

1314
def _log_response(response, success_msg, error_msg):
@@ -23,11 +24,38 @@ def _log_response(response, success_msg, error_msg):
2324

2425
def create_experiments(json, api=experiments_api):
2526
response = api.post("/experiments/", json=json)
26-
logger.debug(response.content)
2727
_log_response(response, "Experiment created", "Unknown error while creating experiment")
2828

2929

3030
def create_and_start_experiments(json, api=experiments_api):
3131
response = api.post("/experiments/create_and_start/", json=json)
32-
logger.debug(response.content)
3332
_log_response(response, "Experiment created", "Unknown error while creating experiment")
33+
34+
35+
def start_experiment(experiment_handle, api=experiments_api):
36+
url = "/experiments/{}/start/".format(experiment_handle)
37+
response = api.put(url)
38+
_log_response(response, "Experiment started", "Unknown error while starting experiment")
39+
40+
41+
def stop_experiment(experiment_handle, api=experiments_api):
42+
url = "/experiments/{}/stop/".format(experiment_handle)
43+
response = api.put(url)
44+
_log_response(response, "Experiment stopped", "Unknown error while stopping experiment")
45+
46+
47+
def list_experiments(api=experiments_api):
48+
response = api.get("/experiments/")
49+
_log_response(response, "Experiment stopped", "Unknown error while stopping experiment")
50+
51+
52+
def get_experiment_details(experiment_handle, api=experiments_api):
53+
url = "/experiments/{}/".format(experiment_handle)
54+
response = api.get(url)
55+
details = response.content
56+
if response.ok:
57+
try:
58+
details = pformat(response.json()["data"][0])
59+
except (ValueError, KeyError, IndexError):
60+
pass
61+
_log_response(response, details, "Unknown error while retrieving details of the experiment")

paperspace/logger.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ def log_error_response(data):
2121
log(str(error), error=True)
2222

2323
if details:
24-
for key, val in details.items():
25-
if isinstance(val, string_types):
26-
val = [val]
27-
28-
for v in val:
29-
msg = "{}: {}".format(key, str(v))
30-
log(msg, error=True)
24+
if isinstance(details, dict):
25+
for key, val in details.items():
26+
if isinstance(val, string_types):
27+
val = [val]
28+
29+
for v in val:
30+
msg = "{}: {}".format(key, str(v))
31+
log(msg, error=True)
32+
else:
33+
log(details)
3134

3235

3336
def debug(*messages):

0 commit comments

Comments
 (0)