Skip to content

Commit

Permalink
[AppService] az functionapp delete: Add a validation to check wheth…
Browse files Browse the repository at this point in the history
…er Azure Functions is not in the Azure Container app environments (Azure#25979)
kaibocai authored Mar 30, 2023
1 parent d9c5670 commit 17b9b55
Showing 23 changed files with 3,881 additions and 2,216 deletions.
18 changes: 18 additions & 0 deletions src/azure-cli/azure/cli/command_modules/appservice/_validators.py
Original file line number Diff line number Diff line change
@@ -131,6 +131,24 @@ def validate_functionapp_on_containerapp_site_config_set(cmd, namespace):
"Please use the following command instead: az functionapp config container set")


def validate_functionapp_on_containerapp_container_settings_delete(cmd, namespace):
resource_group_name = namespace.resource_group_name
name = namespace.name
if is_centauri_functionapp(cmd, resource_group_name, name):
raise ValidationError(
"Invalid command. This is currently not supported for Azure Functions on Azure Container app environments.",
"Please use the following command instead: az functionapp config appsettings set")


def validate_functionapp_on_containerapp_update(cmd, namespace):
resource_group_name = namespace.resource_group_name
name = namespace.name
if is_centauri_functionapp(cmd, resource_group_name, name):
raise ValidationError(
"Invalid command. This is currently not supported for Azure Functions on Azure Container app environments.",
"Please use either 'az functionapp config appsettings set' or 'az functionapp config container set'")


def validate_functionapp_on_containerapp_site_config_show(cmd, namespace):
resource_group_name = namespace.resource_group_name
name = namespace.name
Original file line number Diff line number Diff line change
@@ -14,7 +14,9 @@
validate_app_is_webapp, validate_functionapp_on_containerapp_vnet,
validate_functionapp_on_containerapp_vnet_add, validate_centauri_delete_function,
validate_functionapp_on_containerapp_site_config_set,
validate_functionapp_on_containerapp_site_config_show)
validate_functionapp_on_containerapp_site_config_show,
validate_functionapp_on_containerapp_container_settings_delete,
validate_functionapp_on_containerapp_update)


def output_slots_in_table(slots):
@@ -331,7 +333,8 @@ def load_command_table(self, _):
g.custom_command('identity remove', 'remove_identity')
g.custom_command('deploy', 'perform_onedeploy', validator=validate_onedeploy_params, is_preview=True)
g.generic_update_command('update', getter_name="get_functionapp", setter_name='set_functionapp', exception_handler=update_function_ex_handler_factory(),
custom_func_name='update_functionapp', getter_type=appservice_custom, setter_type=appservice_custom, command_type=webapp_sdk)
custom_func_name='update_functionapp', getter_type=appservice_custom, setter_type=appservice_custom, command_type=webapp_sdk,
validator=validate_functionapp_on_containerapp_update)

with self.command_group('functionapp config') as g:
g.custom_command('set', 'update_site_configs', validator=validate_functionapp_on_containerapp_site_config_set, exception_handler=ex_handler_factory())
@@ -398,7 +401,7 @@ def load_command_table(self, _):

with self.command_group('functionapp config container') as g:
g.custom_command('set', 'update_container_settings_functionapp')
g.custom_command('delete', 'delete_container_settings')
g.custom_command('delete', 'delete_container_settings', validator=validate_functionapp_on_containerapp_container_settings_delete)
g.custom_show_command('show', 'show_container_settings_functionapp')

with self.command_group('functionapp deployment slot') as g:
28 changes: 26 additions & 2 deletions src/azure-cli/azure/cli/command_modules/appservice/custom.py
Original file line number Diff line number Diff line change
@@ -379,7 +379,7 @@ def validate_container_app_create_options(runtime=None, deployment_container_ima
return len([x for x in opts if x]) == 1 # you can only specify one out the combinations


def parse_docker_image_name(deployment_container_image_name):
def parse_docker_image_name(deployment_container_image_name, environment=None):
if not deployment_container_image_name:
return None
non_url = "/" not in deployment_container_image_name
@@ -390,6 +390,8 @@ def parse_docker_image_name(deployment_container_image_name):
if parsed_url.scheme:
return parsed_url.hostname
hostname = urlparse("https://{}".format(deployment_container_image_name)).hostname
if environment:
return hostname
return "https://{}".format(hostname)


@@ -1504,9 +1506,31 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor
if not updating_ip_security_restrictions:
setattr(configs, 'ip_security_restrictions', None)
setattr(configs, 'scm_ip_security_restrictions', None)

if is_centauri_functionapp(cmd, resource_group_name, name):
return update_configuration_polling(cmd, resource_group_name, name, slot, configs)
return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs)


def update_configuration_polling(cmd, resource_group_name, name, slot, configs):
try:
return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs)
except Exception as ex: # pylint: disable=broad-except
poll_url = ex.response.headers['Location'] if 'Location' in ex.response.headers else None
if ex.response.status_code == 202 and poll_url:
r = send_raw_request(cmd.cli_ctx, method='get', url=poll_url)
poll_timeout = time.time() + 60 * 2 # 2 minute timeout

while r.status_code != 200 and time.time() < poll_timeout:
time.sleep(5)
r = send_raw_request(cmd.cli_ctx, method='get', url=poll_url)

if r.status_code == 200:
return r.json()
else:
raise CLIError(ex)


def delete_app_settings(cmd, resource_group_name, name, setting_names, slot=None):
app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot)
client = web_client_factory(cmd.cli_ctx)
@@ -3694,7 +3718,7 @@ def create_functionapp(cmd, resource_group_name, name, storage_account, plan=Non
if image is None:
image = DEFAULT_CENTAURI_IMAGE

docker_registry_server_url = parse_docker_image_name(image)
docker_registry_server_url = parse_docker_image_name(image, environment)

if functions_version == '2' and functionapp_def.location in FUNCTIONS_NO_V2_REGIONS:
raise ValidationError("2.x functions are not supported in this region. To create a 3.x function, "
Loading
Oops, something went wrong.

0 comments on commit 17b9b55

Please sign in to comment.