Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/azure-cli/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ Release History
* `az network ddos-custom-policy`: Support specifying frontend IP configuration associations (#33413)
* `az network traffic-manager profile create/update`: Add `--record-type` parameter to support record type filtering (#33503)
* `az network private-endpoint-connection`: Add provider `Microsoft.HorizonDB/clusters` (#33644)
* `az network virtual-appliance migration prepare/execute/commit/abort`: Add commands to migrate a Network Virtual Appliance to the new internal load balancer (ILB) architecture

**Packaging**

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# --------------------------------------------------------------------------------------------
# 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_group(
"network virtual-appliance migration",
)
class __CMDGroup(AAZCommandGroup):
"""Manage the infrastructure migration of an Azure Network Virtual Appliance.

The migration workflow is executed in phases. Run `prepare` first, then `execute`, and finally
`commit` to complete the migration or `abort` to roll it back.
"""
pass


__all__ = ["__CMDGroup"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# --------------------------------------------------------------------------------------------
# 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 .__cmd_group import *
from ._abort import *
from ._commit import *
from ._execute import *
from ._prepare import *
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
# --------------------------------------------------------------------------------------------
# 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(
"network virtual-appliance migration abort",
confirmation="Are you sure you want to abort the in-progress migration for this Network Virtual Appliance?",
)
class Abort(AAZCommand):
"""Abort an in-progress migration of a Network Virtual Appliance.

Aborting a migration discards any changes staged by the `prepare` or `execute` phases and restores
the Network Virtual Appliance to its previous configuration. The migration type is inferred from the
in-progress migration on the resource. This action cannot be run once the migration has been committed.

:example: Abort an in-progress Network Virtual Appliance migration.
az network virtual-appliance migration abort -n MyName -g MyRG
"""

_aaz_info = {
"version": "2025-09-01",
"resources": [
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/networkvirtualappliances/{}/abortmigration", "2025-09-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.network_virtual_appliance_name = AAZStrArg(
options=["-n", "--name", "--network-virtual-appliance-name"],
help="The name of the Network Virtual Appliance.",
required=True,
id_part="name",
)
_args_schema.resource_group = AAZResourceGroupNameArg(
required=True,
)
return cls._args_schema

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

@register_callback
def pre_operations(self):
pass

@register_callback
def post_operations(self):
pass

class NetworkVirtualAppliancesAbortMigration(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.Network/networkVirtualAppliances/{networkVirtualApplianceName}/abortMigration",
**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(
"networkVirtualApplianceName", self.ctx.args.network_virtual_appliance_name,
required=True,
),
**self.serialize_url_param(
"resourceGroupName", self.ctx.args.resource_group,
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", "2025-09-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):
pass


class _AbortHelper:
"""Helper class for Abort"""


__all__ = ["Abort"]
Loading
Loading