Skip to content

Commit 298a0ea

Browse files
{Compute} az vmss deallocate: Migrate command to aaz-based implementation (#32785)
1 parent 716847e commit 298a0ea

File tree

6 files changed

+364
-12
lines changed

6 files changed

+364
-12
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from .__cmd_group import *
1212
from ._create import *
13+
from ._deallocate import *
1314
from ._delete import *
1415
from ._delete_instances import *
1516
from ._get_os_upgrade_history import *
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
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+
class Deallocate(AAZCommand):
15+
"""Deallocates specific virtual machines in a VM scale set. Shuts down the virtual machines and releases the compute resources. You are not billed for the compute resources that this virtual machine scale set deallocates.
16+
"""
17+
18+
_aaz_info = {
19+
"version": "2024-11-01",
20+
"resources": [
21+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.compute/virtualmachinescalesets/{}/deallocate", "2024-11-01"],
22+
]
23+
}
24+
25+
AZ_SUPPORT_NO_WAIT = True
26+
27+
def _handler(self, command_args):
28+
super()._handler(command_args)
29+
return self.build_lro_poller(self._execute_operations, None)
30+
31+
_args_schema = None
32+
33+
@classmethod
34+
def _build_arguments_schema(cls, *args, **kwargs):
35+
if cls._args_schema is not None:
36+
return cls._args_schema
37+
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)
38+
39+
# define Arg Group ""
40+
41+
_args_schema = cls._args_schema
42+
_args_schema.resource_group = AAZResourceGroupNameArg(
43+
required=True,
44+
)
45+
_args_schema.vm_scale_set_name = AAZStrArg(
46+
options=["--vm-scale-set-name"],
47+
help="The name of the VM scale set.",
48+
required=True,
49+
id_part="name",
50+
)
51+
_args_schema.hibernate = AAZBoolArg(
52+
options=["--hibernate"],
53+
help="Optional parameter to hibernate a virtual machine from the VM scale set. (This feature is available for VMSS with Flexible OrchestrationMode only)",
54+
)
55+
56+
# define Arg Group "VmInstanceIDs"
57+
58+
_args_schema = cls._args_schema
59+
_args_schema.instance_ids = AAZListArg(
60+
options=["--instance-ids"],
61+
arg_group="VmInstanceIDs",
62+
help="The virtual machine scale set instance ids. Omitting the virtual machine scale set instance ids will result in the operation being performed on all virtual machines in the virtual machine scale set.",
63+
)
64+
65+
instance_ids = cls._args_schema.instance_ids
66+
instance_ids.Element = AAZStrArg()
67+
return cls._args_schema
68+
69+
def _execute_operations(self):
70+
self.pre_operations()
71+
yield self.VirtualMachineScaleSetsDeallocate(ctx=self.ctx)()
72+
self.post_operations()
73+
74+
@register_callback
75+
def pre_operations(self):
76+
pass
77+
78+
@register_callback
79+
def post_operations(self):
80+
pass
81+
82+
class VirtualMachineScaleSetsDeallocate(AAZHttpOperation):
83+
CLIENT_TYPE = "MgmtClient"
84+
85+
def __call__(self, *args, **kwargs):
86+
request = self.make_request()
87+
session = self.client.send_request(request=request, stream=False, **kwargs)
88+
if session.http_response.status_code in [202]:
89+
return self.client.build_lro_polling(
90+
self.ctx.args.no_wait,
91+
session,
92+
self.on_200,
93+
self.on_error,
94+
lro_options={"final-state-via": "location"},
95+
path_format_arguments=self.url_parameters,
96+
)
97+
if session.http_response.status_code in [200]:
98+
return self.client.build_lro_polling(
99+
self.ctx.args.no_wait,
100+
session,
101+
self.on_200,
102+
self.on_error,
103+
lro_options={"final-state-via": "location"},
104+
path_format_arguments=self.url_parameters,
105+
)
106+
107+
return self.on_error(session.http_response)
108+
109+
@property
110+
def url(self):
111+
return self.client.format_url(
112+
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}/deallocate",
113+
**self.url_parameters
114+
)
115+
116+
@property
117+
def method(self):
118+
return "POST"
119+
120+
@property
121+
def error_format(self):
122+
return "ODataV4Format"
123+
124+
@property
125+
def url_parameters(self):
126+
parameters = {
127+
**self.serialize_url_param(
128+
"resourceGroupName", self.ctx.args.resource_group,
129+
required=True,
130+
),
131+
**self.serialize_url_param(
132+
"subscriptionId", self.ctx.subscription_id,
133+
required=True,
134+
),
135+
**self.serialize_url_param(
136+
"vmScaleSetName", self.ctx.args.vm_scale_set_name,
137+
required=True,
138+
),
139+
}
140+
return parameters
141+
142+
@property
143+
def query_parameters(self):
144+
parameters = {
145+
**self.serialize_query_param(
146+
"hibernate", self.ctx.args.hibernate,
147+
),
148+
**self.serialize_query_param(
149+
"api-version", "2024-11-01",
150+
required=True,
151+
),
152+
}
153+
return parameters
154+
155+
@property
156+
def header_parameters(self):
157+
parameters = {
158+
**self.serialize_header_param(
159+
"Content-Type", "application/json",
160+
),
161+
}
162+
return parameters
163+
164+
@property
165+
def content(self):
166+
_content_value, _builder = self.new_content_builder(
167+
self.ctx.args,
168+
typ=AAZObjectType,
169+
typ_kwargs={"flags": {"client_flatten": True}}
170+
)
171+
_builder.set_prop("instanceIds", AAZListType, ".instance_ids")
172+
173+
instance_ids = _builder.get(".instanceIds")
174+
if instance_ids is not None:
175+
instance_ids.set_elements(AAZStrType, ".")
176+
177+
return self.serialize_content(_content_value)
178+
179+
def on_200(self, session):
180+
pass
181+
182+
183+
class _DeallocateHelper:
184+
"""Helper class for Deallocate"""
185+
186+
187+
__all__ = ["Deallocate"]

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010

1111
from .__cmd_group import *
1212
from ._create import *
13+
from ._deallocate import *
1314
from ._show import *
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
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+
class Deallocate(AAZCommand):
15+
"""Deallocates a specific virtual machine in a VM scale set. Shuts down the virtual machine and releases the compute resources it uses. You are not billed for the compute resources of this virtual machine once it is deallocated.
16+
"""
17+
18+
_aaz_info = {
19+
"version": "2024-11-01",
20+
"resources": [
21+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.compute/virtualmachinescalesets/{}/virtualmachines/{}/deallocate", "2024-11-01"],
22+
]
23+
}
24+
25+
AZ_SUPPORT_NO_WAIT = True
26+
27+
def _handler(self, command_args):
28+
super()._handler(command_args)
29+
return self.build_lro_poller(self._execute_operations, None)
30+
31+
_args_schema = None
32+
33+
@classmethod
34+
def _build_arguments_schema(cls, *args, **kwargs):
35+
if cls._args_schema is not None:
36+
return cls._args_schema
37+
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)
38+
39+
# define Arg Group ""
40+
41+
_args_schema = cls._args_schema
42+
_args_schema.instance_id = AAZStrArg(
43+
options=["--instance-id"],
44+
help="The instance ID of the virtual machine.",
45+
required=True,
46+
id_part="child_name_1",
47+
)
48+
_args_schema.resource_group = AAZResourceGroupNameArg(
49+
required=True,
50+
)
51+
_args_schema.vm_scale_set_name = AAZStrArg(
52+
options=["--vm-scale-set-name"],
53+
help="The name of the VM scale set.",
54+
required=True,
55+
id_part="name",
56+
)
57+
return cls._args_schema
58+
59+
def _execute_operations(self):
60+
self.pre_operations()
61+
yield self.VirtualMachineScaleSetVMsDeallocate(ctx=self.ctx)()
62+
self.post_operations()
63+
64+
@register_callback
65+
def pre_operations(self):
66+
pass
67+
68+
@register_callback
69+
def post_operations(self):
70+
pass
71+
72+
class VirtualMachineScaleSetVMsDeallocate(AAZHttpOperation):
73+
CLIENT_TYPE = "MgmtClient"
74+
75+
def __call__(self, *args, **kwargs):
76+
request = self.make_request()
77+
session = self.client.send_request(request=request, stream=False, **kwargs)
78+
if session.http_response.status_code in [202]:
79+
return self.client.build_lro_polling(
80+
self.ctx.args.no_wait,
81+
session,
82+
self.on_200,
83+
self.on_error,
84+
lro_options={"final-state-via": "location"},
85+
path_format_arguments=self.url_parameters,
86+
)
87+
if session.http_response.status_code in [200]:
88+
return self.client.build_lro_polling(
89+
self.ctx.args.no_wait,
90+
session,
91+
self.on_200,
92+
self.on_error,
93+
lro_options={"final-state-via": "location"},
94+
path_format_arguments=self.url_parameters,
95+
)
96+
97+
return self.on_error(session.http_response)
98+
99+
@property
100+
def url(self):
101+
return self.client.format_url(
102+
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}/virtualMachines/{instanceId}/deallocate",
103+
**self.url_parameters
104+
)
105+
106+
@property
107+
def method(self):
108+
return "POST"
109+
110+
@property
111+
def error_format(self):
112+
return "ODataV4Format"
113+
114+
@property
115+
def url_parameters(self):
116+
parameters = {
117+
**self.serialize_url_param(
118+
"instanceId", self.ctx.args.instance_id,
119+
required=True,
120+
),
121+
**self.serialize_url_param(
122+
"resourceGroupName", self.ctx.args.resource_group,
123+
required=True,
124+
),
125+
**self.serialize_url_param(
126+
"subscriptionId", self.ctx.subscription_id,
127+
required=True,
128+
),
129+
**self.serialize_url_param(
130+
"vmScaleSetName", self.ctx.args.vm_scale_set_name,
131+
required=True,
132+
),
133+
}
134+
return parameters
135+
136+
@property
137+
def query_parameters(self):
138+
parameters = {
139+
**self.serialize_query_param(
140+
"api-version", "2024-11-01",
141+
required=True,
142+
),
143+
}
144+
return parameters
145+
146+
def on_200(self, session):
147+
pass
148+
149+
150+
class _DeallocateHelper:
151+
"""Helper class for Deallocate"""
152+
153+
154+
__all__ = ["Deallocate"]

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,12 @@ def load_command_table(self, _):
403403
g.custom_command('identity remove', 'remove_vmss_identity', validator=process_remove_identity_namespace, is_preview=True)
404404
g.custom_show_command('identity show', 'show_vmss_identity')
405405

406+
g.custom_command('deallocate', 'deallocate_vmss', supports_no_wait=True)
407+
406408
with self.command_group('vmss', compute_vmss_sdk, operation_group='virtual_machine_scale_sets') as g:
407409
g.custom_command('application set', 'set_vmss_applications', validator=process_set_applications_namespace, min_api='2021-07-01')
408410
g.custom_command('application list', 'list_vmss_applications', min_api='2021-07-01')
409411
g.custom_command('create', 'create_vmss', transform=DeploymentOutputLongRunningOperation(self.cli_ctx, 'Starting vmss create'), supports_no_wait=True, table_transformer=deployment_validate_table_format, validator=process_vmss_create_namespace, exception_handler=handle_template_based_exception)
410-
g.custom_command('deallocate', 'deallocate_vmss', supports_no_wait=True)
411412
g.custom_command('get-instance-view', 'get_vmss_instance_view', table_transformer='{ProvisioningState:statuses[0].displayStatus, PowerState:statuses[1].displayStatus}')
412413
g.custom_command('list-instance-connection-info', 'list_vmss_instance_connection_info')
413414
g.custom_command('list-instance-public-ips', 'list_vmss_instance_public_ips')

0 commit comments

Comments
 (0)