Skip to content

Commit

Permalink
[ARM] BREAKING CHANGE: az stack mg create: Enable mg scoped deploym…
Browse files Browse the repository at this point in the history
…ents for mg scoped stacks (Azure#27709)
  • Loading branch information
dantedallag authored and albertofori committed Dec 14, 2023
1 parent c8f351c commit 6299dbd
Show file tree
Hide file tree
Showing 19 changed files with 6,141 additions and 6,046 deletions.
32 changes: 17 additions & 15 deletions src/azure-cli/azure/cli/command_modules/resource/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -2392,22 +2392,23 @@ def create_deployment_stack_at_subscription(cmd, name, location, deny_settings_m
except: # pylint: disable=bare-except
pass

if not deployment_resource_group:
deployment_scope = "/subscriptions/" + get_subscription_id(cmd.cli_ctx)
else:
deployment_scope = "/subscriptions/" + \
get_subscription_id(cmd.cli_ctx) + "/resourceGroups/" + deployment_resource_group

action_on_unmanage_model = rcf.deployment_stacks.models.DeploymentStackPropertiesActionOnUnmanage(
resources=delete_resources_enum, resource_groups=delete_resource_groups_enum)
apply_to_child_scopes = deny_settings_apply_to_child_scopes
deny_settings_model = rcf.deployment_stacks.models.DenySettings(
mode=deny_settings_enum, excluded_principals=excluded_principals_array, excluded_actions=excluded_actions_array, apply_to_child_scopes=apply_to_child_scopes)
deployment_stack_model = rcf.deployment_stacks.models.DeploymentStack(
description=description, location=location, action_on_unmanage=action_on_unmanage_model, deployment_scope=deployment_scope, deny_settings=deny_settings_model, tags=tags)
description=description, location=location, action_on_unmanage=action_on_unmanage_model, deny_settings=deny_settings_model, tags=tags)

if deployment_resource_group:
deployment_stack_model.deployment_scope = "/subscriptions/" + \
get_subscription_id(cmd.cli_ctx) + "/resourceGroups/" + deployment_resource_group
deployment_scope = 'resourceGroup'
else:
deployment_scope = 'subscription'

deployment_stack_model = _prepare_stacks_templates_and_parameters(
cmd, rcf, 'subscription', deployment_stack_model, template_file, template_spec, template_uri, parameters, query_string)
cmd, rcf, deployment_scope, deployment_stack_model, template_file, template_spec, template_uri, parameters, query_string)

return sdk_no_wait(no_wait, rcf.deployment_stacks.begin_create_or_update_at_subscription, name, deployment_stack_model)

Expand Down Expand Up @@ -2643,21 +2644,22 @@ def create_deployment_stack_at_management_group(cmd, management_group_id, name,
except: # pylint: disable=bare-except
pass

if not deployment_subscription:
deployment_scope = "/subscriptions/" + get_subscription_id(cmd.cli_ctx)
else:
deployment_scope = "/subscriptions/" + deployment_subscription

action_on_unmanage_model = rcf.deployment_stacks.models.DeploymentStackPropertiesActionOnUnmanage(
resources=delete_resources_enum, resource_groups=delete_resource_groups_enum)
apply_to_child_scopes = deny_settings_apply_to_child_scopes
deny_settings_model = rcf.deployment_stacks.models.DenySettings(
mode=deny_settings_enum, excluded_principals=excluded_principals_array, excluded_actions=excluded_actions_array, apply_to_child_scopes=apply_to_child_scopes)
deployment_stack_model = rcf.deployment_stacks.models.DeploymentStack(
description=description, location=location, action_on_unmanage=action_on_unmanage_model, deployment_scope=deployment_scope, deny_settings=deny_settings_model, tags=tags)
description=description, location=location, action_on_unmanage=action_on_unmanage_model, deny_settings=deny_settings_model, tags=tags)

if deployment_subscription:
deployment_stack_model.deployment_scope = "/subscriptions/" + deployment_subscription
deployment_scope = 'subscription'
else:
deployment_scope = 'managementGroup'

deployment_stack_model = _prepare_stacks_templates_and_parameters(
cmd, rcf, 'managementGroup', deployment_stack_model, template_file, template_spec, template_uri, parameters, query_string)
cmd, rcf, deployment_scope, deployment_stack_model, template_file, template_spec, template_uri, parameters, query_string)

return sdk_no_wait(no_wait, rcf.deployment_stacks.begin_create_or_update_at_management_group, management_group_id, name, deployment_stack_model)

Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2307,6 +2307,7 @@ def test_create_deployment_stack_subscription_with_bicep(self, resource_group):
# test bicep param file
self.cmd('stack sub create --name {name} --location {location} --deployment-resource-group {resource-group} -p "{bicep-param-file}" --deny-settings-mode "none" --delete-all --yes', checks=self.check('provisioningState', 'succeeded'))

# cleanup
self.cmd('stack sub delete --name {name} --yes')

def test_show_deployment_stack_subscription(self):
Expand Down Expand Up @@ -2919,7 +2920,18 @@ def test_create_deployment_stack_management_group(self, resource_group):
# cleanup
self.cmd('stack mg delete --name {name} --management-group-id {mg} --yes')

# create deployment stack with template file and parameter file
# create deployment stack with template file and parameter file (with subscription scoped deployment)
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file}" --deployment-subscription {subscription} --deny-settings-mode "none" --parameters "{parameter-file}" --description "MG stack deployment" --delete-all --deny-settings-excluded-principals "principal1 principal2" --deny-settings-excluded-actions "action1 action2" --deny-settings-apply-to-child-scopes --no-wait', checks=self.is_empty())

time.sleep(20)

# check if the stack was created successfully
self.cmd('stack mg show --name {name} --management-group-id {mg}', checks=self.check('provisioningState', 'succeeded'))

# cleanup
self.cmd('stack mg delete --name {name} --management-group-id {mg} --yes')

# create deployment stack with template file and parameter file (with management group scoped deployment)
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file}" --deny-settings-mode "none" --parameters "{parameter-file}" --description "MG stack deployment" --delete-all --deny-settings-excluded-principals "principal1 principal2" --deny-settings-excluded-actions "action1 action2" --deny-settings-apply-to-child-scopes --no-wait', checks=self.is_empty())

time.sleep(20)
Expand All @@ -2931,10 +2943,10 @@ def test_create_deployment_stack_management_group(self, resource_group):
self.cmd('stack mg delete --name {name} --management-group-id {mg} --yes')

# test delete flag --delete-resource-groups - create stack with resource1
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-one}" --delete-resources --tags "tag1 tag2"', checks=self.check('provisioningState', 'succeeded'))
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deployment-subscription {subscription} --deny-settings-mode "none" --parameters "name={resource-one}" --delete-resources --tags "tag1 tag2"', checks=self.check('provisioningState', 'succeeded'))

# update stack with resource2 set to detach
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-two}"', checks=self.check('provisioningState', 'succeeded'))
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deployment-subscription {subscription} --deny-settings-mode "none" --parameters "name={resource-two}"', checks=self.check('provisioningState', 'succeeded'))

# check resource1 still exists in Azure
self.cmd('group show -n {resource-one}')
Expand All @@ -2943,7 +2955,7 @@ def test_create_deployment_stack_management_group(self, resource_group):
self.cmd('group show -n {resource-two}')

# update stack with resource3 set to delete
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-three}" --delete-resources', checks=self.check('provisioningState', 'succeeded'))
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deployment-subscription {subscription} --deny-settings-mode "none" --parameters "name={resource-three}" --delete-resources', checks=self.check('provisioningState', 'succeeded'))

# check resource1 still exists in Azure
self.cmd('group show -n {resource-one}')
Expand Down Expand Up @@ -2996,6 +3008,7 @@ def test_delete_deployment_stack_management_group(self):
self.kwargs.update({
'name': deployment_stack_name,
'location': location,
'subscription': self.get_subscription_id(),
'template-file': os.path.join(curr_dir, 'simple_template.json').replace('\\', '\\\\'),
'parameter-file': os.path.join(curr_dir, 'simple_template_params.json').replace('\\', '\\\\'),
'template-file-spec': os.path.join(curr_dir, 'simple_template_spec.json').replace('\\', '\\\\'),
Expand Down Expand Up @@ -3033,7 +3046,7 @@ def test_delete_deployment_stack_management_group(self):
self.cmd('stack mg delete --id {id} --management-group-id {mg} --yes')

# test delete flag --delete-resource-groups - create stack with resource1
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-one}" --yes', checks=self.check('provisioningState', 'succeeded'))
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --deployment-subscription {subscription} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-one}" --yes', checks=self.check('provisioningState', 'succeeded'))

# delete stack with resource1 set to detach
self.cmd('stack mg delete --name {name} --management-group-id {mg} --yes')
Expand All @@ -3042,7 +3055,7 @@ def test_delete_deployment_stack_management_group(self):
self.cmd('group show -n {resource-one}')

# update stack with resource3 set to delete
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-two}" --delete-resources --delete-resource-groups --yes', checks=self.check('provisioningState', 'succeeded'))
self.cmd('stack mg create --name {name} --management-group-id {mg} --location {location} --deployment-subscription {subscription} --template-file "{template-file-rg}" --deny-settings-mode "none" --parameters "name={resource-two}" --delete-resources --delete-resource-groups --yes', checks=self.check('provisioningState', 'succeeded'))

# delete stack with resource1 set to detach
self.cmd('stack mg delete --name {name} --management-group-id {mg} --delete-resources --delete-resource-groups --yes')
Expand Down

0 comments on commit 6299dbd

Please sign in to comment.