Skip to content

Org-wide and filtered access to cloud integrations (#831) #794

Org-wide and filtered access to cloud integrations (#831)

Org-wide and filtered access to cloud integrations (#831) #794

GitHub Actions / SDK integration test report failed Jan 7, 2025 in 0s

5 fail, 7 skipped, 272 pass in 20m 17s

284 tests  +5   272 ✔️ +48   20m 17s ⏱️ - 2h 13m 31s
    1 suites ±0       7 💤 ±  0 
    1 files   ±0       5  - 42 

Results for commit 312499e. ± Comparison against earlier commit e6715e0.

Annotations

Check warning on line 0 in storage.test_storage_folder_upload

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

test_dataset_cloud_upload_invalid_json (storage.test_storage_folder_upload) failed

integration-test-report-python3_11.xml/integration-test-report-python3_11.xml
Raw output
temp_mirror_dataset = <encord.dataset.Dataset object at 0x7fc661ff0910>
ephemeral_user_client = <encord.user_client.EncordUserClient object at 0x7fc66213e450>

    def test_dataset_cloud_upload_invalid_json(
        temp_mirror_dataset: Dataset,
        ephemeral_user_client: EncordUserClient,
    ) -> None:
        integration_id = _get_integration_id(
            ephemeral_user_client,
            GCP_STORAGE_TEST_PARAMS.integration_title,
        )
    
        with pytest.raises(encord.exceptions.InvalidArgumentsError):
>           temp_mirror_dataset.add_private_data_to_dataset_start(
                integration_id,
                {"videos": [{"objectUrl": GCP_STORAGE_TEST_PARAMS.video_links[0]}], "extraKey": "not allowed"},
                ignore_errors=True,
                folder=None,
            )

src/sdk_integration_tests/tests/storage/test_storage_folder_upload.py:988: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.11/site-packages/encord/dataset.py:443: in add_private_data_to_dataset_start
    return self._client.add_private_data_to_dataset_start(integration_id, private_files, ignore_errors, folder_uuid)
.venv/lib/python3.11/site-packages/encord/client.py:724: in add_private_data_to_dataset_start
    process_hash = self._querier.basic_setter(
.venv/lib/python3.11/site-packages/encord/http/querier.py:119: in basic_setter
    res, context = self._execute(request, retryable=retryable)
.venv/lib/python3.11/site-packages/encord/http/querier.py:204: in _execute
    check_error_response(response, context, extra_payload)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

response = ['UNKNOWN_ERROR']
context = RequestContext(timestamp='2025-01-07T17:58:23.285282+00:00', trace_id='a334a622659a497581d284a9fd61e017', span_id='1')
payload = None

    def check_error_response(response, context=None, payload=None):
        """
        Checks server response.
        Called if HTTP response status code is an error response.
        """
        if response == AUTHENTICATION_ERROR:
            raise AuthenticationError("You are not authenticated to access the Encord platform.", context=context)
    
        if response == AUTHORISATION_ERROR:
            raise AuthorisationError("You are not authorised to access this asset.", context=context)
    
        if response == RESOURCE_NOT_FOUND_ERROR:
            if payload:
                raise ResourceNotFoundError(payload, context=context)
            raise ResourceNotFoundError("The requested resource was not found in the database.", context=context)
    
        if response == METHOD_NOT_ALLOWED_ERROR:
            raise MethodNotAllowedError("HTTP method is not allowed.", context=context)
    
        if response == UNKNOWN_ERROR:
>           raise UnknownException("An unknown error occurred.", context=context)
E           encord.exceptions.UnknownException: An unknown error occurred. timestamp='2025-01-07T17:58:23.285282+00:00' trace_id='a334a622659a497581d284a9fd61e017' span_id='1'

.venv/lib/python3.11/site-packages/encord/http/error_utils.py:73: UnknownException

Check warning on line 0 in user_client.test_cloud_integrations

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

test_get_cloud_integrations_org_wide_not_allowed (user_client.test_cloud_integrations) failed

integration-test-report-python3_11.xml/integration-test-report-python3_11.xml
Raw output
ephemeral_user_client_non_org_user = <encord.user_client.EncordUserClient object at 0x7fc661a44c10>

    @pytest.mark.skipif(
        "include_org_access" not in inspect.signature(EncordUserClient.get_cloud_integrations).parameters,
        reason="Org-wide access to cloud integrations is not supported by this version of SDK",
    )
    def test_get_cloud_integrations_org_wide_not_allowed(
        ephemeral_user_client_non_org_user: EncordUserClient,
    ) -> None:
>       with pytest.raises(AuthorisationError):
E       Failed: DID NOT RAISE <class 'encord.exceptions.AuthorisationError'>

src/sdk_integration_tests/tests/user_client/test_cloud_integrations.py:103: Failed

Check warning on line 0 in user_client.test_cloud_integrations

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

test_get_cloud_integrations_org_wide_user_client (user_client.test_cloud_integrations) failed

integration-test-report-python3_11.xml/integration-test-report-python3_11.xml
Raw output
ephemeral_user_client = <encord.user_client.EncordUserClient object at 0x7faf7b702d90>

    @pytest.mark.skipif(
        "include_org_access" not in inspect.signature(EncordUserClient.get_cloud_integrations).parameters,
        reason="Org-wide access to cloud integrations is not supported by this version of SDK",
    )
    def test_get_cloud_integrations_org_wide_user_client(
        ephemeral_user_client: EncordUserClient,
    ) -> None:
        org_integrations = ephemeral_user_client.get_cloud_integrations(include_org_access=True)  # type: ignore[call-arg, unused-ignore]
        user_integrations = ephemeral_user_client.get_cloud_integrations(include_org_access=False)  # type: ignore[call-arg, unused-ignore]
>       assert len(org_integrations) > len(user_integrations)
E       AssertionError: assert 6 > 6
E        +  where 6 = len([CloudIntegration(id='09af44ae-dc62-45e4-9635-09e05c478988', title='Direct Access Test Integration Not Client Side Only'), CloudIntegration(id='393e5373-6f28-4c9e-ae54-f759713fb7ed', title='Direct Access Test Integration Client Side Only'), CloudIntegration(id='08f5f8b5-9398-4cab-868a-9677cb097369', title='AWS-ENCORD-BUCKET-INTEGRATION'), CloudIntegration(id='a3aef476-1dfb-41bc-b6e3-0a7a0cf3ffe8', title='AWS Test SDK'), CloudIntegration(id='719ee2e7-f8fd-426e-882f-4614c603906c', title='GCP SDK Testing Integration'), CloudIntegration(id='52209c15-4e93-412d-a05c-6772add83245', title='Azure Test Integration')])
E        +  and   6 = len([CloudIntegration(id='09af44ae-dc62-45e4-9635-09e05c478988', title='Direct Access Test Integration Not Client Side Only'), CloudIntegration(id='393e5373-6f28-4c9e-ae54-f759713fb7ed', title='Direct Access Test Integration Client Side Only'), CloudIntegration(id='08f5f8b5-9398-4cab-868a-9677cb097369', title='AWS-ENCORD-BUCKET-INTEGRATION'), CloudIntegration(id='a3aef476-1dfb-41bc-b6e3-0a7a0cf3ffe8', title='AWS Test SDK'), CloudIntegration(id='719ee2e7-f8fd-426e-882f-4614c603906c', title='GCP SDK Testing Integration'), CloudIntegration(id='52209c15-4e93-412d-a05c-6772add83245', title='Azure Test Integration')])

src/sdk_integration_tests/tests/user_client/test_cloud_integrations.py:85: AssertionError

Check warning on line 0 in user_client.test_cvat_integration

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

test_cvat_project_creation[labelled-False-service-account] (user_client.test_cvat_integration) failed

integration-test-report-python3_11.xml/integration-test-report-python3_11.xml
Raw output
review_mode = <ReviewMode.LABELLED: 'labelled'>, should_fail = False
ephemeral_user_client = <encord.user_client.EncordUserClient object at 0x7faf7bf1c150>

    @pytest.mark.parametrize("account_type", [AccountTypeEnum.FIREBASE, AccountTypeEnum.SERVICE], indirect=True)
    @pytest.mark.parametrize("should_fail", [False, True])
    @pytest.mark.parametrize("review_mode", [ReviewMode.UNLABELLED, ReviewMode.LABELLED])
    def test_cvat_project_creation(
        review_mode: ReviewMode,
        should_fail: bool,
        ephemeral_user_client: EncordUserClient,
    ) -> None:
        cur_dir = Path(__file__).resolve().parent
        data_folder = cur_dir / "data" / "cvat project"
    
        with TemporaryDirectory() as _tmp_dir_path:
            tmp_dir_path = Path(_tmp_dir_path)
            tmp_cvat_path = (tmp_dir_path / "cvat").resolve()
            shutil.copytree(data_folder, tmp_cvat_path)
    
            if should_fail:
                with open(tmp_cvat_path / "annotations.xml") as f:
                    annotations_str = f.read()
    
                with open(tmp_cvat_path / "annotations.xml", "w") as f:
                    f.write(
                        annotations_str.replace(
                            "<name>My Text attribute</name>",
                            "<name>Invalid</name>",
                        )
                    )
    
>           ret = ephemeral_user_client.create_project_from_cvat(
                LocalImport(file_path=str(tmp_cvat_path)),
                "CVAT imported baking dataset",
                review_mode,
                timeout_seconds=120,
            )

src/sdk_integration_tests/tests/user_client/test_cvat_integration.py:45: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.11/site-packages/encord/user_client.py:781: in create_project_from_cvat
    return self.create_project_from_cvat_get_result(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <encord.user_client.EncordUserClient object at 0x7faf7bf1c150>
cvat_import_uuid = UUID('4d6aaf92-867a-426a-9593-51df7765008b')

    def create_project_from_cvat_get_result(
        self,
        cvat_import_uuid: UUID,
        *,
        timeout_seconds: int = 1 * 24 * 60 * 60,  # 1 day
    ) -> Union[CvatImporterSuccess, CvatImporterError]:
        """
        Check the status and get the result of a CVAT import process. This is the second part of the
        two-step import process.
    
        Args:
            cvat_import_uuid:
                The UUID returned by create_project_from_cvat_start.
            timeout_seconds:
                Maximum time in seconds to wait for the import to complete. Defaults to 24 hours.
                The method will poll the server periodically during this time.
    
        Returns:
            Union[CvatImporterSuccess, CvatImporterError]: The result of the import process.
            - CvatImporterSuccess: Contains project_hash, dataset_hash, and any issues if the import succeeded.
            - CvatImporterError: Contains any issues if the import failed.
    
        Raises:
            ValueError:
                If the server returns an unexpected status or invalid response structure.
        """
    
        failed_requests_count = 0
        polling_start_timestamp = time.perf_counter()
    
        while True:
            try:
                polling_elapsed_seconds = ceil(time.perf_counter() - polling_start_timestamp)
                polling_available_seconds = max(0, timeout_seconds - polling_elapsed_seconds)
    
                log.info(f"create_project_from_cvat_get_result started polling call {polling_elapsed_seconds=}")
                tmp_res = self._api_client.get(
                    f"projects/cvat-import/{cvat_import_uuid}",
                    params=CvatImportGetResultParams(
                        timeout_seconds=min(
                            polling_available_seconds,
                            CVAT_LONG_POLLING_MAX_REQUEST_TIME_SECONDS,
                        ),
                    ),
                    result_type=CvatImportGetResultResponse,
                )
    
                if tmp_res.status == CvatImportGetResultLongPollingStatus.DONE:
                    log.info(f"cvat import job completed with cvat_import_uuid={cvat_import_uuid}.")
    
                polling_elapsed_seconds = ceil(time.perf_counter() - polling_start_timestamp)
                polling_available_seconds = max(0, timeout_seconds - polling_elapsed_seconds)
    
                if polling_available_seconds == 0 or tmp_res.status in [
                    CvatImportGetResultLongPollingStatus.DONE,
                    CvatImportGetResultLongPollingStatus.ERROR,
                ]:
                    res = tmp_res
                    break
    
                failed_requests_count = 0
            except (requests.exceptions.RequestException, encord.exceptions.RequestException):
                failed_requests_count += 1
    
                if failed_requests_count >= CVAT_LONG_POLLING_RESPONSE_RETRY_N:
                    raise
    
                time.sleep(CVAT_LONG_POLLING_SLEEP_ON_FAILURE_SECONDS)
    
        if res.status == CvatImportGetResultLongPollingStatus.DONE:
            if res.project_uuid is None:
                raise ValueError(f"{res.project_uuid=}, res.project_uuid should not be None with DONE status")
    
            if res.issues is None:
                raise ValueError(f"{res.issues=}, res.issues should not be None with DONE status")
    
            return CvatImporterSuccess(
                project_hash=str(res.project_uuid),
                dataset_hash=str(list(self.get_project(res.project_uuid).list_datasets())[0]),
                issues=Issues.from_dict(res.issues),
            )
        elif res.status == CvatImportGetResultLongPollingStatus.ERROR:
            if res.issues is None:
                raise ValueError(f"{res.issues=}, res.issues should not be None with DONE status")
    
            return CvatImporterError(
                issues=Issues.from_dict(res.issues),
            )
        else:
>           raise ValueError(f"{res.status=}, only DONE and ERROR status is expected after successful long polling")
E           ValueError: res.status=<CvatImportGetResultLongPollingStatus.PENDING: 'PENDING'>, only DONE and ERROR status is expected after successful long polling

.venv/lib/python3.11/site-packages/encord/user_client.py:737: ValueError

Check warning on line 0 in user_client.test_cvat_integration

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

test_cvat_project_creation[labelled-True-firebase-user] (user_client.test_cvat_integration) failed

integration-test-report-python3_11.xml/integration-test-report-python3_11.xml
Raw output
review_mode = <ReviewMode.LABELLED: 'labelled'>, should_fail = True
ephemeral_user_client = <encord.user_client.EncordUserClient object at 0x7fc661ff37d0>

    @pytest.mark.parametrize("account_type", [AccountTypeEnum.FIREBASE, AccountTypeEnum.SERVICE], indirect=True)
    @pytest.mark.parametrize("should_fail", [False, True])
    @pytest.mark.parametrize("review_mode", [ReviewMode.UNLABELLED, ReviewMode.LABELLED])
    def test_cvat_project_creation(
        review_mode: ReviewMode,
        should_fail: bool,
        ephemeral_user_client: EncordUserClient,
    ) -> None:
        cur_dir = Path(__file__).resolve().parent
        data_folder = cur_dir / "data" / "cvat project"
    
        with TemporaryDirectory() as _tmp_dir_path:
            tmp_dir_path = Path(_tmp_dir_path)
            tmp_cvat_path = (tmp_dir_path / "cvat").resolve()
            shutil.copytree(data_folder, tmp_cvat_path)
    
            if should_fail:
                with open(tmp_cvat_path / "annotations.xml") as f:
                    annotations_str = f.read()
    
                with open(tmp_cvat_path / "annotations.xml", "w") as f:
                    f.write(
                        annotations_str.replace(
                            "<name>My Text attribute</name>",
                            "<name>Invalid</name>",
                        )
                    )
    
>           ret = ephemeral_user_client.create_project_from_cvat(
                LocalImport(file_path=str(tmp_cvat_path)),
                "CVAT imported baking dataset",
                review_mode,
                timeout_seconds=120,
            )

src/sdk_integration_tests/tests/user_client/test_cvat_integration.py:45: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.11/site-packages/encord/user_client.py:781: in create_project_from_cvat
    return self.create_project_from_cvat_get_result(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <encord.user_client.EncordUserClient object at 0x7fc661ff37d0>
cvat_import_uuid = UUID('f45a1fdb-789c-4f2d-9f08-c49bec680324')

    def create_project_from_cvat_get_result(
        self,
        cvat_import_uuid: UUID,
        *,
        timeout_seconds: int = 1 * 24 * 60 * 60,  # 1 day
    ) -> Union[CvatImporterSuccess, CvatImporterError]:
        """
        Check the status and get the result of a CVAT import process. This is the second part of the
        two-step import process.
    
        Args:
            cvat_import_uuid:
                The UUID returned by create_project_from_cvat_start.
            timeout_seconds:
                Maximum time in seconds to wait for the import to complete. Defaults to 24 hours.
                The method will poll the server periodically during this time.
    
        Returns:
            Union[CvatImporterSuccess, CvatImporterError]: The result of the import process.
            - CvatImporterSuccess: Contains project_hash, dataset_hash, and any issues if the import succeeded.
            - CvatImporterError: Contains any issues if the import failed.
    
        Raises:
            ValueError:
                If the server returns an unexpected status or invalid response structure.
        """
    
        failed_requests_count = 0
        polling_start_timestamp = time.perf_counter()
    
        while True:
            try:
                polling_elapsed_seconds = ceil(time.perf_counter() - polling_start_timestamp)
                polling_available_seconds = max(0, timeout_seconds - polling_elapsed_seconds)
    
                log.info(f"create_project_from_cvat_get_result started polling call {polling_elapsed_seconds=}")
                tmp_res = self._api_client.get(
                    f"projects/cvat-import/{cvat_import_uuid}",
                    params=CvatImportGetResultParams(
                        timeout_seconds=min(
                            polling_available_seconds,
                            CVAT_LONG_POLLING_MAX_REQUEST_TIME_SECONDS,
                        ),
                    ),
                    result_type=CvatImportGetResultResponse,
                )
    
                if tmp_res.status == CvatImportGetResultLongPollingStatus.DONE:
                    log.info(f"cvat import job completed with cvat_import_uuid={cvat_import_uuid}.")
    
                polling_elapsed_seconds = ceil(time.perf_counter() - polling_start_timestamp)
                polling_available_seconds = max(0, timeout_seconds - polling_elapsed_seconds)
    
                if polling_available_seconds == 0 or tmp_res.status in [
                    CvatImportGetResultLongPollingStatus.DONE,
                    CvatImportGetResultLongPollingStatus.ERROR,
                ]:
                    res = tmp_res
                    break
    
                failed_requests_count = 0
            except (requests.exceptions.RequestException, encord.exceptions.RequestException):
                failed_requests_count += 1
    
                if failed_requests_count >= CVAT_LONG_POLLING_RESPONSE_RETRY_N:
                    raise
    
                time.sleep(CVAT_LONG_POLLING_SLEEP_ON_FAILURE_SECONDS)
    
        if res.status == CvatImportGetResultLongPollingStatus.DONE:
            if res.project_uuid is None:
                raise ValueError(f"{res.project_uuid=}, res.project_uuid should not be None with DONE status")
    
            if res.issues is None:
                raise ValueError(f"{res.issues=}, res.issues should not be None with DONE status")
    
            return CvatImporterSuccess(
                project_hash=str(res.project_uuid),
                dataset_hash=str(list(self.get_project(res.project_uuid).list_datasets())[0]),
                issues=Issues.from_dict(res.issues),
            )
        elif res.status == CvatImportGetResultLongPollingStatus.ERROR:
            if res.issues is None:
                raise ValueError(f"{res.issues=}, res.issues should not be None with DONE status")
    
            return CvatImporterError(
                issues=Issues.from_dict(res.issues),
            )
        else:
>           raise ValueError(f"{res.status=}, only DONE and ERROR status is expected after successful long polling")
E           ValueError: res.status=<CvatImportGetResultLongPollingStatus.PENDING: 'PENDING'>, only DONE and ERROR status is expected after successful long polling

.venv/lib/python3.11/site-packages/encord/user_client.py:737: ValueError

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

7 skipped tests found

There are 7 skipped tests, see "Raw output" for the full list of skipped tests.
Raw output
projects.test_index ‑ test_collection_update[NEW_NAME-None]
projects.test_index ‑ test_collection_update[None-NEW DESC]
projects.test_index ‑ test_collections
projects.test_index ‑ test_preset_integration_test
projects.test_index ‑ test_preset_update[NEW_NAME-None-None]
projects.test_index ‑ test_preset_update[None-NEW DESC-None]
projects.test_index ‑ test_preset_update[None-None-update_filter_preset2]

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / SDK integration test report

284 tests found

There are 284 tests, see "Raw output" for the full list of tests.
Raw output
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-0-_input0-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-1-_input1-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-10-_input10-False-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-2-_input2-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-3-_input3-True-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-4-_input4-False-True-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-5-_input5-True-True-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-6-_input6-True-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-7-_input7-False-True-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-8-_input8-True-True-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[False-9-_input9-False-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-0-_input0-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-1-_input1-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-10-_input10-False-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-2-_input2-False-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-3-_input3-True-False-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-4-_input4-False-True-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-5-_input5-True-True-False-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-6-_input6-True-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-7-_input7-False-True-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-8-_input8-True-True-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_add_private_data_to_dataset[True-9-_input9-False-False-True-ssh-key-authentication]
datasets.test_cloud_integrations ‑ test_get_cloud_integration_ids_for_aws_and_gcp_dataset[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_client_metadata_for_cloud_upload_ssh_access[False-assert_client_metadatas_are_none]
datasets.test_dataset_accessors ‑ test_client_metadata_for_cloud_upload_ssh_access[True-assert_client_metadatas_are_present]
datasets.test_dataset_accessors ‑ test_data_row_for_dicom[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_data_row_for_native_image[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_data_row_for_native_image_group[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_data_row_for_video[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_data_row_for_video_image_group[ssh-key-authentication]
datasets.test_dataset_accessors ‑ test_dataset_data_rows_filtered[ssh-key-authentication]
datasets.test_dataset_groups ‑ test_add_group_to_dataset[firebase-user]
datasets.test_dataset_groups ‑ test_add_group_to_dataset[service-account]
datasets.test_dataset_groups ‑ test_list_dataset_groups[firebase-user]
datasets.test_dataset_groups ‑ test_list_dataset_groups[service-account]
datasets.test_dataset_groups ‑ test_remove_group_from_dataset[firebase-user]
datasets.test_dataset_groups ‑ test_remove_group_from_dataset[service-account]
datasets.test_dataset_helpers ‑ test_obtain_re_encode_video_status_and_re_encoded_link[ssh-key-authentication]
datasets.test_dataset_helpers ‑ test_run_ocr[ssh-key-authentication]
datasets.test_dicom_series ‑ test_dicom_series_title_update_after_upload[ssh-key-authentication]
datasets.test_dicom_series ‑ test_upload_dicom_series[ssh-key-authentication]
datasets.test_dynamic_datasets ‑ test_cannot_upload_to_dynamic_dataset
datasets.test_dynamic_datasets ‑ test_link_to_dynamic_dataset[ssh-key-authentication]
datasets.test_image_group ‑ test_create_image_group[ssh-key-authentication-False]
datasets.test_image_group ‑ test_create_image_group[ssh-key-authentication-True]
datasets.test_image_group ‑ test_create_image_group_old_api_without_long_polling[ssh-key-authentication-False-firebase-user]
datasets.test_image_group ‑ test_create_image_group_old_api_without_long_polling[ssh-key-authentication-False-service-account]
datasets.test_image_group ‑ test_create_image_group_old_api_without_long_polling[ssh-key-authentication-True-firebase-user]
datasets.test_image_group ‑ test_create_image_group_old_api_without_long_polling[ssh-key-authentication-True-service-account]
datasets.test_image_group ‑ test_image_title_update_after_upload[ssh-key-authentication]
datasets.test_native_image ‑ test_image_title_update_after_upload[ssh-key-authentication]
datasets.test_native_image ‑ test_upload_native_image[ssh-key-authentication]
datasets.test_native_image ‑ test_upload_native_image_old_api_without_long_polling[ssh-key-authentication-firebase-user]
datasets.test_native_image ‑ test_upload_native_image_old_api_without_long_polling[ssh-key-authentication-service-account]
datasets.test_nifti ‑ test_upload_nifti
datasets.test_user_client_datasets ‑ test_create_dataset_backwards_compatible[firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_backwards_compatible[service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[False-0-firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[False-0-service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[False-1-firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[False-1-service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[True-0-firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[True-0-service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[True-1-firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_old_api[True-1-service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_private_deprecated[firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_private_deprecated[service-account]
datasets.test_user_client_datasets ‑ test_create_dataset_simple[ssh-key-authentication-firebase-user]
datasets.test_user_client_datasets ‑ test_create_dataset_simple[ssh-key-authentication-service-account]
datasets.test_user_client_datasets ‑ test_get_dataset[ssh-key-authentication-firebase-user]
datasets.test_user_client_datasets ‑ test_get_dataset[ssh-key-authentication-service-account]
datasets.test_user_client_datasets ‑ test_get_dataset_client[firebase-user]
datasets.test_user_client_datasets ‑ test_get_dataset_client[service-account]
datasets.test_user_client_datasets ‑ test_get_datasets[firebase-user]
datasets.test_user_client_datasets ‑ test_get_datasets[service-account]
datasets.test_user_client_datasets ‑ test_get_datasets_include_org_access
datasets.test_user_client_datasets ‑ test_get_datasets_old_api[firebase-user]
datasets.test_user_client_datasets ‑ test_get_datasets_old_api[service-account]
datasets.test_users ‑ test_add_users_to_dataset[ssh-key-authentication-firebase-user]
datasets.test_users ‑ test_add_users_to_dataset[ssh-key-authentication-service-account]
datasets.test_users ‑ test_dataset_access_controls[firebase-user]
datasets.test_users ‑ test_dataset_access_controls[service-account]
datasets.test_users ‑ test_projects_access_controls[0-firebase-user]
datasets.test_users ‑ test_projects_access_controls[0-service-account]
datasets.test_users ‑ test_projects_access_controls[1-firebase-user]
datasets.test_users ‑ test_projects_access_controls[1-service-account]
datasets.test_videos ‑ test_delete_multiple_videos_from_dataset[ssh-key-authentication]
datasets.test_videos ‑ test_delete_video_from_dataset[ssh-key-authentication]
datasets.test_videos ‑ test_delete_video_with_same_changed_name[ssh-key-authentication]
datasets.test_videos ‑ test_delete_video_with_same_initial_name[ssh-key-authentication]
datasets.test_videos ‑ test_upload_multiple_videos[ssh-key-authentication]
datasets.test_videos ‑ test_upload_video[ssh-key-authentication]
datasets.test_videos ‑ test_upload_video_old_api_without_long_polling[ssh-key-authentication]
datasets.test_videos ‑ test_video_set_title_on_upload[ssh-key-authentication]
datasets.test_videos ‑ test_video_title_update_after_upload[ssh-key-authentication]
ontology.test_ontology_crud ‑ test_ontology_save[firebase-user]
ontology.test_ontology_crud ‑ test_ontology_save[service-account]
ontology.test_ontology_groups ‑ test_add_group_to_ontology[firebase-user]
ontology.test_ontology_groups ‑ test_add_group_to_ontology[service-account]
ontology.test_ontology_groups ‑ test_list_ontology_groups[firebase-user]
ontology.test_ontology_groups ‑ test_list_ontology_groups[service-account]
ontology.test_ontology_groups ‑ test_remove_group_from_ontology[firebase-user]
ontology.test_ontology_groups ‑ test_remove_group_from_ontology[service-account]
projects.test_cloud_integrations ‑ test_get_cloud_integration_ids_for_aws_and_gcp_project[ssh-key-authentication]
projects.test_datasets ‑ test_add_datasets_to_project[ssh-key-authentication]
projects.test_datasets ‑ test_remove_datasets_from_project[ssh-key-authentication]
projects.test_index ‑ test_collection_update[NEW_NAME-None]
projects.test_index ‑ test_collection_update[None-NEW DESC]
projects.test_index ‑ test_collections
projects.test_index ‑ test_preset_integration_test
projects.test_index ‑ test_preset_update[NEW_NAME-None-None]
projects.test_index ‑ test_preset_update[None-NEW DESC-None]
projects.test_index ‑ test_preset_update[None-None-update_filter_preset2]
projects.test_label_row_v2 ‑ test_add_labels_audio
projects.test_label_row_v2 ‑ test_add_labels_dicom
projects.test_label_row_v2 ‑ test_add_labels_image_group
projects.test_label_row_v2 ‑ test_add_labels_native_image
projects.test_label_row_v2 ‑ test_add_labels_video
projects.test_label_row_v2 ‑ test_adding_labels_with_object_answers
projects.test_label_row_v2 ‑ test_bundled_label_create
projects.test_label_row_v2 ‑ test_bundled_label_update
projects.test_label_row_v2 ‑ test_coco_import_labels
projects.test_label_row_v2 ‑ test_filter_labels_by_data_title
projects.test_label_row_v2 ‑ test_filter_labels_by_task_status
projects.test_label_row_v2 ‑ test_filter_not_created_labels_by_edited_date
projects.test_label_row_v2 ‑ test_filter_real_labels_by_edited_date
projects.test_label_row_v2 ‑ test_initiate_labelling
projects.test_label_row_v2 ‑ test_labels_interpolation
projects.test_label_row_v2 ‑ test_list_labels_row_metadata
projects.test_labels ‑ test_adapt_dicom_label_row[ssh-key-authentication]
projects.test_labels ‑ test_adapt_image_group_label_row[ssh-key-authentication]
projects.test_labels ‑ test_adapt_native_image_label_row[ssh-key-authentication]
projects.test_labels ‑ test_adapt_video_label_row[ssh-key-authentication]
projects.test_labels ‑ test_create_label_row[ssh-key-authentication]
projects.test_labels ‑ test_get_label_logs[ssh-key-authentication]
projects.test_labels ‑ test_get_label_row[ssh-key-authentication]
projects.test_labels ‑ test_get_multiple_filtered_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_get_multiple_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_get_no_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_get_one_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_get_too_many_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_image_group_get_label_row[False]
projects.test_labels ‑ test_image_group_get_label_row[True]
projects.test_labels ‑ test_list_label_rows[ssh-key-authentication]
projects.test_labels ‑ test_list_label_rows_new_fields[ssh-key-authentication]
projects.test_labels ‑ test_request_one_wrong_label_row[ssh-key-authentication]
projects.test_labels ‑ test_save_label_row[ssh-key-authentication]
projects.test_labels ‑ test_save_label_row_empty_labels[ssh-key-authentication]
projects.test_labels ‑ test_save_label_row_validate_on_save[invalid-labels-ssh-key-authentication]
projects.test_labels ‑ test_save_label_row_validate_on_save[valid-labels-ssh-key-authentication]
projects.test_labels ‑ test_save_label_row_validation_results[invalid-labels-ssh-key-authentication]
projects.test_labels ‑ test_save_label_row_validation_results[valid-labels-ssh-key-authentication]
projects.test_models_crud ‑ test_create_model_row[ssh-key-authentication]
projects.test_models_crud ‑ test_list_models[ssh-key-authentication]
projects.test_models_train_inference ‑ test_classification_train_inference_ssh_access_using_cpu[False]
projects.test_models_train_inference ‑ test_classification_train_inference_ssh_access_using_cpu[True]
projects.test_models_train_inference ‑ test_instance_segmentation_train_inference_ssh_access
projects.test_models_train_inference ‑ test_object_detection_train_inference_ssh_key_access
projects.test_ontology ‑ test_create_and_edit_ontology[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_create_and_edit_ontology[ssh-key-authentication-service-account]
projects.test_ontology ‑ test_create_ontology_rotated_box[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_create_ontology_rotated_box[ssh-key-authentication-service-account]
projects.test_ontology ‑ test_get_ontologies[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_get_ontologies[ssh-key-authentication-service-account]
projects.test_ontology ‑ test_get_ontologies_include_org_access
projects.test_ontology ‑ test_get_ontology[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_get_ontology[ssh-key-authentication-service-account]
projects.test_ontology ‑ test_legacy_ontology_crud[ssh-key-authentication]
projects.test_ontology ‑ test_save_ontology[ssh-key-authentication]
projects.test_ontology ‑ test_show_empty_project_ontology[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_show_empty_project_ontology[ssh-key-authentication-service-account]
projects.test_ontology ‑ test_update_existing_ontology[ssh-key-authentication-firebase-user]
projects.test_ontology ‑ test_update_existing_ontology[ssh-key-authentication-service-account]
projects.test_project ‑ test_return_404_when_wrong_data_item_uuid_in_right_project[firebase-user]
projects.test_project ‑ test_return_404_when_wrong_data_item_uuid_in_right_project[service-account]
projects.test_project_accessors ‑ test_get_project_orm[ssh-key-authentication]
projects.test_project_accessors ‑ test_project_client_accessors[ssh-key-authentication]
projects.test_project_groups ‑ test_add_group_to_project[firebase-user]
projects.test_project_groups ‑ test_add_group_to_project[service-account]
projects.test_project_groups ‑ test_list_project_groups[firebase-user]
projects.test_project_groups ‑ test_list_project_groups[service-account]
projects.test_project_groups ‑ test_remove_group_from_project[firebase-user]
projects.test_project_groups ‑ test_remove_group_from_project[service-account]
projects.test_shadow_data ‑ test_shadow_data_project
projects.test_skeleton_template ‑ test_create_skeleton_instance[invalid-input]
projects.test_skeleton_template ‑ test_create_skeleton_instance[valid-input]
projects.test_skeleton_template ‑ test_ontology_containing_skeleton_template
projects.test_tms2_related ‑ test_workflow_labelling_can_be_completed
projects.test_tms2_related ‑ test_workflow_labelling_can_be_reopened
projects.test_tms2_related ‑ test_workflow_nodes_exposed_in_label_row_v2
projects.test_tms2_related ‑ test_workflow_non_tms_project_raises_on_reopen
projects.test_tms2_related ‑ test_workflow_non_tms_project_shown_correctly
projects.test_tms2_related ‑ test_workflow_project_raises_on_set_label_status
projects.test_tms2_related ‑ test_workflow_project_raises_on_submit_label_row_for_review
projects.test_tms2_related ‑ test_workflow_server_side_filter_empty_for_pre_workflow_projects
projects.test_tms2_related ‑ test_workflow_server_side_filter_works
projects.test_user_client_projects ‑ test_create_and_copy_project[firebase-user]
projects.test_user_client_projects ‑ test_create_and_copy_project[service-account]
projects.test_user_client_projects ‑ test_create_project_with_no_datasets[firebase-user]
projects.test_user_client_projects ‑ test_create_project_with_no_datasets[service-account]
projects.test_user_client_projects ‑ test_get_project_client[firebase-user]
projects.test_user_client_projects ‑ test_get_project_client[service-account]
projects.test_user_client_projects ‑ test_get_projects[ssh-key-authentication-firebase-user]
projects.test_user_client_projects ‑ test_get_projects[ssh-key-authentication-service-account]
projects.test_user_client_projects ‑ test_list_projects
projects.test_users ‑ test_add_users_to_project[ssh-key-authentication-firebase-user]
projects.test_users ‑ test_add_users_to_project[ssh-key-authentication-service-account]
storage.test_storage_folder_groups ‑ test_storage_folder_groups_manipulation
storage.test_storage_folder_upload ‑ test_dataset_cloud_upload_cancel_job[integration0-False-False]
storage.test_storage_folder_upload ‑ test_dataset_cloud_upload_cancel_job[integration1-False-True]
storage.test_storage_folder_upload ‑ test_dataset_cloud_upload_cancel_job[integration2-True-False]
storage.test_storage_folder_upload ‑ test_dataset_cloud_upload_cancel_job[integration3-True-True]
storage.test_storage_folder_upload ‑ test_dataset_cloud_upload_invalid_json
storage.test_storage_folder_upload ‑ test_gcp_cloud_upload_via_dynamic_dataset
storage.test_storage_folder_upload ‑ test_storage_folder_cloud_upload_cancel_job[integration0-False-False]
storage.test_storage_folder_upload ‑ test_storage_folder_cloud_upload_cancel_job[integration1-False-True]
storage.test_storage_folder_upload ‑ test_storage_folder_cloud_upload_cancel_job[integration2-True-False]
storage.test_storage_folder_upload ‑ test_storage_folder_cloud_upload_cancel_job[integration3-True-True]
storage.test_storage_folder_upload ‑ test_storage_folder_cloud_upload_image_group_with_image_metadata
storage.test_storage_folder_upload ‑ test_storage_folder_create_dicom_series
storage.test_storage_folder_upload ‑ test_storage_folder_create_image_group
storage.test_storage_folder_upload ‑ test_storage_folder_create_image_sequence
storage.test_storage_folder_upload ‑ test_storage_folder_gcp_cloud_upload
storage.test_storage_folder_upload ‑ test_storage_folder_gcp_cloud_upload_readable_errors
storage.test_storage_folder_upload ‑ test_storage_folder_upload_audio
storage.test_storage_folder_upload ‑ test_storage_folder_upload_image
storage.test_storage_folder_upload ‑ test_storage_folder_upload_images_with_image_metadata
storage.test_storage_folder_upload ‑ test_storage_folder_upload_metadata_upsert
storage.test_storage_folder_upload ‑ test_storage_folder_upload_pdf
storage.test_storage_folder_upload ‑ test_storage_folder_upload_text
storage.test_storage_folder_upload ‑ test_storage_folder_upload_texts_via_struct_param
storage.test_storage_folder_upload ‑ test_storage_folder_upload_video
storage.test_storage_folder_upload ‑ test_upload_dicom_series_via_dynamic_dataset
storage.test_storage_folder_upload ‑ test_upload_image_group_via_dynamic_dataset
storage.test_storage_folder_upload ‑ test_upload_image_via_dynamic_dataset
storage.test_storage_folder_upload ‑ test_upload_video_via_dynamic_dataset
storage.test_storage_folder_upload_direct_access_dicom_series ‑ test_storage_folder_upload_direct_access_dicom_series
storage.test_storage_folders_crud ‑ test_create_delete_storage_folder_with_parent
storage.test_storage_folders_crud ‑ test_create_update_delete_storage_folder
storage.test_storage_folders_crud ‑ test_get_folder_authorisation_error
storage.test_storage_folders_crud ‑ test_move_storage_folder
storage.test_storage_folders_crud ‑ test_update_folders_bundled
storage.test_storage_folders_listing ‑ test_storage_folder_find_folders_recursively
storage.test_storage_folders_listing ‑ test_storage_folder_list_subfolders
storage.test_storage_folders_listing ‑ test_storage_folders_list_top_level
storage.test_storage_folders_listing ‑ test_storage_folders_search
storage.test_storage_items_listing ‑ test_storage_find_items
storage.test_storage_items_listing ‑ test_storage_find_items_recursively
storage.test_storage_items_listing ‑ test_storage_folder_list_items
storage.test_storage_items_listing ‑ test_storage_get_items_bulk
storage.test_storage_items_listing ‑ test_storage_item_adjust_client_metadata_without_refetch
storage.test_storage_items_listing ‑ test_storage_item_bulk_updates
storage.test_storage_items_listing ‑ test_storage_item_crud
storage.test_storage_items_listing ‑ test_storage_item_move_with_sync_dataset
storage.test_storage_items_listing ‑ test_storage_item_reset_client_metadata
storage.test_storage_migrator ‑ test_storage_migration_integrations
storage.test_storage_migrator ‑ test_storage_migration_urls
storage.test_storage_video_operations ‑ test_reencode_video
user_client.test_cloud_integrations ‑ test_get_cloud_integration_ids_for_aws_and_gcp_user_client[False]
user_client.test_cloud_integrations ‑ test_get_cloud_integration_ids_for_aws_and_gcp_user_client[True]
user_client.test_cloud_integrations ‑ test_get_cloud_integrations_filters_user_client
user_client.test_cloud_integrations ‑ test_get_cloud_integrations_org_wide_not_allowed
user_client.test_cloud_integrations ‑ test_get_cloud_integrations_org_wide_user_client
user_client.test_cvat_integration ‑ test_cvat_project_creation[labelled-False-firebase-user]
user_client.test_cvat_integration ‑ test_cvat_project_creation[labelled-False-service-account]
user_client.test_cvat_integration ‑ test_cvat_project_creation[labelled-True-firebase-user]
user_client.test_cvat_integration ‑ test_cvat_project_creation[labelled-True-service-account]
user_client.test_cvat_integration ‑ test_cvat_project_creation[unlabelled-False-firebase-user]
user_client.test_cvat_integration ‑ test_cvat_project_creation[unlabelled-False-service-account]
user_client.test_cvat_integration ‑ test_cvat_project_creation[unlabelled-True-firebase-user]
user_client.test_cvat_integration ‑ test_cvat_project_creation[unlabelled-True-service-account]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[0-storage_test_params0-True-DeidentifyRedactTextMode.REDACT_ALL_TEXT-save_conditions0-None]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[1-storage_test_params1-True-DeidentifyRedactTextMode.REDACT_ALL_TEXT-save_conditions1-None]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[2-storage_test_params2-True-DeidentifyRedactTextMode.REDACT_ALL_TEXT-save_conditions2-None]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[3-storage_test_params3-True-DeidentifyRedactTextMode.REDACT_ALL_TEXT-save_conditions3-https://storage.cloud.google.com/sdk-test-bucket/deid-prefix]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[4-storage_test_params4-True-DeidentifyRedactTextMode.REDACT_ALL_TEXT-save_conditions4-None]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[5-storage_test_params5-False-DeidentifyRedactTextMode.REDACT_NO_TEXT-None-https://sdk-tests.s3.eu-west-2.amazonaws.com/deid-prefix/]
user_client.test_deid_dicom_files ‑ test_deidentify_dicom_files_private[6-storage_test_params6-True-DeidentifyRedactTextMode.REDACT_SENSITIVE_TEXT-save_conditions6-https://cordteststoragetwo.blob.core.windows.net/sdk-test-bucket/deid-prefix/nested/]
user_client.test_groups ‑ test_list_groups[firebase-user]
user_client.test_groups ‑ test_list_groups[service-account]
workflows.test_workflows ‑ test_enumerate_workflow_stage_get_tasks
workflows.test_workflows ‑ test_enumerate_workflow_stages
workflows.test_workflows ‑ test_workflow_submit_all_annotation_tasks_in_bulk
workflows.test_workflows ‑ test_workflow_submit_annotation_task