A small, pragmatic toolkit for migrating catalog content from Informatica Cloud Data Governance and Catalog (CDGC / IDMC) into Microsoft Purview (Unified Catalog + Data Map) using only Python and the public REST APIs.
It is intentionally minimal: an Excel/JSON ingest format that mirrors what falls out of a CDGC bulk export, and idempotent scripts that create governance content (domains, glossary terms, classifications, lineage) and organize Data Map assets into collections.
The goal is not to replicate Informatica feature-for-feature. It is to give you a working, scriptable starting point you can fork and harden for your own migration.
informatica-to-purview-demo/
├── config.json # account name + run options
├── requirements.txt
├── samples/
│ ├── informatica_glossary_export.xlsx # generated from generate_sample_excel.py
│ ├── informatica_assets_export.json
│ ├── informatica_lineage_export.json
│ └── informatica_classifications_export.json
└── scripts/
├── generate_sample_excel.py # builds an Informatica-style workbook
├── purview_import.py # loads domain + glossary + assets + lineage + classifications
├── create_collections_and_move.py # creates a collection hierarchy and moves assets into it
└── verify_assets.py # sanity-checks entities by qualifiedName
- Python 3.10+
- A Microsoft Purview account upgraded to the new portal experience (
purview.microsoft.com) - Azure CLI installed and authenticated:
az login - A user with Data Curator (Data Map) and Data Governance Administrator (Unified Catalog) — or equivalent — on the target Purview account
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtEdit config.json:
{
"purview_account_name": "<your-purview-account-name>",
"governance_domain": {
"name": "<domain-name>",
"description": "<domain-description>",
"type": "FunctionalUnit",
"status": "Draft"
},
...
}Use the bare account name (e.g. contoso-pv), not the full URL.
# 1. (Optional) Build a sample Informatica-style Excel workbook
python scripts/generate_sample_excel.py
# 2. Sign in
az login
# 3. Dry run (set "dry_run": true in config.json) to preview every API call
python scripts/purview_import.py --config config.json
# 4. Real run
python scripts/purview_import.py --config config.json
# 5. (Optional) Organize assets into a collection hierarchy
python scripts/create_collections_and_move.py
# 6. (Optional) Verify entities by qualifiedName
python scripts/verify_assets.py| Step | Purview API | Source file |
|---|---|---|
| 1. Create / reuse governance domain | POST /datagovernance/catalog/businessdomains (api-version 2025-09-15-preview) |
config.json |
| 2. Create glossary terms (idempotent by name) | GET then POST /datagovernance/catalog/terms |
Excel Glossary sheet |
| 3. Register Atlas entities (assets) | POST /catalog/api/atlas/v2/entity |
informatica_assets_export.json |
| 4. Create lineage processes | POST /catalog/api/atlas/v2/entity (typeName=Process) |
informatica_lineage_export.json |
| 5. Apply column classifications | POST /catalog/api/atlas/v2/entity/uniqueAttribute/type/{type}/classifications |
informatica_classifications_export.json |
Auth is via AzureCliCredential against audience https://purview.azure.net. The Unified Catalog endpoints use the global host https://api.purview-service.microsoft.com/datagovernance/catalog; the Atlas Data Map endpoints use the per-account host https://{account}.purview.azure.com.
| Informatica CDGC | Microsoft Purview |
|---|---|
| Domain (Axon) | Governance Domain (Unified Catalog) |
| Business Term | Glossary Term (under domain) |
| Steward / Owner | Domain contact / steward |
| Technical Asset | Atlas entity in Data Map |
| Mapping / Job lineage | Atlas Process entity with inputs/outputs |
| Data Classification | Atlas classification on column entity |
| Resource / Folder | Collection / sub-collection |
For a real migration, scan the live source first, decorate second:
- Register the source (BigQuery, Snowflake, ADLS, SQL, …) in Purview and run a scan so assets land with Purview's canonical
qualifiedNameformat. - Build a CSV mapping Informatica fully-qualified names → Purview
qualifiedNames. - Run a decoration-only version of this importer that POSTs glossary term assignments, classifications, custom attributes, business lineage and data-product memberships against the existing Purview entities. Do not let the migration script create the technical assets — let scans do that, otherwise schema drift produces duplicates.
- Schedule the source scan and the decoration script on the same cadence. Both are idempotent.
See blog/informatica-to-purview-migration.md for the longer write-up.
- Domain:
GET /businessdomains→ reuse existing by name, else create. - Glossary:
GET /terms→ skip terms whose name already exists in the domain. - Assets / lineage: Atlas
POSTonqualifiedNameis an upsert — re-runs merge attributes, they don't duplicate. - Classifications: HTTP 400 with
already associatedis treated as success. - Transient SSL / network errors are retried with exponential backoff (3 attempts, 2s/4s/8s).
- Custom Data Map domains (the preview feature) are portal-only today. Create those in
purview.microsoft.com→ Data Map → Domains; this repo handles the collections, glossary and assets inside a domain via API. - Built-in classification names use dotted forms —
MICROSOFT.PERSONAL.EMAIL,MICROSOFT.PERSONAL.US.PHONE_NUMBER,MICROSOFT.PERSONAL.PHYSICALADDRESS,MICROSOFT.GOVERNMENT.US.ZIP_CODE. Custom classifications must already exist before referencing them. - Unified Catalog API versions are evolving; pin
2025-09-15-preview(or updateUC_API_VERSIONinpurview_import.py) to track changes.
MIT — see LICENSE.