From 4a92e1fcc558c75cf268c895810b4c38ba37a4e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:27:02 +0000 Subject: [PATCH 1/4] Initial plan From 5837e1cc2020f85e09985c59cba8db1a0f3a7070 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:31:05 +0000 Subject: [PATCH 2/4] [AppService] Restore appServicePlanId in webapp output --- .../tests/latest/test_webapp_commands_thru_mock.py | 11 +++++++++++ .../azure/cli/command_modules/appservice/utils.py | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py index ec6a96e6502..38c0c5c21e0 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py @@ -11,6 +11,7 @@ from azure.core.exceptions import HttpResponseError from azure.mgmt.web import WebSiteManagementClient +from azure.mgmt.web.models import Site from knack.util import CLIError from azure.cli.core.azclierror import (InvalidArgumentValueError, MutuallyExclusiveArgumentError, @@ -40,6 +41,7 @@ list_startup_logs, show_startup_log, create_webapp) +from azure.cli.command_modules.appservice.utils import _rename_server_farm_props # pylint: disable=line-too-long from azure.cli.core.profiles import ResourceType @@ -61,6 +63,15 @@ class TestWebappMocked(unittest.TestCase): def setUp(self): self.client = WebSiteManagementClient(mock.MagicMock(), '123455678') + def test_rename_server_farm_props_uses_app_service_plan_id_for_new_sdk_models(self): + site = Site(location='westus') + site['serverFarmId'] = '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan' + + _rename_server_farm_props(site) + + self.assertEqual(site['appServicePlanId'], '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan') + self.assertNotIn('serverFarmId', site.keys()) + @mock.patch('azure.cli.command_modules.appservice.custom._update_site_source_control_properties_for_gh_action') @mock.patch('azure.cli.command_modules.appservice.custom._add_publish_profile_to_github') @mock.patch('azure.cli.command_modules.appservice.custom.prompt_y_n') diff --git a/src/azure-cli/azure/cli/command_modules/appservice/utils.py b/src/azure-cli/azure/cli/command_modules/appservice/utils.py index 1d6e10431bc..8840255b26c 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/utils.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/utils.py @@ -249,7 +249,14 @@ def _list_app(cli_ctx, resource_group_name=None): def _rename_server_farm_props(webapp): # Should be renamed in SDK in a future release server_farm_id = get_site_server_farm_id(webapp) - setattr(webapp, 'app_service_plan_id', server_farm_id) + try: + webapp["appServicePlanId"] = server_farm_id + except TypeError: + setattr(webapp, 'app_service_plan_id', server_farm_id) + try: + del webapp["serverFarmId"] + except (KeyError, TypeError): + pass # Remove server_farm_id if it exists as an attribute (for old SDK compatibility) if hasattr(webapp, 'server_farm_id'): try: From 56176e45b9a0ffae26f3efed68666712721f28f9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:31:57 +0000 Subject: [PATCH 3/4] [AppService] Cover webapp plan id rename regression --- .../tests/latest/test_webapp_commands_thru_mock.py | 10 ++++++++++ .../azure/cli/command_modules/appservice/utils.py | 10 ++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py index 38c0c5c21e0..00405e87db1 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py @@ -72,6 +72,16 @@ def test_rename_server_farm_props_uses_app_service_plan_id_for_new_sdk_models(se self.assertEqual(site['appServicePlanId'], '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan') self.assertNotIn('serverFarmId', site.keys()) + def test_rename_server_farm_props_preserves_object_style_compatibility(self): + site = types.SimpleNamespace( + server_farm_id='/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan') + + _rename_server_farm_props(site) + + self.assertEqual(site.app_service_plan_id, + '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan') + self.assertFalse(hasattr(site, 'server_farm_id')) + @mock.patch('azure.cli.command_modules.appservice.custom._update_site_source_control_properties_for_gh_action') @mock.patch('azure.cli.command_modules.appservice.custom._add_publish_profile_to_github') @mock.patch('azure.cli.command_modules.appservice.custom.prompt_y_n') diff --git a/src/azure-cli/azure/cli/command_modules/appservice/utils.py b/src/azure-cli/azure/cli/command_modules/appservice/utils.py index 8840255b26c..d4cd621be18 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/utils.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/utils.py @@ -8,6 +8,7 @@ import urllib import urllib3 import certifi +from collections.abc import MutableMapping from datetime import datetime from knack.log import get_logger @@ -249,14 +250,11 @@ def _list_app(cli_ctx, resource_group_name=None): def _rename_server_farm_props(webapp): # Should be renamed in SDK in a future release server_farm_id = get_site_server_farm_id(webapp) - try: + if isinstance(webapp, MutableMapping): webapp["appServicePlanId"] = server_farm_id - except TypeError: + webapp.pop("serverFarmId", None) + else: setattr(webapp, 'app_service_plan_id', server_farm_id) - try: - del webapp["serverFarmId"] - except (KeyError, TypeError): - pass # Remove server_farm_id if it exists as an attribute (for old SDK compatibility) if hasattr(webapp, 'server_farm_id'): try: From 923901b2cc2a460429d23176c66be504ca96e9d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:32:26 +0000 Subject: [PATCH 4/4] [AppService] Polish regression test names --- .../appservice/tests/latest/test_webapp_commands_thru_mock.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py index 00405e87db1..bab4fd89f5d 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py @@ -63,7 +63,7 @@ class TestWebappMocked(unittest.TestCase): def setUp(self): self.client = WebSiteManagementClient(mock.MagicMock(), '123455678') - def test_rename_server_farm_props_uses_app_service_plan_id_for_new_sdk_models(self): + def test_rename_server_farm_props_handles_mutable_mapping(self): site = Site(location='westus') site['serverFarmId'] = '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan' @@ -72,7 +72,7 @@ def test_rename_server_farm_props_uses_app_service_plan_id_for_new_sdk_models(se self.assertEqual(site['appServicePlanId'], '/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan') self.assertNotIn('serverFarmId', site.keys()) - def test_rename_server_farm_props_preserves_object_style_compatibility(self): + def test_rename_server_farm_props_handles_object_attributes(self): site = types.SimpleNamespace( server_farm_id='/subscriptions/sub/resourceGroups/rg/providers/Microsoft.Web/serverfarms/plan')