Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added AWS IAM roles support to databricks labs ucx migrate-credentials command #973

Merged
merged 25 commits into from
Mar 8, 2024

Conversation

nkvuong
Copy link
Contributor

@nkvuong nkvuong commented Feb 22, 2024

Changes

A few more things to be done

  • Added load function to AWSResourcePermissions to return identified instance profiles
  • Added IamRoleMigration class under aws/credentials.py to migrate AWS instance profiles identified

Linked issues

Resolves #862

Related PR:

Functionality

  • added relevant user documentation
  • added new CLI command databricks labs ucx migrate-credentials

Tests

  • manually tested
  • added unit tests
  • added integration tests

Copy link

gitguardian bot commented Feb 22, 2024

️✅ There are no secrets present in this pull request anymore.

If these secrets were true positive and are still valid, we highly recommend you to revoke them.
Once a secret has been leaked into a git repository, you should consider it compromised, even if it was deleted immediately.
Find here more information about risks.


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

Our GitHub checks need improvements? Share your feedbacks!

Copy link

codecov bot commented Feb 22, 2024

Codecov Report

Attention: Patch coverage is 93.58974% with 10 lines in your changes are missing coverage. Please review.

Project coverage is 88.62%. Comparing base (27ad9a8) to head (6283b1d).
Report is 1 commits behind head on main.

Files Patch % Lines
src/databricks/labs/ucx/assessment/aws.py 88.09% 3 Missing and 2 partials ⚠️
src/databricks/labs/ucx/aws/credentials.py 94.94% 3 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #973      +/-   ##
==========================================
+ Coverage   88.54%   88.62%   +0.08%     
==========================================
  Files          48       49       +1     
  Lines        6302     6428     +126     
  Branches     1139     1159      +20     
==========================================
+ Hits         5580     5697     +117     
- Misses        477      483       +6     
- Partials      245      248       +3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

github-actions bot commented Feb 22, 2024

❌ 108/109 passed, 1 flaky, 1 failed, 17 skipped, 1h21m8s total

❌ test_running_real_assessment_job: databricks.sdk.errors.platform.Unknown: assess_CLOUD_ENV_service_principals: TimeoutException: Futures timed out after [80 seconds] (10m30.626s)
databricks.sdk.errors.platform.Unknown: assess_CLOUD_ENV_service_principals: TimeoutException: Futures timed out after [80 seconds]
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE SCHEMA hive_metastore.ucx_smcgy
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Schema hive_metastore.ucx_smcgy: https://DATABRICKS_HOST/explore/data/hive_metastore/ucx_smcgy
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added schema fixture: SchemaInfo(catalog_name='hive_metastore', catalog_type=None, comment=None, created_at=None, created_by=None, effective_predictive_optimization_flag=None, enable_predictive_optimization=None, full_name='hive_metastore.ucx_smcgy', metastore_id=None, name='ucx_smcgy', owner=None, properties=None, storage_location=None, storage_root=None, updated_at=None, updated_by=None)
[gw9] linux -- Python 3.10.13 /home/runner/work/ucx/ucx/.venv/bin/python
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE SCHEMA hive_metastore.ucx_smcgy
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Schema hive_metastore.ucx_smcgy: https://DATABRICKS_HOST/explore/data/hive_metastore/ucx_smcgy
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added schema fixture: SchemaInfo(catalog_name='hive_metastore', catalog_type=None, comment=None, created_at=None, created_by=None, effective_predictive_optimization_flag=None, enable_predictive_optimization=None, full_name='hive_metastore.ucx_smcgy', metastore_id=None, name='ucx_smcgy', owner=None, properties=None, storage_location=None, storage_root=None, updated_at=None, updated_by=None)
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added workspace user fixture: User(active=True, display_name='sdk-ltq9@example.com', emails=[ComplexValue(display=None, primary=True, ref=None, type='work', value='sdk-ltq9@example.com')], entitlements=[], external_id=None, groups=[], id='134407534763124', name=Name(family_name=None, given_name='sdk-ltq9@example.com'), roles=[], schemas=[<UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_USER: 'urn:ietf:params:scim:schemas:core:2.0:User'>, <UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_EXTENSION_WORKSPACE_2_0_USER: 'urn:ietf:params:scim:schemas:extension:workspace:2.0:User'>], user_name='sdk-ltq9@example.com')
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Workspace group ucx_XIBi: https://DATABRICKS_HOST#setting/accounts/groups/201785873772193
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added workspace group fixture: Group(display_name='ucx_XIBi', entitlements=[ComplexValue(display=None, primary=None, ref=None, type=None, value='allow-cluster-create')], external_id=None, groups=[], id='201785873772193', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=ResourceMeta(resource_type='WorkspaceGroup'), roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Account group ucx_XIBi: https://accounts.CLOUD_ENVdatabricks.net/users/groups/498712735420170/members
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added account group fixture: Group(display_name='ucx_XIBi', entitlements=[], external_id=None, groups=[], id='498712735420170', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=None, roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Cluster policy: https://DATABRICKS_HOST#setting/clusters/cluster-policies/view/0001D7BBDC10F664
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added cluster policy fixture: CreatePolicyResponse(policy_id='0001D7BBDC10F664')
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added cluster_policy permissions fixture: 0001D7BBDC10F664 [group_name admins CAN_USE] -> [group_name ucx_XIBi CAN_USE]
15:53 DEBUG [databricks.labs.ucx.install] Cannot find previous installation: Path (/Users/0a330eb5-dd51-4d97-b6e4-c474356b1d5d/.ZxXM/config.yml) doesn't exist.
15:53 INFO [databricks.labs.ucx.install] Please answer a couple of questions to configure Unity Catalog migration
15:53 INFO [databricks.labs.ucx.installer.hms_lineage] HMS Lineage feature creates one system table named system.hms_to_uc_migration.table_access and helps in your migration process from HMS to UC by allowing you to programmatically query HMS lineage data.
15:53 INFO [databricks.labs.ucx.install] Creating UCX cluster policy.
15:53 INFO [databricks.labs.ucx.install] Installing UCX v0.15.1+3220240308155328
15:53 INFO [databricks.labs.ucx.install] Creating dashboards...
15:53 INFO [databricks.labs.ucx.install] Fetching warehouse_id from a config
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy database exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE SCHEMA IF NOT EXISTS hive_metastore.ucx_smcgy
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading step folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/views...
15:53 DEBUG [databricks.labs.ucx.install] Creating jobs from tasks in main
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading step folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment...
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading dashboard folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment/CLOUD_ENV...
15:53 INFO [databricks.labs.ucx.framework.dashboards] Creating dashboard [ZXXM] UCX  Assessment (Azure)...
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.CLOUD_ENV_service_principals table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.CLOUD_ENV_service_principals (application_id STR... (107 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.clusters table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.clusters (cluster_id STRING NOT NULL, succes... (91 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.global_init_scripts table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.jobs table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.global_init_scripts (script_id STRING NOT NU... (120 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.jobs (job_id STRING NOT NULL, success LONG N... (79 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.pipelines table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.external_locations table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.pipelines (pipeline_id STRING NOT NULL, succ... (99 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.external_locations (location STRING NOT NULL... (40 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.mounts table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.mounts (name STRING NOT NULL, source STRING ... (21 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.grants table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.grants (principal STRING NOT NULL, action_ty... (167 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.groups table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.groups (id_in_workspace STRING NOT NULL, nam... (179 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.tables table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.tables (catalog STRING NOT NULL, database ST... (189 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.table_size table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.table_failures table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.workspace_objects table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.table_size (catalog STRING NOT NULL, databas... (81 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.table_failures (catalog STRING NOT NULL, dat... (61 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.workspace_objects (path STRING NOT NULL, obj... (63 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.permissions table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.submit_runs table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.permissions (object_id STRING NOT NULL, obje... (57 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.submit_runs (run_ids STRING NOT NULL, hashed... (58 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading dashboard folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment/main...
15:53 INFO [databricks.labs.ucx.framework.dashboards] Creating dashboard [ZXXM] UCX  Assessment (Main)...
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=remove-workspace-local-backup-groups
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=099-destroy-schema
15:53 INFO [databricks.labs.ucx.install] Fetching warehouse_id from a config
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=assessment
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.objects view matches queries/views/objects.sql contents
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE OR REPLACE VIEW hive_metastore.ucx_smcgy.objects AS SELECT "jobs" AS object_type, job_id ... (1639 more bytes)
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=migrate-groups
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=validate-groups-permissions
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.grant_detail view matches queries/views/grant_detail.sql contents
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE OR REPLACE VIEW hive_metastore.ucx_smcgy.grant_detail AS SELECT CASE WHEN anonymous_funct... (1037 more bytes)
15:53 INFO [databricks.labs.ucx.install] Installation completed successfully! Please refer to the https://DATABRICKS_HOST/#workspace/Users/0a330eb5-dd51-4d97-b6e4-c474356b1d5d/.ZxXM/README for the next steps.
15:53 DEBUG [databricks.labs.ucx.install] starting assessment job: https://DATABRICKS_HOST#job/749677912874119
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE SCHEMA hive_metastore.ucx_smcgy
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Schema hive_metastore.ucx_smcgy: https://DATABRICKS_HOST/explore/data/hive_metastore/ucx_smcgy
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added schema fixture: SchemaInfo(catalog_name='hive_metastore', catalog_type=None, comment=None, created_at=None, created_by=None, effective_predictive_optimization_flag=None, enable_predictive_optimization=None, full_name='hive_metastore.ucx_smcgy', metastore_id=None, name='ucx_smcgy', owner=None, properties=None, storage_location=None, storage_root=None, updated_at=None, updated_by=None)
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added workspace user fixture: User(active=True, display_name='sdk-ltq9@example.com', emails=[ComplexValue(display=None, primary=True, ref=None, type='work', value='sdk-ltq9@example.com')], entitlements=[], external_id=None, groups=[], id='134407534763124', name=Name(family_name=None, given_name='sdk-ltq9@example.com'), roles=[], schemas=[<UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_USER: 'urn:ietf:params:scim:schemas:core:2.0:User'>, <UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_EXTENSION_WORKSPACE_2_0_USER: 'urn:ietf:params:scim:schemas:extension:workspace:2.0:User'>], user_name='sdk-ltq9@example.com')
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Workspace group ucx_XIBi: https://DATABRICKS_HOST#setting/accounts/groups/201785873772193
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added workspace group fixture: Group(display_name='ucx_XIBi', entitlements=[ComplexValue(display=None, primary=None, ref=None, type=None, value='allow-cluster-create')], external_id=None, groups=[], id='201785873772193', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=ResourceMeta(resource_type='WorkspaceGroup'), roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Account group ucx_XIBi: https://accounts.CLOUD_ENVdatabricks.net/users/groups/498712735420170/members
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added account group fixture: Group(display_name='ucx_XIBi', entitlements=[], external_id=None, groups=[], id='498712735420170', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=None, roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
15:53 INFO [databricks.labs.ucx.mixins.fixtures] Cluster policy: https://DATABRICKS_HOST#setting/clusters/cluster-policies/view/0001D7BBDC10F664
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added cluster policy fixture: CreatePolicyResponse(policy_id='0001D7BBDC10F664')
15:53 DEBUG [databricks.labs.ucx.mixins.fixtures] added cluster_policy permissions fixture: 0001D7BBDC10F664 [group_name admins CAN_USE] -> [group_name ucx_XIBi CAN_USE]
15:53 DEBUG [databricks.labs.ucx.install] Cannot find previous installation: Path (/Users/0a330eb5-dd51-4d97-b6e4-c474356b1d5d/.ZxXM/config.yml) doesn't exist.
15:53 INFO [databricks.labs.ucx.install] Please answer a couple of questions to configure Unity Catalog migration
15:53 INFO [databricks.labs.ucx.installer.hms_lineage] HMS Lineage feature creates one system table named system.hms_to_uc_migration.table_access and helps in your migration process from HMS to UC by allowing you to programmatically query HMS lineage data.
15:53 INFO [databricks.labs.ucx.install] Creating UCX cluster policy.
15:53 INFO [databricks.labs.ucx.install] Installing UCX v0.15.1+3220240308155328
15:53 INFO [databricks.labs.ucx.install] Creating dashboards...
15:53 INFO [databricks.labs.ucx.install] Fetching warehouse_id from a config
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy database exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE SCHEMA IF NOT EXISTS hive_metastore.ucx_smcgy
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading step folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/views...
15:53 DEBUG [databricks.labs.ucx.install] Creating jobs from tasks in main
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading step folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment...
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading dashboard folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment/CLOUD_ENV...
15:53 INFO [databricks.labs.ucx.framework.dashboards] Creating dashboard [ZXXM] UCX  Assessment (Azure)...
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.CLOUD_ENV_service_principals table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.CLOUD_ENV_service_principals (application_id STR... (107 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.clusters table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.clusters (cluster_id STRING NOT NULL, succes... (91 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.global_init_scripts table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.jobs table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.global_init_scripts (script_id STRING NOT NU... (120 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.jobs (job_id STRING NOT NULL, success LONG N... (79 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.pipelines table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.external_locations table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.pipelines (pipeline_id STRING NOT NULL, succ... (99 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.external_locations (location STRING NOT NULL... (40 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.mounts table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.mounts (name STRING NOT NULL, source STRING ... (21 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.grants table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.grants (principal STRING NOT NULL, action_ty... (167 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.groups table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.groups (id_in_workspace STRING NOT NULL, nam... (179 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.tables table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.tables (catalog STRING NOT NULL, database ST... (189 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.table_size table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.table_failures table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.workspace_objects table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.table_size (catalog STRING NOT NULL, databas... (81 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.table_failures (catalog STRING NOT NULL, dat... (61 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.workspace_objects (path STRING NOT NULL, obj... (63 more bytes)
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.permissions table exists
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.submit_runs table exists
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.permissions (object_id STRING NOT NULL, obje... (57 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE TABLE IF NOT EXISTS hive_metastore.ucx_smcgy.submit_runs (run_ids STRING NOT NULL, hashed... (58 more bytes)
15:53 DEBUG [databricks.labs.ucx.framework.dashboards] Reading dashboard folder /home/runner/work/ucx/ucx/src/databricks/labs/ucx/queries/assessment/main...
15:53 INFO [databricks.labs.ucx.framework.dashboards] Creating dashboard [ZXXM] UCX  Assessment (Main)...
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=remove-workspace-local-backup-groups
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=099-destroy-schema
15:53 INFO [databricks.labs.ucx.install] Fetching warehouse_id from a config
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=assessment
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.objects view matches queries/views/objects.sql contents
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE OR REPLACE VIEW hive_metastore.ucx_smcgy.objects AS SELECT "jobs" AS object_type, job_id ... (1639 more bytes)
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=migrate-groups
15:53 INFO [databricks.labs.ucx.install] Creating new job configuration for step=validate-groups-permissions
15:53 INFO [databricks.labs.ucx.framework.crawlers] Ensuring ucx_smcgy.grant_detail view matches queries/views/grant_detail.sql contents
15:53 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] CREATE OR REPLACE VIEW hive_metastore.ucx_smcgy.grant_detail AS SELECT CASE WHEN anonymous_funct... (1037 more bytes)
15:53 INFO [databricks.labs.ucx.install] Installation completed successfully! Please refer to the https://DATABRICKS_HOST/#workspace/Users/0a330eb5-dd51-4d97-b6e4-c474356b1d5d/.ZxXM/README for the next steps.
15:53 DEBUG [databricks.labs.ucx.install] starting assessment job: https://DATABRICKS_HOST#job/749677912874119
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 cluster_policy permissions fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing cluster_policy permissions fixture: 0001D7BBDC10F664 [group_name admins CAN_USE] -> [group_name ucx_XIBi CAN_USE]
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 cluster policy fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing cluster policy fixture: CreatePolicyResponse(policy_id='0001D7BBDC10F664')
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 workspace user fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing workspace user fixture: User(active=True, display_name='sdk-ltq9@example.com', emails=[ComplexValue(display=None, primary=True, ref=None, type='work', value='sdk-ltq9@example.com')], entitlements=[], external_id=None, groups=[], id='134407534763124', name=Name(family_name=None, given_name='sdk-ltq9@example.com'), roles=[], schemas=[<UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_USER: 'urn:ietf:params:scim:schemas:core:2.0:User'>, <UserSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_EXTENSION_WORKSPACE_2_0_USER: 'urn:ietf:params:scim:schemas:extension:workspace:2.0:User'>], user_name='sdk-ltq9@example.com')
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 account group fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing account group fixture: Group(display_name='ucx_XIBi', entitlements=[], external_id=None, groups=[], id='498712735420170', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=None, roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 workspace group fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing workspace group fixture: Group(display_name='ucx_XIBi', entitlements=[ComplexValue(display=None, primary=None, ref=None, type=None, value='allow-cluster-create')], external_id=None, groups=[], id='201785873772193', members=[ComplexValue(display='sdk-ltq9@example.com', primary=None, ref='Users/134407534763124', type=None, value='134407534763124')], meta=ResourceMeta(resource_type='WorkspaceGroup'), roles=[], schemas=[<GroupSchema.URN_IETF_PARAMS_SCIM_SCHEMAS_CORE_2_0_GROUP: 'urn:ietf:params:scim:schemas:core:2.0:Group'>])
16:03 INFO [databricks.labs.ucx.install] Deleting UCX v0.15.1+3220240308160349 from https://DATABRICKS_HOST
16:03 INFO [databricks.labs.ucx.install] Deleting inventory database ucx_smcgy
16:03 INFO [databricks.labs.ucx.framework.crawlers] deleting ucx_smcgy database
16:03 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] DROP SCHEMA IF EXISTS hive_metastore.ucx_smcgy CASCADE
16:03 INFO [databricks.labs.ucx.install] Deleting jobs
16:03 INFO [databricks.labs.ucx.install] Deleting remove-workspace-local-backup-groups job_id=125936051817315.
16:03 INFO [databricks.labs.ucx.install] Deleting 099-destroy-schema job_id=637529299414442.
16:03 INFO [databricks.labs.ucx.install] Deleting assessment job_id=749677912874119.
16:03 INFO [databricks.labs.ucx.install] Deleting migrate-groups job_id=224625525265693.
16:03 INFO [databricks.labs.ucx.install] Deleting validate-groups-permissions job_id=562487424230635.
16:03 INFO [databricks.labs.ucx.install] Deleting cluster policy
16:03 INFO [databricks.labs.ucx.install] Deleting secret scope
16:03 INFO [databricks.labs.ucx.install] UnInstalling UCX complete
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] clearing 1 schema fixtures
16:03 DEBUG [databricks.labs.ucx.mixins.fixtures] removing schema fixture: SchemaInfo(catalog_name='hive_metastore', catalog_type=None, comment=None, created_at=None, created_by=None, effective_predictive_optimization_flag=None, enable_predictive_optimization=None, full_name='hive_metastore.ucx_smcgy', metastore_id=None, name='ucx_smcgy', owner=None, properties=None, storage_location=None, storage_root=None, updated_at=None, updated_by=None)
16:03 DEBUG [databricks.labs.ucx.framework.crawlers] [api][execute] DROP SCHEMA IF EXISTS hive_metastore.ucx_smcgy CASCADE
[gw9] linux -- Python 3.10.13 /home/runner/work/ucx/ucx/.venv/bin/python

Flaky tests:

  • 🤪 test_running_real_remove_backup_groups_job (6m59.797s)

Running from acceptance #1519


@pytest.fixture
def ws():
state = {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dataclass
class StorageCredentialValidationResult:
name: str | None = None
role_arn: str | None = None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
role_arn: str | None = None
role_arn: str

must not be none


@dataclass
class StorageCredentialValidationResult:
name: str | None = None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
name: str | None = None
name: str

failures: str | None = None

@classmethod
def from_validation(cls, storage_credential: StorageCredentialInfo, failures: str | None):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this method is redundant

def save_uc_compatible_roles(self):
uc_role_access = list(self._get_role_access())
if len(uc_role_access) == 0:
logger.warning("No Mapping Was Generated.")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't use "Title Case", use "Sentence case"

@nfx nfx changed the title Migrate AWS Instance Profiles to UC Storage Credentials Added AWS IAM Instance Profiles to databricks labs ucx migrate-credentials command Mar 4, 2024
@nfx nfx changed the title Added AWS IAM Instance Profiles to databricks labs ucx migrate-credentials command Added AWS IAM Instance Profiles support to databricks labs ucx migrate-credentials command Mar 4, 2024
@nkvuong nkvuong changed the title Added AWS IAM Instance Profiles support to databricks labs ucx migrate-credentials command Added AWS IAM roles support to databricks labs ucx migrate-credentials command Mar 6, 2024
add integration tests

fix

-

Fix integration tests on AWS (#978)

Update groups permissions validation to use Table ACL cluster (#979)

Renamed columns in assessment SQL queries to use actual names, not aliases (#983)

<!-- Summary of your changes that are easy to understand. Add
screenshots when necessary -->
Aliases are usually not allowed in projections (as they are replaced
later in the query execution phases). While the DBSQL was smart enough
to handle the references via aliases, for some setups this results in an
error. Changing column references to use actual names fixes this.

<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

Resolves #980

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [x] manually tested
- [ ] added unit tests
- [ ] added integration tests
- [ ] verified on staging environment (screenshot attached)

Fixed `config.yml` upgrade from very old versions (#984)

Add a command to create account level groups if they do not exist (#763)

Attempt to fix
- #17
- #649

Adds a command to create groups at account level by crawling all
workspaces configured in the account and in scope of the migration

This pull request adds several new methods to the `account.py` file in
the `databricks/labs/ucx` directory. The main method added is
`create_account_level_groups`, which crawls all workspaces in an account
and creates account-level groups if a workspace-local group is not
present in the account. The method `get_valid_workspaces_groups` is
added to retrieve a dictionary of all valid workspace groups, while
`has_not_same_members` checks if two groups have the same members. The
method `get_account_groups` retrieves a dictionary of all account
groups.

Regarding the tests, the `test_account.py` file has been updated to
include new tests for the `create_account_level_groups` method. The test
`test_create_acc_groups_should_create_acc_group_if_no_group_found`
verifies that an account-level group is created if no group with the
same name is found. The test
`test_create_acc_groups_should_filter_groups_in_other_workspaces` checks
that the method filters groups present in other workspaces and only
creates groups that are not present in the account.

Additionally, the `cli.py` file has been updated to include a new
command, `create_account_level_groups`, which uploads workspace config
to all workspaces in the account where ucx is installed.

Added tokei.rs lines of code badge (#988)

[![lines of
code](https://tokei.rs/b1/github/databrickslabs/ucx)]([https://codecov.io/github/databrickslabs/ucx](https://github.com/databrickslabs/ucx))

Adding support for serving endpoints (#990)

Assessment did not crawled permissions for serving endpoints, this PR
aims to fix it

- [X] added integration tests

Added `upgraded_from_workspace_id` property to migrated tables to indicated the source workspace. (#987)

Added table parameter `upgraded_from_ws` to migrated tables. The
parameters contains the sources workspace id.

Resolves #899

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [x] manually tested
- [x] added unit tests
- [x] added integration tests
- [x] verified on staging environment (screenshot attached)

Handle None directory_id if managed identity encountered during the crawling of StoragePermissionMapping  (#986)

While creating StoragePermissionMapping, a principal could be managed
identity which does not have directory_id. This PR will allow managed
identity to be stored in StoragePermissionMapping, and allow None
directory_id.

<!-- Summary of your changes that are easy to understand. Add
screenshots when necessary -->

- Add `type` field to dataclass `StoragePermissionMapping` and
`Principal` to indicate if a principal is service principal or managed
identity.
- Allow None `directory_id` if the principal is not a service principal.
- Ignore the managed identity while migrating to UC storage credentials
for now.

<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

fix #339

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [ ] manually tested
- [ ] added unit tests
- [ ] added integration tests
- [ ] verified on staging environment (screenshot attached)

Added group members difference to the output of `validate-groups-membership` cli command (#995)

The `validate-groups-membership` command has been updated to include a
comparison of group memberships at both the account and workspace
levels, displaying the difference in members between the two levels in a
new column. This enhancement allows for a more detailed analysis of
group memberships, with the added functionality implemented in the
`validate_group_membership` function in the `groups.py` file located in
the `databricks/labs/ucx/workspace_access` directory. A new output
field, "group\_members\_difference," has been added to represent the
difference in the number of members between a workspace group and an
associated account group. The corresponding unit test file,
"test\_groups.py," has been updated to include a new test case that
verifies the calculation of the "group\_members\_difference" value. This
change provides users with a more comprehensive view of their group
memberships and allows them to easily identify any discrepancies between
the account and workspace levels. The functionality of the other
commands remains unchanged.

Added permission migration support for feature tables and the root permissions for models and feature tables  (#997)

Improved installation integration test flakiness (#998)

- improved `_infer_error_from_job_run` and `_infer_error_from_task_run`
to also catch `KeyError` and `ValueError`
- removed retries for `Unknown` errors for installation tests

Added assessment for the incompatible `RunSubmit` API usages (#849)

Expanded end-user documentation with detailed descriptions for workflows and commands (#999)

The Databricks Labs UCX project has been updated with several new
features to assist in upgrading to Unity Catalog. These include various
workflows and command-line utilities, such as an assessment workflow
that generates a detailed compatibility report for workspace entities
and a group migration workflow to upgrade all Databricks workspace
assets. Additionally, new utility commands have been added for managing
cross-workspace installations, and users can now view deployed
workflows' status and repair failed workflows. A new end-user
documentation has also been introduced, featuring comprehensive
descriptions of workflows, commands, and an assessment report image. The
Assessment Report, generated from UCX tools, now includes a more
detailed summary of the assessment findings, table counts, database
summaries, and external locations. Improved documentation for external
Hive Metastore integration and a new debugging notebook are also
included in this release. Lastly, the workspace group migration feature
has been expanded to handle potential conflicts when migrating multiple
workspaces with locally scoped group names.

Release v0.14.0 (#1000)

* Added `upgraded_from_workspace_id` property to migrated tables to
indicated the source workspace
([#987](#987)). In this
release, updates have been made to the `_migrate_external_table`,
`_migrate_dbfs_root_table`, and `_migrate_view` methods in the
`table_migrate.py` file to include a new parameter `upgraded_from_ws` in
the SQL commands used to alter tables, views, or managed tables. This
parameter is used to store the source workspace ID in the migrated
tables, indicating the migration origin. A new utility method
`sql_alter_from` has been added to the `Table` class in `tables.py` to
generate the SQL command with the new parameter. Additionally, a new
class-level attribute `UPGRADED_FROM_WS_PARAM` has been added to the
`Table` class in `tables.py` to indicate the source workspace. A new
property `upgraded_from_workspace_id` has been added to migrated tables
to store the source workspace ID. These changes resolve issue
[#899](#899) and are tested
through manual testing, unit tests, and integration tests. No new CLI
commands, workflows, or tables have been added or modified, and there
are no changes to user documentation.
* Added a command to create account level groups if they do not exist
([#763](#763)). This commit
introduces a new feature that enables the creation of account-level
groups if they do not already exist in the account. A new command,
`create-account-groups`, has been added to the `databricks labs ucx`
tool, which crawls all workspaces in the account and creates
account-level groups if a corresponding workspace-local group is not
found. The feature supports various scenarios, including creating
account-level groups that exist in some workspaces but not in others,
and creating multiple account-level groups with the same name but
different members. Several new methods have been added to the
`account.py` file to support the new feature, and the `test_account.py`
file has been updated with new tests to ensure the correct behavior of
the `create_account_level_groups` method. Additionally, the `cli.py`
file has been updated to include the new `create-account-groups`
command. With these changes, users can easily manage account-level
groups and ensure that they are consistent across all workspaces in the
account, improving the overall user experience.
* Added assessment for the incompatible `RunSubmit` API usages
([#849](#849)). In this
release, the assessment functionality for incompatible `RunSubmit` API
usages has been significantly enhanced through various changes. The
'clusters.py' file has seen improvements in clarity and consistency with
the renaming of private methods `check_spark_conf` to
`_check_spark_conf` and `check_cluster_failures` to
`_check_cluster_failures`. The `_assess_clusters` method has been
updated to call the renamed `_check_cluster_failures` method for
thorough checks of cluster configurations, resulting in better
assessment functionality. A new `SubmitRunsCrawler` class has been added
to the `databricks.labs.ucx.assessment.jobs` module, implementing
`CrawlerBase`, `JobsMixin`, and `CheckClusterMixin` classes. This class
crawls and assesses job runs based on their submitted runs, ensuring
compatibility and identifying failure issues. Additionally, a new
configuration attribute, `num_days_submit_runs_history`, has been
introduced in the `WorkspaceConfig` class of the `config.py` module,
controlling the number of days for which submission history of
`RunSubmit` API calls is retained. Lastly, various new JSON files have
been added for unit testing, assessing the `RunSubmit` API usages
related to different scenarios like dbt task runs, Git source-based job
runs, JAR file runs, and more. These tests will aid in identifying and
addressing potential compatibility issues with the `RunSubmit` API.
* Added group members difference to the output of
`validate-groups-membership` cli command
([#995](#995)). The
`validate-groups-membership` command has been updated to include a
comparison of group memberships at both the account and workspace
levels. This enhancement is implemented through the
`validate_group_membership` function, which has been updated to
calculate the difference in members between the two levels and display
it in a new `group_members_difference` column. This allows for a more
detailed analysis of group memberships and easily identifies any
discrepancies between the account and workspace levels. The
corresponding unit test file, "test_groups.py," has been updated to
include a new test case that verifies the calculation of the
`group_members_difference` value. The functionality of the other
commands remains unchanged. The new `group_members_difference` value is
calculated as the difference in the number of members in the workspace
group and the account group, with a positive value indicating more
members in the workspace group and a negative value indicating more
members in the account group. The table template in the labs.yml file
has also been updated to include the new column for the group membership
difference.
* Added handling for empty `directory_id` if managed identity
encountered during the crawling of StoragePermissionMapping
([#986](#986)). This PR adds
a `type` field to the `StoragePermissionMapping` and `Principal`
dataclasses to differentiate between service principals and managed
identities, allowing `None` for the `directory_id` field if the
principal is not a service principal. During the migration to UC storage
credentials, managed identities are currently ignored. These changes
improve handling of managed identities during the crawling of
`StoragePermissionMapping`, prevent errors when creating storage
credentials with managed identities, and address issue
[#339](#339). The changes
are tested through unit tests, manual testing, and integration tests,
and only affect the `StoragePermissionMapping` class and related
methods, without introducing new commands, workflows, or tables.
* Added migration for Azure Service Principals with secrets stored in
Databricks Secret to UC Storage Credentials
([#874](#874)). In this
release, we have made significant updates to migrate Azure Service
Principals with their secrets stored in Databricks Secret to UC Storage
Credentials, enhancing security and management of storage access. The
changes include: Addition of a new `migrate_credentials` command in the
`labs.yml` file to migrate credentials for storage access to UC storage
credential. Modification of `secrets.py` to handle the case where a
secret has been removed from the backend and to log warning messages for
secrets with invalid Base64 bytes. Introduction of the
`StorageCredentialManager` and `ServicePrincipalMigration` classes in
`credentials.py` to manage Azure Service Principals and their associated
client secrets, and to migrate them to UC Storage Credentials. Addition
of a new `directory_id` attribute in the `Principal` class and its
associated dataclass in `resources.py` to store the directory ID for
creating UC storage credentials using a service principal. Creation of a
new pytest fixture, `make_storage_credential_spn`, in `fixtures.py` to
simplify writing tests requiring Databricks Storage Credentials with
Azure Service Principal auth. Addition of a new test file for the Azure
integration of the project, including new classes, methods, and test
cases for testing the migration of Azure Service Principals to UC
Storage Credentials. These improvements will ensure better security and
management of storage access using Azure Service Principals, while
providing more efficient and robust testing capabilities.
* Added permission migration support for feature tables and the root
permissions for models and feature tables
([#997](#997)). This commit
introduces support for migration of permissions related to feature
tables and sets root permissions for models and feature tables. New
functions such as `feature_store_listing`, `feature_tables_root_page`,
`models_root_page`, and `tokens_and_passwords` have been added to
facilitate population of a workspace access page with necessary
permissions information. The `factory` function in `manager.py` has been
updated to include new listings for models' root page, feature tables'
root page, and the feature store for enhanced management and access
control of models and feature tables. New classes and methods have been
implemented to handle permissions for these resources, utilizing
`GenericPermissionsSupport`, `AccessControlRequest`, and `MigratedGroup`
classes. Additionally, new test methods have been included to verify
feature tables listing functionality and root page listing functionality
for feature tables and registered models. The test manager method has
been updated to include `feature-tables` in the list of items to be
checked for permissions, ensuring comprehensive testing of permission
functionality related to these new feature tables.
* Added support for serving endpoints
([#990](#990)). In this
release, we have made significant enhancements to support serving
endpoints in our open-source library. The `fixtures.py` file in the
`databricks.labs.ucx.mixins` module has been updated with new classes
and functions to create and manage serving endpoints, accompanied by
integration tests to verify their functionality. We have added a new
listing for serving endpoints in the assessment's permissions crawling,
using the `ws.serving_endpoints.list` function and the
`serving-endpoints` category. A new integration test, "test_endpoints,"
has been added to verify that assessments now crawl permissions for
serving endpoints. This test demonstrates the ability to migrate
permissions from one group to another. The test suite has been updated
to ensure the proper functioning of the new feature and improve the
assessment of permissions for serving endpoints, ensuring compatibility
with the updated `test_manager.py` file.
* Expanded end-user documentation with detailed descriptions for
workflows and commands
([#999](#999)). The
Databricks Labs UCX project has been updated with several new features
to assist in upgrading to Unity Catalog, including an assessment
workflow that generates a detailed compatibility report for workspace
entities, a group migration workflow for upgrading all Databricks
workspace assets, and utility commands for managing cross-workspace
installations. The Assessment Report now includes a more detailed
summary of the assessment findings, table counts, database summaries,
and external locations. Additional improvements include expanded
workspace group migration to handle potential conflicts with locally
scoped group names, enhanced documentation for external Hive Metastore
integration, a new debugging notebook, and detailed descriptions of
table upgrade considerations, data access permissions, external storage,
and table crawler.
* Fixed `config.yml` upgrade from very old versions
([#984](#984)). In this
release, we've introduced enhancements to the configuration upgrading
process for `config.yml` in our open-source library. We've replaced the
previous `v1_migrate` class method with a new implementation that
specifically handles migration from version 1. The new method retrieves
the `groups` field, extracts the `selected` value, and assigns it to the
`include_group_names` key in the configuration. The
`backup_group_prefix` value from the `groups` field is assigned to the
`renamed_group_prefix` key, and the `groups` field is removed, with the
version number updated to 2. These changes simplify the code and improve
readability, enabling users to upgrade smoothly from version 1 of the
configuration. Furthermore, we've added new unit tests to the
`test_config.py` file to ensure backward compatibility. Two new tests,
`test_v1_migrate_zeroconf` and `test_v1_migrate_some_conf`, have been
added, utilizing the `MockInstallation` class and loading the
configuration using `WorkspaceConfig`. These tests enhance the
robustness and reliability of the migration process for `config.yml`.
* Renamed columns in assessment SQL queries to use actual names, not
aliases ([#983](#983)). In
this update, we have resolved an issue where aliases used for column
references in SQL queries caused errors in certain setups by renaming
them to use actual names. Specifically, for assessment SQL queries, we
have modified the definition of the `is_delta` column to use the actual
`table_format` name instead of the alias `format`. This change improves
compatibility and enhances the reliability of query execution. As a
software engineer, you will appreciate that this modification ensures
consistent interpretation of column references across various setups,
thereby avoiding potential errors caused by aliases. This change does
not introduce any new methods, but instead modifies existing
functionality to use actual column names, ensuring a more reliable and
consistent SQL query for the `05_0_all_tables` assessment.
* Updated groups permissions validation to use Table ACL cluster
([#979](#979)). In this
update, the `validate_groups_permissions` task has been modified to
utilize the Table ACL cluster, as indicated by the inclusion of
`job_cluster="tacl"`. This task is responsible for ensuring that all
crawled permissions are accurately applied to the destination groups by
calling the `permission_manager.apply_group_permissions` method during
the migration state. This modification enhances the validation of group
permissions by performing it on the Table ACL cluster, potentially
improving performance or functionality. If you are implementing this
project, it is crucial to comprehend the consequences of this change on
your permissions validation process and adjust your workflows
appropriately.

Update databricks-labs-blueprint requirement from ~=0.2.4 to ~=0.3.0 (#1001)

Updates the requirements on
[databricks-labs-blueprint](https://github.com/databrickslabs/blueprint)
to permit the latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/databrickslabs/blueprint/releases">databricks-labs-blueprint's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.0</h2>
<ul>
<li>Added automated upgrade framework (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/50">#50</a>).
This update introduces an automated upgrade framework for managing and
applying upgrades to the product, with a new <code>upgrades.py</code>
file that includes a <code>ProductInfo</code> class having methods for
version handling, wheel building, and exception handling. The test code
organization has been improved, and new test cases, functions, and a
directory structure for fixtures and unit tests have been added for the
upgrades functionality. The <code>test_wheels.py</code> file now checks
the version of the Databricks SDK and handles cases where the version
marker is missing or does not contain the <code>__version__</code>
variable. Additionally, a new <code>Application State Migrations</code>
section has been added to the README, explaining the process of seamless
upgrades from version X to version Z through version Y, addressing the
need for configuration or database state migrations as the application
evolves. Users can apply these upgrades by following an idiomatic usage
pattern involving several classes and functions. Furthermore,
improvements have been made to the <code>_trim_leading_whitespace</code>
function in the <code>commands.py</code> file of the
<code>databricks.labs.blueprint</code> module, ensuring accurate and
consistent removal of leading whitespace for each line in the command
string, leading to better overall functionality and
maintainability.</li>
<li>Added brute-forcing <code>SerdeError</code> with
<code>as_dict()</code> and <code>from_dict()</code> (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/58">#58</a>).
This commit introduces a brute-forcing approach for handling
<code>SerdeError</code> using <code>as_dict()</code> and
<code>from_dict()</code> methods in an open-source library. The new
<code>SomePolicy</code> class demonstrates the usage of these methods
for manual serialization and deserialization of custom classes. The
<code>as_dict()</code> method returns a dictionary representation of the
class instance, and the <code>from_dict()</code> method, decorated with
<code>@classmethod</code>, creates a new instance from the provided
dictionary. Additionally, the GitHub Actions workflow for acceptance
tests has been updated to include the <code>ready_for_review</code>
event type, ensuring that tests run not only for opened and synchronized
pull requests but also when marked as &quot;ready for review.&quot;
These changes provide developers with more control over the
deserialization process and facilitate debugging in cases where default
deserialization fails, but should be used judiciously to avoid brittle
code.</li>
<li>Fixed nightly integration tests run as service principals (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/52">#52</a>).
In this release, we have enhanced the compatibility of our codebase with
service principals, particularly in the context of nightly integration
tests. The <code>Installation</code> class in the
<code>databricks.labs.blueprint.installation</code> module has been
refactored, deprecating the <code>current</code> method and introducing
two new methods: <code>assume_global</code> and
<code>assume_user_home</code>. These methods enable users to install and
manage <code>blueprint</code> as either a global or user-specific
installation. Additionally, the <code>existing</code> method has been
updated to work with the new <code>Installation</code> methods. In the
test suite, the <code>test_installation.py</code> file has been updated
to correctly detect global and user-specific installations when running
as a service principal. These changes improve the testability and
functionality of our software, ensuring seamless operation with service
principals during nightly integration tests.</li>
<li>Made <code>test_existing_installations_are_detected</code> more
resilient (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/51">#51</a>).
In this release, we have added a new test function
<code>test_existing_installations_are_detected</code> that checks if
existing installations are correctly detected and retries the test for
up to 15 seconds if they are not. This improves the reliability of the
test by making it more resilient to potential intermittent failures. We
have also added an import from <code>databricks.sdk.retries</code> named
<code>retried</code> which is used to retry the test function in case of
an <code>AssertionError</code>. Additionally, the test function
<code>test_existing</code> has been renamed to
<code>test_existing_installations_are_detected</code> and the
<code>xfail</code> marker has been removed. We have also renamed the
test function <code>test_dataclass</code> to
<code>test_loading_dataclass_from_installation</code> for better
clarity. This change will help ensure that the library is correctly
detecting existing installations and improve the overall quality of the
codebase.</li>
</ul>
<p>Contributors: <a
href="https://github.com/nfx"><code>@​nfx</code></a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/databrickslabs/blueprint/blob/main/CHANGELOG.md">databricks-labs-blueprint's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.0</h2>
<ul>
<li>Added automated upgrade framework (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/50">#50</a>).
This update introduces an automated upgrade framework for managing and
applying upgrades to the product, with a new <code>upgrades.py</code>
file that includes a <code>ProductInfo</code> class having methods for
version handling, wheel building, and exception handling. The test code
organization has been improved, and new test cases, functions, and a
directory structure for fixtures and unit tests have been added for the
upgrades functionality. The <code>test_wheels.py</code> file now checks
the version of the Databricks SDK and handles cases where the version
marker is missing or does not contain the <code>__version__</code>
variable. Additionally, a new <code>Application State Migrations</code>
section has been added to the README, explaining the process of seamless
upgrades from version X to version Z through version Y, addressing the
need for configuration or database state migrations as the application
evolves. Users can apply these upgrades by following an idiomatic usage
pattern involving several classes and functions. Furthermore,
improvements have been made to the <code>_trim_leading_whitespace</code>
function in the <code>commands.py</code> file of the
<code>databricks.labs.blueprint</code> module, ensuring accurate and
consistent removal of leading whitespace for each line in the command
string, leading to better overall functionality and
maintainability.</li>
<li>Added brute-forcing <code>SerdeError</code> with
<code>as_dict()</code> and <code>from_dict()</code> (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/58">#58</a>).
This commit introduces a brute-forcing approach for handling
<code>SerdeError</code> using <code>as_dict()</code> and
<code>from_dict()</code> methods in an open-source library. The new
<code>SomePolicy</code> class demonstrates the usage of these methods
for manual serialization and deserialization of custom classes. The
<code>as_dict()</code> method returns a dictionary representation of the
class instance, and the <code>from_dict()</code> method, decorated with
<code>@classmethod</code>, creates a new instance from the provided
dictionary. Additionally, the GitHub Actions workflow for acceptance
tests has been updated to include the <code>ready_for_review</code>
event type, ensuring that tests run not only for opened and synchronized
pull requests but also when marked as &quot;ready for review.&quot;
These changes provide developers with more control over the
deserialization process and facilitate debugging in cases where default
deserialization fails, but should be used judiciously to avoid brittle
code.</li>
<li>Fixed nightly integration tests run as service principals (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/52">#52</a>).
In this release, we have enhanced the compatibility of our codebase with
service principals, particularly in the context of nightly integration
tests. The <code>Installation</code> class in the
<code>databricks.labs.blueprint.installation</code> module has been
refactored, deprecating the <code>current</code> method and introducing
two new methods: <code>assume_global</code> and
<code>assume_user_home</code>. These methods enable users to install and
manage <code>blueprint</code> as either a global or user-specific
installation. Additionally, the <code>existing</code> method has been
updated to work with the new <code>Installation</code> methods. In the
test suite, the <code>test_installation.py</code> file has been updated
to correctly detect global and user-specific installations when running
as a service principal. These changes improve the testability and
functionality of our software, ensuring seamless operation with service
principals during nightly integration tests.</li>
<li>Made <code>test_existing_installations_are_detected</code> more
resilient (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/51">#51</a>).
In this release, we have added a new test function
<code>test_existing_installations_are_detected</code> that checks if
existing installations are correctly detected and retries the test for
up to 15 seconds if they are not. This improves the reliability of the
test by making it more resilient to potential intermittent failures. We
have also added an import from <code>databricks.sdk.retries</code> named
<code>retried</code> which is used to retry the test function in case of
an <code>AssertionError</code>. Additionally, the test function
<code>test_existing</code> has been renamed to
<code>test_existing_installations_are_detected</code> and the
<code>xfail</code> marker has been removed. We have also renamed the
test function <code>test_dataclass</code> to
<code>test_loading_dataclass_from_installation</code> for better
clarity. This change will help ensure that the library is correctly
detecting existing installations and improve the overall quality of the
codebase.</li>
</ul>
<h2>0.2.5</h2>
<ul>
<li>Automatically enable workspace filesystem if the feature is disabled
(<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/42">#42</a>).</li>
</ul>
<h2>0.2.4</h2>
<ul>
<li>Added more integration tests for <code>Installation</code> (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/39">#39</a>).</li>
<li>Fixed <code>yaml</code> optional import error (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/38">#38</a>).</li>
</ul>
<h2>0.2.3</h2>
<ul>
<li>Added special handling for notebooks in
<code>Installation.upload(...)</code> (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/36">#36</a>).</li>
</ul>
<h2>0.2.2</h2>
<ul>
<li>Fixed issues with uploading wheels to DBFS and loading a
non-existing install state (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/34">#34</a>).</li>
</ul>
<h2>0.2.1</h2>
<ul>
<li>Aligned <code>Installation</code> framework with UCX project (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/32">#32</a>).</li>
</ul>
<h2>0.2.0</h2>
<ul>
<li>Added common install state primitives with strong typing (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/27">#27</a>).</li>
<li>Added documentation for Invoking Databricks Connect (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/28">#28</a>).</li>
<li>Added more documentation for Databricks CLI command router (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/30">#30</a>).</li>
<li>Enforced <code>pylint</code> standards (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/29">#29</a>).</li>
</ul>
<h2>0.1.0</h2>
<ul>
<li>Changed python requirement from 3.10.6 to 3.10 (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/25">#25</a>).</li>
</ul>
<h2>0.0.6</h2>
<ul>
<li>Make <code>find_project_root</code> more deterministic (<a
href="https://redirect.github.com/databrickslabs/blueprint/pull/23">#23</a>).</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/905e5ff5303a005d48bc98d101a613afeda15d51"><code>905e5ff</code></a>
Release v0.3.0 (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/59">#59</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/a029f6bb1ecf807017754e298ea685326dbedf72"><code>a029f6b</code></a>
Added brute-forcing <code>SerdeError</code> with <code>as_dict()</code>
and <code>from_dict()</code> (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/58">#58</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/c8a74f4129b4592d365aac9670eb86069f3517f7"><code>c8a74f4</code></a>
Added automated upgrade framework (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/50">#50</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/24e62ef4f060e43e02c92a7d082d95e8bc164317"><code>24e62ef</code></a>
Don't run integration tests on draft pull requests (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/55">#55</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/b4dd5abf4eaf8d022ae0b6ec7e659296ec3d2f37"><code>b4dd5ab</code></a>
Added tokei.rs badge (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/54">#54</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/01d9467f425763ab08035001270593253bce11f0"><code>01d9467</code></a>
Fixed nightly integration tests run as service principals (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/52">#52</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/aa5714179c65be8e13f54601e1d1fcd70548342d"><code>aa57141</code></a>
Made <code>test_existing_installations_are_detected</code> more
resilient (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/51">#51</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/9cbc6f863d3ea06659f37939cf1b97115dd873bd"><code>9cbc6f8</code></a>
Bump <code>databrickslabs/sandbox/acceptance</code> to v0.1.0 (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/48">#48</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/22fc1a8787b8e98de03048595202f88b7ddb9b94"><code>22fc1a8</code></a>
Use <code>databrickslabs/sandbox/acceptance</code> action (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/45">#45</a>)</li>
<li><a
href="https://github.com/databrickslabs/blueprint/commit/c7e47abd82b2f04e95b1d91f346cc1ea6df43961"><code>c7e47ab</code></a>
Release v0.2.5 (<a
href="https://redirect.github.com/databrickslabs/blueprint/issues/44">#44</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/databrickslabs/blueprint/compare/v0.2.4...v0.3.0">compare
view</a></li>
</ul>
</details>
<br />

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Run integration tests only for pull requests ready for review (#1002)

Tested on https://github.com/databrickslabs/blueprint

Reducing flakiness of create account groups (#1003)

Prompt user if Terraform utilised for deploying infrastructure (#1004)

Added prompt is_terraform_used and updated the same in the config of
WorkspaceInstaller

Resolves #393

---------

Co-authored-by: Serge Smertin <259697+nfx@users.noreply.github.com>

Update CONTRIBUTING.md (#1005)

Closes #850
author Vuong <vuong.nguyen@databricks.com> 1709738765 +0000
committer Vuong <vuong.nguyen@databricks.com> 1709812255 +0000

parent 7735a71
author Vuong <vuong.nguyen@databricks.com> 1709738765 +0000
committer Vuong <vuong.nguyen@databricks.com> 1709812237 +0000

parent 7735a71
author Vuong <vuong.nguyen@databricks.com> 1709738765 +0000
committer Vuong <vuong.nguyen@databricks.com> 1709812227 +0000

parent 7735a71
author Vuong <vuong.nguyen@databricks.com> 1709738765 +0000
committer Vuong <vuong.nguyen@databricks.com> 1709812214 +0000

parent 7735a71
author Vuong <vuong.nguyen@databricks.com> 1709738765 +0000
committer Vuong <vuong.nguyen@databricks.com> 1709812198 +0000

make fmt

Added `upgraded_from_workspace_id` property to migrated tables to indicated the source workspace. (#987)

Added table parameter `upgraded_from_ws` to migrated tables. The
parameters contains the sources workspace id.

Resolves #899

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [x] manually tested
- [x] added unit tests
- [x] added integration tests
- [x] verified on staging environment (screenshot attached)

Added group members difference to the output of `validate-groups-membership` cli command (#995)

The `validate-groups-membership` command has been updated to include a
comparison of group memberships at both the account and workspace
levels, displaying the difference in members between the two levels in a
new column. This enhancement allows for a more detailed analysis of
group memberships, with the added functionality implemented in the
`validate_group_membership` function in the `groups.py` file located in
the `databricks/labs/ucx/workspace_access` directory. A new output
field, "group\_members\_difference," has been added to represent the
difference in the number of members between a workspace group and an
associated account group. The corresponding unit test file,
"test\_groups.py," has been updated to include a new test case that
verifies the calculation of the "group\_members\_difference" value. This
change provides users with a more comprehensive view of their group
memberships and allows them to easily identify any discrepancies between
the account and workspace levels. The functionality of the other
commands remains unchanged.

Improved installation integration test flakiness (#998)

- improved `_infer_error_from_job_run` and `_infer_error_from_task_run`
to also catch `KeyError` and `ValueError`
- removed retries for `Unknown` errors for installation tests

Expanded end-user documentation with detailed descriptions for workflows and commands (#999)

The Databricks Labs UCX project has been updated with several new
features to assist in upgrading to Unity Catalog. These include various
workflows and command-line utilities, such as an assessment workflow
that generates a detailed compatibility report for workspace entities
and a group migration workflow to upgrade all Databricks workspace
assets. Additionally, new utility commands have been added for managing
cross-workspace installations, and users can now view deployed
workflows' status and repair failed workflows. A new end-user
documentation has also been introduced, featuring comprehensive
descriptions of workflows, commands, and an assessment report image. The
Assessment Report, generated from UCX tools, now includes a more
detailed summary of the assessment findings, table counts, database
summaries, and external locations. Improved documentation for external
Hive Metastore integration and a new debugging notebook are also
included in this release. Lastly, the workspace group migration feature
has been expanded to handle potential conflicts when migrating multiple
workspaces with locally scoped group names.

Release v0.14.0 (#1000)

* Added `upgraded_from_workspace_id` property to migrated tables to
indicated the source workspace
([#987](#987)). In this
release, updates have been made to the `_migrate_external_table`,
`_migrate_dbfs_root_table`, and `_migrate_view` methods in the
`table_migrate.py` file to include a new parameter `upgraded_from_ws` in
the SQL commands used to alter tables, views, or managed tables. This
parameter is used to store the source workspace ID in the migrated
tables, indicating the migration origin. A new utility method
`sql_alter_from` has been added to the `Table` class in `tables.py` to
generate the SQL command with the new parameter. Additionally, a new
class-level attribute `UPGRADED_FROM_WS_PARAM` has been added to the
`Table` class in `tables.py` to indicate the source workspace. A new
property `upgraded_from_workspace_id` has been added to migrated tables
to store the source workspace ID. These changes resolve issue
[#899](#899) and are tested
through manual testing, unit tests, and integration tests. No new CLI
commands, workflows, or tables have been added or modified, and there
are no changes to user documentation.
* Added a command to create account level groups if they do not exist
([#763](#763)). This commit
introduces a new feature that enables the creation of account-level
groups if they do not already exist in the account. A new command,
`create-account-groups`, has been added to the `databricks labs ucx`
tool, which crawls all workspaces in the account and creates
account-level groups if a corresponding workspace-local group is not
found. The feature supports various scenarios, including creating
account-level groups that exist in some workspaces but not in others,
and creating multiple account-level groups with the same name but
different members. Several new methods have been added to the
`account.py` file to support the new feature, and the `test_account.py`
file has been updated with new tests to ensure the correct behavior of
the `create_account_level_groups` method. Additionally, the `cli.py`
file has been updated to include the new `create-account-groups`
command. With these changes, users can easily manage account-level
groups and ensure that they are consistent across all workspaces in the
account, improving the overall user experience.
* Added assessment for the incompatible `RunSubmit` API usages
([#849](#849)). In this
release, the assessment functionality for incompatible `RunSubmit` API
usages has been significantly enhanced through various changes. The
'clusters.py' file has seen improvements in clarity and consistency with
the renaming of private methods `check_spark_conf` to
`_check_spark_conf` and `check_cluster_failures` to
`_check_cluster_failures`. The `_assess_clusters` method has been
updated to call the renamed `_check_cluster_failures` method for
thorough checks of cluster configurations, resulting in better
assessment functionality. A new `SubmitRunsCrawler` class has been added
to the `databricks.labs.ucx.assessment.jobs` module, implementing
`CrawlerBase`, `JobsMixin`, and `CheckClusterMixin` classes. This class
crawls and assesses job runs based on their submitted runs, ensuring
compatibility and identifying failure issues. Additionally, a new
configuration attribute, `num_days_submit_runs_history`, has been
introduced in the `WorkspaceConfig` class of the `config.py` module,
controlling the number of days for which submission history of
`RunSubmit` API calls is retained. Lastly, various new JSON files have
been added for unit testing, assessing the `RunSubmit` API usages
related to different scenarios like dbt task runs, Git source-based job
runs, JAR file runs, and more. These tests will aid in identifying and
addressing potential compatibility issues with the `RunSubmit` API.
* Added group members difference to the output of
`validate-groups-membership` cli command
([#995](#995)). The
`validate-groups-membership` command has been updated to include a
comparison of group memberships at both the account and workspace
levels. This enhancement is implemented through the
`validate_group_membership` function, which has been updated to
calculate the difference in members between the two levels and display
it in a new `group_members_difference` column. This allows for a more
detailed analysis of group memberships and easily identifies any
discrepancies between the account and workspace levels. The
corresponding unit test file, "test_groups.py," has been updated to
include a new test case that verifies the calculation of the
`group_members_difference` value. The functionality of the other
commands remains unchanged. The new `group_members_difference` value is
calculated as the difference in the number of members in the workspace
group and the account group, with a positive value indicating more
members in the workspace group and a negative value indicating more
members in the account group. The table template in the labs.yml file
has also been updated to include the new column for the group membership
difference.
* Added handling for empty `directory_id` if managed identity
encountered during the crawling of StoragePermissionMapping
([#986](#986)). This PR adds
a `type` field to the `StoragePermissionMapping` and `Principal`
dataclasses to differentiate between service principals and managed
identities, allowing `None` for the `directory_id` field if the
principal is not a service principal. During the migration to UC storage
credentials, managed identities are currently ignored. These changes
improve handling of managed identities during the crawling of
`StoragePermissionMapping`, prevent errors when creating storage
credentials with managed identities, and address issue
[#339](#339). The changes
are tested through unit tests, manual testing, and integration tests,
and only affect the `StoragePermissionMapping` class and related
methods, without introducing new commands, workflows, or tables.
* Added migration for Azure Service Principals with secrets stored in
Databricks Secret to UC Storage Credentials
([#874](#874)). In this
release, we have made significant updates to migrate Azure Service
Principals with their secrets stored in Databricks Secret to UC Storage
Credentials, enhancing security and management of storage access. The
changes include: Addition of a new `migrate_credentials` command in the
`labs.yml` file to migrate credentials for storage access to UC storage
credential. Modification of `secrets.py` to handle the case where a
secret has been removed from the backend and to log warning messages for
secrets with invalid Base64 bytes. Introduction of the
`StorageCredentialManager` and `ServicePrincipalMigration` classes in
`credentials.py` to manage Azure Service Principals and their associated
client secrets, and to migrate them to UC Storage Credentials. Addition
of a new `directory_id` attribute in the `Principal` class and its
associated dataclass in `resources.py` to store the directory ID for
creating UC storage credentials using a service principal. Creation of a
new pytest fixture, `make_storage_credential_spn`, in `fixtures.py` to
simplify writing tests requiring Databricks Storage Credentials with
Azure Service Principal auth. Addition of a new test file for the Azure
integration of the project, including new classes, methods, and test
cases for testing the migration of Azure Service Principals to UC
Storage Credentials. These improvements will ensure better security and
management of storage access using Azure Service Principals, while
providing more efficient and robust testing capabilities.
* Added permission migration support for feature tables and the root
permissions for models and feature tables
([#997](#997)). This commit
introduces support for migration of permissions related to feature
tables and sets root permissions for models and feature tables. New
functions such as `feature_store_listing`, `feature_tables_root_page`,
`models_root_page`, and `tokens_and_passwords` have been added to
facilitate population of a workspace access page with necessary
permissions information. The `factory` function in `manager.py` has been
updated to include new listings for models' root page, feature tables'
root page, and the feature store for enhanced management and access
control of models and feature tables. New classes and methods have been
implemented to handle permissions for these resources, utilizing
`GenericPermissionsSupport`, `AccessControlRequest`, and `MigratedGroup`
classes. Additionally, new test methods have been included to verify
feature tables listing functionality and root page listing functionality
for feature tables and registered models. The test manager method has
been updated to include `feature-tables` in the list of items to be
checked for permissions, ensuring comprehensive testing of permission
functionality related to these new feature tables.
* Added support for serving endpoints
([#990](#990)). In this
release, we have made significant enhancements to support serving
endpoints in our open-source library. The `fixtures.py` file in the
`databricks.labs.ucx.mixins` module has been updated with new classes
and functions to create and manage serving endpoints, accompanied by
integration tests to verify their functionality. We have added a new
listing for serving endpoints in the assessment's permissions crawling,
using the `ws.serving_endpoints.list` function and the
`serving-endpoints` category. A new integration test, "test_endpoints,"
has been added to verify that assessments now crawl permissions for
serving endpoints. This test demonstrates the ability to migrate
permissions from one group to another. The test suite has been updated
to ensure the proper functioning of the new feature and improve the
assessment of permissions for serving endpoints, ensuring compatibility
with the updated `test_manager.py` file.
* Expanded end-user documentation with detailed descriptions for
workflows and commands
([#999](#999)). The
Databricks Labs UCX project has been updated with several new features
to assist in upgrading to Unity Catalog, including an assessment
workflow that generates a detailed compatibility report for workspace
entities, a group migration workflow for upgrading all Databricks
workspace assets, and utility commands for managing cross-workspace
installations. The Assessment Report now includes a more detailed
summary of the assessment findings, table counts, database summaries,
and external locations. Additional improvements include expanded
workspace group migration to handle potential conflicts with locally
scoped group names, enhanced documentation for external Hive Metastore
integration, a new debugging notebook, and detailed descriptions of
table upgrade considerations, data access permissions, external storage,
and table crawler.
* Fixed `config.yml` upgrade from very old versions
([#984](#984)). In this
release, we've introduced enhancements to the configuration upgrading
process for `config.yml` in our open-source library. We've replaced the
previous `v1_migrate` class method with a new implementation that
specifically handles migration from version 1. The new method retrieves
the `groups` field, extracts the `selected` value, and assigns it to the
`include_group_names` key in the configuration. The
`backup_group_prefix` value from the `groups` field is assigned to the
`renamed_group_prefix` key, and the `groups` field is removed, with the
version number updated to 2. These changes simplify the code and improve
readability, enabling users to upgrade smoothly from version 1 of the
configuration. Furthermore, we've added new unit tests to the
`test_config.py` file to ensure backward compatibility. Two new tests,
`test_v1_migrate_zeroconf` and `test_v1_migrate_some_conf`, have been
added, utilizing the `MockInstallation` class and loading the
configuration using `WorkspaceConfig`. These tests enhance the
robustness and reliability of the migration process for `config.yml`.
* Renamed columns in assessment SQL queries to use actual names, not
aliases ([#983](#983)). In
this update, we have resolved an issue where aliases used for column
references in SQL queries caused errors in certain setups by renaming
them to use actual names. Specifically, for assessment SQL queries, we
have modified the definition of the `is_delta` column to use the actual
`table_format` name instead of the alias `format`. This change improves
compatibility and enhances the reliability of query execution. As a
software engineer, you will appreciate that this modification ensures
consistent interpretation of column references across various setups,
thereby avoiding potential errors caused by aliases. This change does
not introduce any new methods, but instead modifies existing
functionality to use actual column names, ensuring a more reliable and
consistent SQL query for the `05_0_all_tables` assessment.
* Updated groups permissions validation to use Table ACL cluster
([#979](#979)). In this
update, the `validate_groups_permissions` task has been modified to
utilize the Table ACL cluster, as indicated by the inclusion of
`job_cluster="tacl"`. This task is responsible for ensuring that all
crawled permissions are accurately applied to the destination groups by
calling the `permission_manager.apply_group_permissions` method during
the migration state. This modification enhances the validation of group
permissions by performing it on the Table ACL cluster, potentially
improving performance or functionality. If you are implementing this
project, it is crucial to comprehend the consequences of this change on
your permissions validation process and adjust your workflows
appropriately.

Run integration tests only for pull requests ready for review (#1002)

Tested on https://github.com/databrickslabs/blueprint

Reducing flakiness of create account groups (#1003)

Prompt user if Terraform utilised for deploying infrastructure (#1004)

Added prompt is_terraform_used and updated the same in the config of
WorkspaceInstaller

Resolves #393

---------

Co-authored-by: Serge Smertin <259697+nfx@users.noreply.github.com>

Update CONTRIBUTING.md (#1005)

Closes #850

Fix gitguardian warning caused by "hello world" secret used in unit test (#1010)

Replace the plain encoded string by base64.b64encode to mitigate the
gitguardian warning.

<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

Resolves #..

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [ ] manually tested
- [ ] added unit tests
- [ ] added integration tests
- [ ] verified on staging environment (screenshot attached)

Create UC external locations in Azure based on migrated storage credentials (#992)

Handle widget delete on upgrade platform bug (#1011)

Deprecate legacy installer (#1014)

<img width="799" alt="image"
src="https://github.com/databrickslabs/ucx/assets/259697/2aa5fed6-5734-44c2-87bc-39fbc214d5fa">

Automatically upgrade existing installations to avoid breaking changes (#985)

This PR incorporates the work from
databrickslabs/blueprint#50, which enables
smoother cross-version upgrades.

Fix #471

Added missing documentation for `create-uber-principal` command (#1015)

Add `migrate-locations` command (#1016)

Add cli command `migrate_locations` to create UC external location.

<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [ ] manually tested
- [ ] added unit tests
- [ ] added integration tests
- [ ] verified on staging environment (screenshot attached)

Fix document for `migrate-locations` command (#1017)

<!-- Summary of your changes that are easy to understand. Add
screenshots when necessary -->

<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

- [ ] added relevant user documentation
- [ ] added new CLI command
- [ ] modified existing command: `databricks labs ucx ...`
- [ ] added a new workflow
- [ ] modified existing workflow: `...`
- [ ] added a new table
- [ ] modified existing table: `...`

<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [ ] manually tested
- [ ] added unit tests
- [ ] added integration tests
- [ ] verified on staging environment (screenshot attached)

Make code more readable by enforcing `max-nested-blocks = 3` with `pylint` (#1018)

No logic changes, just for readability and to spare code reviewer's
sanity.

Added AWS S3 support for `migrate-locations` command (#1009)

Release v0.15.0 (#1020)

* Added AWS S3 support for `migrate-locations` command
([#1009](#1009)). In this
release, the open-source library has been enhanced with AWS S3 support
for the `migrate-locations` command, enabling efficient and secure
management of S3 data. The new functionality includes the identification
of missing S3 prefixes and the creation of corresponding roles and
policies through the addition of methods `_identify_missing_paths`,
`_get_existing_credentials_dict`, and `create_external_locations`. The
library now also includes new classes `AwsIamRole`,
`ExternalLocationInfo`, and `StorageCredentialInfo` for better handling
of AWS-related functionality. Additionally, two new tests,
`test_create_external_locations` and
`test_create_external_locations_skip_existing`, have been added to
ensure the correct behavior of the new AWS-related functionality. The
new test function `test_migrate_locations_aws` checks the AWS-specific
implementation of the `migrate-locations` command, while
`test_missing_aws_cli` verifies the correct error message is displayed
when the AWS CLI is not found in the system path. These changes enhance
the library's capabilities, improving data security, privacy, and
overall performance for users working with AWS S3.
* Added `databricks labs ucx create-uber-principal` command to create
Azure Service Principal for migration
([#976](#976)). The new CLI
command, `databricks labs ucx create-uber-principal`, has been
introduced to create an Azure Service Principal (SPN) and grant it
STORAGE BLOB READER access on all the storage accounts used by the
tables in the workspace. The SPN information is then stored in the UCX
cluster policy. A new class, AzureApiClient, has been added to isolate
Azure API calls, and unit and integration tests have been included to
verify the functionality. This development enhances migration
capabilities for Azure workspaces, providing a more streamlined and
automated way to create and manage Service Principals, and improves the
functionality and usability of the UCX tool. The changes are
well-documented and follow the project's coding standards.
* Added `migrate-locations` command
([#1016](#1016)). In this
release, we've added a new CLI command, `migrate_locations`, to create
Unity Catalog (UC) external locations. This command extracts candidates
for location creation from the `guess_external_locations` assessment
task and checks if corresponding UC Storage Credentials exist before
creating the locations. Currently, the command only supports Azure, with
plans to add support for AWS and GCP in the future. The
`migrate_locations` function is marked with the `ucx.command` decorator
and is available as a command-line interface (CLI) command. The pull
request also includes unit tests for this new command, which check the
environment (Azure, AWS, or GCP) before executing the migration and log
a message if the environment is AWS or GCP, indicating that the
migration is not yet supported on those platforms. No changes have been
made to existing workflows, commands, or tables.
* Added handling for widget delete on upgrade platform bug
([#1011](#1011)). In this
release, the `_install_dashboard` method in `dashboards.py` has been
updated to handle a platform bug that occurred during the deletion of
dashboard widgets during an upgrade process (issue
[#1011](#1011)). Previously,
the method attempted to delete each widget using the
`self._ws.dashboard_widgets.delete(widget.id)` command, which resulted
in a `TypeError` when attempting to delete a widget. The updated method
now includes a try/except block that catches this `TypeError` and logs a
warning message, while also tracking the issue under bug ES-1061370. The
rest of the method remains unchanged, creating a dashboard with the
given name, role, and parent folder ID if no widgets are present. This
enhancement improves the robustness of the `_install_dashboard` method
by adding error handling for the SDK API response when deleting
dashboard widgets, ensuring a smoother upgrade process.
* Create UC external locations in Azure based on migrated storage
credentials ([#992](#992)).
The `locations.py` file in the `databricks.labs.ucx.azure` package has
been updated to include a new class `ExternalLocationsMigration`, which
creates UC external locations in Azure based on migrated storage
credentials. This class takes various arguments, including
`WorkspaceClient`, `HiveMetastoreLocations`, `AzureResourcePermissions`,
and `AzureResources`. It has a `run()` method that lists any missing
external locations in UC, extracts their location URLs, and attempts to
create a UC external location with a mapped storage credential name if
the missing external location is in the mapping. The class also includes
helper methods for generating credential name mappings. Additionally,
the `resources.py` file in the same package has been modified to include
a new method `managed_identity_client_id`, which retrieves the client ID
of a managed identity associated with a given access connector. Test
functions for the `ExternalLocationsMigration` class and Azure external
locations functionality have been added in the new file
`test_locations.py`. The `test_resources.py` file has been updated to
include tests for the `managed_identity_client_id` method. A new
`mappings.json` file has also been added for tests related to Azure
external location mappings based on migrated storage credentials.
* Deprecate legacy installer
([#1014](#1014)). In this
release, we have deprecated the legacy installer for the UCX project,
which was previously implemented as a bash script. A warning message has
been added to inform users about the deprecation and direct them to the
UCX installation instructions. The functionality of the script remains
unchanged, and it still performs tasks such as installing Python
dependencies and building Python bindings. The script will eventually be
replaced with the `databricks labs install ucx` command. This change is
part of issue [#1014](#1014)
and is intended to streamline the installation process and improve the
overall user experience. We recommend that users update their
installation process to the new recommended method as soon as possible
to avoid any issues with the legacy installer in the future.
* Prompt user if Terraform utilised for deploying infrastructure
([#1004](#1004)). In this
update, the `config.py` file has been modified to include a new
attribute, `is_terraform_used`, in the `WorkspaceConfig` class. This
boolean flag indicates whether Terraform has been used for deploying
certain entities in the workspace. Issue
[#393](#393) has been
addressed with this change. The `WorkspaceInstaller` configuration has
also been updated to take advantage of this new attribute, allowing
developers to determine if Terraform was used for infrastructure
deployment, thereby increasing visibility into the deployment process.
Additionally, a new prompt has been added to the `warehouse_type`
function to ascertain if Terraform is being utilized for infrastructure
deployment, setting the `is_terraform_used` variable to True if it is.
This improvement is intended for software engineers adopting this
open-source library.
* Updated CONTRIBUTING.md
([#1005](#1005)). In this
contribution to the open-source library, the CONTRIBUTING.md file has
been significantly updated with clearer instructions on how to
effectively contibute to the project. The previous command to print the
Python path has been removed, as the IDE is now advised to be configured
to use the Python interpreter from the virtual environment. A new step
has been added, recommending the use of a consistent styleguide and
formatting of the code before every commit. Moreover, it is now
encouraged to run tests before committing to minimize potential issues
during the review process. The steps on how to make a Fork from the ucx
repo and create a PR have been updated with links to official
documentation. Lastly, the commit now includes information on handling
dependency errors that may occur after `git pull`.
* Updated databricks-labs-blueprint requirement from ~=0.2.4 to ~=0.3.0
([#1001](#1001)). In this
pull request update, the requirements file, pyproject.toml, has been
modified to upgrade the databricks-labs-blueprint package from version
~0.2.4 to ~0.3.0. This update integrates the latest features and bug
fixes of the package, including an automated upgrade framework, a
brute-forcing approach for handling SerdeError, and enhancements for
running nightly integration tests with service principals. These
improvements increase the testability and functionality of the software,
ensuring its stable operation with service principals during nightly
integration tests. Furthermore, the reliability of the test for
detecting existing installations has been reinforced by adding a new
test function that checks for the correct detection of existing
installations and retries the test for up to 15 seconds if they are not.

Dependency updates:

* Updated databricks-labs-blueprint requirement from ~=0.2.4 to ~=0.3.0
([#1001](#1001)).
@nkvuong nkvuong force-pushed the feature/aws-instance-profile-to-storage-credential branch from 5c6e5d4 to 3a6f69d Compare March 7, 2024 11:53
…ential

# Conflicts:
#	src/databricks/labs/ucx/assessment/aws.py
#	src/databricks/labs/ucx/config.py
#	src/databricks/labs/ucx/mixins/fixtures.py
#	tests/unit/test_cli.py
@nkvuong nkvuong marked this pull request as ready for review March 7, 2024 12:02
@nkvuong nkvuong requested a review from a team March 7, 2024 12:02
mocker.patch("shutil.which", return_value=True)
ws.config.is_azure = False
ws.config.is_aws = True
uc_trust_policy = mocker.patch(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mocker.patch("databricks. is prohibited. It makes tests not Easy To Change (ETC). Use constructor injection instead

See https://www.fugue.co/blog/2017-07-18-revisiting-unit-testing-and-mocking-in-python.html

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this one is tricky for cli commands, as we only have WorkspaceClient. Everything else is initialised inside the function, so we have to patch it that way, similar to

aws_resource = mocker.patch("databricks.labs.ucx.assessment.aws.AWSResourcePermissions.for_cli")

uc_trust_policy = mocker.patch(
"databricks.labs.ucx.assessment.aws.AWSResourcePermissions.update_uc_role_trust_policy"
)
with patch("databricks.labs.blueprint.tui.Prompts.confirm", return_value=True):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

@nkvuong nkvuong Mar 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we are not injecting Prompts into cli commands at the moment, so will need to update that in blueprint to able to MockPrompts? separate PR for that?

ws.config.is_azure = False
ws.config.is_aws = True
migrate_credentials(ws)
assert any({"AWS Profile is not specified." in message for message in caplog.messages})
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this will give cryptic error message when failed. do exact string matches - assert "..." in caplog.messages

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

)
role_id += 1

def update_uc_role_trust_policy(self, role_name, external_id="0000"):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's document type parameters for public methods for parameters and return types. it'll help to avoid bugs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

role_arn: str
validated_on: str
read_only: bool
failures: list[str] | None = None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this translate well to CSV, btw?

failures: list[str] | None = None


class AWSStorageCredentialManager:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class AWSStorageCredentialManager:
class CredentialManager:

keep it DRY - we're already in aws package



@dataclass
class AWSStorageCredentialValidationResult:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class AWSStorageCredentialValidationResult:
class CredentialValidationResult:

keep it DRY (Don't Repeat Yourself)

Comment on lines 157 to 159
logger.info(
f"IAM Role ARN: {iam.role_arn} : " f"privilege {iam.privilege} " f"on location {iam.resource_path}"
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
logger.info(
f"IAM Role ARN: {iam.role_arn} : " f"privilege {iam.privilege} " f"on location {iam.resource_path}"
)
logger.info(f"{iam.role_arn}: {iam.privilege} on {iam.resource_path}")

be more concise

Comment on lines 1109 to 1113
azure_service_principal = AzureServicePrincipal(
directory_id,
application_id,
client_secret,
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
azure_service_principal = AzureServicePrincipal(
directory_id,
application_id,
client_secret,
)
azure_service_principal = AzureServicePrincipal(directory_id, application_id, client_secret)

'role_arn': env_or_skip("TEST_IAM_ROLE"),
'resource_type': 's3',
'privilege': "READ_FILES" if read_only else "WRITE_FILES",
'resource_path': 's3://labsawsbucket/',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also make env var from it

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Copy link
Collaborator

@nfx nfx left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@nfx nfx added the ready to merge this pull request is ready to merge label Mar 8, 2024
@nkvuong
Copy link
Contributor Author

nkvuong commented Mar 8, 2024

Failed acceptance test passed locally
image

@nfx nfx merged commit dbdebb8 into main Mar 8, 2024
6 of 7 checks passed
@nfx nfx deleted the feature/aws-instance-profile-to-storage-credential branch March 8, 2024 17:28
nfx added a commit that referenced this pull request Mar 8, 2024
* Added AWS IAM roles support to `databricks labs ucx migrate-credentials` command ([#973](#973)). This commit adds AWS Identity and Access Management (IAM) roles support to the `databricks labs ucx migrate-credentials` command, resolving issue [#862](#862) and being related to pull request [#874](#874). It includes the addition of a `load` function to `AWSResourcePermissions` to return identified instance profiles and the creation of an `IamRoleMigration` class under `aws/credentials.py` to migrate identified AWS instance profiles. Additionally, user documentation and a new CLI command `databricks labs ucx migrate-credentials` have been added, and the changes have been thoroughly tested with manual, unit, and integration tests. The functionality additions include new methods such as `add_uc_role_policy` and `update_uc_trust_role`, among others, designed to facilitate the migration process for AWS IAM roles.
* Added `create-catalogs-schemas` command to prepare destination catalogs and schemas before table migration ([#1028](#1028)). The Databricks Labs Unity Catalog (UCX) tool has been updated with a new `create-catalogs-schemas` command to facilitate the creation of destination catalogs and schemas prior to table migration. This command should be executed after the `create-table-mapping` command and is designed to prepare the workspace for migrating tables to UC. Additionally, a new `CatalogSchema` class has been added to the `hive_metastore` package to manage the creation of catalogs and schemas in the Hive metastore. This new functionality simplifies the process of preparing the destination Hive metastore for table migration, reducing the likelihood of user errors and ensuring that the metastore is properly configured. Unit tests have been added to the `tests/unit/hive_metastore` directory to verify the behavior of the `CatalogSchema` class and the new `create-catalogs-schemas` command. This command is intended for use in contexts where GCP is not supported.
* Added automated upgrade option to set up cluster policy ([#1024](#1024)). This commit introduces an automated upgrade option for setting up a cluster policy for older versions of UCX, separating the cluster creation policy from install.py to installer.policy.py and adding an upgrade script for older UCX versions. A new class, `ClusterPolicyInstaller`, is added to the `policy.py` file in the `installer` package to manage the creation and update of a Databricks cluster policy for Unity Catalog Migration. This class handles creating a new cluster policy with specific configurations, extracting external Hive Metastore configurations, and updating job policies. Additionally, the commit includes refactoring, removal of library references, and a new script, v0.15.0_added_cluster_policy.py, which contains the upgrade function. The changes are tested through manual and automated testing with unit tests and integration tests. This feature is intended for software engineers working with the project.
* Added crawling for init scripts on local files to assessment workflow ([#960](#960)). This commit introduces the ability to crawl init scripts stored on local files and S3 as part of the assessment workflow, resolving issue [#9](#9)
* Added database filter for the `assessment` workflow ([#989](#989)). In this release, we have added a new configuration option, `include_databases`, to the assessment workflow which allows users to specify a list of databases to include for migration, rather than crawling all the databases in the Hive Metastore. This feature is implemented in the `TablesCrawler`, `UdfsCrawler`, `GrantsCrawler` classes and the associated functions such as `_all_databases`, `getIncludeDatabases`, `_select_databases`. These changes aim to improve efficiency and reduce unnecessary crawling, and are accompanied by modifications to existing functionality, as well as the addition of unit and integration tests. The changes have been manually tested and verified on a staging environment.
* Estimate migration effort based on assessment database ([#1008](#1008)). In this release, a new functionality has been added to estimate the migration effort for each asset in the assessment database. The estimation is presented in days and is displayed on a new estimates dashboard with a summary widget for a global estimate per object type, along with assumptions and scope for each object type. A new `query` parameter has been added to the `SimpleQuery` class to support this feature. Additional changes include the update of the `_install_viz` and `_install_query` methods, the inclusion of the `data_source_id` in the query metadata, and the addition of tests to ensure the proper functioning of the new feature. A new fixture, `mock_installation_with_jobs`, has been added to support testing of the assessment estimates dashboard.
* Explicitly write to `hive_metastore` from `crawl_tables` task ([#1021](#1021)). In this release, we have improved the clarity and specificity of our handling of the `hive_metastore` in the `crawl_tables` task. Previously, the `df.write.saveAsTable` method was used without explicitly specifying the `hive_metastore` database, which could result in ambiguity. To address this issue, we have updated the `saveAsTable` method to include the `hive_metastore` database, ensuring that tables are written to the correct location in the Hive metastore. These changes are confined to the `src/databricks/labs/ucx/hive_metastore/tables.scala` file and affect the `crawl_tables` task. While no new methods have been added, the existing `saveAsTable` method has been modified to enhance the accuracy and predictability of our interaction with the Hive metastore.
* Improved documentation for `databricks labs ucx move` command ([#1025](#1025)). The `databricks labs ucx move` command has been updated with new improvements to its documentation, providing enhanced clarity and ease of use for developers and administrators. This command facilitates the movement of UC tables/table(s) from one schema to another, either in the same or different catalog, during the table upgrade process. A significant enhancement is the preservation of the source table's permissions when moving to a new schema or catalog, maintaining the original table's access controls, simplifying the management of table permissions, and streamlining the migration process. These improvements aim to facilitate a more efficient table migration experience, ensuring that developers and administrators can effectively manage their UC tables while maintaining the desired level of access control and security.
* Updated databricks-sdk requirement from ~=0.20.0 to ~=0.21.0 ([#1030](#1030)). In this update, the `databricks-sdk` package requirement has been updated to version `~=0.21.0` from `~=0.20.0`. This new version addresses several bugs and provides enhancements, including the fix for the `get_workspace_client` method in GCP, the use of the `all-apis` scope with the external browser, and an attempt to initialize all Databricks globals. Moreover, the API's settings nesting approach has changed, which may cause compatibility issues with previous versions. Several new services and dataclasses have been added to the API, and documentation and examples have been updated accordingly. There are no updates to the `databricks-labs-blueprint` and `PyYAML` dependencies in this commit.
@nfx nfx mentioned this pull request Mar 8, 2024
nfx added a commit that referenced this pull request Mar 8, 2024
* Added AWS IAM roles support to `databricks labs ucx
migrate-credentials` command
([#973](#973)). This commit
adds AWS Identity and Access Management (IAM) roles support to the
`databricks labs ucx migrate-credentials` command, resolving issue
[#862](#862) and being
related to pull request
[#874](#874). It includes
the addition of a `load` function to `AWSResourcePermissions` to return
identified instance profiles and the creation of an `IamRoleMigration`
class under `aws/credentials.py` to migrate identified AWS instance
profiles. Additionally, user documentation and a new CLI command
`databricks labs ucx migrate-credentials` have been added, and the
changes have been thoroughly tested with manual, unit, and integration
tests. The functionality additions include new methods such as
`add_uc_role_policy` and `update_uc_trust_role`, among others, designed
to facilitate the migration process for AWS IAM roles.
* Added `create-catalogs-schemas` command to prepare destination
catalogs and schemas before table migration
([#1028](#1028)). The
Databricks Labs Unity Catalog (UCX) tool has been updated with a new
`create-catalogs-schemas` command to facilitate the creation of
destination catalogs and schemas prior to table migration. This command
should be executed after the `create-table-mapping` command and is
designed to prepare the workspace for migrating tables to UC.
Additionally, a new `CatalogSchema` class has been added to the
`hive_metastore` package to manage the creation of catalogs and schemas
in the Hive metastore. This new functionality simplifies the process of
preparing the destination Hive metastore for table migration, reducing
the likelihood of user errors and ensuring that the metastore is
properly configured. Unit tests have been added to the
`tests/unit/hive_metastore` directory to verify the behavior of the
`CatalogSchema` class and the new `create-catalogs-schemas` command.
This command is intended for use in contexts where GCP is not supported.
* Added automated upgrade option to set up cluster policy
([#1024](#1024)). This
commit introduces an automated upgrade option for setting up a cluster
policy for older versions of UCX, separating the cluster creation policy
from install.py to installer.policy.py and adding an upgrade script for
older UCX versions. A new class, `ClusterPolicyInstaller`, is added to
the `policy.py` file in the `installer` package to manage the creation
and update of a Databricks cluster policy for Unity Catalog Migration.
This class handles creating a new cluster policy with specific
configurations, extracting external Hive Metastore configurations, and
updating job policies. Additionally, the commit includes refactoring,
removal of library references, and a new script,
v0.15.0_added_cluster_policy.py, which contains the upgrade function.
The changes are tested through manual and automated testing with unit
tests and integration tests. This feature is intended for software
engineers working with the project.
* Added crawling for init scripts on local files to assessment workflow
([#960](#960)). This commit
introduces the ability to crawl init scripts stored on local files and
S3 as part of the assessment workflow, resolving issue
[#9](#9)
* Added database filter for the `assessment` workflow
([#989](#989)). In this
release, we have added a new configuration option, `include_databases`,
to the assessment workflow which allows users to specify a list of
databases to include for migration, rather than crawling all the
databases in the Hive Metastore. This feature is implemented in the
`TablesCrawler`, `UdfsCrawler`, `GrantsCrawler` classes and the
associated functions such as `_all_databases`, `getIncludeDatabases`,
`_select_databases`. These changes aim to improve efficiency and reduce
unnecessary crawling, and are accompanied by modifications to existing
functionality, as well as the addition of unit and integration tests.
The changes have been manually tested and verified on a staging
environment.
* Estimate migration effort based on assessment database
([#1008](#1008)). In this
release, a new functionality has been added to estimate the migration
effort for each asset in the assessment database. The estimation is
presented in days and is displayed on a new estimates dashboard with a
summary widget for a global estimate per object type, along with
assumptions and scope for each object type. A new `query` parameter has
been added to the `SimpleQuery` class to support this feature.
Additional changes include the update of the `_install_viz` and
`_install_query` methods, the inclusion of the `data_source_id` in the
query metadata, and the addition of tests to ensure the proper
functioning of the new feature. A new fixture,
`mock_installation_with_jobs`, has been added to support testing of the
assessment estimates dashboard.
* Explicitly write to `hive_metastore` from `crawl_tables` task
([#1021](#1021)). In this
release, we have improved the clarity and specificity of our handling of
the `hive_metastore` in the `crawl_tables` task. Previously, the
`df.write.saveAsTable` method was used without explicitly specifying the
`hive_metastore` database, which could result in ambiguity. To address
this issue, we have updated the `saveAsTable` method to include the
`hive_metastore` database, ensuring that tables are written to the
correct location in the Hive metastore. These changes are confined to
the `src/databricks/labs/ucx/hive_metastore/tables.scala` file and
affect the `crawl_tables` task. While no new methods have been added,
the existing `saveAsTable` method has been modified to enhance the
accuracy and predictability of our interaction with the Hive metastore.
* Improved documentation for `databricks labs ucx move` command
([#1025](#1025)). The
`databricks labs ucx move` command has been updated with new
improvements to its documentation, providing enhanced clarity and ease
of use for developers and administrators. This command facilitates the
movement of UC tables/table(s) from one schema to another, either in the
same or different catalog, during the table upgrade process. A
significant enhancement is the preservation of the source table's
permissions when moving to a new schema or catalog, maintaining the
original table's access controls, simplifying the management of table
permissions, and streamlining the migration process. These improvements
aim to facilitate a more efficient table migration experience, ensuring
that developers and administrators can effectively manage their UC
tables while maintaining the desired level of access control and
security.
* Updated databricks-sdk requirement from ~=0.20.0 to ~=0.21.0
([#1030](#1030)). In this
update, the `databricks-sdk` package requirement has been updated to
version `~=0.21.0` from `~=0.20.0`. This new version addresses several
bugs and provides enhancements, including the fix for the
`get_workspace_client` method in GCP, the use of the `all-apis` scope
with the external browser, and an attempt to initialize all Databricks
globals. Moreover, the API's settings nesting approach has changed,
which may cause compatibility issues with previous versions. Several new
services and dataclasses have been added to the API, and documentation
and examples have been updated accordingly. There are no updates to the
`databricks-labs-blueprint` and `PyYAML` dependencies in this commit.
dmoore247 pushed a commit that referenced this pull request Mar 23, 2024
…ls` command (#973)

## Changes
<!-- Summary of your changes that are easy to understand. Add
screenshots when necessary -->
A few more things to be done
- [x] Added `load` function to `AWSResourcePermissions` to return
identified instance profiles
- [x] Added `IamRoleMigration` class under `aws/credentials.py` to
migrate AWS instance profiles identified

### Linked issues
<!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved. See
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword
-->

Resolves #862

Related PR:
- #874

### Functionality 

- [x] added relevant user documentation
- [x] added new CLI command `databricks labs ucx migrate-credentials`

### Tests
<!-- How is this tested? Please see the checklist below and also
describe any other relevant tests -->

- [x] manually tested
- [x] added unit tests
- [x] added integration tests

---------

Co-authored-by: qziyuan <91635877+qziyuan@users.noreply.github.com>
dmoore247 pushed a commit that referenced this pull request Mar 23, 2024
* Added AWS IAM roles support to `databricks labs ucx
migrate-credentials` command
([#973](#973)). This commit
adds AWS Identity and Access Management (IAM) roles support to the
`databricks labs ucx migrate-credentials` command, resolving issue
[#862](#862) and being
related to pull request
[#874](#874). It includes
the addition of a `load` function to `AWSResourcePermissions` to return
identified instance profiles and the creation of an `IamRoleMigration`
class under `aws/credentials.py` to migrate identified AWS instance
profiles. Additionally, user documentation and a new CLI command
`databricks labs ucx migrate-credentials` have been added, and the
changes have been thoroughly tested with manual, unit, and integration
tests. The functionality additions include new methods such as
`add_uc_role_policy` and `update_uc_trust_role`, among others, designed
to facilitate the migration process for AWS IAM roles.
* Added `create-catalogs-schemas` command to prepare destination
catalogs and schemas before table migration
([#1028](#1028)). The
Databricks Labs Unity Catalog (UCX) tool has been updated with a new
`create-catalogs-schemas` command to facilitate the creation of
destination catalogs and schemas prior to table migration. This command
should be executed after the `create-table-mapping` command and is
designed to prepare the workspace for migrating tables to UC.
Additionally, a new `CatalogSchema` class has been added to the
`hive_metastore` package to manage the creation of catalogs and schemas
in the Hive metastore. This new functionality simplifies the process of
preparing the destination Hive metastore for table migration, reducing
the likelihood of user errors and ensuring that the metastore is
properly configured. Unit tests have been added to the
`tests/unit/hive_metastore` directory to verify the behavior of the
`CatalogSchema` class and the new `create-catalogs-schemas` command.
This command is intended for use in contexts where GCP is not supported.
* Added automated upgrade option to set up cluster policy
([#1024](#1024)). This
commit introduces an automated upgrade option for setting up a cluster
policy for older versions of UCX, separating the cluster creation policy
from install.py to installer.policy.py and adding an upgrade script for
older UCX versions. A new class, `ClusterPolicyInstaller`, is added to
the `policy.py` file in the `installer` package to manage the creation
and update of a Databricks cluster policy for Unity Catalog Migration.
This class handles creating a new cluster policy with specific
configurations, extracting external Hive Metastore configurations, and
updating job policies. Additionally, the commit includes refactoring,
removal of library references, and a new script,
v0.15.0_added_cluster_policy.py, which contains the upgrade function.
The changes are tested through manual and automated testing with unit
tests and integration tests. This feature is intended for software
engineers working with the project.
* Added crawling for init scripts on local files to assessment workflow
([#960](#960)). This commit
introduces the ability to crawl init scripts stored on local files and
S3 as part of the assessment workflow, resolving issue
[#9](#9)
* Added database filter for the `assessment` workflow
([#989](#989)). In this
release, we have added a new configuration option, `include_databases`,
to the assessment workflow which allows users to specify a list of
databases to include for migration, rather than crawling all the
databases in the Hive Metastore. This feature is implemented in the
`TablesCrawler`, `UdfsCrawler`, `GrantsCrawler` classes and the
associated functions such as `_all_databases`, `getIncludeDatabases`,
`_select_databases`. These changes aim to improve efficiency and reduce
unnecessary crawling, and are accompanied by modifications to existing
functionality, as well as the addition of unit and integration tests.
The changes have been manually tested and verified on a staging
environment.
* Estimate migration effort based on assessment database
([#1008](#1008)). In this
release, a new functionality has been added to estimate the migration
effort for each asset in the assessment database. The estimation is
presented in days and is displayed on a new estimates dashboard with a
summary widget for a global estimate per object type, along with
assumptions and scope for each object type. A new `query` parameter has
been added to the `SimpleQuery` class to support this feature.
Additional changes include the update of the `_install_viz` and
`_install_query` methods, the inclusion of the `data_source_id` in the
query metadata, and the addition of tests to ensure the proper
functioning of the new feature. A new fixture,
`mock_installation_with_jobs`, has been added to support testing of the
assessment estimates dashboard.
* Explicitly write to `hive_metastore` from `crawl_tables` task
([#1021](#1021)). In this
release, we have improved the clarity and specificity of our handling of
the `hive_metastore` in the `crawl_tables` task. Previously, the
`df.write.saveAsTable` method was used without explicitly specifying the
`hive_metastore` database, which could result in ambiguity. To address
this issue, we have updated the `saveAsTable` method to include the
`hive_metastore` database, ensuring that tables are written to the
correct location in the Hive metastore. These changes are confined to
the `src/databricks/labs/ucx/hive_metastore/tables.scala` file and
affect the `crawl_tables` task. While no new methods have been added,
the existing `saveAsTable` method has been modified to enhance the
accuracy and predictability of our interaction with the Hive metastore.
* Improved documentation for `databricks labs ucx move` command
([#1025](#1025)). The
`databricks labs ucx move` command has been updated with new
improvements to its documentation, providing enhanced clarity and ease
of use for developers and administrators. This command facilitates the
movement of UC tables/table(s) from one schema to another, either in the
same or different catalog, during the table upgrade process. A
significant enhancement is the preservation of the source table's
permissions when moving to a new schema or catalog, maintaining the
original table's access controls, simplifying the management of table
permissions, and streamlining the migration process. These improvements
aim to facilitate a more efficient table migration experience, ensuring
that developers and administrators can effectively manage their UC
tables while maintaining the desired level of access control and
security.
* Updated databricks-sdk requirement from ~=0.20.0 to ~=0.21.0
([#1030](#1030)). In this
update, the `databricks-sdk` package requirement has been updated to
version `~=0.21.0` from `~=0.20.0`. This new version addresses several
bugs and provides enhancements, including the fix for the
`get_workspace_client` method in GCP, the use of the `all-apis` scope
with the external browser, and an attempt to initialize all Databricks
globals. Moreover, the API's settings nesting approach has changed,
which may cause compatibility issues with previous versions. Several new
services and dataclasses have been added to the API, and documentation
and examples have been updated accordingly. There are no updates to the
`databricks-labs-blueprint` and `PyYAML` dependencies in this commit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ready to merge this pull request is ready to merge
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEATURE]: Migrate AWS IAM Instance Profiles to UC Storage Credentials
3 participants