From 28a7c33193d0376d6a24ed36653e2f2af198bf07 Mon Sep 17 00:00:00 2001 From: krishna Date: Wed, 1 Jul 2026 08:06:25 -0500 Subject: [PATCH 01/13] Test Gen3 Embedding Service --- .github/workflows/integration_tests.yaml | 3 ++- gen3-integration-tests/tests/test_homepage.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/integration_tests.yaml b/.github/workflows/integration_tests.yaml index 19f92b879..3e98cf397 100644 --- a/.github/workflows/integration_tests.yaml +++ b/.github/workflows/integration_tests.yaml @@ -15,9 +15,10 @@ permissions: jobs: integration_tests: name: Integration tests - uses: uc-cdis/.github/.github/workflows/integration_tests.yaml@master + uses: uc-cdis/.github/.github/workflows/integration_tests.yaml@chore/test_gen3_embedding with: WORKING_DIR: gen3-integration-tests + HELM_BRANCH: feat/add-gen3-embeddings secrets: CI_TEST_ORCID_USERID: ${{ secrets.CI_TEST_ORCID_USERID }} CI_TEST_ORCID_PASSWORD: ${{ secrets.CI_TEST_ORCID_PASSWORD }} diff --git a/gen3-integration-tests/tests/test_homepage.py b/gen3-integration-tests/tests/test_homepage.py index e1112c6b6..c2a864240 100644 --- a/gen3-integration-tests/tests/test_homepage.py +++ b/gen3-integration-tests/tests/test_homepage.py @@ -1,6 +1,8 @@ import pytest from pages import home, login +# Dummy commit + @pytest.mark.skipif( "portal" not in pytest.deployed_services From 840be226119815498f14589ef4778ee00aa7aae7 Mon Sep 17 00:00:00 2001 From: Krishna Agarwal <159047652+krishnaa05@users.noreply.github.com> Date: Wed, 1 Jul 2026 08:19:28 -0500 Subject: [PATCH 02/13] Dummy Commit From af22f59c7c69683bcf93a37db7a016d33ffa2393 Mon Sep 17 00:00:00 2001 From: Krishna Agarwal <159047652+krishnaa05@users.noreply.github.com> Date: Wed, 1 Jul 2026 09:32:35 -0500 Subject: [PATCH 03/13] Dummy Commit From 11295f8fca43dccbd85dbb71c24d1fd0d982521d Mon Sep 17 00:00:00 2001 From: Krishna Agarwal <159047652+krishnaa05@users.noreply.github.com> Date: Tue, 7 Jul 2026 10:45:48 -0500 Subject: [PATCH 04/13] Dummy commit From 32b6a86a2d426a747cc0c9664c36993cd3f1156a Mon Sep 17 00:00:00 2001 From: krishna Date: Tue, 7 Jul 2026 11:25:05 -0500 Subject: [PATCH 05/13] Add gen3_embedding support --- .../gen3_ci/scripts/prepare_ci_environment.py | 1 + gen3-integration-tests/pyproject.toml | 1 + gen3-integration-tests/tests/test_homepage.py | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py index 27e32747c..91d0acb0e 100644 --- a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py +++ b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py @@ -119,6 +119,7 @@ def modify_env_for_service_pr(namespace, service, tag): ) helm_service_names = { "audit-service": "audit", + "gen3-ai": "gen3-embedding", "tube": "etl", "data-portal": "portal", "metadata-service": "metadata", diff --git a/gen3-integration-tests/pyproject.toml b/gen3-integration-tests/pyproject.toml index 6861f4d67..b1376490e 100644 --- a/gen3-integration-tests/pyproject.toml +++ b/gen3-integration-tests/pyproject.toml @@ -71,6 +71,7 @@ markers = [ "fence: test for fence service", "frontend: tests for frontend/gui", "gen3_client: tests for gen3-client / cdis-data-client", + "gen3_embedding: tests for gen3-embedding/gen3-ai", "gen3_workflow: tests for gen3-workflow", "gen3_user_data_library: tests for gen3-user-data-library", "guppy: tests for guppy-service", diff --git a/gen3-integration-tests/tests/test_homepage.py b/gen3-integration-tests/tests/test_homepage.py index c2a864240..3436df8e2 100644 --- a/gen3-integration-tests/tests/test_homepage.py +++ b/gen3-integration-tests/tests/test_homepage.py @@ -1,8 +1,6 @@ import pytest from pages import home, login -# Dummy commit - @pytest.mark.skipif( "portal" not in pytest.deployed_services @@ -11,6 +9,7 @@ ) @pytest.mark.sanity @pytest.mark.frontend +@pytest.mark.gen3_embedding class TestHomePage: def test_home_page_navigation(self, page): """ From 26386e03da0e36f6476494204dafe7dede2a5be1 Mon Sep 17 00:00:00 2001 From: krishna Date: Thu, 9 Jul 2026 09:11:50 -0500 Subject: [PATCH 06/13] Gen3 Embedding initial tests --- gen3-integration-tests/services/embedding.py | 87 +++++++++++ .../test_data/embedding/embeddings.npz | Bin 0 -> 5660 bytes .../tests/test_gen3_embedding.py | 140 ++++++++++++++++++ gen3-integration-tests/uv.lock | 3 + 4 files changed, 230 insertions(+) create mode 100644 gen3-integration-tests/services/embedding.py create mode 100644 gen3-integration-tests/test_data/embedding/embeddings.npz create mode 100644 gen3-integration-tests/tests/test_gen3_embedding.py create mode 100644 gen3-integration-tests/uv.lock diff --git a/gen3-integration-tests/services/embedding.py b/gen3-integration-tests/services/embedding.py new file mode 100644 index 000000000..15b76dcb8 --- /dev/null +++ b/gen3-integration-tests/services/embedding.py @@ -0,0 +1,87 @@ +import json + +import pytest +import requests +from gen3.auth import Gen3Auth +from utils import TEST_DATA_PATH_OBJECT, logger +from utils.misc import retry + + +class Embedding(object): + def __init__(self): + self.BASE_URL = f"{pytest.root_url}/ai/vectorstore" + self.COLLECTIONS_ENDPOINT = "/collections" + self.EMBEDDINGS_ENDPOINT = "/embeddings" + + def create_collection(self, data, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.post( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}", + json=data, + auth=auth, + ) + logger.info(f"Status code after creating collection: {response.status_code}") + return response + + def get_collection(self, collection_name, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = auth.curl(path=f"{self.COLLECTIONS_ENDPOINT}/{collection_name}") + logger.info(f"Status code after getting collection: {response.status_code}") + return response.json() + + def update_collection(self, collection_name, data, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.patch( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}/{collection_name}", + json=data, + auth=auth, + ) + logger.info(f"Status code after updating collection: {response.status_code}") + return response + + def delete_collection(self, collection_name, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.delete( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}/{collection_name}", + auth=auth, + ) + logger.info(f"Status code after deleting collection: {response.status_code}") + return response + + def create_embedding(self, collection_name, data, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.post( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}/{collection_name}{self.EMBEDDINGS_ENDPOINT}", + json=data, + auth=auth, + ) + logger.info(response.content) + logger.info(f"Status code after creating embedding: {response.status_code}") + return response + + def get_embedding(self, collection_name, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = auth.curl( + path=f"{self.COLLECTIONS_ENDPOINT}/{collection_name}{self.EMBEDDINGS_ENDPOINT}" + ) + logger.info(f"Status code after getting embedding: {response.status_code}") + return response.json() + + def update_embedding(self, collection_name, data, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.put( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}/{collection_name}{self.EMBEDDINGS_ENDPOINT}", + json=data, + auth=auth, + ) + logger.info(f"Status code after updating embedding: {response.status_code}") + return response + + def delete_embedding(self, collection_name, embedding_id, user="main_account"): + auth = Gen3Auth(refresh_token=pytest.api_keys[user], endpoint=self.BASE_URL) + response = requests.delete( + url=f"{self.BASE_URL}{self.COLLECTIONS_ENDPOINT}/{collection_name}{self.EMBEDDINGS_ENDPOINT}/{embedding_id}", + auth=auth, + ) + logger.info(f"Status code after deleting embedding: {response.status_code}") + return response diff --git a/gen3-integration-tests/test_data/embedding/embeddings.npz b/gen3-integration-tests/test_data/embedding/embeddings.npz new file mode 100644 index 0000000000000000000000000000000000000000..8d724f2bc7f03b4d157383208fbbe9276ea00d3d GIT binary patch literal 5660 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 Date: Wed, 15 Jul 2026 10:51:44 -0500 Subject: [PATCH 07/13] Add test for crud operations using non-admin priviledged user --- .../tests/test_gen3_embedding.py | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/gen3-integration-tests/tests/test_gen3_embedding.py b/gen3-integration-tests/tests/test_gen3_embedding.py index c6e180741..5003e319a 100644 --- a/gen3-integration-tests/tests/test_gen3_embedding.py +++ b/gen3-integration-tests/tests/test_gen3_embedding.py @@ -138,3 +138,128 @@ def test_failed_creation_collection(self): assert ( response.status_code == 401 ), f"Expected status to be 401 but got {response.status_code}" + + def test_crud_operations_non_admin_privileged_user(self): + """ + Scenario: A non-admin privileged user can perform only read operation + Steps: + 1. Create a collection named public using indexing_account + 2. Verify indexing_account can't create the collection + 3. Create a collection named public using main_account + 4. Verify indexing_account can't update the collection + 5. Verify indexing_account can read the collection + 6. Verify indexing_account can't delete the collection + 7. Create embeddings in collection public using indexing_account + 8. Verify indexing_account can't create the embedding + 9. Create embeddings in collection public using main_account + 10. Verify indexing_account can't update the embedding + 11. Verify indexing_account can read the embedding + 12. Verify indexing_account can't delete the embedding + """ + try: + # Create the collection with user without admin privileges + response = self.gen3_embedding.create_collection( + data=self.collection_data["public"], user="indexing_account" + ) + assert ( + response.status_code == 401 + ), f"Expected status to be 401 but got {response.status_code}" + # Create the collection with user having admin privileges + response = self.gen3_embedding.create_collection( + data=self.collection_data["public"] + ) + assert ( + response.status_code == 200 + ), f"Expected status to be 200 but got {response.status_code}" + # Update the collection with user without admin privileges + response = self.gen3_embedding.update_collection( + collection_name="public", + data=self.updated_collection_data["public"], + user="indexing_account", + ) + assert ( + response.status_code == 403 + ), f"Expected status to be 403 but got {response.status_code}" + # Get the collection with user without admin privileges + response = self.gen3_embedding.get_collection( + collection_name="public", user="indexing_account" + ) + assert ( + response["description"] == self.collection_data["public"]["description"] + ), f"Updation failed, got response: {response}" + # Delete the collection with user without admin privileges + response = self.gen3_embedding.delete_collection( + collection_name="public", user="indexing_account" + ) + assert ( + response.status_code == 403 + ), f"Expected status to be 403 but got {response.status_code}" + # Create Embedding with user without admin privileges + embedding_data = { + "embeddings": [ + { + "embedding": self.embeddings[0].tolist(), + "metadata": {"source": "some_file.md", "chunk_size": "1000"}, + } + ] + } + response = self.gen3_embedding.create_embedding( + collection_name="public", data=embedding_data, user="indexing_account" + ) + assert ( + response.status_code == 403 + ), f"Expected status to be 403 but got {response.status_code}" + # Create Embedding with user having admin privileges + response = self.gen3_embedding.create_embedding( + collection_name="public", data=embedding_data + ) + assert ( + response.status_code == 200 + ), f"Expected status to be 200 but got {response.status_code}" + # Update Embedding with user without admin privileges + updated_embedding_data = { + "embeddings": [ + { + "embedding": self.embeddings[0].tolist(), + "metadata": { + "source": "some_file_update.md", + "chunk_size": "1000", + }, + } + ] + } + response = self.gen3_embedding.update_embedding( + collection_name="public", + data=updated_embedding_data, + user="indexing_account", + ) + assert ( + response.status_code == 403 + ), f"Expected status to be 403 but got {response.status_code}" + # Get the embeddings + response = self.gen3_embedding.get_embedding( + collection_name="public", user="indexing_account" + ) + assert ( + len(response["embeddings"]) == 1 + ), f"Expected 1 embeddings but got {len(response["embeddings"])}" + # Delete the embeddings without admin privileges + for embedding in response["embeddings"]: + embedding_id = embedding["embedding_id"] + response = self.gen3_embedding.delete_embedding( + collection_name="public", + embedding_id=embedding_id, + user="indexing_account", + ) + logger.info(response) + assert ( + response.status_code == 403 + ), f"Expected status to be 403 but got {response.status_code}" + except Exception as e: + raise Exception(f"Got exception: {e}") + finally: + # Delete the collection + response = self.gen3_embedding.delete_collection(collection_name="public") + assert ( + response.status_code == 204 + ), f"Expected status to be 204 but got {response.status_code}" From 9296d0e15c087a92a5479e6059534a9339587cb8 Mon Sep 17 00:00:00 2001 From: krishna Date: Wed, 15 Jul 2026 10:56:28 -0500 Subject: [PATCH 08/13] Add marker --- gen3-integration-tests/tests/test_gen3_embedding.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gen3-integration-tests/tests/test_gen3_embedding.py b/gen3-integration-tests/tests/test_gen3_embedding.py index 5003e319a..3b251eff9 100644 --- a/gen3-integration-tests/tests/test_gen3_embedding.py +++ b/gen3-integration-tests/tests/test_gen3_embedding.py @@ -8,6 +8,7 @@ from utils import TEST_DATA_PATH_OBJECT, logger +@pytest.mark.gen3_embedding class TestGen3Embedding: @classmethod def setup_class(cls): From 65667e6926d088d6e00f6cbf24752c77ed1cbc02 Mon Sep 17 00:00:00 2001 From: krishna Date: Wed, 15 Jul 2026 11:36:59 -0500 Subject: [PATCH 09/13] Add marker --- gen3-integration-tests/tests/test_gen3_embedding.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gen3-integration-tests/tests/test_gen3_embedding.py b/gen3-integration-tests/tests/test_gen3_embedding.py index 3b251eff9..0d001aa4c 100644 --- a/gen3-integration-tests/tests/test_gen3_embedding.py +++ b/gen3-integration-tests/tests/test_gen3_embedding.py @@ -8,6 +8,10 @@ from utils import TEST_DATA_PATH_OBJECT, logger +@pytest.mark.skipif( + "gen3-embeddings" not in pytest.deployed_services, + reason="gen3-embeddings service is not running on this environment", +) @pytest.mark.gen3_embedding class TestGen3Embedding: @classmethod From 2fc198dd7bf08a0f2b6fe1c894a6cb641c950186 Mon Sep 17 00:00:00 2001 From: krishna Date: Fri, 7 Aug 2026 11:43:01 -0500 Subject: [PATCH 10/13] Handle quay repo name for gen3-ai --- .../gen3_ci/scripts/prepare_ci_environment.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py index 91d0acb0e..27eb4b241 100644 --- a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py +++ b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py @@ -33,6 +33,10 @@ def wait_for_quay_build(repo, tag): found = False i = 0 repo_list = repo.split(",") + # Check if repo name is in dict then fetch the quay repo name + repo_dict = {"gen3-ai": "gen3_embeddings"} + if repo in repo_dict.keys(): + repo = repo_dict["repo"] logger.info(f"[wait_for_quay_build] Repo - {quay_org}/{repo}, image - {tag}") while not found and i < max_tries: for repo_item in repo_list: From 65eb7b3c31f4c443d64de81e0b609ad49bfd9779 Mon Sep 17 00:00:00 2001 From: krishna Date: Fri, 7 Aug 2026 12:40:51 -0500 Subject: [PATCH 11/13] Fix --- .../gen3_ci/scripts/prepare_ci_environment.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py index 27eb4b241..41036e76b 100644 --- a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py +++ b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py @@ -33,13 +33,13 @@ def wait_for_quay_build(repo, tag): found = False i = 0 repo_list = repo.split(",") - # Check if repo name is in dict then fetch the quay repo name - repo_dict = {"gen3-ai": "gen3_embeddings"} - if repo in repo_dict.keys(): - repo = repo_dict["repo"] logger.info(f"[wait_for_quay_build] Repo - {quay_org}/{repo}, image - {tag}") while not found and i < max_tries: for repo_item in repo_list: + # Check if repo name is in dict then fetch the quay repo name + repo_dict = {"gen3-ai": "gen3_embeddings"} + if repo_item in repo_dict.keys(): + repo_item = repo_dict["repo"] logger.info( f"[wait_for_quay_build] Waiting for image '{quay_org}/{repo_item}:{tag}' to be built in quay" ) From 3f92ebc045fa8d9b530b26f21932e090cdbb7d72 Mon Sep 17 00:00:00 2001 From: krishna Date: Fri, 7 Aug 2026 12:44:34 -0500 Subject: [PATCH 12/13] Fix --- .../gen3_ci/scripts/prepare_ci_environment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py index 41036e76b..3c24b1f9a 100644 --- a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py +++ b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py @@ -39,7 +39,7 @@ def wait_for_quay_build(repo, tag): # Check if repo name is in dict then fetch the quay repo name repo_dict = {"gen3-ai": "gen3_embeddings"} if repo_item in repo_dict.keys(): - repo_item = repo_dict["repo"] + repo_item = repo_dict["repo_item"] logger.info( f"[wait_for_quay_build] Waiting for image '{quay_org}/{repo_item}:{tag}' to be built in quay" ) From 64e7333df8f7339d4cc9ed01cdf46f67366b4c35 Mon Sep 17 00:00:00 2001 From: krishna Date: Fri, 7 Aug 2026 12:48:07 -0500 Subject: [PATCH 13/13] Fix --- .../gen3_ci/scripts/prepare_ci_environment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py index 3c24b1f9a..a2bdd95a5 100644 --- a/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py +++ b/gen3-integration-tests/gen3_ci/scripts/prepare_ci_environment.py @@ -39,7 +39,7 @@ def wait_for_quay_build(repo, tag): # Check if repo name is in dict then fetch the quay repo name repo_dict = {"gen3-ai": "gen3_embeddings"} if repo_item in repo_dict.keys(): - repo_item = repo_dict["repo_item"] + repo_item = repo_dict[repo_item] logger.info( f"[wait_for_quay_build] Waiting for image '{quay_org}/{repo_item}:{tag}' to be built in quay" )