Skip to content

[appservice] Surface Kudu 409 response body in az webapp webjob triggered list - #33825

Open
a0x1ab with Copilot wants to merge 3 commits into
devfrom
copilot/fix-webapp-webjob-triggered-list
Open

[appservice] Surface Kudu 409 response body in az webapp webjob triggered list#33825
a0x1ab with Copilot wants to merge 3 commits into
devfrom
copilot/fix-webapp-webjob-triggered-list

Conversation

Copilot AI commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Related command

az webapp webjob triggered list

Description

When Kudu returns 409 Conflict (e.g. webJobsEnabled=false on the site config), the Azure SDK raises HttpResponseError with only the HTTP status phrase, discarding the actionable response body:

{"error": "The web app is not configured to run the web job. Please enable running web jobs before calling the API."}

Previously the CLI emitted only Operation returned an invalid status 'Conflict'.

Fix:

  • list_triggered_webjobs now catches HttpResponseError with status_code == 409, parses the Kudu JSON body, and raises UnclassifiedUserFault with the extracted error string
  • Falls back to str(ex) if the body is absent or not valid JSON
  • Non-409 errors are re-raised unchanged

Testing Guide

New unit tests in test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs:

# Run the targeted mock tests
python -m pytest src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs -v

Three cases covered:

  • 409 with valid Kudu JSON body → UnclassifiedUserFault with the extracted message
  • Non-409 HttpResponseError → re-raised as-is
  • 409 with unparseable body → UnclassifiedUserFault with fallback string

History Notes

[appservice] az webapp webjob triggered list: Surface Kudu error body on HTTP 409 Conflict instead of generic status phrase


This checklist is used to make sure that common guidelines for a pull request are followed.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@yonzhan

yonzhan commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

webapp

Copilot AI changed the title [WIP] Fix actionable response body for 409 conflict in CLI [appservice] Surface Kudu 409 response body in az webapp webjob triggered list Aug 1, 2026
Copilot AI requested a review from a0x1ab August 1, 2026 00:06
@azure-client-tools-agent

Copy link
Copy Markdown

Live test results — azdev test --live --series (changed test files only)

PASS

Selectors: test_webapp_commands_thru_mock (module)
PR head ref: copilot/fix-webapp-webjob-triggered-list
PR head sha: 3a433def5ef1dd2e5b98505c6a29077d0c5c67b0
PR base ref: dev
New test files in PR: false

Changed test files run
src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py

Workflow run: https://github.com/Azure/issue-sentinel/actions/runs/30674930568

Last 80 lines of azdev output
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_app_settings_success_key_value_format PASSED [ 22%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_app_settings_success_with_slot_settings PASSED [ 23%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_application_settings_polling_error_handling PASSED [ 24%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_site_config PASSED [ 25%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_valid_linux_create_options PASSED [ 26%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_webapp_github_actions_add PASSED [ 27%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_extended PASSED [ 28%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_latest PASSED [ 29%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_standard PASSED [ 30%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_404_graceful PASSED [ 31%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_404_with_instance PASSED [ 32%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_500_raises PASSED [ 33%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_raises_on_windows PASSED [ 34%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_success PASSED [ 35%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_with_filters PASSED [ 36%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_with_slot PASSED [ 37%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_no_filename PASSED [ 38%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_with_filename PASSED [ 39%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_with_instance PASSED [ 40%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_500_raises PASSED [ 41%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_filename_and_instance_mutually_exclusive PASSED [ 42%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_json_response PASSED [ 43%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_latest PASSED [ 44%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_raises_on_windows PASSED [ 45%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_specific_filename PASSED [ 46%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_with_instance PASSED [ 47%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_transform_troubleshoot_status_output_renders_error_columns PASSED [ 48%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_all_instances PASSED [ 50%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_arm_404_with_instance PASSED [ 51%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_machine_name_as_instance PASSED [ 52%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_raises_on_windows PASSED [ 53%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_report_flag_renders_and_returns_none PASSED [ 54%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_single_instance PASSED [ 55%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_400_invalid_filename_surfaces_message PASSED [ 56%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_404_returns_empty_startup PASSED [ 57%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_500_surfaces_message PASSED [ 58%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_request_exception_surfaces_transport_error PASSED [ 59%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_unknown_instance_raises PASSED [ 60%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestRuntimeFailedHintMocked::test_runtime_failed_includes_startup_log_hint PASSED [ 61%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestRuntimeFailedHintMocked::test_timeout_includes_startup_log_hint PASSED [ 62%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestCreateAppServicePlanDefaults::test_default_sku_is_p0v3_when_not_specified PASSED [ 63%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_falls_back_when_no_cache PASSED [ 64%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_refreshes_on_401 PASSED [ 65%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_reuses_cached_headers PASSED [ 66%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_reuses_cached_headers_basic_auth PASSED [ 67%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_or_fetch_scm_url_derives_from_cached_site PASSED [ 68%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_or_fetch_scm_url_falls_back_when_no_cached_site PASSED [ 69%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_scm_site_headers_calls_is_flex_when_no_hint PASSED [ 70%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_scm_site_headers_skips_is_flex_when_hint_provided PASSED [ 71%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_function_app PASSED [ 72%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_unknown PASSED [ 73%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_web_app PASSED [ 74%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_one_deploy_params_repr_does_not_leak_credentials PASSED [ 75%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_perform_onedeploy_internal_clears_cache_on_exception PASSED [ 76%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_perform_onedeploy_internal_clears_cache_on_success PASSED [ 77%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_aad_capitalized_key PASSED [ 78%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_basic_auth_lowercase_key PASSED [ 79%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_noop_without_authorization PASSED [ 80%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_is_linux_webapp_lazy_fetch_for_functionapp PASSED [ 81%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_is_linux_webapp_uses_cached_value PASSED [ 82%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_site_caches_result PASSED [ 83%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_site_uses_slot_when_set PASSED [ 84%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_falls_back_when_no_cache PASSED [ 85%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_uses_cached_site PASSED [ 86%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_uses_cached_slot_site PASSED [ 87%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_url_from_site_picks_http_when_no_ssl PASSED [ 88%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_url_from_site_picks_https_when_ssl_enabled PASSED [ 89%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_javaNNRuntime_keys PASSED [ 90%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_not_first_selected_by_auto_update PASSED [ 91%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_runtimes_array_complete PASSED [ 92%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_get_container_settings_data_reads_mapping PASSED [ 93%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_get_java_runtimes_from_container_settings_reads_mapping PASSED [ 94%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_runtimes_array_entries_flagged_auto_update PASSED [ 95%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_typed_attrs_only_expose_java_8_11_but_mapping_has_all PASSED [ 96%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_409_fallback_when_body_unparseable PASSED [ 97%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_409_surfaces_kudu_error PASSED [ 98%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_non_409_reraises PASSED [100%]

- generated xml file: /home/runner/work/issue-sentinel/issue-sentinel/test-output/results.xml -
============================== 98 passed in 3.05s ==============================

Posted by agent-assist live-test workflow.

@azure-client-tools-agent azure-client-tools-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI Failure Summary — PR #33825

The following checks failed on the latest commit (3a433def5ef1dd2e5b98505c6a29077d0c5c67b0):

  • Azure.azure-cli (build) — failed
  • Azure.azure-cli (Check CLI Style) — failed

Both failures stem from the same root cause, a pylint style violation:

ERROR: ************* Module azure.cli.command_modules.appservice.custom
src/azure-cli/azure/cli/command_modules/appservice/custom.py:10453:4: W0621: Redefining name 'json' from outer scope (line 20) (redefined-outer-name)
src/azure-cli/azure/cli/command_modules/appservice/custom.py:10453:4: W0404: Reimport 'json' (imported line 20) (reimported)

json is already imported at module scope (line 20 of src/azure-cli/azure/cli/command_modules/appservice/custom.py). The code added at line 10453 re-imports json locally inside a function, which is unnecessary and triggers both redefined-outer-name and reimported pylint errors.

Fix needed: remove the local/inner import json statement at line 10453 in src/azure-cli/azure/cli/command_modules/appservice/custom.py (the module-level import at the top of the file already covers it). After removing it, run azdev style appservice locally to confirm the style check passes, then push the fix.


Posted by agent-assist (autonomous bug-fix pipeline).

@a0x1ab

a0x1ab commented Aug 1, 2026

Copy link
Copy Markdown
Member

@copilot the automated CI and live-test review on this PR found failures. Please look into the requested changes here: #33825 (review) and push a fix.


Posted by agent-assist (autonomous bug-fix pipeline).

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot the automated CI and live-test review on this PR found failures. Please look into the requested changes here: #3...

Fixed in the latest commit. The CI failures were caused by a redundant import json inside list_triggered_webjobs (line 10453), which shadowed the module-level import json at line 20 — triggering pylint W0621 redefined-outer-name and W0404 reimported. Removed the local import; the module-level one already covers it.

@azure-client-tools-agent

Copy link
Copy Markdown

Live test results — azdev test --live --series (changed test files only)

PASS

Selectors: test_webapp_commands_thru_mock (module)
PR head ref: copilot/fix-webapp-webjob-triggered-list
PR head sha: 490698937ee4d2a518e852f6a7016ac32f43fc39
PR base ref: dev
New test files in PR: false

Changed test files run
src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py

Workflow run: https://github.com/Azure/issue-sentinel/actions/runs/30680574009

Last 80 lines of azdev output
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_app_settings_success_key_value_format PASSED [ 22%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_app_settings_success_with_slot_settings PASSED [ 23%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_application_settings_polling_error_handling PASSED [ 24%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_update_site_config PASSED [ 25%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_valid_linux_create_options PASSED [ 26%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestWebappMocked::test_webapp_github_actions_add PASSED [ 27%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_extended PASSED [ 28%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_latest PASSED [ 29%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestUpdateWebapp::test_update_webapp_platform_release_channel_standard PASSED [ 30%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_404_graceful PASSED [ 31%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_404_with_instance PASSED [ 32%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_500_raises PASSED [ 33%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_raises_on_windows PASSED [ 34%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_success PASSED [ 35%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_with_filters PASSED [ 36%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_list_startup_logs_with_slot PASSED [ 37%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_no_filename PASSED [ 38%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_with_filename PASSED [ 39%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_404_with_instance PASSED [ 40%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_500_raises PASSED [ 41%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_filename_and_instance_mutually_exclusive PASSED [ 42%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_json_response PASSED [ 43%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_latest PASSED [ 44%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_raises_on_windows PASSED [ 45%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_specific_filename PASSED [ 46%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStartupLogsMocked::test_show_startup_log_with_instance PASSED [ 47%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_transform_troubleshoot_status_output_renders_error_columns PASSED [ 48%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_all_instances PASSED [ 50%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_arm_404_with_instance PASSED [ 51%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_machine_name_as_instance PASSED [ 52%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_raises_on_windows PASSED [ 53%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_report_flag_renders_and_returns_none PASSED [ 54%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_single_instance PASSED [ 55%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_400_invalid_filename_surfaces_message PASSED [ 56%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_404_returns_empty_startup PASSED [ 57%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_500_surfaces_message PASSED [ 58%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_summary_request_exception_surfaces_transport_error PASSED [ 59%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestTroubleshootStatusMocked::test_troubleshoot_status_unknown_instance_raises PASSED [ 60%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestRuntimeFailedHintMocked::test_runtime_failed_includes_startup_log_hint PASSED [ 61%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestRuntimeFailedHintMocked::test_timeout_includes_startup_log_hint PASSED [ 62%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestCreateAppServicePlanDefaults::test_default_sku_is_p0v3_when_not_specified PASSED [ 63%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_falls_back_when_no_cache PASSED [ 64%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_refreshes_on_401 PASSED [ 65%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_reuses_cached_headers PASSED [ 66%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_check_zip_deployment_status_reuses_cached_headers_basic_auth PASSED [ 67%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_or_fetch_scm_url_derives_from_cached_site PASSED [ 68%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_or_fetch_scm_url_falls_back_when_no_cached_site PASSED [ 69%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_scm_site_headers_calls_is_flex_when_no_hint PASSED [ 70%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_get_scm_site_headers_skips_is_flex_when_hint_provided PASSED [ 71%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_function_app PASSED [ 72%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_unknown PASSED [ 73%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_known_is_flex_hint_web_app PASSED [ 74%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_one_deploy_params_repr_does_not_leak_credentials PASSED [ 75%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_perform_onedeploy_internal_clears_cache_on_exception PASSED [ 76%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_perform_onedeploy_internal_clears_cache_on_success PASSED [ 77%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_aad_capitalized_key PASSED [ 78%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_basic_auth_lowercase_key PASSED [ 79%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeployScmCache::test_populate_cached_scm_headers_noop_without_authorization PASSED [ 80%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_is_linux_webapp_lazy_fetch_for_functionapp PASSED [ 81%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_is_linux_webapp_uses_cached_value PASSED [ 82%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_site_caches_result PASSED [ 83%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_or_fetch_site_uses_slot_when_set PASSED [ 84%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_falls_back_when_no_cache PASSED [ 85%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_uses_cached_site PASSED [ 86%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_get_visit_url_uses_cached_slot_site PASSED [ 87%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_url_from_site_picks_http_when_no_ssl PASSED [ 88%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestOneDeploySiteCache::test_url_from_site_picks_https_when_ssl_enabled PASSED [ 89%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_javaNNRuntime_keys PASSED [ 90%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_not_first_selected_by_auto_update PASSED [ 91%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_aggregate_runtimes_array_complete PASSED [ 92%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_get_container_settings_data_reads_mapping PASSED [ 93%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_get_java_runtimes_from_container_settings_reads_mapping PASSED [ 94%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_runtimes_array_entries_flagged_auto_update PASSED [ 95%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestStackRuntimeJavaSELinux::test_typed_attrs_only_expose_java_8_11_but_mapping_has_all PASSED [ 96%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_409_fallback_when_body_unparseable PASSED [ 97%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_409_surfaces_kudu_error PASSED [ 98%]
azure-cli/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py::TestListTriggeredWebjobs::test_list_triggered_webjobs_non_409_reraises PASSED [100%]

- generated xml file: /home/runner/work/issue-sentinel/issue-sentinel/test-output/results.xml -
============================== 98 passed in 2.91s ==============================

Posted by agent-assist live-test workflow.

@azure-client-tools-agent azure-client-tools-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ All checks passed

Live tests passed and all CI checks are green. This PR is ready for human review.


Posted by agent-assist (autonomous bug-fix pipeline).

@azure-client-tools-agent
azure-client-tools-agent Bot marked this pull request as ready for review August 1, 2026 04:37
@azure-client-tools-agent
azure-client-tools-agent Bot requested a review from a team as a code owner August 1, 2026 04:37
Copilot AI review requested due to automatic review settings August 1, 2026 04:37
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot could not run the full agentic suite for this review because it was automatically requested on a bot-authored pull request. Request a review from Copilot under Reviewers to retry with the full agentic suite. Improved support for bot-authored pull requests is coming soon.

This PR improves the UX of list_triggered_webjobs by surfacing Kudu-provided error details when the API responds with HTTP 409, and adds unit tests to validate the new behavior.

Changes:

  • Catch HttpResponseError for list_triggered_webjobs and convert HTTP 409 into UnclassifiedUserFault with a parsed message from the response body.
  • Add unit tests to ensure 409 is converted and non-409 errors are re-raised.
  • Add basic fallback behavior when the response body is not JSON.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
src/azure-cli/azure/cli/command_modules/appservice/custom.py Adds HTTP 409 handling and response-body parsing for list_triggered_webjobs.
src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands_thru_mock.py Adds tests validating error translation and fallback parsing behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +10457 to +10464
try:
response_text = ex.response.text()
except TypeError:
response_text = ex.response.text
try:
message = json.loads(response_text).get('error') or str(ex)
except (ValueError, AttributeError):
message = str(ex)
message = json.loads(response_text).get('error') or str(ex)
except (ValueError, AttributeError):
message = str(ex)
raise UnclassifiedUserFault(message)
Comment on lines +2175 to +2177
error = HttpResponseError(message="Operation returned an invalid status '{}'".format(status_code))
error.status_code = status_code
error.response = response_mock
Comment on lines +10458 to +10460
response_text = ex.response.text()
except TypeError:
response_text = ex.response.text
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

webapp webjob triggered list drops actionable 409 response body

4 participants