Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ def cf_vm_image_term(cli_ctx, _):
return market_place_client.marketplace_agreements


def cf_usage(cli_ctx, _):
return _compute_client_factory(cli_ctx).usage


def cf_vmss(cli_ctx, _):
return _compute_client_factory(cli_ctx).virtual_machine_scale_sets

Expand Down
9 changes: 0 additions & 9 deletions src/azure-cli/azure/cli/command_modules/vm/_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,6 @@ def transform_vm_create_output(result):
return None if isinstance(result, ClientRawResponse) else result


def transform_vm_usage_list(result):
result = list(result)
for item in result:
item.current_value = str(item.current_value)
item.limit = str(item.limit)
item.local_name = item.name.localized_value
return result


def transform_vm_list(vm_list):
return [transform_vm(v) for v in vm_list]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from ._list_all import *
from ._list_sizes import *
from ._list_skus import *
from ._list_usage import *
from ._list_vm_resize_options import *
from ._migrate_to_vmss import *
from ._patch import *
Expand All @@ -31,6 +32,7 @@
from ._show import *
from ._simulate_eviction import *
from ._start import *
from ._stop import *
from ._update import *
from ._wait import *
from ._restart import *
from ._restart import *
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#
# Code generated by aaz-dev-tools
# --------------------------------------------------------------------------------------------

# pylint: skip-file
# flake8: noqa

from azure.cli.core.aaz import *


@register_command(
"vm list-usage",
)
class ListUsage(AAZCommand):
"""List available usage resources for VMs.

:example: Get the compute resource usage for the West US region.
az vm list-usage -l westus
"""

_aaz_info = {
"version": "2024-11-01",
"resources": [
["mgmt-plane", "/subscriptions/{}/providers/microsoft.compute/locations/{}/usages", "2024-11-01"],
]
}

AZ_SUPPORT_PAGINATION = True

def _handler(self, command_args):
super()._handler(command_args)
return self.build_paging(self._execute_operations, self._output)

_args_schema = None

@classmethod
def _build_arguments_schema(cls, *args, **kwargs):
if cls._args_schema is not None:
return cls._args_schema
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)

# define Arg Group ""

_args_schema = cls._args_schema
_args_schema.location = AAZResourceLocationArg(
help="Location. Values from: `az account list-locations`. You can configure the default location using `az configure --defaults location=<location>`.",
required=True,
)
return cls._args_schema

def _execute_operations(self):
self.pre_operations()
self.UsageList(ctx=self.ctx)()
self.post_operations()

@register_callback
def pre_operations(self):
pass

@register_callback
def post_operations(self):
pass

def _output(self, *args, **kwargs):
result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True)
next_link = self.deserialize_output(self.ctx.vars.instance.next_link)
return result, next_link

class UsageList(AAZHttpOperation):
CLIENT_TYPE = "MgmtClient"

def __call__(self, *args, **kwargs):
request = self.make_request()
session = self.client.send_request(request=request, stream=False, **kwargs)
if session.http_response.status_code in [200]:
return self.on_200(session)

return self.on_error(session.http_response)

@property
def url(self):
return self.client.format_url(
"/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/usages",
**self.url_parameters
)

@property
def method(self):
return "GET"

@property
def error_format(self):
return "ODataV4Format"

@property
def url_parameters(self):
parameters = {
**self.serialize_url_param(
"location", self.ctx.args.location,
required=True,
),
**self.serialize_url_param(
"subscriptionId", self.ctx.subscription_id,
required=True,
),
}
return parameters

@property
def query_parameters(self):
parameters = {
**self.serialize_query_param(
"api-version", "2024-11-01",
required=True,
),
}
return parameters

@property
def header_parameters(self):
parameters = {
**self.serialize_header_param(
"Accept", "application/json",
),
}
return parameters

def on_200(self, session):
data = self.deserialize_http_content(session)
self.ctx.set_var(
"instance",
data,
schema_builder=self._build_schema_on_200
)

_schema_on_200 = None

@classmethod
def _build_schema_on_200(cls):
if cls._schema_on_200 is not None:
return cls._schema_on_200

cls._schema_on_200 = AAZObjectType()

_schema_on_200 = cls._schema_on_200
_schema_on_200.next_link = AAZStrType(
serialized_name="nextLink",
)
_schema_on_200.value = AAZListType(
flags={"required": True},
)

value = cls._schema_on_200.value
value.Element = AAZObjectType()

_element = cls._schema_on_200.value.Element
_element.current_value = AAZIntType(
serialized_name="currentValue",
flags={"required": True},
)
_element.limit = AAZIntType(
flags={"required": True},
)
_element.name = AAZObjectType(
flags={"required": True},
)
_element.unit = AAZStrType(
flags={"required": True},
)

name = cls._schema_on_200.value.Element.name
name.localized_value = AAZStrType(
serialized_name="localizedValue",
)
name.value = AAZStrType()

return cls._schema_on_200


class _ListUsageHelper:
"""Helper class for ListUsage"""


__all__ = ["ListUsage"]
165 changes: 165 additions & 0 deletions src/azure-cli/azure/cli/command_modules/vm/aaz/latest/vm/_stop.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#
# Code generated by aaz-dev-tools
# --------------------------------------------------------------------------------------------

# pylint: skip-file
# flake8: noqa

from azure.cli.core.aaz import *


@register_command(
"vm stop",
)
class Stop(AAZCommand):
"""Power off (stop) a running VM.

The VM will continue to be billed. To avoid this, you can deallocate the VM through "az vm deallocate".

:example: Power off (stop) a running VM.
az vm stop --resource-group MyResourceGroup --name MyVm

:example: Power off a running VM without shutting down.
az vm stop --resource-group MyResourceGroup --name MyVm --skip-shutdown

:example: Power off VMs in a resource group.
az vm stop --ids $(az vm list -g MyResourceGroup --query "[].id" -o tsv)
"""

_aaz_info = {
"version": "2024-11-01",
"resources": [
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.compute/virtualmachines/{}/poweroff", "2024-11-01"],
]
}

AZ_SUPPORT_NO_WAIT = True

def _handler(self, command_args):
super()._handler(command_args)
return self.build_lro_poller(self._execute_operations, None)

_args_schema = None

@classmethod
def _build_arguments_schema(cls, *args, **kwargs):
if cls._args_schema is not None:
return cls._args_schema
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)

# define Arg Group ""

_args_schema = cls._args_schema
_args_schema.resource_group = AAZResourceGroupNameArg(
required=True,
)
_args_schema.name = AAZStrArg(
options=["-n", "--name"],
help="The name of the virtual machine.",
required=True,
id_part="name",
)
Comment on lines +59 to +64
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name argument is missing configured_default="vm" and the --vm-name option alias, which are present in every other VM command in this directory (e.g., _deallocate.py, _restart.py, _start.py, _reimage.py, etc.). Without configured_default="vm", users who have set a default VM name via az configure --defaults vm=<name> will find that az vm stop no longer picks up the default. The argument should be named vm_name with options=["-n", "--name", "--vm-name"] and include configured_default="vm" to be consistent with the other commands.

Copilot uses AI. Check for mistakes.
_args_schema.skip_shutdown = AAZBoolArg(
options=["--skip-shutdown"],
help="The parameter to request non-graceful VM shutdown. True value for this flag indicates non-graceful shutdown whereas false indicates otherwise. Default value for this flag is false if not specified",
)
return cls._args_schema

def _execute_operations(self):
self.pre_operations()
yield self.VirtualMachinesPowerOff(ctx=self.ctx)()
self.post_operations()

@register_callback
def pre_operations(self):
pass

@register_callback
def post_operations(self):
pass

class VirtualMachinesPowerOff(AAZHttpOperation):
CLIENT_TYPE = "MgmtClient"

def __call__(self, *args, **kwargs):
request = self.make_request()
session = self.client.send_request(request=request, stream=False, **kwargs)
if session.http_response.status_code in [202]:
return self.client.build_lro_polling(
self.ctx.args.no_wait,
session,
self.on_200,
self.on_error,
lro_options={"final-state-via": "location"},
path_format_arguments=self.url_parameters,
)
if session.http_response.status_code in [200]:
return self.client.build_lro_polling(
self.ctx.args.no_wait,
session,
self.on_200,
self.on_error,
lro_options={"final-state-via": "location"},
path_format_arguments=self.url_parameters,
)

return self.on_error(session.http_response)

@property
def url(self):
return self.client.format_url(
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/powerOff",
**self.url_parameters
)

@property
def method(self):
return "POST"

@property
def error_format(self):
return "ODataV4Format"

@property
def url_parameters(self):
parameters = {
**self.serialize_url_param(
"resourceGroupName", self.ctx.args.resource_group,
required=True,
),
**self.serialize_url_param(
"subscriptionId", self.ctx.subscription_id,
required=True,
),
**self.serialize_url_param(
"vmName", self.ctx.args.name,
required=True,
),
}
return parameters

@property
def query_parameters(self):
parameters = {
**self.serialize_query_param(
"skipShutdown", self.ctx.args.skip_shutdown,
),
**self.serialize_query_param(
"api-version", "2024-11-01",
required=True,
),
}
return parameters

def on_200(self, session):
pass


class _StopHelper:
"""Helper class for Stop"""


__all__ = ["Stop"]
Loading
Loading