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.

Files changed (106) hide show
  1. {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
  2. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/pyproject.toml +2 -2
  3. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/__init__.py +1 -1
  4. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/client.py +28 -25
  5. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/internal.py +35 -10
  6. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/server.py +188 -64
  7. {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
  8. aind_data_transfer_service-1.17.2/src/aind_data_transfer_service.egg-info/SOURCES.txt +31 -0
  9. {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
  10. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_hpc_client.py +21 -13
  11. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_server.py +225 -24
  12. aind_data_transfer_service-1.16.0/.flake8 +0 -9
  13. aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  14. aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  15. aind_data_transfer_service-1.16.0/.github/ISSUE_TEMPLATE/user-story.md +0 -27
  16. aind_data_transfer_service-1.16.0/.github/workflows/add_issue_to_project_board.yml +0 -15
  17. aind_data_transfer_service-1.16.0/.github/workflows/publish_dev.yml +0 -34
  18. aind_data_transfer_service-1.16.0/.github/workflows/publish_main.yml +0 -56
  19. aind_data_transfer_service-1.16.0/.github/workflows/run_dev_tests.yml +0 -26
  20. aind_data_transfer_service-1.16.0/.github/workflows/run_main_tests.yml +0 -43
  21. aind_data_transfer_service-1.16.0/.gitignore +0 -142
  22. aind_data_transfer_service-1.16.0/.readthedocs.yaml +0 -17
  23. aind_data_transfer_service-1.16.0/CODE_OF_CONDUCT.md +0 -133
  24. aind_data_transfer_service-1.16.0/Dockerfile +0 -14
  25. aind_data_transfer_service-1.16.0/docs/Makefile +0 -20
  26. aind_data_transfer_service-1.16.0/docs/diagrams/system_container.png +0 -0
  27. aind_data_transfer_service-1.16.0/docs/diagrams/system_container.puml +0 -26
  28. aind_data_transfer_service-1.16.0/docs/diagrams/system_context.png +0 -0
  29. aind_data_transfer_service-1.16.0/docs/diagrams/system_context.puml +0 -19
  30. aind_data_transfer_service-1.16.0/docs/examples/basic_upload.py +0 -76
  31. aind_data_transfer_service-1.16.0/docs/examples/behavior_videos_compression.py +0 -123
  32. aind_data_transfer_service-1.16.0/docs/examples/custom_codeocean_pipeline_settings.py +0 -107
  33. aind_data_transfer_service-1.16.0/docs/examples/custom_metadata_mapper_settings.py +0 -113
  34. aind_data_transfer_service-1.16.0/docs/examples/example1.csv +0 -4
  35. aind_data_transfer_service-1.16.0/docs/examples/hcr_example.py +0 -81
  36. aind_data_transfer_service-1.16.0/docs/examples/remove_source_folders.py +0 -80
  37. aind_data_transfer_service-1.16.0/docs/examples/skip_s3_check.py +0 -78
  38. aind_data_transfer_service-1.16.0/docs/examples/upload_with_custom_slurm_settings.py +0 -86
  39. aind_data_transfer_service-1.16.0/docs/examples/upload_with_notification.py +0 -79
  40. aind_data_transfer_service-1.16.0/docs/make.bat +0 -35
  41. aind_data_transfer_service-1.16.0/docs/source/Contributing.rst +0 -255
  42. aind_data_transfer_service-1.16.0/docs/source/UserGuideV1.rst +0 -528
  43. aind_data_transfer_service-1.16.0/docs/source/UserGuideV2.rst +0 -194
  44. aind_data_transfer_service-1.16.0/docs/source/_static/dark-logo.svg +0 -129
  45. aind_data_transfer_service-1.16.0/docs/source/_static/favicon.ico +0 -0
  46. aind_data_transfer_service-1.16.0/docs/source/_static/light-logo.svg +0 -128
  47. aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.configs.rst +0 -37
  48. aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.hpc.rst +0 -29
  49. aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.models.rst +0 -29
  50. aind_data_transfer_service-1.16.0/docs/source/aind_data_transfer_service.rst +0 -39
  51. aind_data_transfer_service-1.16.0/docs/source/conf.py +0 -53
  52. aind_data_transfer_service-1.16.0/docs/source/index.rst +0 -25
  53. aind_data_transfer_service-1.16.0/docs/source/modules.rst +0 -7
  54. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/admin.html +0 -36
  55. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/index.html +0 -258
  56. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_params.html +0 -195
  57. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_status.html +0 -324
  58. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/job_tasks_table.html +0 -146
  59. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service/templates/task_logs.html +0 -31
  60. aind_data_transfer_service-1.16.0/src/aind_data_transfer_service.egg-info/SOURCES.txt +0 -103
  61. aind_data_transfer_service-1.16.0/tests/__init__.py +0 -1
  62. aind_data_transfer_service-1.16.0/tests/resources/airflow_dag_run_response.json +0 -51
  63. aind_data_transfer_service-1.16.0/tests/resources/airflow_dag_runs_response.json +0 -258
  64. aind_data_transfer_service-1.16.0/tests/resources/airflow_task_instances_response.json +0 -501
  65. aind_data_transfer_service-1.16.0/tests/resources/describe_parameters_response.json +0 -74
  66. aind_data_transfer_service-1.16.0/tests/resources/get_parameter_response.json +0 -24
  67. aind_data_transfer_service-1.16.0/tests/resources/get_secrets_response.json +0 -19
  68. aind_data_transfer_service-1.16.0/tests/resources/job_upload_template.xlsx +0 -0
  69. aind_data_transfer_service-1.16.0/tests/resources/legacy_sample.csv +0 -4
  70. aind_data_transfer_service-1.16.0/tests/resources/legacy_sample2.csv +0 -2
  71. aind_data_transfer_service-1.16.0/tests/resources/nested_sample.csv +0 -2
  72. aind_data_transfer_service-1.16.0/tests/resources/new_sample.csv +0 -4
  73. aind_data_transfer_service-1.16.0/tests/resources/sample.csv +0 -4
  74. aind_data_transfer_service-1.16.0/tests/resources/sample.xlsx +0 -0
  75. aind_data_transfer_service-1.16.0/tests/resources/sample_alt_modality_case.csv +0 -4
  76. aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows.csv +0 -7
  77. aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows.xlsx +0 -0
  78. aind_data_transfer_service-1.16.0/tests/resources/sample_empty_rows_2.csv +0 -7
  79. aind_data_transfer_service-1.16.0/tests/resources/sample_invalid_ext.txt +0 -4
  80. aind_data_transfer_service-1.16.0/tests/resources/sample_malformed.csv +0 -4
  81. aind_data_transfer_service-1.16.0/tests/resources/sample_malformed.xlsx +0 -0
  82. aind_data_transfer_service-1.16.0/tests/resources/sample_malformed_2.csv +0 -2
  83. aind_data_transfer_service-1.16.0/tests/test_server/Dockerfile +0 -7
  84. aind_data_transfer_service-1.16.0/tests/test_server/db.json +0 -1084
  85. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/LICENSE +0 -0
  86. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/README.md +0 -0
  87. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/setup.cfg +0 -0
  88. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/setup.py +0 -0
  89. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/configs/__init__.py +0 -0
  90. {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
  91. {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
  92. {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
  93. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/__init__.py +0 -0
  94. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/hpc/models.py +0 -0
  95. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/log_handler.py +0 -0
  96. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/__init__.py +0 -0
  97. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/src/aind_data_transfer_service/models/core.py +0 -0
  98. {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
  99. {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
  100. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_configs.py +0 -0
  101. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_core.py +0 -0
  102. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_csv_handler.py +0 -0
  103. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_hpc_models.py +0 -0
  104. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_internal.py +0 -0
  105. {aind_data_transfer_service-1.16.0 → aind_data_transfer_service-1.17.2}/tests/test_job_upload_template.py +0 -0
  106. {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.16.0
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==0.23.0; extra == "server"
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", "setuptools-scm"]
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==0.23.0',
44
+ 'aind-metadata-mapper>=0.23.0',
45
45
  'boto3',
46
46
  'boto3-stubs[ssm]',
47
47
  'fastapi>=0.115.13',
@@ -1,7 +1,7 @@
1
1
  """Init package"""
2
2
  import os
3
3
 
4
- __version__ = "1.16.0"
4
+ __version__ = "1.17.2"
5
5
 
6
6
  # Global constants
7
7
  OPEN_DATA_BUCKET_NAME = os.getenv("OPEN_DATA_BUCKET_NAME", "open")
@@ -3,10 +3,9 @@
3
3
  import json
4
4
  from typing import List, Optional, Union
5
5
 
6
- import requests
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
- response = requests.get(
81
- url=self._node_status_url, headers=self.__headers
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
- response = requests.get(
88
- url=self._job_status_url + "/" + str(job_id),
89
- headers=self.__headers,
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
- response = requests.get(
96
- url=self._jobs_url,
97
- headers=self.__headers,
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
- response = requests.post(
104
- url=self._job_submit_url, json=job_def, headers=self.__headers
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
- response = requests.post(
149
- url=self._job_submit_url, json=job_def, headers=self.__headers
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, task_id: str, version: Optional[str] = None
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 = os.getenv("AIND_AIRFLOW_PARAM_PREFIX")
275
- if version is None:
276
- return f"{prefix}/{job_type}/tasks/{task_id}"
277
- return f"{prefix}/{version}/{job_type}/tasks/{task_id}"
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}"