Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b113c05
Initial commit for updating MSI permissions
SamarthMayya May 24, 2022
4a02b49
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya May 24, 2022
fb98d3d
Added permission scope for disk
SamarthMayya May 24, 2022
1c67cac
Added code style changes
SamarthMayya May 24, 2022
c51c65d
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya May 25, 2022
34fa75e
Check role assignments at lowest possible scope
SamarthMayya May 25, 2022
088c630
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya May 27, 2022
216326b
Initial commit for Blob permissions assignment and argument validation
SamarthMayya May 27, 2022
7b14dc2
Added code style changes
SamarthMayya May 27, 2022
1679978
Made changes for better UX
SamarthMayya May 27, 2022
943003e
Added help text for command
SamarthMayya May 27, 2022
df07ad2
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya May 27, 2022
5ad7426
Resolve merge conflict
SamarthMayya May 30, 2022
3c953a6
Covered positive cases for updating permissions
SamarthMayya Jun 10, 2022
98d6c0a
Used Manifest based approach for generalizing code
SamarthMayya Jun 11, 2022
d530665
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya Jun 11, 2022
cac88ed
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya Jun 13, 2022
c78db66
Organized code with helper functions
SamarthMayya Jun 14, 2022
c17efa9
Added style changes for pipeline
SamarthMayya Jun 14, 2022
b93171d
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya Jun 14, 2022
21b443c
Added test for AzureDisk
SamarthMayya Jun 14, 2022
86dd156
Deleted existing recording
SamarthMayya Jun 14, 2022
effc1ea
Recording for Disk test created
SamarthMayya Jun 15, 2022
a013554
Added passing test for AzureDisk
SamarthMayya Jun 15, 2022
e7fd756
Added working test for AzureBlob
SamarthMayya Jun 15, 2022
3a66527
Updated API version and corresponding tests
SamarthMayya Jun 15, 2022
2700b97
Added snapshot rg param to initialize command, and validation to ensu…
SamarthMayya Jun 16, 2022
d95b039
Added --snapshot-rg param in test
SamarthMayya Jun 16, 2022
b7baee2
Fix style errors
SamarthMayya Jun 16, 2022
c8564f1
Added validation to ensure secret URI is proper, and added network ac…
SamarthMayya Jun 17, 2022
2305a3c
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya Jun 17, 2022
84e5c63
Added test for PostgreSQL workload
SamarthMayya Jun 21, 2022
3a82eda
Added code style changes
SamarthMayya Jun 21, 2022
b9439b7
Changed version and refactored code to use inbuilt validation for ARM ID
SamarthMayya Jun 22, 2022
8a695eb
Added a wait time of 60 seconds to let the roles propagate
SamarthMayya Jun 22, 2022
4c14365
Minor code restructuring, and modify firewall client context to have …
SamarthMayya Jun 28, 2022
4979d27
Style Change added
SamarthMayya Jun 28, 2022
b59065f
Changed general help text
SamarthMayya Jun 29, 2022
d7508d5
Added logging for 60 seconds wait time
SamarthMayya Jun 29, 2022
270cd3d
Changed help text and output of command
SamarthMayya Jun 29, 2022
10f72f4
Updated version in version.py and added output customization for keyv…
SamarthMayya Jun 30, 2022
39f172e
Merge branch 'main' of https://github.com/Azure/azure-cli-extensions …
SamarthMayya Jun 30, 2022
ddb4e4d
Added validation to ensure that backup instance is of same datasource…
SamarthMayya Jun 30, 2022
dc022a7
Changed error message
SamarthMayya Jun 30, 2022
1dbf8fb
Moved permission object formation into helper code
SamarthMayya Jun 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/dataprotection/azext_dataprotection/manual/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
get_job_operation_values,
get_datasource_types,
get_rehydration_priority_values,
get_secret_store_type_values
get_secret_store_type_values,
get_backup_operation_values,
get_permission_scope_values
)


Expand Down Expand Up @@ -79,6 +81,14 @@ def load_arguments(self, _):
c.argument('subscriptions', type=str, nargs='+', help="List of subscription Ids.")
c.argument('protection_status', arg_type=get_enum_type(get_protection_status_values()), nargs='+', help="specify protection status.")
c.argument('datasource_id', type=str, nargs='+', help="specify datasource id filter to apply.")

with self.argument_context('dataprotection backup-instance update-msi-permissions') as c:
c.argument('operation', arg_type=get_enum_type(get_backup_operation_values()), help="List of possible operations")
c.argument('datasource_type', arg_type=get_enum_type(get_datasource_types()), help="Specify the datasource type of the resource to be backed up")
c.argument('vault_name', type=str, help="Name of the vault.")
c.argument('permissions_scope', arg_type=get_enum_type(get_permission_scope_values()), help="Scope for assigning permissions to the backup vault")
c.argument('backup_instance', type=validate_file_or_dict, help='Request body for operation Expected value: '
Comment thread
SamarthMayya marked this conversation as resolved.
'json-string/@json-file.')

with self.argument_context('dataprotection job list-from-resourcegraph') as c:
c.argument('subscriptions', type=str, nargs='+', help="List of subscription Ids.")
Expand Down
1 change: 1 addition & 0 deletions src/dataprotection/azext_dataprotection/manual/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def load_command_table(self, _):
g.custom_command('restore trigger', 'dataprotection_backup_instance_restore_trigger', supports_no_wait=True)
g.custom_command('update-policy', "dataprotection_backup_instance_update_policy", supports_no_wait=True)
g.custom_command('list-from-resourcegraph', 'dataprotection_backup_instance_list_from_resourcegraph', client_factory=cf_resource_graph_client)
g.custom_command('update-msi-permissions', 'dataprotection_backup_instance_update_msi_permissions', client_factory=cf_backup_vault)

with self.command_group('dataprotection backup-policy', exception_handler=exception_handler) as g:
g.custom_command('get-default-policy-template', "dataprotection_backup_policy_get_default_policy_template")
Expand Down
55 changes: 55 additions & 0 deletions src/dataprotection/azext_dataprotection/manual/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,61 @@ def dataprotection_backup_instance_list_from_resourcegraph(client, datasource_ty
return response.data


def dataprotection_backup_instance_update_msi_permissions(cmd, client, resource_group_name, datasource_type, vault_name, operation, permissions_scope, backup_instance=None):
backup_vault = client.get(resource_group_name=resource_group_name,
vault_name=vault_name)
principal_id = backup_vault.identity.principal_id

role_assignments_arr = []

if operation == 'Backup' and backup_instance is None:
raise CLIError("Backup instance needs to be provided when operation is Backup")
Comment thread
SamarthMayya marked this conversation as resolved.
Outdated

from azure.cli.command_modules.role.custom import list_role_assignments, create_role_assignment

if datasource_type == 'AzureDisk':
# Create scope variables for role assignment
resource_scope_assignment = backup_instance['properties']['data_source_info']['resource_id']
snapshot_rg_scope_assignment = backup_instance['properties']['policy_info']['policy_parameters']['data_store_parameters_list'][0]['resource_group_id']
resource_scope = resource_scope_assignment
snapshot_rg_scope = snapshot_rg_scope_assignment

if permissions_scope == 'Resource Group':
resource_scope_assignment = "/".join(resource_scope_assignment.split("/")[:5]) # Snapshot RG is already in RG scope, so change for resource
elif permissions_scope == 'Subscription':
# Change scope for both resource and Snapshot RG
resource_scope_assignment = "/".join(resource_scope_assignment.split("/")[:3])
snapshot_rg_scope_assignment = "/".join(snapshot_rg_scope_assignment.split("/")[:3])


role_assignments = [obj['roleDefinitionName'] for obj in list_role_assignments(cmd, assignee=principal_id, scope=resource_scope, include_inherited=True)]
Comment thread
SamarthMayya marked this conversation as resolved.
Outdated
if 'Disk Backup Reader' not in role_assignments:
role_assignments_arr.append(create_role_assignment(cmd, role='Disk Backup Reader', assignee=principal_id, scope=resource_scope_assignment))

role_assignments = [obj['roleDefinitionName'] for obj in list_role_assignments(cmd, assignee=principal_id, scope=snapshot_rg_scope, include_inherited=True)]
Comment thread
SamarthMayya marked this conversation as resolved.
Outdated
if 'Disk Snapshot Contributor' not in role_assignments:
role_assignments_arr.append(create_role_assignment(cmd, role='Disk Snapshot Contributor', assignee=principal_id, scope=snapshot_rg_scope_assignment))

return role_assignments_arr

if datasource_type == 'AzureBlob':
storage_account_scope = backup_instance['properties']['data_source_info']['resource_id']
storage_account_scope_assignment = storage_account_scope

if permissions_scope == 'Resource Group':
storage_account_scope_assignment = "/".join(storage_account_scope_assignment.split("/")[:5])
elif permissions_scope == 'Subscription':
storage_account_scope_assignment = "/".join(storage_account_scope_assignment.split("/")[:3])

role_assignments = [obj['roleDefinitionName'] for obj in list_role_assignments(cmd, assignee=principal_id, scope=storage_account_scope, include_inherited=True)]
Comment thread
SamarthMayya marked this conversation as resolved.
Outdated
if 'Storage Account Backup Contributor' not in role_assignments:
role_assignments_arr.append(create_role_assignment(cmd, role='Storage Account Backup Contributor', assignee=principal_id, scope=storage_account_scope_assignment))

return role_assignments_arr

raise CLIError("Invalid params passed")


def dataprotection_job_list_from_resourcegraph(client, datasource_type, resource_groups=None, vaults=None,
subscriptions=None, start_time=None, end_time=None,
status=None, operation=None, datasource_id=None):
Expand Down
7 changes: 7 additions & 0 deletions src/dataprotection/azext_dataprotection/manual/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ def get_secret_store_type_values():
return ['AzureKeyVault']


def get_backup_operation_values():
return ['Backup']

def get_permission_scope_values():
return ['Resource', 'Resource Group', 'Subscription']
Comment thread
SamarthMayya marked this conversation as resolved.
Outdated


def get_datasource_types():
from azext_dataprotection.manual import helpers
return helpers.get_supported_datasource_types()