From 8018eec56c3f6f16abc16f3349a3571e111b1765 Mon Sep 17 00:00:00 2001 From: Khuram Khan Date: Tue, 6 May 2025 11:57:19 -0500 Subject: [PATCH 1/2] flex plan update zone redundant --- .../cli/command_modules/appservice/custom.py | 23 ++++++++++++ .../tests/latest/test_functionapp_commands.py | 36 ++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/custom.py b/src/azure-cli/azure/cli/command_modules/appservice/custom.py index fe981c3afdc..be1e12cf276 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/custom.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/custom.py @@ -3231,6 +3231,9 @@ def update_functionapp_app_service_plan(cmd, instance, sku=None, number_of_worke if number_of_workers is not None: number_of_workers = validate_range_of_int_flag('--number-of-workers / --min-instances', number_of_workers, min_val=0, max_val=20) + if is_plan_flex(cmd, instance): + return update_flex_app_service_plan(instance) + return update_app_service_plan(cmd, instance, sku, number_of_workers) @@ -5021,6 +5024,19 @@ def create_flex_app_service_plan(cmd, resource_group_name, name, location, zone_ poller = client.app_service_plans.begin_create_or_update(resource_group_name, name, plan_def) return LongRunningOperation(cmd.cli_ctx)(poller) +def update_flex_app_service_plan(instance): + instance.target_worker_count=None + instance.target_worker_size=None + instance.is_xenon=None + instance.hyper_v=None + instance.per_site_scaling=None + instance.maximum_elastic_worker_count=None + instance.elastic_scale_enabled=None + instance.is_spot=None + instance.target_worker_size_id=None + instance.sku.capacity=None + return instance + def create_functionapp_app_service_plan(cmd, resource_group_name, name, is_linux, sku, number_of_workers=None, max_burst=None, location=None, tags=None, zone_redundant=False): @@ -5051,6 +5067,13 @@ def is_plan_consumption(cmd, plan_info): return plan_info.sku.tier.lower() == 'dynamic' return False +def is_plan_flex(cmd, plan_info): + SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') + if isinstance(plan_info, AppServicePlan): + if isinstance(plan_info.sku, SkuDescription): + return plan_info.sku.tier.lower() == 'flexconsumption' + return False + def is_plan_elastic_premium(cmd, plan_info): SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_functionapp_commands.py b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_functionapp_commands.py index 4c4dc0b74cf..b9c37807799 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_functionapp_commands.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_functionapp_commands.py @@ -853,10 +853,44 @@ def test_functionapp_flex_zone_redundant_not_active(self, resource_group, storag .format(resource_group, functionapp_name, FLEX_ASP_LOCATION_FUNCTIONAPP, storage_account)).get_output_in_json() server_farm_id =functionapp['properties']['serverFarmId'] - function_plan = self.cmd('az functionapp plan show --ids {}' + function_plan = self.cmd('functionapp plan show --ids {}' .format(server_farm_id)).get_output_in_json() self.assertTrue(function_plan['zoneRedundant'] == False) + @ResourceGroupPreparer(location=FLEX_ASP_LOCATION_FUNCTIONAPP) + @StorageAccountPreparer() + def test_functionapp_flex_plan_enable_zone_redundant(self, resource_group, storage_account): + functionapp_name = self.create_random_name( + 'functionapp', 40) + + functionapp = self.cmd('functionapp create -g {} -n {} -f {} -s {} --runtime python --runtime-version 3.11' + .format(resource_group, functionapp_name, FLEX_ASP_LOCATION_FUNCTIONAPP, storage_account)).get_output_in_json() + + server_farm_id = functionapp['properties']['serverFarmId'] + function_plan = self.cmd('functionapp plan show --ids {}'.format(server_farm_id)).get_output_in_json() + self.assertTrue(function_plan['zoneRedundant'] == False) + updated_plan = self.cmd('functionapp plan update --id {} --set zoneRedundant=true'.format(server_farm_id)).get_output_in_json() + self.assertTrue(updated_plan['zoneRedundant'] == True) + function_plan = self.cmd('functionapp plan show --ids {}'.format(server_farm_id)).get_output_in_json() + self.assertTrue(function_plan['zoneRedundant'] == True) + + @ResourceGroupPreparer(location=FLEX_ASP_LOCATION_FUNCTIONAPP) + @StorageAccountPreparer() + def test_functionapp_flex_plan_disable_zone_redundant(self, resource_group, storage_account): + functionapp_name = self.create_random_name( + 'functionapp', 40) + + functionapp = self.cmd('functionapp create -g {} -n {} -f {} -s {} --runtime python --runtime-version 3.11 --zone-redundant' + .format(resource_group, functionapp_name, FLEX_ASP_LOCATION_FUNCTIONAPP, storage_account)).get_output_in_json() + + server_farm_id = functionapp['properties']['serverFarmId'] + function_plan = self.cmd('functionapp plan show --ids {}'.format(server_farm_id)).get_output_in_json() + self.assertTrue(function_plan['zoneRedundant'] == True) + updated_plan = self.cmd('functionapp plan update --id {} --set zoneRedundant=false'.format(server_farm_id)).get_output_in_json() + self.assertTrue(updated_plan['zoneRedundant'] == False) + function_plan = self.cmd('functionapp plan show --ids {}'.format(server_farm_id)).get_output_in_json() + self.assertTrue(function_plan['zoneRedundant'] == False) + @ResourceGroupPreparer(location=FLEX_ASP_LOCATION_FUNCTIONAPP) @StorageAccountPreparer() def test_functionapp_flex_scale_config(self, resource_group, storage_account): From 59add17b3d8c377d06d82d7839b895808e4deb8e Mon Sep 17 00:00:00 2001 From: Khuram Khan Date: Fri, 9 May 2025 11:44:38 -0500 Subject: [PATCH 2/2] fixed the style issues. --- .../cli/command_modules/appservice/custom.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/custom.py b/src/azure-cli/azure/cli/command_modules/appservice/custom.py index be1e12cf276..1c1dded1c9a 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/custom.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/custom.py @@ -5024,17 +5024,18 @@ def create_flex_app_service_plan(cmd, resource_group_name, name, location, zone_ poller = client.app_service_plans.begin_create_or_update(resource_group_name, name, plan_def) return LongRunningOperation(cmd.cli_ctx)(poller) + def update_flex_app_service_plan(instance): - instance.target_worker_count=None - instance.target_worker_size=None - instance.is_xenon=None - instance.hyper_v=None - instance.per_site_scaling=None - instance.maximum_elastic_worker_count=None - instance.elastic_scale_enabled=None - instance.is_spot=None - instance.target_worker_size_id=None - instance.sku.capacity=None + instance.target_worker_count = None + instance.target_worker_size = None + instance.is_xenon = None + instance.hyper_v = None + instance.per_site_scaling = None + instance.maximum_elastic_worker_count = None + instance.elastic_scale_enabled = None + instance.is_spot = None + instance.target_worker_size_id = None + instance.sku.capacity = None return instance @@ -5067,6 +5068,7 @@ def is_plan_consumption(cmd, plan_info): return plan_info.sku.tier.lower() == 'dynamic' return False + def is_plan_flex(cmd, plan_info): SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') if isinstance(plan_info, AppServicePlan):