From cb4177492040874c5733e1494a0dacdfbabf3279 Mon Sep 17 00:00:00 2001 From: Sai Varnitha Rajanala Date: Wed, 2 Sep 2026 16:21:18 -0700 Subject: [PATCH] Network: add move IP configurations command Add a preview AAZ command for the VirtualNetworks MoveIpConfigurations operation using API version 2025-09-01. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 957dff6d-b827-4578-85f8-1e0bc9258733 --- .../aaz/latest/network/vnet/__init__.py | 1 + .../network/vnet/_move_ip_configurations.py | 185 ++++++++++++++++++ .../test_move_ip_configurations_command.py | 39 ++++ 3 files changed, 225 insertions(+) create mode 100644 src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/_move_ip_configurations.py create mode 100644 src/azure-cli/azure/cli/command_modules/network/tests/latest/test_move_ip_configurations_command.py diff --git a/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/__init__.py b/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/__init__.py index c352aa0e33a..8f973e5ab5a 100644 --- a/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/__init__.py +++ b/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/__init__.py @@ -14,6 +14,7 @@ from ._delete import * from ._list import * from ._list_endpoint_services import * +from ._move_ip_configurations import * from ._show import * from ._update import * from ._wait import * diff --git a/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/_move_ip_configurations.py b/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/_move_ip_configurations.py new file mode 100644 index 00000000000..a5e78f438b9 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/network/aaz/latest/network/vnet/_move_ip_configurations.py @@ -0,0 +1,185 @@ +# -------------------------------------------------------------------------------------------- +# 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 vnet move-ip-configurations", + is_preview=True, +) +class MoveIpConfigurations(AAZCommand): + """Move IP configurations from one virtual network to another. + + :example: Move an IP configuration to a virtual network. + az network vnet move-ip-configurations -g MyResourceGroup -n MyVnet --move-ip-configuration-items "[0].source-ip-configuration.id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/nic1/ipConfigurations/ipconfig1" "[0].target-ip-configuration.id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/nic2/ipConfigurations/ipconfig2" + """ + + _aaz_info = { + "version": "2025-09-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/virtualnetworks/{}/moveipconfigurations", "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) + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg(required=True) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="Name of the virtual network.", + required=True, + id_part="name", + ) + _args_schema.move_ip_configuration_items = AAZListArg( + options=["--move-items", "--move-ip-configuration-items"], + help="List of source and target IP configuration resource ID pairs.", + required=True, + ) + _args_schema.move_ip_configuration_items.Element = AAZObjectArg() + _element = _args_schema.move_ip_configuration_items.Element + _element.source_ip_configuration = AAZObjectArg( + options=["source-ip-configuration"], + help="Source IP configuration.", + required=True, + ) + _element.source_ip_configuration.id = AAZResourceIdArg( + options=["id"], + help="ARM resource ID of the source IP configuration.", + required=True, + ) + _element.target_ip_configuration = AAZObjectArg( + options=["target-ip-configuration"], + help="Target IP configuration.", + required=True, + ) + _element.target_ip_configuration.id = AAZResourceIdArg( + options=["id"], + help="ARM resource ID of the target IP configuration.", + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.VirtualNetworksMoveIpConfigurations(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class VirtualNetworksMoveIpConfigurations(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, 202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + 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/virtualNetworks/{virtualNetworkName}/moveIpConfigurations", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "ODataV4Format" + + @property + def url_parameters(self): + return { + **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("virtualNetworkName", self.ctx.args.name, required=True), + } + + @property + def query_parameters(self): + return { + **self.serialize_query_param("api-version", "2025-09-01", required=True), + } + + @property + def header_parameters(self): + return { + **self.serialize_header_param("Content-Type", "application/json"), + **self.serialize_header_param("Accept", "application/json"), + } + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop( + "moveIpConfigurationItems", AAZListType, ".move_ip_configuration_items", + typ_kwargs={"flags": {"required": True}} + ) + items = _builder.get(".moveIpConfigurationItems") + if items is not None: + items.set_elements(AAZObjectType, ".") + element = _builder.get(".moveIpConfigurationItems[]") + if element is not None: + element.set_prop( + "sourceIpConfiguration", AAZObjectType, ".source_ip_configuration", + typ_kwargs={"flags": {"required": True}} + ) + source = element.get(".sourceIpConfiguration") + if source is not None: + source.set_prop("id", AAZStrType, ".id", typ_kwargs={"flags": {"required": True}}) + element.set_prop( + "targetIpConfiguration", AAZObjectType, ".target_ip_configuration", + typ_kwargs={"flags": {"required": True}} + ) + target = element.get(".targetIpConfiguration") + if target is not None: + target.set_prop("id", AAZStrType, ".id", typ_kwargs={"flags": {"required": True}}) + return self.serialize_content(_content_value) + + def on_200(self, session): + pass + + +__all__ = ["MoveIpConfigurations"] diff --git a/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_move_ip_configurations_command.py b/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_move_ip_configurations_command.py new file mode 100644 index 00000000000..694c2ca6a43 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_move_ip_configurations_command.py @@ -0,0 +1,39 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import unittest + + +class TestMoveIpConfigurationsAAZCommand(unittest.TestCase): + def test_move_ip_configurations_command_is_registered(self): + from azure.cli.core.mock import DummyCli + from azure.cli.command_modules.network import NetworkCommandsLoader + + loader = NetworkCommandsLoader(cli_ctx=DummyCli()) + command_table = loader.load_command_table( + ['network', 'vnet', 'move-ip-configurations'] + ) + self.assertIn('network vnet move-ip-configurations', command_table) + + def test_move_ip_configurations_command_schema(self): + from azure.cli.command_modules.network.aaz.latest.network.vnet._move_ip_configurations import ( + MoveIpConfigurations, + ) + + schema = MoveIpConfigurations._build_arguments_schema() + self.assertTrue(schema.move_ip_configuration_items._required) + self.assertIn('--move-items', schema.move_ip_configuration_items._options) + item = schema.move_ip_configuration_items.Element + self.assertTrue(item.source_ip_configuration._required) + self.assertTrue(item.source_ip_configuration.id._required) + self.assertTrue(item.target_ip_configuration._required) + self.assertTrue(item.target_ip_configuration.id._required) + self.assertEqual(MoveIpConfigurations._aaz_info['version'], '2025-09-01') + operation = MoveIpConfigurations.VirtualNetworksMoveIpConfigurations + self.assertEqual(operation.method.fget(None), 'POST') + + +if __name__ == '__main__': + unittest.main()