Skip to content

Commit 9904154

Browse files
author
Harshitha Akkaraju
committed
[App Service] Fix az functionapp function keys list returning null values with azure-mgmt-web 11.0.0
1 parent f7f6f67 commit 9904154

2 files changed

Lines changed: 46 additions & 3 deletions

File tree

src/azure-cli/azure/cli/command_modules/appservice/custom.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11437,8 +11437,11 @@ def update_function_key(cmd, resource_group_name, name, function_name, key_name,
1143711437
def list_function_keys(cmd, resource_group_name, name, function_name, slot=None):
1143811438
client = web_client_factory(cmd.cli_ctx)
1143911439
if slot:
11440-
return client.web_apps.list_function_keys_slot(resource_group_name, name, function_name, slot)
11441-
return client.web_apps.list_function_keys(resource_group_name, name, function_name)
11440+
keys = client.web_apps.list_function_keys_slot(resource_group_name, name, function_name, slot)
11441+
else:
11442+
keys = client.web_apps.list_function_keys(resource_group_name, name, function_name)
11443+
# SDK may return .properties as None for flat dictionary responses; fall back to raw payload
11444+
return keys.properties if keys.properties is not None else dict(keys)
1144211445

1144311446

1144411447
def delete_function_key(cmd, resource_group_name, name, key_name, function_name=None, slot=None):

src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_functionapp_commands_thru_mock.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
remove_remote_build_app_settings,
1818
config_source_control,
1919
validate_app_settings_in_scm,
20-
update_container_settings_functionapp)
20+
update_container_settings_functionapp,
21+
list_function_keys)
2122
from azure.cli.core.profiles import ResourceType
2223
from azure.cli.core.azclierror import (AzureInternalError, UnclassifiedUserFault)
2324
from azure.cli.core.azclierror import ResourceNotFoundError
@@ -849,3 +850,42 @@ def test_flex_parse_raw_stacks_prefers_functions_worker_runtime_when_present(sel
849850

850851
# assert
851852
self.assertEqual(matched.name, 'dotnet-isolated')
853+
854+
@mock.patch('azure.cli.command_modules.appservice.custom.web_client_factory', autospec=True)
855+
def test_list_function_keys_unwraps_broken_string_dictionary(self, web_client_factory_mock):
856+
# azure-mgmt-web 11.0.0 deserializes flat dictionary responses with .properties = None
857+
from azure.mgmt.web import models as _models
858+
from azure.mgmt.web._utils.model_base import _deserialize
859+
860+
broken = _deserialize(
861+
_models.StringDictionary,
862+
{'default': 'vvrX4LJY1JWbimFI28UM', 'myCustomKey': 'abc'})
863+
self.assertIsNone(broken.properties)
864+
865+
cmd_mock = _get_test_cmd()
866+
client_mock = mock.MagicMock()
867+
client_mock.web_apps.list_function_keys.return_value = broken
868+
web_client_factory_mock.return_value = client_mock
869+
870+
result = list_function_keys(cmd_mock, 'rg', 'app', 'httpget')
871+
872+
self.assertEqual(result, {'default': 'vvrX4LJY1JWbimFI28UM', 'myCustomKey': 'abc'})
873+
client_mock.web_apps.list_function_keys.assert_called_once_with('rg', 'app', 'httpget')
874+
client_mock.web_apps.list_function_keys_slot.assert_not_called()
875+
876+
@mock.patch('azure.cli.command_modules.appservice.custom.web_client_factory', autospec=True)
877+
def test_list_function_keys_uses_properties_when_sdk_returns_enveloped_response(self, web_client_factory_mock):
878+
# Prefers .properties when populated (forward-compatible with a future SDK fix)
879+
fixed = mock.MagicMock()
880+
fixed.properties = {'default': 'abc'}
881+
882+
cmd_mock = _get_test_cmd()
883+
client_mock = mock.MagicMock()
884+
client_mock.web_apps.list_function_keys_slot.return_value = fixed
885+
web_client_factory_mock.return_value = client_mock
886+
887+
result = list_function_keys(cmd_mock, 'rg', 'app', 'httpget', slot='staging')
888+
889+
self.assertEqual(result, {'default': 'abc'})
890+
client_mock.web_apps.list_function_keys_slot.assert_called_once_with('rg', 'app', 'httpget', 'staging')
891+
client_mock.web_apps.list_function_keys.assert_not_called()

0 commit comments

Comments
 (0)