From 1771382edc9569a5c06c7208cdad85ca5dab25df Mon Sep 17 00:00:00 2001 From: Helen Lin <46795546+helen-m-lin@users.noreply.github.com> Date: Thu, 6 Nov 2025 09:26:08 -0800 Subject: [PATCH 1/2] feat: method to register codeocean result assets to docdb (#188) --- src/aind_data_access_api/document_db.py | 28 +++++++++++++++ tests/test_document_db.py | 46 +++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/aind_data_access_api/document_db.py b/src/aind_data_access_api/document_db.py index 7bd8fb0..a2416ed 100644 --- a/src/aind_data_access_api/document_db.py +++ b/src/aind_data_access_api/document_db.py @@ -655,6 +655,34 @@ def register_asset(self, s3_location: str) -> Dict[str, Any]: response.raise_for_status() return response.json() + def register_co_result( + self, + s3_location: str, + name: str, + co_asset_id: str, + co_computation_id: str, + ) -> Dict[str, Any]: + """Register a Code Ocean result asset to the DocDB metadata index.""" + + data = json.dumps( + { + "s3_location": s3_location, + "name": name, + "co_asset_id": co_asset_id, + "co_computation_id": co_computation_id, + } + ) + signed_header = self._signed_request( + method="POST", url=self._register_asset_url, data=data + ) + response = self.session.post( + url=self._register_asset_url, + headers=dict(signed_header.headers), + data=data, + ) + response.raise_for_status() + return response.json() + def deregister_asset(self, s3_location: str) -> Dict[str, Any]: """De-register (delete) a data asset in Code Ocean and the DocDB metadata index.""" diff --git a/tests/test_document_db.py b/tests/test_document_db.py index a98cc95..9e3498e 100644 --- a/tests/test_document_db.py +++ b/tests/test_document_db.py @@ -979,6 +979,52 @@ def test_register_asset( ) self.assertEqual(response_message, response) + @patch("boto3.session.Session") + @patch("botocore.auth.SigV4Auth.add_auth") + @patch("requests.Session.post") + def test_register_co_result( + self, + mock_post: MagicMock, + mock_auth: MagicMock, + mock_session: MagicMock, + ): + """Tests register_co_result method""" + mock_creds = MagicMock() + mock_creds.access_key = "abc" + mock_creds.secret_key = "efg" + mock_session.return_value.region_name = "us-west-2" + mock_session.get_credentials.return_value = mock_creds + mock_response = Response() + mock_response.status_code = 201 + response_message = { + "message": ( + "Inserted new DocDB record for result asset " + "s3://codeocean-bucket/123-456." + ), + } + mock_response._content = json.dumps(response_message).encode("utf-8") + mock_post.return_value = mock_response + + client = MetadataDbClient(**self.example_client_args) + response = client.register_co_result( + s3_location="s3://codeocean-bucket/123-456", + name="co_internal_result", + co_asset_id="123-456", + co_computation_id="comp-789", + ) + mock_auth.assert_called_once() + mock_post.assert_called_once_with( + url="https://example.com/v1/assets/register", + headers={"Content-Type": "application/json"}, + data=( + '{"s3_location": "s3://codeocean-bucket/123-456", ' + '"name": "co_internal_result", ' + '"co_asset_id": "123-456", ' + '"co_computation_id": "comp-789"}' + ), + ) + self.assertEqual(response_message, response) + @patch("boto3.session.Session") @patch("botocore.auth.SigV4Auth.add_auth") @patch("requests.Session.delete") From 84997e9a298ff8f81d05b920b7c85bf3486aa339 Mon Sep 17 00:00:00 2001 From: Helen Lin <46795546+helen-m-lin@users.noreply.github.com> Date: Thu, 6 Nov 2025 09:44:46 -0800 Subject: [PATCH 2/2] ci: version bump --- src/aind_data_access_api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aind_data_access_api/__init__.py b/src/aind_data_access_api/__init__.py index ee92443..f3a785d 100644 --- a/src/aind_data_access_api/__init__.py +++ b/src/aind_data_access_api/__init__.py @@ -1,3 +1,3 @@ """Init package""" -__version__ = "1.8.0" +__version__ = "1.9.0"