aind-data-transfer-service 1.16.0__tar.gz → 1.17.2__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.
Potentially problematic release.
This version of aind-data-transfer-service might be problematic. Click here for more details.
- {aind_data_transfer_service-1.16.0/src/aind_data_transfer_service.egg-info → aind_data_transfer_service-1.17.2}/PKG-INFO +2 -2
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/pyproject.toml +2 -2
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/__init__.py +1 -1
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/client.py +28 -25
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/internal.py +35 -10
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/server.py +188 -64
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2/src/aind_data_transfer_service.egg-info}/PKG-INFO +2 -2
- aind_data_transfer_service-1.17.2/src/aind_data_transfer_service.egg-info/SOURCES.txt +31 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service.egg-info/requires.txt +1 -1
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_hpc_client.py +21 -13
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_server.py +225 -24
- aind_data_transfer_service-1.16.0/.flake8 +0 -9
- aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/user-story.md +0 -27
- aind_data_transfer_service-1.16.0/.github/workflows/add_issue_to_project_board.yml +0 -15
- aind_data_transfer_service-1.16.0/.github/workflows/publish_dev.yml +0 -34
- aind_data_transfer_service-1.16.0/.github/workflows/publish_main.yml +0 -56
- aind_data_transfer_service-1.16.0/.github/workflows/run_dev_tests.yml +0 -26
- aind_data_transfer_service-1.16.0/.github/workflows/run_main_tests.yml +0 -43
- aind_data_transfer_service-1.16.0/.gitignore +0 -142
- aind_data_transfer_service-1.16.0/.readthedocs.yaml +0 -17
- aind_data_transfer_service-1.16.0/CODE_OF_CONDUCT.md +0 -133
- aind_data_transfer_service-1.16.0/Dockerfile +0 -14
- aind_data_transfer_service-1.16.0/docs/Makefile +0 -20
- aind_data_transfer_service-1.16.0/docs/diagrams/system_container.png +0 -0
- aind_data_transfer_service-1.16.0/docs/diagrams/system_container.puml +0 -26
- aind_data_transfer_service-1.16.0/docs/diagrams/system_context.png +0 -0
- aind_data_transfer_service-1.16.0/docs/diagrams/system_context.puml +0 -19
- aind_data_transfer_service-1.16.0/docs/examples/basic_upload.py +0 -76
- aind_data_transfer_service-1.16.0/docs/examples/behavior_videos_compression.py +0 -123
- aind_data_transfer_service-1.16.0/docs/examples/custom_codeocean_pipeline_settings.py +0 -107
- aind_data_transfer_service-1.16.0/docs/examples/custom_metadata_mapper_settings.py +0 -113
- aind_data_transfer_service-1.16.0/docs/examples/example1.csv +0 -4
- aind_data_transfer_service-1.16.0/docs/examples/hcr_example.py +0 -81
- aind_data_transfer_service-1.16.0/docs/examples/remove_source_folders.py +0 -80
- aind_data_transfer_service-1.16.0/docs/examples/skip_s3_check.py +0 -78
- aind_data_transfer_service-1.16.0/docs/examples/upload_with_custom_slurm_settings.py +0 -86
- aind_data_transfer_service-1.16.0/docs/examples/upload_with_notification.py +0 -79
- aind_data_transfer_service-1.16.0/docs/make.bat +0 -35
- aind_data_transfer_service-1.16.0/docs/source/Contributing.rst +0 -255
- aind_data_transfer_service-1.16.0/docs/source/UserGuideV1.rst +0 -528
- aind_data_transfer_service-1.16.0/docs/source/UserGuideV2.rst +0 -194
- aind_data_transfer_service-1.16.0/docs/source/_static/dark-logo.svg +0 -129
- aind_data_transfer_service-1.16.0/docs/source/_static/favicon.ico +0 -0
- aind_data_transfer_service-1.16.0/docs/source/_static/light-logo.svg +0 -128
- aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.configs.rst +0 -37
- aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.hpc.rst +0 -29
- aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.models.rst +0 -29
- aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.rst +0 -39
- aind_data_transfer_service-1.16.0/docs/source/conf.py +0 -53
- aind_data_transfer_service-1.16.0/docs/source/index.rst +0 -25
- aind_data_transfer_service-1.16.0/docs/source/modules.rst +0 -7
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/admin.html +0 -36
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/index.html +0 -258
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_params.html +0 -195
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_status.html +0 -324
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_tasks_table.html +0 -146
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/task_logs.html +0 -31
- aind_data_transfer_service-1.16.0/src/aind_data_transfer_service.egg-info/SOURCES.txt +0 -103
- aind_data_transfer_service-1.16.0/tests/__init__.py +0 -1
- aind_data_transfer_service-1.16.0/tests/resources/airflow_dag_run_response.json +0 -51
- aind_data_transfer_service-1.16.0/tests/resources/airflow_dag_runs_response.json +0 -258
- aind_data_transfer_service-1.16.0/tests/resources/airflow_task_instances_response.json +0 -501
- aind_data_transfer_service-1.16.0/tests/resources/describe_parameters_response.json +0 -74
- aind_data_transfer_service-1.16.0/tests/resources/get_parameter_response.json +0 -24
- aind_data_transfer_service-1.16.0/tests/resources/get_secrets_response.json +0 -19
- aind_data_transfer_service-1.16.0/tests/resources/job_upload_template.xlsx +0 -0
- aind_data_transfer_service-1.16.0/tests/resources/legacy_sample.csv +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/legacy_sample2.csv +0 -2
- aind_data_transfer_service-1.16.0/tests/resources/nested_sample.csv +0 -2
- aind_data_transfer_service-1.16.0/tests/resources/new_sample.csv +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/sample.csv +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/sample.xlsx +0 -0
- aind_data_transfer_service-1.16.0/tests/resources/sample_alt_modality_case.csv +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows.csv +0 -7
- aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows.xlsx +0 -0
- aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows_2.csv +0 -7
- aind_data_transfer_service-1.16.0/tests/resources/sample_invalid_ext.txt +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/sample_malformed.csv +0 -4
- aind_data_transfer_service-1.16.0/tests/resources/sample_malformed.xlsx +0 -0
- aind_data_transfer_service-1.16.0/tests/resources/sample_malformed_2.csv +0 -2
- aind_data_transfer_service-1.16.0/tests/test_server/Dockerfile +0 -7
- aind_data_transfer_service-1.16.0/tests/test_server/db.json +0 -1084
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/LICENSE +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/README.md +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/setup.cfg +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/setup.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/configs/__init__.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/configs/csv_handler.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/configs/job_configs.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/configs/job_upload_template.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/__init__.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/models.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/log_handler.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/__init__.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/core.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service.egg-info/dependency_links.txt +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service.egg-info/top_level.txt +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_configs.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_core.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_csv_handler.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_hpc_models.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_internal.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_job_upload_template.py +0 -0
- {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_log_handler.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aind-data-transfer-service
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.17.2
|
|
4
4
|
Summary: Service that handles requests to upload data to the cloud
|
|
5
5
|
Author: Allen Institute for Neural Dynamics
|
|
6
6
|
License: MIT
|
|
@@ -25,7 +25,7 @@ Requires-Dist: furo; extra == "docs"
|
|
|
25
25
|
Provides-Extra: server
|
|
26
26
|
Requires-Dist: aind-data-schema<2.0,>=1.0.0; extra == "server"
|
|
27
27
|
Requires-Dist: aind-data-transfer-models==0.17.0; extra == "server"
|
|
28
|
-
Requires-Dist: aind-metadata-mapper
|
|
28
|
+
Requires-Dist: aind-metadata-mapper>=0.23.0; extra == "server"
|
|
29
29
|
Requires-Dist: boto3; extra == "server"
|
|
30
30
|
Requires-Dist: boto3-stubs[ssm]; extra == "server"
|
|
31
31
|
Requires-Dist: fastapi>=0.115.13; extra == "server"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["setuptools"
|
|
2
|
+
requires = ["setuptools"]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
@@ -41,7 +41,7 @@ docs = [
|
|
|
41
41
|
server = [
|
|
42
42
|
'aind-data-schema>=1.0.0,<2.0',
|
|
43
43
|
'aind-data-transfer-models==0.17.0',
|
|
44
|
-
'aind-metadata-mapper
|
|
44
|
+
'aind-metadata-mapper>=0.23.0',
|
|
45
45
|
'boto3',
|
|
46
46
|
'boto3-stubs[ssm]',
|
|
47
47
|
'fastapi>=0.115.13',
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
import json
|
|
4
4
|
from typing import List, Optional, Union
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
from httpx import AsyncClient, Response
|
|
7
7
|
from pydantic import Field, SecretStr, field_validator
|
|
8
8
|
from pydantic_settings import BaseSettings
|
|
9
|
-
from requests.models import Response
|
|
10
9
|
|
|
11
10
|
from aind_data_transfer_service.hpc.models import HpcJobSubmitSettings
|
|
12
11
|
|
|
@@ -75,37 +74,41 @@ class HpcClient:
|
|
|
75
74
|
"X-SLURM-USER-TOKEN": self.configs.hpc_token.get_secret_value(),
|
|
76
75
|
}
|
|
77
76
|
|
|
78
|
-
def get_node_status(self) -> Response:
|
|
77
|
+
async def get_node_status(self) -> Response:
|
|
79
78
|
"""Get status of nodes"""
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
async with AsyncClient() as async_client:
|
|
80
|
+
response = await async_client.get(
|
|
81
|
+
url=self._node_status_url, headers=self.__headers
|
|
82
|
+
)
|
|
83
83
|
return response
|
|
84
84
|
|
|
85
|
-
def get_job_status(self, job_id: Union[str, int]) -> Response:
|
|
85
|
+
async def get_job_status(self, job_id: Union[str, int]) -> Response:
|
|
86
86
|
"""Get status of job"""
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
async with AsyncClient() as async_client:
|
|
88
|
+
response = await async_client.get(
|
|
89
|
+
url=self._job_status_url + "/" + str(job_id),
|
|
90
|
+
headers=self.__headers,
|
|
91
|
+
)
|
|
91
92
|
return response
|
|
92
93
|
|
|
93
|
-
def get_jobs(self) -> Response:
|
|
94
|
+
async def get_jobs(self) -> Response:
|
|
94
95
|
"""Get status of job"""
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
async with AsyncClient() as async_client:
|
|
97
|
+
response = await async_client.get(
|
|
98
|
+
url=self._jobs_url,
|
|
99
|
+
headers=self.__headers,
|
|
100
|
+
)
|
|
99
101
|
return response
|
|
100
102
|
|
|
101
|
-
def submit_job(self, job_def: dict) -> Response:
|
|
103
|
+
async def submit_job(self, job_def: dict) -> Response:
|
|
102
104
|
"""Submit a job defined by job def"""
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
async with AsyncClient() as async_client:
|
|
106
|
+
response = await async_client.post(
|
|
107
|
+
url=self._job_submit_url, json=job_def, headers=self.__headers
|
|
108
|
+
)
|
|
106
109
|
return response
|
|
107
110
|
|
|
108
|
-
def submit_hpc_job(
|
|
111
|
+
async def submit_hpc_job(
|
|
109
112
|
self,
|
|
110
113
|
script: str,
|
|
111
114
|
job: Optional[HpcJobSubmitSettings] = None,
|
|
@@ -144,8 +147,8 @@ class HpcClient:
|
|
|
144
147
|
],
|
|
145
148
|
"script": script,
|
|
146
149
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
async with AsyncClient() as async_client:
|
|
151
|
+
response = await async_client.post(
|
|
152
|
+
url=self._job_submit_url, json=job_def, headers=self.__headers
|
|
153
|
+
)
|
|
151
154
|
return response
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
import ast
|
|
4
4
|
import os
|
|
5
5
|
from datetime import datetime, timedelta, timezone
|
|
6
|
-
from typing import List, Optional, Union
|
|
6
|
+
from typing import ClassVar, List, Optional, Union
|
|
7
7
|
|
|
8
|
+
from aind_data_schema_models.modalities import Modality
|
|
8
9
|
from mypy_boto3_ssm.type_defs import ParameterMetadataTypeDef
|
|
9
10
|
from pydantic import AwareDatetime, BaseModel, Field, field_validator
|
|
10
11
|
from starlette.datastructures import QueryParams
|
|
@@ -223,11 +224,30 @@ class JobTasks(BaseModel):
|
|
|
223
224
|
class JobParamInfo(BaseModel):
|
|
224
225
|
"""Model for job parameter info from AWS Parameter Store"""
|
|
225
226
|
|
|
227
|
+
_MODALITIES_LIST: ClassVar[list[str]] = list(
|
|
228
|
+
Modality.abbreviation_map.keys()
|
|
229
|
+
)
|
|
230
|
+
_MODALITY_TASKS: ClassVar[list[str]] = [
|
|
231
|
+
"modality_transformation_settings",
|
|
232
|
+
"codeocean_pipeline_settings",
|
|
233
|
+
]
|
|
234
|
+
|
|
226
235
|
name: Optional[str]
|
|
227
236
|
last_modified: Optional[datetime]
|
|
228
|
-
job_type: str
|
|
229
|
-
task_id: str
|
|
237
|
+
job_type: str = Field(..., pattern=r"^[^\s/]+$")
|
|
238
|
+
task_id: str = Field(..., pattern=r"^[^\s/]+$")
|
|
230
239
|
modality: Optional[str]
|
|
240
|
+
version: Optional[str] = Field(..., pattern=r"^(v1|v2)?$")
|
|
241
|
+
|
|
242
|
+
@field_validator("modality", mode="after")
|
|
243
|
+
def validate_modality(cls, v):
|
|
244
|
+
"""Check that modality is one of aind-data-schema modalities"""
|
|
245
|
+
if v is not None and v not in JobParamInfo._MODALITIES_LIST:
|
|
246
|
+
raise ValueError(
|
|
247
|
+
"Invalid modality: modality must be one of "
|
|
248
|
+
f"{JobParamInfo._MODALITIES_LIST}"
|
|
249
|
+
)
|
|
250
|
+
return v
|
|
231
251
|
|
|
232
252
|
@classmethod
|
|
233
253
|
def from_aws_describe_parameter(
|
|
@@ -236,6 +256,7 @@ class JobParamInfo(BaseModel):
|
|
|
236
256
|
job_type: str,
|
|
237
257
|
task_id: str,
|
|
238
258
|
modality: Optional[str],
|
|
259
|
+
version: Optional[str],
|
|
239
260
|
):
|
|
240
261
|
"""Map the parameter to the model"""
|
|
241
262
|
return cls(
|
|
@@ -244,13 +265,14 @@ class JobParamInfo(BaseModel):
|
|
|
244
265
|
job_type=job_type,
|
|
245
266
|
task_id=task_id,
|
|
246
267
|
modality=modality,
|
|
268
|
+
version=version,
|
|
247
269
|
)
|
|
248
270
|
|
|
249
271
|
@staticmethod
|
|
250
272
|
def get_parameter_prefix(version: Optional[str] = None) -> str:
|
|
251
273
|
"""Get the prefix for job_type parameters"""
|
|
252
274
|
prefix = os.getenv("AIND_AIRFLOW_PARAM_PREFIX")
|
|
253
|
-
if version is None:
|
|
275
|
+
if version is None or version == "v1":
|
|
254
276
|
return prefix
|
|
255
277
|
return f"{prefix}/{version}"
|
|
256
278
|
|
|
@@ -262,16 +284,19 @@ class JobParamInfo(BaseModel):
|
|
|
262
284
|
"(?P<job_type>[^/]+)/tasks/(?P<task_id>[^/]+)"
|
|
263
285
|
"(?:/(?P<modality>[^/]+))?"
|
|
264
286
|
)
|
|
265
|
-
if version is None:
|
|
287
|
+
if version is None or version == "v1":
|
|
266
288
|
return f"{prefix}/{regex}"
|
|
267
289
|
return f"{prefix}/{version}/{regex}"
|
|
268
290
|
|
|
269
291
|
@staticmethod
|
|
270
292
|
def get_parameter_name(
|
|
271
|
-
job_type: str,
|
|
293
|
+
job_type: str,
|
|
294
|
+
task_id: str,
|
|
295
|
+
modality: Optional[str],
|
|
296
|
+
version: Optional[str] = None,
|
|
272
297
|
) -> str:
|
|
273
298
|
"""Create the parameter name from job_type and task_id"""
|
|
274
|
-
prefix =
|
|
275
|
-
if
|
|
276
|
-
return f"{prefix}/{job_type}/tasks/{task_id}"
|
|
277
|
-
return f"{prefix}/{
|
|
299
|
+
prefix = JobParamInfo.get_parameter_prefix(version)
|
|
300
|
+
if modality:
|
|
301
|
+
return f"{prefix}/{job_type}/tasks/{task_id}/{modality}"
|
|
302
|
+
return f"{prefix}/{job_type}/tasks/{task_id}"
|