From 57bc0e9c9052116a4f9d35d2a55f1106b2906053 Mon Sep 17 00:00:00 2001 From: Maria Khrustaleva Date: Tue, 5 Jul 2022 16:13:10 +0300 Subject: [PATCH] Source & target storage tests (#56) --- CHANGELOG.md | 2 + cvat/apps/engine/mixins.py | 5 +- cvat/apps/engine/serializers.py | 5 +- cvat/apps/engine/views.py | 7 +- tests/rest_api/assets/cloudstorages.json | 24 +- .../rest_api/assets/cvat_db/cvat_data.tar.bz2 | Bin 46340 -> 50225 bytes tests/rest_api/assets/cvat_db/data.json | 71 ++++- tests/rest_api/assets/projects.json | 14 +- tests/rest_api/assets/tasks.json | 14 +- tests/rest_api/assets/users.json | 2 +- tests/rest_api/docker-compose.minio.yml | 5 +- tests/rest_api/requirements.txt | 1 + tests/rest_api/test_resource_import_export.py | 244 ++++++++++++++++++ tests/rest_api/utils/config.py | 5 + 14 files changed, 373 insertions(+), 26 deletions(-) create mode 100644 tests/rest_api/test_resource_import_export.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f916b1b..f945964b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Progressbars in CLI for file uploading and downloading () - `utils/cli` changed to `cvat-cli` package () - Support custom file name for backup () +- Support source and target storages (server part) () +- Tests for import/export annotation, dataset, backup from/to cloud storage () ### Changed - Bumped nuclio version to 1.8.14 () diff --git a/cvat/apps/engine/mixins.py b/cvat/apps/engine/mixins.py index 42f164ff..542198cf 100644 --- a/cvat/apps/engine/mixins.py +++ b/cvat/apps/engine/mixins.py @@ -278,7 +278,7 @@ class AnnotationMixin: if serializer.is_valid(raise_exception=True): return Response(serializer.data) - def import_annotations(self, request, pk, db_obj, import_func, rq_func): + def import_annotations(self, request, pk, db_obj, import_func, rq_func, rq_id): use_default_location = request.query_params.get('use_default_location', True) use_settings = strtobool(str(use_default_location)) obj = db_obj if use_settings else request.query_params @@ -291,9 +291,6 @@ class AnnotationMixin: if location_conf['location'] == Location.CLOUD_STORAGE: format_name = request.query_params.get('format') file_name = request.query_params.get('filename') - rq_id = "{}@/api/{}/{}/annotations/upload".format( - self._object.__class__.__name__.lower(), request.user, pk - ) return import_func( request=request, diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 2e95c357..6791e368 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -625,9 +625,8 @@ class ProjectReadSerializer(serializers.ModelSerializer): class Meta: model = models.Project fields = ('url', 'id', 'name', 'labels', 'tasks', 'owner', 'assignee', - 'bug_tracker', 'task_subsets', # 'owner_id', 'assignee_id', - 'created_date', 'updated_date', 'status', 'dimension', 'organization', - 'target_storage', 'source_storage', + 'bug_tracker', 'task_subsets', 'created_date', 'updated_date', 'status', + 'dimension', 'organization', 'target_storage', 'source_storage', ) read_only_fields = ('created_date', 'updated_date', 'status', 'owner', 'assignee', 'task_subsets', 'dimension', 'organization', 'tasks', diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index e840dead..df0589f1 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -314,7 +314,7 @@ class ProjectViewSet(viewsets.ModelViewSet, UploadMixin, AnnotationMixin, Serial parameters=[ OpenApiParameter('format', description='Desired output format name\n' 'You can get the list of supported formats at:\n/server/annotation/formats', - location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, required=True), + location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, required=False), OpenApiParameter('filename', description='Desired output file name', location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, required=False), OpenApiParameter('action', description='Used to start downloading process after annotation file had been created', @@ -367,7 +367,8 @@ class ProjectViewSet(viewsets.ModelViewSet, UploadMixin, AnnotationMixin, Serial pk=pk, db_obj=self._object, import_func=_import_project_dataset, - rq_func=dm.project.import_dataset_as_project + rq_func=dm.project.import_dataset_as_project, + rq_id=f"/api/project/{pk}/dataset_import", ) else: action = request.query_params.get("action", "").lower() @@ -986,6 +987,7 @@ class TaskViewSet(UploadMixin, AnnotationMixin, viewsets.ModelViewSet, Serialize db_obj=self._object, import_func=_import_annotations, rq_func=dm.task.import_task_annotations, + rq_id = "{}@/api/tasks/{}/annotations/upload".format(request.user, pk) ) elif request.method == 'PUT': format_name = request.query_params.get('format') @@ -1303,6 +1305,7 @@ class JobViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, db_obj=self._object.segment.task, import_func=_import_annotations, rq_func=dm.task.import_job_annotations, + rq_id = "{}@/api/jobs/{}/annotations/upload".format(request.user, pk) ) elif request.method == 'PUT': diff --git a/tests/rest_api/assets/cloudstorages.json b/tests/rest_api/assets/cloudstorages.json index 9ade4829..ad27a81e 100644 --- a/tests/rest_api/assets/cloudstorages.json +++ b/tests/rest_api/assets/cloudstorages.json @@ -1,8 +1,30 @@ { - "count": 2, + "count": 3, "next": null, "previous": null, "results": [ + { + "created_date": "2022-06-29T12:56:18.257000Z", + "credentials_type": "KEY_SECRET_KEY_PAIR", + "description": "Bucket for importing and exporting annotations and backups", + "display_name": "Import/Export bucket", + "id": 3, + "manifests": [ + "manifest.jsonl" + ], + "organization": 2, + "owner": { + "first_name": "Admin", + "id": 1, + "last_name": "First", + "url": "http://localhost:8080/api/users/1", + "username": "admin1" + }, + "provider_type": "AWS_S3_BUCKET", + "resource": "importexportbucket", + "specific_attributes": "endpoint_url=http%3A%2F%2Fminio%3A9000", + "updated_date": "2022-06-29T12:56:18.264000Z" + }, { "created_date": "2022-03-17T07:23:59.305000Z", "credentials_type": "KEY_SECRET_KEY_PAIR", diff --git a/tests/rest_api/assets/cvat_db/cvat_data.tar.bz2 b/tests/rest_api/assets/cvat_db/cvat_data.tar.bz2 index 2dd5de83d58625b0e58b4499d1a5036f2424a9f5..79c5b0f9c73f9677a7348b937b166e3074e6358a 100644 GIT binary patch literal 50225 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

T;5{@%aZRX3GR&Qra) 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 diff --git a/tests/rest_api/assets/cvat_db/data.json b/tests/rest_api/assets/cvat_db/data.json index d6a70063..9aaba081 100644 --- a/tests/rest_api/assets/cvat_db/data.json +++ b/tests/rest_api/assets/cvat_db/data.json @@ -1413,7 +1413,7 @@ "pk": 1, "fields": { "password": "pbkdf2_sha256$260000$DevmxlmLwciP1P6sZs2Qag$U9DFtjTWx96Sk95qY6UXVcvpdQEP2LcoFBftk5D2RKY=", - "last_login": "2022-06-22T09:20:25.189Z", + "last_login": "2022-06-29T12:55:15.511Z", "is_superuser": true, "username": "admin1", "first_name": "Admin", @@ -3710,11 +3710,11 @@ "assignee": 3, "bug_tracker": "", "created_date": "2021-12-14T19:52:37.278Z", - "updated_date": "2022-03-28T13:04:54.669Z", + "updated_date": "2022-06-30T08:56:45.601Z", "status": "annotation", "organization": 2, - "source_storage": null, - "target_storage": null + "source_storage": 3, + "target_storage": 1 } }, { @@ -3898,7 +3898,7 @@ "assignee": 19, "bug_tracker": "", "created_date": "2022-03-05T10:32:19.149Z", - "updated_date": "2022-03-05T10:32:35.568Z", + "updated_date": "2022-06-30T08:56:45.594Z", "overlap": 0, "segment_size": 11, "status": "annotation", @@ -3906,8 +3906,8 @@ "dimension": "2d", "subset": "Train", "organization": 2, - "source_storage": null, - "target_storage": null + "source_storage": 4, + "target_storage": 2 } }, { @@ -6158,6 +6158,14 @@ "cloud_storage": 2 } }, +{ + "model": "engine.manifest", + "pk": 3, + "fields": { + "filename": "manifest.jsonl", + "cloud_storage": 3 + } +}, { "model": "engine.cloudstorage", "pk": 1, @@ -6191,5 +6199,54 @@ "description": "", "organization": 2 } +}, +{ + "model": "engine.cloudstorage", + "pk": 3, + "fields": { + "provider_type": "AWS_S3_BUCKET", + "resource": "importexportbucket", + "display_name": "Import/Export bucket", + "owner": 1, + "created_date": "2022-06-29T12:56:18.257Z", + "updated_date": "2022-06-29T12:56:18.264Z", + "credentials": "minio_access_key minio_secret_key", + "credentials_type": "KEY_SECRET_KEY_PAIR", + "specific_attributes": "endpoint_url=http%3A%2F%2Fminio%3A9000", + "description": "Bucket for importing and exporting annotations and backups", + "organization": 2 + } +}, +{ + "model": "engine.storage", + "pk": 1, + "fields": { + "location": "cloud_storage", + "cloud_storage_id": 2 + } +}, +{ + "model": "engine.storage", + "pk": 2, + "fields": { + "location": "cloud_storage", + "cloud_storage_id": 2 + } +}, +{ + "model": "engine.storage", + "pk": 3, + "fields": { + "location": "cloud_storage", + "cloud_storage_id": 2 + } +}, +{ + "model": "engine.storage", + "pk": 4, + "fields": { + "location": "cloud_storage", + "cloud_storage_id": 2 + } } ] diff --git a/tests/rest_api/assets/projects.json b/tests/rest_api/assets/projects.json index 6d5a2cbc..80fbd03f 100644 --- a/tests/rest_api/assets/projects.json +++ b/tests/rest_api/assets/projects.json @@ -107,16 +107,24 @@ "url": "http://localhost:8080/api/users/10", "username": "business1" }, - "source_storage": null, + "source_storage": { + "cloud_storage_id": 2, + "id": 3, + "location": "cloud_storage" + }, "status": "annotation", - "target_storage": null, + "target_storage": { + "cloud_storage_id": 2, + "id": 1, + "location": "cloud_storage" + }, "task_subsets": [ "Train" ], "tasks": [ 11 ], - "updated_date": "2022-03-28T13:04:54.669000Z", + "updated_date": "2022-06-30T08:56:45.601000Z", "url": "http://localhost:8080/api/projects/2" }, { diff --git a/tests/rest_api/assets/tasks.json b/tests/rest_api/assets/tasks.json index a3d21bea..998b6307 100644 --- a/tests/rest_api/assets/tasks.json +++ b/tests/rest_api/assets/tasks.json @@ -167,11 +167,19 @@ } ], "size": 11, - "source_storage": null, + "source_storage": { + "cloud_storage_id": 2, + "id": 4, + "location": "cloud_storage" + }, "status": "annotation", "subset": "Train", - "target_storage": null, - "updated_date": "2022-03-05T10:32:35.568000Z", + "target_storage": { + "cloud_storage_id": 2, + "id": 2, + "location": "cloud_storage" + }, + "updated_date": "2022-06-30T08:56:45.594000Z", "url": "http://localhost:8080/api/tasks/11" }, { diff --git a/tests/rest_api/assets/users.json b/tests/rest_api/assets/users.json index d14cf1b0..5abb7899 100644 --- a/tests/rest_api/assets/users.json +++ b/tests/rest_api/assets/users.json @@ -310,7 +310,7 @@ "is_active": true, "is_staff": true, "is_superuser": true, - "last_login": "2022-06-22T09:20:25.189000Z", + "last_login": "2022-06-29T12:55:15.511000Z", "last_name": "First", "url": "http://localhost:8080/api/users/1", "username": "admin1" diff --git a/tests/rest_api/docker-compose.minio.yml b/tests/rest_api/docker-compose.minio.yml index ccc7d7d2..19b04603 100644 --- a/tests/rest_api/docker-compose.minio.yml +++ b/tests/rest_api/docker-compose.minio.yml @@ -37,6 +37,7 @@ services: PRIVATE_BUCKET: "private" PUBLIC_BUCKET: "public" TEST_BUCKET: "test" + IMPORT_EXPORT_BUCKET: "importexportbucket" volumes: - ./tests/cypress/integration/actions_tasks/assets/case_65_manifest/:/storage networks: @@ -44,8 +45,8 @@ services: entrypoint: > /bin/sh -c " $${MC_PATH} config host add --quiet --api s3v4 $${MINIO_ALIAS} $${MINIO_HOST} $${MINIO_ACCESS_KEY} $${MINIO_SECRET_KEY}; - $${MC_PATH} mb $${MINIO_ALIAS}/$${PRIVATE_BUCKET} $${MINIO_ALIAS}/$${PUBLIC_BUCKET} $${MINIO_ALIAS}/$${TEST_BUCKET}; - for BUCKET in $${MINIO_ALIAS}/$${PRIVATE_BUCKET} $${MINIO_ALIAS}/$${PUBLIC_BUCKET} $${MINIO_ALIAS}/$${TEST_BUCKET}; + $${MC_PATH} mb $${MINIO_ALIAS}/$${PRIVATE_BUCKET} $${MINIO_ALIAS}/$${PUBLIC_BUCKET} $${MINIO_ALIAS}/$${TEST_BUCKET} $${MINIO_ALIAS}/$${IMPORT_EXPORT_BUCKET}; + for BUCKET in $${MINIO_ALIAS}/$${PRIVATE_BUCKET} $${MINIO_ALIAS}/$${PUBLIC_BUCKET} $${MINIO_ALIAS}/$${TEST_BUCKET} $${MINIO_ALIAS}/$${IMPORT_EXPORT_BUCKET}; do $${MC_PATH} cp --recursive /storage/ $${BUCKET}; for i in 1 2; diff --git a/tests/rest_api/requirements.txt b/tests/rest_api/requirements.txt index 34d3f348..148f9427 100644 --- a/tests/rest_api/requirements.txt +++ b/tests/rest_api/requirements.txt @@ -1,4 +1,5 @@ pytest==6.2.5 requests==2.26.0 deepdiff==5.6.0 +boto3==1.17.61 Pillow==9.0.1 diff --git a/tests/rest_api/test_resource_import_export.py b/tests/rest_api/test_resource_import_export.py new file mode 100644 index 00000000..d87cfc58 --- /dev/null +++ b/tests/rest_api/test_resource_import_export.py @@ -0,0 +1,244 @@ +import pytest +import boto3 +import functools +import json + +from botocore.exceptions import ClientError +from http import HTTPStatus + +from .utils.config import ( + get_method, post_method, MINIO_KEY, MINIO_SECRET_KEY, MINIO_ENDPOINT_URL, +) + +FILENAME_TEMPLATE = 'cvat/{}/{}.zip' +FORMAT = 'COCO 1.0' + +def _use_custom_settings(obj, resource, cloud_storage_id): + return { + 'filename': FILENAME_TEMPLATE.format(obj, resource), + 'use_default_location': False, + 'location': 'cloud_storage', + 'cloud_storage_id': cloud_storage_id, + 'format': FORMAT, + } + +def _use_default_settings(obj, resource): + return { + 'filename': FILENAME_TEMPLATE.format(obj, resource), + 'use_default_location': True, + 'format': FORMAT, + } + +def define_client(): + s3 = boto3.resource( + 's3', + aws_access_key_id=MINIO_KEY, + aws_secret_access_key=MINIO_SECRET_KEY, + endpoint_url= MINIO_ENDPOINT_URL, + ) + return s3.meta.client + +def assert_file_does_not_exist(client, bucket, filename): + try: + client.head_object(Bucket=bucket, Key=filename) + raise AssertionError(f'File {filename} on bucket {bucket} already exists') + except ClientError: + pass + +def assert_file_exists(client, bucket, filename): + try: + client.head_object(Bucket=bucket, Key=filename) + except ClientError: + raise AssertionError(f"File {filename} on bucket {bucket} doesn't exist") + +def assert_file_status(func): + @functools.wraps(func) + def wrapper(user, storage_conf, *args, **kwargs): + filename = kwargs['filename'] + bucket = storage_conf['resource'] + # get storage client + client = define_client() + # check that file doesn't exist on the bucket + assert_file_does_not_exist(client, bucket, filename) + func(user, storage_conf, *args, **kwargs) + # check that file exists on the bucket + assert_file_exists(client, bucket, filename) + return wrapper + +def remove_asset(bucket, filename): + client = define_client() + client.delete_object(Bucket=bucket, Key=filename) + +@assert_file_status +def _save_resource_to_cloud_storage(user, storage_conf, obj_id, obj, resource, **kwargs): + response = get_method(user, f'{obj}/{obj_id}/{resource}', **kwargs) + status = response.status_code + + while status != HTTPStatus.OK: + assert status in (HTTPStatus.CREATED, HTTPStatus.ACCEPTED) + response = get_method(user, f'{obj}/{obj_id}/{resource}', action='download', **kwargs) + status = response.status_code + +def _idempotent_saving_resource_to_cloud_storage(*args, **kwargs): + _save_resource_to_cloud_storage(*args, **kwargs) + remove_asset(args[1]['resource'], kwargs['filename']) + +@pytest.mark.usefixtures('dontchangedb') +class TestSaveResource: + _USERNAME = 'admin1' + _ORG = 2 + + @pytest.mark.parametrize('cloud_storage_id', [3]) + @pytest.mark.parametrize('obj_id, obj, resource', [ + (2, 'projects', 'annotations'), + (2, 'projects', 'dataset'), + (2, 'projects', 'backup'), + (11, 'tasks', 'annotations'), + (11, 'tasks', 'dataset'), + (11, 'tasks', 'backup'), + (16, 'jobs', 'annotations'), + (16, 'jobs', 'dataset'), + ]) + def test_save_resource_to_cloud_storage_with_specific_location( + self, cloud_storage_id, obj_id, obj, resource, cloud_storages + ): + cloud_storage = cloud_storages[cloud_storage_id] + kwargs = _use_custom_settings(obj, resource, cloud_storage_id) + if resource == 'backup': + kwargs.pop('format') + + _idempotent_saving_resource_to_cloud_storage(self._USERNAME, cloud_storage, + obj_id, obj, resource, org_id=self._ORG, **kwargs) + + @pytest.mark.parametrize('obj_id, obj, resource', [ + (2, 'projects', 'annotations'), + (2, 'projects', 'dataset'), + (2, 'projects', 'backup'), + (11, 'tasks', 'annotations'), + (11, 'tasks', 'dataset'), + (11, 'tasks', 'backup'), + (16, 'jobs', 'annotations'), + (16, 'jobs', 'dataset'), + ]) + def test_save_resource_to_cloud_storage_with_default_location( + self, obj_id, obj, resource, projects, tasks, jobs, cloud_storages, + ): + objects = { + 'projects': projects, + 'tasks': tasks, + 'jobs': jobs, + } + if obj in ('projects', 'tasks'): + cloud_storage_id = objects[obj][obj_id]['target_storage']['cloud_storage_id'] + else: + task_id = jobs[obj_id]['task_id'] + cloud_storage_id = tasks[task_id]['target_storage']['cloud_storage_id'] + cloud_storage = cloud_storages[cloud_storage_id] + + kwargs = _use_default_settings(obj, resource) + + if resource == 'backup': + kwargs.pop('format') + + _idempotent_saving_resource_to_cloud_storage(self._USERNAME, cloud_storage, + obj_id, obj, resource, org_id=self._ORG, **kwargs) + +def _import_annotations_from_cloud_storage(user, obj_id, obj, **kwargs): + url = f'{obj}/{obj_id}/annotations' + response = post_method(user, url, data=None, **kwargs) + status = response.status_code + + while status != HTTPStatus.CREATED: + assert status == HTTPStatus.ACCEPTED + response = post_method(user, url, data=None, **kwargs) + status = response.status_code + +def _import_backup_from_cloud_storage(user, obj_id, obj, **kwargs): + url = f'{obj}/backup' + response = post_method(user, url, data=None, **kwargs) + status = response.status_code + + while status != HTTPStatus.CREATED: + assert status == HTTPStatus.ACCEPTED + data = json.loads(response.content.decode('utf8')) + response = post_method(user, url, data=data, **kwargs) + status = response.status_code + +def _import_dataset_from_cloud_storage(user, obj_id, obj, **kwargs): + url = f'{obj}/{obj_id}/dataset' + response = post_method(user, url, data=None, **kwargs) + status = response.status_code + + while status != HTTPStatus.CREATED: + assert status == HTTPStatus.ACCEPTED + response = get_method(user, url, action='import_status') + status = response.status_code + +@pytest.mark.usefixtures('changedb') +@pytest.mark.usefixtures('restore_cvat_data') +class TestImportResource: + _USERNAME = 'admin1' + _ORG = 2 + + @pytest.mark.parametrize('cloud_storage_id', [3]) + @pytest.mark.parametrize('obj_id, obj, resource', [ + (2, 'projects', 'dataset'), + (2, 'projects', 'backup'), + (11, 'tasks', 'annotations'), + (11, 'tasks', 'backup'), + (16, 'jobs', 'annotations'), + ]) + def test_import_resource_from_cloud_storage_with_specific_location( + self, cloud_storage_id, obj_id, obj, resource, cloud_storages + ): + cloud_storage = cloud_storages[cloud_storage_id] + kwargs = _use_custom_settings(obj, resource, cloud_storage_id) + export_kwargs = _use_custom_settings(obj, resource, cloud_storage_id) + + if resource == 'backup': + kwargs.pop('format') + kwargs.pop('use_default_location') + export_kwargs.pop('format') + + # export current resource to cloud storage + _save_resource_to_cloud_storage(self._USERNAME, cloud_storage, obj_id, obj, resource, org_id=self._ORG, **export_kwargs) + + import_resource = { + 'annotations': _import_annotations_from_cloud_storage, + 'dataset': _import_dataset_from_cloud_storage, + 'backup': _import_backup_from_cloud_storage, + } + import_resource[resource](self._USERNAME, obj_id, obj, org_id=self._ORG, **kwargs) + remove_asset(cloud_storage['resource'], kwargs['filename']) + + @pytest.mark.parametrize('obj_id, obj, resource', [ + (2, 'projects', 'dataset'), + (11, 'tasks', 'annotations'), + (16, 'jobs', 'annotations'), + ]) + def test_import_resource_from_cloud_storage_with_default_location( + self, obj_id, obj, resource, projects, tasks, jobs, cloud_storages, + ): + objects = { + 'projects': projects, + 'tasks': tasks, + 'jobs': jobs, + } + if obj in ('projects', 'tasks'): + cloud_storage_id = objects[obj][obj_id]['source_storage']['cloud_storage_id'] + else: + task_id = jobs[obj_id]['task_id'] + cloud_storage_id = tasks[task_id]['source_storage']['cloud_storage_id'] + cloud_storage = cloud_storages[cloud_storage_id] + kwargs = _use_default_settings(obj, resource) + + # export current resource to cloud storage + _save_resource_to_cloud_storage(self._USERNAME, cloud_storage, obj_id, obj, resource, org_id=self._ORG, **kwargs) + + import_resource = { + 'annotations': _import_annotations_from_cloud_storage, + 'dataset': _import_dataset_from_cloud_storage, + 'backup': _import_backup_from_cloud_storage, + } + import_resource[resource](self._USERNAME, obj_id, obj, org_id=self._ORG, **kwargs) + remove_asset(cloud_storage['resource'], kwargs['filename']) diff --git a/tests/rest_api/utils/config.py b/tests/rest_api/utils/config.py index a114a7d6..80a98c91 100644 --- a/tests/rest_api/utils/config.py +++ b/tests/rest_api/utils/config.py @@ -12,6 +12,11 @@ USER_PASS = '!Q@W#E$R' # nosec BASE_URL = 'http://localhost:8080/' API_URL = BASE_URL + 'api/' +# MiniIO settings +MINIO_KEY = 'minio_access_key' +MINIO_SECRET_KEY = 'minio_secret_key' # nosec +MINIO_ENDPOINT_URL = 'http://localhost:9000' + def _to_query_params(**kwargs): return '&'.join([f'{k}={v}' for k,v in kwargs.items()])