Skip to content

Commit f6cb820

Browse files
authored
{Compute} az vm: Migrate commands to CodeGen based (#31658)
1 parent a5303b1 commit f6cb820

18 files changed

Lines changed: 10439 additions & 5136 deletions

File tree

src/azure-cli/azure/cli/command_modules/vm/_format.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ def transform_vm_create_output(result):
3838
from azure.mgmt.core.tools import parse_resource_id
3939
from collections import OrderedDict
4040
try:
41-
resource_group = getattr(result, 'resource_group', None) or parse_resource_id(result.id)['resource_group']
42-
output = OrderedDict([('id', result.id),
41+
resource_group = result.get('resource_group', None) or parse_resource_id(result['id'])['resource_group']
42+
output = OrderedDict([('id', result['id']),
4343
('resourceGroup', resource_group),
44-
('powerState', result.power_state),
45-
('publicIpAddress', result.public_ips),
46-
('fqdns', result.fqdns),
47-
('privateIpAddress', result.private_ips),
48-
('macAddress', result.mac_addresses),
49-
('location', result.location)])
50-
if getattr(result, 'identity', None):
51-
output['identity'] = result.identity
52-
if hasattr(result, 'zones'): # output 'zones' column even the property value is None
53-
output['zones'] = result.zones[0] if result.zones else ''
44+
('powerState', result.get('powerState', '')),
45+
('publicIpAddress', result.get('publicIps', '')),
46+
('fqdns', result.get('fqdns', '')),
47+
('privateIpAddress', result.get('privateIps', '')),
48+
('macAddress', result.get('macAddresses', '')),
49+
('location', result.get('location', ''))])
50+
if result.get('identity', None):
51+
output['identity'] = result['identity']
52+
if 'zones' in result: # output 'zones' column even the property value is None
53+
output['zones'] = result['zones'][0] if result['zones'] else ''
5454
return output
5555
except AttributeError:
5656
from msrest.pipeline import ClientRawResponse

src/azure-cli/azure/cli/command_modules/vm/_help.py

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,33 +1058,6 @@
10581058
az vm boot-diagnostics get-boot-log-uris -g MyResourceGroup -n MyVirtualMachine
10591059
"""
10601060

1061-
helps['vm capture'] = """
1062-
type: command
1063-
short-summary: Capture information for a stopped VM.
1064-
long-summary: 'For an end-to-end tutorial, see https://learn.microsoft.com/azure/virtual-machines/linux/capture-image'
1065-
parameters:
1066-
- name: --vhd-name-prefix
1067-
type: string
1068-
short-summary: The VHD name prefix specify for the VM disks.
1069-
- name: --storage-container
1070-
short-summary: The storage account container name in which to save the disks.
1071-
- name: --overwrite
1072-
short-summary: Overwrite the existing disk file.
1073-
examples:
1074-
- name: Deallocate, generalize, and capture a stopped virtual machine.
1075-
text: |
1076-
az vm deallocate -g MyResourceGroup -n MyVm
1077-
az vm generalize -g MyResourceGroup -n MyVm
1078-
az vm capture -g MyResourceGroup -n MyVm --vhd-name-prefix MyPrefix
1079-
- name: Deallocate, generalize, and capture multiple stopped virtual machines.
1080-
text: |
1081-
vms_ids=$(az vm list -g MyResourceGroup --query "[].id" -o tsv)
1082-
az vm deallocate --ids {vms_ids}
1083-
az vm generalize --ids {vms_ids}
1084-
az vm capture --ids {vms_ids} --vhd-name-prefix MyPrefix
1085-
1086-
"""
1087-
10881061
helps['vm create'] = """
10891062
type: command
10901063
short-summary: Create an Azure Virtual Machine.
@@ -1188,22 +1161,6 @@
11881161
az vm create -n MyVm -g MyResourceGroup --image /CommunityGalleries/{gallery_unique_name}/Images/{image}/Versions/{version}
11891162
"""
11901163

1191-
helps['vm delete'] = """
1192-
type: command
1193-
short-summary: Delete a VM.
1194-
parameters:
1195-
- name: --force-deletion
1196-
short-summary: Optional parameter to force delete virtual machines. Default value is None.
1197-
examples:
1198-
- name: Delete a VM without a prompt for confirmation.
1199-
text: >
1200-
az vm delete -g MyResourceGroup -n MyVm --yes
1201-
- name: Delete all VMs in a resource group.
1202-
text: >
1203-
az vm delete --ids $(az vm list -g MyResourceGroup --query "[].id" -o tsv)
1204-
1205-
"""
1206-
12071164
helps['vm diagnostics'] = """
12081165
type: group
12091166
short-summary: Configure the Azure Virtual Machine diagnostics extension.

src/azure-cli/azure/cli/command_modules/vm/_params.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,6 @@ def load_arguments(self, _):
409409
c.argument('nsg_rule', help='NSG rule to create when creating a new NSG. Defaults to open ports for allowing RDP on Windows and allowing SSH on Linux.', arg_group='Network', arg_type=get_enum_type(['RDP', 'SSH']))
410410
c.argument('application_security_groups', min_api='2017-09-01', nargs='+', options_list=['--asgs'], help='Space-separated list of existing application security groups to associate with the VM.', arg_group='Network')
411411
c.argument('workspace', is_preview=True, arg_group='Monitor', help='Name or ID of Log Analytics Workspace. If you specify the workspace through its name, the workspace should be in the same resource group with the vm, otherwise a new workspace will be created.')
412-
with self.argument_context('vm capture') as c:
413-
c.argument('overwrite', action='store_true')
414412

415413
with self.argument_context('vm update') as c:
416414
c.argument('os_disk', min_api='2017-12-01', help="Managed OS disk ID or name to swap to")

src/azure-cli/azure/cli/command_modules/vm/aaz/latest/vm/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010

1111
from .__cmd_group import *
1212
from ._assess_patches import *
13+
from ._capture import *
1314
from ._convert import *
1415
from ._deallocate import *
16+
from ._delete import *
1517
from ._generalize import *
18+
from ._list import *
19+
from ._list_all import *
1620
from ._list_sizes import *
1721
from ._list_skus import *
1822
from ._list_vm_resize_options import *
@@ -25,3 +29,4 @@
2529
from ._simulate_eviction import *
2630
from ._start import *
2731
from ._update import *
32+
from ._wait import *
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
# --------------------------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for license information.
4+
#
5+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: skip-file
9+
# flake8: noqa
10+
11+
from azure.cli.core.aaz import *
12+
13+
14+
@register_command(
15+
"vm capture",
16+
)
17+
class Capture(AAZCommand):
18+
"""Capture information for a stopped VM.
19+
20+
For an end-to-end tutorial, see https://learn.microsoft.com/azure/virtual-machines/linux/capture-image
21+
22+
:example: Deallocate, generalize, and capture a stopped virtual machine.
23+
az vm deallocate -g MyResourceGroup -n MyVm
24+
az vm generalize -g MyResourceGroup -n MyVm
25+
az vm capture -g MyResourceGroup -n MyVm --vhd-name-prefix MyPrefix
26+
27+
:example: Deallocate, generalize, and capture multiple stopped virtual machines.
28+
az vm deallocate --ids MyVmIds
29+
az vm generalize --ids MyVmIds
30+
az vm capture --ids MyVmIds --vhd-name-prefix MyPrefix
31+
"""
32+
33+
_aaz_info = {
34+
"version": "2024-11-01",
35+
"resources": [
36+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.compute/virtualmachines/{}/capture", "2024-11-01"],
37+
]
38+
}
39+
40+
AZ_SUPPORT_NO_WAIT = True
41+
42+
def _handler(self, command_args):
43+
super()._handler(command_args)
44+
return self.build_lro_poller(self._execute_operations, self._output)
45+
46+
_args_schema = None
47+
48+
@classmethod
49+
def _build_arguments_schema(cls, *args, **kwargs):
50+
if cls._args_schema is not None:
51+
return cls._args_schema
52+
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)
53+
54+
# define Arg Group ""
55+
56+
_args_schema = cls._args_schema
57+
_args_schema.resource_group = AAZResourceGroupNameArg(
58+
required=True,
59+
)
60+
_args_schema.name = AAZStrArg(
61+
options=["-n", "--name"],
62+
help="The name of the virtual machine.",
63+
required=True,
64+
id_part="name",
65+
)
66+
67+
# define Arg Group "Parameters"
68+
69+
_args_schema = cls._args_schema
70+
_args_schema.storage_container = AAZStrArg(
71+
options=["--storage-container"],
72+
arg_group="Parameters",
73+
help="The storage account container name in which to save the disks.",
74+
required=True,
75+
default="vhds",
76+
)
77+
_args_schema.overwrite = AAZBoolArg(
78+
options=["--overwrite"],
79+
arg_group="Parameters",
80+
help="Overwrite the existing disk file.",
81+
required=True,
82+
default=True,
83+
)
84+
_args_schema.vhd_name_prefix = AAZStrArg(
85+
options=["--vhd-name-prefix"],
86+
arg_group="Parameters",
87+
help="The VHD name prefix specify for the VM disks.",
88+
required=True,
89+
)
90+
return cls._args_schema
91+
92+
def _execute_operations(self):
93+
self.pre_operations()
94+
yield self.VirtualMachinesCapture(ctx=self.ctx)()
95+
self.post_operations()
96+
97+
@register_callback
98+
def pre_operations(self):
99+
pass
100+
101+
@register_callback
102+
def post_operations(self):
103+
pass
104+
105+
def _output(self, *args, **kwargs):
106+
result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True)
107+
return result
108+
109+
class VirtualMachinesCapture(AAZHttpOperation):
110+
CLIENT_TYPE = "MgmtClient"
111+
112+
def __call__(self, *args, **kwargs):
113+
request = self.make_request()
114+
session = self.client.send_request(request=request, stream=False, **kwargs)
115+
if session.http_response.status_code in [202]:
116+
return self.client.build_lro_polling(
117+
self.ctx.args.no_wait,
118+
session,
119+
self.on_200,
120+
self.on_error,
121+
lro_options={"final-state-via": "location"},
122+
path_format_arguments=self.url_parameters,
123+
)
124+
if session.http_response.status_code in [200]:
125+
return self.client.build_lro_polling(
126+
self.ctx.args.no_wait,
127+
session,
128+
self.on_200,
129+
self.on_error,
130+
lro_options={"final-state-via": "location"},
131+
path_format_arguments=self.url_parameters,
132+
)
133+
134+
return self.on_error(session.http_response)
135+
136+
@property
137+
def url(self):
138+
return self.client.format_url(
139+
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/capture",
140+
**self.url_parameters
141+
)
142+
143+
@property
144+
def method(self):
145+
return "POST"
146+
147+
@property
148+
def error_format(self):
149+
return "ODataV4Format"
150+
151+
@property
152+
def url_parameters(self):
153+
parameters = {
154+
**self.serialize_url_param(
155+
"resourceGroupName", self.ctx.args.resource_group,
156+
required=True,
157+
),
158+
**self.serialize_url_param(
159+
"subscriptionId", self.ctx.subscription_id,
160+
required=True,
161+
),
162+
**self.serialize_url_param(
163+
"vmName", self.ctx.args.name,
164+
required=True,
165+
),
166+
}
167+
return parameters
168+
169+
@property
170+
def query_parameters(self):
171+
parameters = {
172+
**self.serialize_query_param(
173+
"api-version", "2024-11-01",
174+
required=True,
175+
),
176+
}
177+
return parameters
178+
179+
@property
180+
def header_parameters(self):
181+
parameters = {
182+
**self.serialize_header_param(
183+
"Content-Type", "application/json",
184+
),
185+
**self.serialize_header_param(
186+
"Accept", "application/json",
187+
),
188+
}
189+
return parameters
190+
191+
@property
192+
def content(self):
193+
_content_value, _builder = self.new_content_builder(
194+
self.ctx.args,
195+
typ=AAZObjectType,
196+
typ_kwargs={"flags": {"required": True, "client_flatten": True}}
197+
)
198+
_builder.set_prop("destinationContainerName", AAZStrType, ".storage_container", typ_kwargs={"flags": {"required": True}})
199+
_builder.set_prop("overwriteVhds", AAZBoolType, ".overwrite", typ_kwargs={"flags": {"required": True}})
200+
_builder.set_prop("vhdPrefix", AAZStrType, ".vhd_name_prefix", typ_kwargs={"flags": {"required": True}})
201+
202+
return self.serialize_content(_content_value)
203+
204+
def on_200(self, session):
205+
data = self.deserialize_http_content(session)
206+
self.ctx.set_var(
207+
"instance",
208+
data,
209+
schema_builder=self._build_schema_on_200
210+
)
211+
212+
_schema_on_200 = None
213+
214+
@classmethod
215+
def _build_schema_on_200(cls):
216+
if cls._schema_on_200 is not None:
217+
return cls._schema_on_200
218+
219+
cls._schema_on_200 = AAZObjectType()
220+
221+
_schema_on_200 = cls._schema_on_200
222+
_schema_on_200["$schema"] = AAZStrType(
223+
flags={"read_only": True},
224+
)
225+
_schema_on_200.content_version = AAZStrType(
226+
serialized_name="contentVersion",
227+
flags={"read_only": True},
228+
)
229+
_schema_on_200.id = AAZStrType()
230+
_schema_on_200.parameters = AAZDictType(
231+
flags={"read_only": True},
232+
)
233+
_schema_on_200.resources = AAZListType(
234+
flags={"read_only": True},
235+
)
236+
237+
parameters = cls._schema_on_200.parameters
238+
parameters.Element = AAZAnyType()
239+
240+
resources = cls._schema_on_200.resources
241+
resources.Element = AAZDictType()
242+
243+
_element = cls._schema_on_200.resources.Element
244+
_element.Element = AAZAnyType()
245+
246+
return cls._schema_on_200
247+
248+
249+
class _CaptureHelper:
250+
"""Helper class for Capture"""
251+
252+
253+
__all__ = ["Capture"]

0 commit comments

Comments
 (0)