gooddata-pipelines 1.48.1.dev1__tar.gz → 1.48.1.dev3__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 gooddata-pipelines might be problematic. Click here for more details.
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/PKG-INFO +11 -14
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/README.md +9 -12
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/backup_input_processor.py +13 -5
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/backup_manager.py +23 -10
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/models/storage.py +4 -1
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/storage/s3_storage.py +19 -4
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/pyproject.toml +2 -2
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/.gitignore +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/LICENSE.txt +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/Makefile +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/TODO.md +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/_version.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/exceptions.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/gooddata_api.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/gooddata_api_wrapper.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/gooddata_sdk.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/utils.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/constants.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/csv_reader.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/models/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/models/input_type.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/models/workspace_response.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/storage/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/storage/base_storage.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/backup_and_restore/storage/local_storage.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/logger/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/logger/logger.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/assets/wdf_setting.json +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/user_data_filters/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/user_data_filters/models/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/user_data_filters/models/udf_models.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/user_data_filters/user_data_filters.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/models/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/models/permissions.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/models/user_groups.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/models/users.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/permissions.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/user_groups.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/users/users.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/models.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/workspace.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/workspace_data_filters.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/workspace_data_parser.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/entities/workspaces/workspace_data_validator.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/provisioning.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/utils/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/utils/context_objects.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/utils/exceptions.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/provisioning/utils/utils.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/py.typed +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/poetry.lock +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/backup_and_restore/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/backup_and_restore/test_backup.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/backup_and_restore/test_backup_input_processor.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/conftest.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_conf.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/analytical_dashboard_extensions/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/analytical_dashboards/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/dashboard_plugins/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/filter_contexts/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/metrics/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/analytics_model/visualization_objects/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/ldm/datasets/test.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid1/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid1/ldm/date_instances/testinstance.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/analytical_dashboard_extensions/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/analytical_dashboards/id.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/dashboard_plugins/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/filter_contexts/id.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/metrics/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/analytics_model/visualization_objects/test.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/ldm/datasets/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid2/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid2/ldm/date_instances/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/analytical_dashboard_extensions/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/analytical_dashboards/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/dashboard_plugins/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/filter_contexts/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/metrics/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/analytics_model/visualization_objects/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/ldm/datasets/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/ldm/date_instances/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_exports/services/wsid3/20230713-132759-1_3_1_dev5/gooddata_layouts/services/workspaces/wsid3/user_data_filters/.gitkeep +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_local_conf.yaml +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/mock_responses.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/panther/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/panther/test_api_wrapper.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/panther/test_sdk_wrapper.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/users/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/users/test_permissions.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/users/test_user_groups.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/users/test_users.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/__init__.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/test_provisioning.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/test_workspace.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/test_workspace_data_filters.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/test_workspace_data_parser.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/entities/workspaces/test_workspace_data_validator.py +0 -0
- {gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tox.ini +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gooddata-pipelines
|
|
3
|
-
Version: 1.48.1.
|
|
3
|
+
Version: 1.48.1.dev3
|
|
4
4
|
Author-email: GoodData <support@gooddata.com>
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE.txt
|
|
7
7
|
Requires-Python: >=3.10
|
|
8
8
|
Requires-Dist: boto3-stubs<2.0.0,>=1.39.3
|
|
9
9
|
Requires-Dist: boto3<2.0.0,>=1.39.3
|
|
10
|
-
Requires-Dist: gooddata-sdk~=1.48.1.
|
|
10
|
+
Requires-Dist: gooddata-sdk~=1.48.1.dev3
|
|
11
11
|
Requires-Dist: pydantic<3.0.0,>=2.11.3
|
|
12
12
|
Requires-Dist: requests<3.0.0,>=2.32.3
|
|
13
13
|
Requires-Dist: types-pyyaml<7.0.0,>=6.0.12.20250326
|
|
@@ -22,9 +22,9 @@ Description-Content-Type: text/markdown
|
|
|
22
22
|
|
|
23
23
|
# GoodData Pipelines
|
|
24
24
|
|
|
25
|
-
A high
|
|
25
|
+
A high-level library for automating the lifecycle of GoodData Cloud (GDC).
|
|
26
26
|
|
|
27
|
-
You can use the package to manage following
|
|
27
|
+
You can use the package to manage following resources in GDC:
|
|
28
28
|
|
|
29
29
|
1. Provisioning (create, update, delete)
|
|
30
30
|
- User profiles
|
|
@@ -36,7 +36,7 @@ You can use the package to manage following resoursec in GDC:
|
|
|
36
36
|
1. _[PLANNED]:_ Custom fields management
|
|
37
37
|
- extend the Logical Data Model of a child workspace
|
|
38
38
|
|
|
39
|
-
In case you are not interested in incorporating a library in your own program
|
|
39
|
+
In case you are not interested in incorporating a library in your own program but would like to use a ready-made script, consider having a look at [GoodData Productivity Tools](https://github.com/gooddata/gooddata-productivity-tools).
|
|
40
40
|
|
|
41
41
|
## Provisioning
|
|
42
42
|
|
|
@@ -53,23 +53,20 @@ import os
|
|
|
53
53
|
from csv import DictReader
|
|
54
54
|
from pathlib import Path
|
|
55
55
|
|
|
56
|
-
# Import the Entity Provisioner class and
|
|
56
|
+
# Import the Entity Provisioner class and corresponding model from gooddata_pipelines library
|
|
57
57
|
from gooddata_pipelines import UserFullLoad, UserProvisioner
|
|
58
|
+
from gooddata_pipelines.logger.logger import LogObserver
|
|
58
59
|
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
setup_logging()
|
|
60
|
+
# Optionally, subscribe a standard Python logger to the LogObserver
|
|
61
|
+
import logging
|
|
63
62
|
logger = logging.getLogger(__name__)
|
|
63
|
+
LogObserver().subscribe(logger)
|
|
64
64
|
|
|
65
65
|
# Create the Provisioner instance - you can also create the instance from a GDC yaml profile
|
|
66
66
|
provisioner = UserProvisioner(
|
|
67
67
|
host=os.environ["GDC_HOSTNAME"], token=os.environ["GDC_AUTH_TOKEN"]
|
|
68
68
|
)
|
|
69
69
|
|
|
70
|
-
# Optional: subscribe to logs
|
|
71
|
-
provisioner.logger.subscribe(logger)
|
|
72
|
-
|
|
73
70
|
# Load your data from your data source
|
|
74
71
|
source_data_path: Path = Path("path/to/some.csv")
|
|
75
72
|
source_data_reader = DictReader(source_data_path.read_text().splitlines())
|
|
@@ -82,4 +79,4 @@ full_load_data: list[UserFullLoad] = UserFullLoad.from_list_of_dicts(
|
|
|
82
79
|
provisioner.full_load(full_load_data)
|
|
83
80
|
```
|
|
84
81
|
|
|
85
|
-
Ready
|
|
82
|
+
Ready-made scripts covering the basic use cases can be found here in the [GoodData Productivity Tools](https://github.com/gooddata/gooddata-productivity-tools) repository
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# GoodData Pipelines
|
|
2
2
|
|
|
3
|
-
A high
|
|
3
|
+
A high-level library for automating the lifecycle of GoodData Cloud (GDC).
|
|
4
4
|
|
|
5
|
-
You can use the package to manage following
|
|
5
|
+
You can use the package to manage following resources in GDC:
|
|
6
6
|
|
|
7
7
|
1. Provisioning (create, update, delete)
|
|
8
8
|
- User profiles
|
|
@@ -14,7 +14,7 @@ You can use the package to manage following resoursec in GDC:
|
|
|
14
14
|
1. _[PLANNED]:_ Custom fields management
|
|
15
15
|
- extend the Logical Data Model of a child workspace
|
|
16
16
|
|
|
17
|
-
In case you are not interested in incorporating a library in your own program
|
|
17
|
+
In case you are not interested in incorporating a library in your own program but would like to use a ready-made script, consider having a look at [GoodData Productivity Tools](https://github.com/gooddata/gooddata-productivity-tools).
|
|
18
18
|
|
|
19
19
|
## Provisioning
|
|
20
20
|
|
|
@@ -31,23 +31,20 @@ import os
|
|
|
31
31
|
from csv import DictReader
|
|
32
32
|
from pathlib import Path
|
|
33
33
|
|
|
34
|
-
# Import the Entity Provisioner class and
|
|
34
|
+
# Import the Entity Provisioner class and corresponding model from gooddata_pipelines library
|
|
35
35
|
from gooddata_pipelines import UserFullLoad, UserProvisioner
|
|
36
|
+
from gooddata_pipelines.logger.logger import LogObserver
|
|
36
37
|
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
setup_logging()
|
|
38
|
+
# Optionally, subscribe a standard Python logger to the LogObserver
|
|
39
|
+
import logging
|
|
41
40
|
logger = logging.getLogger(__name__)
|
|
41
|
+
LogObserver().subscribe(logger)
|
|
42
42
|
|
|
43
43
|
# Create the Provisioner instance - you can also create the instance from a GDC yaml profile
|
|
44
44
|
provisioner = UserProvisioner(
|
|
45
45
|
host=os.environ["GDC_HOSTNAME"], token=os.environ["GDC_AUTH_TOKEN"]
|
|
46
46
|
)
|
|
47
47
|
|
|
48
|
-
# Optional: subscribe to logs
|
|
49
|
-
provisioner.logger.subscribe(logger)
|
|
50
|
-
|
|
51
48
|
# Load your data from your data source
|
|
52
49
|
source_data_path: Path = Path("path/to/some.csv")
|
|
53
50
|
source_data_reader = DictReader(source_data_path.read_text().splitlines())
|
|
@@ -60,4 +57,4 @@ full_load_data: list[UserFullLoad] = UserFullLoad.from_list_of_dicts(
|
|
|
60
57
|
provisioner.full_load(full_load_data)
|
|
61
58
|
```
|
|
62
59
|
|
|
63
|
-
Ready
|
|
60
|
+
Ready-made scripts covering the basic use cases can be found here in the [GoodData Productivity Tools](https://github.com/gooddata/gooddata-productivity-tools) repository
|
|
@@ -158,25 +158,33 @@ class BackupInputProcessor:
|
|
|
158
158
|
return all_workspaces
|
|
159
159
|
|
|
160
160
|
def get_ids_to_backup(
|
|
161
|
-
self,
|
|
161
|
+
self,
|
|
162
|
+
input_type: InputType,
|
|
163
|
+
path_to_csv: str | None = None,
|
|
164
|
+
workspace_ids: list[str] | None = None,
|
|
162
165
|
) -> list[str]:
|
|
163
166
|
"""Returns the list of workspace IDs to back up based on the input type."""
|
|
164
167
|
|
|
165
168
|
if input_type in (InputType.LIST_OF_WORKSPACES, InputType.HIERARCHY):
|
|
166
|
-
if path_to_csv is None:
|
|
169
|
+
if (path_to_csv is None) == (workspace_ids is None):
|
|
167
170
|
raise ValueError(
|
|
168
|
-
f"Path to CSV
|
|
171
|
+
f"Path to CSV and list of workspace IDs must be specified exclusively for this input type: {input_type.value}"
|
|
169
172
|
)
|
|
170
173
|
|
|
171
174
|
# If we're backing up based on the list, simply read it from the CSV
|
|
175
|
+
list_of_parents = []
|
|
176
|
+
if path_to_csv is not None:
|
|
177
|
+
list_of_parents = self.csv_reader.read_backup_csv(path_to_csv)
|
|
178
|
+
if workspace_ids is not None:
|
|
179
|
+
list_of_parents = workspace_ids
|
|
180
|
+
|
|
172
181
|
if input_type == InputType.LIST_OF_WORKSPACES:
|
|
173
|
-
return
|
|
182
|
+
return list_of_parents
|
|
174
183
|
else:
|
|
175
184
|
# For hierarchy backup, we read the CSV and treat it as a list of
|
|
176
185
|
# parent workspace IDs. Then we retrieve the children of each parent,
|
|
177
186
|
# including their children, and so on. The parent workspaces are
|
|
178
187
|
# also included in the backup.
|
|
179
|
-
list_of_parents = self.csv_reader.read_backup_csv(path_to_csv)
|
|
180
188
|
list_of_children: list[str] = []
|
|
181
189
|
|
|
182
190
|
for parent in list_of_parents:
|
|
@@ -373,29 +373,37 @@ class BackupManager:
|
|
|
373
373
|
|
|
374
374
|
raise
|
|
375
375
|
|
|
376
|
-
def backup_workspaces(
|
|
376
|
+
def backup_workspaces(
|
|
377
|
+
self, path_to_csv: str | None, workspace_ids: list[str] | None
|
|
378
|
+
) -> None:
|
|
377
379
|
"""Runs the backup process for a list of workspace IDs.
|
|
378
380
|
|
|
379
|
-
Will
|
|
380
|
-
|
|
381
|
+
Will take the list of workspace IDs or read the list of
|
|
382
|
+
workspace IDs from a CSV file and create backup for each
|
|
383
|
+
workspace in storage specified in the configuration.
|
|
381
384
|
|
|
382
385
|
Args:
|
|
383
386
|
path_to_csv (str): Path to a CSV file containing a list of workspace IDs.
|
|
387
|
+
workspace_ids (list[str]): List of workspace IDs
|
|
384
388
|
"""
|
|
385
|
-
self.backup(InputType.LIST_OF_WORKSPACES, path_to_csv)
|
|
389
|
+
self.backup(InputType.LIST_OF_WORKSPACES, path_to_csv, workspace_ids)
|
|
386
390
|
|
|
387
|
-
def backup_hierarchies(
|
|
391
|
+
def backup_hierarchies(
|
|
392
|
+
self, path_to_csv: str | None, workspace_ids: list[str] | None
|
|
393
|
+
) -> None:
|
|
388
394
|
"""Runs the backup process for a list of hierarchies.
|
|
389
395
|
|
|
390
|
-
Will
|
|
391
|
-
|
|
396
|
+
Will take the list of workspace IDs or read the list of workspace IDs
|
|
397
|
+
from a CSV file and create backup for each those workspaces' hierarchies
|
|
398
|
+
in storage specified in the configuration.
|
|
392
399
|
Workspace hierarchy means the workspace itself and all its direct and
|
|
393
400
|
indirect children.
|
|
394
401
|
|
|
395
402
|
Args:
|
|
396
403
|
path_to_csv (str): Path to a CSV file containing a list of workspace IDs.
|
|
404
|
+
workspace_ids (list[str]): List of workspace IDs
|
|
397
405
|
"""
|
|
398
|
-
self.backup(InputType.HIERARCHY, path_to_csv)
|
|
406
|
+
self.backup(InputType.HIERARCHY, path_to_csv, workspace_ids)
|
|
399
407
|
|
|
400
408
|
def backup_entire_organization(self) -> None:
|
|
401
409
|
"""Runs the backup process for the entire organization.
|
|
@@ -406,12 +414,17 @@ class BackupManager:
|
|
|
406
414
|
self.backup(InputType.ORGANIZATION)
|
|
407
415
|
|
|
408
416
|
def backup(
|
|
409
|
-
self,
|
|
417
|
+
self,
|
|
418
|
+
input_type: InputType,
|
|
419
|
+
path_to_csv: str | None = None,
|
|
420
|
+
workspace_ids: list[str] | None = None,
|
|
410
421
|
) -> None:
|
|
411
422
|
"""Runs the backup process with selected input type."""
|
|
412
423
|
try:
|
|
413
424
|
workspaces_to_export: list[str] = self.loader.get_ids_to_backup(
|
|
414
|
-
input_type,
|
|
425
|
+
input_type,
|
|
426
|
+
path_to_csv,
|
|
427
|
+
workspace_ids,
|
|
415
428
|
)
|
|
416
429
|
batches = self.split_to_batches(
|
|
417
430
|
workspaces_to_export, self.config.batch_size
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# (C) 2025 GoodData Corporation
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Annotated, TypeAlias
|
|
4
|
+
from typing import Annotated, TypeAlias, Optional
|
|
5
5
|
|
|
6
6
|
import yaml
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
@@ -22,6 +22,9 @@ class S3StorageConfig(BaseModel):
|
|
|
22
22
|
backup_path: str
|
|
23
23
|
bucket: str
|
|
24
24
|
profile: str = "default"
|
|
25
|
+
aws_access_key_id: Optional[str] = None
|
|
26
|
+
aws_secret_access_key: Optional[str] = None
|
|
27
|
+
aws_default_region: Optional[str] = None
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
class LocalStorageConfig(BaseModel):
|
|
@@ -21,8 +21,7 @@ class S3Storage(BackupStorage):
|
|
|
21
21
|
raise ValueError("S3 storage config is required")
|
|
22
22
|
|
|
23
23
|
self._config = conf.storage
|
|
24
|
-
self.
|
|
25
|
-
self._session = self._create_boto_session(self._profile)
|
|
24
|
+
self._session = self._create_boto_session(self._config)
|
|
26
25
|
self._resource = self._session.resource("s3")
|
|
27
26
|
self._bucket = self._resource.Bucket(self._config.bucket) # type: ignore [missing library stubs]
|
|
28
27
|
suffix = "/" if not self._config.backup_path.endswith("/") else ""
|
|
@@ -30,9 +29,25 @@ class S3Storage(BackupStorage):
|
|
|
30
29
|
|
|
31
30
|
self._verify_connection()
|
|
32
31
|
|
|
33
|
-
def _create_boto_session(self,
|
|
32
|
+
def _create_boto_session(self, config: S3StorageConfig) -> boto3.Session:
|
|
33
|
+
if config.aws_access_key_id and config.aws_secret_access_key:
|
|
34
|
+
if not config.aws_default_region:
|
|
35
|
+
self.logger.warning(
|
|
36
|
+
"No AWS region specified. Defaulting to us-east-1."
|
|
37
|
+
)
|
|
38
|
+
try:
|
|
39
|
+
return boto3.Session(
|
|
40
|
+
aws_access_key_id=config.aws_access_key_id,
|
|
41
|
+
aws_secret_access_key=config.aws_secret_access_key,
|
|
42
|
+
region_name=config.aws_default_region,
|
|
43
|
+
)
|
|
44
|
+
except Exception:
|
|
45
|
+
self.logger.warning(
|
|
46
|
+
"Failed to create boto3 session with supplied credentials. Falling back to profile..."
|
|
47
|
+
)
|
|
48
|
+
|
|
34
49
|
try:
|
|
35
|
-
return boto3.Session(profile_name=profile)
|
|
50
|
+
return boto3.Session(profile_name=config.profile)
|
|
36
51
|
except Exception:
|
|
37
52
|
self.logger.warning(
|
|
38
53
|
'AWS profile "[default]" not found. Trying other fallback methods...'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# (C) 2025 GoodData Corporation
|
|
2
2
|
[project]
|
|
3
3
|
name = "gooddata-pipelines"
|
|
4
|
-
version = "1.48.1.
|
|
4
|
+
version = "1.48.1.dev3"
|
|
5
5
|
description = ""
|
|
6
6
|
authors = [{ name = "GoodData", email = "support@gooddata.com" }]
|
|
7
7
|
license = { text = "MIT" }
|
|
@@ -11,7 +11,7 @@ dependencies = [
|
|
|
11
11
|
"pydantic (>=2.11.3,<3.0.0)",
|
|
12
12
|
"requests (>=2.32.3,<3.0.0)",
|
|
13
13
|
"types-requests (>=2.32.0,<3.0.0)",
|
|
14
|
-
"gooddata-sdk~=1.48.1.
|
|
14
|
+
"gooddata-sdk~=1.48.1.dev3",
|
|
15
15
|
"boto3 (>=1.39.3,<2.0.0)",
|
|
16
16
|
"boto3-stubs (>=1.39.3,<2.0.0)",
|
|
17
17
|
"types-pyyaml (>=6.0.12.20250326,<7.0.0)",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/__init__.py
RENAMED
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/_version.py
RENAMED
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/api/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/gooddata_pipelines/py.typed
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/__init__.py
RENAMED
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/backup/test_conf.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/data/mock_responses.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/panther/test_api_wrapper.py
RENAMED
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/panther/test_sdk_wrapper.py
RENAMED
|
File without changes
|
{gooddata_pipelines-1.48.1.dev1 → gooddata_pipelines-1.48.1.dev3}/tests/provisioning/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|