proximl 0.5.10__tar.gz → 0.5.12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {proximl-0.5.10/proximl.egg-info → proximl-0.5.12}/PKG-INFO +1 -1
- {proximl-0.5.10 → proximl-0.5.12}/proximl/__init__.py +1 -1
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/job/create.py +16 -16
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/project/__init__.py +4 -73
- proximl-0.5.10/proximl/cli/project/key.py → proximl-0.5.12/proximl/cli/project/credential.py +27 -23
- proximl-0.5.12/proximl/cli/project/data_connector.py +61 -0
- proximl-0.5.12/proximl/cli/project/datastore.py +61 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/project/secret.py +12 -3
- proximl-0.5.12/proximl/cli/project/service.py +61 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/nodes.py +4 -6
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/providers.py +53 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/regions.py +48 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/exceptions.py +51 -0
- proximl-0.5.10/proximl/projects/keys.py → proximl-0.5.12/proximl/projects/credentials.py +12 -12
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/projects.py +7 -4
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/secrets.py +1 -1
- {proximl-0.5.10 → proximl-0.5.12/proximl.egg-info}/PKG-INFO +1 -1
- {proximl-0.5.10 → proximl-0.5.12}/proximl.egg-info/SOURCES.txt +17 -5
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/projects/conftest.py +3 -1
- proximl-0.5.12/tests/integration/projects/test_projects_credentials_integration.py +45 -0
- proximl-0.5.12/tests/integration/projects/test_projects_data_connectors_integration.py +44 -0
- proximl-0.5.12/tests/integration/projects/test_projects_datastores_integration.py +42 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/projects/test_projects_secrets_integration.py +1 -1
- proximl-0.5.12/tests/integration/projects/test_projects_services_integration.py +44 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_checkpoints_integration.py +1 -1
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_credential_unit.py +26 -0
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_data_connector_unit.py +28 -0
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_datastore_unit.py +26 -0
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_secret_unit.py +26 -0
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_service_unit.py +26 -0
- proximl-0.5.12/tests/unit/cli/projects/test_cli_project_unit.py +19 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/conftest.py +79 -6
- proximl-0.5.12/tests/unit/projects/__init__.py +0 -0
- proximl-0.5.12/tests/unit/projects/test_project_credentials_unit.py +100 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/projects/test_projects_unit.py +1 -1
- proximl-0.5.10/tests/integration/projects/test_projects_keys_integration.py +0 -43
- proximl-0.5.10/tests/unit/cli/test_cli_project_unit.py +0 -42
- proximl-0.5.10/tests/unit/projects/test_project_keys_unit.py +0 -96
- {proximl-0.5.10 → proximl-0.5.12}/LICENSE +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/README.md +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/examples/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/examples/create_dataset_and_training_job.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/examples/local_storage.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/examples/training_inference_pipeline.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/__main__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/auth.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/checkpoints.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/checkpoint.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/data_connector.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/datastore.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/device.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/node.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/provider.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/region.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/cloudbender/service.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/connection.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/dataset.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/environment.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/gpu.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/job/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/model.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cli/volume.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/cloudbender.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/data_connectors.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/datastores.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/device_configs.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/devices.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/cloudbender/services.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/connections.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/datasets.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/environments.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/gpu_types.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/jobs.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/models.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/data_connectors.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/datastores.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/projects/services.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/proximl.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl/volumes.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl.egg-info/dependency_links.txt +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl.egg-info/entry_points.txt +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl.egg-info/requires.txt +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/proximl.egg-info/top_level.txt +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/pyproject.toml +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/setup.cfg +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/setup.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/cloudbender/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/cloudbender/test_providers_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/conftest.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/projects/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/projects/test_projects_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_datasets_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_environments_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_gpu_types_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_jobs_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_models_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/integration/test_volumes_integration.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_datastore_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_device_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_node_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_provider_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_region_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/cloudbender/test_cli_service_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/conftest.py +0 -0
- {proximl-0.5.10/tests/unit/cloudbender → proximl-0.5.12/tests/unit/cli/projects}/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_checkpoint_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_datasets_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_environment_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_gpu_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_job_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_model_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cli/test_cli_volume_unit.py +0 -0
- {proximl-0.5.10/tests/unit/projects → proximl-0.5.12/tests/unit/cloudbender}/__init__.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_data_connectors_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_datastores_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_device_configs_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_devices_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_nodes_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_providers_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_regions_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/cloudbender/test_services_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/projects/test_project_data_connectors_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/projects/test_project_datastores_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/projects/test_project_secrets_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/projects/test_project_services_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_auth_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_checkpoints_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_connections_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_datasets_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_environments_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_exceptions.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_gpu_types_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_jobs_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_models_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_proximl_unit.py +0 -0
- {proximl-0.5.10 → proximl-0.5.12}/tests/unit/test_volumes_unit.py +0 -0
|
@@ -172,12 +172,12 @@ def create(config):
|
|
|
172
172
|
help="Conda packages to install as a comma separated list 'p1,\"p2=v2\",p3'",
|
|
173
173
|
)
|
|
174
174
|
@click.option(
|
|
175
|
-
"--
|
|
175
|
+
"--credential",
|
|
176
176
|
type=click.Choice(
|
|
177
177
|
["aws", "gcp", "kaggle", "azure", "wasabi"],
|
|
178
178
|
case_sensitive=False,
|
|
179
179
|
),
|
|
180
|
-
help="Third Party
|
|
180
|
+
help="Third Party Credentials to add to the job environment",
|
|
181
181
|
multiple=True,
|
|
182
182
|
)
|
|
183
183
|
@click.option(
|
|
@@ -221,7 +221,7 @@ def notebook(
|
|
|
221
221
|
environment,
|
|
222
222
|
custom_image,
|
|
223
223
|
env,
|
|
224
|
-
|
|
224
|
+
credential,
|
|
225
225
|
apt_packages,
|
|
226
226
|
pip_packages,
|
|
227
227
|
conda_packages,
|
|
@@ -254,7 +254,7 @@ def notebook(
|
|
|
254
254
|
data=dict(datasets=datasets),
|
|
255
255
|
model=dict(checkpoints=checkpoints),
|
|
256
256
|
environment=dict(
|
|
257
|
-
|
|
257
|
+
credentials=[k for k in credential],
|
|
258
258
|
),
|
|
259
259
|
)
|
|
260
260
|
|
|
@@ -500,12 +500,12 @@ def notebook(
|
|
|
500
500
|
multiple=True,
|
|
501
501
|
)
|
|
502
502
|
@click.option(
|
|
503
|
-
"--
|
|
503
|
+
"--credential",
|
|
504
504
|
type=click.Choice(
|
|
505
505
|
["aws", "gcp", "kaggle", "azure", "wasabi"],
|
|
506
506
|
case_sensitive=False,
|
|
507
507
|
),
|
|
508
|
-
help="Third Party
|
|
508
|
+
help="Third Party Credentials to add to the job environment",
|
|
509
509
|
multiple=True,
|
|
510
510
|
)
|
|
511
511
|
@click.option(
|
|
@@ -563,7 +563,7 @@ def training(
|
|
|
563
563
|
environment,
|
|
564
564
|
custom_image,
|
|
565
565
|
env,
|
|
566
|
-
|
|
566
|
+
credential,
|
|
567
567
|
apt_packages,
|
|
568
568
|
pip_packages,
|
|
569
569
|
conda_packages,
|
|
@@ -596,7 +596,7 @@ def training(
|
|
|
596
596
|
data=dict(datasets=datasets),
|
|
597
597
|
model=dict(checkpoints=checkpoints),
|
|
598
598
|
environment=dict(
|
|
599
|
-
|
|
599
|
+
credentials=[k for k in credential],
|
|
600
600
|
),
|
|
601
601
|
)
|
|
602
602
|
|
|
@@ -844,12 +844,12 @@ def training(
|
|
|
844
844
|
multiple=True,
|
|
845
845
|
)
|
|
846
846
|
@click.option(
|
|
847
|
-
"--
|
|
847
|
+
"--credential",
|
|
848
848
|
type=click.Choice(
|
|
849
849
|
["aws", "gcp", "kaggle", "azure", "wasabi"],
|
|
850
850
|
case_sensitive=False,
|
|
851
851
|
),
|
|
852
|
-
help="Third Party
|
|
852
|
+
help="Third Party Credentials to add to the job environment",
|
|
853
853
|
multiple=True,
|
|
854
854
|
)
|
|
855
855
|
@click.option(
|
|
@@ -907,7 +907,7 @@ def inference(
|
|
|
907
907
|
environment,
|
|
908
908
|
custom_image,
|
|
909
909
|
env,
|
|
910
|
-
|
|
910
|
+
credential,
|
|
911
911
|
apt_packages,
|
|
912
912
|
pip_packages,
|
|
913
913
|
conda_packages,
|
|
@@ -933,7 +933,7 @@ def inference(
|
|
|
933
933
|
data=dict(datasets=[]),
|
|
934
934
|
model=dict(checkpoints=checkpoints),
|
|
935
935
|
environment=dict(
|
|
936
|
-
|
|
936
|
+
credentials=[k for k in credential],
|
|
937
937
|
),
|
|
938
938
|
)
|
|
939
939
|
|
|
@@ -1163,12 +1163,12 @@ def from_json(config, attach, connect, file):
|
|
|
1163
1163
|
multiple=True,
|
|
1164
1164
|
)
|
|
1165
1165
|
@click.option(
|
|
1166
|
-
"--
|
|
1166
|
+
"--credential",
|
|
1167
1167
|
type=click.Choice(
|
|
1168
1168
|
["aws", "gcp", "kaggle", "azure", "wasabi"],
|
|
1169
1169
|
case_sensitive=False,
|
|
1170
1170
|
),
|
|
1171
|
-
help="Third Party
|
|
1171
|
+
help="Third Party Credentials to add to the job environment",
|
|
1172
1172
|
multiple=True,
|
|
1173
1173
|
)
|
|
1174
1174
|
@click.option(
|
|
@@ -1230,7 +1230,7 @@ def endpoint(
|
|
|
1230
1230
|
environment,
|
|
1231
1231
|
custom_image,
|
|
1232
1232
|
env,
|
|
1233
|
-
|
|
1233
|
+
credential,
|
|
1234
1234
|
apt_packages,
|
|
1235
1235
|
pip_packages,
|
|
1236
1236
|
conda_packages,
|
|
@@ -1257,7 +1257,7 @@ def endpoint(
|
|
|
1257
1257
|
max_price=max_price,
|
|
1258
1258
|
model=dict(checkpoints=checkpoints),
|
|
1259
1259
|
environment=dict(
|
|
1260
|
-
|
|
1260
|
+
credentials=[k for k in credential],
|
|
1261
1261
|
),
|
|
1262
1262
|
)
|
|
1263
1263
|
|
|
@@ -77,77 +77,8 @@ def remove(config, project):
|
|
|
77
77
|
return config.proximl.run(found.remove())
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
@project.command()
|
|
81
|
-
@pass_config
|
|
82
|
-
def list_datastores(config):
|
|
83
|
-
"""List project datastores."""
|
|
84
|
-
data = [
|
|
85
|
-
["ID", "NAME", "TYPE", "REGION_UUID"],
|
|
86
|
-
[
|
|
87
|
-
"-" * 80,
|
|
88
|
-
"-" * 80,
|
|
89
|
-
"-" * 80,
|
|
90
|
-
"-" * 80,
|
|
91
|
-
],
|
|
92
|
-
]
|
|
93
|
-
project = config.proximl.run(
|
|
94
|
-
config.proximl.client.projects.get(config.proximl.client.project)
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
datastores = config.proximl.run(project.list_datastores())
|
|
98
|
-
|
|
99
|
-
for datastore in datastores:
|
|
100
|
-
data.append(
|
|
101
|
-
[
|
|
102
|
-
datastore.id,
|
|
103
|
-
datastore.name,
|
|
104
|
-
datastore.type,
|
|
105
|
-
datastore.region_uuid,
|
|
106
|
-
]
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
for row in data:
|
|
110
|
-
click.echo(
|
|
111
|
-
"{: >38.36} {: >30.28} {: >15.13} {: >38.36}" "".format(*row),
|
|
112
|
-
file=config.stdout,
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
@project.command()
|
|
117
|
-
@pass_config
|
|
118
|
-
def list_services(config):
|
|
119
|
-
"""List project services."""
|
|
120
|
-
data = [
|
|
121
|
-
["ID", "NAME", "HOSTNAME", "REGION_UUID"],
|
|
122
|
-
[
|
|
123
|
-
"-" * 80,
|
|
124
|
-
"-" * 80,
|
|
125
|
-
"-" * 80,
|
|
126
|
-
"-" * 80,
|
|
127
|
-
],
|
|
128
|
-
]
|
|
129
|
-
project = config.proximl.run(
|
|
130
|
-
config.proximl.client.projects.get(config.proximl.client.project)
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
services = config.proximl.run(project.list_services())
|
|
134
|
-
|
|
135
|
-
for service in services:
|
|
136
|
-
data.append(
|
|
137
|
-
[
|
|
138
|
-
service.id,
|
|
139
|
-
service.name,
|
|
140
|
-
service.hostname,
|
|
141
|
-
service.region_uuid,
|
|
142
|
-
]
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
for row in data:
|
|
146
|
-
click.echo(
|
|
147
|
-
"{: >38.36} {: >30.28} {: >30.28} {: >38.36}" "".format(*row),
|
|
148
|
-
file=config.stdout,
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
|
|
152
80
|
from proximl.cli.project.secret import secret
|
|
153
|
-
from proximl.cli.project.
|
|
81
|
+
from proximl.cli.project.credential import credential
|
|
82
|
+
from proximl.cli.project.data_connector import data_connector
|
|
83
|
+
from proximl.cli.project.datastore import datastore
|
|
84
|
+
from proximl.cli.project.service import service
|
proximl-0.5.10/proximl/cli/project/key.py → proximl-0.5.12/proximl/cli/project/credential.py
RENAMED
|
@@ -9,15 +9,15 @@ from proximl.cli.project import project
|
|
|
9
9
|
|
|
10
10
|
@project.group()
|
|
11
11
|
@pass_config
|
|
12
|
-
def
|
|
13
|
-
"""proxiML project
|
|
12
|
+
def credential(config):
|
|
13
|
+
"""proxiML project credential commands."""
|
|
14
14
|
pass
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
@
|
|
17
|
+
@credential.command()
|
|
18
18
|
@pass_config
|
|
19
19
|
def list(config):
|
|
20
|
-
"""List
|
|
20
|
+
"""List credentials."""
|
|
21
21
|
data = [
|
|
22
22
|
["TYPE", "KEY ID", "UPDATED AT"],
|
|
23
23
|
[
|
|
@@ -27,14 +27,14 @@ def list(config):
|
|
|
27
27
|
],
|
|
28
28
|
]
|
|
29
29
|
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
30
|
-
|
|
30
|
+
credentials = config.proximl.run(project.credentials.list())
|
|
31
31
|
|
|
32
|
-
for
|
|
32
|
+
for credential in credentials:
|
|
33
33
|
data.append(
|
|
34
34
|
[
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
credential.type,
|
|
36
|
+
credential.key_id,
|
|
37
|
+
credential.updated_at.isoformat(timespec="seconds"),
|
|
38
38
|
]
|
|
39
39
|
)
|
|
40
40
|
|
|
@@ -45,7 +45,7 @@ def list(config):
|
|
|
45
45
|
)
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
@
|
|
48
|
+
@credential.command()
|
|
49
49
|
@click.argument(
|
|
50
50
|
"type",
|
|
51
51
|
type=click.Choice(
|
|
@@ -65,19 +65,21 @@ def list(config):
|
|
|
65
65
|
@pass_config
|
|
66
66
|
def put(config, type):
|
|
67
67
|
"""
|
|
68
|
-
Set a
|
|
68
|
+
Set a credential.
|
|
69
69
|
|
|
70
|
-
A
|
|
70
|
+
A credential is uploaded.
|
|
71
71
|
"""
|
|
72
72
|
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
73
73
|
|
|
74
74
|
tenant = None
|
|
75
75
|
|
|
76
76
|
if type in ["aws", "wasabi"]:
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
credential_id = click.prompt(
|
|
78
|
+
"Enter the credential ID", type=str, hide_input=False
|
|
79
|
+
)
|
|
80
|
+
secret = click.prompt("Enter the secret credential", type=str, hide_input=True)
|
|
79
81
|
elif type == "azure":
|
|
80
|
-
|
|
82
|
+
credential_id = click.prompt(
|
|
81
83
|
"Enter the Application (client) ID", type=str, hide_input=False
|
|
82
84
|
)
|
|
83
85
|
tenant = click.prompt(
|
|
@@ -85,7 +87,7 @@ def put(config, type):
|
|
|
85
87
|
)
|
|
86
88
|
secret = click.prompt("Enter the client secret", type=str, hide_input=True)
|
|
87
89
|
elif type in ["docker", "huggingface"]:
|
|
88
|
-
|
|
90
|
+
credential_id = click.prompt("Enter the username", type=str, hide_input=False)
|
|
89
91
|
secret = click.prompt("Enter the access token", type=str, hide_input=True)
|
|
90
92
|
elif type in ["gcp", "kaggle"]:
|
|
91
93
|
file_name = click.prompt(
|
|
@@ -95,30 +97,32 @@ def put(config, type):
|
|
|
95
97
|
),
|
|
96
98
|
hide_input=False,
|
|
97
99
|
)
|
|
98
|
-
|
|
100
|
+
credential_id = os.path.basename(file_name)
|
|
99
101
|
with open(file_name) as f:
|
|
100
102
|
secret = json.load(f)
|
|
101
103
|
secret = json.dumps(secret)
|
|
102
104
|
elif type == "ngc":
|
|
103
|
-
|
|
105
|
+
credential_id = "$oauthtoken"
|
|
104
106
|
secret = click.prompt("Enter the access token", type=str, hide_input=True)
|
|
105
107
|
else:
|
|
106
|
-
raise click.UsageError("Unsupported
|
|
108
|
+
raise click.UsageError("Unsupported credential type")
|
|
107
109
|
|
|
108
110
|
return config.proximl.run(
|
|
109
|
-
project.
|
|
111
|
+
project.credentials.put(
|
|
112
|
+
type=type, credential_id=credential_id, secret=secret, tenant=tenant
|
|
113
|
+
)
|
|
110
114
|
)
|
|
111
115
|
|
|
112
116
|
|
|
113
|
-
@
|
|
117
|
+
@credential.command()
|
|
114
118
|
@click.argument("name", type=click.STRING)
|
|
115
119
|
@pass_config
|
|
116
120
|
def remove(config, name):
|
|
117
121
|
"""
|
|
118
|
-
Remove a
|
|
122
|
+
Remove a credential.
|
|
119
123
|
|
|
120
124
|
|
|
121
125
|
"""
|
|
122
126
|
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
123
127
|
|
|
124
|
-
return config.proximl.run(project.
|
|
128
|
+
return config.proximl.run(project.credential.remove(name))
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
import base64
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from proximl.cli import pass_config
|
|
7
|
+
from proximl.cli.project import project
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@project.group()
|
|
11
|
+
@pass_config
|
|
12
|
+
def data_connector(config):
|
|
13
|
+
"""proxiML project data_connector commands."""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@data_connector.command()
|
|
18
|
+
@pass_config
|
|
19
|
+
def list(config):
|
|
20
|
+
"""List project data_connectors."""
|
|
21
|
+
data = [
|
|
22
|
+
["ID", "NAME", "TYPE", "REGION_UUID"],
|
|
23
|
+
[
|
|
24
|
+
"-" * 80,
|
|
25
|
+
"-" * 80,
|
|
26
|
+
"-" * 80,
|
|
27
|
+
"-" * 80,
|
|
28
|
+
],
|
|
29
|
+
]
|
|
30
|
+
project = config.proximl.run(
|
|
31
|
+
config.proximl.client.projects.get(config.proximl.client.project)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
data_connectors = config.proximl.run(project.data_connectors.list())
|
|
35
|
+
|
|
36
|
+
for data_connector in data_connectors:
|
|
37
|
+
data.append(
|
|
38
|
+
[
|
|
39
|
+
data_connector.id,
|
|
40
|
+
data_connector.name,
|
|
41
|
+
data_connector.type,
|
|
42
|
+
data_connector.region_uuid,
|
|
43
|
+
]
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
for row in data:
|
|
47
|
+
click.echo(
|
|
48
|
+
"{: >38.36} {: >30.28} {: >15.13} {: >38.36}" "".format(*row),
|
|
49
|
+
file=config.stdout,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@data_connector.command()
|
|
54
|
+
@pass_config
|
|
55
|
+
def refresh(config):
|
|
56
|
+
"""
|
|
57
|
+
Refresh project data_connector list.
|
|
58
|
+
"""
|
|
59
|
+
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
60
|
+
|
|
61
|
+
return config.proximl.run(project.data_connectors.refresh())
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
import base64
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from proximl.cli import pass_config
|
|
7
|
+
from proximl.cli.project import project
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@project.group()
|
|
11
|
+
@pass_config
|
|
12
|
+
def datastore(config):
|
|
13
|
+
"""proxiML project datastore commands."""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@datastore.command()
|
|
18
|
+
@pass_config
|
|
19
|
+
def list(config):
|
|
20
|
+
"""List project datastores."""
|
|
21
|
+
data = [
|
|
22
|
+
["ID", "NAME", "TYPE", "REGION_UUID"],
|
|
23
|
+
[
|
|
24
|
+
"-" * 80,
|
|
25
|
+
"-" * 80,
|
|
26
|
+
"-" * 80,
|
|
27
|
+
"-" * 80,
|
|
28
|
+
],
|
|
29
|
+
]
|
|
30
|
+
project = config.proximl.run(
|
|
31
|
+
config.proximl.client.projects.get(config.proximl.client.project)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
datastores = config.proximl.run(project.datastores.list())
|
|
35
|
+
|
|
36
|
+
for datastore in datastores:
|
|
37
|
+
data.append(
|
|
38
|
+
[
|
|
39
|
+
datastore.id,
|
|
40
|
+
datastore.name,
|
|
41
|
+
datastore.type,
|
|
42
|
+
datastore.region_uuid,
|
|
43
|
+
]
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
for row in data:
|
|
47
|
+
click.echo(
|
|
48
|
+
"{: >38.36} {: >30.28} {: >15.13} {: >38.36}" "".format(*row),
|
|
49
|
+
file=config.stdout,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@datastore.command()
|
|
54
|
+
@pass_config
|
|
55
|
+
def refresh(config):
|
|
56
|
+
"""
|
|
57
|
+
Refresh project datastore list.
|
|
58
|
+
"""
|
|
59
|
+
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
60
|
+
|
|
61
|
+
return config.proximl.run(project.datastores.refresh())
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import click
|
|
2
|
+
import os
|
|
2
3
|
from proximl.cli import pass_config
|
|
3
4
|
from proximl.cli.project import project
|
|
4
5
|
|
|
@@ -42,17 +43,25 @@ def list(config):
|
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
@secret.command()
|
|
46
|
+
@click.option(
|
|
47
|
+
"--file",
|
|
48
|
+
type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True),
|
|
49
|
+
help="Load the secret value from the file at the provided path",
|
|
50
|
+
)
|
|
45
51
|
@click.argument("name", type=click.STRING)
|
|
46
52
|
@pass_config
|
|
47
|
-
def put(config, name):
|
|
53
|
+
def put(config, file, name):
|
|
48
54
|
"""
|
|
49
55
|
Set a secret value.
|
|
50
56
|
|
|
51
57
|
Secret is created with the specified NAME.
|
|
52
58
|
"""
|
|
53
59
|
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
if file:
|
|
61
|
+
with open(os.path.expanduser(file)) as f:
|
|
62
|
+
value = f.read()
|
|
63
|
+
else:
|
|
64
|
+
value = click.prompt("Enter the secret value", type=str, hide_input=True)
|
|
56
65
|
|
|
57
66
|
return config.proximl.run(project.secrets.put(name=name, value=value))
|
|
58
67
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
import base64
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from proximl.cli import pass_config
|
|
7
|
+
from proximl.cli.project import project
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@project.group()
|
|
11
|
+
@pass_config
|
|
12
|
+
def service(config):
|
|
13
|
+
"""proxiML project service commands."""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@service.command()
|
|
18
|
+
@pass_config
|
|
19
|
+
def list(config):
|
|
20
|
+
"""List project services."""
|
|
21
|
+
data = [
|
|
22
|
+
["ID", "NAME", "TYPE", "REGION_UUID"],
|
|
23
|
+
[
|
|
24
|
+
"-" * 80,
|
|
25
|
+
"-" * 80,
|
|
26
|
+
"-" * 80,
|
|
27
|
+
"-" * 80,
|
|
28
|
+
],
|
|
29
|
+
]
|
|
30
|
+
project = config.proximl.run(
|
|
31
|
+
config.proximl.client.projects.get(config.proximl.client.project)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
services = config.proximl.run(project.services.list())
|
|
35
|
+
|
|
36
|
+
for service in services:
|
|
37
|
+
data.append(
|
|
38
|
+
[
|
|
39
|
+
service.id,
|
|
40
|
+
service.name,
|
|
41
|
+
service.hostname,
|
|
42
|
+
service.region_uuid,
|
|
43
|
+
]
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
for row in data:
|
|
47
|
+
click.echo(
|
|
48
|
+
"{: >38.36} {: >30.28} {: >15.13} {: >38.36}" "".format(*row),
|
|
49
|
+
file=config.stdout,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@service.command()
|
|
54
|
+
@pass_config
|
|
55
|
+
def refresh(config):
|
|
56
|
+
"""
|
|
57
|
+
Refresh project service list.
|
|
58
|
+
"""
|
|
59
|
+
project = config.proximl.run(config.proximl.client.projects.get_current())
|
|
60
|
+
|
|
61
|
+
return config.proximl.run(project.services.refresh())
|
|
@@ -3,11 +3,7 @@ import logging
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import math
|
|
5
5
|
|
|
6
|
-
from proximl.exceptions import
|
|
7
|
-
ApiError,
|
|
8
|
-
SpecificationError,
|
|
9
|
-
ProxiMLException,
|
|
10
|
-
)
|
|
6
|
+
from proximl.exceptions import ApiError, SpecificationError, ProxiMLException, NodeError
|
|
11
7
|
|
|
12
8
|
|
|
13
9
|
class Nodes(object):
|
|
@@ -37,7 +33,7 @@ class Nodes(object):
|
|
|
37
33
|
region_uuid,
|
|
38
34
|
friendly_name,
|
|
39
35
|
hostname,
|
|
40
|
-
minion_id,
|
|
36
|
+
minion_id=None,
|
|
41
37
|
type="permanent",
|
|
42
38
|
service="compute",
|
|
43
39
|
**kwargs,
|
|
@@ -191,6 +187,8 @@ class Node:
|
|
|
191
187
|
if status == "archived" and e.status == 404:
|
|
192
188
|
return
|
|
193
189
|
raise e
|
|
190
|
+
if self.status in ["errored", "failed"]:
|
|
191
|
+
raise NodeError(self.status, self)
|
|
194
192
|
if self.status == status:
|
|
195
193
|
return self
|
|
196
194
|
else:
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
+
import asyncio
|
|
4
|
+
import math
|
|
3
5
|
from datetime import datetime
|
|
4
6
|
|
|
7
|
+
from proximl.exceptions import (
|
|
8
|
+
ApiError,
|
|
9
|
+
SpecificationError,
|
|
10
|
+
ProxiMLException,
|
|
11
|
+
ProviderError,
|
|
12
|
+
)
|
|
13
|
+
|
|
5
14
|
|
|
6
15
|
class Providers(object):
|
|
7
16
|
def __init__(self, proximl):
|
|
@@ -36,6 +45,7 @@ class Provider:
|
|
|
36
45
|
self._provider = kwargs
|
|
37
46
|
self._id = self._provider.get("provider_uuid")
|
|
38
47
|
self._type = self._provider.get("type")
|
|
48
|
+
self._status = self._provider.get("status")
|
|
39
49
|
self._credits = self._provider.get("credits")
|
|
40
50
|
|
|
41
51
|
@property
|
|
@@ -46,6 +56,10 @@ class Provider:
|
|
|
46
56
|
def type(self) -> str:
|
|
47
57
|
return self._type
|
|
48
58
|
|
|
59
|
+
@property
|
|
60
|
+
def status(self) -> str:
|
|
61
|
+
return self._status
|
|
62
|
+
|
|
49
63
|
@property
|
|
50
64
|
def credits(self) -> float:
|
|
51
65
|
return self._credits
|
|
@@ -69,3 +83,42 @@ class Provider:
|
|
|
69
83
|
)
|
|
70
84
|
self.__init__(self.proximl, **resp)
|
|
71
85
|
return self
|
|
86
|
+
|
|
87
|
+
async def wait_for(self, status, timeout=300):
|
|
88
|
+
if self.status == status:
|
|
89
|
+
return
|
|
90
|
+
valid_statuses = ["ready", "archived"]
|
|
91
|
+
if not status in valid_statuses:
|
|
92
|
+
raise SpecificationError(
|
|
93
|
+
"status",
|
|
94
|
+
f"Invalid wait_for status {status}. Valid statuses are: {valid_statuses}",
|
|
95
|
+
)
|
|
96
|
+
MAX_TIMEOUT = 24 * 60 * 60
|
|
97
|
+
if timeout > MAX_TIMEOUT:
|
|
98
|
+
raise SpecificationError(
|
|
99
|
+
"timeout",
|
|
100
|
+
f"timeout must be less than {MAX_TIMEOUT} seconds.",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
POLL_INTERVAL_MIN = 5
|
|
104
|
+
POLL_INTERVAL_MAX = 60
|
|
105
|
+
POLL_INTERVAL = max(min(timeout / 60, POLL_INTERVAL_MAX), POLL_INTERVAL_MIN)
|
|
106
|
+
retry_count = math.ceil(timeout / POLL_INTERVAL)
|
|
107
|
+
count = 0
|
|
108
|
+
while count < retry_count:
|
|
109
|
+
await asyncio.sleep(POLL_INTERVAL)
|
|
110
|
+
try:
|
|
111
|
+
await self.refresh()
|
|
112
|
+
except ApiError as e:
|
|
113
|
+
if status == "archived" and e.status == 404:
|
|
114
|
+
return
|
|
115
|
+
raise e
|
|
116
|
+
if self.status in ["errored", "failed"]:
|
|
117
|
+
raise ProviderError(self.status, self)
|
|
118
|
+
if self.status == status:
|
|
119
|
+
return self
|
|
120
|
+
else:
|
|
121
|
+
count += 1
|
|
122
|
+
logging.debug(f"self: {self}, retry count {count}")
|
|
123
|
+
|
|
124
|
+
raise ProxiMLException(f"Timeout waiting for {status}")
|