Skip to content

Commit f6848fc

Browse files
authored
[ARM] az ts: Capture subscription id from template resource id (#31896)
1 parent 2d378ad commit f6848fc

File tree

3 files changed

+123
-7
lines changed

3 files changed

+123
-7
lines changed

src/azure-cli/azure/cli/command_modules/resource/_client_factory.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,11 @@ def _resource_managementgroups_client_factory(cli_ctx, **_):
6464
return get_mgmt_service_client(cli_ctx, ManagementGroupsAPI, subscription_bound=False)
6565

6666

67-
def _resource_templatespecs_client_factory(cli_ctx, **_):
67+
def _resource_templatespecs_client_factory(cli_ctx, subscription_id=None, **_):
6868
from azure.cli.core.commands.client_factory import get_mgmt_service_client
6969
from azure.cli.core.profiles import ResourceType
70-
return get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_TEMPLATESPECS)
70+
kwargs = {'subscription_id': subscription_id} if subscription_id is not None else {}
71+
return get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_TEMPLATESPECS, **kwargs)
7172

7273

7374
def _resource_deploymentstacks_client_factory(cli_ctx, **_):

src/azure-cli/azure/cli/command_modules/resource/custom.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2309,7 +2309,9 @@ def get_template_spec(cmd, resource_group_name=None, name=None, version=None, te
23092309
version = id_parts.get('resource_name')
23102310
if version == name:
23112311
version = None
2312-
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
2312+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx, subscription_id=id_parts.get('subscription'))
2313+
else:
2314+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
23132315
if version:
23142316
return rcf.template_spec_versions.get(resource_group_name, name, version)
23152317
retrieved_template = rcf.template_specs.get(resource_group_name, name, expand="versions")
@@ -2381,15 +2383,16 @@ def create_template_spec(cmd, resource_group_name, name, template_file=None, loc
23812383

23822384
def update_template_spec(cmd, resource_group_name=None, name=None, template_spec=None, template_file=None, display_name=None,
23832385
description=None, version=None, version_description=None, tags=None, ui_form_definition_file=None):
2384-
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
2385-
23862386
if template_spec:
23872387
id_parts = parse_resource_id(template_spec)
23882388
resource_group_name = id_parts.get('resource_group')
23892389
name = id_parts.get('name')
23902390
version = id_parts.get('resource_name')
23912391
if version == name:
23922392
version = None
2393+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx, subscription_id=id_parts.get('subscription'))
2394+
else:
2395+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
23932396

23942397
existing_template, artifacts, input_ui_form_definition = None, None, None
23952398
if template_file:
@@ -2445,14 +2448,16 @@ def update_template_spec(cmd, resource_group_name=None, name=None, template_spec
24452448

24462449

24472450
def export_template_spec(cmd, output_folder, resource_group_name=None, name=None, version=None, template_spec=None):
2448-
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
24492451
if template_spec:
24502452
id_parts = parse_resource_id(template_spec)
24512453
resource_group_name = id_parts.get('resource_group')
24522454
name = id_parts.get('name')
24532455
version = id_parts.get('resource_name')
24542456
if version == name:
24552457
version = None
2458+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx, subscription_id=id_parts.get('subscription'))
2459+
else:
2460+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
24562461
if not version:
24572462
raise IncorrectUsageError('Please specify the template spec version for export')
24582463
exported_template = rcf.template_spec_versions.get(resource_group_name, name, version)
@@ -2461,14 +2466,16 @@ def export_template_spec(cmd, output_folder, resource_group_name=None, name=None
24612466

24622467

24632468
def delete_template_spec(cmd, resource_group_name=None, name=None, version=None, template_spec=None):
2464-
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
24652469
if template_spec:
24662470
id_parts = parse_resource_id(template_spec)
24672471
resource_group_name = id_parts.get('resource_group')
24682472
name = id_parts.get('name')
24692473
version = id_parts.get('resource_name')
24702474
if version == name:
24712475
version = None
2476+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx, subscription_id=id_parts.get('subscription'))
2477+
else:
2478+
rcf = _resource_templatespecs_client_factory(cmd.cli_ctx)
24722479
if version:
24732480
return rcf.template_spec_versions.delete(resource_group_name=resource_group_name, template_spec_name=name, template_spec_version=version)
24742481
return rcf.template_specs.delete(resource_group_name=resource_group_name, template_spec_name=name)

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,29 @@ def test_update_template_specs(self, resource_group, resource_group_location):
10161016
# clean up
10171017
self.cmd('ts delete --template-spec {template_spec_id} --yes')
10181018

1019+
@live_only()
1020+
@ResourceGroupPreparer(name_prefix="cli_test_ts_aux_update_", location="eastus2", subscription=AUX_SUBSCRIPTION)
1021+
def test_update_template_spec_with_aux_subscription(self, resource_group):
1022+
curr_dir = os.path.dirname(os.path.realpath(__file__))
1023+
template_spec_name = self.create_random_name('cli-test-ts-aux-update', 60)
1024+
self.kwargs.update({
1025+
"aux_rg": resource_group,
1026+
"aux_subscription": AUX_SUBSCRIPTION,
1027+
"template_spec_name": template_spec_name,
1028+
'tf': os.path.join(curr_dir, 'simple_deploy.json').replace('\\', '\\\\'),
1029+
'description': '"Updated description"',
1030+
})
1031+
1032+
result = self.cmd('ts create -g {aux_rg} -n {template_spec_name} -v 1.0 -l eastus2 -f "{tf}" --subscription {aux_subscription}').get_output_in_json()
1033+
self.kwargs['template_spec_version_id'] = result['id']
1034+
self.kwargs['template_spec_id'] = result['id'].replace('/versions/1.0', '')
1035+
self.assertIn(AUX_SUBSCRIPTION, result['id'])
1036+
1037+
ts_result = self.cmd('ts update --template-spec {template_spec_id} --description {description} --yes').get_output_in_json()
1038+
self.assertIn(AUX_SUBSCRIPTION, ts_result['id'])
1039+
1040+
self.cmd('ts delete --template-spec {template_spec_id} --yes --subscription {aux_subscription}')
1041+
10191042
@ResourceGroupPreparer(name_prefix='cli_test_template_specs', location='westus')
10201043
def test_show_template_spec(self, resource_group, resource_group_location):
10211044
curr_dir = os.path.dirname(os.path.realpath(__file__))
@@ -1047,6 +1070,46 @@ def test_show_template_spec(self, resource_group, resource_group_location):
10471070
# clean up
10481071
self.cmd('ts delete --template-spec {template_spec_id} --yes')
10491072

1073+
@live_only()
1074+
@ResourceGroupPreparer(name_prefix="cli_test_ts_aux_show_", location="eastus2", subscription=AUX_SUBSCRIPTION)
1075+
def test_template_spec_show_with_aux_subscription(self, resource_group, resource_group_location):
1076+
curr_dir = os.path.dirname(os.path.realpath(__file__))
1077+
template_spec_name = self.create_random_name('cli-test-ts-aux-show', 60)
1078+
self.kwargs.update({
1079+
"aux_rg": resource_group,
1080+
"aux_subscription": AUX_SUBSCRIPTION,
1081+
"template_spec_name": template_spec_name,
1082+
'tf': os.path.join(curr_dir, 'simple_deploy.json').replace('\\', '\\\\'),
1083+
'resource_group_location': resource_group_location,
1084+
})
1085+
1086+
result = self.cmd('ts create -g {aux_rg} -n {template_spec_name} -v 1.0 -l {resource_group_location} -f "{tf}" --subscription {aux_subscription}',
1087+
checks=[
1088+
self.check('name', '1.0'),
1089+
self.check('type', 'Microsoft.Resources/templateSpecs/versions')
1090+
]).get_output_in_json()
1091+
self.kwargs['template_spec_version_id'] = result['id']
1092+
self.kwargs['template_spec_id'] = result['id'].replace('/versions/1.0', '')
1093+
self.assertIn(AUX_SUBSCRIPTION, result['id'])
1094+
1095+
ts_result = self.cmd('ts show --template-spec {template_spec_id}',
1096+
checks=[
1097+
self.check('name', '{template_spec_name}'),
1098+
self.check('type', 'Microsoft.Resources/templateSpecs')
1099+
]).get_output_in_json()
1100+
self.assertIn(AUX_SUBSCRIPTION, ts_result['id'])
1101+
self.assertEqual(ts_result['name'], template_spec_name)
1102+
1103+
ts_version_result = self.cmd('ts show --template-spec {template_spec_version_id}',
1104+
checks=[
1105+
self.check('name', '1.0'),
1106+
self.check('type', 'Microsoft.Resources/templateSpecs/versions')
1107+
]).get_output_in_json()
1108+
self.assertIn(AUX_SUBSCRIPTION, ts_version_result['id'])
1109+
self.assertEqual(ts_version_result['name'], '1.0')
1110+
1111+
self.cmd('ts delete --template-spec {template_spec_id} --yes --subscription {aux_subscription}')
1112+
10501113
@ResourceGroupPreparer(name_prefix='cli_test_template_specs', location='westus')
10511114
def test_delete_template_spec(self, resource_group, resource_group_location):
10521115
curr_dir = os.path.dirname(os.path.realpath(__file__))
@@ -1076,6 +1139,25 @@ def test_delete_template_spec(self, resource_group, resource_group_location):
10761139
self.cmd('ts list -g {rg}',
10771140
checks=self.check("length([?id=='{template_spec_id}'])", 0))
10781141

1142+
@live_only()
1143+
@ResourceGroupPreparer(name_prefix="cli_test_ts_aux_delete_", location="eastus2", subscription=AUX_SUBSCRIPTION)
1144+
def test_delete_template_spec_with_aux_subscription(self, resource_group):
1145+
curr_dir = os.path.dirname(os.path.realpath(__file__))
1146+
template_spec_name = self.create_random_name('cli-test-ts-aux-delete', 60)
1147+
self.kwargs.update({
1148+
"aux_rg": resource_group,
1149+
"aux_subscription": AUX_SUBSCRIPTION,
1150+
"template_spec_name": template_spec_name,
1151+
'tf': os.path.join(curr_dir, 'simple_deploy.json').replace('\\', '\\\\'),
1152+
})
1153+
1154+
result = self.cmd('ts create -g {aux_rg} -n {template_spec_name} -v 1.0 -l eastus2 -f "{tf}" --subscription {aux_subscription}').get_output_in_json()
1155+
self.kwargs['template_spec_version_id'] = result['id']
1156+
self.kwargs['template_spec_id'] = result['id'].replace('/versions/1.0', '')
1157+
self.assertIn(AUX_SUBSCRIPTION, result['id'])
1158+
1159+
self.cmd('ts delete --template-spec {template_spec_id} --yes')
1160+
10791161
@ResourceGroupPreparer(name_prefix='cli_test_template_specs', location='westus')
10801162
def test_template_spec_create_and_update_with_tags(self, resource_group, resource_group_location):
10811163
curr_dir = os.path.dirname(os.path.realpath(__file__))
@@ -1197,6 +1279,32 @@ def test_template_spec_export_error_handling(self, resource_group, resource_grou
11971279
self.cmd('ts export -g {rg} --name {template_spec_name} --output-folder {output_folder}')
11981280
self.assertTrue('Please specify the template spec version for export' in str(err.exception))
11991281

1282+
@live_only()
1283+
@ResourceGroupPreparer(name_prefix="cli_test_ts_aux_export_", location="eastus2", subscription=AUX_SUBSCRIPTION)
1284+
def test_template_spec_export_with_aux_subscription(self, resource_group):
1285+
curr_dir = os.path.dirname(os.path.realpath(__file__))
1286+
dir_name = self.create_random_name('TemplateSpecExportAux', 30)
1287+
template_spec_name = self.create_random_name('cli-test-ts-aux-export', 60)
1288+
self.kwargs.update({
1289+
"aux_rg": resource_group,
1290+
"aux_subscription": AUX_SUBSCRIPTION,
1291+
"template_spec_name": template_spec_name,
1292+
'tf': os.path.join(curr_dir, 'simple_deploy.json').replace('\\', '\\\\'),
1293+
'output_folder': os.path.join(curr_dir, dir_name).replace('\\', '\\\\'),
1294+
})
1295+
1296+
result = self.cmd('ts create -g {aux_rg} -n {template_spec_name} -v 1.0 -l eastus2 -f "{tf}" --subscription {aux_subscription}').get_output_in_json()
1297+
self.kwargs['template_spec_version_id'] = result['id']
1298+
self.kwargs['template_spec_id'] = result['id'].replace('/versions/1.0', '')
1299+
self.assertIn(AUX_SUBSCRIPTION, result['id'])
1300+
1301+
os.makedirs(self.kwargs['output_folder'])
1302+
output_path = self.cmd('ts export --template-spec {template_spec_version_id} --output-folder {output_folder}').get_output_in_json()
1303+
template_file = os.path.join(output_path, (self.kwargs['template_spec_name'] + '.json'))
1304+
self.assertTrue(os.path.isfile(template_file))
1305+
1306+
self.cmd('ts delete --template-spec {template_spec_id} --yes --subscription {aux_subscription}')
1307+
12001308

12011309
class DeploymentTestsWithQueryString(LiveScenarioTest):
12021310
@ResourceGroupPreparer(name_prefix='cli_test_query_str_rg', location='eastus')

0 commit comments

Comments
 (0)