Sheila Loekito
01/20/2023, 3:30 PMDaniela Salmeron
01/24/2023, 5:20 PMSheila Loekito
01/25/2023, 4:35 PMJan Soubusta
01/26/2023, 2:07 PMJan Soubusta
01/26/2023, 2:19 PMGOODDATA_LAYOUTS_DIR = Path("gooddata_layouts")
GD_HOST = os.getenv("GOODDATA_HOST", "<http://localhost:3000>")
GD_TOKEN = os.getenv("GOODDATA_TOKEN", "YWRtaW46Ym9vdHN0cmFwOmFkbWluMTIz")
WORKSPACE_ID = "cicd_demo_development"
DS_MAPPING = {"cicd_staging": "cicd_dev"}
# Change data source mapped to LDM
sdk = GoodDataSdk.create(host_=GD_HOST, token_=GD_TOKEN)
ldm = sdk.catalog_workspace_content.get_declarative_ldm(WORKSPACE_ID)
ldm.modify_mapped_data_source(DS_MAPPING)
sdk.catalog_workspace_content.put_declarative_ldm(WORKSPACE_ID, ldm)
Jan Soubusta
01/26/2023, 2:19 PM# When migrating from/to Snowflake, the case of DB object names can be changed
# Snowflake default is upper-case, while it is lower-case in all other databases we support
# Alternatively, you can force lower-case in Snowflake by enclosing all object names in DDL statements
# GoodData LDM is mapped to PDM tables/columns, which case can be changed
# This script updates case of all relevant objects
FORCE_UPPER = True
FORCE_LOWER = False
def change_case(object_name: str) -> str:
if object_name:
if FORCE_LOWER:
return object_name.lower()
else:
return object_name.upper()
if FORCE_LOWER or FORCE_UPPER:
ldm = sdk.catalog_workspace_content.get_declarative_ldm(WORKSPACE_ID)
for dataset in ldm.ldm.datasets:
dataset.data_source_table_id.id = change_case(dataset.data_source_table_id.id)
for attribute in dataset.attributes:
attribute.source_column = change_case(attribute.source_column)
attribute.sort_column = change_case(attribute.sort_column)
for label in attribute.labels:
label.source_column = change_case(label.source_column)
for fact in dataset.facts:
fact.source_column = change_case(fact.source_column)
for reference in dataset.references:
new_columns = []
for reference_column in reference.source_columns:
new_columns.append(change_case(reference_column))
reference.source_columns = new_columns
sdk.catalog_workspace_content.put_declarative_ldm(WORKSPACE_ID, ldm)
Jan Soubusta
01/26/2023, 2:20 PMJan Soubusta
01/31/2023, 9:14 AMdata_source_mapping = { "MyPostgres": "MySnowflake" }
sdk.catalog_workspace.clone_workspace("source_workspace_id", data_source_mapping=data_source_mapping, upper_case=True)
# If you want to set custom target workspace ID/name:
sdk.catalog_workspace.clone_workspace("source_workspace_id", "target_workspace_id", "target_workspace_name", data_source_mapping=data_source_mapping, upper_case=True)
# If you want to rewrite the target (already existing) workspace:
sdk.catalog_workspace.clone_workspace("source_workspace_id", "target_workspace_id", "target_workspace_name", data_source_mapping=data_source_mapping, upper_case=True, overwrite_existing=True)
Currently, you can utllize it if you install the Python SDK from the Github repository (master branch).
It should be released to PyPi circa in the beginning of March.