# tableau Api Tableau Migration SDK (migration_sdk) - Full Documentation # About Tableau Help 🕐 _1 min read_ ## Addressing Implicit Bias in Technical Language In an effort to align with one of our core company values, equality, we have changed terminology to be more inclusive where possible. Because changing terms in code can break current implementations, we maintain the current terminology in the following places: - Tableau APIs: methods, parameters, and variables - Tableau CLIs: commands and options - Installers, installation directories, and terms in configuration files - Tableau Resource Monitoring Tool (we plan to make changes to non-inclusive terminology in the web interface, error messages, and related documentation soon.) - Third-party systems documentation For more information about our ongoing effort to address implicit bias, see [Salesforce Updates Technical Language in Ongoing Effort to Address Implicit Bias](https://www.salesforce.com/news/stories/salesforce-updates-technical-language-in-ongoing-effort-to-address-implicit-bias) on the Salesforce website. # Architecture 🕐 _2 min read_ The Migration SDK is designed as a local application that primarily downloads content from Tableau Server to a local machine and then publishes it to Tableau Server. The Migration SDK exclusively uses the [Tableau REST API](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm) to migrate content. graph LR A <--> B C <--> B B <--> D subgraph Tableau Server A\[APIs\] end subgraph User Application B\[Migration SDK\] end subgraph Tableau Cloud C\[APIs\] end D\[(Temporary storage)\] ## API Throttling Tableau Cloud has published [Site Capacity limits](https://help.tableau.com/current/online/en-us/to_site_capacity.htm) to ensure all customers have a consistent performance experience. This includes limits on how many API calls a user can make on a specific Tableau Cloud Site within an hour. The Migration SDK is limited by Tableau’s throttling limits for REST API operations. Tableau Cloud limits REST API usage to 40,000 calls per user per site per hour. Additionally, select REST API calls have lower limits detailed in [Tableau Cloud Site Capacity](https://help.tableau.com/current/online/en-us/to_site_capacity.htm). If a throttling limit is hit, API operations will be paused until the next hour. Because of this, you might notice delays in the migration progress. This is normal and expected. ## Security The Migration SDK relies on HTTPS to secure data in transit. Tableau Cloud API connections require HTTPS, and we recommend configuring HTTPS to connect to Tableau Server when available. The Migration SDK encrypts downloaded files by default to secure data at rest. The Migration SDK requires a personal access tokens (PAT) to authenticate the user running the migration with Tableau APIs. These tokens must be created on both Tableau Server and Tableau Cloud. For more information, see [Personal Access Tokens](https://help.tableau.com/current/online/en-us/security_personal_access_tokens.htm) in the Tableau Help Documentation. The Migration SDK does not persist PATs. We recommend that you securely store your tokens. # Best Practices 🕐 _2 min read_ Before your migration to Tableau Cloud, we recommend that you follow the steps in this topic to ensure best practices in both the migration itself and in using Tableau Cloud long term. - Use the [Tableau Cloud Migration Technical Readiness Assessment Accelerator](https://exchange.tableau.com/products/921) to determine if you’re a good fit for a Cloud migration. - [Remove Stale Content](https://help.tableau.com/current/server/en-us/adminview-stale-content.htm) (delete if older than N days w/o access) before migration. - Centralize on [Published Data Sources](https://help.tableau.com/current/pro/desktop/en-us/publish_datasources_about.htm). - Set Permissions at the Group and Project level and [lock Project Permissions](https://help.tableau.com/current/server/en-us/permissions_projects.htm) - Move local files to a Cloud-accessible location to avoid using Bridge resources for local files. - Extract all .csv/.excel files. Tableau Cloud doesn’t support live connections to local files. Bridge is required to connect to those local files. - Review and understand your environment using [Admin Insights](https://help.tableau.com/current/online/en-us/adminview_insights.htm). - Review Tableau cloud storage limitations. Certain Tableau content types have storage capacity limitations on Tableau Cloud. For more information about these limitations, see [Tableau Cloud Site Capacity](https://help.tableau.com/current/online/en-us/to_site_capacity.htm). - Allocate enough free space for a successful migration. Encrypted extracts require three times their size on Tableau Server for encryption and decryption processes. # Complete Post-Migration Tasks 🕐 _7 min read_ After a successful run of the Migration SDK, there are other tasks you must perform before you onboard your users. This topic lists these tasks. ## Step 1: Validate migrated content After your migration, there are five areas of validation to consider. You might not choose to invest in all five of these areas if your migration process can be manually validated quickly, or if you were covered in a proof-of-concept before migration. If you decide these areas are important for your organization, we have provided recommended processes to streamline those efforts. ### Did the right content migrate? - **Content validation for an individual migration run**: With the Migration SDK’s Manifest, you receive a full readout of the items migrated to Tableau Cloud in the latest migration. Review the assets listed in this file to confirm if the intended items were migrated. [Learn more about the Manifest](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.Engine.Manifest.html). - **Content validation across multiple runs**: If you would prefer to review all items on Tableau Cloud, you can use the Site Content data source in [Admin Insights](https://help.tableau.com/current/online/en-us/adminview_insights.htm). This data source allows you to build a custom workbook that shows all content on your Site. We’ve provided the following sample view. Note that Admin Insights data sources update daily or weekly depending on your Settings configurations. You’ll need to wait until the data updates to get the most up-to-date view on your Site Content. **Note**: Admin Insights data sources update daily or weekly depending on your Settings configurations. You must wait until the data updates to get the most up-to-date data on Viz Load Times. ![Sample view of Admin Insights Site Content data source](/tableau/next/en-us/api/migration_sdk/en-us/assets/migration-sdk-post-migration01.png) ### Is the content in the right place? - **Validating the location of an individual content item**: The easiest way to verify the location of an individual content item is to review the item path in the UI. Using the Quick Search bar or manual navigation, go to a content item. After you have navigated to a content item, you will see the navigation path displayed above the name of the item like the following example. ![Sample navigation path of a content item](/tableau/next/en-us/api/migration_sdk/en-us/assets/migration-sdk-post-migration02.png) In this case, the “Executive Overview Workbook” item is in the “Sales Leadership” Project, which is in the “Sales-Production” Project. - **Validating the location of multiple content items**: For a holistic understanding of where content is located across your Tableau Cloud Site, see [Content validation across multiple runs](#multiple-runs). ### Does the content have the right permissions? In many migrations there are changes to things like User Roles, Groups, and content location. All of these have an impact on Effective Permissions. Though it’s unlikely you will have the exact same Permission structure on Tableau Cloud that you had on Tableau Server, you can still verify Permissions in two ways. - **Validating an individual content item**: The simplest way to validate individual asset permissions is to navigate to the relevant content item in the UI. Select the ellipsis next to an asset’s name, then select **Permissions**. You can see a detailed view of the effective permissions on an item. From here you can drill down to single Users or Groups, see what Permissions have been applied and make any desired changes. ![Sample permission details for an asset](/tableau/next/en-us/api/migration_sdk/en-us/assets/migration-sdk-post-migration03.png) - **Validating permissions on multiple content items or validating all permissions that a User or Group has**: To get an aggregate view on effective permissions, use the **Permissions** data source in [Admin Insights](https://help.tableau.com/current/online/en-us/adminview_insights.htm). Use this data source to build out a custom workbook that helps you validate effective permissions in the way that is most relevant to your migration. The following is an example view that could be built out with this data to assess effective permissions. ![Sample view showing effective permissions data](/tableau/next/en-us/api/migration_sdk/en-us/assets/migration-sdk-post-migration04.png) **Note**: Admin Insights data sources update daily or weekly depending on your Settings configurations. You must wait until the data updates to get the most up-to-date data on Viz Load Times. You must wait until the data updates to get the most up-to-date view on your permissions. You will also not be able to make changes to permissions from this data source. To make a permissions change, navigate to the content item and make the change there. ### Is the data within the dashboard the same? Tableau Cloud does not support automated data validation testing in order to manage load on the multi-tenant environment. To confirm assets are working as intended, we recommend that you review a sample set of assets manually to validate content has migrated as expected. The following is the recommended approach to do so. 1. Open a view on Tableau Cloud. 2. Open the same view on Tableau Server. 3. Compare the values manually across the two views. If a view relies on a data source with Row Level Security, you must add that Row Level Security to the data source on Tableau Cloud for the data to match. See the [End-User Migration Checklist](https://help.tableau.com/current/guides/migration/en-us/cloud_migration_part7.htm) for more detail. Partners like [Wiiisdom](https://wiiisdom.com/wiiisdom-ops/tableau/) have also developed solutions that assist in data validation. For a full list of experienced migration partners, see [Experienced Tableau Cloud Migration Partners](https://www.tableau.com/solutions/tableau-migration#partners). ### Are my dashboards performing well? Tableau Cloud does not support automated performance validation testing in order to manage load on the multi-tenant environment. To understand performance benchmarks, you can use the Viz Load Times data source in [Admin Insights](https://help.tableau.com/current/online/en-us/adminview_insights.htm). Use this data source to build a custom workbook so that you can understand metrics for the content on your Tableau Cloud site. These metrics could be Average Load Time, Medium Load Time, and P95 Load Time. **Note**: Admin Insights data sources update daily or weekly depending on your Settings configurations. You must wait until the data updates to get the most up-to-date data on Viz Load Times. ## Step 2: Recreate or manually migrate all items that aren’t programmatically migrated to Tableau Cloud. Credentials embedded in a data source connection, content stored in Personal Spaces, Favorites, and User settings must be migrated by end users after they’re onboarded. For more information, see [Data not supported by the Migration SDK](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/planning.html#data-not-supported-by-the-migration-sdk). ## Step 3: Onboard end users If you choose to supply adjusted usernames to Tableau Cloud to avoid the site invite email notification, adjust usernames back to the correct email address at this point. Refer to the steps in the [End-User Migration Checklist](https://help.tableau.com/current/guides/migration/en-us/cloud_migration_part7.htm) to help your users migrate any remaining items. # Concepts 🕐 _2 min read_ This topic details the terms and concepts you must understand before you plan your migration from Tableau Server to Tableau Cloud. ## Content Types Content types are the various types of content that reside on Tableau Server or Tableau Cloud. For details about which content types the Migration SDK supports, see [Supported Content Types](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/supported_content_types.html). For unsupported content types, see [Data not supported by the Migration SDK](/v0.0/api/migration_sdk/en-us/docs/planning.html#data-not-supported-by-the-migration-sdk). ## Migration Plan A migration plan describes how a migration should be done and what customizations must be done inflight. See [IMigrationPlan](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.IMigrationPlan.html) in the API Reference documentation for a list of properties and their descriptions. ## Migration Plan Builder This is the best way to build a migration plan. Calling the `Build()` method on the `IMigrationPlanBuilder` gives you a MigrationPlan. For more information, see [IMigrationPlanBuilder](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.IMigrationPlanBuilder.html) in the API Reference documentation for details. ## Migration Result This is the result generated after the migration has finished. It has two properties: - Migration Status: This is simply the status of the migration. See [MigrationCompletionStatus](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.MigrationCompletionStatus.html) enumeration in the API Reference documentation for various status items supported. - Migration Manifest: The migration manifest describes the various Tableau data items found to migrate and their migration results. See [IMigrationManifest](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.IMigrationManifest.html) in the API Reference documentation for details. ## Configuration Configuration can be done using the `MigrationSdkOptions`. For information about configuration items and their defaults, see [MigrationSdkOptions](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.Config.MigrationSdkOptions.html) in the API Reference documentation. # Design Your Migration Application 🕐 _1 min read_ The [Tableau Migration Software Development Kit (SDK)](https://github.com/tableau/tableau-migration-sdk) has a wide range of applications, but executes the migration in a multi-threaded manner within a single process. For best results, your migration application should be designed to perform long-running tasks. The Migration SDK relies on the migration application to supply configuration and input to the migration engine, and to handle the results of the migration. Migration applications are responsible for persisting and loading configuration files, migration plan input, and migration results when desired. # Download Custom View 🕐 _4 min read_ Downloads a custom view(associated linked custom views) in `.json` format. **Security note**: Content in .json files downloaded using this method is stored in plain text. All data, including filter values that might give semantic clues to the data, is readable by anyone who opens the files. ## URI ``` GET /api/*api-version*/sites/*site-id*/customviews/*customview-id*/content ``` ## Parameter values | Parameter | Description | | --- | --- | | api-version | The version of the API to use, such as `3.18`. For more information, see [REST API and Resource Versions](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_versions.htm). The supported version for this API is `exp` | | _site-id_ | The ID of the site that contains the custom view. | | customview-id | The ID of the custom view to download. | ## Request Body None ## Permissions Tableau Server users who are server administrators or site admins can download a custom view. ## Response Code 200 ## Response Body The custom view’s content along with some metadata required for import in `.json` format (`Content-Type: application/octet-stream`) The response has the following content disposition header: `Content-Disposition: name="tableau_customview"; filename="`_`customview-filename`_`"` ## Version 3.21 ## Errors | HTTP status | Error Code | Condition | Details | | --- | --- | --- | --- | | 403 | 403163 | Download forbidden | Non-admin user or admin user without the ExportXml permissions attempted to download the custom view. | | 404 | 404000 | Site not found | The site ID in the URI doesn’t correspond to an existing site. | | 404 | 404048 | Custom view not found | The custom view ID in the URI doesn’t correspond to an existing custom view. | | 405 | 405000 | Invalid request method | The request type wasn’t **GET**. | For more information, see [Handling Errors](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_errors.htm). ## Example ``` curl "http://MY-SERVER/api/3.21/sites/ \ 9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d/customviews/ \ 1a1b1c1d-2e2f-2a2b-3c3d-3e3f4a4b4c4d/content" \ -X GET -H "X-Tableau-Auth:12ab34cd56ef78ab90cd12ef34ab56cd" \ > c:\files\my-customview.twbx ``` The response is a file that contains the custom view. # Install the Migration SDK 🕐 _2 min read_ ## Software requirements The Migration SDK is available for Python and .NET, each supporting Linux, Mac, and Windows. Depending on the language, installations might differ. - Python: 3.10 or later - [.NET Runtime](https://dotnet.microsoft.com/en-us/download): 8.0 or later ## Hardware requirements The Migration SDK downloads copies of content items onto the machine that the Migration SDK is installed on. Make sure there’s enough disk space on the machine to sequentially download content during the migration process. ## Installation instructions ### Python To use the Migration SDK for Python, download the [Python package](https://pypi.org/project/tableau-migration/). For information about installing Python packages, see [Installing Packages](https://packaging.python.org/en/latest/tutorials/installing-packages/) in the Python documentation. ### .NET To use the Migration SDK for .NET, download the [.NET NuGet package](https://www.nuget.org/packages/Tableau.Migration). You can import the `.nupkg` file locally into a .NET project and referenced in your code. # Migration Tasks Perform the following tasks in the order presented. ## Step 1: Configure your server and cloud URLs ## Step 2: Migrate users ## Step 3: Migrate groups ## Step 4: Migrate projects # Plan Your Migration 🕐 _7 min read_ ## Migration Strategy **Note**: Before you create your strategy, we recommend that you review the [Tableau Cloud Migration Readiness Assessment](https://exchange.tableau.com/products/921). This assessment helps you understand your technical readiness for a migration to Tableau Cloud. We strongly recommend that you commit to a migration plan with stated goals. ### Establish your migration goals We recommend that you establish concrete goals for your migration. If your goals aren’t established before the migration, you can’t know if the migration is a success. The following examples are provided to simplify the process using [SMART goals](https://en.wikipedia.org/wiki/SMART_criteria). - Deprecate Tableau Server within N weeks. - Reduce Tableau’s total cost of ownership by X by migrating to Tableau Cloud within N weeks - Migrate N% of Tableau Server content and verify it’s functional on Tableau Cloud within Y weeks. ### Choose a migration strategy Read through the [Ownership Strategy](#ownership-strategy) and [Migration Rollout Strategy](#migration-rollout-strategy) in this topic to determine which of the following strategies you will use to migrate to Tableau Cloud. Before your migration, you must have stakeholder commitment on the strategy. Without this commitment, your migration will suffer the problems of scope creep and extended timelines. Select your preferred combination of Ownership and Rollout Strategies:
Ownership Strategy
Centralized Organizational Segmentation Site-by-Site
Migration Rollout Strategy All at Once
Phased
### Ownership Strategy There are three strategies for determining who fills each of the required [roles](#kix.85u849xuilfm) during a Tableau Server to Tableau Cloud migration. Before migrating to Tableau Cloud, make sure you’re aligned on your desired ownership structure, especially if multiple teams are involved. 1. **Centralized ownership**: A single person or team is responsible for the migration 2. **Organizational segmentation**: Distributed responsibilities by business unit or team 3. **Site-by-site**: Distributed responsibilities by existing Tableau Server Site structure | **Strategy** | **Pros** | **Cons** | | --- | --- | --- | | Centralized ownership | Simplest, least coordination, managed centrally | Distribution of effort can be challenging at scale | | Organizational segmentation | Roles and responsibilities are distributed across business units. Greatest opportunity for content optimization | Requires the most coordination, subject to internal org restructures | | Site-by-site | Role clarity driven by content structure, can use site admins to drive migration and testing efforts | Cross-organizational collaboration must be agreed to early. Unclear or shifting priorities can cause disruption. | #### Centralized ownership This strategy is normally employed by customers with a single site and fewer than 500 Users. Not every organization that fits those qualifications use Centralized structures, but it becomes less common as Tableau Server deployments grow due to matrixed ownership of content. We recommend this strategy as the simplest strategy, if your migration lead is able to individually connect with essential leaders across the entirety of the Tableau Server deployment to conduct a migration to Tableau Cloud. #### Organizational segmentation This strategy is normally employed by customers with more than one site and more than 500 Users. It relies on existing organizational structures to distribute roles and responsibilities. For example, an organization with three different business units participating in a migration might choose to each have duplicate roles in a migration if each business conducts their migration at different times. We recommend this strategy if ownership of content is highly matrixed and different business units will be migrating in slightly different ways. #### Site-by-site This strategy is generally employed by customers with more than one site and more than 500 Users. Using this model, you distribute responsibilities to personnel in every site so that they can migrate to Tableau Cloud when it makes sense for that Tableau Server site to migrate. This model allows you to use the existing content governance structure in Tableau Server to distribute roles and responsibilities. We recommend this strategy if you have highly matrixed ownership of content and different sites will be migrating in slightly different ways. ### Migration rollout strategy There are generally three rollout strategies for conducting a migration. 1. **All at once**: The entirety of Tableau Server content is migrated in a single sprint. 2. **Phased**: Subsections of content are migrated across multiple sprints or teams based on business unit, or Server Site structure. #### All at once This strategy is often chosen for customers with fewer than 500 Users. It’s clearly the simplest model, but is harder to manage if there are multiple teams across varied business units who are each responsible for subsections of the migration. These groups can still use this strategy as long as they commit to roles, timelines, and strong communication early in the migration. #### Phased This strategy is often chosen by customers with more than 500 Users who for one reason or another can’t migrate all of their content in a single sprint. Factors that could impact this include varied stakeholders with different goals, timelines, or data strategy. ## Roles and responsibilities The following are the common roles and responsibilities that should be agreed upon before your migration. Based on the size of the migration and the strategy employed, you might find that a role isn’t required, that a role requires multiple people or that a single person spans multiple roles. Before you begin migrating, make sure you have individuals assigned to each of the below roles. | Role | Definition | Owner | | --- | --- | --- | | Executive Sponsor | Responsible for the outcome of the migration and ensuring each role is properly staffed. |   | | Project Manager | Responsible for timelines, coordination, and delegation of ownership |   | | Technical Lead | Technical lead for using the Migration SDK |   | | Readiness Assessment | Responsible for ensuring all content is fit for use in Tableau Cloud |   | | Tableau Cloud Site Admin | Responsible for administration of the Tableau Cloud deployment during and post-migration. There could be more than one site admin. However, we recommend having one person ultimately responsible during the duration of a migration. |   | | Testing Lead | Responsible for ensuring content is tested on Tableau Cloud before the go-live date. |   | | Tableau Cloud Project Leaders | Primarily an informed role, although often provide feedback on migration progress on subsections of content. This role most commonly has more than one person listed as an owner. But it's helpful to identify these people ahead of time so that they understand their accountability to the content in their Project(s). |   | ## Data not supported by the Migration SDK You must manually migrate these items: - Ask Data Lenses (Retired in Tableau Cloud February 2024 / Server 2024.2) - Collections - Comments - Data policies (Data Management) - Data quality warnings - Data roles (Data Management) - Data-driven alerts - Embedded solutions - Extensions - Metrics (Retired in Tableau Cloud February 2024 / Server 2024.2) - Personal spaces (all content needs to be published publicly to be migrated) - Prep flows (Data Management) - Revisions - Server or site customizations - URL actions (Workbook or Data Source transformation required) - Usage and engagement data - User filters (Workbook or Data Source transformation required) - User settings - Virtual connections (Data Management) The Tableau Catalog isn’t migrated by the Migration SDK. However, after content is in Tableau Cloud, it’s indexed by Tableau Catalog and is usually available within 48 hours of an asset migration. For data supported by the Migration SDK, see [Content types](/v0.0/api/migration_sdk/en-us/docs/concepts_and_terms.html#content-types). # Pre-Migration Checklist 🕐 _5 min read_ **Important**: Before starting this topic, review the [Plan Your Migration](/v0.0/api/migration_sdk/en-us/docs/planning.html) topic to make sure that you have a complete migration plan. After you have a complete migration plan, use this topic to migrate from Tableau Server to Tableau Cloud. The [Tableau Migration Software Development Kit (SDK)](https://github.com/tableau/tableau-migration-sdk) requires that you have a licensed Tableau Cloud environment that is properly licensed and configured. To migrate smoothly, complete the tasks in this topic before you use the Migration SDK. ## Step 1: Upgrade your Tableau Server Upgrade your existing installation of Tableau Server to the latest version. For more information, see the [upgrade instructions for Windows](https://help.tableau.com/current/server/en-us/upgrade.htm) or the [upgrade instructions for Linux](https://help.tableau.com/current/server-linux/en-us/upgrade.htm). ## Step 2: Create a Tableau Cloud site The Migration SDK is compatible with both a licensed and trial Tableau Cloud Site. However, work with your account team to create a site that meets your user, content, and license type requirements. **Note**: This step might require licensing a Tableau Cloud environment. Work with your account team to ensure you retain access to both Tableau Server and Tableau Cloud during the migration process. ## Step 3: Configure all required Tableau Cloud site settings For more information, see [Customize the Site and Content Settings](https://help.tableau.com/current/online/en-us/to_customize_site_and_content.htm) ## Step 4: Configure Tableau Cloud user authentication By default, Tableau Cloud sends a Site Invite Notification email to all users when they’re added to a site. If you want to disable that automated notification, disable the **Site Invite Notification** in **Settings** under the General tab. For more information, see [Authentication](https://help.tableau.com/current/online/en-us/security_auth.htm). ## Step: 5: Set the correct time zone The Migration SDK doesn’t consider the time zone setting. You must set the correct time zone on the destination site. ## Step 6: Configure Tableau Server to allow embedded credential migration Use the following steps to allow embedded credential migration from Tableau Server to Tableau Cloud. ### In Tableau Cloud: 1. Sign in to Tableau Cloud as a site administrator. 2. Select **Settings > General**, and scroll down to **Manage Content Migration**. ![Manage Content Migration area in General Settings](/tableau/next/en-us/api/migration_sdk/en-us/assets/sdk-plan-manage-content-migration.png "Manage Content Migration area in General Settings") 3. Click **Create new key** to generate an encryption key pair. **Note**: The public key is only displayed once. If you lose the key before completing the configuration, you must generate a new key. 4. In the resulting window, click **Copy to clipboard** and then close the window. 5. Paste the public key to a file and store it in a safe location. The TSM administrator will use the public key to allow migration. You can view the public key expiration date on the **Settings** page. ### In the TSM CLI: 1. Open a Windows Command Prompt with an account that is a member of the Administrators group on a node in the cluster. 2. Use `tsm security authorize-credential-migration` to allow embedded credential migration to the Tableau Cloud site. For more information, see [tsm security](https://help.tableau.com/current/server/en-us/cli_security_tsm.htm). ``` tsm security authorize-credential-migration --source-site-url-namespace --destination-site-url-namespace --destination-server-url --authorized-migration-runner --destination-public-encryption-key ``` **Note**: When running TSM commands from a remote node, use `tsm login` to authenticate a session with the Tableau Server Administration Controller service before running `tsm security authorize-credential-migration`. ## Step 7: Configure database connectivity Some Cloud-accessible databases require you to [authorize access to cloud data published to Tableau Cloud](https://help.tableau.com/current/pro/desktop/en-us/publish_tableau_online_ip_authorization.htm). If Tableau Bridge is required: 1. [Install and configure Tableau Bridge](https://help.tableau.com/current/online/en-us/qs_refresh_local_data.htm) 2. [Configure Tableau Bridge client pools](https://help.tableau.com/current/online/en-us/to_enable_bridge_live_connections.htm) **Important**: Configure your own Bridge Pool. The Default Bridge Pool doesn’t support some aspects of the Migration SDK. For more information about Tableau Bridge, see [Plan Your Bridge Deployment](https://help.tableau.com/current/online/en-us/to_bridge_scale.htm) ## Step 8: Configure OAuth clients For OAuth credentials to function, you must configure the destination site with any OAuth clients used on the source site. For more information, see [OAuth Connections](https://help.tableau.com/current/online/en-us/protected_auth.htm). ## Step 9: (Optional) Automate user provisioning and group synchronization By default the Migration SDK migrates your groups exactly as they exist on Tableau Server. However it will not continue to sync your groups. If you want to create new groups during the migration, we recommend taking this step now, and opting to not migrate Groups using the Migration SDK. For more information, see [Automate User Provisioning and Group Synchronization](https://help.tableau.com/current/online/en-us/scim_config_online.htm). # Publish Custom View 🕐 _4 min read_ Publishes or imports a custom view associated with a workbook on the specified site. To change a published or imported custom view, call [Update Custom View](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#update_custom_view). This method is used in two ways. You can call it to publish a custom view in a single request. To do that, you include the content of the custom view file in the body of the request. The maximum size of a file that can be published in a single request is 64 MB. Alternatively, you can publish a custom view in multiple parts. To do that: 1. Initiate a file upload by calling [**Initiate File Upload**](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_publishing.htm#initiate_file_upload). 2. Send portions of the file to the server using [**Append to File Upload**](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_publishing.htm#append_to_file_upload). 3. Commit the upload by calling **Publish Custom View**. In this case, Publish Custom View doesn’t contain the file to publish. ## URI `POST /api/`_`api-version`_`/sites/`_`site-id`_`/customviews` `POST /api/`_`api-version`_`/sites/`_`site-id`_`/customviews?uploadSessionId=`_`upload-session-id`_ ## Parameter Values | Parameter | Description | | --- | --- | | _api-version_ | The version of the API to use, such as `3.18`. For more information, see [REST API and Resource Versions](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_versions.htm). | | _site-id_ | The ID of the site to publish to. | | _upload-session-id_ | If you’re calling this method to commit a file that was uploaded in parts, this value contains the upload session ID that was generated by a call to [Initiate File Upload](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_publishing.htm#initiate_file_upload). If this value isn’t included, the server assumes that the body of the request contains the file to be published. | ## Request Body The content type in the header of requests to publish a workbook must use the mixed multipart content type with a boundary string definition, in the form of: `Content-Type: multipart/mixed; boundary=`_`boundary-string`_. ### Publishing a file in the request body ``` --*boundary**-**string* Content-Disposition: name="request_payload" Content-Type: text/xml --*boundary**-**string* Content-Disposition: name="tableau_customview"; filename="*customview**-file-name*" Content-Type: application/octet-stream *content**-**of**-customview**-**file* --*boundary**-**string*-- ``` ### Committing a file previously uploaded ``` *--boundary-string* Content-Disposition: name="request_payload" Content-Type: text/xml *--boundary-string* ``` ## Attribute Values | Attribute | Value | | --- | --- | | _boundary-string_ | A string of characters that is guaranteed to be unique within the body of the request, and that is used to delimit sections of the request body. This value must be declared as a header that has this format: | | `Content-type: multipart/mixed; boundary=*`boundary-string`*` |   | | customview-name | The name to assign to the custom view when it’s saved on the server. | | public-visibility-flag | (Optional) Specify **true** to have the published custom view visible to all users with relevant view permissions; otherwise, **false** for visibility of the custom view limited to owner and admins. The default is **false**. | | workbook-luid | The LUID of the workbook the custom view is associated with | | user-luid | (Optional) The LUID of the user to be assigned as owner of the custom view. You can get the user LUID by calling [Get Users on Site](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#get_users_on_site). If not specified, the custom view ownership is assigned to the API caller | | customview-file-name | The file name (including the extension) of the custom view file to upload. This attribute is used in the request body only if the request also includes the content of the custom view file. It’s not used if you’re committing a file uploaded using previous requests. | | content-of-customview-file | The content of the custom view file, if the request includes the file. The maximum size of a file that can be uploaded in one call is 64 MB. | ## Permissions Users who are server administrators or site administrators can publish a custom view. ## Response Code 201 ## Response Body ``` ``` ## Version 3.21 ## Errors | HTTP status | Error code | Condition | Details | | --- | --- | --- | --- | | 400 | 400000 | Malformed request body | The XML content in the MIME multipart request is not empty. | | 400 | 400000 | Missing custom view file | There’s no attachment in the request and no **uploadSessionID** parameter. | | 400 | 400000 | Unexpected attachments | The message had both an **uploadSessionId** parameter and an attachment, or the request body contained more than one attachment. | | 400 | 400016 | Attachment file size exceeds size limit | The attached custom view file exceeds the size limit of 64 MB. | | 400 | 400169 | Invalid custom view file | The contents of the custom view file was found to be invalid. | | 400 | 400175 | Missing or invalid workbook | The request payload included an **workbookId** but the specified workbook could not be found on the specified site. | | 403 | 403163 | Insufficient publishing permission | User attempting to publish the custom view caller doesn’t have sufficient permissions. | | 404 | 404015 | File upload not found | The file upload session ID in the **uploadSessionId** parameter doesn’t correspond to an existing file upload on the site. | | 405 | 405000 | Invalid request method | The request type was not **POST**. | ## Example ``` curl "http://MY_SERVER/api/3.21/sites/ \ ff2a8360-3c2b-4b05-a793-7607c602e1fb/customviews" \ -X POST -H "X-Tableau-Auth:12ab34cd56ef78ab90cd12ef34ab56cd" \ -H "Content-Type: multipart/mixed;" \ -F "request_payload=@publish-customview.xml" \ -F "tableau_customview=@MY_CUSTOMVIEW.json" ``` ## Content of publish-customview.xml ``` ``` # Run Your Migration 🕐 _5 min read_ Before you begin using the SDK, it is essential that you complete the [Pre-Migration Checklist](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/how_to_migrate.html#pre-migration-checklist). If you don’t complte these items, the migration might not be successful. ## Operation order To successfully migrate, you must understand and follow the order of operations that the Migration SDK uses. Many concepts build on each other and are prerequisites for later steps. For example, projects must be migrated to Tableau Cloud before workbooks in order for workbooks to be published into a project. See the following order of operations to see the order of operations of a migration. ![Migration workflow chart](/tableau/next/en-us/api/migration_sdk/en-us/assets/run-migration.png) When content is migrated from Tableau Server to Tableau Cloud, the Migration SDK will do a number of things to automate transformation in flight. One of these things is to map users across environments. On Tableau Server, a username might not be an email. On Tableau Cloud, a username must be a valid email address. For example, John Smith may appear as jsmith on Tableau Server but will be johnsmith@tableau.com on Tableau Cloud. However, things like asset ownership and Tableau permissions assigned to John Smith must follow the user across both environments. We rely on user mapping to ensure that users own the same content on both environments and have access to the same content in both environments. When a content item is migrated, it generally follows the same migration pattern. The following is a high-level overview of that pattern. ![Migration pattern overview chart](/tableau/next/en-us/api/migration_sdk/en-us/assets/migration-pattern.png) - List: Get a list of content items from the source. - Map: Map source content items to destination content items. - Filter: Filter any content items that should not be migrated. Outside of the default filters that the Migration SDK applies, everything is migrated if filters are not provided. - Pull: Pull any additional information from the source that is required to publish the content item. - Transform: Change certain properties within the content items to account for things such as server-cloud differences. - Publish: Publish the content item prepared using the previous steps, to the destination. - Post-Publish: Perform operations on the destination based so the content items correctly contain properties such as ownership, permissions etc. There are known exceptions to this pattern such as batch operations, but those exceptions start from this framework as the baseline. ## Migration timing Tableau Cloud undergoes periodic maintenance to sustain the infrastructure supporting Tableau Cloud services. Please review the [reserved system maintenance schedule](https://help.tableau.com/current/online/en-us/to_maintenance_schedule.htm#reserved-system-maintenance-schedule) to ensure you do not attempt a migration during reserved system maintenance windows. If Tableau Cloud is unavailable when you attempt a migration, the migration will fail. Tableau Cloud undergoes major upgrades three times a year. We recommend that you plan your migration to complete before or after an upgrade window. See the [quarterly release schedule](https://help.tableau.com/current/online/en-us/to_maintenance_schedule.htm#quarterly-release-schedule) to understand more about Tableau Cloud upgrades and how to plan around them. ## Understanding a migration run To help you understand what took place in a migration run, the Migration SDK outputs a manifest file as part of the [migration result](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/concepts_and_terms.html#migration-result). This manifest catalogs the items that successfully migrated to Tableau Cloud and their current destination on the site. Logging is also available for the Migration SDK. For more details, see the [Migration SDK API Reference documentation](https://tableau.github.io/migration-sdk/api-csharp/Tableau.Migration.Interop.Logging.html). # SDK Reference You can read the SDK reference documentation at https://tableau.github.io/migration-sdk. # Supported Content Types 🕐 _3 min read_ The Migration SDK is equipped to migrate the following content types. If no filters are provided, items for all content types are migrated with some exceptions. Note the minimum permissions required to migrate each content type.
Content Type What is migrated What isn’t migrated Minimum permissions
Custom Views
  • Ownership
  • List of users for whom the custom view is default.
  • Source: Site Administrator
  • Destination: Site Administrator
Data Sources
  • Ownership
  • Permissions
  • Tags
  • Labels
  • Embedded credentials, except for managed OAuth embedded credentials
  • Revision History
  • Managed OAuth embedded credentials. Data sources will appear as failed in the manifest if they contain managed OAuth embedded credentials. For more information, see OAuth Connections.
  • Source: Read (view), Connect, and ExportXml permissions on all data sources
  • Destination: Site Administrator
Extract Refresh Schedules
  • Extract Refresh schedules with frequencies and intervals are migrated to cloud compatible schedules. Make sure you set the correct time zone. In the case where the time zones don't match, you must add a transformer to update the day/time of the scheduled task.
  • Schedules with an hourly frequency and less than one hour intervals are migrated to have a one hour frequency. See Schedule Refreshes on Tableau Cloud for details about supported frequencies and intervals.
  • Schedule Name
  • Schedule Priority
  • Schedule Execution Order (Parallel or Serial)
  • Weekly frequency, with multiple days of the week selected
For more information, see Jobs, Tasks, and Schedule Methods.
  • Source: Site Administrator
  • Destination: Site Administrator
Favorites
  • Data source favorites
  • Project favorites
  • Workbook favorites
  • View favorites
Flow favorites
  • Source: Site Administrator
  • Destination: Site Administrator
Group Sets Group sets and group linkage to group sets.
  • Source: Site Administrator
  • Destination: Site Administrator
Groups Group membership for users. Group “All Users”
  • Source: Site Administrator
  • Destination: Site Administrator
Projects
  • Permissions
  • Ownership
  • Source: Read (view) permissions on all projects
  • Destination: Site Administrator
Subscriptions
  • Subscription schedules with frequencies and intervals are migrated to cloud compatible schedules. Make sure you set the correct time zone. In the case where the time zones don't match, you must add a transformer to update the day/time of the subscription.
  • Schedules with an hourly frequency and less than one hour intervals are migrated to have a one hour frequency. See Set up subscriptions on Tableau Cloud for details about supported frequencies and intervals.
  • Schedule Name
  • Schedule Priority
  • Schedule Execution Order (Parallel or Serial)
  • Weekly frequency, with multiple days of the week selected
For more information, see Jobs, Tasks, and Schedule Methods.
  • Source: Site Administrator
  • Destination: Site Administrator
Users
  • Source: Site Administrator
  • Destination: Site Administrator
Workbooks
  • Ownership
  • Permissions
  • Tags
  • Embedded credentials, except for managed OAuth embedded credentials
  • DataAccelerationConfig
  • Managed OAuth embedded credentials. Workbooks will appear as failed in the manifest if they contain managed OAuth embedded credentials. For more information, see OAuth Connections.
  • Labels
  • Source: Read (view) and ExportXml permissions on all workbooks
  • Destination: Site Administrator
Prep Flows
  • Ownership
  • Permissions
  • Tags
  • Description
  • Project location
  • Embedded credentials, except for managed OAuth embedded credentials
  • Managed OAuth embedded credentials. Prep flows will appear as failed in the manifest if they contain managed OAuth embedded credentials. For more information, see OAuth Connections.
  • Labels
  • Source: Read (view) and ExportXml permissions on all Prep flows
  • Destination: Site Administrator
Prep Flow Tasks
  • Prep flow run task schedules (Server-to-Server, Server-to-Cloud, and Cloud-to-Cloud) with frequencies and intervals are migrated to cloud compatible schedules. Make sure you set the correct time zone. In the case where the time zones don't match, you must add a transformer to update the day/time of the scheduled task. Schedules with an hourly frequency and less than one hour intervals are migrated to have a one hour frequency. See Schedule Refreshes on Tableau Cloud for details about supported frequencies and intervals.
  • Schedule Name
  • Schedule Priority
  • Schedule Execution Order (Parallel or Serial)
  • Weekly frequency, with multiple days of the week selected
  • For more information, see Jobs, Tasks, and Schedule Methods.
  • Source: Site Administrator
  • Destination: Site Administrator
# Tableau Migration SDK Overview Customers worldwide are migrating to Tableau Cloud to take advantage of the innovation, reduced overhead, security and scalability of Tableau’s managed data service. The Migration SDK helps you migrate to Tableau Cloud in a seamless and predictable way. You can leverage the Migration SDK to - Migrate Users and Groups - Migrate content like Data Sources and Workbooks - Develop a robust Governance structure for your content in Tableau Cloud - Migrate or recreate user functions like Subscriptions With any migration project, you’ll also be able to: - Capture logs of all actions taken - Understand current state of your Tableau Cloud environment - Transform essential aspects of users, content and governance in-flight The Migration SDK gives you the tools to go from “lift and shift” methodologies to optimization in a Cloud-native environment. We’ve enriched the documentation and instructions so that your Cloud deployment is optimized for simplicity of administration, automation and enriched data cultures following a migration. ## Designed for ease of use The Migration SDK libraries are available in both Python and .NET. It can be run on both Windows and Linux to simplify deployment. ## What this Migration SDK does not do Need to create a list of un-supported content types and point to manual processes of re-creation and third-parties who provide offerings. Include in this list aspects of the migration (pre-environment screens, matching of content, verification of migration, etc) For details about supported platforms and hardware requirements, see [Requirement](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/requirements.md). # Tableau Migration SDK Overview 🕐 _3 min read_ ## Migration SDK Overview Customers worldwide are migrating to Tableau Cloud to take advantage of the innovation, reduced cost, security, and scalability of Tableau’s managed data service. The [Tableau Migration Software Development Kit (SDK)](https://github.com/tableau/tableau-migration-sdk) helps you migrate to Tableau Cloud in a seamless and predictable way. You can use the Migration SDK to build your own migration application to do the following: - Migrate users and groups - Migrate content like data sources and workbooks - Migrate and, in some cases, modify your robust governance structure for your content in Tableau Cloud **Note**: The Tableau Migration SDK is for migrating **from** Tableau Server **to** Tableau Cloud. Tableau Server to Tableau Server and Tableau Cloud to Tableau Cloud migrations are not currently supported with the Migration SDK. To migrate content between Tableau Server sites or between Tableau Cloud sites, use the [Tableau Content Migration Tool](https://help.tableau.com/current/server/en-us/cmt-intro.htm). With any migration project, you can also: - Migrate content items like Workbooks, Data Sources and Projects from Tableau Server to Tableau Cloud - Capture logs of essential actions taken - Transform essential aspects of users, content, and governance in-flight The Migration SDK gives you the tools to go from “lift and shift” methodologies to optimization in a Cloud-native environment. We’ve enriched the documentation and instructions to highlight opportunities to optimize your Tableau Cloud deployment for simplicity of administration, automation, and enriched data cultures following a migration. ### What should the Migration SDK be used for? - The Migration SDK is used for the technical movement of users and content during a migration from Tableau Server to Tableau Cloud. - The migration should be a one-time event rather than a recurring content promotion (such as a migration from development to production). - The Migration SDK is a framework for your custom-coded projects. The SDK is not a standalone application that performs Tableau Server to Tableau Cloud migrations with no coding required. ### Who can use the Migration SDK? The Migration SDK was designed for junior level developers and above who are familiar with Tableau and have experience in either Python or .NET. The Migration SDK gives you the tools to develop your own migration application. More details on the supported platforms and hardware requirements can be found in [Installation](/v0.0/api/migration_sdk/en-us/docs/installation.html). ### When to use the Migration SDK The Migration SDK is used for the technical movement of users and content during a migration from Tableau Server to Tableau Cloud. The following image is helpful if you’re thinking about migrating to Tableau Cloud and where the Migration SDK fits into that process. This image shows an overview of the various teams and decisions that are needed for a successful migration. ![Summary of migration models](/tableau/next/en-us/api/migration_sdk/en-us/assets/when-to-use-msdk.jpg) ### When not to use the Migration SDK 1. We don’t recommend that all Tableau Server customers migrate to Tableau Cloud. This is because of compliance or use case compatibility. Be aware of the [differences between Tableau Server and Tableau Cloud](https://help.tableau.com/current/server/en-us/migrate_server_to_cloud_overview.htm) and confirm your plans with your accounts teams before migrating to Tableau Cloud. 2. If you have fewer than 100 users, we recommend using the [Tableau Cloud Manual Migration Guide](https://help.tableau.com/v0.0/guides/migration/en-us/emg_intro.htm) instead. Customers fitting this profile usually migrate faster and don’t require development investment using a manual method. On average, this process usually takes customers of this size under two weeks to migrate to Cloud. 3. If you have more than 100 users and do not have internal resources familiar with Python or C#, we recommend leaning on [Tableau Professional Services](https://www.tableau.com/resources/teams-organizations/professional-services) or our [Experienced Migration Partners](https://www.tableau.com/why-tableau/tableau-migration). ## Migration blockers While most customers will benefit from migrating from Tableau Server to Tableau Cloud, there are a few unique scenarios that might require you to continue to use Tableau Server. Check with your Tableau account team or a Partner for advice, or consider [potential migration obstacles](https://help.tableau.com/current/server/en-us/migrate_server_to_cloud_overview.htm). ## Platform differences While Tableau Server and Tableau Cloud are remarkably similar, there are some differences between the two products that impact how you migrate. We call out these differences within specific migration steps in the Migration SDK documentation. However, the following links offer some high-level items to keep in mind when you’re planning your migration. - [Summary of platform differences](https://help.tableau.com/current/server/en-us/migrate_server_to_cloud_overview.htm) - [Version differences](https://public.tableau.com/app/profile/tableau.core.product.marketing/viz/ReleaseNavigator-V21/FeaturesInVersionDash) ## Technical limitations The Migration SDK is a framework for your custom-coded projects. The SDK _is not_ a standalone application that performs Tableau Server to Cloud migrations with no coding required. The Migration SDK relies exclusively on REST API functionality to migrate content. If a content item doesn’t yet have the necessary REST API functionality, those items could need to be migrated manually by end users. We have detailed these items in [Data not support by the Migration SDK](/v0.0/api/migration_sdk/en-us/docs/planning.html#data-not-supported-by-the-migration-sdk). ## More information For more information about manual processes, see the [Tableau Cloud Manual Migration Guide](https://help.tableau.com/current/guides/migration/en-us/emg_intro.htm). **Tip**: If you're looking to increase your productivity as you interact with the Tableau Server REST API for regular Tableau Server usage, see [Tableau Server Client](https://tableau.github.io/server-client-python/docs/). # Troubleshooting If you have trouble with your migration using the Migration SDK, see the [Troubleshooting](https://tableau.github.io/migration-sdk/articles/troubleshooting.html) article in the API documentation. # What's New 🕐 _1 min read_ For release information, see [Tableau Migration SDK Releases](https://github.com/tableau/tableau-migration-sdk/releases). # Writing a .NET Application The Migration SDK is written in and supports the .NET Framework. See [Requirements](https://help.tableau.com/v0.0/api/migration_sdk/en-us/docs/requirements.md) for supported .NET versions. ## Required elements The main elements required for a basic migration are listed in the following sections. ### Configuration #### Source - `ServerURL` - `SiteContentUrl` - `AccessTokenName` - `AccessToken` ### Destination - `SiteContentUrl` - `AccessTokenName` - `AccessToken` - `ServerUrl` ### Migration plan ## Example code Program.cs ``` Java public static class Program { public static async Task Main(string[] args) { using var host = Host.CreateDefaultBuilder(args) .ConfigureServices((ctx, services) => { services .Configure(ctx.Configuration) .AddTableauMigrationSdk(ctx.Configuration.GetSection("tableau:migrationSdk")) .AddHostedService(); }) .Build(); await host.RunAsync(); } } ``` Startup code ``` Java using System.Net.Mail; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Tableau.Migration.TestApplication.Config; namespace Tableau.Migration.TestApplication { internal sealed class MyMigrationApplication : IHostedService { private readonly IHostApplicationLifetime _appLifetime; private IMigrationPlanBuilder _planBuilder; private readonly IMigrator _migrator; private readonly MyMigrationApplicationOptions _options; public MyMigrationApplication(IHostApplicationLifetime appLifetime, IMigrationPlanBuilder planBuilder, IMigrator migrator, IOptions options) { _appLifetime = appLifetime; _planBuilder = planBuilder; _migrator = migrator; _options = options.Value; } public async Task StartAsync(CancellationToken cancel) { _planBuilder = _planBuilder .FromSourceTableauServer( _options.Source.ServerUrl, _options.Source.SiteContentUrl, _options.Source.AccessTokenName, _options.Source.AccessToken) .ToDestinationTableauCloud( _options.Destination.SiteContentUrl, _options.Destination.AccessTokenName, _options.Destination.AccessToken, _options.Destination.ServerUrl) .ForServerToCloud(); _planBuilder.Mappings.Add(new UserTableauCloudEmailMapping(new MailAddress("myemail@example.com"))); var plan = _planBuilder.Build(); var result = await _migrator.ExecuteAsync(plan, cancel); //TODO: Handle results _appLifetime.StopApplication(); } public Task StopAsync(CancellationToken cancel) => Task.CompletedTask; } } ``` # Writing a Python Application The Migration SDK has a Python wrapper that utilizes the .Net binaries. You can choose to use that or write their own implementation. Input required for this application is essentially the same as that of the .Net application. ## Required elements The main elements required for a basic migration are listed in the following sections. ### Configuration #### Source - `ServerURL` - `SiteContentUrl` - `AccessTokenName` - `AccessToken` ### Destination - `SiteContentUrl` - `AccessTokenName` - `AccessToken` - `ServerUrl` ### Migration plan ## Example code The following is some Python code to get started with. The code assumes you already have the tableau\_migration module installed. ``` Unset import configparser # configuration parser from tableau_migration.migration_engine import PyMigrationPlanBuilder from tableau_migration.migration_engine_migrators import PyMigrator import helper # Helper code. Must be imported after tableau_migration modules if __name__ == '__main__': planBuilder = PyMigrationPlanBuilder() migration = PyMigrator() config = configparser.ConfigParser() config.read('config.DEV.ini') # Build the plan planBuilder = planBuilder \ .from_source_tableau_server(config['SOURCE']['URL'], config['SOURCE']['SITE_CONTENT_URL'], config['SOURCE']['ACCESS_TOKEN_NAME'], config['SOURCE']['ACCESS_TOKEN']) \ .to_destination_tableau_cloud(config['DESTINATION']['SITE_CONTENT_URL'], config['DESTINATION']['ACCESS_TOKEN_NAME'], config['DESTINATION']['ACCESS_TOKEN'], config['DESTINATION']['URL'],) \ .for_server_to_cloud() \ .with_tableau_id_authentication_type() helper.AddUserTransformer(planBuilder) plan = planBuilder.build() # Run the migration result = migration.execute(plan) print("All done") ```