Repository for GoodData Legacy to Cloud migration tools
Recommended Python version: >3.14.2
This migration toolkit facilitates the transition of analytics content from GoodData Legacy to GoodData Cloud.
Throughout the readme and the codebase, the products are referred to as such:
- Legacy refers to GoodData Legacy, the legacy private cloud-based analytics solution
- Cloud refers to GoodData Cloud, the modern cloud-based analytics legacy
What problem does this toolkit solve? This toolkit automates the migration of your analytical content, preserving the relationships between different objects while handling the architectural differences between the two legacys. It can migrate:
- Logical Data Models (LDM) with data source mappings
- Metrics (calculations/measures)
- Insights (visualizations)
- KPI Dashboards
- Pixel Perfect Reports
The migration can be performed as a complete workspace transfer or selectively for specific objects. The toolkit supports various migration patterns including parent/child workspace migrations and incremental updates.
- Python 3.14.2 or newer
- Access to both GoodData Legacy and GoodData Cloud environments
- Admin permissions for both environments
-
Clone this repository
git clone git@github.com:gooddata/gooddata-legacy2cloud.git
-
Install the package
Navigate to the cloned repository in your system and install the package in your environment.
cd gooddata-legacy2cloud pip install .
Create a .env file with your access credentials:
LEGACY_DOMAIN = "https://your-legacy-domain.com/"
LEGACY_LOGIN = "your_username"
LEGACY_PASSWORD = "your_password"
LEGACY_WS = "your_legacy_workspace_id"
CLOUD_DOMAIN = "https://your-cloud-domain.gooddata.com/"
CLOUD_TOKEN = "your_bearer_token"
CLOUD_WS = "your_cloud_workspace_id"
DATA_SOURCE_ID = "your_data_source_id"
SCHEMA = "your_schema"
TABLE_PREFIX = "your_table_prefix"
# Optional parameters
WS_DATA_FILTER_ID = "filter_id"
WS_DATA_FILTER_COLUMN = "filter_column"
WS_DATA_FILTER_DESCRIPTION = "filter_description"
# Notification channel ID is required for scheduled exports migration
CLOUD_NOTIFICATION_CHANNEL_ID=notification_channel_to_use_with_migrated_exports
Where to find these values:
- LEGACY_WS: Navigate to your GoodData Legacy workspace and copy the project ID (PID) from the URL
- CLOUD_TOKEN: Generate a token in GoodData Cloud under User Settings > API Tokens
- DATA_SOURCE_ID: Get this from your Cloud workspace data source settings (create the data source before the migration)
Run these scripts in sequence, verifying results after each step:
-
Migrate the Logical Data Model
gooddata-legacy2cloud ldm- Check in Cloud that your data model has been migrated correctly, check the data mapping if it was migrated
- Review any warnings or errors in the modeller
-
Migrate the color palette
gooddata-legacy2cloud color-palette
-
Migrate Metrics
gooddata-legacy2cloud metricsVerify the metrics in Cloud, especially any with [ERROR] or [WARN] in the title
-
Migrate Insights (Visualizations)
gooddata-legacy2cloud insightsVerify the insights in Cloud, especially any with [ERROR] or [WARN] in the title
-
Migrate Dashboards
gooddata-legacy2cloud dashboardsVerify the dashboards in Cloud
-
Migrate Pixel Perfect Reports
gooddata-legacy2cloud reportsVerify the Visualziations migrated from report in Cloud (by default they will have "[PP]" prefix)
-
Migrate Pixel Perfect Dashboards
gooddata-legacy2cloud pp-dashboards
Verify the migrated Dashboards in Cloud
Migrating all content from one GoodData Legacy workspace to one GoodData Cloud workspace:
- Set up your environment file with source and target workspace IDs
- Run the migration scripts in sequence:
gooddata-legacy2cloud ldm gooddata-legacy2cloud metrics gooddata-legacy2cloud insights gooddata-legacy2cloud dashboards - Verify the migrated content in your Cloud workspace
For organizations with multiple workspaces that share content and want to also migrate the custom objects from client workspaces:
-
Prepare your Cloud environment:
- Create an empty parent workspace in Cloud
- Create a child workspace for each client workspace in Cloud
-
Migrate the parent workspace first:
gooddata-legacy2cloud ldm gooddata-legacy2cloud metrics gooddata-legacy2cloud insights gooddata-legacy2cloud dashboards gooddata-legacy2cloud reports- Note: This migration toolkit does not create workspaces or provision users, user groups, or user permissions (except dashboard permissions). You must create all client workspaces to the Cloud organization separately before running the migration. If you want to migrate also dashboard permissions or scheduled emails, you also need to provision the users/user groups before that.
Important: : If you plan to use Workspace Data Filters to restrict which data each client workspace in Cloud can access, verify that you have the Workspace Data Filters defined and properly mapped for all datasets in LDM of your parent workspace. Documentation
-
Migrate each client workspace with client-specific prefix:
Note: The
--client-prefixparameter automatically:- Reads mappings from default mapping file (belonging to the parent) as well as client-specific mapping file (with defined client-specific prefix)
- Only migrates objects not present in the parent (=not present in the default mapping files)
- Prefixes any mapping or log it creates with the defined client-specific prefix (to prevent overwriting and easy identification)
- Validates that the target workspace is a child workspace (=has parent defined)
- Requires use of --legacy-ws and --parent-ws to prevent accidentally migrating into parent workspace in client mode
# For client 1 gooddata-legacy2cloud metrics --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_ gooddata-legacy2cloud insights --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_ gooddata-legacy2cloud dashboards --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_ gooddata-legacy2cloud reports --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_ # For client 2 gooddata-legacy2cloud metrics --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_ gooddata-legacy2cloud insights --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_ gooddata-legacy2cloud dashboards --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_ gooddata-legacy2cloud reports --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_ # Repeat for each clientWhich would first completely migrate each client workspace (metrics, insights and dashboards) and then continue to the next one. Alternatively You can also first migrate all metrics in all workspaces, then all insights in all workspaces and then all dashboards in all workspaces:
# Migrate all clients metrics
gooddata-legacy2cloud metrics --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
gooddata-legacy2cloud metrics --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
# Repeat for each client
# Migrate all clients insights
gooddata-legacy2cloud insights --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
gooddata-legacy2cloud insights --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
# Repeat for each client
# Migrate all clients dashboards
gooddata-legacy2cloud dashboards --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
gooddata-legacy2cloud dashboards --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
# Repeat for each client
# Migrate all clients reports
gooddata-legacy2cloud reports --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
gooddata-legacy2cloud reports --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
# Repeat for each clientMigrating only new objects added since your last migration:
gooddata-legacy2cloud metrics --without-mapped-objects
gooddata-legacy2cloud insights --without-mapped-objects
gooddata-legacy2cloud dashboards --without-mapped-objects
gooddata-legacy2cloud reports --without-mapped-objects
Note that the migration scripts currently do not support overwriting already existing objects in Cloud. Instead of overwriting, any object with ID already existing in the Cloud workspace is skipped.
These parameters are available in all migration scripts:
--help - Display help information about the script
--env [path_to_env_file] - Specify a custom .env file (default: .env)
--legacy-ws - Source Legacy workspace ID. Overrides LEGACY_WS from the .env file (required for --client-prefix)
--cloud-ws - Target Cloud workspace ID. Overrides CLOUD_WS from the .env file (required for --client-prefix)
--skip-deploy - Skip deployment to Cloud (useful for testing)
--dump-legacy - Dump Legacy objects to a JSON file
--dump-cloud - Dump Cloud objects to a JSON file
--cleanup-target-env - Remove ALL existing objects of that type (i.e. metrics for metrics) in the target environment before migration
--overwrite-existing - Updates existing objects instead of skipping them. Affects also dashboard components like filter contexts and comparison widgets that are created during migration of the dashboard.
--output-files-prefix [prefix] - Add a specified prefix to all output filenames the script generates (mapping files, logs, ...)
--check-parent-workspace - Before starting migration check that the target Cloud workspace has a parent workspace
--client-prefix [prefix] - Special parameter for easy migration of objects in client workspaces - see Custom Client Object Migration
--suppress-migration-warnings - Suppress migration warnings from being added to object titles and descriptions. Warnings will still be printed to console for visibility. This parameter only affects warnings; errors are still added to objects.
These parameters optimize the lookup of attribute element values (filter values) from Legacy during migration. In Legacy normally if an attribute value is used in an object definition (i.e. a filter) it has to be present in the workspce to be able to read and migrate it. Otherwise a manual fix is needed to the migrated object. These parameters allow to overcome this limation by looking up the value in the Legacy workspace Validation that checks reports and metrics for missing values. These are meant to fill-in a few missing values, do not run the migration tool with these on an empty workspace.
--element-values-prefetch - Scans objects for migration for attribute element URIs and batch-fetches their values before processing. This optimization reduces Legacy API calls during migration. Works independently of validation. Does not fix any missing values by itself.
--validation-element-lookup - Uses Legacy's workspace validation endpoint to fetch missing attribute element values. The validation process returns missing element values for used in metrics and reports and they are later used for the migration of missing values.
--validation-element-lookup-with-metrics - Advanced strategy combining values prefetch prefetch with temporary Legacy metric creation for comprehensive element lookup. it creates temporary metrics in the Legacy workspace for any unmapped elements, runs validation to populate cache from these metrics, and finally deletes the temporary metrics. This requires permission to create and delete metrics in the Legacy workspace. Includes prefetch and validation, no need to use the other *-element-* parameters with it.
This parameter is only available for insights and dashboards
gooddata-legacy2cloud ldm
Script generates:
- LDM object mappings to
ldm_mappings.csv
LDM-specific options:
--ignore-folders - Legacy folders for LDM objects are not migrated to Cloud tags. Use if you used only tags for organizing the catalog in Legacy.
--ignore-explicit-mapping - Explicit LDM mapping (Legacy Mapping from Modeler used for ADDv2) is not used even if it exists. Instead the ADS naming convention is used for LDM mapping.
gooddata-legacy2cloud metrics
Script generates:
- Metric mappings to
metric_mappings.csv - MAQL transformation log to
metrics_maql.log - Failed Cloud metrics to
cloud_failed_metrics.json - Skipped objects IDs to
cloud_skipped_metrics.json
Script reads:
- LDM mappings from
ldm_mappings.csv
Notes:
- If any element values are missing within the Legacy metric, they are replaced with
--MISSING VALUE--. Such metrics can be found inmetrics_maql.logfile and these metrics are also marked with [WARN] in their title (unless--suppress-migration-warningsis used). Warnings are always printed to console. - If converted MAQL fails to be saved to Cloud, such metrics are converted to "ERROR metrics". These have [ERROR] in their title, their definition is changed to
SELECT SQRT(-1)(=returns NULL) and their original converted MAQL is left in the comment. These metrics should be manually inspected. - Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless
--overwrite-existingis used). - To prevent missing element values, use
--validation-element-lookup(see Element Lookup Parameters)
Metrics-specific options:
--keep-original-ids - Keep original metric identifiers from Legacy. Otherwise the Cloud ID is derived from metric title and Legacy identfier.
--ignore-folders - Legacy folders of Metrics are not migrated to Cloud tags. Use if you used only tags for organizing the catalog in Legacy.
gooddata-legacy2cloud color-paletteMigrate color palette from Legacy workspace and set it as the default palette at Organization level. This will also remove all other existing color palettes from the organization. Migrating color palettes per workspace is currently not supported.
To see the supported CLI arguments, run
gooddata-legacy2cloud color-palette --helpgooddata-legacy2cloud insightsScript generates:
- Insights mappings to
insight_mappings.csv - Insights transformation log to
insight_logs.log - Failed Cloud insights to
cloud_failed_insights.json - Skipped objects IDs to
cloud_skipped_insights.json
Script reads:
- LDM mappings from
ldm_mappings.csv - Metric mappings from
metric_mappings.csv
Notes:
- If any element values used in Legacy insight filter definition are missing, they are removed and such insight is marked as [WARN] (unless
--suppress-migration-warningsis used). It should be manually inspected. Information about what is missing is added to the insight description. Warnings are always printed to console. - If there are any errors in Cloud insight creation, such insights can be found in
insights_logs.logfile. - The script cannot migrate Geo charts at this time.
- Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless
--overwrite-existingis used). - For best results with element lookup, use
--validation-element-lookup-with-metrics(see Element Lookup Parameters)
gooddata-legacy2cloud dashboardsScript generates:
- Dashboards mappings to
dashboard_mappings.csv - Dashboards transformation log to
dashboards_logs.log - Failed Cloud dashboards to
cloud_failed_dashboards.json - Skipped objects IDs to
cloud_skipped_dashboards.json
Script reads:
- LDM mappings from
ldm_mappings.csv - Metric mappings from
metric_mappings.csv - Insights mappings from
insight_mappings.csv
Notes: This script only migrates the Responsive Dashboards (a.k.a. KPI Dashboards). The tooling currently does not migrate Pixel Perfect Dashboards.
- If any element values used in the Legacy definition of a Dashboards is missing within the Legacy dashboards, they are removed and such dashboard is marked as [WARN] (unless
--suppress-migration-warningsis used) with details in the description for manual inspection. Warnings are always printed to console. - If there are any errors in Cloud dashboard creation, such dashboards can be found in
dashboards_logs.logfile. - All migrated dashboards are first created as empty ones and in the next phase updated to the final structure to make sure all drillToDashboards have existing target. If some target is missing (i.e. because that dashboard is not migrated) such drill is removed and the dashboard is marked as [WARN] (unless
--suppress-migration-warningsis used) and details about removed drills are put into its description. Warnings are always printed to console. - Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless
--overwrite-existingis used). - For best results with element lookup, use
--validation-element-lookup-with-metrics(see Element Lookup Parameters)
gooddata-legacy2cloud pp-dashboardsNotes:
- By default, each Legacy Pixel Perfect dashboard is migrated one-to-one into a single Cloud KPI dashboard that uses native tabs (one Legacy tab -> one Cloud tab).
- Use
--pp-legacy-split-tabsto enable the legacy behavior where each Legacy tab is migrated as a separate Cloud dashboard (intended for transition only).
gooddata-legacy2cloud reportsScript generates:
- Report mappings to
report_mappings.csv - Reports transformation log to
report_logs.log - Failed Cloud reports to
cloud_failed_reports.json - Skipped objects IDs to
cloud_skipped_reports.json
Script reads:
- LDM mappings from
ldm_mappings.csv - Metric mappings from
metric_mappings.csv
Notes:
- This script performs a best-effort migration of Pixel Perfect Reports from Legacy to Cloud.
- Pixel Perfect reports do not exist in Cloud, the script converts them to Cloud visualizations as closely as possible. The visual appearance may differ.
- Some features specific to Pixel Perfect reports (i.e. types of filters) might not be available in Cloud.
- Reports containing features not available in Cloud are marked by adding [WARN] to the migrated visualization name (unless
--suppress-migration-warningsis used). Details are added to the description. Warnings are always printed to console. - To prevent missing element values, use
--validation-element-lookup(see Element Lookup Parameters)
Reports-specific options:
--report-prefix - Prefix added to the visualziations migrated from PixelPerfect reports to distinguish them from those migrated from Insights. Default is '[PP] '. Use empty string to disable the prefix.
gooddata-legacy2cloud scheduled-exportsScript generates:
- Export mappings to
scheduled_export_mappings.csv - Metadata transformations log to
scheduled_exports_logs.log
Script reads:
- Insight mappings from
insight_mappings.csv - Dashboard mappings from
dashboard_mappings.csv
Prerequisities:
-
The LDM, insights and dashboards need to be migrated prior to sheduled exports.
-
Legacy users need to be provisioned in Cloud. The script will match
torecipients based on email. Existence ofbccrecipients is not checked. -
CLOUD_NOTIFICATION_CHANNEL_IDenvironment variable needs to be set.
Notes:
- By default, the script does not migrate such scheduled emails which do not have a recipient or any attachment.
- If Legacy recipient from
tofield does not exist in Cloud, they are skipped. The script will still attempt to create the export. - Legacy recipients from
tofield are mapped to Cloudrecipients, Legacybccemail addresses will be set asexternal_recipientsin Cloud. - Only scheduled emails from Legacy KPI dashboards are migrated. The script does not migrate automations generated on Pixel Perfect reports.
- If a migrated Legacy export uses only dashboard filters, but those filters have values selected, these filter values will be baked into the Cloud automation. This could be adjusted for visual exports (PDF), but Cloud tabular exports (CSV, XLSX) can only be created with persistent filter selections.
Reports-specific options:
--exports-to-migrate - List of specific scheduled exports to migrate. The value should be a path to a csv containing a single column (without header) with Legacy IDs of scheduled exports which should be migrated.
After migrating dashboards from Legacy to Cloud, and provisioning users and user groups to your Cloud Organization (which is not done by this migration toolkit), you can migrate dashboard ownership and permissions to properly attribute ownership and access rights to non-public dashboards to the original users and user groups.
gooddata-legacy2cloud dashboard-permissionsWhat this script does:
- Fetches selected Legacy dashboards based on filter parameters
- Identifies the creator (account that created the dashboard) from Legacy
- Collects sharing information (grantees) from Legacy dashboard permissions
- Maps Legacy users to Cloud users based on either Legacy
emailfield or Legacyloginfield - Maps Legacy user groups to Cloud user groups based on group names
- Updates the Cloud workspace layout to reflect the correct creator and dashboard permissions for matched users and user groups
Script generates:
- Consolidated permissions changes log to
cloud_dashboard_permissions_changes.log(includes creator updates and permission changes) - Optional layout dumps:
cloud_layout_before.jsonandcloud_layout_after.json(with--dump-layout)
Script reads:
- Dashboard mappings from
dashboard_mappings.csv
Prerequisites:
- Dashboards need to be migrated to Cloud before running this script
- Legacy users should be provisioned in Cloud with matching identifiers:
- By default: Legacy
loginfield should match Cloud useremailfield - With
--use-email: Legacyemailfield (notlogin) should match Cloud useremailfield
- By default: Legacy
- Legacy user groups should exist in Cloud with matching names
- Note that while in Legacy the user groups are workspace-specific, in Cloud they are organization-wide
- User account executing the migration needs
org.MANAGEpermissions to update workspace layout via API
Dashboard Permissions-specific options:
--dump-layout - Store the layout JSON locally before and after modifications for debugging purposes
--use-email - Use Legacy email field instead of login field when matching Legacy users to Cloud users. By default, the script uses the login field from Legacy users to match against Cloud user emails. With this parameter it uses email field from Legacy users to match against Cloud user emails.
--skip-creators - Skip migrating creator permissions (only migrate grantees)
--skip-individual-grantees - Skip migrating individual user grantee permissions (only migrate creators and group grantees)
--skip-group-grantees - Skip migrating user group grantee permissions (only migrate creators and individual grantees)
--permission [VIEW|SHARE|EDIT] - Dashboard permission level to assign to grantee users and user groups (default: EDIT). The dashboard creator always receives EDIT permission regardless of this setting. Note that in Legacy there was only a single dashboard permission and ability to edit was determined by user role in the workspace.
--print-user-mappings - Print detailed user mapping information for each Legacy user during the migration process
--keep-existing-permissions - Keep existing Cloud permissions that are not present in the Legacy source. Without this flag the script removes unmanaged permissions during the synchronization step.
--skip-kpi-dashboards - Skip adjusting permissions of KPI dashboards.
--skip-pp-dashboards - Skip adjusting permissions of Pixel Perfect dashboards.
--pp-dashboard-mapping-file - Path to the Pixel Perfect dashboards mapping file.
Example usage:
# Migrate all permissions (creators, users, and groups)
gooddata-legacy2cloud dashboard-permissions
# Only migrate creators, skip all grantees
gooddata-legacy2cloud dashboard-permissions --skip-individual-grantees --skip-group-grantees
# Migrate with VIEW permission for grantees instead of EDIT
gooddata-legacy2cloud dashboard-permissions --permission VIEW
# Update with client prefix
gooddata-legacy2cloud dashboard-permissions --client-prefix client1_ --legacy-ws client1_legacy_ws --cloud-ws client1_cloud_wsImportant notes:
Warning: By default this script synchronizes permissions, meaning it removes any Cloud permissions that do not exist in Legacy (unless they belong to sections skipped with --skip-*). This includes the permission of the account used for the migraiton! Workspace admins can still see all the dashboards. Use --keep-existing-permissions to keep extra Cloud permissions untouched.
- This script modifies the workspace layout directly via the Layout API
- Always test with
--skip-deployfirst to preview changes - The script only logs actual changes made, not items that were already correct
- User mapping is case-sensitive:
- By default: Legacy
loginfield is matched against Cloud useremail - With
--use-email: Legacyemailfield is matched against Cloud useremail
- By default: Legacy
- User group mapping is based on exact name matching between Legacy and Cloud
- The script does not provision users or user groups to the Cloud organization
- The script does not grant users workspace permissions (only dashboard-specific permissions)
- The log file groups changes by dashboard title with one JSON line per change for easy parsing
The migration scripts provide flexible filtering options to control which objects get migrated. All these parameters only apply to metrics, insights and dashboards. (Logical Data Model is always migrated as a complete).
The filtering works as a two-step process. First set of parameters (--only-* parameters) defines which objects are being read from Legacy. Then these can be further filtered down by various properties defined by a second set of parameters (--with_/--without*).
Controls which objects are gathered from Legacy for the migration:
- --only-object-ids - Only migrate specific objects by their numeric IDs (comma-separated)
- --only-identifiers - Only migrate specific objects by their alphanumeric identifiers (comma-separated)
- --only-object-ids-with-dependencies - Same as --only-object-ids, but also includes all their dependent objects
- --only-identifiers-with-dependencies - Same as --only-identifiers, but also includes all their dependent objects
Note that each script will still only migrate one type of objects (e.g. metrics migrates metrics) but you can pass objects of any types to the --only-identifiers-with-dependencies and --only-object-ids-with-dependencies parameters. It will find dependent objects of the proper type to migrate. This is useful if you want to migrate a few dashboards and do not want to explicitly list all their dependent metrics and insights.
Only one of these parameters can be used at a time.
Further filter the downloaded objects based on specific features before migrating them:
- --with-tags - Only migrate downloaded objects with at least one of the specified tags (comma-separated)
- --without-tags - Only migrate downloaded objects that don't have any of the specified tags (comma-separated)
- --with-locked-flag - Only migrate downloaded objects that have locked=1 flag in their metadata
- --without-locked-flag - Only migrate downloaded objects that have locked=0 or no locked flag in their metadata
- --with-creator-profiles - Only migrate downloaded objects created by one of the specified Legacy user profile IDs (comma-separated, without /gdc/account/profile/ prefix)
- --without-creator-profiles - Only migrate downloaded objects NOT created by any of the specified Legacy user profile IDs (comma-separated, without /gdc/account/profile/ prefix)
- --without-mapped-objects - Filter out downloaded objects with Legacy identifiers already present in the corresponding mapping file(s). By default, checks all (default and additional) mapping files. Use --without-mapped-objects default_only to only check the default mapping file.
Multiple --with*/--without* parameters can be used together and are treated with AND operator
Note on Creator Profiles: The Legacy user profile ID can be found in the object's metadata under the author field. It's formatted as /gdc/account/profile/{profile_id}. When using the --with-creator-profiles or --without-creator-profiles parameters, provide only the {profile_id} part (e.g., 0102b54c3859150e0d75e52f1a3d034f).
Mapping files are critical for the migration process:
- Each migration script generates a mapping file of the objects it migrated (e.g., ldm_mappings.csv, metric_mappings.csv)
- These files contain "Legacy ID (identifier)" to "Cloud ID" mappings
- Later scripts use these mappings to establish relationships between migrated objects
- Presence of an identifier in the mapping file (from previous migration runs) can also be used to filter which objects to migrate
- There can be more than one mapping file on the script input - in that case all are used combined
- In case of --client-prefix the default mapping file is meant to have objects from the parent workspace and client-prefixed mapping file is meant to contain client-specific objects.
Cloud supports true inheritance of objects between workspaces, while in Legacy all the objects are local copies. To properly migrate between these two paradigms, you need to decide what is common and should go to the parent and what are client-specific objects and will go to individual client workspaces.
The migration tooling does support this use case directly with a parameter --client-prefix:
--client-prefix [prefix] - This parameter does several things at once:
- Sets the prefix for all output files (same as --output-files-prefix)
- Enables checking the parent workspace (same as --check-parent-workspace)
- Must be used together with --legacy-ws and --cloud-ws parameters
- Looks for both standard and prefixed mapping files (i.e. metric_mappings.csv and client1_metric_mappings.csv) if found, will use both
- Automatically enables filtering by default mapping files (same as --without-mapped-objects default_only)
This combined behavior is ideal for migration of individual client workspaces after the parent/master workspace was migrated. All the objects migrated to the parent workspace are in the default mapping files, while for each client workspace a new prefixed mapping file with objects specific to that workspace is created.
The target Cloud workspace already must be in a workspace hierarchy and have a parent defined.
Note: When using --client-prefix, you must also specify --legacy-ws and --cloud-ws parameters. This is a safety measure to ensure you're migrating between the correct client workspaces, not accidentally using the master workspaces from your .env file.
gooddata-legacy2cloud insights --client-prefix client1_ --legacy-ws client1_ws --cloud-ws client1_cloud_wsThese parameters control which mapping files are used as input for each script and where the output mappings are written.
These parameters override the default mapping files used by the scripts:
| Parameter | Default Value | Read by Scripts | Generated by Script | Description |
|---|---|---|---|---|
| --ldm-mapping-file | ldm_mappings.csv | metrics, insights, dashboards | ldm | Specifies the LDM mapping file(s) to read from. First file is used for output, all for input. Comma-separated list. |
| --metric-mapping-file | metric_mappings.csv | insights, dashboards | metrics | Specifies the metric mapping file(s) to read from and for metrics to write to. First file is used for output, all for input. Comma-separated list. |
| --insight-mapping-file | insight_mappings.csv | dashboards | insights | Specifies the insight mapping file(s) to read from and for insights to write to. First file is used for output, all for input. Comma-separated list. |
| --dashboard-mapping-file | dashboard_mappings.csv | None | dashboards | Specifies the dashboard mapping file(s) for dashboards to write to. First file is used for output, all for input. Comma-separated list. |
When specifying multiple files with comma separation, only the first file is used for writing new mappings, while all files are used for reading existing mappings.
You can specify multiple mapping files in two ways:
- Using comma-separated lists:
gooddata-legacy2cloud insights --metric-mapping-file main_metrics.csv,project1_metrics.csv,project2_metrics.csvThis loads all three mapping files for lookups
- Using --client-prefix:
gooddata-legacy2cloud insights --client-prefix client1_This loads both the default file (e.g., metric_mappings.csv) and the prefixed version (e.g., client1_metric_mappings.csv) if it exists.
The --client-prefix parameter is a handy shortcut that automatically sets --output-files-prefix to the same value and loads both default and prefixed mapping files.
The toolkit includes a web-based comparison tool that visualizes migration results in user-friendly HTML pages, making it easy to review and validate migrated content.
gooddata-legacy2cloud web-compare- Automatically processes all migration log files in a directory
- Detects object types (metrics, insights, dashboards) and client prefixes from log filenames
- Generates a separate HTML page for each log file with detailed migration results
- Provides side-by-side comparison view of objects in Legacy and Cloud
- Organizes prefixed client outputs in separate directories. Shows also objects inherited from the hierarchy
- Includes filtering, sorting, and search capabilities in the web interface
- Works completely offline without requiring a web server
# Process logs in current directory, output to `compare_web` folder
gooddata-legacy2cloud web-compare --env .env
# Specify custom directories
gooddata-legacy2cloud web-compare --log-dir=logs/project1 --output-dir=reviews/project1
# Do not show inherited objects for client workspaces
gooddata-legacy2cloud web-compare --skip-inheritedThe tool creates a structured output directory:
- Main HTML files for unprefixed (parent) workspace in the root output directory
- Subdirectories for each client prefix containing their specific HTML files
- A shared
resourcesdirectory with CSS, JavaScript, and images (shared between parent and all clients)
This structure allows you to easily share the results with clients by copying their specific folder along with the resources directory. In such case the links to parent workspace will be automatically deactivated.
The web interface provides several powerful features:
-
Navigation
- Use the left sidebar to switch between object types and client workspaces
- Click on "BACK TO PARENT" to return from client workspace to parent workspace view
-
Filtering and Searching
- Click the summary cards at the top to filter by migration status
- Use the search box to find specific objects by title or ID
- Sort the table by clicking on any column header
-
Object Comparison
- Click the "Compare" button to open a live side-by-side view of the object in Legacy and Cloud
- Use the divider controls to adjust the split view ratio (the arrow icons maximize one of the views, the = sign splits the view equally).
- Navigate between individual objects with Previous/Next buttons
- Open either object in its full native UI with the "Open in Legacy/Cloud" buttons
- Compare and Legacy and Cloud workspace links require valid GoodData sessions in your browser to work
- Note: For Pixel Perfect Reports, the comparison is currently not avialable for inherited objects
-
Status Indicators
- Color-coded status icons show the migration outcome for each object
- Hover over status icons for detailed information
- Click the info (ℹ️) icon to view detailed error messages, warnings or object descriptions.
Usage: gooddata-legacy2cloud web-compare [options]
Options:
| Option | Description |
|---|---|
| --env ENV_FILE | Environment file to use for fallback workspace IDs |
| --log-dir LOG_DIR | Path to directory with migration log files (default: current directory) |
| --output-dir DIR | Directory to write HTML output to (default: compare_web) |
| --skip-inherited | Do not include objects inherited from parent workspace into client pages |
- The output HTML pages work completely offline and can be viewed locally in a modern browser
- In case of browser with restrictions on local file access (like Safari), you can overcome it by running a simple local web server i.e. in Python:
python3 -m http.server 8000
Then open: http://localhost:8000/dashboards_web_compare.html
There are standalone tools that can support the migration process, even though they do not migrate any objects directly. Have a look at the tools/README to find out more