|
| 1 | +from unittest.mock import Mock |
| 2 | + |
| 3 | +from databricks.sdk.service.iam import Group, ResourceMeta |
| 4 | + |
| 5 | +from databricks.labs.ucx.config import GroupsConfig |
| 6 | +from databricks.labs.ucx.managers.group import GroupManager |
| 7 | +from databricks.labs.ucx.providers.groups_info import MigrationGroupInfo |
| 8 | + |
| 9 | + |
| 10 | +def test_account_groups_should_not_be_considered(): |
| 11 | + client = Mock() |
| 12 | + users_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 13 | + account_admins_group = Group(display_name="account admins", meta=ResourceMeta(resource_type="AccountGroup")) |
| 14 | + client.groups.list.return_value = [users_group, account_admins_group] |
| 15 | + |
| 16 | + group_conf = GroupsConfig(selected=[""]) |
| 17 | + |
| 18 | + assert GroupManager(client, group_conf)._find_eligible_groups() == [users_group.display_name] |
| 19 | + |
| 20 | + |
| 21 | +def test_if_only_account_groups_it_should_return_empty_value(): |
| 22 | + client = Mock() |
| 23 | + users_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="AccountGroup")) |
| 24 | + account_admins_group = Group(display_name="account admins", meta=ResourceMeta(resource_type="AccountGroup")) |
| 25 | + client.groups.list.return_value = [users_group, account_admins_group] |
| 26 | + |
| 27 | + group_conf = GroupsConfig(selected=[""]) |
| 28 | + |
| 29 | + assert GroupManager(client, group_conf)._find_eligible_groups() == [] |
| 30 | + |
| 31 | + |
| 32 | +def test_backup_group_should_be_created_with_name_defined_in_conf(): |
| 33 | + client = Mock() |
| 34 | + |
| 35 | + analysts_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 36 | + client.groups.list.return_value = [] |
| 37 | + |
| 38 | + analysts_group_backup = Group( |
| 39 | + display_name="dbr_backup_analysts_group_backup", meta=ResourceMeta(resource_type="WorkspaceGroup") |
| 40 | + ) |
| 41 | + client.groups.create.return_value = analysts_group_backup |
| 42 | + |
| 43 | + group_conf = GroupsConfig(selected=[""], backup_group_prefix="dbr_backup_") |
| 44 | + |
| 45 | + assert ( |
| 46 | + GroupManager(client, group_conf)._get_or_create_backup_group("analysts", analysts_group) |
| 47 | + == analysts_group_backup |
| 48 | + ) |
| 49 | + |
| 50 | + |
| 51 | +def test_backup_group_should_not_be_created_if_already_exists(): |
| 52 | + client = Mock() |
| 53 | + |
| 54 | + analysts_group_backup = Group( |
| 55 | + display_name="dbr_backup_analysts_group_backup", meta=ResourceMeta(resource_type="WorkspaceGroup") |
| 56 | + ) |
| 57 | + client.groups.list.return_value = [analysts_group_backup] |
| 58 | + |
| 59 | + group_conf = GroupsConfig(selected=[""], backup_group_prefix="dbr_backup_") |
| 60 | + |
| 61 | + assert ( |
| 62 | + GroupManager(client, group_conf)._get_or_create_backup_group( |
| 63 | + "dbr_backup_analysts_group_backup", analysts_group_backup |
| 64 | + ) |
| 65 | + == analysts_group_backup |
| 66 | + ) |
| 67 | + |
| 68 | + |
| 69 | +def test_prepare_groups_in_environment_with_one_group_in_conf_should_return_migrationgroupinfo_object(): |
| 70 | + client = Mock() |
| 71 | + |
| 72 | + de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 73 | + backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 74 | + |
| 75 | + def my_side_effect(filter, **kwargs): # noqa: A002,ARG001 |
| 76 | + if filter == "displayName eq 'de'": |
| 77 | + return [de_group] |
| 78 | + elif filter == "displayName eq 'dbr_backup_de'": |
| 79 | + return [backup_de_group] |
| 80 | + |
| 81 | + client.groups.list.side_effect = my_side_effect |
| 82 | + client.api_client.do.return_value = {"Resources": [de_group.as_dict()]} |
| 83 | + |
| 84 | + group_conf = GroupsConfig(selected=["de"], backup_group_prefix="dbr_backup_") |
| 85 | + manager = GroupManager(client, group_conf) |
| 86 | + manager.prepare_groups_in_environment() |
| 87 | + |
| 88 | + group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group) |
| 89 | + assert manager._migration_state.groups == [group_info] |
| 90 | + |
| 91 | + |
| 92 | +def test_prepare_groups_in_environment_with_no_groups_in_conf(): |
| 93 | + client = Mock() |
| 94 | + |
| 95 | + de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 96 | + backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 97 | + |
| 98 | + def my_side_effect(filter, **kwargs): # noqa: A002,ARG001 |
| 99 | + if filter == "displayName eq 'de'": |
| 100 | + return [de_group] |
| 101 | + elif filter == "displayName eq 'dbr_backup_de'": |
| 102 | + return [backup_de_group] |
| 103 | + elif filter == 'displayName ne "users" and displayName ne "admins" and displayName ne "account users"': |
| 104 | + return [de_group] |
| 105 | + |
| 106 | + client.groups.list.side_effect = my_side_effect |
| 107 | + client.api_client.do.return_value = {"Resources": [de_group.as_dict()]} |
| 108 | + |
| 109 | + group_conf = GroupsConfig(backup_group_prefix="dbr_backup_", auto=True) |
| 110 | + manager = GroupManager(client, group_conf) |
| 111 | + manager.prepare_groups_in_environment() |
| 112 | + |
| 113 | + group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group) |
| 114 | + assert manager._migration_state.groups == [group_info] |
| 115 | + |
| 116 | + |
| 117 | +def test_replace_workspace_groups_with_account_groups_should_call_delete_and_do(): |
| 118 | + client = Mock() |
| 119 | + |
| 120 | + test_workspace_id = 100 |
| 121 | + de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup"), id=test_workspace_id) |
| 122 | + backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup")) |
| 123 | + |
| 124 | + client.groups.list.return_value = [de_group] |
| 125 | + |
| 126 | + group_conf = GroupsConfig(backup_group_prefix="dbr_backup_", auto=True) |
| 127 | + manager = GroupManager(client, group_conf) |
| 128 | + |
| 129 | + group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group) |
| 130 | + manager._migration_state.groups = [group_info] |
| 131 | + manager.replace_workspace_groups_with_account_groups() |
| 132 | + |
| 133 | + client.groups.delete.assert_called_with(test_workspace_id) |
| 134 | + client.api_client.do.assert_called_with( |
| 135 | + "PUT", |
| 136 | + f"/api/2.0/preview/permissionassignments/principals/{test_workspace_id}", |
| 137 | + data='{"permissions": ["USER"]}', |
| 138 | + ) |
0 commit comments