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

Commit fe5d4a8

Browse files
committed
Merge branch 'PS-9877-upload-workspace' into development
2 parents 8252626 + 4266224 commit fe5d4a8

18 files changed

+596
-109
lines changed

Pipfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ verify_ssl = true
66
[packages]
77
e1839a8 = {path = ".",editable = true}
88
requests = {extras = ["security"]}
9+
requests-toolbelt = "*"
10+
progressbar2 = "*"
911
cryptography = {extras = ["security"]}
1012
"boto3" = "*"
1113
botocore = "*"
@@ -17,6 +19,7 @@ click-didyoumean = "*"
1719
click-help-colors = "*"
1820
colorama = "*"
1921

22+
2023
[dev-packages]
2124
twine = "*"
2225
pypandoc = "*"

Pipfile.lock

Lines changed: 65 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

paperspace/cli/cli.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,19 @@ def common_experiments_create_options(f):
5050
"--ports",
5151
help="Port to use in new experiment",
5252
),
53+
click.option(
54+
"--workspace",
55+
"workspace",
56+
help="Path to workspace directory",
57+
),
58+
click.option(
59+
"--workspaceArchive",
60+
"workspaceArchive",
61+
help="Path to workspace .zip archive",
62+
),
5363
click.option(
5464
"--workspaceUrl",
5565
"workspaceUrl",
56-
required=True,
5766
help="Project git repository url",
5867
),
5968
click.option(
@@ -239,7 +248,8 @@ def common_experiments_create_single_node_options(f):
239248
def create_multi_node(api_key, **kwargs):
240249
del_if_value_is_none(kwargs)
241250
experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
242-
experiments_commands.create_experiment(kwargs, api=experiments_api)
251+
command = experiments_commands.CreateExperimentCommand(api=experiments_api)
252+
command.execute(kwargs)
243253

244254

245255
@create_experiment.command(name="singlenode", help="Create single node experiment")
@@ -249,7 +259,8 @@ def create_single_node(api_key, **kwargs):
249259
kwargs["experimentTypeId"] = constants.ExperimentType.SINGLE_NODE
250260
del_if_value_is_none(kwargs)
251261
experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
252-
experiments_commands.create_experiment(kwargs, api=experiments_api)
262+
command = experiments_commands.CreateExperimentCommand(api=experiments_api)
263+
command.execute(kwargs)
253264

254265

255266
@create_and_start_experiment.command(name="multinode", help="Create and start new multi node experiment")
@@ -258,7 +269,8 @@ def create_single_node(api_key, **kwargs):
258269
def create_and_start_multi_node(api_key, **kwargs):
259270
del_if_value_is_none(kwargs)
260271
experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
261-
experiments_commands.create_and_start_experiment(kwargs, api=experiments_api)
272+
command = experiments_commands.CreateAndStartExperimentCommand(api=experiments_api)
273+
command.execute(kwargs)
262274

263275

264276
@create_and_start_experiment.command(name="singlenode", help="Create and start new single node experiment")
@@ -268,7 +280,8 @@ def create_and_start_single_node(api_key, **kwargs):
268280
kwargs["experimentTypeId"] = constants.ExperimentType.SINGLE_NODE
269281
del_if_value_is_none(kwargs)
270282
experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
271-
experiments_commands.create_and_start_experiment(kwargs, api=experiments_api)
283+
command = experiments_commands.CreateAndStartExperimentCommand(api=experiments_api)
284+
command.execute(kwargs)
272285

273286

274287
@experiments.command("start", help="Start experiment")

paperspace/cli/jobs.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from paperspace import client, config
44
from paperspace.cli import common
5+
from paperspace.cli.cli_types import json_string
6+
from paperspace.cli.common import del_if_value_is_none
57
from paperspace.cli.cli import cli
68
from paperspace.commands import jobs as jobs_commands
79

@@ -63,6 +65,35 @@ def list_jobs(api_key, **filters):
6365
command.execute(filters)
6466

6567

68+
@jobs_group.command("create", help="Create job")
69+
@click.option("--name", "name", help="Job name", required=True)
70+
@click.option("--machineType", "machineType", help="Virtual machine type")
71+
@click.option("--container", "container", help="Docker container")
72+
@click.option("--command", "command", help="Job command/entrypoint")
73+
@click.option("--ports", "ports", help="Mapped ports")
74+
@click.option("--isPublic", "isPublic", help="Flag: is job public")
75+
@click.option("--workspace", "workspace", required=False, help="Path to workspace directory")
76+
@click.option("--workspaceArchive", "workspaceArchive", required=False, help="Path to workspace archive")
77+
@click.option("--workspaceUrl", "workspaceUrl", required=False, help="Project git repository url")
78+
@click.option("--workingDirectory", "workingDirectory", help="Working directory for the experiment", )
79+
@click.option("--experimentId", "experimentId", help="Experiment Id")
80+
@click.option("--jobEnv", "envVars", type=json_string, help="Environmental variables ")
81+
@click.option("--useDockerfile", "useDockerfile", help="Flag: using Dockerfile")
82+
@click.option("--isPreemptible", "isPreemptible", help="Flag: isPreemptible")
83+
@click.option("--project", "project", help="Project name")
84+
@click.option("--projectHandle", "--projectId", "projectHandle", help="Project handle", required=True)
85+
@click.option("--startedByUserId", "startedByUserId", help="User ID")
86+
@click.option("--relDockerfilePath", "relDockerfilePath", help="Relative path to Dockerfile")
87+
@click.option("--registryUsername", "registryUsername", help="Docker registry username")
88+
@click.option("--registryPassword", "registryPassword", help="Docker registry password")
89+
@common.api_key_option
90+
def create_job(api_key, **kwargs):
91+
del_if_value_is_none(kwargs)
92+
jobs_api = client.API(config.CONFIG_HOST, api_key=api_key)
93+
command = jobs_commands.CreateJobCommand(api=jobs_api)
94+
command.execute(kwargs)
95+
96+
6697
@jobs_group.command("log", help="List job logs")
6798
@click.option(
6899
"--jobId",

paperspace/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ def get_path(self, url):
2828
template = "{}{}" if url.startswith("/") else "{}/{}"
2929
return template.format(api_url, url)
3030

31-
def post(self, url, json=None, params=None):
31+
def post(self, url, json=None, params=None, files=None):
3232
path = self.get_path(url)
33-
response = requests.post(path, json=json, params=params, headers=self.headers)
33+
response = requests.post(path, json=json, params=params, headers=self.headers, files=files)
3434
logger.debug("POST request sent to: {} \n\theaders: {}\n\tjson: {}\n\tparams: {}"
3535
.format(response.url, self.headers, json, params))
3636
logger.debug("Response status code: {}".format(response.status_code))

paperspace/commands/experiments.py

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,57 @@
33
import terminaltables
44

55
from paperspace import logger, constants, client, config
6+
from paperspace.commands import CommandBase
7+
from paperspace.workspace import S3WorkspaceHandler
68
from paperspace.logger import log_response
79
from paperspace.utils import get_terminal_lines
810

911
experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, headers=client.default_headers)
1012

1113

12-
def _log_create_experiment(response, success_msg_template, error_msg, logger_=logger):
13-
if response.ok:
14-
j = response.json()
15-
handle = j["handle"]
16-
msg = success_msg_template.format(handle)
17-
logger_.log(msg)
18-
else:
19-
try:
20-
data = response.json()
21-
logger_.log_error_response(data)
22-
except ValueError:
23-
logger_.error(error_msg)
14+
class ExperimentCommand(CommandBase):
15+
def __init__(self, workspace_handler=None, **kwargs):
16+
super(ExperimentCommand, self).__init__(**kwargs)
17+
self._workspace_handler = workspace_handler or S3WorkspaceHandler(experiments_api=self.api, logger=self.logger)
18+
19+
def _log_create_experiment(self, response, success_msg_template, error_msg):
20+
if response.ok:
21+
j = response.json()
22+
handle = j["handle"]
23+
msg = success_msg_template.format(handle)
24+
self.logger.log(msg)
25+
else:
26+
try:
27+
data = response.json()
28+
self.logger.log_error_response(data)
29+
except ValueError:
30+
self.logger.error(error_msg)
31+
32+
33+
class CreateExperimentCommand(ExperimentCommand):
34+
35+
def execute(self, json_):
36+
workspace_url = self._workspace_handler.upload_workspace(json_)
37+
if workspace_url:
38+
json_['workspaceUrl'] = workspace_url
2439

40+
response = self.api.post("/experiments/", json=json_)
2541

26-
def create_experiment(json_, api=experiments_api):
27-
response = api.post("/experiments/", json=json_)
42+
self._log_create_experiment(response,
43+
"New experiment created with handle: {}",
44+
"Unknown error while creating the experiment")
2845

29-
_log_create_experiment(response,
30-
"New experiment created with handle: {}",
31-
"Unknown error while creating the experiment")
3246

47+
class CreateAndStartExperimentCommand(ExperimentCommand):
48+
def execute(self, json_):
49+
workspace_url = self._workspace_handler.upload_workspace(json_)
50+
if workspace_url:
51+
json_['workspaceUrl'] = workspace_url
3352

34-
def create_and_start_experiment(json_, api=experiments_api):
35-
response = api.post("/experiments/create_and_start/", json=json_)
36-
_log_create_experiment(response,
37-
"New experiment created and started with handle: {}",
38-
"Unknown error while creating/starting the experiment")
53+
response = self.api.post("/experiments/create_and_start/", json=json_)
54+
self._log_create_experiment(response,
55+
"New experiment created and started with handle: {}",
56+
"Unknown error while creating/starting the experiment")
3957

4058

4159
def start_experiment(experiment_handle, api=experiments_api):

0 commit comments

Comments
 (0)