diff --git a/paperspace/cli/experiments.py b/paperspace/cli/experiments.py index 26cd76e..c341dc4 100644 --- a/paperspace/cli/experiments.py +++ b/paperspace/cli/experiments.py @@ -81,14 +81,9 @@ def common_experiments_create_options(f): ), click.option( "--projectId", - "projectId", - help="Project ID", - ), - click.option( - "--projectHandle", "projectHandle", required=True, - help="Project handle", + help="Project ID", ), click.option( "--modelType", @@ -278,33 +273,33 @@ def create_and_start_single_node(api_key, **kwargs): @experiments.command("start", help="Start experiment") -@click.argument("experiment-handle") +@click.argument("experiment-id") @api_key_option -def start_experiment(experiment_handle, api_key): +def start_experiment(experiment_id, api_key): experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key) - experiments_commands.start_experiment(experiment_handle, api=experiments_api) + experiments_commands.start_experiment(experiment_id, api=experiments_api) @experiments.command("stop", help="Stop experiment") -@click.argument("experiment-handle") +@click.argument("experiment-id") @api_key_option -def stop_experiment(experiment_handle, api_key): +def stop_experiment(experiment_id, api_key): experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key) - experiments_commands.stop_experiment(experiment_handle, api=experiments_api) + experiments_commands.stop_experiment(experiment_id, api=experiments_api) @experiments.command("list", help="List experiments") -@click.option("--projectHandle", "-p", "project_handles", multiple=True) +@click.option("--projectId", "-p", "project_ids", multiple=True) @api_key_option -def list_experiments(project_handles, api_key): +def list_experiments(project_ids, api_key): experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key) command = experiments_commands.ListExperimentsCommand(api=experiments_api) - command.execute(project_handles) + command.execute(project_ids) @experiments.command("details", help="Show detail of an experiment") -@click.argument("experiment-handle") +@click.argument("experiment-id") @api_key_option -def get_experiment_details(experiment_handle, api_key): +def get_experiment_details(experiment_id, api_key): experiments_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key) - experiments_commands.get_experiment_details(experiment_handle, api=experiments_api) + experiments_commands.get_experiment_details(experiment_id, api=experiments_api) diff --git a/paperspace/cli/jobs.py b/paperspace/cli/jobs.py index 7a78e7a..cdfadd5 100644 --- a/paperspace/cli/jobs.py +++ b/paperspace/cli/jobs.py @@ -81,7 +81,7 @@ def list_jobs(api_key, **filters): @click.option("--useDockerfile", "useDockerfile", help="Flag: using Dockerfile") @click.option("--isPreemptible", "isPreemptible", help="Flag: isPreemptible") @click.option("--project", "project", help="Project name") -@click.option("--projectHandle", "--projectId", "projectHandle", help="Project handle", required=True) +@click.option("--projectId", "projectHandle", help="Project ID", required=True) @click.option("--startedByUserId", "startedByUserId", help="User ID") @click.option("--relDockerfilePath", "relDockerfilePath", help="Relative path to Dockerfile") @click.option("--registryUsername", "registryUsername", help="Docker registry username") diff --git a/paperspace/commands/experiments.py b/paperspace/commands/experiments.py index f2d358e..979edcf 100644 --- a/paperspace/commands/experiments.py +++ b/paperspace/commands/experiments.py @@ -19,8 +19,8 @@ def __init__(self, workspace_handler=None, **kwargs): def _log_create_experiment(self, response, success_msg_template, error_msg): if response.ok: j = response.json() - handle = j["handle"] - msg = success_msg_template.format(handle) + id_ = j["handle"] + msg = success_msg_template.format(id_) self.logger.log(msg) else: try: @@ -40,7 +40,7 @@ def execute(self, json_): response = self.api.post("/experiments/", json=json_) self._log_create_experiment(response, - "New experiment created with handle: {}", + "New experiment created with ID: {}", "Unknown error while creating the experiment") @@ -52,18 +52,18 @@ def execute(self, json_): response = self.api.post("/experiments/create_and_start/", json=json_) self._log_create_experiment(response, - "New experiment created and started with handle: {}", + "New experiment created and started with ID: {}", "Unknown error while creating/starting the experiment") -def start_experiment(experiment_handle, api=experiments_api): - url = "/experiments/{}/start/".format(experiment_handle) +def start_experiment(experiment_id, api=experiments_api): + url = "/experiments/{}/start/".format(experiment_id) response = api.put(url) log_response(response, "Experiment started", "Unknown error while starting the experiment") -def stop_experiment(experiment_handle, api=experiments_api): - url = "/experiments/{}/stop/".format(experiment_handle) +def stop_experiment(experiment_id, api=experiments_api): + url = "/experiments/{}/stop/".format(experiment_id) response = api.put(url) log_response(response, "Experiment stopped", "Unknown error while stopping the experiment") @@ -73,9 +73,9 @@ def __init__(self, api=experiments_api, logger_=logger): self.api = api self.logger = logger_ - def execute(self, project_handles=None): - project_handles = project_handles or [] - params = self._get_query_params(project_handles) + def execute(self, project_ids=None): + project_ids = project_ids or [] + params = self._get_query_params(project_ids) response = self.api.get("/experiments/", params=params) try: @@ -84,24 +84,24 @@ def execute(self, project_handles=None): self.logger.log_error_response(data) return - experiments = self._get_experiments_list(data, bool(project_handles)) + experiments = self._get_experiments_list(data, bool(project_ids)) except (ValueError, KeyError) as e: self.logger.error("Error while parsing response data: {}".format(e)) else: self._log_experiments_list(experiments) @staticmethod - def _get_query_params(project_handles): + def _get_query_params(project_ids): params = {"limit": -1} # so the API sends back full list without pagination - for i, handle in enumerate(project_handles): + for i, experiment_id in enumerate(project_ids): key = "projectHandle[{}]".format(i) - params[key] = handle + params[key] = experiment_id return params @staticmethod def _make_experiments_list_table(experiments): - data = [("Name", "Handle", "Status")] + data = [("Name", "ID", "Status")] for experiment in experiments: name = experiment["templateHistory"]["params"].get("name") handle = experiment["handle"] @@ -114,7 +114,7 @@ def _make_experiments_list_table(experiments): @staticmethod def _get_experiments_list(data, filtered=False): - if not filtered: # If filtering by projectHandle response data has different format... + if not filtered: # If filtering by project ID response data has different format... return data["data"] experiments = [] @@ -138,10 +138,10 @@ def _make_details_table(experiment): if experiment["experimentTypeId"] == constants.ExperimentType.SINGLE_NODE: data = ( ("Name", experiment["templateHistory"]["params"].get("name")), - ("Handle", experiment.get("handle")), + ("ID", experiment.get("handle")), ("State", constants.ExperimentState.get_state_str(experiment.get("state"))), ("Ports", experiment["templateHistory"]["params"].get("ports")), - ("Project Handle", experiment["templateHistory"]["params"].get("project_handle")), + ("Project ID", experiment["templateHistory"]["params"].get("project_handle")), ("Worker Command", experiment["templateHistory"]["params"].get("worker_command")), ("Worker Container", experiment["templateHistory"]["params"].get("worker_container")), ("Worker Machine Type", experiment["templateHistory"]["params"].get("worker_machine_type")), @@ -154,7 +154,7 @@ def _make_details_table(experiment): constants.ExperimentType.MPI_MULTI_NODE): data = ( ("Name", experiment["templateHistory"]["params"].get("name")), - ("Handle", experiment.get("handle")), + ("ID", experiment.get("handle")), ("State", constants.ExperimentState.get_state_str(experiment.get("state"))), ("Artifact directory", experiment["templateHistory"]["params"].get("artifactDirectory")), ("Cluster ID", experiment["templateHistory"]["params"].get("clusterId")), @@ -169,7 +169,7 @@ def _make_details_table(experiment): ("Parameter Server Machine Type", experiment["templateHistory"]["params"].get("parameter_server_machine_type")), ("Ports", experiment["templateHistory"]["params"].get("ports")), - ("Project Handle", experiment["templateHistory"]["params"].get("project_handle")), + ("Project ID", experiment["templateHistory"]["params"].get("project_handle")), ("Worker Command", experiment["templateHistory"]["params"].get("worker_command")), ("Worker Container", experiment["templateHistory"]["params"].get("worker_container")), ("Worker Count", experiment["templateHistory"]["params"].get("worker_count")), @@ -185,8 +185,8 @@ def _make_details_table(experiment): return table_string -def get_experiment_details(experiment_handle, api=experiments_api): - url = "/experiments/{}/".format(experiment_handle) +def get_experiment_details(experiment_id, api=experiments_api): + url = "/experiments/{}/".format(experiment_id) response = api.get(url) details = response.content if response.ok: diff --git a/tests/example_responses.py b/tests/example_responses.py index 8868fcf..33fe230 100644 --- a/tests/example_responses.py +++ b/tests/example_responses.py @@ -909,7 +909,7 @@ } LIST_OF_EXPERIMENTS_FILTERED_WITH_TWO_PROJECTS_STDOUT = """+--------+----------------+---------+ -| Name | Handle | Status | +| Name | ID | Status | +--------+----------------+---------+ | dsfads | esj8mcpaayh5kx | failed | | dsfads | estun7jhqta8sm | failed | diff --git a/tests/functional/test_experiments.py b/tests/functional/test_experiments.py index ff965dd..b44abd9 100644 --- a/tests/functional/test_experiments.py +++ b/tests/functional/test_experiments.py @@ -15,7 +15,7 @@ class TestExperimentsCreateSingleNode(object): BASIC_OPTIONS_COMMAND = [ "experiments", "create", "singlenode", "--name", "exp1", - "--projectHandle", "testHandle", + "--projectId", "testHandle", "--container", "testContainer", "--machineType", "testType", "--command", "testCommand", @@ -30,8 +30,7 @@ class TestExperimentsCreateSingleNode(object): "--artifactDirectory", "/artifact/dir/", "--clusterId", 42, "--experimentEnv", '{"key":"val"}', - "--projectId", 987654, - "--projectHandle", "testHandle", + "--projectId", "testHandle", "--container", "testContainer", "--machineType", "testType", "--command", "testCommand", @@ -57,7 +56,6 @@ class TestExperimentsCreateSingleNode(object): "artifactDirectory": u"/artifact/dir/", "clusterId": 42, "experimentEnv": {u"key": u"val"}, - "projectId": 987654, "projectHandle": u"testHandle", "container": u"testContainer", "machineType": u"testType", @@ -69,7 +67,7 @@ class TestExperimentsCreateSingleNode(object): } RESPONSE_JSON_200 = {"handle": "sadkfhlskdjh", "message": "success"} RESPONSE_CONTENT_200 = b'{"handle":"sadkfhlskdjh","message":"success"}\n' - EXPECTED_STDOUT = "New experiment created with handle: sadkfhlskdjh\n" + EXPECTED_STDOUT = "New experiment created with ID: sadkfhlskdjh\n" RESPONSE_JSON_404_PROJECT_NOT_FOUND = {"details": {"handle": "wrong_handle"}, "error": "Project not found"} RESPONSE_CONTENT_404_PROJECT_NOT_FOUND = b'{"details":{"handle":"wrong_handle"},"error":"Project not found"}\n' @@ -109,7 +107,7 @@ def test_should_send_proper_data_and_print_message_when_create_experiment_was_ru assert self.EXPECTED_HEADERS_WITH_CHANGED_API_KEY["X-API-Key"] == "some_key" @mock.patch("paperspace.client.requests.post") - def test_should_send_proper_data_and_print_message_when_create_wrong_project_handle_was_given(self, post_patched): + def test_should_send_proper_data_and_print_message_when_create_wrong_project_id_was_given(self, post_patched): post_patched.return_value = MockResponse(self.RESPONSE_JSON_404_PROJECT_NOT_FOUND, 404, self.RESPONSE_CONTENT_404_PROJECT_NOT_FOUND) @@ -133,7 +131,7 @@ class TestExperimentsCreateMultiNode(object): BASIC_OPTIONS_COMMAND = [ "experiments", "create", "multinode", "--name", "multinode_mpi", - "--projectHandle", "prq70zy79", + "--projectId", "prq70zy79", "--experimentTypeId", "GRPC", "--workerContainer", "wcon", "--workerMachineType", "mty", @@ -155,8 +153,7 @@ class TestExperimentsCreateMultiNode(object): "--artifactDirectory", "/artdir", "--clusterId", 2, "--experimentEnv", '{"key":"val"}', - "--projectId", 34, - "--projectHandle", "prq70zy79", + "--projectId", "prq70zy79", "--experimentTypeId", "MPI", "--workerContainer", "wcon", "--workerMachineType", "mty", @@ -197,8 +194,7 @@ class TestExperimentsCreateMultiNode(object): "artifactDirectory": u"/artdir", "clusterId": 2, "experimentEnv": {"key": "val"}, - "projectId": 34, - "projectHandle": u"prq70zy79", + "projectHandle": "prq70zy79", "experimentTypeId": 3, "workerContainer": u"wcon", "workerMachineType": u"mty", @@ -217,7 +213,7 @@ class TestExperimentsCreateMultiNode(object): } RESPONSE_JSON_200 = {"handle": "sadkfhlskdjh", "message": "success"} RESPONSE_CONTENT_200 = b'{"handle":"sadkfhlskdjh","message":"success"}\n' - EXPECTED_STDOUT = "New experiment created with handle: sadkfhlskdjh\n" + EXPECTED_STDOUT = "New experiment created with ID: sadkfhlskdjh\n" @mock.patch("paperspace.client.requests.post") def test_should_send_proper_data_and_print_message_when_create_experiment_was_run_with_basic_options(self, @@ -257,7 +253,7 @@ class TestExperimentsCreateAndStartSingleNode(TestExperimentsCreateSingleNode): BASIC_OPTIONS_COMMAND = [ "experiments", "createAndStart", "singlenode", "--name", "exp1", - "--projectHandle", "testHandle", + "--projectId", "testHandle", "--container", "testContainer", "--machineType", "testType", "--command", "testCommand", @@ -273,7 +269,7 @@ class TestExperimentsCreateAndStartSingleNode(TestExperimentsCreateSingleNode): "--clusterId", 42, "--experimentEnv", '{"key":"val"}', "--projectId", 987654, - "--projectHandle", "testHandle", + "--projectId", "testHandle", "--container", "testContainer", "--machineType", "testType", "--command", "testCommand", @@ -282,7 +278,7 @@ class TestExperimentsCreateAndStartSingleNode(TestExperimentsCreateSingleNode): "--registryPassword", "passwd", "--apiKey", "some_key", ] - EXPECTED_STDOUT = "New experiment created and started with handle: sadkfhlskdjh\n" + EXPECTED_STDOUT = "New experiment created and started with ID: sadkfhlskdjh\n" class TestExperimentsCreateAndStartMultiNode(TestExperimentsCreateMultiNode): @@ -290,7 +286,7 @@ class TestExperimentsCreateAndStartMultiNode(TestExperimentsCreateMultiNode): BASIC_OPTIONS_COMMAND = [ "experiments", "createAndStart", "multinode", "--name", "multinode_mpi", - "--projectHandle", "prq70zy79", + "--projectId", "prq70zy79", "--experimentTypeId", "GRPC", "--workerContainer", "wcon", "--workerMachineType", "mty", @@ -313,7 +309,7 @@ class TestExperimentsCreateAndStartMultiNode(TestExperimentsCreateMultiNode): "--clusterId", 2, "--experimentEnv", '{"key":"val"}', "--projectId", 34, - "--projectHandle", "prq70zy79", + "--projectId", "prq70zy79", "--experimentTypeId", "MPI", "--workerContainer", "wcon", "--workerMachineType", "mty", @@ -331,7 +327,7 @@ class TestExperimentsCreateAndStartMultiNode(TestExperimentsCreateMultiNode): "--parameterServerRegistryPassword", "psrpass", "--apiKey", "some_key", ] - EXPECTED_STDOUT = "New experiment created and started with handle: sadkfhlskdjh\n" + EXPECTED_STDOUT = "New experiment created and started with ID: sadkfhlskdjh\n" class TestExperimentDetail(object): @@ -466,7 +462,7 @@ class TestExperimentDetail(object): MULTI_NODE_DETAILS_STDOUT = """+-------------------------------+----------------+ | Name | multinode_mpi | +-------------------------------+----------------+ -| Handle | ew69ls0vy3eto | +| ID | ew69ls0vy3eto | | State | created | | Artifact directory | /artdir | | Cluster ID | 2 | @@ -479,7 +475,7 @@ class TestExperimentDetail(object): | Parameter Server Count | 2 | | Parameter Server Machine Type | psmtype | | Ports | 3456 | -| Project Handle | prq70zy79 | +| Project ID | prq70zy79 | | Worker Command | wcom | | Worker Container | wcon | | Worker Count | 2 | @@ -491,10 +487,10 @@ class TestExperimentDetail(object): SINGLE_NODE_DETAILS_STDOUT = """+---------------------+----------------+ | Name | dsfads | +---------------------+----------------+ -| Handle | esro6mbmiulvbl | +| ID | esro6mbmiulvbl | | State | created | | Ports | 5000 | -| Project Handle | prq70zy79 | +| Project ID | prq70zy79 | | Worker Command | sadas | | Worker Container | asd | | Worker Machine Type | C2 | @@ -563,7 +559,7 @@ class TestExperimentList(object): EXPECTED_HEADERS_WITH_CHANGED_API_KEY["X-API-Key"] = "some_key" LIST_JSON = example_responses.LIST_OF_EXPERIMENTS_RESPONSE_JSON DETAILS_STDOUT = """+---------------+---------------+---------+ -| Name | Handle | Status | +| Name | ID | Status | +---------------+---------------+---------+ | dsfads | ea2lfbbpdyzsq | created | | dsfads | em6btk2vtb7it | created | @@ -612,7 +608,7 @@ def test_should_send_get_request_and_print_list_of_experiments_filtered_with_two "fake content") runner = CliRunner() - result = runner.invoke(cli.cli, ["experiments", "list", "--projectHandle", "handle1", "-p", "handle2"]) + result = runner.invoke(cli.cli, ["experiments", "list", "--projectId", "handle1", "-p", "handle2"]) get_patched.assert_called_once_with(self.URL, headers=self.EXPECTED_HEADERS, @@ -630,7 +626,7 @@ def test_should_send_get_request_and_print_list_of_experiments_filtered_with_two "fake content") runner = CliRunner() - result = runner.invoke(cli.cli, ["experiments", "list", "--projectHandle", "handle1", "-p", "handle2"]) + result = runner.invoke(cli.cli, ["experiments", "list", "--projectId", "handle1", "-p", "handle2"]) get_patched.assert_called_once_with(self.URL, headers=self.EXPECTED_HEADERS, @@ -659,12 +655,12 @@ def test_should_print_proper_message_when_wrong_api_key_was_used(self, get_patch class TestStartExperiment(object): - URL = "https://services.paperspace.io/experiments/v1/experiments/some-handle/start/" - COMMAND = ["experiments", "start", "some-handle"] + URL = "https://services.paperspace.io/experiments/v1/experiments/some-id/start/" + COMMAND = ["experiments", "start", "some-id"] EXPECTED_HEADERS = paperspace.client.default_headers.copy() EXPECTED_HEADERS_WITH_CHANGED_API_KEY = paperspace.client.default_headers.copy() EXPECTED_HEADERS_WITH_CHANGED_API_KEY["X-API-Key"] = "some_key" - COMMAND_WITH_API_KEY = ["experiments", "start", "some-handle", "--apiKey", "some_key"] + COMMAND_WITH_API_KEY = ["experiments", "start", "some-id", "--apiKey", "some_key"] RESPONSE_JSON = {"message": "success"} START_STDOUT = "Experiment started\n" diff --git a/tests/test_click_commands.py b/tests/test_click_commands.py index 599b426..50fbdd3 100644 --- a/tests/test_click_commands.py +++ b/tests/test_click_commands.py @@ -13,7 +13,7 @@ def test_should_execute_create_experiment_command_when_cli_singlenode_command_wa runner = CliRunner() command = "experiments create singlenode " \ "--name exp1 " \ - "--projectHandle testHandle " \ + "--projectId testHandle " \ "--container testContainer " \ "--machineType testType " \ "--command testCommand " \ @@ -42,7 +42,7 @@ def test_should_execute_create_experiment_command_when_cli_multinode_mpi_command runner = CliRunner() command = "experiments create multinode " \ "--name exp1 " \ - "--projectHandle testHandle " \ + "--projectId testHandle " \ "--experimentTypeId MPI " \ "--workerContainer testWorkerContainer " \ "--workerMachineType testWorkerMachineType " \ @@ -82,7 +82,7 @@ def test_should_execute_create_experiment_command_when_cli_multinode_grpc_comman runner = CliRunner() command = "experiments create multinode " \ "--name exp1 " \ - "--projectHandle testHandle " \ + "--projectId testHandle " \ "--experimentTypeId GRPC " \ "--workerContainer testWorkerContainer " \ "--workerMachineType testWorkerMachineType " \ @@ -121,7 +121,7 @@ def test_should_execute_create_experiment_command_when_cli_create_and_start_sing runner = CliRunner() command = "experiments createAndStart singlenode " \ "--name exp1 " \ - "--projectHandle testHandle " \ + "--projectId testHandle " \ "--container testContainer " \ "--machineType testType " \ "--command testCommand " \ @@ -150,7 +150,7 @@ def test_should_execute_create_experiment_command_when_cli_create_and_start_mult runner = CliRunner() command = "experiments createAndStart multinode " \ "--name exp1 " \ - "--projectHandle testHandle " \ + "--projectId testHandle " \ "--experimentTypeId MPI " \ "--workerContainer testWorkerContainer " \ "--workerMachineType testWorkerMachineType " \