From fdea9bdc26648f8a37b266ed0465b9582c64bc51 Mon Sep 17 00:00:00 2001 From: Krishna Tripathi Date: Mon, 7 Sep 2026 14:57:01 +0530 Subject: [PATCH 1/4] Add generated Azure Resilience Management extension --- src/azure-resilience-management/HISTORY.rst | 8 + src/azure-resilience-management/README.md | 5 + .../__init__.py | 42 + .../_help.py | 11 + .../_params.py | 13 + .../aaz/__init__.py | 6 + .../aaz/latest/__init__.py | 10 + .../aaz/latest/resilience/__cmd_group.py | 23 + .../aaz/latest/resilience/__init__.py | 11 + .../latest/resilience/drill/__cmd_group.py | 23 + .../aaz/latest/resilience/drill/__init__.py | 22 + .../drill/_add_or_update_resource.py | 346 ++++++ .../aaz/latest/resilience/drill/_create.py | 950 +++++++++++++++ .../aaz/latest/resilience/drill/_delete.py | 163 +++ .../aaz/latest/resilience/drill/_end.py | 226 ++++ .../aaz/latest/resilience/drill/_list.py | 678 +++++++++++ .../drill/_resync_readiness_check.py | 165 +++ .../aaz/latest/resilience/drill/_show.py | 659 +++++++++++ .../aaz/latest/resilience/drill/_start.py | 219 ++++ .../aaz/latest/resilience/drill/_update.py | 1042 +++++++++++++++++ .../drill/_validate_for_execution.py | 571 +++++++++ .../aaz/latest/resilience/drill/_wait.py | 658 +++++++++++ .../drill/drill_resource/__cmd_group.py | 23 + .../drill/drill_resource/__init__.py | 13 + .../resilience/drill/drill_resource/_list.py | 437 +++++++ .../resilience/drill/drill_resource/_show.py | 418 +++++++ .../resilience/drill/drill_run/__cmd_group.py | 23 + .../resilience/drill/drill_run/__init__.py | 20 + .../resilience/drill/drill_run/_add_note.py | 229 ++++ .../resilience/drill/drill_run/_fail_over.py | 300 +++++ .../drill/drill_run/_generate_report.py | 286 +++++ .../resilience/drill/drill_run/_list.py | 626 ++++++++++ .../drill_run/_list_report_download_url.py | 237 ++++ .../drill/drill_run/_mark_as_complete.py | 247 ++++ .../resilience/drill/drill_run/_reprotect.py | 256 ++++ .../resilience/drill/drill_run/_resume.py | 206 ++++ .../resilience/drill/drill_run/_show.py | 625 ++++++++++ .../drill_run_resource/__cmd_group.py | 23 + .../drill_run/drill_run_resource/__init__.py | 13 + .../drill_run/drill_run_resource/_list.py | 510 ++++++++ .../drill_run/drill_run_resource/_show.py | 509 ++++++++ .../resilience/drill/identity/__cmd_group.py | 23 + .../resilience/drill/identity/__init__.py | 15 + .../resilience/drill/identity/_assign.py | 853 ++++++++++++++ .../resilience/drill/identity/_remove.py | 853 ++++++++++++++ .../latest/resilience/drill/identity/_show.py | 694 +++++++++++ .../latest/resilience/drill/identity/_wait.py | 681 +++++++++++ .../resilience/goal_assignment/__cmd_group.py | 23 + .../resilience/goal_assignment/__init__.py | 20 + .../resilience/goal_assignment/_create.py | 377 ++++++ .../resilience/goal_assignment/_delete.py | 163 +++ .../resilience/goal_assignment/_list.py | 310 +++++ .../goal_assignment/_recommend_capacity.py | 269 +++++ .../goal_assignment/_refresh_goal_resource.py | 187 +++ .../resilience/goal_assignment/_show.py | 291 +++++ .../resilience/goal_assignment/_update.py | 519 ++++++++ .../goal_assignment/_update_goal_resource.py | 488 ++++++++ .../resilience/goal_assignment/_wait.py | 290 +++++ .../goal_resource/__cmd_group.py | 23 + .../goal_assignment/goal_resource/__init__.py | 13 + .../goal_assignment/goal_resource/_list.py | 334 ++++++ .../goal_assignment/goal_resource/_show.py | 315 +++++ .../resilience/goal_template/__cmd_group.py | 23 + .../resilience/goal_template/__init__.py | 17 + .../resilience/goal_template/_create.py | 354 ++++++ .../resilience/goal_template/_delete.py | 163 +++ .../latest/resilience/goal_template/_list.py | 302 +++++ .../latest/resilience/goal_template/_show.py | 283 +++++ .../resilience/goal_template/_update.py | 494 ++++++++ .../latest/resilience/goal_template/_wait.py | 282 +++++ .../resilience/recovery_plan/__cmd_group.py | 23 + .../resilience/recovery_plan/__init__.py | 31 + .../recovery_plan/_check_readiness.py | 194 +++ .../resilience/recovery_plan/_create.py | 855 ++++++++++++++ .../resilience/recovery_plan/_delete.py | 163 +++ .../resilience/recovery_plan/_failover.py | 272 +++++ .../recovery_plan/_failover_commit.py | 194 +++ .../resilience/recovery_plan/_finalize.py | 261 +++++ .../latest/resilience/recovery_plan/_list.py | 558 +++++++++ .../resilience/recovery_plan/_reprotect.py | 234 ++++ .../latest/resilience/recovery_plan/_show.py | 539 +++++++++ .../recovery_plan/_test_failover.py | 272 +++++ .../recovery_plan/_test_failover_cleanup.py | 220 ++++ .../resilience/recovery_plan/_update.py | 972 +++++++++++++++ .../recovery_plan/_update_resource.py | 800 +++++++++++++ .../recovery_plan/_validate_for_failover.py | 689 +++++++++++ .../_validate_for_failover_commit.py | 611 ++++++++++ .../recovery_plan/_validate_for_operation.py | 286 +++++ .../recovery_plan/_validate_for_reprotect.py | 651 ++++++++++ .../_validate_for_test_failover.py | 689 +++++++++++ .../_validate_for_test_failover_cleanup.py | 611 ++++++++++ .../latest/resilience/recovery_plan/_wait.py | 538 +++++++++ .../recovery_plan/identity/__cmd_group.py | 23 + .../recovery_plan/identity/__init__.py | 15 + .../recovery_plan/identity/_assign.py | 733 ++++++++++++ .../recovery_plan/identity/_remove.py | 733 ++++++++++++ .../recovery_plan/identity/_show.py | 574 +++++++++ .../recovery_plan/identity/_wait.py | 561 +++++++++ .../recovery_plan/recovery_job/__cmd_group.py | 23 + .../recovery_plan/recovery_job/__init__.py | 16 + .../recovery_plan/recovery_job/_cancel.py | 299 +++++ .../recovery_plan/recovery_job/_list.py | 500 ++++++++ .../recovery_plan/recovery_job/_resume.py | 299 +++++ .../recovery_plan/recovery_job/_retry.py | 273 +++++ .../recovery_plan/recovery_job/_show.py | 499 ++++++++ .../recovery_job_resource/__cmd_group.py | 23 + .../recovery_job_resource/__init__.py | 13 + .../recovery_job_resource/_list.py | 540 +++++++++ .../recovery_job_resource/_show.py | 539 +++++++++ .../recovery_resource/__cmd_group.py | 23 + .../recovery_resource/__init__.py | 13 + .../recovery_plan/recovery_resource/_list.py | 499 ++++++++ .../recovery_plan/recovery_resource/_show.py | 498 ++++++++ .../unified_resilience_item/__cmd_group.py | 23 + .../unified_resilience_item/__init__.py | 13 + .../unified_resilience_item/_list.py | 289 +++++ .../unified_resilience_item/_show.py | 270 +++++ .../resilience/usage_plan/__cmd_group.py | 23 + .../latest/resilience/usage_plan/__init__.py | 17 + .../latest/resilience/usage_plan/_create.py | 347 ++++++ .../latest/resilience/usage_plan/_delete.py | 163 +++ .../aaz/latest/resilience/usage_plan/_list.py | 423 +++++++ .../aaz/latest/resilience/usage_plan/_show.py | 277 +++++ .../latest/resilience/usage_plan/_update.py | 487 ++++++++ .../aaz/latest/resilience/usage_plan/_wait.py | 276 +++++ .../usage_plan/enrollment/__cmd_group.py | 23 + .../usage_plan/enrollment/__init__.py | 17 + .../usage_plan/enrollment/_create.py | 326 ++++++ .../usage_plan/enrollment/_delete.py | 176 +++ .../resilience/usage_plan/enrollment/_list.py | 283 +++++ .../resilience/usage_plan/enrollment/_show.py | 284 +++++ .../usage_plan/enrollment/_update.py | 472 ++++++++ .../resilience/usage_plan/enrollment/_wait.py | 283 +++++ .../azext_metadata.json | 4 + .../commands.py | 15 + .../custom.py | 14 + .../tests/__init__.py | 6 + .../tests/latest/__init__.py | 6 + .../test_azure_resilience_management.py | 13 + src/azure-resilience-management/setup.cfg | 1 + src/azure-resilience-management/setup.py | 51 + 141 files changed, 40452 insertions(+) create mode 100644 src/azure-resilience-management/HISTORY.rst create mode 100644 src/azure-resilience-management/README.md create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/_help.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/_params.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_add_or_update_resource.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_end.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_resync_readiness_check.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_start.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_validate_for_execution.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_add_note.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_fail_over.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_generate_report.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list_report_download_url.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_mark_as_complete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_reprotect.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_resume.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_assign.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_remove.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_recommend_capacity.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_refresh_goal_resource.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update_goal_resource.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_check_readiness.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover_commit.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_finalize.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_reprotect.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover_cleanup.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update_resource.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover_commit.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_operation.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_reprotect.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover_cleanup.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_assign.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_remove.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_cancel.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_resume.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_retry.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__cmd_group.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_create.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_delete.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_list.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_show.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_update.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_wait.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/azext_metadata.json create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/commands.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/custom.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/tests/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/tests/latest/__init__.py create mode 100644 src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py create mode 100644 src/azure-resilience-management/setup.cfg create mode 100644 src/azure-resilience-management/setup.py diff --git a/src/azure-resilience-management/HISTORY.rst b/src/azure-resilience-management/HISTORY.rst new file mode 100644 index 00000000000..abbff5a61a7 --- /dev/null +++ b/src/azure-resilience-management/HISTORY.rst @@ -0,0 +1,8 @@ +.. :changelog: + +Release History +=============== + +1.0.0b1 +++++++ +* Initial release. \ No newline at end of file diff --git a/src/azure-resilience-management/README.md b/src/azure-resilience-management/README.md new file mode 100644 index 00000000000..e27100f8e98 --- /dev/null +++ b/src/azure-resilience-management/README.md @@ -0,0 +1,5 @@ +# Azure CLI AzureResilienceManagement Extension # +This is an extension to Azure CLI to manage AzureResilienceManagement resources. + +## How to use ## +Please add commands usage here. \ No newline at end of file diff --git a/src/azure-resilience-management/azext_azure_resilience_management/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/__init__.py new file mode 100644 index 00000000000..6a89d1b07d3 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/__init__.py @@ -0,0 +1,42 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +from azure.cli.core import AzCommandsLoader +from azext_azure_resilience_management._help import helps # pylint: disable=unused-import + + +class AzureResilienceManagementCommandsLoader(AzCommandsLoader): + + def __init__(self, cli_ctx=None): + from azure.cli.core.commands import CliCommandType + custom_command_type = CliCommandType( + operations_tmpl='azext_azure_resilience_management.custom#{}') + super().__init__(cli_ctx=cli_ctx, + custom_command_type=custom_command_type) + + def load_command_table(self, args): + from azext_azure_resilience_management.commands import load_command_table + from azure.cli.core.aaz import load_aaz_command_table + try: + from . import aaz + except ImportError: + aaz = None + if aaz: + load_aaz_command_table( + loader=self, + aaz_pkg_name=aaz.__name__, + args=args + ) + load_command_table(self, args) + return self.command_table + + def load_arguments(self, command): + from azext_azure_resilience_management._params import load_arguments + load_arguments(self, command) + + +COMMAND_LOADER_CLS = AzureResilienceManagementCommandsLoader diff --git a/src/azure-resilience-management/azext_azure_resilience_management/_help.py b/src/azure-resilience-management/azext_azure_resilience_management/_help.py new file mode 100644 index 00000000000..126d5d00714 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/_help.py @@ -0,0 +1,11 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=line-too-long +# pylint: disable=too-many-lines + +from knack.help_files import helps # pylint: disable=unused-import diff --git a/src/azure-resilience-management/azext_azure_resilience_management/_params.py b/src/azure-resilience-management/azext_azure_resilience_management/_params.py new file mode 100644 index 00000000000..cfcec717c9c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/_params.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + + +def load_arguments(self, _): # pylint: disable=unused-argument + pass diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/__init__.py new file mode 100644 index 00000000000..f6acc11aa4e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/__init__.py @@ -0,0 +1,10 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__cmd_group.py new file mode 100644 index 00000000000..0239600d2fd --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience", +) +class __CMDGroup(AAZCommandGroup): + """Manage Resilience Management + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__init__.py new file mode 100644 index 00000000000..5a9d61963d6 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/__init__.py @@ -0,0 +1,11 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__cmd_group.py new file mode 100644 index 00000000000..cea67275d16 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience drill", +) +class __CMDGroup(AAZCommandGroup): + """Manage Drill + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__init__.py new file mode 100644 index 00000000000..997ce53f7b9 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/__init__.py @@ -0,0 +1,22 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._add_or_update_resource import * +from ._create import * +from ._delete import * +from ._end import * +from ._list import * +from ._resync_readiness_check import * +from ._show import * +from ._start import * +from ._update import * +from ._validate_for_execution import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_add_or_update_resource.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_add_or_update_resource.py new file mode 100644 index 00000000000..281ec565c2d --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_add_or_update_resource.py @@ -0,0 +1,346 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill add-or-update-resource", +) +class AddOrUpdateResource(AAZCommand): + """This enables the user to include, exclude or update resources from their Drill. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/addorupdateresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.fault_duration_in_min = AAZIntArg( + options=["--fault-duration-in-min"], + arg_group="Body", + help="Duration of faults.", + required=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.force_inclusion_and_update = AAZStrArg( + options=["--force-inclusion-and-update"], + arg_group="Body", + help="Whether to allow inclusion and update despite attention reasons.", + enum={"Disable": "Disable", "Enable": "Enable"}, + ) + _args_schema.resource_lists = AAZObjectArg( + options=["--resource-lists"], + arg_group="Body", + help="Add, Update, Delete resource lists", + ) + + resource_lists = cls._args_schema.resource_lists + resource_lists.exclude_resources = AAZListArg( + options=["exclude-resources"], + help="Excluded resource", + ) + resource_lists.include_resources = AAZListArg( + options=["include-resources"], + help="Include resource", + ) + resource_lists.update_resources = AAZListArg( + options=["update-resources"], + help="Update resource", + ) + + exclude_resources = cls._args_schema.resource_lists.exclude_resources + exclude_resources.Element = AAZResourceIdArg() + + include_resources = cls._args_schema.resource_lists.include_resources + include_resources.Element = AAZObjectArg() + cls._build_args_include_or_update_resource_create(include_resources.Element) + + update_resources = cls._args_schema.resource_lists.update_resources + update_resources.Element = AAZObjectArg() + cls._build_args_include_or_update_resource_create(update_resources.Element) + return cls._args_schema + + _args_include_or_update_resource_create = None + + @classmethod + def _build_args_include_or_update_resource_create(cls, _schema): + if cls._args_include_or_update_resource_create is not None: + _schema.fault_properties = cls._args_include_or_update_resource_create.fault_properties + _schema.id = cls._args_include_or_update_resource_create.id + return + + cls._args_include_or_update_resource_create = AAZObjectArg() + + include_or_update_resource_create = cls._args_include_or_update_resource_create + include_or_update_resource_create.fault_properties = AAZObjectArg( + options=["fault-properties"], + help="Fault properties.", + ) + include_or_update_resource_create.id = AAZResourceIdArg( + options=["id"], + help="Id of the DrillResource to be included (NOT the ARM Id of the underlying resource).", + required=True, + ) + + fault_properties = cls._args_include_or_update_resource_create.fault_properties + fault_properties.custom_fault = AAZObjectArg( + options=["custom-fault"], + help="Custom Fault Details selected by user", + ) + fault_properties.overridden_default_fault = AAZObjectArg( + options=["overridden-default-fault"], + help="Override fault provided by the user.", + ) + + custom_fault = cls._args_include_or_update_resource_create.fault_properties.custom_fault + custom_fault.fault_name = AAZStrArg( + options=["fault-name"], + help="fault name", + required=True, + fmt=AAZStrArgFormat( + max_length=100, + min_length=3, + ), + ) + custom_fault.script_resource_id = AAZResourceIdArg( + options=["script-resource-id"], + help="ID of ARM resource used for automation (e.g. Automation runbook URL).", + required=True, + ) + + overridden_default_fault = cls._args_include_or_update_resource_create.fault_properties.overridden_default_fault + overridden_default_fault.fault_name = AAZStrArg( + options=["fault-name"], + help="fault name", + required=True, + fmt=AAZStrArgFormat( + max_length=100, + min_length=1, + ), + ) + overridden_default_fault.fault_urn = AAZStrArg( + options=["fault-urn"], + help="fault urn.", + required=True, + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + overridden_default_fault.target_resource_id = AAZResourceIdArg( + options=["target-resource-id"], + help="ARMId of the target resource where fault will be applied. For non-NSG, same as ResourceId. For NSG, its the NSG resource and not the actual resource which is to be simulated for faulting.", + required=True, + ) + + _schema.fault_properties = cls._args_include_or_update_resource_create.fault_properties + _schema.id = cls._args_include_or_update_resource_create.id + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsAddOrUpdateResources(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class DrillsAddOrUpdateResources(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + None, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/addOrUpdateResources", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("faultDurationInMin", AAZIntType, ".fault_duration_in_min", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("forceInclusionAndUpdate", AAZStrType, ".force_inclusion_and_update") + _builder.set_prop("resourceLists", AAZObjectType, ".resource_lists") + + resource_lists = _builder.get(".resourceLists") + if resource_lists is not None: + resource_lists.set_prop("excludeResources", AAZListType, ".exclude_resources") + resource_lists.set_prop("includeResources", AAZListType, ".include_resources") + resource_lists.set_prop("updateResources", AAZListType, ".update_resources") + + exclude_resources = _builder.get(".resourceLists.excludeResources") + if exclude_resources is not None: + exclude_resources.set_elements(AAZStrType, ".") + + include_resources = _builder.get(".resourceLists.includeResources") + if include_resources is not None: + _AddOrUpdateResourceHelper._build_schema_include_or_update_resource_create(include_resources.set_elements(AAZObjectType, ".")) + + update_resources = _builder.get(".resourceLists.updateResources") + if update_resources is not None: + _AddOrUpdateResourceHelper._build_schema_include_or_update_resource_create(update_resources.set_elements(AAZObjectType, ".")) + + return self.serialize_content(_content_value) + + def on_204(self, session): + pass + + +class _AddOrUpdateResourceHelper: + """Helper class for AddOrUpdateResource""" + + @classmethod + def _build_schema_include_or_update_resource_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("faultProperties", AAZObjectType, ".fault_properties") + _builder.set_prop("id", AAZStrType, ".id", typ_kwargs={"flags": {"required": True}}) + + fault_properties = _builder.get(".faultProperties") + if fault_properties is not None: + fault_properties.set_prop("customFault", AAZObjectType, ".custom_fault") + fault_properties.set_prop("overriddenDefaultFault", AAZObjectType, ".overridden_default_fault") + + custom_fault = _builder.get(".faultProperties.customFault") + if custom_fault is not None: + custom_fault.set_prop("faultName", AAZStrType, ".fault_name", typ_kwargs={"flags": {"required": True}}) + custom_fault.set_prop("scriptResourceId", AAZStrType, ".script_resource_id", typ_kwargs={"flags": {"required": True}}) + + overridden_default_fault = _builder.get(".faultProperties.overriddenDefaultFault") + if overridden_default_fault is not None: + overridden_default_fault.set_prop("faultName", AAZStrType, ".fault_name", typ_kwargs={"flags": {"required": True}}) + overridden_default_fault.set_prop("faultUrn", AAZStrType, ".fault_urn", typ_kwargs={"flags": {"required": True}}) + overridden_default_fault.set_prop("targetResourceId", AAZStrType, ".target_resource_id", typ_kwargs={"flags": {"required": True}}) + + +__all__ = ["AddOrUpdateResource"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_create.py new file mode 100644 index 00000000000..ed93a217e5f --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_create.py @@ -0,0 +1,950 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill create", +) +class Create(AAZCommand): + """Create a Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.regional = AAZObjectArg( + options=["--regional"], + arg_group="Properties", + blank={}, + ) + _args_schema.zonal = AAZObjectArg( + options=["--zonal"], + arg_group="Properties", + blank={}, + ) + _args_schema.chaos_resource_properties = AAZObjectArg( + options=["--chaos-resource-properties"], + arg_group="Properties", + help="Chaos Resource properties.", + ) + _args_schema.drill_asset_properties = AAZObjectArg( + options=["--drill-asset-properties"], + arg_group="Properties", + help="Properties for internal resources that are created for the Drill.", + ) + _args_schema.health_model_monitoring_properties = AAZObjectArg( + options=["--health-model-monitoring-properties"], + arg_group="Properties", + help="Azure Health Model monitoring properties of the Drill.", + ) + _args_schema.monitoring_properties = AAZObjectArg( + options=["--monitoring-properties"], + arg_group="Properties", + help="Monitoring properties of the Drill.", + ) + _args_schema.rbac_setup_mode = AAZStrArg( + options=["--rbac-setup-mode"], + arg_group="Properties", + help="RBAC setup mode.", + enum={"AutomatedBuiltinRoles": "AutomatedBuiltinRoles", "AutomatedCustomRole": "AutomatedCustomRole", "Manual": "Manual"}, + ) + _args_schema.recovery_plan_properties = AAZObjectArg( + options=["--recovery-plan-properties"], + arg_group="Properties", + help="ROPlan properties.", + ) + _args_schema.sli_monitoring_properties = AAZObjectArg( + options=["--sli-monitoring-properties"], + arg_group="Properties", + help="SLI monitoring properties of the Drill.", + ) + + chaos_resource_properties = cls._args_schema.chaos_resource_properties + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectArg( + options=["chaos-resource-identity-for-faults"], + help="Identity to be used by the Chaos Resource for invoking faults on resources.", + required=True, + ) + cls._build_args_associated_identity_create(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for Chaos Resource operations.", + required=True, + ) + cls._build_args_associated_identity_create(chaos_resource_properties.identity) + + drill_asset_properties = cls._args_schema.drill_asset_properties + drill_asset_properties.region = AAZStrArg( + options=["region"], + help="Region where Drill's internal resources will be created.", + required=True, + ) + drill_asset_properties.resource_group = AAZStrArg( + options=["resource-group"], + help="Resource group where Drill's internal resources will be created. If not specified, defaults to 'AzureResilienceManagementDrills'. This value is immutable after drill creation.", + fmt=AAZStrArgFormat( + pattern="^[-\\w\\._\\(\\)]+$", + max_length=90, + min_length=1, + ), + ) + drill_asset_properties.subscription = AAZStrArg( + options=["subscription"], + help="Subscription where Drill's internal resources will be created.", + required=True, + ) + + health_model_monitoring_properties = cls._args_schema.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZResourceIdArg( + options=["discovery-rule-id"], + help="Full ARM Id of the discovery rule inside the Azure Health Model. The parent Health Model is derived from this Id; it is the only identifier accepted on the wire.", + required=True, + ) + health_model_monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity that the Drill uses to read the Azure Health Model. The Drill is granted Reader on the Health Model for this identity.", + required=True, + ) + cls._build_args_associated_identity_create(health_model_monitoring_properties.identity) + + monitoring_properties = cls._args_schema.monitoring_properties + monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for Drill monitoring operations.", + ) + cls._build_args_associated_identity_create(monitoring_properties.identity) + + recovery_plan_properties = cls._args_schema.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for RecoveryPlan operations.", + required=True, + ) + cls._build_args_associated_identity_create(recovery_plan_properties.identity) + + sli_monitoring_properties = cls._args_schema.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity that the Drill uses to read evaluated SLI results from each SLI's destination Azure Monitor Workspace. The Drill is granted Monitoring Reader on every destination AMW of every selected SLI for this identity.", + required=True, + ) + cls._build_args_associated_identity_create(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListArg( + options=["slis"], + help="The SLIs selected for Drill monitoring. Maximum of two entries: at most one Availability and one Latency. Duplicate types or duplicate SLI Ids are rejected.", + required=True, + fmt=AAZListArgFormat( + max_length=2, + min_length=1, + ), + ) + + slis = cls._args_schema.sli_monitoring_properties.slis + slis.Element = AAZObjectArg() + + _element = cls._args_schema.sli_monitoring_properties.slis.Element + _element.sli_id = AAZResourceIdArg( + options=["sli-id"], + help="Full ARM Id of the SLI.", + required=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="User-declared category of the SLI. Must be unique across the selected SLIs.", + required=True, + enum={"Availability": "Availability", "Latency": "Latency"}, + ) + return cls._args_schema + + _args_associated_identity_create = None + + @classmethod + def _build_args_associated_identity_create(cls, _schema): + if cls._args_associated_identity_create is not None: + _schema.type = cls._args_associated_identity_create.type + _schema.user_assigned_identity = cls._args_associated_identity_create.user_assigned_identity + return + + cls._args_associated_identity_create = AAZObjectArg() + + associated_identity_create = cls._args_associated_identity_create + associated_identity_create.type = AAZStrArg( + options=["type"], + help="Identity type linked with the resource", + required=True, + enum={"None": "None", "SystemAssigned": "SystemAssigned", "SystemAssigned,UserAssigned": "SystemAssigned,UserAssigned", "UserAssigned": "UserAssigned"}, + ) + associated_identity_create.user_assigned_identity = AAZResourceIdArg( + options=["user-assigned-identity"], + help="User assigned identity id linked with the resource", + ) + + _schema.type = cls._args_associated_identity_create.type + _schema.user_assigned_identity = cls._args_associated_identity_create.user_assigned_identity + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsCreate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsCreate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + + identity = _builder.get(".identity") + if identity is not None: + identity.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "create"}}) + identity.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "create"}}) + + user_assigned = _builder.get(".identity.userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("chaosResourceProperties", AAZObjectType, ".chaos_resource_properties") + properties.set_prop("drillAssetProperties", AAZObjectType, ".drill_asset_properties") + properties.set_const("drillType", "Regional", AAZStrType, ".regional", typ_kwargs={"flags": {"required": True}}) + properties.set_const("drillType", "Zonal", AAZStrType, ".zonal", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("healthModelMonitoringProperties", AAZObjectType, ".health_model_monitoring_properties") + properties.set_prop("monitoringProperties", AAZObjectType, ".monitoring_properties") + properties.set_prop("rbacSetupMode", AAZStrType, ".rbac_setup_mode") + properties.set_prop("recoveryPlanProperties", AAZObjectType, ".recovery_plan_properties") + properties.set_prop("sliMonitoringProperties", AAZObjectType, ".sli_monitoring_properties") + properties.discriminate_by("drillType", "Regional") + properties.discriminate_by("drillType", "Zonal") + + chaos_resource_properties = _builder.get(".properties.chaosResourceProperties") + if chaos_resource_properties is not None: + _CreateHelper._build_schema_associated_identity_create(chaos_resource_properties.set_prop("chaosResourceIdentityForFaults", AAZObjectType, ".chaos_resource_identity_for_faults", typ_kwargs={"flags": {"required": True}})) + _CreateHelper._build_schema_associated_identity_create(chaos_resource_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + drill_asset_properties = _builder.get(".properties.drillAssetProperties") + if drill_asset_properties is not None: + drill_asset_properties.set_prop("region", AAZStrType, ".region", typ_kwargs={"flags": {"required": True}}) + drill_asset_properties.set_prop("resourceGroup", AAZStrType, ".resource_group") + drill_asset_properties.set_prop("subscription", AAZStrType, ".subscription", typ_kwargs={"flags": {"required": True}}) + + health_model_monitoring_properties = _builder.get(".properties.healthModelMonitoringProperties") + if health_model_monitoring_properties is not None: + health_model_monitoring_properties.set_prop("discoveryRuleId", AAZStrType, ".discovery_rule_id", typ_kwargs={"flags": {"required": True}}) + _CreateHelper._build_schema_associated_identity_create(health_model_monitoring_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + monitoring_properties = _builder.get(".properties.monitoringProperties") + if monitoring_properties is not None: + _CreateHelper._build_schema_associated_identity_create(monitoring_properties.set_prop("identity", AAZObjectType, ".identity")) + + recovery_plan_properties = _builder.get(".properties.recoveryPlanProperties") + if recovery_plan_properties is not None: + _CreateHelper._build_schema_associated_identity_create(recovery_plan_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + sli_monitoring_properties = _builder.get(".properties.sliMonitoringProperties") + if sli_monitoring_properties is not None: + _CreateHelper._build_schema_associated_identity_create(sli_monitoring_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + sli_monitoring_properties.set_prop("slis", AAZListType, ".slis", typ_kwargs={"flags": {"required": True}}) + + slis = _builder.get(".properties.sliMonitoringProperties.slis") + if slis is not None: + slis.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.sliMonitoringProperties.slis[]") + if _elements is not None: + _elements.set_prop("sliId", AAZStrType, ".sli_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.identity = AAZIdentityObjectType() + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200_201.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200_201.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200_201.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = cls._schema_on_200_201.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = cls._schema_on_200_201.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = cls._schema_on_200_201.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = cls._schema_on_200_201.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = cls._schema_on_200_201.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = cls._schema_on_200_201.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = cls._schema_on_200_201.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = cls._schema_on_200_201.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = cls._schema_on_200_201.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = cls._schema_on_200_201.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = cls._schema_on_200_201.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = cls._schema_on_200_201.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = cls._schema_on_200_201.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + _CreateHelper._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _CreateHelper._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = cls._schema_on_200_201.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = cls._schema_on_200_201.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _CreateHelper._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = cls._schema_on_200_201.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = cls._schema_on_200_201.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + _CreateHelper._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = cls._schema_on_200_201.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _CreateHelper._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = cls._schema_on_200_201.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _CreateHelper._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = cls._schema_on_200_201.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = cls._schema_on_200_201.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = cls._schema_on_200_201.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = cls._schema_on_200_201.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + @classmethod + def _build_schema_associated_identity_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("userAssignedIdentity", AAZStrType, ".user_assigned_identity") + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_delete.py new file mode 100644 index 00000000000..6f31a7185cb --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_delete.py @@ -0,0 +1,163 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete a Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class DrillsDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_end.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_end.py new file mode 100644 index 00000000000..2a88307c399 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_end.py @@ -0,0 +1,226 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill end", +) +class End(AAZCommand): + """This ends the currently running instance of the Drill. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/end", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.attestation = AAZStrArg( + options=["--attestation"], + arg_group="Body", + help="Attestation Status", + required=True, + enum={"Failed": "Failed", "Success": "Success"}, + ) + _args_schema.attestation_notes = AAZStrArg( + options=["--attestation-notes"], + arg_group="Body", + help="Notes", + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsEnd(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsEnd(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/end", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("attestation", AAZStrType, ".attestation", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("attestationNotes", AAZStrType, ".attestation_notes", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _EndHelper: + """Helper class for End""" + + +__all__ = ["End"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_list.py new file mode 100644 index 00000000000..34c9729f18e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_list.py @@ -0,0 +1,678 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill list", +) +class List(AAZCommand): + """List Drill resources by tenant + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class DrillsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.identity = AAZIdentityObjectType() + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.value.Element.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.value.Element.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.value.Element.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = cls._schema_on_200.value.Element.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = cls._schema_on_200.value.Element.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = cls._schema_on_200.value.Element.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = cls._schema_on_200.value.Element.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = cls._schema_on_200.value.Element.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = cls._schema_on_200.value.Element.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = cls._schema_on_200.value.Element.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = cls._schema_on_200.value.Element.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = cls._schema_on_200.value.Element.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = cls._schema_on_200.value.Element.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = cls._schema_on_200.value.Element.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = cls._schema_on_200.value.Element.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = cls._schema_on_200.value.Element.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + _ListHelper._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ListHelper._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = cls._schema_on_200.value.Element.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = cls._schema_on_200.value.Element.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ListHelper._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = cls._schema_on_200.value.Element.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = cls._schema_on_200.value.Element.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + _ListHelper._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = cls._schema_on_200.value.Element.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ListHelper._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = cls._schema_on_200.value.Element.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ListHelper._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = cls._schema_on_200.value.Element.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = cls._schema_on_200.value.Element.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = cls._schema_on_200.value.Element.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = cls._schema_on_200.value.Element.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_resync_readiness_check.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_resync_readiness_check.py new file mode 100644 index 00000000000..5aa60af7074 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_resync_readiness_check.py @@ -0,0 +1,165 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill resync-readiness-check", +) +class ResyncReadinessCheck(AAZCommand): + """This triggers detection of any drifts from the desired state of Resources and RBAC. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/resyncreadinesscheck", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsResyncReadinessCheck(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class DrillsResyncReadinessCheck(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + None, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/resyncReadinessCheck", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + +class _ResyncReadinessCheckHelper: + """Helper class for ResyncReadinessCheck""" + + +__all__ = ["ResyncReadinessCheck"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_show.py new file mode 100644 index 00000000000..5ffc4aa1728 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_show.py @@ -0,0 +1,659 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill show", +) +class Show(AAZCommand): + """Get a Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = cls._schema_on_200.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = cls._schema_on_200.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = cls._schema_on_200.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = cls._schema_on_200.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = cls._schema_on_200.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = cls._schema_on_200.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + _ShowHelper._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ShowHelper._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = cls._schema_on_200.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = cls._schema_on_200.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ShowHelper._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = cls._schema_on_200.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = cls._schema_on_200.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + _ShowHelper._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = cls._schema_on_200.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ShowHelper._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = cls._schema_on_200.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _ShowHelper._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = cls._schema_on_200.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = cls._schema_on_200.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = cls._schema_on_200.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = cls._schema_on_200.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_start.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_start.py new file mode 100644 index 00000000000..b011e8d8f6b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_start.py @@ -0,0 +1,219 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill start", +) +class Start(AAZCommand): + """This starts a new running instance of the Drill. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/start", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.mode = AAZStrArg( + options=["--mode"], + arg_group="Body", + help="Mode of starting the Drill", + required=True, + enum={"Failover": "Failover"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsStart(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsStart(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/start", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("mode", AAZStrType, ".mode", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _StartHelper: + """Helper class for Start""" + + +__all__ = ["Start"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_update.py new file mode 100644 index 00000000000..ec34160e2e7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_update.py @@ -0,0 +1,1042 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill update", +) +class Update(AAZCommand): + """Update a Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Identity" + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.regional = AAZObjectArg( + options=["--regional"], + arg_group="Properties", + blank={}, + ) + _args_schema.chaos_resource_properties = AAZObjectArg( + options=["--chaos-resource-properties"], + arg_group="Properties", + help="Chaos Resource properties.", + nullable=True, + ) + _args_schema.drill_asset_properties = AAZObjectArg( + options=["--drill-asset-properties"], + arg_group="Properties", + help="Properties for internal resources that are created for the Drill.", + nullable=True, + ) + _args_schema.health_model_monitoring_properties = AAZObjectArg( + options=["--health-model-monitoring-properties"], + arg_group="Properties", + help="Azure Health Model monitoring properties of the Drill.", + nullable=True, + ) + _args_schema.monitoring_properties = AAZObjectArg( + options=["--monitoring-properties"], + arg_group="Properties", + help="Monitoring properties of the Drill.", + nullable=True, + ) + _args_schema.rbac_setup_mode = AAZStrArg( + options=["--rbac-setup-mode"], + arg_group="Properties", + help="RBAC setup mode.", + nullable=True, + enum={"AutomatedBuiltinRoles": "AutomatedBuiltinRoles", "AutomatedCustomRole": "AutomatedCustomRole", "Manual": "Manual"}, + ) + _args_schema.recovery_plan_properties = AAZObjectArg( + options=["--recovery-plan-properties"], + arg_group="Properties", + help="ROPlan properties.", + nullable=True, + ) + _args_schema.sli_monitoring_properties = AAZObjectArg( + options=["--sli-monitoring-properties"], + arg_group="Properties", + help="SLI monitoring properties of the Drill.", + nullable=True, + ) + + chaos_resource_properties = cls._args_schema.chaos_resource_properties + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectArg( + options=["chaos-resource-identity-for-faults"], + help="Identity to be used by the Chaos Resource for invoking faults on resources.", + ) + cls._build_args_associated_identity_update(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for Chaos Resource operations.", + ) + cls._build_args_associated_identity_update(chaos_resource_properties.identity) + + drill_asset_properties = cls._args_schema.drill_asset_properties + drill_asset_properties.region = AAZStrArg( + options=["region"], + help="Region where Drill's internal resources will be created.", + ) + drill_asset_properties.subscription = AAZStrArg( + options=["subscription"], + help="Subscription where Drill's internal resources will be created.", + ) + + health_model_monitoring_properties = cls._args_schema.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZResourceIdArg( + options=["discovery-rule-id"], + help="Full ARM Id of the discovery rule inside the Azure Health Model. The parent Health Model is derived from this Id; it is the only identifier accepted on the wire.", + ) + health_model_monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity that the Drill uses to read the Azure Health Model. The Drill is granted Reader on the Health Model for this identity.", + ) + cls._build_args_associated_identity_update(health_model_monitoring_properties.identity) + + monitoring_properties = cls._args_schema.monitoring_properties + monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for Drill monitoring operations.", + ) + cls._build_args_associated_identity_update(monitoring_properties.identity) + + recovery_plan_properties = cls._args_schema.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity to use for RecoveryPlan operations.", + ) + cls._build_args_associated_identity_update(recovery_plan_properties.identity) + + sli_monitoring_properties = cls._args_schema.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectArg( + options=["identity"], + help="Identity that the Drill uses to read evaluated SLI results from each SLI's destination Azure Monitor Workspace. The Drill is granted Monitoring Reader on every destination AMW of every selected SLI for this identity.", + ) + cls._build_args_associated_identity_update(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListArg( + options=["slis"], + help="The SLIs selected for Drill monitoring. Maximum of two entries: at most one Availability and one Latency. Duplicate types or duplicate SLI Ids are rejected.", + fmt=AAZListArgFormat( + max_length=2, + min_length=1, + ), + ) + + slis = cls._args_schema.sli_monitoring_properties.slis + slis.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.sli_monitoring_properties.slis.Element + _element.sli_id = AAZResourceIdArg( + options=["sli-id"], + help="Full ARM Id of the SLI.", + ) + _element.type = AAZStrArg( + options=["type"], + help="User-declared category of the SLI. Must be unique across the selected SLIs.", + enum={"Availability": "Availability", "Latency": "Latency"}, + ) + return cls._args_schema + + _args_associated_identity_update = None + + @classmethod + def _build_args_associated_identity_update(cls, _schema): + if cls._args_associated_identity_update is not None: + _schema.type = cls._args_associated_identity_update.type + _schema.user_assigned_identity = cls._args_associated_identity_update.user_assigned_identity + return + + cls._args_associated_identity_update = AAZObjectArg() + + associated_identity_update = cls._args_associated_identity_update + associated_identity_update.type = AAZStrArg( + options=["type"], + help="Identity type linked with the resource", + enum={"None": "None", "SystemAssigned": "SystemAssigned", "SystemAssigned,UserAssigned": "SystemAssigned,UserAssigned", "UserAssigned": "UserAssigned"}, + ) + associated_identity_update.user_assigned_identity = AAZResourceIdArg( + options=["user-assigned-identity"], + help="User assigned identity id linked with the resource", + nullable=True, + ) + + _schema.type = cls._args_associated_identity_update.type + _schema.user_assigned_identity = cls._args_associated_identity_update.user_assigned_identity + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.DrillsCreate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_drill_read(cls._schema_on_200) + + return cls._schema_on_200 + + class DrillsCreate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_drill_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("chaosResourceProperties", AAZObjectType, ".chaos_resource_properties") + properties.set_prop("drillAssetProperties", AAZObjectType, ".drill_asset_properties") + properties.set_prop("healthModelMonitoringProperties", AAZObjectType, ".health_model_monitoring_properties") + properties.set_prop("monitoringProperties", AAZObjectType, ".monitoring_properties") + properties.set_prop("rbacSetupMode", AAZStrType, ".rbac_setup_mode") + properties.set_prop("recoveryPlanProperties", AAZObjectType, ".recovery_plan_properties") + properties.set_prop("sliMonitoringProperties", AAZObjectType, ".sli_monitoring_properties") + properties.discriminate_by("drillType", "Regional") + + chaos_resource_properties = _builder.get(".properties.chaosResourceProperties") + if chaos_resource_properties is not None: + _UpdateHelper._build_schema_associated_identity_update(chaos_resource_properties.set_prop("chaosResourceIdentityForFaults", AAZObjectType, ".chaos_resource_identity_for_faults", typ_kwargs={"flags": {"required": True}})) + _UpdateHelper._build_schema_associated_identity_update(chaos_resource_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + drill_asset_properties = _builder.get(".properties.drillAssetProperties") + if drill_asset_properties is not None: + drill_asset_properties.set_prop("region", AAZStrType, ".region", typ_kwargs={"flags": {"required": True}}) + drill_asset_properties.set_prop("subscription", AAZStrType, ".subscription", typ_kwargs={"flags": {"required": True}}) + + health_model_monitoring_properties = _builder.get(".properties.healthModelMonitoringProperties") + if health_model_monitoring_properties is not None: + health_model_monitoring_properties.set_prop("discoveryRuleId", AAZStrType, ".discovery_rule_id", typ_kwargs={"flags": {"required": True}}) + _UpdateHelper._build_schema_associated_identity_update(health_model_monitoring_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + monitoring_properties = _builder.get(".properties.monitoringProperties") + if monitoring_properties is not None: + _UpdateHelper._build_schema_associated_identity_update(monitoring_properties.set_prop("identity", AAZObjectType, ".identity")) + + recovery_plan_properties = _builder.get(".properties.recoveryPlanProperties") + if recovery_plan_properties is not None: + _UpdateHelper._build_schema_associated_identity_update(recovery_plan_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + + sli_monitoring_properties = _builder.get(".properties.sliMonitoringProperties") + if sli_monitoring_properties is not None: + _UpdateHelper._build_schema_associated_identity_update(sli_monitoring_properties.set_prop("identity", AAZObjectType, ".identity", typ_kwargs={"flags": {"required": True}})) + sli_monitoring_properties.set_prop("slis", AAZListType, ".slis", typ_kwargs={"flags": {"required": True}}) + + slis = _builder.get(".properties.sliMonitoringProperties.slis") + if slis is not None: + slis.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.sliMonitoringProperties.slis[]") + if _elements is not None: + _elements.set_prop("sliId", AAZStrType, ".sli_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + @classmethod + def _build_schema_associated_identity_update(cls, _builder): + if _builder is None: + return + _builder.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("userAssignedIdentity", AAZStrType, ".user_assigned_identity") + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_drill_read = None + + @classmethod + def _build_schema_drill_read(cls, _schema): + if cls._schema_drill_read is not None: + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + return + + cls._schema_drill_read = _schema_drill_read = AAZObjectType() + + drill_read = _schema_drill_read + drill_read.id = AAZStrType( + flags={"read_only": True}, + ) + drill_read.identity = AAZIdentityObjectType() + drill_read.name = AAZStrType( + flags={"read_only": True}, + ) + drill_read.properties = AAZObjectType() + drill_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + drill_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_drill_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_drill_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_drill_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_drill_read.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = _schema_drill_read.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = _schema_drill_read.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = _schema_drill_read.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = _schema_drill_read.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = _schema_drill_read.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = _schema_drill_read.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = _schema_drill_read.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = _schema_drill_read.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = _schema_drill_read.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = _schema_drill_read.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + cls._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = _schema_drill_read.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = _schema_drill_read.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = _schema_drill_read.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = _schema_drill_read.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = _schema_drill_read.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = _schema_drill_read.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = _schema_drill_read.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = _schema_drill_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_validate_for_execution.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_validate_for_execution.py new file mode 100644 index 00000000000..b8ee73cabe6 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_validate_for_execution.py @@ -0,0 +1,571 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill validate-for-execution", +) +class ValidateForExecution(AAZCommand): + """This returns eligible resource to be faulted or failed over. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/validateforexecution", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.validate_for_execution_properties = AAZObjectArg( + options=["--validate-for-execution-properties"], + arg_group="Body", + help="Additional properties for Validate for execute.", + ) + + validate_for_execution_properties = cls._args_schema.validate_for_execution_properties + validate_for_execution_properties.operation_name = AAZStrArg( + options=["operation-name"], + help="Operation name for which the validation is being done. This is needed to determine the set of validations to be done for the operation.", + enum={"Failover": "Failover", "FailoverReverse": "FailoverReverse", "Reprotect": "Reprotect", "ReprotectReverse": "ReprotectReverse"}, + ) + validate_for_execution_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Physiscal Source locations from where resources to be failed-over or faulted.", + ) + + source_locations = cls._args_schema.validate_for_execution_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillsValidateForExecution(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillsValidateForExecution(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/validateForExecution", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("validateForExecutionProperties", AAZObjectType, ".validate_for_execution_properties") + + validate_for_execution_properties = _builder.get(".validateForExecutionProperties") + if validate_for_execution_properties is not None: + validate_for_execution_properties.set_prop("operationName", AAZStrType, ".operation_name") + validate_for_execution_properties.set_prop("sourceLocations", AAZListType, ".source_locations") + + source_locations = _builder.get(".validateForExecutionProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.drill_resource_qualifications = AAZListType( + serialized_name="drillResourceQualifications", + flags={"read_only": True}, + ) + + drill_resource_qualifications = cls._schema_on_200.drill_resource_qualifications + drill_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.drill_resource_qualifications.Element + _element.drills_qualified_resource = AAZObjectType( + serialized_name="drillsQualifiedResource", + flags={"read_only": True}, + ) + _element.resource_qualification_details = AAZObjectType( + serialized_name="resourceQualificationDetails", + flags={"read_only": True}, + ) + + drills_qualified_resource = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource + drills_qualified_resource.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + drills_qualified_resource.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + drills_qualified_resource.drill_inclusion_state = AAZStrType( + serialized_name="drillInclusionState", + flags={"read_only": True}, + ) + drills_qualified_resource.drill_resource_id = AAZStrType( + serialized_name="drillResourceId", + flags={"read_only": True}, + ) + drills_qualified_resource.fault_properties = AAZObjectType( + serialized_name="faultProperties", + flags={"read_only": True}, + ) + drills_qualified_resource.fault_state = AAZStrType( + serialized_name="faultState", + flags={"read_only": True}, + ) + drills_qualified_resource.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + drills_qualified_resource.recovery_inclusion_state = AAZStrType( + serialized_name="recoveryInclusionState", + flags={"read_only": True}, + ) + drills_qualified_resource.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + drills_qualified_resource.recovery_physical_zones = AAZListType( + serialized_name="recoveryPhysicalZones", + flags={"read_only": True}, + ) + drills_qualified_resource.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + drills_qualified_resource.resource_protection_solution_display_name = AAZStrType( + serialized_name="resourceProtectionSolutionDisplayName", + flags={"read_only": True}, + ) + drills_qualified_resource.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + drills_qualified_resource.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + flags={"read_only": True}, + ) + drills_qualified_resource.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.active_physical_zones + active_physical_zones.Element = AAZStrType() + + fault_properties = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.fault_properties + fault_properties.available_faults = AAZListType( + serialized_name="availableFaults", + flags={"read_only": True}, + ) + fault_properties.custom_fault = AAZObjectType( + serialized_name="customFault", + ) + fault_properties.default_fault = AAZObjectType( + serialized_name="defaultFault", + flags={"read_only": True}, + ) + _ValidateForExecutionHelper._build_schema_fault_details_read(fault_properties.default_fault) + fault_properties.overridden_default_fault = AAZObjectType( + serialized_name="overriddenDefaultFault", + ) + _ValidateForExecutionHelper._build_schema_fault_details_read(fault_properties.overridden_default_fault) + + available_faults = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.fault_properties.available_faults + available_faults.Element = AAZObjectType() + _ValidateForExecutionHelper._build_schema_fault_details_read(available_faults.Element) + + custom_fault = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.fault_properties.custom_fault + custom_fault.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + custom_fault.script_resource_id = AAZStrType( + serialized_name="scriptResourceId", + flags={"required": True}, + ) + + recovery_locations = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.recovery_locations + recovery_locations.Element = AAZStrType() + + recovery_physical_zones = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.recovery_physical_zones + recovery_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.drill_resource_qualifications.Element.drills_qualified_resource.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForExecutionHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForExecutionHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForExecutionHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForExecutionHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForExecutionHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + resource_qualification_details = cls._schema_on_200.drill_resource_qualifications.Element.resource_qualification_details + resource_qualification_details.drill_qualification_state = AAZStrType( + serialized_name="drillQualificationState", + flags={"read_only": True}, + ) + resource_qualification_details.drills_not_qualified_reasons = AAZListType( + serialized_name="drillsNotQualifiedReasons", + flags={"read_only": True}, + ) + resource_qualification_details.recovery_not_qualified_reasons = AAZListType( + serialized_name="recoveryNotQualifiedReasons", + flags={"read_only": True}, + ) + resource_qualification_details.recovery_qualification_state = AAZStrType( + serialized_name="recoveryQualificationState", + flags={"read_only": True}, + ) + + drills_not_qualified_reasons = cls._schema_on_200.drill_resource_qualifications.Element.resource_qualification_details.drills_not_qualified_reasons + drills_not_qualified_reasons.Element = AAZStrType() + + recovery_not_qualified_reasons = cls._schema_on_200.drill_resource_qualifications.Element.resource_qualification_details.recovery_not_qualified_reasons + recovery_not_qualified_reasons.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ValidateForExecutionHelper: + """Helper class for ValidateForExecution""" + + _schema_fault_details_read = None + + @classmethod + def _build_schema_fault_details_read(cls, _schema): + if cls._schema_fault_details_read is not None: + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + return + + cls._schema_fault_details_read = _schema_fault_details_read = AAZObjectType() + + fault_details_read = _schema_fault_details_read + fault_details_read.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + fault_details_read.fault_urn = AAZStrType( + serialized_name="faultUrn", + flags={"required": True}, + ) + fault_details_read.target_resource_id = AAZStrType( + serialized_name="targetResourceId", + flags={"required": True}, + ) + + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + +__all__ = ["ValidateForExecution"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_wait.py new file mode 100644 index 00000000000..e35afc21610 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/_wait.py @@ -0,0 +1,658 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = cls._schema_on_200.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = cls._schema_on_200.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = cls._schema_on_200.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = cls._schema_on_200.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = cls._schema_on_200.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = cls._schema_on_200.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = cls._schema_on_200.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = cls._schema_on_200.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + _WaitHelper._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _WaitHelper._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = cls._schema_on_200.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = cls._schema_on_200.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _WaitHelper._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = cls._schema_on_200.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = cls._schema_on_200.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + _WaitHelper._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = cls._schema_on_200.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _WaitHelper._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = cls._schema_on_200.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + _WaitHelper._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = cls._schema_on_200.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = cls._schema_on_200.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = cls._schema_on_200.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = cls._schema_on_200.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__cmd_group.py new file mode 100644 index 00000000000..15c2c67fa74 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience drill drill-resource", +) +class __CMDGroup(AAZCommandGroup): + """Manage Drill Resource + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_list.py new file mode 100644 index 00000000000..d35e724a1d9 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_list.py @@ -0,0 +1,437 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-resource list", +) +class List(AAZCommand): + """List DrillResource resources by Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillResourcesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class DrillResourcesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillResources", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + properties.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + properties.advisor_ha_recommendation_id = AAZStrType( + serialized_name="advisorHaRecommendationId", + flags={"read_only": True}, + ) + properties.advisor_recommendation_type_id = AAZStrType( + serialized_name="advisorRecommendationTypeId", + flags={"read_only": True}, + ) + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.fault_properties = AAZObjectType( + serialized_name="faultProperties", + flags={"read_only": True}, + ) + properties.fault_state = AAZStrType( + serialized_name="faultState", + flags={"read_only": True}, + ) + properties.force_inclusion_state = AAZStrType( + serialized_name="forceInclusionState", + flags={"read_only": True}, + ) + properties.ha_status = AAZStrType( + serialized_name="haStatus", + flags={"read_only": True}, + ) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.monitoring_rbac_assignment_error = AAZObjectType( + serialized_name="monitoringRbacAssignmentError", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_details_read(properties.monitoring_rbac_assignment_error) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_assignment_error = AAZObjectType( + serialized_name="rbacAssignmentError", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_details_read(properties.rbac_assignment_error) + properties.readiness_state = AAZStrType( + serialized_name="readinessState", + flags={"read_only": True}, + ) + properties.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + properties.recovery_physical_zones = AAZListType( + serialized_name="recoveryPhysicalZones", + flags={"read_only": True}, + ) + properties.recovery_plan_exclusion_reason = AAZStrType( + serialized_name="recoveryPlanExclusionReason", + flags={"read_only": True}, + ) + properties.recovery_plan_inclusion_state = AAZStrType( + serialized_name="recoveryPlanInclusionState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + properties.resource_protection_solution_type = AAZStrType( + serialized_name="resourceProtectionSolutionType", + flags={"read_only": True}, + ) + properties.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + + active_locations = cls._schema_on_200.value.Element.properties.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.value.Element.properties.active_physical_zones + active_physical_zones.Element = AAZStrType() + + attention_reason = cls._schema_on_200.value.Element.properties.attention_reason + attention_reason.fault_rbac_on_target_resource = AAZStrType( + serialized_name="faultRbacOnTargetResource", + ) + attention_reason.monitoring_rbac_on_targets = AAZStrType( + serialized_name="monitoringRbacOnTargets", + ) + attention_reason.resource_state = AAZListType( + serialized_name="resourceState", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + + resource_state = cls._schema_on_200.value.Element.properties.attention_reason.resource_state + resource_state.Element = AAZStrType() + + fault_properties = cls._schema_on_200.value.Element.properties.fault_properties + fault_properties.available_faults = AAZListType( + serialized_name="availableFaults", + flags={"read_only": True}, + ) + fault_properties.custom_fault = AAZObjectType( + serialized_name="customFault", + ) + fault_properties.default_fault = AAZObjectType( + serialized_name="defaultFault", + flags={"read_only": True}, + ) + _ListHelper._build_schema_fault_details_read(fault_properties.default_fault) + fault_properties.overridden_default_fault = AAZObjectType( + serialized_name="overriddenDefaultFault", + ) + _ListHelper._build_schema_fault_details_read(fault_properties.overridden_default_fault) + + available_faults = cls._schema_on_200.value.Element.properties.fault_properties.available_faults + available_faults.Element = AAZObjectType() + _ListHelper._build_schema_fault_details_read(available_faults.Element) + + custom_fault = cls._schema_on_200.value.Element.properties.fault_properties.custom_fault + custom_fault.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + custom_fault.script_resource_id = AAZStrType( + serialized_name="scriptResourceId", + flags={"required": True}, + ) + + recovery_locations = cls._schema_on_200.value.Element.properties.recovery_locations + recovery_locations.Element = AAZStrType() + + recovery_physical_zones = cls._schema_on_200.value.Element.properties.recovery_physical_zones + recovery_physical_zones.Element = AAZStrType() + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_details_read = None + + @classmethod + def _build_schema_error_details_read(cls, _schema): + if cls._schema_error_details_read is not None: + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + return + + cls._schema_error_details_read = _schema_error_details_read = AAZObjectType( + flags={"read_only": True} + ) + + error_details_read = _schema_error_details_read + error_details_read.code = AAZStrType( + flags={"required": True}, + ) + error_details_read.message = AAZStrType( + flags={"required": True}, + ) + error_details_read.recommendations = AAZListType() + + recommendations = _schema_error_details_read.recommendations + recommendations.Element = AAZStrType() + + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + + _schema_fault_details_read = None + + @classmethod + def _build_schema_fault_details_read(cls, _schema): + if cls._schema_fault_details_read is not None: + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + return + + cls._schema_fault_details_read = _schema_fault_details_read = AAZObjectType() + + fault_details_read = _schema_fault_details_read + fault_details_read.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + fault_details_read.fault_urn = AAZStrType( + serialized_name="faultUrn", + flags={"required": True}, + ) + fault_details_read.target_resource_id = AAZStrType( + serialized_name="targetResourceId", + flags={"required": True}, + ) + + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_show.py new file mode 100644 index 00000000000..9bf01837566 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_resource/_show.py @@ -0,0 +1,418 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-resource show", +) +class Show(AAZCommand): + """Get a DrillResource + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillresources/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_resource_name = AAZStrArg( + options=["--drill-resource-name"], + help="The name of the DrillResource (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillResourcesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillResourcesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillResources/{drillResourceName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillResourceName", self.ctx.args.drill_resource_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + properties.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + properties.advisor_ha_recommendation_id = AAZStrType( + serialized_name="advisorHaRecommendationId", + flags={"read_only": True}, + ) + properties.advisor_recommendation_type_id = AAZStrType( + serialized_name="advisorRecommendationTypeId", + flags={"read_only": True}, + ) + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.fault_properties = AAZObjectType( + serialized_name="faultProperties", + flags={"read_only": True}, + ) + properties.fault_state = AAZStrType( + serialized_name="faultState", + flags={"read_only": True}, + ) + properties.force_inclusion_state = AAZStrType( + serialized_name="forceInclusionState", + flags={"read_only": True}, + ) + properties.ha_status = AAZStrType( + serialized_name="haStatus", + flags={"read_only": True}, + ) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.monitoring_rbac_assignment_error = AAZObjectType( + serialized_name="monitoringRbacAssignmentError", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_details_read(properties.monitoring_rbac_assignment_error) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_assignment_error = AAZObjectType( + serialized_name="rbacAssignmentError", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_details_read(properties.rbac_assignment_error) + properties.readiness_state = AAZStrType( + serialized_name="readinessState", + flags={"read_only": True}, + ) + properties.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + properties.recovery_physical_zones = AAZListType( + serialized_name="recoveryPhysicalZones", + flags={"read_only": True}, + ) + properties.recovery_plan_exclusion_reason = AAZStrType( + serialized_name="recoveryPlanExclusionReason", + flags={"read_only": True}, + ) + properties.recovery_plan_inclusion_state = AAZStrType( + serialized_name="recoveryPlanInclusionState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + properties.resource_protection_solution_type = AAZStrType( + serialized_name="resourceProtectionSolutionType", + flags={"read_only": True}, + ) + properties.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + + active_locations = cls._schema_on_200.properties.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.properties.active_physical_zones + active_physical_zones.Element = AAZStrType() + + attention_reason = cls._schema_on_200.properties.attention_reason + attention_reason.fault_rbac_on_target_resource = AAZStrType( + serialized_name="faultRbacOnTargetResource", + ) + attention_reason.monitoring_rbac_on_targets = AAZStrType( + serialized_name="monitoringRbacOnTargets", + ) + attention_reason.resource_state = AAZListType( + serialized_name="resourceState", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + + resource_state = cls._schema_on_200.properties.attention_reason.resource_state + resource_state.Element = AAZStrType() + + fault_properties = cls._schema_on_200.properties.fault_properties + fault_properties.available_faults = AAZListType( + serialized_name="availableFaults", + flags={"read_only": True}, + ) + fault_properties.custom_fault = AAZObjectType( + serialized_name="customFault", + ) + fault_properties.default_fault = AAZObjectType( + serialized_name="defaultFault", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_fault_details_read(fault_properties.default_fault) + fault_properties.overridden_default_fault = AAZObjectType( + serialized_name="overriddenDefaultFault", + ) + _ShowHelper._build_schema_fault_details_read(fault_properties.overridden_default_fault) + + available_faults = cls._schema_on_200.properties.fault_properties.available_faults + available_faults.Element = AAZObjectType() + _ShowHelper._build_schema_fault_details_read(available_faults.Element) + + custom_fault = cls._schema_on_200.properties.fault_properties.custom_fault + custom_fault.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + custom_fault.script_resource_id = AAZStrType( + serialized_name="scriptResourceId", + flags={"required": True}, + ) + + recovery_locations = cls._schema_on_200.properties.recovery_locations + recovery_locations.Element = AAZStrType() + + recovery_physical_zones = cls._schema_on_200.properties.recovery_physical_zones + recovery_physical_zones.Element = AAZStrType() + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_details_read = None + + @classmethod + def _build_schema_error_details_read(cls, _schema): + if cls._schema_error_details_read is not None: + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + return + + cls._schema_error_details_read = _schema_error_details_read = AAZObjectType( + flags={"read_only": True} + ) + + error_details_read = _schema_error_details_read + error_details_read.code = AAZStrType( + flags={"required": True}, + ) + error_details_read.message = AAZStrType( + flags={"required": True}, + ) + error_details_read.recommendations = AAZListType() + + recommendations = _schema_error_details_read.recommendations + recommendations.Element = AAZStrType() + + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + + _schema_fault_details_read = None + + @classmethod + def _build_schema_fault_details_read(cls, _schema): + if cls._schema_fault_details_read is not None: + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + return + + cls._schema_fault_details_read = _schema_fault_details_read = AAZObjectType() + + fault_details_read = _schema_fault_details_read + fault_details_read.fault_name = AAZStrType( + serialized_name="faultName", + flags={"required": True}, + ) + fault_details_read.fault_urn = AAZStrType( + serialized_name="faultUrn", + flags={"required": True}, + ) + fault_details_read.target_resource_id = AAZStrType( + serialized_name="targetResourceId", + flags={"required": True}, + ) + + _schema.fault_name = cls._schema_fault_details_read.fault_name + _schema.fault_urn = cls._schema_fault_details_read.fault_urn + _schema.target_resource_id = cls._schema_fault_details_read.target_resource_id + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__cmd_group.py new file mode 100644 index 00000000000..19e02b040c7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience drill drill-run", +) +class __CMDGroup(AAZCommandGroup): + """Manage Drill Run + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__init__.py new file mode 100644 index 00000000000..58d2e5f5a5a --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/__init__.py @@ -0,0 +1,20 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._add_note import * +from ._fail_over import * +from ._generate_report import * +from ._list import * +from ._list_report_download_url import * +from ._mark_as_complete import * +from ._reprotect import * +from ._resume import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_add_note.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_add_note.py new file mode 100644 index 00000000000..b65d1d32bd7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_add_note.py @@ -0,0 +1,229 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run add-note", +) +class AddNote(AAZCommand): + """This enables the user to add notes on this Drill Run. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/addnotes", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.notes = AAZStrArg( + options=["--notes"], + arg_group="Body", + help="The notes string.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsAddNotes(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsAddNotes(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/addNotes", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("notes", AAZStrType, ".notes") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _AddNoteHelper: + """Helper class for AddNote""" + + +__all__ = ["AddNote"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_fail_over.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_fail_over.py new file mode 100644 index 00000000000..60cc3db9433 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_fail_over.py @@ -0,0 +1,300 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run fail-over", +) +class FailOver(AAZCommand): + """This initiates a new Failover operation on this Drill Run. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/failover", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.auto_failover = AAZStrArg( + options=["--auto-failover"], + arg_group="Body", + help="AutoFailover - whether to pause between Fault and Failover for manual input.", + enum={"Disable": "Disable", "Enable": "Enable"}, + ) + _args_schema.failover_properties = AAZObjectArg( + options=["--failover-properties"], + arg_group="Body", + help="The failover properties.", + ) + + failover_properties = cls._args_schema.failover_properties + failover_properties.failover_direction = AAZStrArg( + options=["failover-direction"], + help="Type of Failover direction.", + required=True, + enum={"FromSpecificLocations": "FromSpecificLocations"}, + ) + failover_properties.failover_request_properties = AAZObjectArg( + options=["failover-request-properties"], + help="Additional properties for Failover.", + ) + + failover_request_properties = cls._args_schema.failover_properties.failover_request_properties + failover_request_properties.execution_configurations = AAZObjectArg( + options=["execution-configurations"], + help="Execution configurations for the recovery action.", + ) + failover_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources based on the source location(s) will be processed.", + ) + failover_request_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Source locations from where resources to be failed-over.", + required=True, + ) + + execution_configurations = cls._args_schema.failover_properties.failover_request_properties.execution_configurations + execution_configurations.user_consent = AAZStrArg( + options=["user-consent"], + help="User consent for performing recovery action.", + required=True, + enum={"Allowed": "Allowed", "Unspecified": "Unspecified"}, + ) + + selected_resource_ids = cls._args_schema.failover_properties.failover_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + + source_locations = cls._args_schema.failover_properties.failover_request_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsFailOver(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsFailOver(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/failOver", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"client_flatten": True}} + ) + _builder.set_prop("autoFailover", AAZStrType, ".auto_failover", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("failoverProperties", AAZObjectType, ".failover_properties", typ_kwargs={"flags": {"required": True}}) + + failover_properties = _builder.get(".failoverProperties") + if failover_properties is not None: + failover_properties.set_prop("failoverDirection", AAZStrType, ".failover_direction", typ_kwargs={"flags": {"required": True}}) + failover_properties.set_prop("failoverRequestProperties", AAZObjectType, ".failover_request_properties") + + failover_request_properties = _builder.get(".failoverProperties.failoverRequestProperties") + if failover_request_properties is not None: + failover_request_properties.set_prop("executionConfigurations", AAZObjectType, ".execution_configurations") + failover_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + failover_request_properties.set_prop("sourceLocations", AAZListType, ".source_locations", typ_kwargs={"flags": {"required": True}}) + + execution_configurations = _builder.get(".failoverProperties.failoverRequestProperties.executionConfigurations") + if execution_configurations is not None: + execution_configurations.set_prop("userConsent", AAZStrType, ".user_consent", typ_kwargs={"flags": {"required": True}}) + + selected_resource_ids = _builder.get(".failoverProperties.failoverRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + source_locations = _builder.get(".failoverProperties.failoverRequestProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _FailOverHelper: + """Helper class for FailOver""" + + +__all__ = ["FailOver"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_generate_report.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_generate_report.py new file mode 100644 index 00000000000..473464770a9 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_generate_report.py @@ -0,0 +1,286 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run generate-report", +) +class GenerateReport(AAZCommand): + """This generates, or regenerates, the report for this Drill Run. The action is idempotent and is safe to call at any time: a call that arrives while a generation is already running joins it, and a call made after a failed attempt retries it. A report that has been finalized is never regenerated. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/generatereport", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsGenerateReport(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsGenerateReport(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/generateReport", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.available_formats = AAZListType( + serialized_name="availableFormats", + flags={"read_only": True}, + ) + _schema_on_200.finalization_state = AAZStrType( + serialized_name="finalizationState", + flags={"read_only": True}, + ) + _schema_on_200.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + _schema_on_200.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _GenerateReportHelper._build_schema_error_details_read(_schema_on_200.last_error) + _schema_on_200.last_generated_timestamp = AAZStrType( + serialized_name="lastGeneratedTimestamp", + flags={"read_only": True}, + ) + _schema_on_200.schema_version = AAZStrType( + serialized_name="schemaVersion", + flags={"read_only": True}, + ) + _schema_on_200.stage_statuses = AAZListType( + serialized_name="stageStatuses", + flags={"read_only": True}, + ) + + available_formats = cls._schema_on_200.available_formats + available_formats.Element = AAZStrType() + + stage_statuses = cls._schema_on_200.stage_statuses + stage_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.stage_statuses.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + _element.last_attempt_timestamp = AAZStrType( + serialized_name="lastAttemptTimestamp", + flags={"read_only": True}, + ) + _element.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _GenerateReportHelper._build_schema_error_details_read(_element.last_error) + + return cls._schema_on_200 + + +class _GenerateReportHelper: + """Helper class for GenerateReport""" + + _schema_error_details_read = None + + @classmethod + def _build_schema_error_details_read(cls, _schema): + if cls._schema_error_details_read is not None: + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + return + + cls._schema_error_details_read = _schema_error_details_read = AAZObjectType( + flags={"read_only": True} + ) + + error_details_read = _schema_error_details_read + error_details_read.code = AAZStrType( + flags={"required": True}, + ) + error_details_read.message = AAZStrType( + flags={"required": True}, + ) + error_details_read.recommendations = AAZListType() + + recommendations = _schema_error_details_read.recommendations + recommendations.Element = AAZStrType() + + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + + +__all__ = ["GenerateReport"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list.py new file mode 100644 index 00000000000..df54f5c0a56 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list.py @@ -0,0 +1,626 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run list", +) +class List(AAZCommand): + """List DrillRun resources by Drill + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillRunsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class DrillRunsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.attestation = AAZStrType( + flags={"read_only": True}, + ) + properties.current_active_operation_id = AAZStrType( + serialized_name="currentActiveOperationId", + flags={"read_only": True}, + ) + properties.drill_id = AAZStrType( + serialized_name="drillId", + flags={"read_only": True}, + ) + properties.drill_mode = AAZStrType( + serialized_name="drillMode", + flags={"read_only": True}, + ) + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ListHelper._build_schema_job_error_info_read(properties.error_details) + properties.execution_configurations = AAZObjectType( + serialized_name="executionConfigurations", + flags={"read_only": True}, + ) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_type = AAZStrType( + serialized_name="jobType", + flags={"read_only": True}, + ) + properties.notes = AAZListType( + flags={"read_only": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.report = AAZObjectType( + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.supported_verbs_for_stage = AAZListType( + serialized_name="supportedVerbsForStage", + flags={"read_only": True}, + ) + properties.triggered_by = AAZStrType( + serialized_name="triggeredBy", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + execution_configurations = cls._schema_on_200.value.Element.properties.execution_configurations + execution_configurations.user_consent = AAZStrType( + serialized_name="userConsent", + flags={"required": True}, + ) + + job_extended_info = cls._schema_on_200.value.Element.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.value.Element.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ListHelper._build_schema_job_task_detail_read(tasks_list.Element) + + notes = cls._schema_on_200.value.Element.properties.notes + notes.Element = AAZStrType() + + report = cls._schema_on_200.value.Element.properties.report + report.available_formats = AAZListType( + serialized_name="availableFormats", + flags={"read_only": True}, + ) + report.finalization_state = AAZStrType( + serialized_name="finalizationState", + flags={"read_only": True}, + ) + report.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + report.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_details_read(report.last_error) + report.last_generated_timestamp = AAZStrType( + serialized_name="lastGeneratedTimestamp", + flags={"read_only": True}, + ) + report.schema_version = AAZStrType( + serialized_name="schemaVersion", + flags={"read_only": True}, + ) + report.stage_statuses = AAZListType( + serialized_name="stageStatuses", + flags={"read_only": True}, + ) + + available_formats = cls._schema_on_200.value.Element.properties.report.available_formats + available_formats.Element = AAZStrType() + + stage_statuses = cls._schema_on_200.value.Element.properties.report.stage_statuses + stage_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.report.stage_statuses.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + _element.last_attempt_timestamp = AAZStrType( + serialized_name="lastAttemptTimestamp", + flags={"read_only": True}, + ) + _element.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_details_read(_element.last_error) + + retry_details = cls._schema_on_200.value.Element.properties.retry_details + retry_details.Element = AAZObjectType() + _ListHelper._build_schema_job_retry_details_read(retry_details.Element) + + supported_verbs_for_stage = cls._schema_on_200.value.Element.properties.supported_verbs_for_stage + supported_verbs_for_stage.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.supported_verbs_for_stage.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.supported_verbs = AAZListType( + serialized_name="supportedVerbs", + flags={"required": True}, + ) + + supported_verbs = cls._schema_on_200.value.Element.properties.supported_verbs_for_stage.Element.supported_verbs + supported_verbs.Element = AAZStrType() + + user_comments = cls._schema_on_200.value.Element.properties.user_comments + user_comments.Element = AAZObjectType() + _ListHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_details_read = None + + @classmethod + def _build_schema_error_details_read(cls, _schema): + if cls._schema_error_details_read is not None: + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + return + + cls._schema_error_details_read = _schema_error_details_read = AAZObjectType( + flags={"read_only": True} + ) + + error_details_read = _schema_error_details_read + error_details_read.code = AAZStrType( + flags={"required": True}, + ) + error_details_read.message = AAZStrType( + flags={"required": True}, + ) + error_details_read.recommendations = AAZListType() + + recommendations = _schema_error_details_read.recommendations + recommendations.Element = AAZStrType() + + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list_report_download_url.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list_report_download_url.py new file mode 100644 index 00000000000..ef0c9e1598e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_list_report_download_url.py @@ -0,0 +1,237 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run list-report-download-url", +) +class ListReportDownloadUrl(AAZCommand): + """This returns a short-lived, read-only URL to download the report for this Drill Run. The URL expires at the returned expiryTimestamp and grants access to that single report only. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/listreportdownloadurl", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.format = AAZStrArg( + options=["--format"], + arg_group="Body", + help="Format of the report to download. Defaults to Html when not specified.", + enum={"Html": "Html"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsListReportDownloadUrl(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsListReportDownloadUrl(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/listReportDownloadUrl", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("format", AAZStrType, ".format") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.download_url = AAZStrType( + serialized_name="downloadUrl", + flags={"read_only": True}, + ) + _schema_on_200.expiry_timestamp = AAZStrType( + serialized_name="expiryTimestamp", + flags={"read_only": True}, + ) + _schema_on_200.format = AAZStrType( + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _ListReportDownloadUrlHelper: + """Helper class for ListReportDownloadUrl""" + + +__all__ = ["ListReportDownloadUrl"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_mark_as_complete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_mark_as_complete.py new file mode 100644 index 00000000000..d5f28479c3e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_mark_as_complete.py @@ -0,0 +1,247 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run mark-as-complete", +) +class MarkAsComplete(AAZCommand): + """This enables the user to mark this stage as complete, disabling further retries on it. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/markascomplete", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.drill_run_stage = AAZStrArg( + options=["--drill-run-stage"], + arg_group="Body", + help="State of the Drill Run.", + required=True, + enum={"Failover": "Failover", "FailoverReverse": "FailoverReverse", "FaultInjection": "FaultInjection", "Reprotect": "Reprotect", "ReprotectReverse": "ReprotectReverse"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsMarkAsComplete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsMarkAsComplete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/markAsComplete", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("drillRunStage", AAZStrType, ".drill_run_stage", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.supported_verbs_for_stage = AAZListType( + serialized_name="supportedVerbsForStage", + flags={"read_only": True}, + ) + + supported_verbs_for_stage = cls._schema_on_200.supported_verbs_for_stage + supported_verbs_for_stage.Element = AAZObjectType() + + _element = cls._schema_on_200.supported_verbs_for_stage.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.supported_verbs = AAZListType( + serialized_name="supportedVerbs", + flags={"required": True}, + ) + + supported_verbs = cls._schema_on_200.supported_verbs_for_stage.Element.supported_verbs + supported_verbs.Element = AAZStrType() + + return cls._schema_on_200 + + +class _MarkAsCompleteHelper: + """Helper class for MarkAsComplete""" + + +__all__ = ["MarkAsComplete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_reprotect.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_reprotect.py new file mode 100644 index 00000000000..5e239e00ab4 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_reprotect.py @@ -0,0 +1,256 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run reprotect", +) +class Reprotect(AAZCommand): + """This initiates a new Reprotect operation on this Drill Run. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/reprotect", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.reprotect_properties = AAZObjectArg( + options=["--reprotect-properties"], + arg_group="Body", + help="The reprotect properties.", + ) + + reprotect_properties = cls._args_schema.reprotect_properties + reprotect_properties.reprotect_request_properties = AAZObjectArg( + options=["reprotect-request-properties"], + help="Additional properties for Reprotect.", + ) + + reprotect_request_properties = cls._args_schema.reprotect_properties.reprotect_request_properties + reprotect_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources will be processed.", + ) + + selected_resource_ids = cls._args_schema.reprotect_properties.reprotect_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsReprotect(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsReprotect(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/reprotect", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"client_flatten": True}} + ) + _builder.set_prop("reprotectProperties", AAZObjectType, ".reprotect_properties", typ_kwargs={"flags": {"required": True}}) + + reprotect_properties = _builder.get(".reprotectProperties") + if reprotect_properties is not None: + reprotect_properties.set_prop("reprotectRequestProperties", AAZObjectType, ".reprotect_request_properties") + + reprotect_request_properties = _builder.get(".reprotectProperties.reprotectRequestProperties") + if reprotect_request_properties is not None: + reprotect_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + + selected_resource_ids = _builder.get(".reprotectProperties.reprotectRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _ReprotectHelper: + """Helper class for Reprotect""" + + +__all__ = ["Reprotect"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_resume.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_resume.py new file mode 100644 index 00000000000..57382b56d80 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_resume.py @@ -0,0 +1,206 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run resume", +) +class Resume(AAZCommand): + """This unblocks a Failover workflow that is paused after the Fault stage, to proceed to the Failover stage. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/resume", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.DrillRunsResume(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsResume(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/resume", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + + return cls._schema_on_200 + + +class _ResumeHelper: + """Helper class for Resume""" + + +__all__ = ["Resume"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_show.py new file mode 100644 index 00000000000..ba7d9f6012e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/_show.py @@ -0,0 +1,625 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run show", +) +class Show(AAZCommand): + """Get a DrillRun + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillRunsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.attestation = AAZStrType( + flags={"read_only": True}, + ) + properties.current_active_operation_id = AAZStrType( + serialized_name="currentActiveOperationId", + flags={"read_only": True}, + ) + properties.drill_id = AAZStrType( + serialized_name="drillId", + flags={"read_only": True}, + ) + properties.drill_mode = AAZStrType( + serialized_name="drillMode", + flags={"read_only": True}, + ) + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ShowHelper._build_schema_job_error_info_read(properties.error_details) + properties.execution_configurations = AAZObjectType( + serialized_name="executionConfigurations", + flags={"read_only": True}, + ) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_type = AAZStrType( + serialized_name="jobType", + flags={"read_only": True}, + ) + properties.notes = AAZListType( + flags={"read_only": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.report = AAZObjectType( + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.supported_verbs_for_stage = AAZListType( + serialized_name="supportedVerbsForStage", + flags={"read_only": True}, + ) + properties.triggered_by = AAZStrType( + serialized_name="triggeredBy", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + execution_configurations = cls._schema_on_200.properties.execution_configurations + execution_configurations.user_consent = AAZStrType( + serialized_name="userConsent", + flags={"required": True}, + ) + + job_extended_info = cls._schema_on_200.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ShowHelper._build_schema_job_task_detail_read(tasks_list.Element) + + notes = cls._schema_on_200.properties.notes + notes.Element = AAZStrType() + + report = cls._schema_on_200.properties.report + report.available_formats = AAZListType( + serialized_name="availableFormats", + flags={"read_only": True}, + ) + report.finalization_state = AAZStrType( + serialized_name="finalizationState", + flags={"read_only": True}, + ) + report.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + report.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_details_read(report.last_error) + report.last_generated_timestamp = AAZStrType( + serialized_name="lastGeneratedTimestamp", + flags={"read_only": True}, + ) + report.schema_version = AAZStrType( + serialized_name="schemaVersion", + flags={"read_only": True}, + ) + report.stage_statuses = AAZListType( + serialized_name="stageStatuses", + flags={"read_only": True}, + ) + + available_formats = cls._schema_on_200.properties.report.available_formats + available_formats.Element = AAZStrType() + + stage_statuses = cls._schema_on_200.properties.report.stage_statuses + stage_statuses.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.report.stage_statuses.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.generation_status = AAZStrType( + serialized_name="generationStatus", + flags={"read_only": True}, + ) + _element.last_attempt_timestamp = AAZStrType( + serialized_name="lastAttemptTimestamp", + flags={"read_only": True}, + ) + _element.last_error = AAZObjectType( + serialized_name="lastError", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_details_read(_element.last_error) + + retry_details = cls._schema_on_200.properties.retry_details + retry_details.Element = AAZObjectType() + _ShowHelper._build_schema_job_retry_details_read(retry_details.Element) + + supported_verbs_for_stage = cls._schema_on_200.properties.supported_verbs_for_stage + supported_verbs_for_stage.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.supported_verbs_for_stage.Element + _element.drill_run_stage = AAZStrType( + serialized_name="drillRunStage", + flags={"required": True}, + ) + _element.supported_verbs = AAZListType( + serialized_name="supportedVerbs", + flags={"required": True}, + ) + + supported_verbs = cls._schema_on_200.properties.supported_verbs_for_stage.Element.supported_verbs + supported_verbs.Element = AAZStrType() + + user_comments = cls._schema_on_200.properties.user_comments + user_comments.Element = AAZObjectType() + _ShowHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_details_read = None + + @classmethod + def _build_schema_error_details_read(cls, _schema): + if cls._schema_error_details_read is not None: + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + return + + cls._schema_error_details_read = _schema_error_details_read = AAZObjectType( + flags={"read_only": True} + ) + + error_details_read = _schema_error_details_read + error_details_read.code = AAZStrType( + flags={"required": True}, + ) + error_details_read.message = AAZStrType( + flags={"required": True}, + ) + error_details_read.recommendations = AAZListType() + + recommendations = _schema_error_details_read.recommendations + recommendations.Element = AAZStrType() + + _schema.code = cls._schema_error_details_read.code + _schema.message = cls._schema_error_details_read.message + _schema.recommendations = cls._schema_error_details_read.recommendations + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__cmd_group.py new file mode 100644 index 00000000000..17fe1a45ac5 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience drill drill-run drill-run-resource", +) +class __CMDGroup(AAZCommandGroup): + """Manage Drill Run Resource + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_list.py new file mode 100644 index 00000000000..87cfd94446d --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_list.py @@ -0,0 +1,510 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run drill-run-resource list", +) +class List(AAZCommand): + """List DrillRunResource resources by DrillRun + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/drillrunresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillRunResourcesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class DrillRunResourcesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/drillRunResources", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ListHelper._build_schema_job_error_info_read(properties.error_details) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + properties.job_resource_type = AAZStrType( + serialized_name="jobResourceType", + flags={"required": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + properties.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + job_extended_info = cls._schema_on_200.value.Element.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.value.Element.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ListHelper._build_schema_job_task_detail_read(tasks_list.Element) + + retry_details = cls._schema_on_200.value.Element.properties.retry_details + retry_details.Element = AAZObjectType() + _ListHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.value.Element.properties.user_comments + user_comments.Element = AAZObjectType() + _ListHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_show.py new file mode 100644 index 00000000000..affd58388f2 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/drill_run/drill_run_resource/_show.py @@ -0,0 +1,509 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill drill-run drill-run-resource show", +) +class Show(AAZCommand): + """Get a DrillRunResource + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}/drillruns/{}/drillrunresources/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.drill_run_name = AAZStrArg( + options=["--drill-run-name"], + help="The name of the DrillRun (GUID).", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.drill_run_resource_name = AAZStrArg( + options=["--drill-run-resource-name"], + help="The unique name (GUID) of the recovery job resource.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillRunResourcesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class DrillRunResourcesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}/drillRuns/{drillRunName}/drillRunResources/{drillRunResourceName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "drillRunName", self.ctx.args.drill_run_name, + required=True, + ), + **self.serialize_url_param( + "drillRunResourceName", self.ctx.args.drill_run_resource_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ShowHelper._build_schema_job_error_info_read(properties.error_details) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + properties.job_resource_type = AAZStrType( + serialized_name="jobResourceType", + flags={"required": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + properties.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + job_extended_info = cls._schema_on_200.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ShowHelper._build_schema_job_task_detail_read(tasks_list.Element) + + retry_details = cls._schema_on_200.properties.retry_details + retry_details.Element = AAZObjectType() + _ShowHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.properties.user_comments + user_comments.Element = AAZObjectType() + _ShowHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__cmd_group.py new file mode 100644 index 00000000000..2f7f06593b5 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience drill identity", +) +class __CMDGroup(AAZCommandGroup): + """Manage Identity + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__init__.py new file mode 100644 index 00000000000..3a074471e35 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/__init__.py @@ -0,0 +1,15 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._assign import * +from ._remove import * +from ._show import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_assign.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_assign.py new file mode 100644 index 00000000000..33f9450f859 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_assign.py @@ -0,0 +1,853 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill identity assign", +) +class Assign(AAZCommand): + """Assign the user or system managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview", "identity"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Resource.identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Resource.identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Resource.identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.selectors.subresource.get()) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.post_instance_update(self.ctx.selectors.subresource.get()) + yield self.DrillsCreate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.get(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _AssignHelper._build_schema_drill_read(cls._schema_on_200) + + return cls._schema_on_200 + + class DrillsCreate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _AssignHelper._build_schema_drill_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.selectors.subresource.get()) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZIdentityObjectType + ) + _builder.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "assign"}}) + _builder.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "assign"}}) + + user_assigned = _builder.get(".userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + return _instance_value + + +class _AssignHelper: + """Helper class for Assign""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_drill_read = None + + @classmethod + def _build_schema_drill_read(cls, _schema): + if cls._schema_drill_read is not None: + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + return + + cls._schema_drill_read = _schema_drill_read = AAZObjectType() + + drill_read = _schema_drill_read + drill_read.id = AAZStrType( + flags={"read_only": True}, + ) + drill_read.identity = AAZIdentityObjectType() + drill_read.name = AAZStrType( + flags={"read_only": True}, + ) + drill_read.properties = AAZObjectType() + drill_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + drill_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_drill_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_drill_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_drill_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_drill_read.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = _schema_drill_read.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = _schema_drill_read.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = _schema_drill_read.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = _schema_drill_read.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = _schema_drill_read.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = _schema_drill_read.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = _schema_drill_read.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = _schema_drill_read.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = _schema_drill_read.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = _schema_drill_read.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + cls._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = _schema_drill_read.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = _schema_drill_read.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = _schema_drill_read.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = _schema_drill_read.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = _schema_drill_read.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = _schema_drill_read.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = _schema_drill_read.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = _schema_drill_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Assign"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_remove.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_remove.py new file mode 100644 index 00000000000..fe6468bb6fb --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_remove.py @@ -0,0 +1,853 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill identity remove", +) +class Remove(AAZCommand): + """Remove the user or system managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview", "identity"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Resource.identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Resource.identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Resource.identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.selectors.subresource.get()) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.post_instance_update(self.ctx.selectors.subresource.get()) + yield self.DrillsCreate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.get(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _RemoveHelper._build_schema_drill_read(cls._schema_on_200) + + return cls._schema_on_200 + + class DrillsCreate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _RemoveHelper._build_schema_drill_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.selectors.subresource.get()) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZIdentityObjectType + ) + _builder.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "remove"}}) + _builder.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "remove"}}) + + user_assigned = _builder.get(".userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + return _instance_value + + +class _RemoveHelper: + """Helper class for Remove""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_drill_read = None + + @classmethod + def _build_schema_drill_read(cls, _schema): + if cls._schema_drill_read is not None: + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + return + + cls._schema_drill_read = _schema_drill_read = AAZObjectType() + + drill_read = _schema_drill_read + drill_read.id = AAZStrType( + flags={"read_only": True}, + ) + drill_read.identity = AAZIdentityObjectType() + drill_read.name = AAZStrType( + flags={"read_only": True}, + ) + drill_read.properties = AAZObjectType() + drill_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + drill_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_drill_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_drill_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_drill_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_drill_read.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = _schema_drill_read.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = _schema_drill_read.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = _schema_drill_read.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = _schema_drill_read.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = _schema_drill_read.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = _schema_drill_read.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = _schema_drill_read.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = _schema_drill_read.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = _schema_drill_read.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = _schema_drill_read.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + cls._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = _schema_drill_read.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = _schema_drill_read.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = _schema_drill_read.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = _schema_drill_read.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = _schema_drill_read.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = _schema_drill_read.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = _schema_drill_read.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = _schema_drill_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Remove"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_show.py new file mode 100644 index 00000000000..889b00291fc --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_show.py @@ -0,0 +1,694 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill identity show", +) +class Show(AAZCommand): + """Show the details of managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview", "identity"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.required(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _ShowHelper._build_schema_drill_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_drill_read = None + + @classmethod + def _build_schema_drill_read(cls, _schema): + if cls._schema_drill_read is not None: + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + return + + cls._schema_drill_read = _schema_drill_read = AAZObjectType() + + drill_read = _schema_drill_read + drill_read.id = AAZStrType( + flags={"read_only": True}, + ) + drill_read.identity = AAZIdentityObjectType() + drill_read.name = AAZStrType( + flags={"read_only": True}, + ) + drill_read.properties = AAZObjectType() + drill_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + drill_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_drill_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_drill_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_drill_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_drill_read.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = _schema_drill_read.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = _schema_drill_read.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = _schema_drill_read.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = _schema_drill_read.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = _schema_drill_read.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = _schema_drill_read.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = _schema_drill_read.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = _schema_drill_read.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = _schema_drill_read.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = _schema_drill_read.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + cls._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = _schema_drill_read.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = _schema_drill_read.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = _schema_drill_read.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = _schema_drill_read.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = _schema_drill_read.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = _schema_drill_read.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = _schema_drill_read.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = _schema_drill_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_wait.py new file mode 100644 index 00000000000..6c0408af038 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/drill/identity/_wait.py @@ -0,0 +1,681 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience drill identity wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/drills/{}", "2026-08-31-preview", "identity"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.drill_name = AAZStrArg( + options=["--drill-name"], + help="The name of the Drill", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.DrillsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class DrillsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/drills/{drillName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "drillName", self.ctx.args.drill_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _WaitHelper._build_schema_drill_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_associated_identity_read = None + + @classmethod + def _build_schema_associated_identity_read(cls, _schema): + if cls._schema_associated_identity_read is not None: + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + return + + cls._schema_associated_identity_read = _schema_associated_identity_read = AAZObjectType() + + associated_identity_read = _schema_associated_identity_read + associated_identity_read.type = AAZStrType( + flags={"required": True}, + ) + associated_identity_read.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + _schema.type = cls._schema_associated_identity_read.type + _schema.user_assigned_identity = cls._schema_associated_identity_read.user_assigned_identity + + _schema_drill_read = None + + @classmethod + def _build_schema_drill_read(cls, _schema): + if cls._schema_drill_read is not None: + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + return + + cls._schema_drill_read = _schema_drill_read = AAZObjectType() + + drill_read = _schema_drill_read + drill_read.id = AAZStrType( + flags={"read_only": True}, + ) + drill_read.identity = AAZIdentityObjectType() + drill_read.name = AAZStrType( + flags={"read_only": True}, + ) + drill_read.properties = AAZObjectType() + drill_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + drill_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_drill_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_drill_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_drill_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_drill_read.properties + properties.attention_reason = AAZObjectType( + serialized_name="attentionReason", + flags={"read_only": True}, + ) + properties.chaos_resource_properties = AAZObjectType( + serialized_name="chaosResourceProperties", + ) + properties.drill_asset_properties = AAZObjectType( + serialized_name="drillAssetProperties", + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.execution_readiness_state = AAZStrType( + serialized_name="executionReadinessState", + flags={"read_only": True}, + ) + properties.execution_state = AAZStrType( + serialized_name="executionState", + flags={"read_only": True}, + ) + properties.health_model_monitoring_properties = AAZObjectType( + serialized_name="healthModelMonitoringProperties", + ) + properties.last_resync_readiness_check_time = AAZStrType( + serialized_name="lastResyncReadinessCheckTime", + flags={"read_only": True}, + ) + properties.last_run_properties = AAZObjectType( + serialized_name="lastRunProperties", + flags={"read_only": True}, + ) + properties.last_sync_time = AAZStrType( + serialized_name="lastSyncTime", + flags={"read_only": True}, + ) + properties.monitoring_properties = AAZObjectType( + serialized_name="monitoringProperties", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.rbac_setup_mode = AAZStrType( + serialized_name="rbacSetupMode", + ) + properties.recovery_plan_properties = AAZObjectType( + serialized_name="recoveryPlanProperties", + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"read_only": True}, + ) + properties.sli_monitoring_properties = AAZObjectType( + serialized_name="sliMonitoringProperties", + ) + properties.system_metadata = AAZObjectType( + serialized_name="systemMetadata", + flags={"read_only": True}, + ) + + attention_reason = _schema_drill_read.properties.attention_reason + attention_reason.chaos_resource = AAZStrType( + serialized_name="chaosResource", + ) + attention_reason.chaos_resource_creation_failure_reasons = AAZListType( + serialized_name="chaosResourceCreationFailureReasons", + ) + attention_reason.chaos_resource_user_msi = AAZStrType( + serialized_name="chaosResourceUserMsi", + ) + attention_reason.discovery_rule_exists = AAZStrType( + serialized_name="discoveryRuleExists", + ) + attention_reason.drill_monitoring_errors = AAZListType( + serialized_name="drillMonitoringErrors", + ) + attention_reason.drill_monitoring_resources = AAZStrType( + serialized_name="drillMonitoringResources", + flags={"read_only": True}, + ) + attention_reason.drill_rbac_on_chaos_resource = AAZStrType( + serialized_name="drillRbacOnChaosResource", + ) + attention_reason.drill_rbac_on_health_model = AAZStrType( + serialized_name="drillRbacOnHealthModel", + ) + attention_reason.drill_rbac_on_monitoring_resources = AAZStrType( + serialized_name="drillRbacOnMonitoringResources", + ) + attention_reason.drill_rbac_on_recovery_plan = AAZStrType( + serialized_name="drillRbacOnRecoveryPlan", + ) + attention_reason.drill_rbac_on_sli = AAZStrType( + serialized_name="drillRbacOnSli", + ) + attention_reason.drill_user_msi = AAZStrType( + serialized_name="drillUserMsi", + ) + attention_reason.health_model_exists = AAZStrType( + serialized_name="healthModelExists", + ) + attention_reason.included_resource_in_drill = AAZStrType( + serialized_name="includedResourceInDrill", + ) + attention_reason.missing_required_resource_providers = AAZListType( + serialized_name="missingRequiredResourceProviders", + ) + attention_reason.monitoring_rbac_on_drill_resources = AAZStrType( + serialized_name="monitoringRbacOnDrillResources", + ) + attention_reason.monitoring_source_not_configured = AAZBoolType( + serialized_name="monitoringSourceNotConfigured", + ) + attention_reason.rbac_needed_for_drill_on_chaos_resource = AAZListType( + serialized_name="rbacNeededForDrillOnChaosResource", + ) + attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillMonitoringResources", + ) + attention_reason.rbac_needed_for_drill_on_drill_resources = AAZListType( + serialized_name="rbacNeededForDrillOnDrillResources", + ) + attention_reason.rbac_needed_for_drill_on_health_model = AAZListType( + serialized_name="rbacNeededForDrillOnHealthModel", + ) + attention_reason.rbac_needed_for_drill_on_recovery_plan = AAZListType( + serialized_name="rbacNeededForDrillOnRecoveryPlan", + ) + attention_reason.rbac_on_target_resources = AAZStrType( + serialized_name="rbacOnTargetResources", + ) + attention_reason.recovery_plan_and_drill_resources_state = AAZStrType( + serialized_name="recoveryPlanAndDrillResourcesState", + ) + attention_reason.ro_readiness = AAZStrType( + serialized_name="roReadiness", + ) + attention_reason.runbook_fault_rbac_on_targets = AAZStrType( + serialized_name="runbookFaultRbacOnTargets", + ) + attention_reason.service_group_and_drill_resources_state = AAZStrType( + serialized_name="serviceGroupAndDrillResourcesState", + ) + attention_reason.sli_attention_statuses = AAZListType( + serialized_name="sliAttentionStatuses", + ) + + chaos_resource_creation_failure_reasons = _schema_drill_read.properties.attention_reason.chaos_resource_creation_failure_reasons + chaos_resource_creation_failure_reasons.Element = AAZStrType() + + drill_monitoring_errors = _schema_drill_read.properties.attention_reason.drill_monitoring_errors + drill_monitoring_errors.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element + _element.code = AAZStrType( + flags={"required": True}, + ) + _element.message = AAZStrType( + flags={"required": True}, + ) + _element.recommendations = AAZListType() + + recommendations = _schema_drill_read.properties.attention_reason.drill_monitoring_errors.Element.recommendations + recommendations.Element = AAZStrType() + + missing_required_resource_providers = _schema_drill_read.properties.attention_reason.missing_required_resource_providers + missing_required_resource_providers.Element = AAZStrType() + + rbac_needed_for_drill_on_chaos_resource = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_chaos_resource + rbac_needed_for_drill_on_chaos_resource.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_monitoring_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_monitoring_resources + rbac_needed_for_drill_on_drill_monitoring_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_drill_resources = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_drill_resources + rbac_needed_for_drill_on_drill_resources.Element = AAZStrType() + + rbac_needed_for_drill_on_health_model = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_health_model + rbac_needed_for_drill_on_health_model.Element = AAZStrType() + + rbac_needed_for_drill_on_recovery_plan = _schema_drill_read.properties.attention_reason.rbac_needed_for_drill_on_recovery_plan + rbac_needed_for_drill_on_recovery_plan.Element = AAZStrType() + + sli_attention_statuses = _schema_drill_read.properties.attention_reason.sli_attention_statuses + sli_attention_statuses.Element = AAZObjectType() + + _element = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element + _element.drill_rbac_on_destination_amw = AAZStrType( + serialized_name="drillRbacOnDestinationAmw", + flags={"read_only": True}, + ) + _element.exists = AAZStrType( + flags={"read_only": True}, + ) + _element.rbac_needed_on_destination_amws = AAZListType( + serialized_name="rbacNeededOnDestinationAmws", + flags={"read_only": True}, + ) + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + _element.type_match = AAZStrType( + serialized_name="typeMatch", + flags={"read_only": True}, + ) + + rbac_needed_on_destination_amws = _schema_drill_read.properties.attention_reason.sli_attention_statuses.Element.rbac_needed_on_destination_amws + rbac_needed_on_destination_amws.Element = AAZStrType() + + chaos_resource_properties = _schema_drill_read.properties.chaos_resource_properties + chaos_resource_properties.chaos_resource_id = AAZStrType( + serialized_name="chaosResourceId", + flags={"read_only": True}, + ) + chaos_resource_properties.chaos_resource_identity_for_faults = AAZObjectType( + serialized_name="chaosResourceIdentityForFaults", + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.chaos_resource_identity_for_faults) + chaos_resource_properties.fault_duration_in_min = AAZIntType( + serialized_name="faultDurationInMin", + flags={"read_only": True}, + ) + chaos_resource_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(chaos_resource_properties.identity) + + drill_asset_properties = _schema_drill_read.properties.drill_asset_properties + drill_asset_properties.region = AAZStrType( + flags={"required": True}, + ) + drill_asset_properties.resource_group = AAZStrType( + serialized_name="resourceGroup", + ) + drill_asset_properties.subscription = AAZStrType( + flags={"required": True}, + ) + + health_model_monitoring_properties = _schema_drill_read.properties.health_model_monitoring_properties + health_model_monitoring_properties.discovery_rule_id = AAZStrType( + serialized_name="discoveryRuleId", + flags={"required": True}, + ) + health_model_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(health_model_monitoring_properties.identity) + + last_run_properties = _schema_drill_read.properties.last_run_properties + last_run_properties.last_run_attestation = AAZStrType( + serialized_name="lastRunAttestation", + flags={"read_only": True}, + ) + last_run_properties.last_run_duration = AAZStrType( + serialized_name="lastRunDuration", + flags={"read_only": True}, + ) + last_run_properties.last_run_state = AAZStrType( + serialized_name="lastRunState", + flags={"read_only": True}, + ) + last_run_properties.last_run_time = AAZStrType( + serialized_name="lastRunTime", + flags={"read_only": True}, + ) + + monitoring_properties = _schema_drill_read.properties.monitoring_properties + monitoring_properties.data_collection_endpoint_id = AAZStrType( + serialized_name="dataCollectionEndpointId", + flags={"read_only": True}, + ) + monitoring_properties.identity = AAZObjectType() + cls._build_schema_associated_identity_read(monitoring_properties.identity) + monitoring_properties.log_analytics_workspace_id = AAZStrType( + serialized_name="logAnalyticsWorkspaceId", + flags={"read_only": True}, + ) + monitoring_properties.raw_metrics_data_collection_rule_id = AAZStrType( + serialized_name="rawMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + monitoring_properties.service_group_metrics_data_collection_rule_id = AAZStrType( + serialized_name="serviceGroupMetricsDataCollectionRuleId", + flags={"read_only": True}, + ) + + recovery_plan_properties = _schema_drill_read.properties.recovery_plan_properties + recovery_plan_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(recovery_plan_properties.identity) + recovery_plan_properties.recovery_plan_id = AAZStrType( + serialized_name="recoveryPlanId", + flags={"read_only": True}, + ) + recovery_plan_properties.recovery_plan_resource_excluded_count = AAZIntType( + serialized_name="recoveryPlanResourceExcludedCount", + flags={"read_only": True}, + ) + + sli_monitoring_properties = _schema_drill_read.properties.sli_monitoring_properties + sli_monitoring_properties.identity = AAZObjectType( + flags={"required": True}, + ) + cls._build_schema_associated_identity_read(sli_monitoring_properties.identity) + sli_monitoring_properties.slis = AAZListType( + flags={"required": True}, + ) + + slis = _schema_drill_read.properties.sli_monitoring_properties.slis + slis.Element = AAZObjectType() + + _element = _schema_drill_read.properties.sli_monitoring_properties.slis.Element + _element.sli_id = AAZStrType( + serialized_name="sliId", + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_metadata = _schema_drill_read.properties.system_metadata + system_metadata.initial_config = AAZStrType( + serialized_name="initialConfig", + flags={"required": True}, + ) + system_metadata.resource_type_categories = AAZListType( + serialized_name="resourceTypeCategories", + flags={"read_only": True}, + ) + + resource_type_categories = _schema_drill_read.properties.system_metadata.resource_type_categories + resource_type_categories.Element = AAZStrType() + + disc_zonal = _schema_drill_read.properties.discriminate_by("drill_type", "Zonal") + disc_zonal.vms_present = AAZStrType( + serialized_name="vmsPresent", + flags={"read_only": True}, + ) + + system_data = _schema_drill_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_drill_read.id + _schema.identity = cls._schema_drill_read.identity + _schema.name = cls._schema_drill_read.name + _schema.properties = cls._schema_drill_read.properties + _schema.system_data = cls._schema_drill_read.system_data + _schema.type = cls._schema_drill_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__cmd_group.py new file mode 100644 index 00000000000..0fb9f471cc3 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience goal-assignment", +) +class __CMDGroup(AAZCommandGroup): + """Manage Goal Assignment + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__init__.py new file mode 100644 index 00000000000..e12d6c80dd0 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/__init__.py @@ -0,0 +1,20 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._recommend_capacity import * +from ._refresh_goal_resource import * +from ._show import * +from ._update import * +from ._update_goal_resource import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_create.py new file mode 100644 index 00000000000..4b6a3f762d3 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_create.py @@ -0,0 +1,377 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment create", +) +class Create(AAZCommand): + """Create a GoalAssignment + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_type = AAZStrArg( + options=["--goal-assignment-type"], + arg_group="Properties", + help="The type of goal assignment.", + enum={"Resiliency": "Resiliency"}, + ) + _args_schema.goal_template_id = AAZResourceIdArg( + options=["--goal-template-id"], + arg_group="Properties", + help="Arm id of the goal template.", + ) + _args_schema.require_zonal_resiliency = AAZBoolArg( + options=["--require-zonal-resiliency"], + arg_group="Properties", + help="Whether zonal resiliency is required for this goal assignment.", + ) + _args_schema.service_level_resources = AAZListArg( + options=["--service-level-resources"], + arg_group="Properties", + help="List of service level resources.", + ) + + service_level_resources = cls._args_schema.service_level_resources + service_level_resources.Element = AAZObjectArg() + + _element = cls._args_schema.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZResourceIdArg( + options=["service-level-indicator-resource-id"], + help="The arm id of the service level indicator resource", + required=True, + ) + _element.service_level_objective_resource_id = AAZResourceIdArg( + options=["service-level-objective-resource-id"], + help="The arm id of the service level object resource", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalAssignmentsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("goalAssignmentType", AAZStrType, ".goal_assignment_type") + properties.set_prop("goalTemplateId", AAZStrType, ".goal_template_id") + properties.set_prop("requireZonalResiliency", AAZBoolType, ".require_zonal_resiliency") + properties.set_prop("serviceLevelResources", AAZListType, ".service_level_resources") + + service_level_resources = _builder.get(".properties.serviceLevelResources") + if service_level_resources is not None: + service_level_resources.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.serviceLevelResources[]") + if _elements is not None: + _elements.set_prop("serviceLevelIndicatorResourceId", AAZStrType, ".service_level_indicator_resource_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("serviceLevelObjectiveResourceId", AAZStrType, ".service_level_objective_resource_id") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_assignment_type = AAZStrType( + serialized_name="goalAssignmentType", + ) + properties.goal_template_id = AAZStrType( + serialized_name="goalTemplateId", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.require_zonal_resiliency = AAZBoolType( + serialized_name="requireZonalResiliency", + ) + properties.service_level_resources = AAZListType( + serialized_name="serviceLevelResources", + ) + + service_level_resources = cls._schema_on_200_201.properties.service_level_resources + service_level_resources.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZStrType( + serialized_name="serviceLevelIndicatorResourceId", + flags={"required": True}, + ) + _element.service_level_objective_resource_id = AAZStrType( + serialized_name="serviceLevelObjectiveResourceId", + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_delete.py new file mode 100644 index 00000000000..53fb1e2c85e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_delete.py @@ -0,0 +1,163 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete a GoalAssignment + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalAssignmentsDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class GoalAssignmentsDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_list.py new file mode 100644 index 00000000000..9d4ba54cb96 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_list.py @@ -0,0 +1,310 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment list", +) +class List(AAZCommand): + """List GoalAssignment resources by tenant + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalAssignmentsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class GoalAssignmentsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_assignment_type = AAZStrType( + serialized_name="goalAssignmentType", + ) + properties.goal_template_id = AAZStrType( + serialized_name="goalTemplateId", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.require_zonal_resiliency = AAZBoolType( + serialized_name="requireZonalResiliency", + ) + properties.service_level_resources = AAZListType( + serialized_name="serviceLevelResources", + ) + + service_level_resources = cls._schema_on_200.value.Element.properties.service_level_resources + service_level_resources.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZStrType( + serialized_name="serviceLevelIndicatorResourceId", + flags={"required": True}, + ) + _element.service_level_objective_resource_id = AAZStrType( + serialized_name="serviceLevelObjectiveResourceId", + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_recommend_capacity.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_recommend_capacity.py new file mode 100644 index 00000000000..403d2e8ff9b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_recommend_capacity.py @@ -0,0 +1,269 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment recommend-capacity", +) +class RecommendCapacity(AAZCommand): + """Recommends capacity improvements for resources under the goal assignments scope. Returns AI-powered capacity assessments and recommendations. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}/recommendcapacity", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.resource_ids = AAZListArg( + options=["--resource-ids"], + arg_group="Body", + help="Azure resource IDs to evaluate for resiliency. Pass an empty array to automatically discover and evaluate non-resilient resources in the service group. Maximum 50 resources per request.", + required=True, + fmt=AAZListArgFormat( + max_length=50, + ), + ) + + resource_ids = cls._args_schema.resource_ids + resource_ids.Element = AAZResourceIdArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalAssignmentsRecommendCapacity(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsRecommendCapacity(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}/recommendCapacity", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("resourceIds", AAZListType, ".resource_ids", typ_kwargs={"flags": {"required": True}}) + + resource_ids = _builder.get(".resourceIds") + if resource_ids is not None: + resource_ids.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.agent_error = AAZStrType( + serialized_name="agentError", + ) + _schema_on_200.recommendations = AAZListType( + flags={"required": True}, + ) + _schema_on_200.resource_capacities = AAZListType( + serialized_name="resourceCapacities", + flags={"required": True}, + ) + + recommendations = cls._schema_on_200.recommendations + recommendations.Element = AAZStrType() + + resource_capacities = cls._schema_on_200.resource_capacities + resource_capacities.Element = AAZObjectType() + + _element = cls._schema_on_200.resource_capacities.Element + _element.capacity_assessment = AAZStrType( + serialized_name="capacityAssessment", + ) + _element.category = AAZStrType() + _element.error = AAZStrType() + _element.links = AAZListType() + _element.location = AAZStrType() + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + ) + _element.sku_name = AAZStrType( + serialized_name="skuName", + ) + _element.steps = AAZListType() + _element.suggested_regions = AAZListType( + serialized_name="suggestedRegions", + ) + _element.suggested_skus = AAZListType( + serialized_name="suggestedSkus", + ) + + links = cls._schema_on_200.resource_capacities.Element.links + links.Element = AAZStrType() + + steps = cls._schema_on_200.resource_capacities.Element.steps + steps.Element = AAZStrType() + + suggested_regions = cls._schema_on_200.resource_capacities.Element.suggested_regions + suggested_regions.Element = AAZStrType() + + suggested_skus = cls._schema_on_200.resource_capacities.Element.suggested_skus + suggested_skus.Element = AAZStrType() + + return cls._schema_on_200 + + +class _RecommendCapacityHelper: + """Helper class for RecommendCapacity""" + + +__all__ = ["RecommendCapacity"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_refresh_goal_resource.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_refresh_goal_resource.py new file mode 100644 index 00000000000..48f24950b98 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_refresh_goal_resource.py @@ -0,0 +1,187 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment refresh-goal-resource", +) +class RefreshGoalResource(AAZCommand): + """Refreshes the goal resources under a goal assignment. This operation scans for new resources under the scope of the assignment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}/refreshgoalresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalAssignmentsRefreshGoalResources(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsRefreshGoalResources(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}/refreshGoalResources", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.last_refresh_time = AAZStrType( + serialized_name="lastRefreshTime", + ) + _schema_on_200.resource_count = AAZIntType( + serialized_name="resourceCount", + ) + + return cls._schema_on_200 + + +class _RefreshGoalResourceHelper: + """Helper class for RefreshGoalResource""" + + +__all__ = ["RefreshGoalResource"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_show.py new file mode 100644 index 00000000000..53a50ec4fa8 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_show.py @@ -0,0 +1,291 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment show", +) +class Show(AAZCommand): + """Get a GoalAssignment + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalAssignmentsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_assignment_type = AAZStrType( + serialized_name="goalAssignmentType", + ) + properties.goal_template_id = AAZStrType( + serialized_name="goalTemplateId", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.require_zonal_resiliency = AAZBoolType( + serialized_name="requireZonalResiliency", + ) + properties.service_level_resources = AAZListType( + serialized_name="serviceLevelResources", + ) + + service_level_resources = cls._schema_on_200.properties.service_level_resources + service_level_resources.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZStrType( + serialized_name="serviceLevelIndicatorResourceId", + flags={"required": True}, + ) + _element.service_level_objective_resource_id = AAZStrType( + serialized_name="serviceLevelObjectiveResourceId", + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update.py new file mode 100644 index 00000000000..eb7df4544e2 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update.py @@ -0,0 +1,519 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment update", +) +class Update(AAZCommand): + """Update a GoalAssignment + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_type = AAZStrArg( + options=["--goal-assignment-type"], + arg_group="Properties", + help="The type of goal assignment.", + nullable=True, + enum={"Resiliency": "Resiliency"}, + ) + _args_schema.goal_template_id = AAZResourceIdArg( + options=["--goal-template-id"], + arg_group="Properties", + help="Arm id of the goal template.", + nullable=True, + ) + _args_schema.require_zonal_resiliency = AAZBoolArg( + options=["--require-zonal-resiliency"], + arg_group="Properties", + help="Whether zonal resiliency is required for this goal assignment.", + nullable=True, + ) + _args_schema.service_level_resources = AAZListArg( + options=["--service-level-resources"], + arg_group="Properties", + help="List of service level resources.", + nullable=True, + ) + + service_level_resources = cls._args_schema.service_level_resources + service_level_resources.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZResourceIdArg( + options=["service-level-indicator-resource-id"], + help="The arm id of the service level indicator resource", + ) + _element.service_level_objective_resource_id = AAZResourceIdArg( + options=["service-level-objective-resource-id"], + help="The arm id of the service level object resource", + nullable=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalAssignmentsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.GoalAssignmentsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_goal_assignment_read(cls._schema_on_200) + + return cls._schema_on_200 + + class GoalAssignmentsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_goal_assignment_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("goalAssignmentType", AAZStrType, ".goal_assignment_type") + properties.set_prop("goalTemplateId", AAZStrType, ".goal_template_id") + properties.set_prop("requireZonalResiliency", AAZBoolType, ".require_zonal_resiliency") + properties.set_prop("serviceLevelResources", AAZListType, ".service_level_resources") + + service_level_resources = _builder.get(".properties.serviceLevelResources") + if service_level_resources is not None: + service_level_resources.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.serviceLevelResources[]") + if _elements is not None: + _elements.set_prop("serviceLevelIndicatorResourceId", AAZStrType, ".service_level_indicator_resource_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("serviceLevelObjectiveResourceId", AAZStrType, ".service_level_objective_resource_id") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_goal_assignment_read = None + + @classmethod + def _build_schema_goal_assignment_read(cls, _schema): + if cls._schema_goal_assignment_read is not None: + _schema.id = cls._schema_goal_assignment_read.id + _schema.name = cls._schema_goal_assignment_read.name + _schema.properties = cls._schema_goal_assignment_read.properties + _schema.system_data = cls._schema_goal_assignment_read.system_data + _schema.type = cls._schema_goal_assignment_read.type + return + + cls._schema_goal_assignment_read = _schema_goal_assignment_read = AAZObjectType() + + goal_assignment_read = _schema_goal_assignment_read + goal_assignment_read.id = AAZStrType( + flags={"read_only": True}, + ) + goal_assignment_read.name = AAZStrType( + flags={"read_only": True}, + ) + goal_assignment_read.properties = AAZObjectType() + goal_assignment_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + goal_assignment_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_goal_assignment_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.goal_assignment_type = AAZStrType( + serialized_name="goalAssignmentType", + ) + properties.goal_template_id = AAZStrType( + serialized_name="goalTemplateId", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.require_zonal_resiliency = AAZBoolType( + serialized_name="requireZonalResiliency", + ) + properties.service_level_resources = AAZListType( + serialized_name="serviceLevelResources", + ) + + service_level_resources = _schema_goal_assignment_read.properties.service_level_resources + service_level_resources.Element = AAZObjectType() + + _element = _schema_goal_assignment_read.properties.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZStrType( + serialized_name="serviceLevelIndicatorResourceId", + flags={"required": True}, + ) + _element.service_level_objective_resource_id = AAZStrType( + serialized_name="serviceLevelObjectiveResourceId", + ) + + system_data = _schema_goal_assignment_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_goal_assignment_read.id + _schema.name = cls._schema_goal_assignment_read.name + _schema.properties = cls._schema_goal_assignment_read.properties + _schema.system_data = cls._schema_goal_assignment_read.system_data + _schema.type = cls._schema_goal_assignment_read.type + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update_goal_resource.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update_goal_resource.py new file mode 100644 index 00000000000..0f83f9c9189 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_update_goal_resource.py @@ -0,0 +1,488 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment update-goal-resource", +) +class UpdateGoalResource(AAZCommand): + """Action to exclude a resource from goal assignment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}/updategoalresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.resources = AAZListArg( + options=["--resources"], + arg_group="Body", + help="List of update goal resource.", + required=True, + ) + + resources = cls._args_schema.resources + resources.Element = AAZObjectArg() + + _element = cls._args_schema.resources.Element + _element.disaster_recovery_attestation_status = AAZStrArg( + options=["disaster-recovery-attestation-status"], + help="Flag which depicts whether the Arm resource is manually attested for disaster recovery recommendation.", + enum={"ManuallyAttested": "ManuallyAttested", "NotAttested": "NotAttested"}, + ) + _element.disaster_recovery_goal_participation = AAZStrArg( + options=["disaster-recovery-goal-participation"], + help="Flag which depicts whether the Arm resource is excluded for disaster recovery recommendation.", + enum={"Excluded": "Excluded", "Included": "Included"}, + ) + _element.high_availability_attestation_status = AAZStrArg( + options=["high-availability-attestation-status"], + help="Flag which depicts whether the Arm resource is manually attested for high availability recommendation.", + enum={"ManuallyAttested": "ManuallyAttested", "NotAttested": "NotAttested"}, + ) + _element.high_availability_goal_participation = AAZStrArg( + options=["high-availability-goal-participation"], + help="Flag which depicts whether the Arm resource is excluded for high availability recommendation.", + enum={"Excluded": "Excluded", "Included": "Included"}, + ) + _element.resource_arm_id = AAZResourceIdArg( + options=["resource-arm-id"], + help="Arm Id of resource under the SG for which the extension resource is maintained.", + ) + _element.user_confirmation_for_high_availability = AAZListArg( + options=["user-confirmation-for-high-availability"], + help="List of user confirmations for high availability solutions.", + ) + _element.zonal_resiliency = AAZObjectArg( + options=["zonal-resiliency"], + help="Zonal resiliency posture (participation, attestation, exclusion reason, and user confirmations) for the Arm resource.", + ) + + user_confirmation_for_high_availability = cls._args_schema.resources.Element.user_confirmation_for_high_availability + user_confirmation_for_high_availability.Element = AAZObjectArg() + cls._build_args_user_confirmation_item_create(user_confirmation_for_high_availability.Element) + + zonal_resiliency = cls._args_schema.resources.Element.zonal_resiliency + zonal_resiliency.attestation_status = AAZStrArg( + options=["attestation-status"], + help="Flag which depicts whether the Arm resource is manually attested for resiliency recommendation.", + enum={"ManuallyAttested": "ManuallyAttested", "NotAttested": "NotAttested"}, + ) + zonal_resiliency.goal_participation = AAZStrArg( + options=["goal-participation"], + help="Flag which depicts whether the Arm resource is excluded for resiliency recommendation.", + enum={"Excluded": "Excluded", "Included": "Included"}, + ) + zonal_resiliency.user_confirmation = AAZListArg( + options=["user-confirmation"], + help="List of user confirmations for resiliency solutions.", + ) + + user_confirmation = cls._args_schema.resources.Element.zonal_resiliency.user_confirmation + user_confirmation.Element = AAZObjectArg() + cls._build_args_user_confirmation_item_create(user_confirmation.Element) + return cls._args_schema + + _args_user_confirmation_item_create = None + + @classmethod + def _build_args_user_confirmation_item_create(cls, _schema): + if cls._args_user_confirmation_item_create is not None: + _schema.confirmation_status = cls._args_user_confirmation_item_create.confirmation_status + _schema.reason_for_requesting_confirmation = cls._args_user_confirmation_item_create.reason_for_requesting_confirmation + _schema.solution_display_name = cls._args_user_confirmation_item_create.solution_display_name + return + + cls._args_user_confirmation_item_create = AAZObjectArg() + + user_confirmation_item_create = cls._args_user_confirmation_item_create + user_confirmation_item_create.confirmation_status = AAZStrArg( + options=["confirmation-status"], + help="The confirmation status of the high availability solution.", + required=True, + enum={"ApprovalNotNeeded": "ApprovalNotNeeded", "ApprovalPending": "ApprovalPending", "ApprovedByUser": "ApprovedByUser", "RejectedByUser": "RejectedByUser"}, + ) + user_confirmation_item_create.reason_for_requesting_confirmation = AAZStrArg( + options=["reason-for-requesting-confirmation"], + help="The reason for requesting user confirmation for the high availability solution.", + enum={"VmInMultiZoneScaleSetStatelessOnly": "VmInMultiZoneScaleSetStatelessOnly", "ZonePinnedZrsDataDisksConditional": "ZonePinnedZrsDataDisksConditional"}, + ) + user_confirmation_item_create.solution_display_name = AAZStrArg( + options=["solution-display-name"], + help="The solution display name of the high availability solution.", + required=True, + enum={"VmInMultiZoneVmss": "VmInMultiZoneVmss", "ZonePinnedVmWithZrsDisk": "ZonePinnedVmWithZrsDisk"}, + ) + + _schema.confirmation_status = cls._args_user_confirmation_item_create.confirmation_status + _schema.reason_for_requesting_confirmation = cls._args_user_confirmation_item_create.reason_for_requesting_confirmation + _schema.solution_display_name = cls._args_user_confirmation_item_create.solution_display_name + + def _execute_operations(self): + self.pre_operations() + yield self.GoalAssignmentsUpdateGoalResources(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalAssignmentsUpdateGoalResources(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}/updateGoalResources", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("resources", AAZListType, ".resources", typ_kwargs={"flags": {"required": True}}) + + resources = _builder.get(".resources") + if resources is not None: + resources.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".resources[]") + if _elements is not None: + _elements.set_prop("properties", AAZObjectType) + + properties = _builder.get(".resources[].properties") + if properties is not None: + properties.set_prop("disasterRecoveryAttestationStatus", AAZStrType, ".disaster_recovery_attestation_status") + properties.set_prop("disasterRecoveryGoalParticipation", AAZStrType, ".disaster_recovery_goal_participation") + properties.set_prop("highAvailabilityAttestationStatus", AAZStrType, ".high_availability_attestation_status") + properties.set_prop("highAvailabilityGoalParticipation", AAZStrType, ".high_availability_goal_participation") + properties.set_prop("resourceArmId", AAZStrType, ".resource_arm_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("userConfirmationForHighAvailability", AAZListType, ".user_confirmation_for_high_availability") + properties.set_prop("zonalResiliency", AAZObjectType, ".zonal_resiliency") + + user_confirmation_for_high_availability = _builder.get(".resources[].properties.userConfirmationForHighAvailability") + if user_confirmation_for_high_availability is not None: + _UpdateGoalResourceHelper._build_schema_user_confirmation_item_create(user_confirmation_for_high_availability.set_elements(AAZObjectType, ".")) + + zonal_resiliency = _builder.get(".resources[].properties.zonalResiliency") + if zonal_resiliency is not None: + zonal_resiliency.set_prop("attestationStatus", AAZStrType, ".attestation_status") + zonal_resiliency.set_prop("goalParticipation", AAZStrType, ".goal_participation") + zonal_resiliency.set_prop("userConfirmation", AAZListType, ".user_confirmation") + + user_confirmation = _builder.get(".resources[].properties.zonalResiliency.userConfirmation") + if user_confirmation is not None: + _UpdateGoalResourceHelper._build_schema_user_confirmation_item_create(user_confirmation.set_elements(AAZObjectType, ".")) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.resources = AAZListType( + flags={"required": True}, + ) + + resources = cls._schema_on_200.resources + resources.Element = AAZObjectType() + + _element = cls._schema_on_200.resources.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.resources.Element.properties + properties.disaster_recovery_attestation_status = AAZStrType( + serialized_name="disasterRecoveryAttestationStatus", + ) + properties.disaster_recovery_goal_participation = AAZStrType( + serialized_name="disasterRecoveryGoalParticipation", + ) + properties.exclusion_reason_for_disaster_recovery_goals = AAZStrType( + serialized_name="exclusionReasonForDisasterRecoveryGoals", + flags={"read_only": True}, + ) + properties.exclusion_reason_for_high_availability_goals = AAZStrType( + serialized_name="exclusionReasonForHighAvailabilityGoals", + flags={"read_only": True}, + ) + properties.high_availability_attestation_status = AAZStrType( + serialized_name="highAvailabilityAttestationStatus", + ) + properties.high_availability_goal_participation = AAZStrType( + serialized_name="highAvailabilityGoalParticipation", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_arm_id = AAZStrType( + serialized_name="resourceArmId", + flags={"required": True}, + ) + properties.service_group_memberships = AAZListType( + serialized_name="serviceGroupMemberships", + flags={"read_only": True}, + ) + properties.user_confirmation_for_high_availability = AAZListType( + serialized_name="userConfirmationForHighAvailability", + ) + properties.zonal_resiliency = AAZObjectType( + serialized_name="zonalResiliency", + ) + + service_group_memberships = cls._schema_on_200.resources.Element.properties.service_group_memberships + service_group_memberships.Element = AAZObjectType() + + _element = cls._schema_on_200.resources.Element.properties.service_group_memberships.Element + _element.membership_type = AAZStrType( + serialized_name="membershipType", + flags={"required": True}, + ) + _element.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + user_confirmation_for_high_availability = cls._schema_on_200.resources.Element.properties.user_confirmation_for_high_availability + user_confirmation_for_high_availability.Element = AAZObjectType() + _UpdateGoalResourceHelper._build_schema_user_confirmation_item_read(user_confirmation_for_high_availability.Element) + + zonal_resiliency = cls._schema_on_200.resources.Element.properties.zonal_resiliency + zonal_resiliency.attestation_status = AAZStrType( + serialized_name="attestationStatus", + ) + zonal_resiliency.exclusion_reason = AAZStrType( + serialized_name="exclusionReason", + flags={"read_only": True}, + ) + zonal_resiliency.goal_participation = AAZStrType( + serialized_name="goalParticipation", + ) + zonal_resiliency.user_confirmation = AAZListType( + serialized_name="userConfirmation", + ) + + user_confirmation = cls._schema_on_200.resources.Element.properties.zonal_resiliency.user_confirmation + user_confirmation.Element = AAZObjectType() + _UpdateGoalResourceHelper._build_schema_user_confirmation_item_read(user_confirmation.Element) + + system_data = cls._schema_on_200.resources.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _UpdateGoalResourceHelper: + """Helper class for UpdateGoalResource""" + + @classmethod + def _build_schema_user_confirmation_item_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("confirmationStatus", AAZStrType, ".confirmation_status", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("reasonForRequestingConfirmation", AAZStrType, ".reason_for_requesting_confirmation") + _builder.set_prop("solutionDisplayName", AAZStrType, ".solution_display_name", typ_kwargs={"flags": {"required": True}}) + + _schema_user_confirmation_item_read = None + + @classmethod + def _build_schema_user_confirmation_item_read(cls, _schema): + if cls._schema_user_confirmation_item_read is not None: + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + return + + cls._schema_user_confirmation_item_read = _schema_user_confirmation_item_read = AAZObjectType() + + user_confirmation_item_read = _schema_user_confirmation_item_read + user_confirmation_item_read.confirmation_status = AAZStrType( + serialized_name="confirmationStatus", + flags={"required": True}, + ) + user_confirmation_item_read.reason_for_requesting_confirmation = AAZStrType( + serialized_name="reasonForRequestingConfirmation", + ) + user_confirmation_item_read.solution_display_name = AAZStrType( + serialized_name="solutionDisplayName", + flags={"required": True}, + ) + + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + + +__all__ = ["UpdateGoalResource"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_wait.py new file mode 100644 index 00000000000..88d18fafa13 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/_wait.py @@ -0,0 +1,290 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalAssignmentsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class GoalAssignmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_assignment_type = AAZStrType( + serialized_name="goalAssignmentType", + ) + properties.goal_template_id = AAZStrType( + serialized_name="goalTemplateId", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.require_zonal_resiliency = AAZBoolType( + serialized_name="requireZonalResiliency", + ) + properties.service_level_resources = AAZListType( + serialized_name="serviceLevelResources", + ) + + service_level_resources = cls._schema_on_200.properties.service_level_resources + service_level_resources.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.service_level_resources.Element + _element.service_level_indicator_resource_id = AAZStrType( + serialized_name="serviceLevelIndicatorResourceId", + flags={"required": True}, + ) + _element.service_level_objective_resource_id = AAZStrType( + serialized_name="serviceLevelObjectiveResourceId", + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__cmd_group.py new file mode 100644 index 00000000000..efb9f73fb11 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience goal-assignment goal-resource", +) +class __CMDGroup(AAZCommandGroup): + """Manage Goal Resource + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_list.py new file mode 100644 index 00000000000..964e8925767 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_list.py @@ -0,0 +1,334 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment goal-resource list", +) +class List(AAZCommand): + """List GoalResource resources by GoalAssignment + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}/goalresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalResourcesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class GoalResourcesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}/goalResources", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.disaster_recovery_attestation_status = AAZStrType( + serialized_name="disasterRecoveryAttestationStatus", + ) + properties.disaster_recovery_goal_participation = AAZStrType( + serialized_name="disasterRecoveryGoalParticipation", + ) + properties.exclusion_reason_for_disaster_recovery_goals = AAZStrType( + serialized_name="exclusionReasonForDisasterRecoveryGoals", + flags={"read_only": True}, + ) + properties.exclusion_reason_for_high_availability_goals = AAZStrType( + serialized_name="exclusionReasonForHighAvailabilityGoals", + flags={"read_only": True}, + ) + properties.high_availability_attestation_status = AAZStrType( + serialized_name="highAvailabilityAttestationStatus", + ) + properties.high_availability_goal_participation = AAZStrType( + serialized_name="highAvailabilityGoalParticipation", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_arm_id = AAZStrType( + serialized_name="resourceArmId", + flags={"required": True}, + ) + properties.service_group_memberships = AAZListType( + serialized_name="serviceGroupMemberships", + flags={"read_only": True}, + ) + properties.user_confirmation_for_high_availability = AAZListType( + serialized_name="userConfirmationForHighAvailability", + ) + properties.zonal_resiliency = AAZObjectType( + serialized_name="zonalResiliency", + ) + + service_group_memberships = cls._schema_on_200.value.Element.properties.service_group_memberships + service_group_memberships.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.service_group_memberships.Element + _element.membership_type = AAZStrType( + serialized_name="membershipType", + flags={"required": True}, + ) + _element.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + user_confirmation_for_high_availability = cls._schema_on_200.value.Element.properties.user_confirmation_for_high_availability + user_confirmation_for_high_availability.Element = AAZObjectType() + _ListHelper._build_schema_user_confirmation_item_read(user_confirmation_for_high_availability.Element) + + zonal_resiliency = cls._schema_on_200.value.Element.properties.zonal_resiliency + zonal_resiliency.attestation_status = AAZStrType( + serialized_name="attestationStatus", + ) + zonal_resiliency.exclusion_reason = AAZStrType( + serialized_name="exclusionReason", + flags={"read_only": True}, + ) + zonal_resiliency.goal_participation = AAZStrType( + serialized_name="goalParticipation", + ) + zonal_resiliency.user_confirmation = AAZListType( + serialized_name="userConfirmation", + ) + + user_confirmation = cls._schema_on_200.value.Element.properties.zonal_resiliency.user_confirmation + user_confirmation.Element = AAZObjectType() + _ListHelper._build_schema_user_confirmation_item_read(user_confirmation.Element) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_user_confirmation_item_read = None + + @classmethod + def _build_schema_user_confirmation_item_read(cls, _schema): + if cls._schema_user_confirmation_item_read is not None: + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + return + + cls._schema_user_confirmation_item_read = _schema_user_confirmation_item_read = AAZObjectType() + + user_confirmation_item_read = _schema_user_confirmation_item_read + user_confirmation_item_read.confirmation_status = AAZStrType( + serialized_name="confirmationStatus", + flags={"required": True}, + ) + user_confirmation_item_read.reason_for_requesting_confirmation = AAZStrType( + serialized_name="reasonForRequestingConfirmation", + ) + user_confirmation_item_read.solution_display_name = AAZStrType( + serialized_name="solutionDisplayName", + flags={"required": True}, + ) + + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_show.py new file mode 100644 index 00000000000..28a27090533 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_assignment/goal_resource/_show.py @@ -0,0 +1,315 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-assignment goal-resource show", +) +class Show(AAZCommand): + """Get a GoalResource + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goalassignments/{}/goalresources/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_assignment_name = AAZStrArg( + options=["--goal-assignment-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.goal_resource_name = AAZStrArg( + options=["--goal-resource-name"], + help="The name of the GoalAssignment", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalResourcesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalResourcesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalAssignments/{goalAssignmentName}/goalResources/{goalResourceName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalAssignmentName", self.ctx.args.goal_assignment_name, + required=True, + ), + **self.serialize_url_param( + "goalResourceName", self.ctx.args.goal_resource_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.disaster_recovery_attestation_status = AAZStrType( + serialized_name="disasterRecoveryAttestationStatus", + ) + properties.disaster_recovery_goal_participation = AAZStrType( + serialized_name="disasterRecoveryGoalParticipation", + ) + properties.exclusion_reason_for_disaster_recovery_goals = AAZStrType( + serialized_name="exclusionReasonForDisasterRecoveryGoals", + flags={"read_only": True}, + ) + properties.exclusion_reason_for_high_availability_goals = AAZStrType( + serialized_name="exclusionReasonForHighAvailabilityGoals", + flags={"read_only": True}, + ) + properties.high_availability_attestation_status = AAZStrType( + serialized_name="highAvailabilityAttestationStatus", + ) + properties.high_availability_goal_participation = AAZStrType( + serialized_name="highAvailabilityGoalParticipation", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_arm_id = AAZStrType( + serialized_name="resourceArmId", + flags={"required": True}, + ) + properties.service_group_memberships = AAZListType( + serialized_name="serviceGroupMemberships", + flags={"read_only": True}, + ) + properties.user_confirmation_for_high_availability = AAZListType( + serialized_name="userConfirmationForHighAvailability", + ) + properties.zonal_resiliency = AAZObjectType( + serialized_name="zonalResiliency", + ) + + service_group_memberships = cls._schema_on_200.properties.service_group_memberships + service_group_memberships.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.service_group_memberships.Element + _element.membership_type = AAZStrType( + serialized_name="membershipType", + flags={"required": True}, + ) + _element.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + user_confirmation_for_high_availability = cls._schema_on_200.properties.user_confirmation_for_high_availability + user_confirmation_for_high_availability.Element = AAZObjectType() + _ShowHelper._build_schema_user_confirmation_item_read(user_confirmation_for_high_availability.Element) + + zonal_resiliency = cls._schema_on_200.properties.zonal_resiliency + zonal_resiliency.attestation_status = AAZStrType( + serialized_name="attestationStatus", + ) + zonal_resiliency.exclusion_reason = AAZStrType( + serialized_name="exclusionReason", + flags={"read_only": True}, + ) + zonal_resiliency.goal_participation = AAZStrType( + serialized_name="goalParticipation", + ) + zonal_resiliency.user_confirmation = AAZListType( + serialized_name="userConfirmation", + ) + + user_confirmation = cls._schema_on_200.properties.zonal_resiliency.user_confirmation + user_confirmation.Element = AAZObjectType() + _ShowHelper._build_schema_user_confirmation_item_read(user_confirmation.Element) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_user_confirmation_item_read = None + + @classmethod + def _build_schema_user_confirmation_item_read(cls, _schema): + if cls._schema_user_confirmation_item_read is not None: + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + return + + cls._schema_user_confirmation_item_read = _schema_user_confirmation_item_read = AAZObjectType() + + user_confirmation_item_read = _schema_user_confirmation_item_read + user_confirmation_item_read.confirmation_status = AAZStrType( + serialized_name="confirmationStatus", + flags={"required": True}, + ) + user_confirmation_item_read.reason_for_requesting_confirmation = AAZStrType( + serialized_name="reasonForRequestingConfirmation", + ) + user_confirmation_item_read.solution_display_name = AAZStrType( + serialized_name="solutionDisplayName", + flags={"required": True}, + ) + + _schema.confirmation_status = cls._schema_user_confirmation_item_read.confirmation_status + _schema.reason_for_requesting_confirmation = cls._schema_user_confirmation_item_read.reason_for_requesting_confirmation + _schema.solution_display_name = cls._schema_user_confirmation_item_read.solution_display_name + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__cmd_group.py new file mode 100644 index 00000000000..db9ceb16e2b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience goal-template", +) +class __CMDGroup(AAZCommandGroup): + """Manage Goal Template + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__init__.py new file mode 100644 index 00000000000..db73033039b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/__init__.py @@ -0,0 +1,17 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_create.py new file mode 100644 index 00000000000..612c39ab5f0 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_create.py @@ -0,0 +1,354 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template create", +) +class Create(AAZCommand): + """Create a GoalTemplate + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_template_name = AAZStrArg( + options=["--goal-template-name"], + help="The name of the goalTemplate", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.goal_type = AAZStrArg( + options=["--goal-type"], + arg_group="Properties", + help="Type of Goal Template created by customer", + enum={"Resiliency": "Resiliency"}, + ) + _args_schema.regional_recovery_point_objective = AAZStrArg( + options=["--regional-recovery-point-objective"], + arg_group="Properties", + help="Regional recovery point objective specified by customer. eg, PT15M for 15 minutes", + ) + _args_schema.regional_recovery_time_objective = AAZStrArg( + options=["--regional-recovery-time-objective"], + arg_group="Properties", + help="Regional recovery time objective specified by customer. eg, PT15M for 15 minutes", + ) + _args_schema.require_disaster_recovery = AAZStrArg( + options=["--require-disaster-recovery"], + arg_group="Properties", + help="Option specified by customer under disaster recovery section of goal template", + enum={"NotRequired": "NotRequired", "Required": "Required"}, + ) + _args_schema.require_high_availability = AAZStrArg( + options=["--require-high-availability"], + arg_group="Properties", + help="Option specified by customer under high availability section of goal template", + enum={"NotRequired": "NotRequired", "Required": "Required"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalTemplatesCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalTemplatesCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("goalType", AAZStrType, ".goal_type", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("regionalRecoveryPointObjective", AAZStrType, ".regional_recovery_point_objective") + properties.set_prop("regionalRecoveryTimeObjective", AAZStrType, ".regional_recovery_time_objective") + properties.set_prop("requireDisasterRecovery", AAZStrType, ".require_disaster_recovery") + properties.set_prop("requireHighAvailability", AAZStrType, ".require_high_availability") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_type = AAZStrType( + serialized_name="goalType", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.regional_recovery_point_objective = AAZStrType( + serialized_name="regionalRecoveryPointObjective", + ) + properties.regional_recovery_time_objective = AAZStrType( + serialized_name="regionalRecoveryTimeObjective", + ) + properties.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + properties.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_delete.py new file mode 100644 index 00000000000..3e0b0ee2762 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_delete.py @@ -0,0 +1,163 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete a GoalTemplate + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_template_name = AAZStrArg( + options=["--goal-template-name"], + help="The name of the goalTemplate", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.GoalTemplatesDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class GoalTemplatesDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_list.py new file mode 100644 index 00000000000..23a7aafb0eb --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_list.py @@ -0,0 +1,302 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template list", +) +class List(AAZCommand): + """List GoalTemplate resources by tenant + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalTemplatesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class GoalTemplatesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_type = AAZStrType( + serialized_name="goalType", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.regional_recovery_point_objective = AAZStrType( + serialized_name="regionalRecoveryPointObjective", + ) + properties.regional_recovery_time_objective = AAZStrType( + serialized_name="regionalRecoveryTimeObjective", + ) + properties.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + properties.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_show.py new file mode 100644 index 00000000000..7b28b29bcd1 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_show.py @@ -0,0 +1,283 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template show", +) +class Show(AAZCommand): + """Get a GoalTemplate + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_template_name = AAZStrArg( + options=["--goal-template-name"], + help="The name of the goalTemplate", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalTemplatesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalTemplatesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_type = AAZStrType( + serialized_name="goalType", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.regional_recovery_point_objective = AAZStrType( + serialized_name="regionalRecoveryPointObjective", + ) + properties.regional_recovery_time_objective = AAZStrType( + serialized_name="regionalRecoveryTimeObjective", + ) + properties.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + properties.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_update.py new file mode 100644 index 00000000000..9aec2eaf8dd --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_update.py @@ -0,0 +1,494 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template update", +) +class Update(AAZCommand): + """Update a GoalTemplate + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_template_name = AAZStrArg( + options=["--goal-template-name"], + help="The name of the goalTemplate", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.goal_type = AAZStrArg( + options=["--goal-type"], + arg_group="Properties", + help="Type of Goal Template created by customer", + enum={"Resiliency": "Resiliency"}, + ) + _args_schema.regional_recovery_point_objective = AAZStrArg( + options=["--regional-recovery-point-objective"], + arg_group="Properties", + help="Regional recovery point objective specified by customer. eg, PT15M for 15 minutes", + nullable=True, + ) + _args_schema.regional_recovery_time_objective = AAZStrArg( + options=["--regional-recovery-time-objective"], + arg_group="Properties", + help="Regional recovery time objective specified by customer. eg, PT15M for 15 minutes", + nullable=True, + ) + _args_schema.require_disaster_recovery = AAZStrArg( + options=["--require-disaster-recovery"], + arg_group="Properties", + help="Option specified by customer under disaster recovery section of goal template", + nullable=True, + enum={"NotRequired": "NotRequired", "Required": "Required"}, + ) + _args_schema.require_high_availability = AAZStrArg( + options=["--require-high-availability"], + arg_group="Properties", + help="Option specified by customer under high availability section of goal template", + nullable=True, + enum={"NotRequired": "NotRequired", "Required": "Required"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalTemplatesGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.GoalTemplatesCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class GoalTemplatesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_goal_template_read(cls._schema_on_200) + + return cls._schema_on_200 + + class GoalTemplatesCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_goal_template_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("goalType", AAZStrType, ".goal_type", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("regionalRecoveryPointObjective", AAZStrType, ".regional_recovery_point_objective") + properties.set_prop("regionalRecoveryTimeObjective", AAZStrType, ".regional_recovery_time_objective") + properties.set_prop("requireDisasterRecovery", AAZStrType, ".require_disaster_recovery") + properties.set_prop("requireHighAvailability", AAZStrType, ".require_high_availability") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_goal_template_read = None + + @classmethod + def _build_schema_goal_template_read(cls, _schema): + if cls._schema_goal_template_read is not None: + _schema.id = cls._schema_goal_template_read.id + _schema.name = cls._schema_goal_template_read.name + _schema.properties = cls._schema_goal_template_read.properties + _schema.system_data = cls._schema_goal_template_read.system_data + _schema.type = cls._schema_goal_template_read.type + return + + cls._schema_goal_template_read = _schema_goal_template_read = AAZObjectType() + + goal_template_read = _schema_goal_template_read + goal_template_read.id = AAZStrType( + flags={"read_only": True}, + ) + goal_template_read.name = AAZStrType( + flags={"read_only": True}, + ) + goal_template_read.properties = AAZObjectType() + goal_template_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + goal_template_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_goal_template_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.goal_type = AAZStrType( + serialized_name="goalType", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.regional_recovery_point_objective = AAZStrType( + serialized_name="regionalRecoveryPointObjective", + ) + properties.regional_recovery_time_objective = AAZStrType( + serialized_name="regionalRecoveryTimeObjective", + ) + properties.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + properties.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + + system_data = _schema_goal_template_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_goal_template_read.id + _schema.name = cls._schema_goal_template_read.name + _schema.properties = cls._schema_goal_template_read.properties + _schema.system_data = cls._schema_goal_template_read.system_data + _schema.type = cls._schema_goal_template_read.type + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_wait.py new file mode 100644 index 00000000000..a98dc255913 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/goal_template/_wait.py @@ -0,0 +1,282 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience goal-template wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/goaltemplates/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.goal_template_name = AAZStrArg( + options=["--goal-template-name"], + help="The name of the goalTemplate", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.GoalTemplatesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class GoalTemplatesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/goalTemplates/{goalTemplateName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "goalTemplateName", self.ctx.args.goal_template_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.goal_type = AAZStrType( + serialized_name="goalType", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.regional_recovery_point_objective = AAZStrType( + serialized_name="regionalRecoveryPointObjective", + ) + properties.regional_recovery_time_objective = AAZStrType( + serialized_name="regionalRecoveryTimeObjective", + ) + properties.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + properties.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__cmd_group.py new file mode 100644 index 00000000000..410084b9ff1 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience recovery-plan", +) +class __CMDGroup(AAZCommandGroup): + """Manage Recovery Plan + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__init__.py new file mode 100644 index 00000000000..886d21dc461 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/__init__.py @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._check_readiness import * +from ._create import * +from ._delete import * +from ._failover import * +from ._failover_commit import * +from ._finalize import * +from ._list import * +from ._reprotect import * +from ._show import * +from ._test_failover import * +from ._test_failover_cleanup import * +from ._update import * +from ._update_resource import * +from ._validate_for_failover import * +from ._validate_for_failover_commit import * +from ._validate_for_operation import * +from ._validate_for_reprotect import * +from ._validate_for_test_failover import * +from ._validate_for_test_failover_cleanup import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_check_readiness.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_check_readiness.py new file mode 100644 index 00000000000..541ba493773 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_check_readiness.py @@ -0,0 +1,194 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan check-readiness", +) +class CheckReadiness(AAZCommand): + """This action performs the necessary readiness check on the recovery orchestration plan to ensure it is in the desired state and eligible for all recovery actions, including all protected resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/checkreadiness", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsCheckReadiness(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsCheckReadiness(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/checkReadiness", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _CheckReadinessHelper: + """Helper class for CheckReadiness""" + + +__all__ = ["CheckReadiness"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_create.py new file mode 100644 index 00000000000..90019f1b830 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_create.py @@ -0,0 +1,855 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan create", +) +class Create(AAZCommand): + """Create a RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.plan_description = AAZStrArg( + options=["--plan-description"], + arg_group="Properties", + help="A description of the recovery orchestration plan.", + fmt=AAZStrArgFormat( + max_length=50, + min_length=5, + ), + ) + _args_schema.plan_type = AAZStrArg( + options=["--plan-type"], + arg_group="Properties", + help="The type of the recovery orchestration plan, which can be set during creation but cannot be changed afterward.", + enum={"Regional": "Regional", "Zonal": "Zonal"}, + ) + _args_schema.recovery_groups_setting = AAZObjectArg( + options=["--recovery-groups-setting"], + arg_group="Properties", + help="Settings for the recovery orchestration groups associated with the recovery orchestration plan.", + ) + + recovery_groups_setting = cls._args_schema.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListArg( + options=["additional-groups"], + help="Additional recovery orchestration group settings.", + fmt=AAZListArgFormat( + max_length=14, + ), + ) + recovery_groups_setting.default_group = AAZObjectArg( + options=["default-group"], + help="The default recovery orchestration group setting. Every recovery orchestration plan has a default recovery orchestration group.", + required=True, + ) + cls._build_args_recovery_group_create(recovery_groups_setting.default_group) + + additional_groups = cls._args_schema.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectArg() + cls._build_args_recovery_group_create(additional_groups.Element) + return cls._args_schema + + _args_recovery_group_base_action_create = None + + @classmethod + def _build_args_recovery_group_base_action_create(cls, _schema): + if cls._args_recovery_group_base_action_create is not None: + _schema.custom_runbook = cls._args_recovery_group_base_action_create.custom_runbook + _schema.description = cls._args_recovery_group_base_action_create.description + _schema.manual_action = cls._args_recovery_group_base_action_create.manual_action + _schema.name = cls._args_recovery_group_base_action_create.name + _schema.timeout_in_minutes = cls._args_recovery_group_base_action_create.timeout_in_minutes + return + + cls._args_recovery_group_base_action_create = AAZObjectArg() + + recovery_group_base_action_create = cls._args_recovery_group_base_action_create + recovery_group_base_action_create.custom_runbook = AAZObjectArg( + options=["custom-runbook"], + ) + recovery_group_base_action_create.manual_action = AAZObjectArg( + options=["manual-action"], + blank={}, + ) + recovery_group_base_action_create.description = AAZStrArg( + options=["description"], + help="A description of the recovery orchestration group action, containing the instructions to be performed during this action.", + fmt=AAZStrArgFormat( + max_length=100, + ), + ) + recovery_group_base_action_create.name = AAZStrArg( + options=["name"], + help="The name of the recovery orchestration group action.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + recovery_group_base_action_create.timeout_in_minutes = AAZIntArg( + options=["timeout-in-minutes"], + help="The maximum amount of time, in minutes, allowed for the action to complete before it times out.", + required=True, + fmt=AAZIntArgFormat( + maximum=10000, + minimum=0, + ), + ) + + custom_runbook = cls._args_recovery_group_base_action_create.custom_runbook + custom_runbook.action_resource_id = AAZResourceIdArg( + options=["action-resource-id"], + help="The ARM Resource ID of the resource that includes the actionable script, such as a Runbook in an Automation Account.", + ) + custom_runbook.associated_identity = AAZObjectArg( + options=["associated-identity"], + help="The identity associated with actionResourceId for RBAC.", + ) + custom_runbook.parameters = AAZDictArg( + options=["parameters"], + help="Key-value parameters for the operation.", + ) + + associated_identity = cls._args_recovery_group_base_action_create.custom_runbook.associated_identity + associated_identity.type = AAZStrArg( + options=["type"], + help="Identity type linked with the resource", + required=True, + enum={"None": "None", "SystemAssigned": "SystemAssigned", "SystemAssigned,UserAssigned": "SystemAssigned,UserAssigned", "UserAssigned": "UserAssigned"}, + ) + associated_identity.user_assigned_identity = AAZResourceIdArg( + options=["user-assigned-identity"], + help="User assigned identity id linked with the resource", + ) + + parameters = cls._args_recovery_group_base_action_create.custom_runbook.parameters + parameters.Element = AAZStrArg() + + _schema.custom_runbook = cls._args_recovery_group_base_action_create.custom_runbook + _schema.description = cls._args_recovery_group_base_action_create.description + _schema.manual_action = cls._args_recovery_group_base_action_create.manual_action + _schema.name = cls._args_recovery_group_base_action_create.name + _schema.timeout_in_minutes = cls._args_recovery_group_base_action_create.timeout_in_minutes + + _args_recovery_group_create = None + + @classmethod + def _build_args_recovery_group_create(cls, _schema): + if cls._args_recovery_group_create is not None: + _schema.description = cls._args_recovery_group_create.description + _schema.group_unique_id = cls._args_recovery_group_create.group_unique_id + _schema.order_id = cls._args_recovery_group_create.order_id + _schema.post_actions = cls._args_recovery_group_create.post_actions + _schema.pre_actions = cls._args_recovery_group_create.pre_actions + return + + cls._args_recovery_group_create = AAZObjectArg() + + recovery_group_create = cls._args_recovery_group_create + recovery_group_create.description = AAZStrArg( + options=["description"], + help="A description of the recovery orchestration group.", + fmt=AAZStrArgFormat( + max_length=50, + min_length=5, + ), + ) + recovery_group_create.group_unique_id = AAZStrArg( + options=["group-unique-id"], + help="A unique id for the recovery orchestration group, which is a GUID.", + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + recovery_group_create.order_id = AAZIntArg( + options=["order-id"], + help="The order ID of the recovery orchestration group.", + fmt=AAZIntArgFormat( + maximum=15, + minimum=0, + ), + ) + recovery_group_create.post_actions = AAZListArg( + options=["post-actions"], + help="Post-actions for the recovery orchestration group.", + fmt=AAZListArgFormat( + max_length=10, + ), + ) + recovery_group_create.pre_actions = AAZListArg( + options=["pre-actions"], + help="Pre-actions for the recovery orchestration group.", + fmt=AAZListArgFormat( + max_length=10, + ), + ) + + post_actions = cls._args_recovery_group_create.post_actions + post_actions.Element = AAZObjectArg() + cls._build_args_recovery_group_base_action_create(post_actions.Element) + + pre_actions = cls._args_recovery_group_create.pre_actions + pre_actions.Element = AAZObjectArg() + cls._build_args_recovery_group_base_action_create(pre_actions.Element) + + _schema.description = cls._args_recovery_group_create.description + _schema.group_unique_id = cls._args_recovery_group_create.group_unique_id + _schema.order_id = cls._args_recovery_group_create.order_id + _schema.post_actions = cls._args_recovery_group_create.post_actions + _schema.pre_actions = cls._args_recovery_group_create.pre_actions + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + + identity = _builder.get(".identity") + if identity is not None: + identity.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "create"}}) + identity.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "create"}}) + + user_assigned = _builder.get(".identity.userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("planDescription", AAZStrType, ".plan_description", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("planType", AAZStrType, ".plan_type", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("recoveryGroupsSetting", AAZObjectType, ".recovery_groups_setting", typ_kwargs={"flags": {"required": True}}) + + recovery_groups_setting = _builder.get(".properties.recoveryGroupsSetting") + if recovery_groups_setting is not None: + recovery_groups_setting.set_prop("additionalGroups", AAZListType, ".additional_groups") + _CreateHelper._build_schema_recovery_group_create(recovery_groups_setting.set_prop("defaultGroup", AAZObjectType, ".default_group", typ_kwargs={"flags": {"required": True}})) + + additional_groups = _builder.get(".properties.recoveryGroupsSetting.additionalGroups") + if additional_groups is not None: + _CreateHelper._build_schema_recovery_group_create(additional_groups.set_elements(AAZObjectType, ".")) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.identity = AAZIdentityObjectType() + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_system_data_read(_schema_on_200_201.system_data) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200_201.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200_201.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200_201.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = cls._schema_on_200_201.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = cls._schema_on_200_201.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = cls._schema_on_200_201.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + _CreateHelper._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = cls._schema_on_200_201.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + _CreateHelper._build_schema_recovery_group_read(additional_groups.Element) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + @classmethod + def _build_schema_recovery_group_base_action_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("description", AAZStrType, ".description") + _builder.set_prop("name", AAZStrType, ".name", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("timeoutInMinutes", AAZIntType, ".timeout_in_minutes", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("type", "CustomRunbook", AAZStrType, ".custom_runbook", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("type", "ManualAction", AAZStrType, ".manual_action", typ_kwargs={"flags": {"required": True}}) + _builder.discriminate_by("type", "CustomRunbook") + _builder.discriminate_by("type", "ManualAction") + + disc_custom_runbook = _builder.get("{type:CustomRunbook}") + if disc_custom_runbook is not None: + disc_custom_runbook.set_prop("actionResourceId", AAZStrType, ".custom_runbook.action_resource_id") + disc_custom_runbook.set_prop("associatedIdentity", AAZObjectType, ".custom_runbook.associated_identity") + disc_custom_runbook.set_prop("parameters", AAZDictType, ".custom_runbook.parameters") + + associated_identity = _builder.get("{type:CustomRunbook}.associatedIdentity") + if associated_identity is not None: + associated_identity.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + associated_identity.set_prop("userAssignedIdentity", AAZStrType, ".user_assigned_identity") + + parameters = _builder.get("{type:CustomRunbook}.parameters") + if parameters is not None: + parameters.set_elements(AAZStrType, ".") + + @classmethod + def _build_schema_recovery_group_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("description", AAZStrType, ".description", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("groupUniqueId", AAZStrType, ".group_unique_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("orderId", AAZIntType, ".order_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("postActions", AAZListType, ".post_actions") + properties.set_prop("preActions", AAZListType, ".pre_actions") + + post_actions = _builder.get(".properties.postActions") + if post_actions is not None: + cls._build_schema_recovery_group_base_action_create(post_actions.set_elements(AAZObjectType, ".")) + + pre_actions = _builder.get(".properties.preActions") + if pre_actions is not None: + cls._build_schema_recovery_group_base_action_create(pre_actions.set_elements(AAZObjectType, ".")) + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_delete.py new file mode 100644 index 00000000000..c0f699b5e23 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_delete.py @@ -0,0 +1,163 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete a RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlansDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class RecoveryPlansDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover.py new file mode 100644 index 00000000000..c3841bec749 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover.py @@ -0,0 +1,272 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan failover", +) +class Failover(AAZCommand): + """This action triggers the failover operation on the recovery orchestration plan for the qualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/failover", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.failover_direction = AAZStrArg( + options=["--failover-direction"], + arg_group="Body", + help="Type of Failover direction.", + required=True, + enum={"FromSpecificLocations": "FromSpecificLocations"}, + ) + _args_schema.failover_request_properties = AAZObjectArg( + options=["--failover-request-properties"], + arg_group="Body", + help="Additional properties for Failover.", + ) + + failover_request_properties = cls._args_schema.failover_request_properties + failover_request_properties.execution_configurations = AAZObjectArg( + options=["execution-configurations"], + help="Execution configurations for the recovery action.", + ) + failover_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources based on the source location(s) will be processed.", + ) + failover_request_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Source locations from where resources to be failed-over.", + required=True, + ) + + execution_configurations = cls._args_schema.failover_request_properties.execution_configurations + execution_configurations.user_consent = AAZStrArg( + options=["user-consent"], + help="User consent for performing recovery action.", + required=True, + enum={"Allowed": "Allowed", "Unspecified": "Unspecified"}, + ) + + selected_resource_ids = cls._args_schema.failover_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + + source_locations = cls._args_schema.failover_request_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsFailover(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsFailover(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/failover", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("failoverDirection", AAZStrType, ".failover_direction", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("failoverRequestProperties", AAZObjectType, ".failover_request_properties") + + failover_request_properties = _builder.get(".failoverRequestProperties") + if failover_request_properties is not None: + failover_request_properties.set_prop("executionConfigurations", AAZObjectType, ".execution_configurations") + failover_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + failover_request_properties.set_prop("sourceLocations", AAZListType, ".source_locations", typ_kwargs={"flags": {"required": True}}) + + execution_configurations = _builder.get(".failoverRequestProperties.executionConfigurations") + if execution_configurations is not None: + execution_configurations.set_prop("userConsent", AAZStrType, ".user_consent", typ_kwargs={"flags": {"required": True}}) + + selected_resource_ids = _builder.get(".failoverRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + source_locations = _builder.get(".failoverRequestProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _FailoverHelper: + """Helper class for Failover""" + + +__all__ = ["Failover"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover_commit.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover_commit.py new file mode 100644 index 00000000000..da267b9bd38 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_failover_commit.py @@ -0,0 +1,194 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan failover-commit", +) +class FailoverCommit(AAZCommand): + """This action triggers the failover commit operation on the recovery orchestration plan for the qualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/failovercommit", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsFailoverCommit(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsFailoverCommit(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/failoverCommit", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _FailoverCommitHelper: + """Helper class for FailoverCommit""" + + +__all__ = ["FailoverCommit"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_finalize.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_finalize.py new file mode 100644 index 00000000000..8c92b43b3e2 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_finalize.py @@ -0,0 +1,261 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan finalize", +) +class Finalize(AAZCommand): + """This action finalizes the recovery orchestration plan, ensuring all necessary configurations are in place. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/finalize", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsFinalize(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsFinalize(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/finalize", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _FinalizeHelper._build_schema_error_response_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _FinalizeHelper: + """Helper class for Finalize""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType() + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_error_response_read = None + + @classmethod + def _build_schema_error_response_read(cls, _schema): + if cls._schema_error_response_read is not None: + _schema.error = cls._schema_error_response_read.error + return + + cls._schema_error_response_read = _schema_error_response_read = AAZObjectType() + + error_response_read = _schema_error_response_read + error_response_read.error = AAZObjectType() + cls._build_schema_error_detail_read(error_response_read.error) + + _schema.error = cls._schema_error_response_read.error + + +__all__ = ["Finalize"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_list.py new file mode 100644 index 00000000000..4aa53a72af7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_list.py @@ -0,0 +1,558 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan list", +) +class List(AAZCommand): + """List RecoveryPlan resources by tenant + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class RecoveryPlansList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.identity = AAZIdentityObjectType() + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _ListHelper._build_schema_system_data_read(_element.system_data) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.value.Element.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.value.Element.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.value.Element.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = cls._schema_on_200.value.Element.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = cls._schema_on_200.value.Element.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = cls._schema_on_200.value.Element.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + _ListHelper._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = cls._schema_on_200.value.Element.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + _ListHelper._build_schema_recovery_group_read(additional_groups.Element) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_reprotect.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_reprotect.py new file mode 100644 index 00000000000..c5de28a2e0f --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_reprotect.py @@ -0,0 +1,234 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan reprotect", +) +class Reprotect(AAZCommand): + """This action triggers the reprotect operation on the recovery orchestration plan for the qualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/reprotect", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.reprotect_request_properties = AAZObjectArg( + options=["--reprotect-request-properties"], + arg_group="Body", + help="Additional properties for Reprotect.", + ) + + reprotect_request_properties = cls._args_schema.reprotect_request_properties + reprotect_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources will be processed.", + ) + + selected_resource_ids = cls._args_schema.reprotect_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsReprotect(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsReprotect(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/reprotect", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"client_flatten": True}} + ) + _builder.set_prop("reprotectRequestProperties", AAZObjectType, ".reprotect_request_properties") + + reprotect_request_properties = _builder.get(".reprotectRequestProperties") + if reprotect_request_properties is not None: + reprotect_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + + selected_resource_ids = _builder.get(".reprotectRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _ReprotectHelper: + """Helper class for Reprotect""" + + +__all__ = ["Reprotect"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_show.py new file mode 100644 index 00000000000..c299b4c81f6 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_show.py @@ -0,0 +1,539 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan show", +) +class Show(AAZCommand): + """Get a RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_system_data_read(_schema_on_200.system_data) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = cls._schema_on_200.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = cls._schema_on_200.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = cls._schema_on_200.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + _ShowHelper._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = cls._schema_on_200.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + _ShowHelper._build_schema_recovery_group_read(additional_groups.Element) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover.py new file mode 100644 index 00000000000..27cf5e86612 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover.py @@ -0,0 +1,272 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan test-failover", +) +class TestFailover(AAZCommand): + """This action triggers the test failover operation on the recovery orchestration plan for the qualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/testfailover", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.failover_direction = AAZStrArg( + options=["--failover-direction"], + arg_group="Body", + help="Type of Failover direction.", + required=True, + enum={"FromSpecificLocations": "FromSpecificLocations"}, + ) + _args_schema.failover_request_properties = AAZObjectArg( + options=["--failover-request-properties"], + arg_group="Body", + help="Additional properties for Failover.", + ) + + failover_request_properties = cls._args_schema.failover_request_properties + failover_request_properties.execution_configurations = AAZObjectArg( + options=["execution-configurations"], + help="Execution configurations for the recovery action.", + ) + failover_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources based on the source location(s) will be processed.", + ) + failover_request_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Source locations from where resources to be failed-over.", + required=True, + ) + + execution_configurations = cls._args_schema.failover_request_properties.execution_configurations + execution_configurations.user_consent = AAZStrArg( + options=["user-consent"], + help="User consent for performing recovery action.", + required=True, + enum={"Allowed": "Allowed", "Unspecified": "Unspecified"}, + ) + + selected_resource_ids = cls._args_schema.failover_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + + source_locations = cls._args_schema.failover_request_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsTestFailover(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsTestFailover(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/testFailover", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("failoverDirection", AAZStrType, ".failover_direction", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("failoverRequestProperties", AAZObjectType, ".failover_request_properties") + + failover_request_properties = _builder.get(".failoverRequestProperties") + if failover_request_properties is not None: + failover_request_properties.set_prop("executionConfigurations", AAZObjectType, ".execution_configurations") + failover_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + failover_request_properties.set_prop("sourceLocations", AAZListType, ".source_locations", typ_kwargs={"flags": {"required": True}}) + + execution_configurations = _builder.get(".failoverRequestProperties.executionConfigurations") + if execution_configurations is not None: + execution_configurations.set_prop("userConsent", AAZStrType, ".user_consent", typ_kwargs={"flags": {"required": True}}) + + selected_resource_ids = _builder.get(".failoverRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + source_locations = _builder.get(".failoverRequestProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _TestFailoverHelper: + """Helper class for TestFailover""" + + +__all__ = ["TestFailover"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover_cleanup.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover_cleanup.py new file mode 100644 index 00000000000..6d9f6e7b2bf --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_test_failover_cleanup.py @@ -0,0 +1,220 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan test-failover-cleanup", +) +class TestFailoverCleanup(AAZCommand): + """This action triggers the test failover cleanup operation on the recovery orchestration plan for the qualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/testfailovercleanup", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.comments = AAZStrArg( + options=["--comments"], + arg_group="Body", + help="Comments for test failover cleanup.", + fmt=AAZStrArgFormat( + max_length=1024, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsTestFailoverCleanup(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsTestFailoverCleanup(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/testFailoverCleanup", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("comments", AAZStrType, ".comments") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.job_id = AAZStrType( + serialized_name="jobId", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _TestFailoverCleanupHelper: + """Helper class for TestFailoverCleanup""" + + +__all__ = ["TestFailoverCleanup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update.py new file mode 100644 index 00000000000..d96e6f68c27 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update.py @@ -0,0 +1,972 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan update", +) +class Update(AAZCommand): + """Update a RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Identity" + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.plan_description = AAZStrArg( + options=["--plan-description"], + arg_group="Properties", + help="A description of the recovery orchestration plan.", + fmt=AAZStrArgFormat( + max_length=50, + min_length=5, + ), + ) + _args_schema.recovery_groups_setting = AAZObjectArg( + options=["--recovery-groups-setting"], + arg_group="Properties", + help="Settings for the recovery orchestration groups associated with the recovery orchestration plan.", + ) + + recovery_groups_setting = cls._args_schema.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListArg( + options=["additional-groups"], + help="Additional recovery orchestration group settings.", + nullable=True, + fmt=AAZListArgFormat( + max_length=14, + ), + ) + recovery_groups_setting.default_group = AAZObjectArg( + options=["default-group"], + help="The default recovery orchestration group setting. Every recovery orchestration plan has a default recovery orchestration group.", + ) + cls._build_args_recovery_group_update(recovery_groups_setting.default_group) + + additional_groups = cls._args_schema.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectArg() + cls._build_args_recovery_group_update(additional_groups.Element) + return cls._args_schema + + _args_recovery_group_base_action_update = None + + @classmethod + def _build_args_recovery_group_base_action_update(cls, _schema): + if cls._args_recovery_group_base_action_update is not None: + _schema.custom_runbook = cls._args_recovery_group_base_action_update.custom_runbook + _schema.description = cls._args_recovery_group_base_action_update.description + _schema.manual_action = cls._args_recovery_group_base_action_update.manual_action + _schema.name = cls._args_recovery_group_base_action_update.name + _schema.timeout_in_minutes = cls._args_recovery_group_base_action_update.timeout_in_minutes + return + + cls._args_recovery_group_base_action_update = AAZObjectArg( + nullable=True, + ) + + recovery_group_base_action_update = cls._args_recovery_group_base_action_update + recovery_group_base_action_update.custom_runbook = AAZObjectArg( + options=["custom-runbook"], + ) + recovery_group_base_action_update.manual_action = AAZObjectArg( + options=["manual-action"], + blank={}, + ) + recovery_group_base_action_update.description = AAZStrArg( + options=["description"], + help="A description of the recovery orchestration group action, containing the instructions to be performed during this action.", + nullable=True, + fmt=AAZStrArgFormat( + max_length=100, + ), + ) + recovery_group_base_action_update.name = AAZStrArg( + options=["name"], + help="The name of the recovery orchestration group action.", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + recovery_group_base_action_update.timeout_in_minutes = AAZIntArg( + options=["timeout-in-minutes"], + help="The maximum amount of time, in minutes, allowed for the action to complete before it times out.", + fmt=AAZIntArgFormat( + maximum=10000, + minimum=0, + ), + ) + + custom_runbook = cls._args_recovery_group_base_action_update.custom_runbook + custom_runbook.action_resource_id = AAZResourceIdArg( + options=["action-resource-id"], + help="The ARM Resource ID of the resource that includes the actionable script, such as a Runbook in an Automation Account.", + nullable=True, + ) + custom_runbook.associated_identity = AAZObjectArg( + options=["associated-identity"], + help="The identity associated with actionResourceId for RBAC.", + nullable=True, + ) + custom_runbook.parameters = AAZDictArg( + options=["parameters"], + help="Key-value parameters for the operation.", + nullable=True, + ) + + associated_identity = cls._args_recovery_group_base_action_update.custom_runbook.associated_identity + associated_identity.type = AAZStrArg( + options=["type"], + help="Identity type linked with the resource", + enum={"None": "None", "SystemAssigned": "SystemAssigned", "SystemAssigned,UserAssigned": "SystemAssigned,UserAssigned", "UserAssigned": "UserAssigned"}, + ) + associated_identity.user_assigned_identity = AAZResourceIdArg( + options=["user-assigned-identity"], + help="User assigned identity id linked with the resource", + nullable=True, + ) + + parameters = cls._args_recovery_group_base_action_update.custom_runbook.parameters + parameters.Element = AAZStrArg( + nullable=True, + ) + + _schema.custom_runbook = cls._args_recovery_group_base_action_update.custom_runbook + _schema.description = cls._args_recovery_group_base_action_update.description + _schema.manual_action = cls._args_recovery_group_base_action_update.manual_action + _schema.name = cls._args_recovery_group_base_action_update.name + _schema.timeout_in_minutes = cls._args_recovery_group_base_action_update.timeout_in_minutes + + _args_recovery_group_update = None + + @classmethod + def _build_args_recovery_group_update(cls, _schema): + if cls._args_recovery_group_update is not None: + _schema.description = cls._args_recovery_group_update.description + _schema.group_unique_id = cls._args_recovery_group_update.group_unique_id + _schema.order_id = cls._args_recovery_group_update.order_id + _schema.post_actions = cls._args_recovery_group_update.post_actions + _schema.pre_actions = cls._args_recovery_group_update.pre_actions + return + + cls._args_recovery_group_update = AAZObjectArg() + + recovery_group_update = cls._args_recovery_group_update + recovery_group_update.description = AAZStrArg( + options=["description"], + help="A description of the recovery orchestration group.", + fmt=AAZStrArgFormat( + max_length=50, + min_length=5, + ), + ) + recovery_group_update.group_unique_id = AAZStrArg( + options=["group-unique-id"], + help="A unique id for the recovery orchestration group, which is a GUID.", + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + recovery_group_update.order_id = AAZIntArg( + options=["order-id"], + help="The order ID of the recovery orchestration group.", + fmt=AAZIntArgFormat( + maximum=15, + minimum=0, + ), + ) + recovery_group_update.post_actions = AAZListArg( + options=["post-actions"], + help="Post-actions for the recovery orchestration group.", + nullable=True, + fmt=AAZListArgFormat( + max_length=10, + ), + ) + recovery_group_update.pre_actions = AAZListArg( + options=["pre-actions"], + help="Pre-actions for the recovery orchestration group.", + nullable=True, + fmt=AAZListArgFormat( + max_length=10, + ), + ) + + post_actions = cls._args_recovery_group_update.post_actions + post_actions.Element = AAZObjectArg( + nullable=True, + ) + cls._build_args_recovery_group_base_action_update(post_actions.Element) + + pre_actions = cls._args_recovery_group_update.pre_actions + pre_actions.Element = AAZObjectArg( + nullable=True, + ) + cls._build_args_recovery_group_base_action_update(pre_actions.Element) + + _schema.description = cls._args_recovery_group_update.description + _schema.group_unique_id = cls._args_recovery_group_update.group_unique_id + _schema.order_id = cls._args_recovery_group_update.order_id + _schema.post_actions = cls._args_recovery_group_update.post_actions + _schema.pre_actions = cls._args_recovery_group_update.pre_actions + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.RecoveryPlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_recovery_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + class RecoveryPlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_recovery_plan_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("planDescription", AAZStrType, ".plan_description", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("recoveryGroupsSetting", AAZObjectType, ".recovery_groups_setting", typ_kwargs={"flags": {"required": True}}) + + recovery_groups_setting = _builder.get(".properties.recoveryGroupsSetting") + if recovery_groups_setting is not None: + recovery_groups_setting.set_prop("additionalGroups", AAZListType, ".additional_groups") + _UpdateHelper._build_schema_recovery_group_update(recovery_groups_setting.set_prop("defaultGroup", AAZObjectType, ".default_group", typ_kwargs={"flags": {"required": True}})) + + additional_groups = _builder.get(".properties.recoveryGroupsSetting.additionalGroups") + if additional_groups is not None: + _UpdateHelper._build_schema_recovery_group_update(additional_groups.set_elements(AAZObjectType, ".")) + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + @classmethod + def _build_schema_recovery_group_base_action_update(cls, _builder): + if _builder is None: + return + _builder.set_prop("description", AAZStrType, ".description") + _builder.set_prop("name", AAZStrType, ".name", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("timeoutInMinutes", AAZIntType, ".timeout_in_minutes", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("type", "CustomRunbook", AAZStrType, ".custom_runbook", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("type", "ManualAction", AAZStrType, ".manual_action", typ_kwargs={"flags": {"required": True}}) + _builder.discriminate_by("type", "CustomRunbook") + _builder.discriminate_by("type", "ManualAction") + + disc_custom_runbook = _builder.get("{type:CustomRunbook}") + if disc_custom_runbook is not None: + disc_custom_runbook.set_prop("actionResourceId", AAZStrType, ".custom_runbook.action_resource_id") + disc_custom_runbook.set_prop("associatedIdentity", AAZObjectType, ".custom_runbook.associated_identity") + disc_custom_runbook.set_prop("parameters", AAZDictType, ".custom_runbook.parameters") + + associated_identity = _builder.get("{type:CustomRunbook}.associatedIdentity") + if associated_identity is not None: + associated_identity.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + associated_identity.set_prop("userAssignedIdentity", AAZStrType, ".user_assigned_identity") + + parameters = _builder.get("{type:CustomRunbook}.parameters") + if parameters is not None: + parameters.set_elements(AAZStrType, ".") + + @classmethod + def _build_schema_recovery_group_update(cls, _builder): + if _builder is None: + return + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("description", AAZStrType, ".description", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("groupUniqueId", AAZStrType, ".group_unique_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("orderId", AAZIntType, ".order_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("postActions", AAZListType, ".post_actions") + properties.set_prop("preActions", AAZListType, ".pre_actions") + + post_actions = _builder.get(".properties.postActions") + if post_actions is not None: + cls._build_schema_recovery_group_base_action_update(post_actions.set_elements(AAZObjectType, ".")) + + pre_actions = _builder.get(".properties.preActions") + if pre_actions is not None: + cls._build_schema_recovery_group_base_action_update(pre_actions.set_elements(AAZObjectType, ".")) + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_recovery_plan_read = None + + @classmethod + def _build_schema_recovery_plan_read(cls, _schema): + if cls._schema_recovery_plan_read is not None: + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + return + + cls._schema_recovery_plan_read = _schema_recovery_plan_read = AAZObjectType() + + recovery_plan_read = _schema_recovery_plan_read + recovery_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.identity = AAZIdentityObjectType() + recovery_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.properties = AAZObjectType() + recovery_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_plan_read.system_data) + recovery_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_recovery_plan_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_recovery_plan_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_recovery_plan_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_recovery_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = _schema_recovery_plan_read.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = _schema_recovery_plan_read.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = _schema_recovery_plan_read.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + cls._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = _schema_recovery_plan_read.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + cls._build_schema_recovery_group_read(additional_groups.Element) + + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update_resource.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update_resource.py new file mode 100644 index 00000000000..cc8cc1ea076 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_update_resource.py @@ -0,0 +1,800 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan update-resource", +) +class UpdateResource(AAZCommand): + """This action adds or updates the resources to be included in the recovery orchestration plan. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/updateresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.resources_to_remove = AAZListArg( + options=["--resources-to-remove"], + arg_group="Body", + help="A list of recovery orchestration resources that need to be removed from the recovery orchestration plan.", + ) + _args_schema.resources_to_update = AAZListArg( + options=["--resources-to-update"], + arg_group="Body", + help="A list of recovery orchestration resources whose properties need to be updated.", + ) + + resources_to_remove = cls._args_schema.resources_to_remove + resources_to_remove.Element = AAZResourceIdArg() + + resources_to_update = cls._args_schema.resources_to_update + resources_to_update.Element = AAZObjectArg() + + _element = cls._args_schema.resources_to_update.Element + _element.associated_identity = AAZObjectArg( + options=["associated-identity"], + help="Identity details associated to the resource, which will be used for performing any operations on it", + ) + _element.inclusion_state = AAZStrArg( + options=["inclusion-state"], + help="A state that indicates the resource status with respect to the recovery orchestration plan.", + enum={"Excluded": "Excluded", "Included": "Included"}, + ) + _element.recovery_group_id = AAZStrArg( + options=["recovery-group-id"], + help="The recovery orchestration group id associated with the recovery resources.", + fmt=AAZStrArgFormat( + pattern="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _element.recovery_resource_unique_id = AAZStrArg( + options=["recovery-resource-unique-id"], + help="A unique id for the recovery resource, which is a GUID.", + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _element.selected_protection_solution_setting = AAZObjectArg( + options=["selected-protection-solution-setting"], + help="Resource protection solution settings of the protection solutions recovery orchestration resource is protected with.", + ) + _element.selected_protection_solution_type = AAZStrArg( + options=["selected-protection-solution-type"], + help="A setting that indicates the protection solution selected.", + enum={"AzureNative": "AzureNative", "AzureSiteRecovery": "AzureSiteRecovery", "CrossZoneVMRecovery": "CrossZoneVMRecovery", "CustomRunbook": "CustomRunbook", "None": "None"}, + ) + + associated_identity = cls._args_schema.resources_to_update.Element.associated_identity + associated_identity.type = AAZStrArg( + options=["type"], + help="Identity type linked with the resource", + required=True, + enum={"None": "None", "SystemAssigned": "SystemAssigned", "SystemAssigned,UserAssigned": "SystemAssigned,UserAssigned", "UserAssigned": "UserAssigned"}, + ) + associated_identity.user_assigned_identity = AAZResourceIdArg( + options=["user-assigned-identity"], + help="User assigned identity id linked with the resource", + ) + + selected_protection_solution_setting = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting + selected_protection_solution_setting.azure_native = AAZObjectArg( + options=["azure-native"], + blank={}, + ) + selected_protection_solution_setting.azure_site_recovery = AAZObjectArg( + options=["azure-site-recovery"], + ) + selected_protection_solution_setting.cross_zone_vm_recovery = AAZObjectArg( + options=["cross-zone-vm-recovery"], + ) + selected_protection_solution_setting.custom_runbook = AAZObjectArg( + options=["custom-runbook"], + ) + + azure_site_recovery = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery + azure_site_recovery.reprotect_params = AAZObjectArg( + options=["reprotect-params"], + help="Reprotect params for azure site recovery solution.", + ) + azure_site_recovery.test_failover_cleanup_params = AAZObjectArg( + options=["test-failover-cleanup-params"], + help="Test failover params for azure site recovery solution.", + ) + azure_site_recovery.test_failover_params = AAZObjectArg( + options=["test-failover-params"], + help="Test failover params for azure site recovery solution.", + ) + + reprotect_params = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery.reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListArg( + options=["disk-reprotect-input-details"], + help="Disk Reprotect Input Details", + ) + + disk_reprotect_input_details = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery.reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectArg() + + _element = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery.reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZResourceIdArg( + options=["disk-resource-id"], + help="Disk Resource Id to Reprotect", + ) + _element.staging_storage_account_resource_id = AAZResourceIdArg( + options=["staging-storage-account-resource-id"], + help="The staging StorageAccount Resource Id.", + ) + + test_failover_cleanup_params = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery.test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrArg( + options=["comments"], + help="Comments for testfailover cleanup", + ) + + test_failover_params = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.azure_site_recovery.test_failover_params + test_failover_params.network_resource_id = AAZResourceIdArg( + options=["network-resource-id"], + help="The Azure network resource is which will be used for test failover virtual machine.", + ) + + cross_zone_vm_recovery = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.cross_zone_vm_recovery + cross_zone_vm_recovery.capacity_reservation_group_id = AAZResourceIdArg( + options=["capacity-reservation-group-id"], + help="ARM resource ID of the Capacity Reservation Group (in the same subscription as the VM) to use when moving the VM to the target zone.", + ) + cross_zone_vm_recovery.target_zone = AAZStrArg( + options=["target-zone"], + help="Customer-requested logical target availability zone for zonal failover (a positive availability-zone id, e.g. \"1\", \"2\", \"3\"; additional zones are accepted where the region exposes them). Always optional; when omitted the service selects a healthy zone. Immutable per failover.", + ) + + custom_runbook = cls._args_schema.resources_to_update.Element.selected_protection_solution_setting.custom_runbook + custom_runbook.failover_action = AAZObjectArg( + options=["failover-action"], + help="The Azure resource ID hosting the failover automation script.", + ) + cls._build_args_resource_custom_protection_action_create(custom_runbook.failover_action) + custom_runbook.failover_commit_action = AAZObjectArg( + options=["failover-commit-action"], + help="The Azure resource ID hosting the failover commit automation script.", + ) + cls._build_args_resource_custom_protection_action_create(custom_runbook.failover_commit_action) + custom_runbook.reprotect_action = AAZObjectArg( + options=["reprotect-action"], + help="The Azure resource ID hosting the reprotect automation script.", + ) + cls._build_args_resource_custom_protection_action_create(custom_runbook.reprotect_action) + custom_runbook.test_failover_action = AAZObjectArg( + options=["test-failover-action"], + help="The Azure resource ID hosting the test failover automation script.", + ) + cls._build_args_resource_custom_protection_action_create(custom_runbook.test_failover_action) + custom_runbook.test_failover_cleanup_action = AAZObjectArg( + options=["test-failover-cleanup-action"], + help="The Azure resource ID hosting the test failover cleanup automation script.", + ) + cls._build_args_resource_custom_protection_action_create(custom_runbook.test_failover_cleanup_action) + return cls._args_schema + + _args_resource_custom_protection_action_create = None + + @classmethod + def _build_args_resource_custom_protection_action_create(cls, _schema): + if cls._args_resource_custom_protection_action_create is not None: + _schema.resource_id = cls._args_resource_custom_protection_action_create.resource_id + return + + cls._args_resource_custom_protection_action_create = AAZObjectArg() + + resource_custom_protection_action_create = cls._args_resource_custom_protection_action_create + resource_custom_protection_action_create.resource_id = AAZResourceIdArg( + options=["resource-id"], + help="The Azure resource ID hosting the custom action automation script.", + required=True, + ) + + _schema.resource_id = cls._args_resource_custom_protection_action_create.resource_id + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsUpdateResources(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsUpdateResources(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/updateResources", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("resourcesToRemove", AAZListType, ".resources_to_remove") + _builder.set_prop("resourcesToUpdate", AAZListType, ".resources_to_update") + + resources_to_remove = _builder.get(".resourcesToRemove") + if resources_to_remove is not None: + resources_to_remove.set_elements(AAZStrType, ".") + + resources_to_update = _builder.get(".resourcesToUpdate") + if resources_to_update is not None: + resources_to_update.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".resourcesToUpdate[]") + if _elements is not None: + _elements.set_prop("properties", AAZObjectType) + + properties = _builder.get(".resourcesToUpdate[].properties") + if properties is not None: + properties.set_prop("associatedIdentity", AAZObjectType, ".associated_identity") + properties.set_prop("inclusionState", AAZStrType, ".inclusion_state") + properties.set_prop("recoveryGroupId", AAZStrType, ".recovery_group_id") + properties.set_prop("recoveryResourceUniqueId", AAZStrType, ".recovery_resource_unique_id", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("selectedProtectionSolutionSetting", AAZObjectType, ".selected_protection_solution_setting") + properties.set_prop("selectedProtectionSolutionType", AAZStrType, ".selected_protection_solution_type") + + associated_identity = _builder.get(".resourcesToUpdate[].properties.associatedIdentity") + if associated_identity is not None: + associated_identity.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + associated_identity.set_prop("userAssignedIdentity", AAZStrType, ".user_assigned_identity") + + selected_protection_solution_setting = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting") + if selected_protection_solution_setting is not None: + selected_protection_solution_setting.set_const("protectionSolutionType", "AzureNative", AAZStrType, ".azure_native", typ_kwargs={"flags": {"required": True}}) + selected_protection_solution_setting.set_const("protectionSolutionType", "AzureSiteRecovery", AAZStrType, ".azure_site_recovery", typ_kwargs={"flags": {"required": True}}) + selected_protection_solution_setting.set_const("protectionSolutionType", "CrossZoneVMRecovery", AAZStrType, ".cross_zone_vm_recovery", typ_kwargs={"flags": {"required": True}}) + selected_protection_solution_setting.set_const("protectionSolutionType", "CustomRunbook", AAZStrType, ".custom_runbook", typ_kwargs={"flags": {"required": True}}) + selected_protection_solution_setting.discriminate_by("protectionSolutionType", "AzureNative") + selected_protection_solution_setting.discriminate_by("protectionSolutionType", "AzureSiteRecovery") + selected_protection_solution_setting.discriminate_by("protectionSolutionType", "CrossZoneVMRecovery") + selected_protection_solution_setting.discriminate_by("protectionSolutionType", "CustomRunbook") + + disc_azure_site_recovery = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}") + if disc_azure_site_recovery is not None: + disc_azure_site_recovery.set_prop("reprotectParams", AAZObjectType, ".azure_site_recovery.reprotect_params") + disc_azure_site_recovery.set_prop("testFailoverCleanupParams", AAZObjectType, ".azure_site_recovery.test_failover_cleanup_params") + disc_azure_site_recovery.set_prop("testFailoverParams", AAZObjectType, ".azure_site_recovery.test_failover_params") + + reprotect_params = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}.reprotectParams") + if reprotect_params is not None: + reprotect_params.set_prop("diskReprotectInputDetails", AAZListType, ".disk_reprotect_input_details") + + disk_reprotect_input_details = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}.reprotectParams.diskReprotectInputDetails") + if disk_reprotect_input_details is not None: + disk_reprotect_input_details.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}.reprotectParams.diskReprotectInputDetails[]") + if _elements is not None: + _elements.set_prop("diskResourceId", AAZStrType, ".disk_resource_id") + _elements.set_prop("stagingStorageAccountResourceId", AAZStrType, ".staging_storage_account_resource_id") + + test_failover_cleanup_params = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}.testFailoverCleanupParams") + if test_failover_cleanup_params is not None: + test_failover_cleanup_params.set_prop("comments", AAZStrType, ".comments") + + test_failover_params = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:AzureSiteRecovery}.testFailoverParams") + if test_failover_params is not None: + test_failover_params.set_prop("networkResourceId", AAZStrType, ".network_resource_id") + + disc_cross_zone_vm_recovery = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:CrossZoneVMRecovery}") + if disc_cross_zone_vm_recovery is not None: + disc_cross_zone_vm_recovery.set_prop("capacityReservationGroupId", AAZStrType, ".cross_zone_vm_recovery.capacity_reservation_group_id") + disc_cross_zone_vm_recovery.set_prop("targetZone", AAZStrType, ".cross_zone_vm_recovery.target_zone") + + disc_custom_runbook = _builder.get(".resourcesToUpdate[].properties.selectedProtectionSolutionSetting{protectionSolutionType:CustomRunbook}") + if disc_custom_runbook is not None: + _UpdateResourceHelper._build_schema_resource_custom_protection_action_create(disc_custom_runbook.set_prop("failoverAction", AAZObjectType, ".custom_runbook.failover_action")) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_create(disc_custom_runbook.set_prop("failoverCommitAction", AAZObjectType, ".custom_runbook.failover_commit_action")) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_create(disc_custom_runbook.set_prop("reprotectAction", AAZObjectType, ".custom_runbook.reprotect_action")) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_create(disc_custom_runbook.set_prop("testFailoverAction", AAZObjectType, ".custom_runbook.test_failover_action")) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_create(disc_custom_runbook.set_prop("testFailoverCleanupAction", AAZObjectType, ".custom_runbook.test_failover_cleanup_action")) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.failed_resources = AAZListType( + serialized_name="failedResources", + ) + + failed_resources = cls._schema_on_200.failed_resources + failed_resources.Element = AAZObjectType() + + _element = cls._schema_on_200.failed_resources.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.failed_resources.Element.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _UpdateResourceHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.failed_resources.Element.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.failed_resources.Element.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.failed_resources.Element.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.failed_resources.Element.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.failed_resources.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _UpdateResourceHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.failed_resources.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _UpdateResourceHelper: + """Helper class for UpdateResource""" + + @classmethod + def _build_schema_resource_custom_protection_action_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("resourceId", AAZStrType, ".resource_id", typ_kwargs={"flags": {"required": True}}) + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + +__all__ = ["UpdateResource"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover.py new file mode 100644 index 00000000000..09a82f2272c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover.py @@ -0,0 +1,689 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-failover", +) +class ValidateForFailover(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for failover operation, ensuring it meets the necessary criteria and provides a list of qualified and unqualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validateforfailover", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.failover_direction = AAZStrArg( + options=["--failover-direction"], + arg_group="Body", + help="Type of Failover direction.", + required=True, + enum={"FromSpecificLocations": "FromSpecificLocations"}, + ) + _args_schema.failover_request_properties = AAZObjectArg( + options=["--failover-request-properties"], + arg_group="Body", + help="Additional properties for Failover.", + ) + + failover_request_properties = cls._args_schema.failover_request_properties + failover_request_properties.execution_configurations = AAZObjectArg( + options=["execution-configurations"], + help="Execution configurations for the recovery action.", + ) + failover_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources based on the source location(s) will be processed.", + ) + failover_request_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Source locations from where resources to be failed-over.", + required=True, + ) + + execution_configurations = cls._args_schema.failover_request_properties.execution_configurations + execution_configurations.user_consent = AAZStrArg( + options=["user-consent"], + help="User consent for performing recovery action.", + required=True, + enum={"Allowed": "Allowed", "Unspecified": "Unspecified"}, + ) + + selected_resource_ids = cls._args_schema.failover_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + + source_locations = cls._args_schema.failover_request_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForFailover(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForFailover(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForFailover", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("failoverDirection", AAZStrType, ".failover_direction", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("failoverRequestProperties", AAZObjectType, ".failover_request_properties") + + failover_request_properties = _builder.get(".failoverRequestProperties") + if failover_request_properties is not None: + failover_request_properties.set_prop("executionConfigurations", AAZObjectType, ".execution_configurations") + failover_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + failover_request_properties.set_prop("sourceLocations", AAZListType, ".source_locations", typ_kwargs={"flags": {"required": True}}) + + execution_configurations = _builder.get(".failoverRequestProperties.executionConfigurations") + if execution_configurations is not None: + execution_configurations.set_prop("userConsent", AAZStrType, ".user_consent", typ_kwargs={"flags": {"required": True}}) + + selected_resource_ids = _builder.get(".failoverRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + source_locations = _builder.get(".failoverRequestProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.recovery_resource_qualifications = AAZListType( + serialized_name="recoveryResourceQualifications", + flags={"required": True}, + ) + + recovery_resource_qualifications = cls._schema_on_200.recovery_resource_qualifications + recovery_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element + _element.operation_qualification_details = AAZObjectType( + serialized_name="operationQualificationDetails", + flags={"required": True}, + ) + _element.recovery_resource = AAZObjectType( + serialized_name="recoveryResource", + flags={"required": True}, + ) + + operation_qualification_details = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details + operation_qualification_details.not_qualified_reasons = AAZListType( + serialized_name="notQualifiedReasons", + ) + operation_qualification_details.qualification_state = AAZStrType( + serialized_name="qualificationState", + flags={"required": True}, + ) + operation_qualification_details.resource_feasibility_reviews = AAZListType( + serialized_name="resourceFeasibilityReviews", + ) + + not_qualified_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.not_qualified_reasons + not_qualified_reasons.Element = AAZStrType() + + resource_feasibility_reviews = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews + resource_feasibility_reviews.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element + _element.current_target_sku = AAZObjectType( + serialized_name="currentTargetSku", + ) + _ValidateForFailoverHelper._build_schema_sku_details_read(_element.current_target_sku) + _element.feasibility_type = AAZStrType( + serialized_name="feasibilityType", + flags={"required": True}, + ) + _element.recommended_target_skus = AAZListType( + serialized_name="recommendedTargetSkus", + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + _element.status = AAZStrType( + flags={"required": True}, + ) + + recommended_target_skus = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element.recommended_target_skus + recommended_target_skus.Element = AAZObjectType() + _ValidateForFailoverHelper._build_schema_sku_details_read(recommended_target_skus.Element) + + recovery_resource = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource + recovery_resource.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.properties = AAZObjectType() + recovery_resource.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + recovery_resource.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ValidateForFailoverHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ValidateForFailoverHelper: + """Helper class for ValidateForFailover""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + _schema_sku_details_read = None + + @classmethod + def _build_schema_sku_details_read(cls, _schema): + if cls._schema_sku_details_read is not None: + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + return + + cls._schema_sku_details_read = _schema_sku_details_read = AAZObjectType() + + sku_details_read = _schema_sku_details_read + sku_details_read.currency = AAZStrType() + sku_details_read.monthly_price = AAZFloatType( + serialized_name="monthlyPrice", + ) + sku_details_read.offering_id = AAZStrType( + serialized_name="offeringId", + ) + sku_details_read.ram = AAZIntType() + sku_details_read.sku = AAZStrType( + flags={"required": True}, + ) + sku_details_read.v_cpu = AAZIntType( + serialized_name="vCpu", + ) + + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + + +__all__ = ["ValidateForFailover"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover_commit.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover_commit.py new file mode 100644 index 00000000000..8ea59e5b6cb --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_failover_commit.py @@ -0,0 +1,611 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-failover-commit", +) +class ValidateForFailoverCommit(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for failover commit operation, ensuring it meets the necessary criteria and provides a list of qualified and unqualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validateforfailovercommit", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForFailoverCommit(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForFailoverCommit(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForFailoverCommit", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.recovery_resource_qualifications = AAZListType( + serialized_name="recoveryResourceQualifications", + flags={"required": True}, + ) + + recovery_resource_qualifications = cls._schema_on_200.recovery_resource_qualifications + recovery_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element + _element.operation_qualification_details = AAZObjectType( + serialized_name="operationQualificationDetails", + flags={"required": True}, + ) + _element.recovery_resource = AAZObjectType( + serialized_name="recoveryResource", + flags={"required": True}, + ) + + operation_qualification_details = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details + operation_qualification_details.not_qualified_reasons = AAZListType( + serialized_name="notQualifiedReasons", + ) + operation_qualification_details.qualification_state = AAZStrType( + serialized_name="qualificationState", + flags={"required": True}, + ) + operation_qualification_details.resource_feasibility_reviews = AAZListType( + serialized_name="resourceFeasibilityReviews", + ) + + not_qualified_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.not_qualified_reasons + not_qualified_reasons.Element = AAZStrType() + + resource_feasibility_reviews = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews + resource_feasibility_reviews.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element + _element.current_target_sku = AAZObjectType( + serialized_name="currentTargetSku", + ) + _ValidateForFailoverCommitHelper._build_schema_sku_details_read(_element.current_target_sku) + _element.feasibility_type = AAZStrType( + serialized_name="feasibilityType", + flags={"required": True}, + ) + _element.recommended_target_skus = AAZListType( + serialized_name="recommendedTargetSkus", + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + _element.status = AAZStrType( + flags={"required": True}, + ) + + recommended_target_skus = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element.recommended_target_skus + recommended_target_skus.Element = AAZObjectType() + _ValidateForFailoverCommitHelper._build_schema_sku_details_read(recommended_target_skus.Element) + + recovery_resource = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource + recovery_resource.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.properties = AAZObjectType() + recovery_resource.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + recovery_resource.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ValidateForFailoverCommitHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForFailoverCommitHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForFailoverCommitHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForFailoverCommitHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForFailoverCommitHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForFailoverCommitHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ValidateForFailoverCommitHelper: + """Helper class for ValidateForFailoverCommit""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + _schema_sku_details_read = None + + @classmethod + def _build_schema_sku_details_read(cls, _schema): + if cls._schema_sku_details_read is not None: + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + return + + cls._schema_sku_details_read = _schema_sku_details_read = AAZObjectType() + + sku_details_read = _schema_sku_details_read + sku_details_read.currency = AAZStrType() + sku_details_read.monthly_price = AAZFloatType( + serialized_name="monthlyPrice", + ) + sku_details_read.offering_id = AAZStrType( + serialized_name="offeringId", + ) + sku_details_read.ram = AAZIntType() + sku_details_read.sku = AAZStrType( + flags={"required": True}, + ) + sku_details_read.v_cpu = AAZIntType( + serialized_name="vCpu", + ) + + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + + +__all__ = ["ValidateForFailoverCommit"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_operation.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_operation.py new file mode 100644 index 00000000000..15b9a106760 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_operation.py @@ -0,0 +1,286 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-operation", +) +class ValidateForOperation(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for operations like failover and reprotect, ensuring it meets the necessary criteria. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validateforoperation", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.operation_name = AAZStrArg( + options=["--operation-name"], + arg_group="Body", + help="Operation Name to validate.", + required=True, + enum={"Failover": "Failover", "FailoverCommit": "FailoverCommit", "Reprotect": "Reprotect", "TestFailover": "TestFailover", "TestFailoverCleanup": "TestFailoverCleanup"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForOperation(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForOperation(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForOperation", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("operationName", AAZStrType, ".operation_name", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _ValidateForOperationHelper._build_schema_error_response_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _ValidateForOperationHelper: + """Helper class for ValidateForOperation""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType() + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_error_response_read = None + + @classmethod + def _build_schema_error_response_read(cls, _schema): + if cls._schema_error_response_read is not None: + _schema.error = cls._schema_error_response_read.error + return + + cls._schema_error_response_read = _schema_error_response_read = AAZObjectType() + + error_response_read = _schema_error_response_read + error_response_read.error = AAZObjectType() + cls._build_schema_error_detail_read(error_response_read.error) + + _schema.error = cls._schema_error_response_read.error + + +__all__ = ["ValidateForOperation"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_reprotect.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_reprotect.py new file mode 100644 index 00000000000..f4184dee688 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_reprotect.py @@ -0,0 +1,651 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-reprotect", +) +class ValidateForReprotect(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for reprotect operation, ensuring it meets the necessary criteria and provides a list of qualified and unqualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validateforreprotect", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.reprotect_request_properties = AAZObjectArg( + options=["--reprotect-request-properties"], + arg_group="Body", + help="Additional properties for Reprotect.", + ) + + reprotect_request_properties = cls._args_schema.reprotect_request_properties + reprotect_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources will be processed.", + ) + + selected_resource_ids = cls._args_schema.reprotect_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForReprotect(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForReprotect(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForReprotect", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"client_flatten": True}} + ) + _builder.set_prop("reprotectRequestProperties", AAZObjectType, ".reprotect_request_properties") + + reprotect_request_properties = _builder.get(".reprotectRequestProperties") + if reprotect_request_properties is not None: + reprotect_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + + selected_resource_ids = _builder.get(".reprotectRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.recovery_resource_qualifications = AAZListType( + serialized_name="recoveryResourceQualifications", + flags={"required": True}, + ) + + recovery_resource_qualifications = cls._schema_on_200.recovery_resource_qualifications + recovery_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element + _element.operation_qualification_details = AAZObjectType( + serialized_name="operationQualificationDetails", + flags={"required": True}, + ) + _element.recovery_resource = AAZObjectType( + serialized_name="recoveryResource", + flags={"required": True}, + ) + + operation_qualification_details = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details + operation_qualification_details.not_qualified_reasons = AAZListType( + serialized_name="notQualifiedReasons", + ) + operation_qualification_details.qualification_state = AAZStrType( + serialized_name="qualificationState", + flags={"required": True}, + ) + operation_qualification_details.resource_feasibility_reviews = AAZListType( + serialized_name="resourceFeasibilityReviews", + ) + + not_qualified_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.not_qualified_reasons + not_qualified_reasons.Element = AAZStrType() + + resource_feasibility_reviews = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews + resource_feasibility_reviews.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element + _element.current_target_sku = AAZObjectType( + serialized_name="currentTargetSku", + ) + _ValidateForReprotectHelper._build_schema_sku_details_read(_element.current_target_sku) + _element.feasibility_type = AAZStrType( + serialized_name="feasibilityType", + flags={"required": True}, + ) + _element.recommended_target_skus = AAZListType( + serialized_name="recommendedTargetSkus", + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + _element.status = AAZStrType( + flags={"required": True}, + ) + + recommended_target_skus = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element.recommended_target_skus + recommended_target_skus.Element = AAZObjectType() + _ValidateForReprotectHelper._build_schema_sku_details_read(recommended_target_skus.Element) + + recovery_resource = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource + recovery_resource.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.properties = AAZObjectType() + recovery_resource.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + recovery_resource.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ValidateForReprotectHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForReprotectHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForReprotectHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForReprotectHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForReprotectHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForReprotectHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ValidateForReprotectHelper: + """Helper class for ValidateForReprotect""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + _schema_sku_details_read = None + + @classmethod + def _build_schema_sku_details_read(cls, _schema): + if cls._schema_sku_details_read is not None: + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + return + + cls._schema_sku_details_read = _schema_sku_details_read = AAZObjectType() + + sku_details_read = _schema_sku_details_read + sku_details_read.currency = AAZStrType() + sku_details_read.monthly_price = AAZFloatType( + serialized_name="monthlyPrice", + ) + sku_details_read.offering_id = AAZStrType( + serialized_name="offeringId", + ) + sku_details_read.ram = AAZIntType() + sku_details_read.sku = AAZStrType( + flags={"required": True}, + ) + sku_details_read.v_cpu = AAZIntType( + serialized_name="vCpu", + ) + + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + + +__all__ = ["ValidateForReprotect"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover.py new file mode 100644 index 00000000000..fca1d3e1113 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover.py @@ -0,0 +1,689 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-test-failover", +) +class ValidateForTestFailover(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for test failover operation, ensuring it meets the necessary criteria and provides a list of qualified and unqualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validatefortestfailover", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.failover_direction = AAZStrArg( + options=["--failover-direction"], + arg_group="Body", + help="Type of Failover direction.", + required=True, + enum={"FromSpecificLocations": "FromSpecificLocations"}, + ) + _args_schema.failover_request_properties = AAZObjectArg( + options=["--failover-request-properties"], + arg_group="Body", + help="Additional properties for Failover.", + ) + + failover_request_properties = cls._args_schema.failover_request_properties + failover_request_properties.execution_configurations = AAZObjectArg( + options=["execution-configurations"], + help="Execution configurations for the recovery action.", + ) + failover_request_properties.selected_resource_ids = AAZListArg( + options=["selected-resource-ids"], + help="Selected recovery resource Ids to be processed. If not provided, all qualified resources based on the source location(s) will be processed.", + ) + failover_request_properties.source_locations = AAZListArg( + options=["source-locations"], + help="Source locations from where resources to be failed-over.", + required=True, + ) + + execution_configurations = cls._args_schema.failover_request_properties.execution_configurations + execution_configurations.user_consent = AAZStrArg( + options=["user-consent"], + help="User consent for performing recovery action.", + required=True, + enum={"Allowed": "Allowed", "Unspecified": "Unspecified"}, + ) + + selected_resource_ids = cls._args_schema.failover_request_properties.selected_resource_ids + selected_resource_ids.Element = AAZResourceIdArg() + + source_locations = cls._args_schema.failover_request_properties.source_locations + source_locations.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForTestFailover(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForTestFailover(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForTestFailover", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("failoverDirection", AAZStrType, ".failover_direction", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("failoverRequestProperties", AAZObjectType, ".failover_request_properties") + + failover_request_properties = _builder.get(".failoverRequestProperties") + if failover_request_properties is not None: + failover_request_properties.set_prop("executionConfigurations", AAZObjectType, ".execution_configurations") + failover_request_properties.set_prop("selectedResourceIds", AAZListType, ".selected_resource_ids") + failover_request_properties.set_prop("sourceLocations", AAZListType, ".source_locations", typ_kwargs={"flags": {"required": True}}) + + execution_configurations = _builder.get(".failoverRequestProperties.executionConfigurations") + if execution_configurations is not None: + execution_configurations.set_prop("userConsent", AAZStrType, ".user_consent", typ_kwargs={"flags": {"required": True}}) + + selected_resource_ids = _builder.get(".failoverRequestProperties.selectedResourceIds") + if selected_resource_ids is not None: + selected_resource_ids.set_elements(AAZStrType, ".") + + source_locations = _builder.get(".failoverRequestProperties.sourceLocations") + if source_locations is not None: + source_locations.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.recovery_resource_qualifications = AAZListType( + serialized_name="recoveryResourceQualifications", + flags={"required": True}, + ) + + recovery_resource_qualifications = cls._schema_on_200.recovery_resource_qualifications + recovery_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element + _element.operation_qualification_details = AAZObjectType( + serialized_name="operationQualificationDetails", + flags={"required": True}, + ) + _element.recovery_resource = AAZObjectType( + serialized_name="recoveryResource", + flags={"required": True}, + ) + + operation_qualification_details = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details + operation_qualification_details.not_qualified_reasons = AAZListType( + serialized_name="notQualifiedReasons", + ) + operation_qualification_details.qualification_state = AAZStrType( + serialized_name="qualificationState", + flags={"required": True}, + ) + operation_qualification_details.resource_feasibility_reviews = AAZListType( + serialized_name="resourceFeasibilityReviews", + ) + + not_qualified_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.not_qualified_reasons + not_qualified_reasons.Element = AAZStrType() + + resource_feasibility_reviews = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews + resource_feasibility_reviews.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element + _element.current_target_sku = AAZObjectType( + serialized_name="currentTargetSku", + ) + _ValidateForTestFailoverHelper._build_schema_sku_details_read(_element.current_target_sku) + _element.feasibility_type = AAZStrType( + serialized_name="feasibilityType", + flags={"required": True}, + ) + _element.recommended_target_skus = AAZListType( + serialized_name="recommendedTargetSkus", + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + _element.status = AAZStrType( + flags={"required": True}, + ) + + recommended_target_skus = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element.recommended_target_skus + recommended_target_skus.Element = AAZObjectType() + _ValidateForTestFailoverHelper._build_schema_sku_details_read(recommended_target_skus.Element) + + recovery_resource = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource + recovery_resource.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.properties = AAZObjectType() + recovery_resource.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + recovery_resource.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ValidateForTestFailoverHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForTestFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForTestFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForTestFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForTestFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForTestFailoverHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ValidateForTestFailoverHelper: + """Helper class for ValidateForTestFailover""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + _schema_sku_details_read = None + + @classmethod + def _build_schema_sku_details_read(cls, _schema): + if cls._schema_sku_details_read is not None: + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + return + + cls._schema_sku_details_read = _schema_sku_details_read = AAZObjectType() + + sku_details_read = _schema_sku_details_read + sku_details_read.currency = AAZStrType() + sku_details_read.monthly_price = AAZFloatType( + serialized_name="monthlyPrice", + ) + sku_details_read.offering_id = AAZStrType( + serialized_name="offeringId", + ) + sku_details_read.ram = AAZIntType() + sku_details_read.sku = AAZStrType( + flags={"required": True}, + ) + sku_details_read.v_cpu = AAZIntType( + serialized_name="vCpu", + ) + + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + + +__all__ = ["ValidateForTestFailover"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover_cleanup.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover_cleanup.py new file mode 100644 index 00000000000..27983ec7479 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_validate_for_test_failover_cleanup.py @@ -0,0 +1,611 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan validate-for-test-failover-cleanup", +) +class ValidateForTestFailoverCleanup(AAZCommand): + """This action checks if the recovery orchestration plan is eligible for test failover cleanup operation, ensuring it meets the necessary criteria and provides a list of qualified and unqualified resources. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/validatefortestfailovercleanup", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryPlanActionsValidateForTestFailoverCleanup(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryPlanActionsValidateForTestFailoverCleanup(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/validateForTestFailoverCleanup", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.recovery_resource_qualifications = AAZListType( + serialized_name="recoveryResourceQualifications", + flags={"required": True}, + ) + + recovery_resource_qualifications = cls._schema_on_200.recovery_resource_qualifications + recovery_resource_qualifications.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element + _element.operation_qualification_details = AAZObjectType( + serialized_name="operationQualificationDetails", + flags={"required": True}, + ) + _element.recovery_resource = AAZObjectType( + serialized_name="recoveryResource", + flags={"required": True}, + ) + + operation_qualification_details = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details + operation_qualification_details.not_qualified_reasons = AAZListType( + serialized_name="notQualifiedReasons", + ) + operation_qualification_details.qualification_state = AAZStrType( + serialized_name="qualificationState", + flags={"required": True}, + ) + operation_qualification_details.resource_feasibility_reviews = AAZListType( + serialized_name="resourceFeasibilityReviews", + ) + + not_qualified_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.not_qualified_reasons + not_qualified_reasons.Element = AAZStrType() + + resource_feasibility_reviews = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews + resource_feasibility_reviews.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element + _element.current_target_sku = AAZObjectType( + serialized_name="currentTargetSku", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_sku_details_read(_element.current_target_sku) + _element.feasibility_type = AAZStrType( + serialized_name="feasibilityType", + flags={"required": True}, + ) + _element.recommended_target_skus = AAZListType( + serialized_name="recommendedTargetSkus", + ) + _element.resource_type = AAZStrType( + serialized_name="resourceType", + flags={"required": True}, + ) + _element.status = AAZStrType( + flags={"required": True}, + ) + + recommended_target_skus = cls._schema_on_200.recovery_resource_qualifications.Element.operation_qualification_details.resource_feasibility_reviews.Element.recommended_target_skus + recommended_target_skus.Element = AAZObjectType() + _ValidateForTestFailoverCleanupHelper._build_schema_sku_details_read(recommended_target_skus.Element) + + recovery_resource = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource + recovery_resource.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_resource.properties = AAZObjectType() + recovery_resource.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + recovery_resource.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ValidateForTestFailoverCleanupHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ValidateForTestFailoverCleanupHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.recovery_resource_qualifications.Element.recovery_resource.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ValidateForTestFailoverCleanupHelper: + """Helper class for ValidateForTestFailoverCleanup""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + _schema_sku_details_read = None + + @classmethod + def _build_schema_sku_details_read(cls, _schema): + if cls._schema_sku_details_read is not None: + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + return + + cls._schema_sku_details_read = _schema_sku_details_read = AAZObjectType() + + sku_details_read = _schema_sku_details_read + sku_details_read.currency = AAZStrType() + sku_details_read.monthly_price = AAZFloatType( + serialized_name="monthlyPrice", + ) + sku_details_read.offering_id = AAZStrType( + serialized_name="offeringId", + ) + sku_details_read.ram = AAZIntType() + sku_details_read.sku = AAZStrType( + flags={"required": True}, + ) + sku_details_read.v_cpu = AAZIntType( + serialized_name="vCpu", + ) + + _schema.currency = cls._schema_sku_details_read.currency + _schema.monthly_price = cls._schema_sku_details_read.monthly_price + _schema.offering_id = cls._schema_sku_details_read.offering_id + _schema.ram = cls._schema_sku_details_read.ram + _schema.sku = cls._schema_sku_details_read.sku + _schema.v_cpu = cls._schema_sku_details_read.v_cpu + + +__all__ = ["ValidateForTestFailoverCleanup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_wait.py new file mode 100644 index 00000000000..129fb75796d --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/_wait.py @@ -0,0 +1,538 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_system_data_read(_schema_on_200.system_data) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = cls._schema_on_200.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = cls._schema_on_200.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = cls._schema_on_200.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + _WaitHelper._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = cls._schema_on_200.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + _WaitHelper._build_schema_recovery_group_read(additional_groups.Element) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__cmd_group.py new file mode 100644 index 00000000000..93ba87a291b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience recovery-plan identity", +) +class __CMDGroup(AAZCommandGroup): + """Manage Identity + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__init__.py new file mode 100644 index 00000000000..3a074471e35 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/__init__.py @@ -0,0 +1,15 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._assign import * +from ._remove import * +from ._show import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_assign.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_assign.py new file mode 100644 index 00000000000..f3e2477b922 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_assign.py @@ -0,0 +1,733 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan identity assign", +) +class Assign(AAZCommand): + """Assign the user or system managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview", "identity"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Resource.identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Resource.identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Resource.identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.selectors.subresource.get()) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.post_instance_update(self.ctx.selectors.subresource.get()) + yield self.RecoveryPlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.get(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _AssignHelper._build_schema_recovery_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + class RecoveryPlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _AssignHelper._build_schema_recovery_plan_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.selectors.subresource.get()) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZIdentityObjectType + ) + _builder.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "assign"}}) + _builder.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "assign"}}) + + user_assigned = _builder.get(".userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + return _instance_value + + +class _AssignHelper: + """Helper class for Assign""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_recovery_plan_read = None + + @classmethod + def _build_schema_recovery_plan_read(cls, _schema): + if cls._schema_recovery_plan_read is not None: + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + return + + cls._schema_recovery_plan_read = _schema_recovery_plan_read = AAZObjectType() + + recovery_plan_read = _schema_recovery_plan_read + recovery_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.identity = AAZIdentityObjectType() + recovery_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.properties = AAZObjectType() + recovery_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_plan_read.system_data) + recovery_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_recovery_plan_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_recovery_plan_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_recovery_plan_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_recovery_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = _schema_recovery_plan_read.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = _schema_recovery_plan_read.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = _schema_recovery_plan_read.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + cls._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = _schema_recovery_plan_read.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + cls._build_schema_recovery_group_read(additional_groups.Element) + + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Assign"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_remove.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_remove.py new file mode 100644 index 00000000000..e6e6c5e3eb2 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_remove.py @@ -0,0 +1,733 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan identity remove", +) +class Remove(AAZCommand): + """Remove the user or system managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview", "identity"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Resource.identity" + + _args_schema = cls._args_schema + _args_schema.mi_system_assigned = AAZStrArg( + options=["--system-assigned", "--mi-system-assigned"], + arg_group="Resource.identity", + help="Set the system managed identity.", + blank="True", + ) + _args_schema.mi_user_assigned = AAZListArg( + options=["--user-assigned", "--mi-user-assigned"], + arg_group="Resource.identity", + help="Set the user managed identities.", + blank=[], + ) + + mi_user_assigned = cls._args_schema.mi_user_assigned + mi_user_assigned.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.selectors.subresource.get()) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.post_instance_update(self.ctx.selectors.subresource.get()) + yield self.RecoveryPlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.get(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _RemoveHelper._build_schema_recovery_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + class RecoveryPlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _RemoveHelper._build_schema_recovery_plan_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.selectors.subresource.get()) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZIdentityObjectType + ) + _builder.set_prop("userAssigned", AAZListType, ".mi_user_assigned", typ_kwargs={"flags": {"action": "remove"}}) + _builder.set_prop("systemAssigned", AAZStrType, ".mi_system_assigned", typ_kwargs={"flags": {"action": "remove"}}) + + user_assigned = _builder.get(".userAssigned") + if user_assigned is not None: + user_assigned.set_elements(AAZStrType, ".") + + return _instance_value + + +class _RemoveHelper: + """Helper class for Remove""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_recovery_plan_read = None + + @classmethod + def _build_schema_recovery_plan_read(cls, _schema): + if cls._schema_recovery_plan_read is not None: + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + return + + cls._schema_recovery_plan_read = _schema_recovery_plan_read = AAZObjectType() + + recovery_plan_read = _schema_recovery_plan_read + recovery_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.identity = AAZIdentityObjectType() + recovery_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.properties = AAZObjectType() + recovery_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_plan_read.system_data) + recovery_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_recovery_plan_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_recovery_plan_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_recovery_plan_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_recovery_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = _schema_recovery_plan_read.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = _schema_recovery_plan_read.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = _schema_recovery_plan_read.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + cls._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = _schema_recovery_plan_read.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + cls._build_schema_recovery_group_read(additional_groups.Element) + + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Remove"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_show.py new file mode 100644 index 00000000000..8c66d1b2dec --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_show.py @@ -0,0 +1,574 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan identity show", +) +class Show(AAZCommand): + """Show the details of managed identities. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview", "identity"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self.SubresourceSelector(ctx=self.ctx, name="subresource") + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.selectors.subresource.required(), client_flatten=True) + return result + + class SubresourceSelector(AAZJsonSelector): + + def _get(self): + result = self.ctx.vars.instance + return result.identity + + def _set(self, value): + result = self.ctx.vars.instance + result.identity = value + return + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _ShowHelper._build_schema_recovery_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_recovery_plan_read = None + + @classmethod + def _build_schema_recovery_plan_read(cls, _schema): + if cls._schema_recovery_plan_read is not None: + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + return + + cls._schema_recovery_plan_read = _schema_recovery_plan_read = AAZObjectType() + + recovery_plan_read = _schema_recovery_plan_read + recovery_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.identity = AAZIdentityObjectType() + recovery_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.properties = AAZObjectType() + recovery_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_plan_read.system_data) + recovery_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_recovery_plan_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_recovery_plan_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_recovery_plan_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_recovery_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = _schema_recovery_plan_read.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = _schema_recovery_plan_read.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = _schema_recovery_plan_read.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + cls._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = _schema_recovery_plan_read.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + cls._build_schema_recovery_group_read(additional_groups.Element) + + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_wait.py new file mode 100644 index 00000000000..9394aa2980a --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/identity/_wait.py @@ -0,0 +1,561 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan identity wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}", "2026-08-31-preview", "identity"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryPlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class RecoveryPlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _WaitHelper._build_schema_recovery_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_recovery_group_base_action_read = None + + @classmethod + def _build_schema_recovery_group_base_action_read(cls, _schema): + if cls._schema_recovery_group_base_action_read is not None: + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + return + + cls._schema_recovery_group_base_action_read = _schema_recovery_group_base_action_read = AAZObjectType() + + recovery_group_base_action_read = _schema_recovery_group_base_action_read + recovery_group_base_action_read.description = AAZStrType() + recovery_group_base_action_read.name = AAZStrType( + flags={"required": True}, + ) + recovery_group_base_action_read.timeout_in_minutes = AAZIntType( + serialized_name="timeoutInMinutes", + flags={"required": True}, + ) + recovery_group_base_action_read.type = AAZStrType( + flags={"required": True}, + ) + + disc_custom_runbook = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook") + disc_custom_runbook.action_resource_id = AAZStrType( + serialized_name="actionResourceId", + ) + disc_custom_runbook.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + disc_custom_runbook.parameters = AAZDictType() + + associated_identity = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + parameters = _schema_recovery_group_base_action_read.discriminate_by("type", "CustomRunbook").parameters + parameters.Element = AAZStrType() + + _schema.description = cls._schema_recovery_group_base_action_read.description + _schema.name = cls._schema_recovery_group_base_action_read.name + _schema.timeout_in_minutes = cls._schema_recovery_group_base_action_read.timeout_in_minutes + _schema.type = cls._schema_recovery_group_base_action_read.type + _schema.discriminate_by( + "type", + "CustomRunbook", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "CustomRunbook", + ) + ) + _schema.discriminate_by( + "type", + "ManualAction", + cls._schema_recovery_group_base_action_read.discriminate_by( + "type", + "ManualAction", + ) + ) + + _schema_recovery_group_read = None + + @classmethod + def _build_schema_recovery_group_read(cls, _schema): + if cls._schema_recovery_group_read is not None: + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + return + + cls._schema_recovery_group_read = _schema_recovery_group_read = AAZObjectType() + + recovery_group_read = _schema_recovery_group_read + recovery_group_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_group_read.properties = AAZObjectType() + recovery_group_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_group_read.system_data) + recovery_group_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_recovery_group_read.properties + properties.description = AAZStrType( + flags={"required": True}, + ) + properties.group_unique_id = AAZStrType( + serialized_name="groupUniqueId", + flags={"required": True}, + ) + properties.order_id = AAZIntType( + serialized_name="orderId", + flags={"required": True}, + ) + properties.post_actions = AAZListType( + serialized_name="postActions", + ) + properties.pre_actions = AAZListType( + serialized_name="preActions", + ) + + post_actions = _schema_recovery_group_read.properties.post_actions + post_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(post_actions.Element) + + pre_actions = _schema_recovery_group_read.properties.pre_actions + pre_actions.Element = AAZObjectType() + cls._build_schema_recovery_group_base_action_read(pre_actions.Element) + + _schema.id = cls._schema_recovery_group_read.id + _schema.name = cls._schema_recovery_group_read.name + _schema.properties = cls._schema_recovery_group_read.properties + _schema.system_data = cls._schema_recovery_group_read.system_data + _schema.type = cls._schema_recovery_group_read.type + + _schema_recovery_plan_read = None + + @classmethod + def _build_schema_recovery_plan_read(cls, _schema): + if cls._schema_recovery_plan_read is not None: + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + return + + cls._schema_recovery_plan_read = _schema_recovery_plan_read = AAZObjectType() + + recovery_plan_read = _schema_recovery_plan_read + recovery_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.identity = AAZIdentityObjectType() + recovery_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + recovery_plan_read.properties = AAZObjectType() + recovery_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + cls._build_schema_system_data_read(recovery_plan_read.system_data) + recovery_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_recovery_plan_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_recovery_plan_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_recovery_plan_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_recovery_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.latest_failover_status = AAZObjectType( + serialized_name="latestFailoverStatus", + flags={"read_only": True}, + ) + properties.latest_validation_status = AAZObjectType( + serialized_name="latestValidationStatus", + flags={"read_only": True}, + ) + properties.plan_description = AAZStrType( + serialized_name="planDescription", + flags={"required": True}, + ) + properties.plan_state = AAZStrType( + serialized_name="planState", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_groups_setting = AAZObjectType( + serialized_name="recoveryGroupsSetting", + flags={"required": True}, + ) + + latest_failover_status = _schema_recovery_plan_read.properties.latest_failover_status + latest_failover_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_failover_status.error_details) + latest_failover_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_failover_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + latest_failover_status.recovery_time_actual = AAZStrType( + serialized_name="recoveryTimeActual", + flags={"read_only": True}, + ) + + latest_validation_status = _schema_recovery_plan_read.properties.latest_validation_status + latest_validation_status.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(latest_validation_status.error_details) + latest_validation_status.last_executed_at = AAZStrType( + serialized_name="lastExecutedAt", + flags={"read_only": True}, + ) + latest_validation_status.operation_status = AAZStrType( + serialized_name="operationStatus", + flags={"read_only": True}, + ) + + recovery_groups_setting = _schema_recovery_plan_read.properties.recovery_groups_setting + recovery_groups_setting.additional_groups = AAZListType( + serialized_name="additionalGroups", + ) + recovery_groups_setting.default_group = AAZObjectType( + serialized_name="defaultGroup", + flags={"required": True}, + ) + cls._build_schema_recovery_group_read(recovery_groups_setting.default_group) + + additional_groups = _schema_recovery_plan_read.properties.recovery_groups_setting.additional_groups + additional_groups.Element = AAZObjectType() + cls._build_schema_recovery_group_read(additional_groups.Element) + + _schema.id = cls._schema_recovery_plan_read.id + _schema.identity = cls._schema_recovery_plan_read.identity + _schema.name = cls._schema_recovery_plan_read.name + _schema.properties = cls._schema_recovery_plan_read.properties + _schema.system_data = cls._schema_recovery_plan_read.system_data + _schema.type = cls._schema_recovery_plan_read.type + + _schema_system_data_read = None + + @classmethod + def _build_schema_system_data_read(cls, _schema): + if cls._schema_system_data_read is not None: + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + return + + cls._schema_system_data_read = _schema_system_data_read = AAZObjectType( + flags={"read_only": True} + ) + + system_data_read = _schema_system_data_read + system_data_read.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data_read.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data_read.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data_read.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data_read.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data_read.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.created_at = cls._schema_system_data_read.created_at + _schema.created_by = cls._schema_system_data_read.created_by + _schema.created_by_type = cls._schema_system_data_read.created_by_type + _schema.last_modified_at = cls._schema_system_data_read.last_modified_at + _schema.last_modified_by = cls._schema_system_data_read.last_modified_by + _schema.last_modified_by_type = cls._schema_system_data_read.last_modified_by_type + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__cmd_group.py new file mode 100644 index 00000000000..99757665b0c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience recovery-plan recovery-job", +) +class __CMDGroup(AAZCommandGroup): + """Manage Recovery Job + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__init__.py new file mode 100644 index 00000000000..a68e28be5ef --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/__init__.py @@ -0,0 +1,16 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._cancel import * +from ._list import * +from ._resume import * +from ._retry import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_cancel.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_cancel.py new file mode 100644 index 00000000000..64954e55852 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_cancel.py @@ -0,0 +1,299 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job cancel", +) +class Cancel(AAZCommand): + """This action attempts to cancel the ongoing recovery orchestration job. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}/cancel", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.description = AAZStrArg( + options=["--description"], + arg_group="Body", + help="User-provided input for the action.", + fmt=AAZStrArgFormat( + max_length=100, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryJobsCancel(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryJobsCancel(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}/cancel", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("description", AAZStrType, ".description") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _CancelHelper._build_schema_error_response_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _CancelHelper: + """Helper class for Cancel""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType() + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_error_response_read = None + + @classmethod + def _build_schema_error_response_read(cls, _schema): + if cls._schema_error_response_read is not None: + _schema.error = cls._schema_error_response_read.error + return + + cls._schema_error_response_read = _schema_error_response_read = AAZObjectType() + + error_response_read = _schema_error_response_read + error_response_read.error = AAZObjectType() + cls._build_schema_error_detail_read(error_response_read.error) + + _schema.error = cls._schema_error_response_read.error + + +__all__ = ["Cancel"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_list.py new file mode 100644 index 00000000000..83d70f80ac6 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_list.py @@ -0,0 +1,500 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job list", +) +class List(AAZCommand): + """List RecoveryJob resources by RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryJobsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class RecoveryJobsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ListHelper._build_schema_job_error_info_read(properties.error_details) + properties.execution_configurations = AAZObjectType( + serialized_name="executionConfigurations", + flags={"read_only": True}, + ) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_type = AAZStrType( + serialized_name="jobType", + flags={"read_only": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.triggered_by = AAZStrType( + serialized_name="triggeredBy", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + execution_configurations = cls._schema_on_200.value.Element.properties.execution_configurations + execution_configurations.user_consent = AAZStrType( + serialized_name="userConsent", + flags={"required": True}, + ) + + job_extended_info = cls._schema_on_200.value.Element.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.value.Element.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ListHelper._build_schema_job_task_detail_read(tasks_list.Element) + + retry_details = cls._schema_on_200.value.Element.properties.retry_details + retry_details.Element = AAZObjectType() + _ListHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.value.Element.properties.user_comments + user_comments.Element = AAZObjectType() + _ListHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_resume.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_resume.py new file mode 100644 index 00000000000..4b15083941c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_resume.py @@ -0,0 +1,299 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job resume", +) +class Resume(AAZCommand): + """This action resumes the ongoing recovery orchestration job that was paused for required user intervention. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}/resume", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + + # define Arg Group "Body" + + _args_schema = cls._args_schema + _args_schema.description = AAZStrArg( + options=["--description"], + arg_group="Body", + help="User-provided input for the action.", + fmt=AAZStrArgFormat( + max_length=100, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryJobsResume(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryJobsResume(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}/resume", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("description", AAZStrType, ".description") + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _ResumeHelper._build_schema_error_response_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _ResumeHelper: + """Helper class for Resume""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType() + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_error_response_read = None + + @classmethod + def _build_schema_error_response_read(cls, _schema): + if cls._schema_error_response_read is not None: + _schema.error = cls._schema_error_response_read.error + return + + cls._schema_error_response_read = _schema_error_response_read = AAZObjectType() + + error_response_read = _schema_error_response_read + error_response_read.error = AAZObjectType() + cls._build_schema_error_detail_read(error_response_read.error) + + _schema.error = cls._schema_error_response_read.error + + +__all__ = ["Resume"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_retry.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_retry.py new file mode 100644 index 00000000000..52836a1c6a7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_retry.py @@ -0,0 +1,273 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job retry", +) +class Retry(AAZCommand): + """This action retries the ongoing recovery orchestration job for resources that failed in previous attempts. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}/retry", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.operation_id = AAZStrArg( + options=["--operation-id"], + help="A GUID that represents the Long Running OperationId.", + required=True, + ) + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.RecoveryJobsRetry(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryJobsRetry(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}/retry", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "operation-id", self.ctx.args.operation_id, + required=True, + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _RetryHelper._build_schema_error_response_read(cls._schema_on_200) + + return cls._schema_on_200 + + +class _RetryHelper: + """Helper class for Retry""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType() + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_error_response_read = None + + @classmethod + def _build_schema_error_response_read(cls, _schema): + if cls._schema_error_response_read is not None: + _schema.error = cls._schema_error_response_read.error + return + + cls._schema_error_response_read = _schema_error_response_read = AAZObjectType() + + error_response_read = _schema_error_response_read + error_response_read.error = AAZObjectType() + cls._build_schema_error_detail_read(error_response_read.error) + + _schema.error = cls._schema_error_response_read.error + + +__all__ = ["Retry"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_show.py new file mode 100644 index 00000000000..f6a7cb54039 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/_show.py @@ -0,0 +1,499 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job show", +) +class Show(AAZCommand): + """Get a RecoveryJob + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryJobsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryJobsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ShowHelper._build_schema_job_error_info_read(properties.error_details) + properties.execution_configurations = AAZObjectType( + serialized_name="executionConfigurations", + flags={"read_only": True}, + ) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_type = AAZStrType( + serialized_name="jobType", + flags={"read_only": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.triggered_by = AAZStrType( + serialized_name="triggeredBy", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + execution_configurations = cls._schema_on_200.properties.execution_configurations + execution_configurations.user_consent = AAZStrType( + serialized_name="userConsent", + flags={"required": True}, + ) + + job_extended_info = cls._schema_on_200.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ShowHelper._build_schema_job_task_detail_read(tasks_list.Element) + + retry_details = cls._schema_on_200.properties.retry_details + retry_details.Element = AAZObjectType() + _ShowHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.properties.user_comments + user_comments.Element = AAZObjectType() + _ShowHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__cmd_group.py new file mode 100644 index 00000000000..6d28902e42f --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience recovery-plan recovery-job recovery-job-resource", +) +class __CMDGroup(AAZCommandGroup): + """Manage Recovery Job Resource + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_list.py new file mode 100644 index 00000000000..0aa16b6aa41 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_list.py @@ -0,0 +1,540 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job recovery-job-resource list", +) +class List(AAZCommand): + """List RecoveryJobResource resources by RecoveryJob + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}/recoveryjobresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryJobResourcesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class RecoveryJobResourcesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}/recoveryJobResources", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ListHelper._build_schema_job_error_info_read(properties.error_details) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + properties.job_resource_type = AAZStrType( + serialized_name="jobResourceType", + flags={"required": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_action_settings = AAZObjectType( + serialized_name="recoveryGroupActionSettings", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + properties.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + job_extended_info = cls._schema_on_200.value.Element.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.value.Element.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ListHelper._build_schema_job_task_detail_read(tasks_list.Element) + + recovery_group_action_settings = cls._schema_on_200.value.Element.properties.recovery_group_action_settings + recovery_group_action_settings.action_description = AAZStrType( + serialized_name="actionDescription", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_name = AAZStrType( + serialized_name="actionName", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_sequence = AAZIntType( + serialized_name="actionSequence", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_task = AAZStrType( + serialized_name="actionTask", + flags={"read_only": True}, + ) + recovery_group_action_settings.recovery_group_action_type = AAZStrType( + serialized_name="recoveryGroupActionType", + flags={"read_only": True}, + ) + + retry_details = cls._schema_on_200.value.Element.properties.retry_details + retry_details.Element = AAZObjectType() + _ListHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.value.Element.properties.user_comments + user_comments.Element = AAZObjectType() + _ListHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_show.py new file mode 100644 index 00000000000..1419deec63f --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_job/recovery_job_resource/_show.py @@ -0,0 +1,539 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-job recovery-job-resource show", +) +class Show(AAZCommand): + """Get a RecoveryJobResource + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryjobs/{}/recoveryjobresources/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_job_name = AAZStrArg( + options=["--recovery-job-name"], + help="The unique name (GUID) of the recovery job.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_job_resource_name = AAZStrArg( + options=["--recovery-job-resource-name"], + help="The unique name (GUID) of the recovery job resource.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryJobResourcesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryJobResourcesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryJobs/{recoveryJobName}/recoveryJobResources/{recoveryJobResourceName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryJobName", self.ctx.args.recovery_job_name, + required=True, + ), + **self.serialize_url_param( + "recoveryJobResourceName", self.ctx.args.recovery_job_resource_name, + required=True, + ), + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.duration = AAZStrType( + flags={"read_only": True}, + ) + properties.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + _ShowHelper._build_schema_job_error_info_read(properties.error_details) + properties.job_extended_info = AAZObjectType( + serialized_name="jobExtendedInfo", + ) + properties.job_id = AAZStrType( + serialized_name="jobId", + flags={"read_only": True}, + ) + properties.job_resource_type = AAZStrType( + serialized_name="jobResourceType", + flags={"required": True}, + ) + properties.operation = AAZStrType( + flags={"read_only": True}, + ) + properties.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_action_settings = AAZObjectType( + serialized_name="recoveryGroupActionSettings", + flags={"read_only": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.retry_details = AAZListType( + serialized_name="retryDetails", + ) + properties.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + properties.status = AAZStrType( + flags={"read_only": True}, + ) + properties.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + properties.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + properties.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + job_extended_info = cls._schema_on_200.properties.job_extended_info + job_extended_info.dynamic_error_message = AAZStrType( + serialized_name="dynamicErrorMessage", + flags={"read_only": True}, + ) + job_extended_info.tasks_list = AAZListType( + serialized_name="tasksList", + flags={"read_only": True}, + ) + + tasks_list = cls._schema_on_200.properties.job_extended_info.tasks_list + tasks_list.Element = AAZObjectType() + _ShowHelper._build_schema_job_task_detail_read(tasks_list.Element) + + recovery_group_action_settings = cls._schema_on_200.properties.recovery_group_action_settings + recovery_group_action_settings.action_description = AAZStrType( + serialized_name="actionDescription", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_name = AAZStrType( + serialized_name="actionName", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_sequence = AAZIntType( + serialized_name="actionSequence", + flags={"read_only": True}, + ) + recovery_group_action_settings.action_task = AAZStrType( + serialized_name="actionTask", + flags={"read_only": True}, + ) + recovery_group_action_settings.recovery_group_action_type = AAZStrType( + serialized_name="recoveryGroupActionType", + flags={"read_only": True}, + ) + + retry_details = cls._schema_on_200.properties.retry_details + retry_details.Element = AAZObjectType() + _ShowHelper._build_schema_job_retry_details_read(retry_details.Element) + + user_comments = cls._schema_on_200.properties.user_comments + user_comments.Element = AAZObjectType() + _ShowHelper._build_schema_job_user_comment_read(user_comments.Element) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_job_error_info_read = None + + @classmethod + def _build_schema_job_error_info_read(cls, _schema): + if cls._schema_job_error_info_read is not None: + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + return + + cls._schema_job_error_info_read = _schema_job_error_info_read = AAZObjectType() + + job_error_info_read = _schema_job_error_info_read + job_error_info_read.error_code = AAZStrType( + serialized_name="errorCode", + flags={"read_only": True}, + ) + job_error_info_read.error_message = AAZStrType( + serialized_name="errorMessage", + flags={"read_only": True}, + ) + job_error_info_read.recommendations = AAZListType( + flags={"read_only": True}, + ) + + recommendations = _schema_job_error_info_read.recommendations + recommendations.Element = AAZStrType() + + _schema.error_code = cls._schema_job_error_info_read.error_code + _schema.error_message = cls._schema_job_error_info_read.error_message + _schema.recommendations = cls._schema_job_error_info_read.recommendations + + _schema_job_retry_details_read = None + + @classmethod + def _build_schema_job_retry_details_read(cls, _schema): + if cls._schema_job_retry_details_read is not None: + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + return + + cls._schema_job_retry_details_read = _schema_job_retry_details_read = AAZObjectType() + + job_retry_details_read = _schema_job_retry_details_read + job_retry_details_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_retry_details_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_retry_details_read.error_details) + job_retry_details_read.retry_attempt = AAZIntType( + serialized_name="retryAttempt", + flags={"required": True}, + ) + job_retry_details_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_retry_details_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_retry_details_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + user_comments = _schema_job_retry_details_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_retry_details_read.duration + _schema.end_time = cls._schema_job_retry_details_read.end_time + _schema.error_details = cls._schema_job_retry_details_read.error_details + _schema.retry_attempt = cls._schema_job_retry_details_read.retry_attempt + _schema.start_time = cls._schema_job_retry_details_read.start_time + _schema.status = cls._schema_job_retry_details_read.status + _schema.user_comments = cls._schema_job_retry_details_read.user_comments + + _schema_job_task_detail_read = None + + @classmethod + def _build_schema_job_task_detail_read(cls, _schema): + if cls._schema_job_task_detail_read is not None: + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + return + + cls._schema_job_task_detail_read = _schema_job_task_detail_read = AAZObjectType() + + job_task_detail_read = _schema_job_task_detail_read + job_task_detail_read.duration = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.end_time = AAZStrType( + serialized_name="endTime", + flags={"read_only": True}, + ) + job_task_detail_read.error_details = AAZObjectType( + serialized_name="errorDetails", + ) + cls._build_schema_job_error_info_read(job_task_detail_read.error_details) + job_task_detail_read.linked_job_ids = AAZListType( + serialized_name="linkedJobIds", + flags={"read_only": True}, + ) + job_task_detail_read.retry_details = AAZListType( + serialized_name="retryDetails", + flags={"read_only": True}, + ) + job_task_detail_read.start_time = AAZStrType( + serialized_name="startTime", + flags={"read_only": True}, + ) + job_task_detail_read.status = AAZStrType( + flags={"read_only": True}, + ) + job_task_detail_read.sub_tasks_list = AAZListType( + serialized_name="subTasksList", + flags={"read_only": True}, + ) + job_task_detail_read.task_id = AAZStrType( + serialized_name="taskId", + flags={"read_only": True}, + ) + job_task_detail_read.task_name = AAZStrType( + serialized_name="taskName", + flags={"read_only": True}, + ) + job_task_detail_read.user_comments = AAZListType( + serialized_name="userComments", + flags={"read_only": True}, + ) + + linked_job_ids = _schema_job_task_detail_read.linked_job_ids + linked_job_ids.Element = AAZStrType() + + retry_details = _schema_job_task_detail_read.retry_details + retry_details.Element = AAZObjectType() + cls._build_schema_job_retry_details_read(retry_details.Element) + + sub_tasks_list = _schema_job_task_detail_read.sub_tasks_list + sub_tasks_list.Element = AAZObjectType() + cls._build_schema_job_task_detail_read(sub_tasks_list.Element) + + user_comments = _schema_job_task_detail_read.user_comments + user_comments.Element = AAZObjectType() + cls._build_schema_job_user_comment_read(user_comments.Element) + + _schema.duration = cls._schema_job_task_detail_read.duration + _schema.end_time = cls._schema_job_task_detail_read.end_time + _schema.error_details = cls._schema_job_task_detail_read.error_details + _schema.linked_job_ids = cls._schema_job_task_detail_read.linked_job_ids + _schema.retry_details = cls._schema_job_task_detail_read.retry_details + _schema.start_time = cls._schema_job_task_detail_read.start_time + _schema.status = cls._schema_job_task_detail_read.status + _schema.sub_tasks_list = cls._schema_job_task_detail_read.sub_tasks_list + _schema.task_id = cls._schema_job_task_detail_read.task_id + _schema.task_name = cls._schema_job_task_detail_read.task_name + _schema.user_comments = cls._schema_job_task_detail_read.user_comments + + _schema_job_user_comment_read = None + + @classmethod + def _build_schema_job_user_comment_read(cls, _schema): + if cls._schema_job_user_comment_read is not None: + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + return + + cls._schema_job_user_comment_read = _schema_job_user_comment_read = AAZObjectType() + + job_user_comment_read = _schema_job_user_comment_read + job_user_comment_read.comment_time = AAZStrType( + serialized_name="commentTime", + flags={"read_only": True}, + ) + job_user_comment_read.comment_type = AAZStrType( + serialized_name="commentType", + flags={"read_only": True}, + ) + job_user_comment_read.comments = AAZStrType( + flags={"read_only": True}, + ) + + _schema.comment_time = cls._schema_job_user_comment_read.comment_time + _schema.comment_type = cls._schema_job_user_comment_read.comment_type + _schema.comments = cls._schema_job_user_comment_read.comments + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__cmd_group.py new file mode 100644 index 00000000000..358b073aea8 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience recovery-plan recovery-resource", +) +class __CMDGroup(AAZCommandGroup): + """Manage Recovery Resource + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_list.py new file mode 100644 index 00000000000..02b196fc564 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_list.py @@ -0,0 +1,499 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-resource list", +) +class List(AAZCommand): + """List RecoveryResource resources by RecoveryPlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryresources", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryResourcesList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class RecoveryResourcesList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryResources", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.value.Element.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.value.Element.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.value.Element.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.value.Element.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.value.Element.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.value.Element.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.value.Element.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.value.Element.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.value.Element.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ListHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ListHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ListHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ListHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ListHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_show.py new file mode 100644 index 00000000000..7911247210c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/recovery_plan/recovery_resource/_show.py @@ -0,0 +1,498 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience recovery-plan recovery-resource show", +) +class Show(AAZCommand): + """Get a RecoveryResource + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/recoveryplans/{}/recoveryresources/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.recovery_plan_name = AAZStrArg( + options=["--recovery-plan-name"], + help="The name of the recovery orchestration plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{5,24}$", + ), + ) + _args_schema.recovery_resource_name = AAZStrArg( + options=["--recovery-resource-name"], + help="The unique name (Guid) of the recovery resource", + required=True, + fmt=AAZStrArgFormat( + pattern="^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + ), + ) + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.RecoveryResourcesGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class RecoveryResourcesGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/recoveryPlans/{recoveryPlanName}/recoveryResources/{recoveryResourceName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "recoveryPlanName", self.ctx.args.recovery_plan_name, + required=True, + ), + **self.serialize_url_param( + "recoveryResourceName", self.ctx.args.recovery_resource_name, + required=True, + ), + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.associated_identity = AAZObjectType( + serialized_name="associatedIdentity", + ) + properties.attention_reasons = AAZListType( + serialized_name="attentionReasons", + flags={"read_only": True}, + ) + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.inclusion_state = AAZStrType( + serialized_name="inclusionState", + ) + properties.needs_attention = AAZBoolType( + serialized_name="needsAttention", + flags={"read_only": True}, + ) + properties.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recovery_group_id = AAZStrType( + serialized_name="recoveryGroupId", + ) + properties.recovery_resource_unique_id = AAZStrType( + serialized_name="recoveryResourceUniqueId", + flags={"required": True}, + ) + properties.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + properties.resource_location = AAZStrType( + serialized_name="resourceLocation", + flags={"read_only": True}, + ) + properties.resource_physical_zones = AAZListType( + serialized_name="resourcePhysicalZones", + flags={"read_only": True}, + ) + properties.resource_protection_solutions = AAZListType( + serialized_name="resourceProtectionSolutions", + flags={"read_only": True}, + ) + properties.selected_protection_solution_setting = AAZObjectType( + serialized_name="selectedProtectionSolutionSetting", + ) + properties.selected_protection_solution_type = AAZStrType( + serialized_name="selectedProtectionSolutionType", + ) + + associated_identity = cls._schema_on_200.properties.associated_identity + associated_identity.type = AAZStrType( + flags={"required": True}, + ) + associated_identity.user_assigned_identity = AAZStrType( + serialized_name="userAssignedIdentity", + ) + + attention_reasons = cls._schema_on_200.properties.attention_reasons + attention_reasons.Element = AAZStrType() + + resource_physical_zones = cls._schema_on_200.properties.resource_physical_zones + resource_physical_zones.Element = AAZStrType() + + resource_protection_solutions = cls._schema_on_200.properties.resource_protection_solutions + resource_protection_solutions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.resource_protection_solutions.Element + _element.active_location = AAZStrType( + serialized_name="activeLocation", + flags={"read_only": True}, + ) + _element.active_locations = AAZListType( + serialized_name="activeLocations", + flags={"read_only": True}, + ) + _element.active_physical_zones = AAZListType( + serialized_name="activePhysicalZones", + flags={"read_only": True}, + ) + _element.failover_state = AAZStrType( + serialized_name="failoverState", + flags={"read_only": True}, + ) + _element.is_auto_failover = AAZBoolType( + serialized_name="isAutoFailover", + flags={"read_only": True}, + ) + _element.primary_resource = AAZStrType( + serialized_name="primaryResource", + flags={"read_only": True}, + ) + _element.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"read_only": True}, + ) + _element.protection_status = AAZStrType( + serialized_name="protectionStatus", + flags={"read_only": True}, + ) + _element.recovery_locations = AAZListType( + serialized_name="recoveryLocations", + flags={"read_only": True}, + ) + _element.replica_resources = AAZListType( + serialized_name="replicaResources", + flags={"read_only": True}, + ) + _element.replication_role = AAZStrType( + serialized_name="replicationRole", + flags={"read_only": True}, + ) + _element.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"read_only": True}, + ) + _element.test_failover_state = AAZStrType( + serialized_name="testFailoverState", + flags={"read_only": True}, + ) + + active_locations = cls._schema_on_200.properties.resource_protection_solutions.Element.active_locations + active_locations.Element = AAZStrType() + + active_physical_zones = cls._schema_on_200.properties.resource_protection_solutions.Element.active_physical_zones + active_physical_zones.Element = AAZStrType() + + recovery_locations = cls._schema_on_200.properties.resource_protection_solutions.Element.recovery_locations + recovery_locations.Element = AAZStrType() + + replica_resources = cls._schema_on_200.properties.resource_protection_solutions.Element.replica_resources + replica_resources.Element = AAZStrType() + + selected_protection_solution_setting = cls._schema_on_200.properties.selected_protection_solution_setting + selected_protection_solution_setting.protection_solution_type = AAZStrType( + serialized_name="protectionSolutionType", + flags={"required": True}, + ) + + disc_azure_site_recovery = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery") + disc_azure_site_recovery.reprotect_params = AAZObjectType( + serialized_name="reprotectParams", + ) + disc_azure_site_recovery.test_failover_cleanup_params = AAZObjectType( + serialized_name="testFailoverCleanupParams", + ) + disc_azure_site_recovery.test_failover_params = AAZObjectType( + serialized_name="testFailoverParams", + ) + + reprotect_params = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params + reprotect_params.disk_reprotect_input_details = AAZListType( + serialized_name="diskReprotectInputDetails", + ) + + disk_reprotect_input_details = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details + disk_reprotect_input_details.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").reprotect_params.disk_reprotect_input_details.Element + _element.disk_resource_id = AAZStrType( + serialized_name="diskResourceId", + ) + _element.staging_storage_account_resource_id = AAZStrType( + serialized_name="stagingStorageAccountResourceId", + ) + + test_failover_cleanup_params = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_cleanup_params + test_failover_cleanup_params.comments = AAZStrType() + + test_failover_params = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "AzureSiteRecovery").test_failover_params + test_failover_params.network_resource_id = AAZStrType( + serialized_name="networkResourceId", + ) + + disc_cross_zone_vm_recovery = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CrossZoneVMRecovery") + disc_cross_zone_vm_recovery.capacity_reservation_group_id = AAZStrType( + serialized_name="capacityReservationGroupId", + ) + disc_cross_zone_vm_recovery.target_zone = AAZStrType( + serialized_name="targetZone", + ) + + disc_custom_runbook = cls._schema_on_200.properties.selected_protection_solution_setting.discriminate_by("protection_solution_type", "CustomRunbook") + disc_custom_runbook.failover_action = AAZObjectType( + serialized_name="failoverAction", + ) + _ShowHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_action) + disc_custom_runbook.failover_commit_action = AAZObjectType( + serialized_name="failoverCommitAction", + ) + _ShowHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.failover_commit_action) + disc_custom_runbook.reprotect_action = AAZObjectType( + serialized_name="reprotectAction", + ) + _ShowHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.reprotect_action) + disc_custom_runbook.test_failover_action = AAZObjectType( + serialized_name="testFailoverAction", + ) + _ShowHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_action) + disc_custom_runbook.test_failover_cleanup_action = AAZObjectType( + serialized_name="testFailoverCleanupAction", + ) + _ShowHelper._build_schema_resource_custom_protection_action_read(disc_custom_runbook.test_failover_cleanup_action) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_resource_custom_protection_action_read = None + + @classmethod + def _build_schema_resource_custom_protection_action_read(cls, _schema): + if cls._schema_resource_custom_protection_action_read is not None: + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + return + + cls._schema_resource_custom_protection_action_read = _schema_resource_custom_protection_action_read = AAZObjectType() + + resource_custom_protection_action_read = _schema_resource_custom_protection_action_read + resource_custom_protection_action_read.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + + _schema.resource_id = cls._schema_resource_custom_protection_action_read.resource_id + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__cmd_group.py new file mode 100644 index 00000000000..b1aeca32fe1 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience unified-resilience-item", +) +class __CMDGroup(AAZCommandGroup): + """Manage Unified Resilience Item + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__init__.py new file mode 100644 index 00000000000..2df85698253 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._list import * +from ._show import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_list.py new file mode 100644 index 00000000000..9a5937f8d85 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_list.py @@ -0,0 +1,289 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience unified-resilience-item list", +) +class List(AAZCommand): + """List UnifiedResilienceItem resources by tenant + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/unifiedresilienceitems", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.skip_token = AAZStrArg( + options=["--skip-token"], + help="Skip over when retrieving results.", + ) + _args_schema.top = AAZIntArg( + options=["--top"], + help="Number of elements to return when retrieving results.", + fmt=AAZIntArgFormat( + maximum=100, + minimum=1, + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.UnifiedResilienceItemsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class UnifiedResilienceItemsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/unifiedResilienceItems", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "$skipToken", self.ctx.args.skip_token, + ), + **self.serialize_query_param( + "$top", self.ctx.args.top, + ), + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.goals = AAZObjectType( + flags={"required": True}, + ) + properties.last_modified_time = AAZStrType( + serialized_name="lastModifiedTime", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recommendations = AAZObjectType( + flags={"required": True}, + ) + + goals = cls._schema_on_200.value.Element.properties.goals + goals.assignment_id = AAZStrType( + serialized_name="assignmentId", + flags={"required": True}, + ) + goals.regional_recovery_point_estimated_in_minutes = AAZStrType( + serialized_name="regionalRecoveryPointEstimatedInMinutes", + ) + goals.regional_recovery_point_objective_in_minutes = AAZStrType( + serialized_name="regionalRecoveryPointObjectiveInMinutes", + ) + goals.regional_recovery_point_objective_status = AAZStrType( + serialized_name="regionalRecoveryPointObjectiveStatus", + flags={"required": True}, + ) + goals.regional_recovery_time_actual_in_minutes = AAZStrType( + serialized_name="regionalRecoveryTimeActualInMinutes", + ) + goals.regional_recovery_time_objective_in_minutes = AAZStrType( + serialized_name="regionalRecoveryTimeObjectiveInMinutes", + ) + goals.regional_recovery_time_objective_status = AAZStrType( + serialized_name="regionalRecoveryTimeObjectiveStatus", + flags={"required": True}, + ) + goals.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + goals.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + goals.template_id = AAZStrType( + serialized_name="templateId", + flags={"required": True}, + ) + + recommendations = cls._schema_on_200.value.Element.properties.recommendations + recommendations.high_availability = AAZObjectType( + serialized_name="highAvailability", + flags={"required": True}, + ) + + high_availability = cls._schema_on_200.value.Element.properties.recommendations.high_availability + high_availability.enabled_resource_count = AAZIntType( + serialized_name="enabledResourceCount", + ) + high_availability.evaluation_date_time = AAZStrType( + serialized_name="evaluationDateTime", + ) + high_availability.not_enabled_resource_count = AAZIntType( + serialized_name="notEnabledResourceCount", + ) + high_availability.not_evaluated_resource_count = AAZIntType( + serialized_name="notEvaluatedResourceCount", + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_show.py new file mode 100644 index 00000000000..e6b312b5020 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/unified_resilience_item/_show.py @@ -0,0 +1,270 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience unified-resilience-item show", +) +class Show(AAZCommand): + """Get a UnifiedResilienceItem + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/providers/microsoft.management/servicegroups/{}/providers/microsoft.azureresiliencemanagement/unifiedresilienceitems/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.service_group_name = AAZStrArg( + options=["--service-group-name"], + help="The name of the service group.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9\\-_().~]{1,90}$", + ), + ) + _args_schema.unified_resilience_item_name = AAZStrArg( + options=["--unified-resilience-item-name"], + help="The name of the unified resilience item.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.UnifiedResilienceItemsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class UnifiedResilienceItemsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Management/serviceGroups/{serviceGroupName}/providers/Microsoft.AzureResilienceManagement/unifiedResilienceItems/{unifiedResilienceItemName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "serviceGroupName", self.ctx.args.service_group_name, + required=True, + ), + **self.serialize_url_param( + "unifiedResilienceItemName", self.ctx.args.unified_resilience_item_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.goals = AAZObjectType( + flags={"required": True}, + ) + properties.last_modified_time = AAZStrType( + serialized_name="lastModifiedTime", + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.recommendations = AAZObjectType( + flags={"required": True}, + ) + + goals = cls._schema_on_200.properties.goals + goals.assignment_id = AAZStrType( + serialized_name="assignmentId", + flags={"required": True}, + ) + goals.regional_recovery_point_estimated_in_minutes = AAZStrType( + serialized_name="regionalRecoveryPointEstimatedInMinutes", + ) + goals.regional_recovery_point_objective_in_minutes = AAZStrType( + serialized_name="regionalRecoveryPointObjectiveInMinutes", + ) + goals.regional_recovery_point_objective_status = AAZStrType( + serialized_name="regionalRecoveryPointObjectiveStatus", + flags={"required": True}, + ) + goals.regional_recovery_time_actual_in_minutes = AAZStrType( + serialized_name="regionalRecoveryTimeActualInMinutes", + ) + goals.regional_recovery_time_objective_in_minutes = AAZStrType( + serialized_name="regionalRecoveryTimeObjectiveInMinutes", + ) + goals.regional_recovery_time_objective_status = AAZStrType( + serialized_name="regionalRecoveryTimeObjectiveStatus", + flags={"required": True}, + ) + goals.require_disaster_recovery = AAZStrType( + serialized_name="requireDisasterRecovery", + ) + goals.require_high_availability = AAZStrType( + serialized_name="requireHighAvailability", + ) + goals.template_id = AAZStrType( + serialized_name="templateId", + flags={"required": True}, + ) + + recommendations = cls._schema_on_200.properties.recommendations + recommendations.high_availability = AAZObjectType( + serialized_name="highAvailability", + flags={"required": True}, + ) + + high_availability = cls._schema_on_200.properties.recommendations.high_availability + high_availability.enabled_resource_count = AAZIntType( + serialized_name="enabledResourceCount", + ) + high_availability.evaluation_date_time = AAZStrType( + serialized_name="evaluationDateTime", + ) + high_availability.not_enabled_resource_count = AAZIntType( + serialized_name="notEnabledResourceCount", + ) + high_availability.not_evaluated_resource_count = AAZIntType( + serialized_name="notEvaluatedResourceCount", + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__cmd_group.py new file mode 100644 index 00000000000..4a576086194 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience usage-plan", +) +class __CMDGroup(AAZCommandGroup): + """Manage Usage Plan + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__init__.py new file mode 100644 index 00000000000..db73033039b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/__init__.py @@ -0,0 +1,17 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_create.py new file mode 100644 index 00000000000..8076a326e89 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_create.py @@ -0,0 +1,347 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan create", +) +class Create(AAZCommand): + """Create a UsagePlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["-n", "--name", "--usage-plan-name"], + help="The name of the usage plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.plan_type = AAZStrArg( + options=["--plan-type"], + arg_group="Properties", + help="The type of the usage plan.", + enum={"Basic": "Basic", "Standard": "Standard"}, + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.location = AAZResourceLocationArg( + arg_group="Resource", + help="The geo-location where the resource lives", + required=True, + fmt=AAZResourceLocationArgFormat( + resource_group_arg="resource_group", + ), + ) + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.UsagePlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class UsagePlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("location", AAZStrType, ".location", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("planType", AAZStrType, ".plan_type") + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.tags = AAZDictType() + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200_201.tags + tags.Element = AAZStrType() + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_delete.py new file mode 100644 index 00000000000..924d94a2259 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_delete.py @@ -0,0 +1,163 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete a UsagePlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["-n", "--name", "--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.UsagePlansDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class UsagePlansDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_list.py new file mode 100644 index 00000000000..8aa3f723891 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_list.py @@ -0,0 +1,423 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan list", +) +class List(AAZCommand): + """List UsagePlan resources by subscription ID + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/providers/microsoft.azureresiliencemanagement/usageplans", "2026-08-31-preview"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + condition_0 = has_value(self.ctx.subscription_id) and has_value(self.ctx.args.resource_group) is not True + condition_1 = has_value(self.ctx.args.resource_group) and has_value(self.ctx.subscription_id) + if condition_0: + self.UsagePlansListBySubscription(ctx=self.ctx)() + if condition_1: + self.UsagePlansListByResourceGroup(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class UsagePlansListBySubscription(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/providers/Microsoft.AzureResilienceManagement/usagePlans", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.location = AAZStrType( + flags={"required": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.tags = AAZDictType() + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.value.Element.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + class UsagePlansListByResourceGroup(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.location = AAZStrType( + flags={"required": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.tags = AAZDictType() + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.value.Element.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_show.py new file mode 100644 index 00000000000..6b915ed55c7 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_show.py @@ -0,0 +1,277 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan show", +) +class Show(AAZCommand): + """Get a UsagePlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["-n", "--name", "--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.UsagePlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class UsagePlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_update.py new file mode 100644 index 00000000000..1401454400e --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_update.py @@ -0,0 +1,487 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan update", +) +class Update(AAZCommand): + """Update a UsagePlan + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["-n", "--name", "--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.plan_type = AAZStrArg( + options=["--plan-type"], + arg_group="Properties", + help="The type of the usage plan.", + nullable=True, + enum={"Basic": "Basic", "Standard": "Standard"}, + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + nullable=True, + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg( + nullable=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.UsagePlansGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.UsagePlansCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class UsagePlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_usage_plan_read(cls._schema_on_200) + + return cls._schema_on_200 + + class UsagePlansCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_usage_plan_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("planType", AAZStrType, ".plan_type") + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + _schema_usage_plan_read = None + + @classmethod + def _build_schema_usage_plan_read(cls, _schema): + if cls._schema_usage_plan_read is not None: + _schema.id = cls._schema_usage_plan_read.id + _schema.location = cls._schema_usage_plan_read.location + _schema.name = cls._schema_usage_plan_read.name + _schema.properties = cls._schema_usage_plan_read.properties + _schema.system_data = cls._schema_usage_plan_read.system_data + _schema.tags = cls._schema_usage_plan_read.tags + _schema.type = cls._schema_usage_plan_read.type + return + + cls._schema_usage_plan_read = _schema_usage_plan_read = AAZObjectType() + + usage_plan_read = _schema_usage_plan_read + usage_plan_read.id = AAZStrType( + flags={"read_only": True}, + ) + usage_plan_read.location = AAZStrType( + flags={"required": True}, + ) + usage_plan_read.name = AAZStrType( + flags={"read_only": True}, + ) + usage_plan_read.properties = AAZObjectType() + usage_plan_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + usage_plan_read.tags = AAZDictType() + usage_plan_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_usage_plan_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = _schema_usage_plan_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = _schema_usage_plan_read.tags + tags.Element = AAZStrType() + + _schema.id = cls._schema_usage_plan_read.id + _schema.location = cls._schema_usage_plan_read.location + _schema.name = cls._schema_usage_plan_read.name + _schema.properties = cls._schema_usage_plan_read.properties + _schema.system_data = cls._schema_usage_plan_read.system_data + _schema.tags = cls._schema_usage_plan_read.tags + _schema.type = cls._schema_usage_plan_read.type + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_wait.py new file mode 100644 index 00000000000..c510b239d25 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/_wait.py @@ -0,0 +1,276 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["-n", "--name", "--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.UsagePlansGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class UsagePlansGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.plan_type = AAZStrType( + serialized_name="planType", + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__cmd_group.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__cmd_group.py new file mode 100644 index 00000000000..38891c5a92c --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "resilience usage-plan enrollment", +) +class __CMDGroup(AAZCommandGroup): + """Manage Enrollment + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__init__.py new file mode 100644 index 00000000000..db73033039b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/__init__.py @@ -0,0 +1,17 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_create.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_create.py new file mode 100644 index 00000000000..3c206ee9280 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_create.py @@ -0,0 +1,326 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment create", +) +class Create(AAZCommand): + """Create an Enrollment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.enrollment_name = AAZStrArg( + options=["-n", "--name", "--enrollment-name"], + help="The name of the enrollment.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.service_group_id = AAZResourceIdArg( + options=["--service-group-id"], + arg_group="Properties", + help="ARM resource identifier of the service group associated with this usage plan.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.EnrollmentsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class EnrollmentsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("serviceGroupId", AAZStrType, ".service_group_id", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _CreateHelper._build_schema_error_detail_read(properties.error_details) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Create"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_delete.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_delete.py new file mode 100644 index 00000000000..66757ef66ed --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_delete.py @@ -0,0 +1,176 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete an Enrollment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.enrollment_name = AAZStrArg( + options=["-n", "--name", "--enrollment-name"], + help="The name of the enrollment.", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.EnrollmentsDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class EnrollmentsDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_list.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_list.py new file mode 100644 index 00000000000..2c96a1f4c77 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_list.py @@ -0,0 +1,283 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment list", +) +class List(AAZCommand): + """List Enrollments by Usage Plan. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.EnrollmentsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class EnrollmentsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ListHelper._build_schema_error_detail_read(properties.error_details) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["List"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_show.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_show.py new file mode 100644 index 00000000000..16f21d63edc --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_show.py @@ -0,0 +1,284 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment show", +) +class Show(AAZCommand): + """Get an Enrollment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.enrollment_name = AAZStrArg( + options=["-n", "--name", "--enrollment-name"], + help="The name of the enrollment.", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.EnrollmentsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class EnrollmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _ShowHelper._build_schema_error_detail_read(properties.error_details) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Show"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_update.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_update.py new file mode 100644 index 00000000000..6733c644181 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_update.py @@ -0,0 +1,472 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment update", +) +class Update(AAZCommand): + """Update an Enrollment. + """ + + _aaz_info = { + "version": "2026-08-31-preview", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments/{}", "2026-08-31-preview"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.enrollment_name = AAZStrArg( + options=["-n", "--name", "--enrollment-name"], + help="The name of the enrollment.", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.service_group_id = AAZResourceIdArg( + options=["--service-group-id"], + arg_group="Properties", + help="ARM resource identifier of the service group associated with this usage plan.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.EnrollmentsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.EnrollmentsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class EnrollmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_enrollment_read(cls._schema_on_200) + + return cls._schema_on_200 + + class EnrollmentsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_enrollment_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("serviceGroupId", AAZStrType, ".service_group_id", typ_kwargs={"flags": {"required": True}}) + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_enrollment_read = None + + @classmethod + def _build_schema_enrollment_read(cls, _schema): + if cls._schema_enrollment_read is not None: + _schema.id = cls._schema_enrollment_read.id + _schema.name = cls._schema_enrollment_read.name + _schema.properties = cls._schema_enrollment_read.properties + _schema.system_data = cls._schema_enrollment_read.system_data + _schema.type = cls._schema_enrollment_read.type + return + + cls._schema_enrollment_read = _schema_enrollment_read = AAZObjectType() + + enrollment_read = _schema_enrollment_read + enrollment_read.id = AAZStrType( + flags={"read_only": True}, + ) + enrollment_read.name = AAZStrType( + flags={"read_only": True}, + ) + enrollment_read.properties = AAZObjectType() + enrollment_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + enrollment_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_enrollment_read.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + cls._build_schema_error_detail_read(properties.error_details) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + system_data = _schema_enrollment_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_enrollment_read.id + _schema.name = cls._schema_enrollment_read.name + _schema.properties = cls._schema_enrollment_read.properties + _schema.system_data = cls._schema_enrollment_read.system_data + _schema.type = cls._schema_enrollment_read.type + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Update"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_wait.py b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_wait.py new file mode 100644 index 00000000000..cc84b0d9184 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/aaz/latest/resilience/usage_plan/enrollment/_wait.py @@ -0,0 +1,283 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "resilience usage-plan enrollment wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.azureresiliencemanagement/usageplans/{}/enrollments/{}", "2026-08-31-preview"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.enrollment_name = AAZStrArg( + options=["-n", "--name", "--enrollment-name"], + help="The name of the enrollment.", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + _args_schema.usage_plan_name = AAZStrArg( + options=["--usage-plan-name"], + help="The name of the usage plan.", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z0-9-]{3,24}$", + ), + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.EnrollmentsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class EnrollmentsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AzureResilienceManagement/usagePlans/{usagePlanName}/enrollments/{enrollmentName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "enrollmentName", self.ctx.args.enrollment_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + **self.serialize_url_param( + "usagePlanName", self.ctx.args.usage_plan_name, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-08-31-preview", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.error_details = AAZObjectType( + serialized_name="errorDetails", + flags={"read_only": True}, + ) + _WaitHelper._build_schema_error_detail_read(properties.error_details) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.service_group_id = AAZStrType( + serialized_name="serviceGroupId", + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + _schema_error_detail_read = None + + @classmethod + def _build_schema_error_detail_read(cls, _schema): + if cls._schema_error_detail_read is not None: + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + return + + cls._schema_error_detail_read = _schema_error_detail_read = AAZObjectType( + flags={"read_only": True} + ) + + error_detail_read = _schema_error_detail_read + error_detail_read.additional_info = AAZListType( + serialized_name="additionalInfo", + flags={"read_only": True}, + ) + error_detail_read.code = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.details = AAZListType( + flags={"read_only": True}, + ) + error_detail_read.message = AAZStrType( + flags={"read_only": True}, + ) + error_detail_read.target = AAZStrType( + flags={"read_only": True}, + ) + + additional_info = _schema_error_detail_read.additional_info + additional_info.Element = AAZObjectType() + + _element = _schema_error_detail_read.additional_info.Element + _element.info = AAZDictType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + info = _schema_error_detail_read.additional_info.Element.info + info.Element = AAZAnyType() + + details = _schema_error_detail_read.details + details.Element = AAZObjectType() + cls._build_schema_error_detail_read(details.Element) + + _schema.additional_info = cls._schema_error_detail_read.additional_info + _schema.code = cls._schema_error_detail_read.code + _schema.details = cls._schema_error_detail_read.details + _schema.message = cls._schema_error_detail_read.message + _schema.target = cls._schema_error_detail_read.target + + +__all__ = ["Wait"] diff --git a/src/azure-resilience-management/azext_azure_resilience_management/azext_metadata.json b/src/azure-resilience-management/azext_azure_resilience_management/azext_metadata.json new file mode 100644 index 00000000000..71889bb136b --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/azext_metadata.json @@ -0,0 +1,4 @@ +{ + "azext.isPreview": true, + "azext.minCliCoreVersion": "2.75.0" +} \ No newline at end of file diff --git a/src/azure-resilience-management/azext_azure_resilience_management/commands.py b/src/azure-resilience-management/azext_azure_resilience_management/commands.py new file mode 100644 index 00000000000..b0d842e4993 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/commands.py @@ -0,0 +1,15 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +# from azure.cli.core.commands import CliCommandType + + +def load_command_table(self, _): # pylint: disable=unused-argument + pass diff --git a/src/azure-resilience-management/azext_azure_resilience_management/custom.py b/src/azure-resilience-management/azext_azure_resilience_management/custom.py new file mode 100644 index 00000000000..86df1e48ef5 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/custom.py @@ -0,0 +1,14 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +from knack.log import get_logger + + +logger = get_logger(__name__) diff --git a/src/azure-resilience-management/azext_azure_resilience_management/tests/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/tests/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/tests/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/__init__.py b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py new file mode 100644 index 00000000000..acd84c8b556 --- /dev/null +++ b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +from azure.cli.testsdk import * + + +class AzureResilienceManagementScenario(ScenarioTest): + # TODO: add tests here + pass diff --git a/src/azure-resilience-management/setup.cfg b/src/azure-resilience-management/setup.cfg new file mode 100644 index 00000000000..2fdd96e5d39 --- /dev/null +++ b/src/azure-resilience-management/setup.cfg @@ -0,0 +1 @@ +#setup.cfg \ No newline at end of file diff --git a/src/azure-resilience-management/setup.py b/src/azure-resilience-management/setup.py new file mode 100644 index 00000000000..068a8c2d202 --- /dev/null +++ b/src/azure-resilience-management/setup.py @@ -0,0 +1,51 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +from codecs import open +from setuptools import setup, find_packages + + +# HISTORY.rst entry. +VERSION = '1.0.0b1' + +# The full list of classifiers is available at +# https://pypi.python.org/pypi?%3Aaction=list_classifiers +CLASSIFIERS = [ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', + 'License :: OSI Approved :: MIT License', +] + +DEPENDENCIES = [] + +with open('README.md', 'r', encoding='utf-8') as f: + README = f.read() +with open('HISTORY.rst', 'r', encoding='utf-8') as f: + HISTORY = f.read() + +setup( + name='azure-resilience-management', + version=VERSION, + description='Microsoft Azure Command-Line Tools AzureResilienceManagement Extension.', + long_description=README + '\n\n' + HISTORY, + license='MIT', + author='Microsoft Corporation', + author_email='azpycli@microsoft.com', + url='https://github.com/Azure/azure-cli-extensions/tree/main/src/azure-resilience-management', + classifiers=CLASSIFIERS, + packages=find_packages(exclude=["tests"]), + package_data={'azext_azure_resilience_management': ['azext_metadata.json']}, + install_requires=DEPENDENCIES +) From 672d3d41c404c65f24ecb591a6d7c4a2a59f651c Mon Sep 17 00:00:00 2001 From: Krishna Tripathi Date: Fri, 11 Sep 2026 00:44:51 +0530 Subject: [PATCH 2/4] Enhance Azure Resilience Management extension documentation and tests - Update HISTORY.rst with detailed command surface and initial release information. - Revise README.md to include comprehensive command groups and usage examples. - Implement unit tests for command registration and API version consistency in test_azure_resilience_management.py. - Add Azure Resilience Management entry to service_name.json with relevant documentation URL. --- src/azure-resilience-management/HISTORY.rst | 21 +- src/azure-resilience-management/README.md | 447 +++++++++++++++++- .../test_azure_resilience_management.py | 168 ++++++- src/service_name.json | 5 + 4 files changed, 631 insertions(+), 10 deletions(-) diff --git a/src/azure-resilience-management/HISTORY.rst b/src/azure-resilience-management/HISTORY.rst index abbff5a61a7..79bd251f74b 100644 --- a/src/azure-resilience-management/HISTORY.rst +++ b/src/azure-resilience-management/HISTORY.rst @@ -4,5 +4,22 @@ Release History =============== 1.0.0b1 -++++++ -* Initial release. \ No newline at end of file ++++++++ +* Initial preview release of the ``azure-resilience-management`` extension. + Targets API version ``2026-08-31-preview`` of + ``Microsoft.AzureResilienceManagement``. + + Command surface: + + * ``az resilience drill`` -- manage drills, drill resources, drill runs, + reports, and managed identities. + * ``az resilience goal-assignment`` -- manage goal assignments, goal + resources, capacity recommendations, and resource refresh operations. + * ``az resilience goal-template`` -- create and manage reusable goal + templates. + * ``az resilience recovery-plan`` -- manage recovery plans, recovery + resources, recovery jobs, managed identities, and recovery operations. + * ``az resilience unified-resilience-item`` -- list and show aggregated + resilience information. + * ``az resilience usage-plan`` -- manage subscription usage plans and + service-group enrollments. \ No newline at end of file diff --git a/src/azure-resilience-management/README.md b/src/azure-resilience-management/README.md index e27100f8e98..1b6ff5ad27d 100644 --- a/src/azure-resilience-management/README.md +++ b/src/azure-resilience-management/README.md @@ -1,5 +1,444 @@ -# Azure CLI AzureResilienceManagement Extension # -This is an extension to Azure CLI to manage AzureResilienceManagement resources. +# Azure CLI Azure Resilience Management Extension -## How to use ## -Please add commands usage here. \ No newline at end of file +This extension provides commands for managing Azure Resilience Management +resources through the `az resilience` command group. + +## Install + +```bash +az extension add --name azure-resilience-management +``` + +## Command groups + +| Group | Description | +|--|--| +| `az resilience drill` | Manage resilience drills and their execution lifecycle | +| `az resilience drill drill-resource` | Inspect resources associated with a drill | +| `az resilience drill drill-run` | Manage and inspect drill runs and reports | +| `az resilience drill drill-run drill-run-resource` | Inspect resources associated with a drill run | +| `az resilience drill identity` | Manage the managed identity for a drill | +| `az resilience goal-assignment` | Manage resilience goal assignments and recommendations | +| `az resilience goal-assignment goal-resource` | Inspect resources associated with a goal assignment | +| `az resilience goal-template` | Manage reusable resilience goal templates | +| `az resilience recovery-plan` | Manage recovery plans and recovery operations | +| `az resilience recovery-plan identity` | Manage the managed identity for a recovery plan | +| `az resilience recovery-plan recovery-job` | Inspect and control recovery jobs | +| `az resilience recovery-plan recovery-job recovery-job-resource` | Inspect resources associated with a recovery job | +| `az resilience recovery-plan recovery-resource` | Inspect resources associated with a recovery plan | +| `az resilience unified-resilience-item` | Inspect aggregated resilience information | +| `az resilience usage-plan` | Manage usage plans and enrollments | +| `az resilience usage-plan enrollment` | Manage usage plan enrollments | + +## Complete command list + +The extension provides the following 92 commands. + +### Drill + +```text +az resilience drill add-or-update-resource +az resilience drill create +az resilience drill delete +az resilience drill drill-resource list +az resilience drill drill-resource show +az resilience drill drill-run add-note +az resilience drill drill-run drill-run-resource list +az resilience drill drill-run drill-run-resource show +az resilience drill drill-run fail-over +az resilience drill drill-run generate-report +az resilience drill drill-run list +az resilience drill drill-run list-report-download-url +az resilience drill drill-run mark-as-complete +az resilience drill drill-run reprotect +az resilience drill drill-run resume +az resilience drill drill-run show +az resilience drill end +az resilience drill identity assign +az resilience drill identity remove +az resilience drill identity show +az resilience drill identity wait +az resilience drill list +az resilience drill resync-readiness-check +az resilience drill show +az resilience drill start +az resilience drill update +az resilience drill validate-for-execution +az resilience drill wait +``` + +### Goal assignment + +```text +az resilience goal-assignment create +az resilience goal-assignment delete +az resilience goal-assignment goal-resource list +az resilience goal-assignment goal-resource show +az resilience goal-assignment list +az resilience goal-assignment recommend-capacity +az resilience goal-assignment refresh-goal-resource +az resilience goal-assignment show +az resilience goal-assignment update +az resilience goal-assignment update-goal-resource +az resilience goal-assignment wait +``` + +### Goal template + +```text +az resilience goal-template create +az resilience goal-template delete +az resilience goal-template list +az resilience goal-template show +az resilience goal-template update +az resilience goal-template wait +``` + +### Recovery plan + +```text +az resilience recovery-plan check-readiness +az resilience recovery-plan create +az resilience recovery-plan delete +az resilience recovery-plan failover +az resilience recovery-plan failover-commit +az resilience recovery-plan finalize +az resilience recovery-plan identity assign +az resilience recovery-plan identity remove +az resilience recovery-plan identity show +az resilience recovery-plan identity wait +az resilience recovery-plan list +az resilience recovery-plan recovery-job cancel +az resilience recovery-plan recovery-job list +az resilience recovery-plan recovery-job recovery-job-resource list +az resilience recovery-plan recovery-job recovery-job-resource show +az resilience recovery-plan recovery-job resume +az resilience recovery-plan recovery-job retry +az resilience recovery-plan recovery-job show +az resilience recovery-plan recovery-resource list +az resilience recovery-plan recovery-resource show +az resilience recovery-plan reprotect +az resilience recovery-plan show +az resilience recovery-plan test-failover +az resilience recovery-plan test-failover-cleanup +az resilience recovery-plan update +az resilience recovery-plan update-resource +az resilience recovery-plan validate-for-failover +az resilience recovery-plan validate-for-failover-commit +az resilience recovery-plan validate-for-operation +az resilience recovery-plan validate-for-reprotect +az resilience recovery-plan validate-for-test-failover +az resilience recovery-plan validate-for-test-failover-cleanup +az resilience recovery-plan wait +``` + +### Unified resilience item + +```text +az resilience unified-resilience-item list +az resilience unified-resilience-item show +``` + +### Usage plan + +```text +az resilience usage-plan create +az resilience usage-plan delete +az resilience usage-plan enrollment create +az resilience usage-plan enrollment delete +az resilience usage-plan enrollment list +az resilience usage-plan enrollment show +az resilience usage-plan enrollment update +az resilience usage-plan enrollment wait +az resilience usage-plan list +az resilience usage-plan show +az resilience usage-plan update +az resilience usage-plan wait +``` + +## Prerequisites + +Before running service-group scoped commands: + +- Select a subscription and cloud whose Resource Manager endpoint supports API version + `2026-08-31-preview`. +- Use an existing Microsoft Management service group and grant the caller the required + Azure Resilience Management permissions at that scope. +- Register resource providers used by the scenario, such as + `Microsoft.AzureResilienceManagement`, `Microsoft.ManagedIdentity`, + `Microsoft.Chaos`, `Microsoft.Automation`, and the providers of protected resources. +- Create user-assigned managed identities and grant them access to target, monitoring, + Chaos, recovery, or Automation resources as required by the selected workflow. +- Create a usage plan and enroll the service group before creating drills or recovery + plans. The caller needs `Microsoft.AzureResilienceManagement/usagePlans/enrollments/write`. + +Commands that accept `--operation-id` require a new caller-generated GUID for each +operation: + +```powershell +$operationId = [guid]::NewGuid().Guid +``` + +Wait for each parent resource and long-running action to finish before starting another +operation on the same resource. Child names such as drill-run, recovery-job, and resource +names must be obtained from the corresponding `list`, `show`, or action response. + +## Command reference + +The tables below cover every generated command. Parameters in braces describe required +members of a structured argument. For example, +`--drill-asset-properties {region,subscription}` means that both `region` and +`subscription` are required when that object is supplied. Run a command with `--help` +for optional parameters, accepted enum values, shorthand syntax, and generic Azure CLI +arguments. + +### Usage plans and enrollments + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `usage-plan create` | `--resource-group`, `--usage-plan-name`, `--location` | Create a subscription/resource-group scoped plan. Specify `--plan-type Basic` or `Standard`; the service currently uses `global` as the location. | +| `usage-plan delete` | `--resource-group`, `--usage-plan-name` | Delete an existing plan after its enrollments are removed. | +| `usage-plan list` | None | List plans by subscription; optionally filter with `--resource-group`. | +| `usage-plan show` | `--resource-group`, `--usage-plan-name` | Get an existing plan. | +| `usage-plan update` | `--resource-group`, `--usage-plan-name` | Update mutable plan properties such as tags. | +| `usage-plan wait` | `--resource-group`, `--usage-plan-name`, one wait condition | Wait for `--created`, `--updated`, `--deleted`, `--exists`, or a custom condition. | +| `usage-plan enrollment create` | `--resource-group`, `--usage-plan-name`, `--enrollment-name`, `--service-group-id` | Enroll an existing service group in an existing plan. The service-group ID has the form `/providers/Microsoft.Management/serviceGroups/`. | +| `usage-plan enrollment delete` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | Remove an existing enrollment. | +| `usage-plan enrollment list` | `--resource-group`, `--usage-plan-name` | List enrollments under an existing plan. | +| `usage-plan enrollment show` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | Get an existing enrollment. | +| `usage-plan enrollment update` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | Update an enrollment; supply `--service-group-id` when changing its association. | +| `usage-plan enrollment wait` | `--resource-group`, `--usage-plan-name`, `--enrollment-name`, one wait condition | Wait for an enrollment state. | + +### Goal templates + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `goal-template create` | `--service-group-name`, `--goal-template-name` | Create a template. Supply `--goal-type Resiliency`; HA/DR requirements and ISO 8601 RPO/RTO values are optional scenario settings. | +| `goal-template delete` | `--service-group-name`, `--goal-template-name` | Delete a template that is not referenced by an assignment. | +| `goal-template list` | `--service-group-name` | List templates in a service group. | +| `goal-template show` | `--service-group-name`, `--goal-template-name` | Get an existing template. | +| `goal-template update` | `--service-group-name`, `--goal-template-name` | Update mutable goal, HA/DR, RPO, or RTO settings. | +| `goal-template wait` | `--service-group-name`, `--goal-template-name`, one wait condition | Wait for a template state. | + +### Goal assignments and resources + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `goal-assignment create` | `--service-group-name`, `--goal-assignment-name`, `--goal-assignment-type`, `--goal-template-id` | Assign an existing template. Each supplied `--service-level-resources` item requires `service-level-indicator-resource-id`. | +| `goal-assignment delete` | `--service-group-name`, `--goal-assignment-name` | Delete an existing assignment. | +| `goal-assignment list` | `--service-group-name` | List assignments in a service group. | +| `goal-assignment recommend-capacity` | `--service-group-name`, `--goal-assignment-name`, `--resource-ids` | Request capacity recommendations for ARM resource IDs under an existing assignment. | +| `goal-assignment refresh-goal-resource` | `--service-group-name`, `--goal-assignment-name` | Refresh discovery and evaluation of goal resources. | +| `goal-assignment show` | `--service-group-name`, `--goal-assignment-name` | Get an existing assignment. | +| `goal-assignment update` | `--service-group-name`, `--goal-assignment-name` | Update template, type, zonal requirement, or service-level resources. Preserve required assignment properties. | +| `goal-assignment update-goal-resource` | `--service-group-name`, `--goal-assignment-name`, `--resources` | Update discovered goal resources. Confirmation entries require `confirmation-status` and `solution-display-name`. | +| `goal-assignment wait` | `--service-group-name`, `--goal-assignment-name`, one wait condition | Wait for an assignment state. | +| `goal-assignment goal-resource list` | `--service-group-name`, `--goal-assignment-name` | List resources discovered for an assignment. | +| `goal-assignment goal-resource show` | `--service-group-name`, `--goal-assignment-name`, `--goal-resource-name` | Get a goal-resource name returned by `goal-resource list`. | + +### Drills + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `drill create` | `--service-group-name`, `--drill-name`, one of `--regional` or `--zonal` | Create a drill in an enrolled service group. Chaos identities require `{type,user-assigned-identity}`; drill assets require `{region,subscription}`. Monitoring and recovery-plan objects have scenario-specific identity and resource-ID requirements. | +| `drill delete` | `--service-group-name`, `--drill-name` | Delete an existing non-running drill. | +| `drill list` | `--service-group-name` | List drills in a service group. | +| `drill show` | `--service-group-name`, `--drill-name` | Get an existing drill. | +| `drill update` | `--service-group-name`, `--drill-name` | Update mutable drill settings while the drill is not running. | +| `drill wait` | `--service-group-name`, `--drill-name`, one wait condition | Wait for a drill state. | +| `drill add-or-update-resource` | `--service-group-name`, `--drill-name`, `--operation-id`, `--fault-duration-in-min` | Add, update, or exclude drill resources. Included/updated entries require a drill-resource `id`; custom faults require `fault-name` and `script-resource-id`, while overridden faults require `fault-name`, `fault-urn`, and `target-resource-id`. | +| `drill resync-readiness-check` | `--service-group-name`, `--drill-name`, `--operation-id` | Re-evaluate readiness after resources or permissions change. | +| `drill validate-for-execution` | `--service-group-name`, `--drill-name`, `--operation-id` | Validate that a provisioned drill is ready to start. | +| `drill start` | `--service-group-name`, `--drill-name`, `--operation-id`, `--mode` | Start a ready drill. Capture the returned drill-run name. | +| `drill end` | `--service-group-name`, `--drill-name`, `--operation-id`, `--attestation`, `--attestation-notes` | End a running drill and record its attestation. | +| `drill drill-resource list` | `--service-group-name`, `--drill-name` | List resources included in an existing drill. | +| `drill drill-resource show` | `--service-group-name`, `--drill-name`, `--drill-resource-name` | Get a drill-resource name returned by `drill-resource list`. | +| `drill identity assign` | `--service-group-name`, `--drill-name`, identity option | Assign `--system-assigned` and/or `--user-assigned` identities to an existing drill. | +| `drill identity remove` | `--service-group-name`, `--drill-name`, identity option | Remove selected identities from an existing non-running drill. | +| `drill identity show` | `--service-group-name`, `--drill-name` | Show the drill identity. | +| `drill identity wait` | `--service-group-name`, `--drill-name`, one wait condition | Wait for the drill identity resource. | + +### Drill runs + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `drill drill-run list` | `--service-group-name`, `--drill-name` | List runs for an existing drill. | +| `drill drill-run show` | `--service-group-name`, `--drill-name`, `--drill-run-name` | Get a run returned by `drill-run list` or `drill start`. | +| `drill drill-run add-note` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Add a note to an existing run; supply the optional note body as required by the scenario. | +| `drill drill-run fail-over` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id`, failover request | Fail over a running drill. The request requires `failover-direction`, `source-locations`, and `user-consent`. | +| `drill drill-run generate-report` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Generate a report after the run has sufficient execution data. | +| `drill drill-run list-report-download-url` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Obtain download URLs after report generation completes. | +| `drill drill-run mark-as-complete` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id`, `--drill-run-stage` | Complete the current manual stage of a run. | +| `drill drill-run reprotect` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Reprotect resources after a supported failover stage. | +| `drill drill-run resume` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Resume a paused run. | +| `drill drill-run drill-run-resource list` | `--service-group-name`, `--drill-name`, `--drill-run-name` | List resources processed by a run. | +| `drill drill-run drill-run-resource show` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--drill-run-resource-name` | Get a run-resource name returned by the corresponding list command. | + +### Recovery plans + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `recovery-plan create` | `--service-group-name`, `--recovery-plan-name`, `--plan-type`, `--plan-description`, `--recovery-groups-setting` | Create a plan in an enrolled service group. `recovery-groups-setting.default-group` requires `description`, `group-unique-id`, and `order-id`; every pre/post action requires `name` and `timeout-in-minutes`. | +| `recovery-plan delete` | `--service-group-name`, `--recovery-plan-name` | Delete a plan with no active recovery job. | +| `recovery-plan list` | `--service-group-name` | List recovery plans in a service group. | +| `recovery-plan show` | `--service-group-name`, `--recovery-plan-name` | Get an existing plan. | +| `recovery-plan update` | `--service-group-name`, `--recovery-plan-name` | Update description or recovery-group settings while no operation is active. | +| `recovery-plan wait` | `--service-group-name`, `--recovery-plan-name`, one wait condition | Wait for a recovery-plan state. | +| `recovery-plan check-readiness` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Start a readiness evaluation. | +| `recovery-plan update-resource` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, update request | Add/update entries that include `type` and `resource-id`, or remove existing recovery-resource IDs. | +| `recovery-plan validate-for-operation` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--operation-name` | Validate one of `Failover`, `FailoverCommit`, `Reprotect`, `TestFailover`, or `TestFailoverCleanup`. | +| `recovery-plan validate-for-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction`, failover request | Validate failover; request requires `source-locations` and `user-consent`. | +| `recovery-plan validate-for-test-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction`, failover request | Validate test failover with source locations and user consent. | +| `recovery-plan validate-for-failover-commit` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Validate commit after a completed failover. | +| `recovery-plan validate-for-reprotect` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Validate reprotection in a compatible post-failover state. | +| `recovery-plan validate-for-test-failover-cleanup` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Validate cleanup after test failover. | +| `recovery-plan failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction`, failover request | Execute validated failover. The request requires `source-locations` and `user-consent`. | +| `recovery-plan test-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction`, failover request | Execute a validated test failover. | +| `recovery-plan failover-commit` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Commit a successfully completed failover. | +| `recovery-plan reprotect` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Reprotect resources after failover. | +| `recovery-plan test-failover-cleanup` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Clean up resources created by test failover. | +| `recovery-plan finalize` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Finalize a completed recovery workflow. | +| `recovery-plan recovery-resource list` | `--service-group-name`, `--recovery-plan-name` | List resources discovered or added to a plan. | +| `recovery-plan recovery-resource show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-resource-name` | Get a recovery-resource name returned by the corresponding list command. | +| `recovery-plan identity assign` | `--service-group-name`, `--recovery-plan-name`, identity option | Assign `--system-assigned` and/or `--user-assigned` identities to an idle plan. | +| `recovery-plan identity remove` | `--service-group-name`, `--recovery-plan-name`, identity option | Remove selected identities from an idle plan. | +| `recovery-plan identity show` | `--service-group-name`, `--recovery-plan-name` | Show the recovery-plan identity. | +| `recovery-plan identity wait` | `--service-group-name`, `--recovery-plan-name`, one wait condition | Wait for the recovery-plan identity resource. | + +### Recovery jobs + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `recovery-plan recovery-job list` | `--service-group-name`, `--recovery-plan-name` | List jobs produced by recovery-plan actions. | +| `recovery-plan recovery-job show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name` | Get a job returned by `recovery-job list` or an action. | +| `recovery-plan recovery-job cancel` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Cancel a job whose current state supports cancellation. | +| `recovery-plan recovery-job resume` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Resume a paused or waiting job. | +| `recovery-plan recovery-job retry` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Retry a failed job that the service marks retryable. | +| `recovery-plan recovery-job recovery-job-resource list` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name` | List resources processed by a recovery job. | +| `recovery-plan recovery-job recovery-job-resource show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--recovery-job-resource-name` | Get a job-resource name returned by the corresponding list command. | + +### Unified resilience items + +| Command | Required parameters | Purpose and prerequisites | +|--|--|--| +| `unified-resilience-item list` | `--service-group-name` | List aggregated resilience items. The caller needs service-specific read authorization and the service group must contain discoverable resources. | +| `unified-resilience-item show` | `--service-group-name`, `--unified-resilience-item-name` | Get an item name returned by `unified-resilience-item list`. | + +## Usage examples + +Set reusable values and create a client-generated operation ID: + +```powershell +$serviceGroup = "MyServiceGroup" +$subscriptionId = az account show --query id --output tsv +$operationId = [guid]::NewGuid().Guid +``` + +Create a usage plan and enroll the service group: + +```bash +az resilience usage-plan create \ + --resource-group MyResourceGroup \ + --usage-plan-name MyUsagePlan \ + --location global \ + --plan-type Standard + +az resilience usage-plan enrollment create \ + --resource-group MyResourceGroup \ + --usage-plan-name MyUsagePlan \ + --enrollment-name MyEnrollment \ + --service-group-id /providers/Microsoft.Management/serviceGroups/MyServiceGroup +``` + +Create a goal template and assignment: + +```bash +az resilience goal-template create \ + --service-group-name MyServiceGroup \ + --goal-template-name MyGoalTemplate \ + --goal-type Resiliency \ + --require-high-availability Required \ + --regional-recovery-time-objective PT30M + +az resilience goal-assignment create \ + --service-group-name MyServiceGroup \ + --goal-assignment-name MyGoalAssignment \ + --goal-assignment-type Resiliency \ + --goal-template-id /providers/Microsoft.Management/serviceGroups/MyServiceGroup/providers/Microsoft.AzureResilienceManagement/goalTemplates/MyGoalTemplate +``` + +Create a minimal recovery plan with a default recovery group: + +```powershell +$groupId = [guid]::NewGuid().Guid +$groups = "{defaultGroup:{description:DefaultGroup,groupUniqueId:$groupId,orderId:0}}" + +az resilience recovery-plan create ` + --service-group-name $serviceGroup ` + --recovery-plan-name MyRecoveryPlan ` + --plan-type Regional ` + --plan-description "My recovery plan" ` + --recovery-groups-setting $groups +``` + +Validate a failover request before executing it: + +```powershell +$operationId = [guid]::NewGuid().Guid +$request = "{sourceLocations:[eastus],executionConfigurations:{userConsent:Allowed}}" + +az resilience recovery-plan validate-for-failover ` + --service-group-name $serviceGroup ` + --recovery-plan-name MyRecoveryPlan ` + --operation-id $operationId ` + --failover-direction FromSpecificLocations ` + --failover-request-properties $request +``` + +List goal templates for a service group: + +```bash +az resilience goal-template list --service-group-name MyServiceGroup +``` + +List drills for a service group: + +```bash +az resilience drill list --service-group-name MyServiceGroup +``` + +Show a recovery plan: + +```bash +az resilience recovery-plan show \ + --service-group-name MyServiceGroup \ + --recovery-plan-name MyRecoveryPlan +``` + +List usage plans in the current subscription or in a resource group: + +```bash +az resilience usage-plan list +az resilience usage-plan list --resource-group MyResourceGroup +``` + +Clean up child resources before their parents: + +```bash +az resilience goal-assignment delete \ + --service-group-name MyServiceGroup \ + --goal-assignment-name MyGoalAssignment \ + --yes + +az resilience goal-template delete \ + --service-group-name MyServiceGroup \ + --goal-template-name MyGoalTemplate \ + --yes +``` + +For the complete command and argument reference, run: + +```bash +az resilience --help +az resilience --help +``` \ No newline at end of file diff --git a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py index acd84c8b556..e2c6eda9946 100644 --- a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py +++ b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py @@ -5,9 +5,169 @@ # Code generated by aaz-dev-tools # -------------------------------------------------------------------------------------------- -from azure.cli.testsdk import * +import ast +import importlib.util +import pathlib +import re +import sys +import unittest -class AzureResilienceManagementScenario(ScenarioTest): - # TODO: add tests here - pass +class AzureResilienceManagementGeneratedTests(unittest.TestCase): + AAZ_ROOT = pathlib.Path(__file__).resolve().parents[2] / 'aaz' / 'latest' / 'resilience' + EXTENSION_ROOT = pathlib.Path(__file__).resolve().parents[3] + README = EXTENSION_ROOT / 'README.md' + API_VERSION = '2026-08-31-preview' + EXPECTED_GROUPS = { + 'resilience', + 'resilience drill', + 'resilience drill drill-resource', + 'resilience drill drill-run', + 'resilience drill drill-run drill-run-resource', + 'resilience drill identity', + 'resilience goal-assignment', + 'resilience goal-assignment goal-resource', + 'resilience goal-template', + 'resilience recovery-plan', + 'resilience recovery-plan identity', + 'resilience recovery-plan recovery-job', + 'resilience recovery-plan recovery-job recovery-job-resource', + 'resilience recovery-plan recovery-resource', + 'resilience unified-resilience-item', + 'resilience usage-plan', + 'resilience usage-plan enrollment', + } + + def _command_files(self): + return [ + path for path in self.AAZ_ROOT.rglob('_*.py') + if path.name not in {'__init__.py', '__cmd_group.py'} + ] + + def _registered_commands(self): + command_pattern = re.compile(r'@register_command\(\s*"([^"]+)"') + commands = [] + for path in self._command_files(): + matches = command_pattern.findall(path.read_text(encoding='utf-8')) + self.assertEqual(1, len(matches), f'Expected one command registration in {path}') + commands.extend(matches) + return commands + + def test_expected_command_surface_is_generated(self): + self.assertTrue(self.AAZ_ROOT.is_dir(), f'AAZ root not found at {self.AAZ_ROOT}') + commands = self._registered_commands() + + self.assertEqual(92, len(commands)) + self.assertEqual(len(commands), len(set(commands))) + + def test_registered_commands_match_readme(self): + readme = self.README.read_text(encoding='utf-8') + command_section = readme.split('## Complete command list', 1)[1].split('## Usage examples', 1)[0] + documented_commands = [ + line.removeprefix('az ') + for line in command_section.splitlines() + if line.startswith('az resilience ') + ] + self.assertEqual(92, len(documented_commands)) + self.assertEqual(len(documented_commands), len(set(documented_commands))) + self.assertEqual(set(self._registered_commands()), set(documented_commands)) + + def test_command_reference_matches_generated_commands(self): + readme = self.README.read_text(encoding='utf-8') + reference_section = readme.split('## Command reference', 1)[1].split('## Usage examples', 1)[0] + referenced_commands = re.findall(r'^\| `([^`]+)` \|', reference_section, re.MULTILINE) + referenced_commands = [f'resilience {command}' for command in referenced_commands] + + self.assertEqual(92, len(referenced_commands)) + self.assertEqual(len(referenced_commands), len(set(referenced_commands))) + self.assertEqual(set(self._registered_commands()), set(referenced_commands)) + + def test_expected_command_groups_are_generated(self): + group_pattern = re.compile(r'@register_command_group\(\s*"([^"]+)"') + groups = [] + for path in self.AAZ_ROOT.rglob('__cmd_group.py'): + matches = group_pattern.findall(path.read_text(encoding='utf-8')) + self.assertEqual(1, len(matches), f'Expected one group registration in {path}') + groups.extend(matches) + + self.assertEqual(len(groups), len(set(groups))) + self.assertEqual(self.EXPECTED_GROUPS, set(groups)) + + def test_api_version_is_consistent(self): + resource_pattern = re.compile( + r'\["mgmt-plane",\s*"[^"]+",\s*"([^"]+)"(?:,\s*"[^"]+")*\]' + ) + for path in self._command_files(): + text = path.read_text(encoding='utf-8') + self.assertIn('_aaz_info', text, f'AAZ resource metadata missing in {path}') + versions = set(resource_pattern.findall(text)) + self.assertEqual( + {self.API_VERSION}, + versions, + f'Missing or unexpected API version in {path}', + ) + + def test_list_commands_support_pagination(self): + list_commands = list(self.AAZ_ROOT.rglob('_list.py')) + self.assertTrue(list_commands, 'No list commands found') + for path in list_commands: + text = path.read_text(encoding='utf-8') + self.assertIn('AZ_SUPPORT_PAGINATION = True', text, f'Pagination missing in {path}') + + def test_lro_commands_support_no_wait(self): + lro_commands = [] + for path in self._command_files(): + text = path.read_text(encoding='utf-8') + if 'build_lro_poller' in text: + lro_commands.append(path) + self.assertIn('AZ_SUPPORT_NO_WAIT = True', text, f'--no-wait missing in {path}') + self.assertTrue(lro_commands, 'No LRO commands found') + + def test_generated_operation_hooks_are_pristine(self): + offenders = [] + for path in self._command_files(): + tree = ast.parse(path.read_text(encoding='utf-8'), filename=str(path)) + hooks = [ + node for node in ast.walk(tree) + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) + and node.name in {'pre_operations', 'post_operations'} + ] + self.assertEqual( + {'pre_operations', 'post_operations'}, + {hook.name for hook in hooks}, + f'Generated operation hooks missing in {path}', + ) + for node in hooks: + if not (len(node.body) == 1 and isinstance(node.body[0], ast.Pass)): + offenders.append(f'{path.relative_to(self.AAZ_ROOT)}:{node.name}') + self.assertFalse(offenders, f'Generated operation hooks contain custom logic: {offenders}') + + def test_loader_is_wired_to_aaz(self): + init_text = (self.EXTENSION_ROOT / 'azext_azure_resilience_management' / '__init__.py').read_text( + encoding='utf-8' + ) + self.assertIn('load_aaz_command_table(', init_text) + self.assertIn('COMMAND_LOADER_CLS = AzureResilienceManagementCommandsLoader', init_text) + + +try: + AZURE_CLI_AVAILABLE = importlib.util.find_spec('azure.cli.core') is not None +except ModuleNotFoundError: + AZURE_CLI_AVAILABLE = False + + +@unittest.skipUnless(AZURE_CLI_AVAILABLE, 'Azure CLI is not installed') +class AzureResilienceManagementLoaderTests(unittest.TestCase): + def test_command_loader_class_is_an_azure_cli_loader(self): + sys.path.insert(0, str(AzureResilienceManagementGeneratedTests.EXTENSION_ROOT)) + try: + from azure.cli.core import AzCommandsLoader + from azext_azure_resilience_management import COMMAND_LOADER_CLS + + self.assertTrue(issubclass(COMMAND_LOADER_CLS, AzCommandsLoader)) + finally: + sys.path.pop(0) + + +if __name__ == '__main__': + unittest.main() diff --git a/src/service_name.json b/src/service_name.json index 42593e99f73..7b446676619 100644 --- a/src/service_name.json +++ b/src/service_name.json @@ -584,6 +584,11 @@ "AzureServiceName": "Cache for Redis", "URL": "https://learn.microsoft.com/azure/azure-cache-for-redis" }, + { + "Command": "az resilience", + "AzureServiceName": "Azure Resilience Management", + "URL": "https://learn.microsoft.com/azure/resiliency/infrastructure-resiliency-manager-overview" + }, { "Command": "az relationship", "AzureServiceName": "Azure Relationships", From 0c45438d21ef7c3cfee55ea62df3934be2c97108 Mon Sep 17 00:00:00 2001 From: Krishna Tripathi Date: Fri, 11 Sep 2026 02:04:46 +0530 Subject: [PATCH 3/4] Fix formatting in HISTORY.rst for consistency in release notes --- src/azure-resilience-management/HISTORY.rst | 30 ++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/azure-resilience-management/HISTORY.rst b/src/azure-resilience-management/HISTORY.rst index 79bd251f74b..919035a19bd 100644 --- a/src/azure-resilience-management/HISTORY.rst +++ b/src/azure-resilience-management/HISTORY.rst @@ -6,20 +6,20 @@ Release History 1.0.0b1 +++++++ * Initial preview release of the ``azure-resilience-management`` extension. - Targets API version ``2026-08-31-preview`` of - ``Microsoft.AzureResilienceManagement``. + Targets API version ``2026-08-31-preview`` of + ``Microsoft.AzureResilienceManagement``. - Command surface: + Command surface: - * ``az resilience drill`` -- manage drills, drill resources, drill runs, - reports, and managed identities. - * ``az resilience goal-assignment`` -- manage goal assignments, goal - resources, capacity recommendations, and resource refresh operations. - * ``az resilience goal-template`` -- create and manage reusable goal - templates. - * ``az resilience recovery-plan`` -- manage recovery plans, recovery - resources, recovery jobs, managed identities, and recovery operations. - * ``az resilience unified-resilience-item`` -- list and show aggregated - resilience information. - * ``az resilience usage-plan`` -- manage subscription usage plans and - service-group enrollments. \ No newline at end of file + * ``az resilience drill`` -- manage drills, drill resources, drill runs, + reports, and managed identities. + * ``az resilience goal-assignment`` -- manage goal assignments, goal + resources, capacity recommendations, and resource refresh operations. + * ``az resilience goal-template`` -- create and manage reusable goal + templates. + * ``az resilience recovery-plan`` -- manage recovery plans, recovery + resources, recovery jobs, managed identities, and recovery operations. + * ``az resilience unified-resilience-item`` -- list and show aggregated + resilience information. + * ``az resilience usage-plan`` -- manage subscription usage plans and + service-group enrollments. From af7b3338dab30f7f9bd555c1ecc4403dabcdf290 Mon Sep 17 00:00:00 2001 From: Krishna Tripathi Date: Wed, 16 Sep 2026 00:56:37 +0530 Subject: [PATCH 4/4] Add team testing guide and enhance tests for command documentation consistency --- src/azure-resilience-management/README.md | 4 + .../TEAM-TESTING-README.md | 266 ++++++++++++++++++ .../test_azure_resilience_management.py | 13 + 3 files changed, 283 insertions(+) create mode 100644 src/azure-resilience-management/TEAM-TESTING-README.md diff --git a/src/azure-resilience-management/README.md b/src/azure-resilience-management/README.md index 1b6ff5ad27d..60ce8f9c991 100644 --- a/src/azure-resilience-management/README.md +++ b/src/azure-resilience-management/README.md @@ -3,6 +3,10 @@ This extension provides commands for managing Azure Resilience Management resources through the `az resilience` command group. +For team-based validation of every command, required parameters, optional +parameter effects, and lifecycle order, see +[TEAM-TESTING-README.md](TEAM-TESTING-README.md). + ## Install ```bash diff --git a/src/azure-resilience-management/TEAM-TESTING-README.md b/src/azure-resilience-management/TEAM-TESTING-README.md new file mode 100644 index 00000000000..6a67b1799ea --- /dev/null +++ b/src/azure-resilience-management/TEAM-TESTING-README.md @@ -0,0 +1,266 @@ +# Azure Resilience Management CLI Team Testing Guide + +This guide divides all 92 `az resilience` commands into independent test areas. It +is intended for handoff to feature teams testing API version +`2026-08-31-preview`. + +## How to read the tables + +- **CLI-required** lists arguments enforced by the generated command parser. +- **Scenario inputs and effect** lists optional arguments and inputs that the + service may require for a useful scenario. +- `--operation-id` must be a new caller-generated GUID for every action. +- Add `--no-wait` to a long-running command to return immediately instead of + waiting for completion. +- List commands accept `--top` to limit the page and `--skip-token` to continue + from a service-provided token when those arguments are exposed. +- Wait commands require one condition such as `--created`, `--updated`, + `--deleted`, `--exists`, or `--custom`; use `--interval` and `--timeout` to + control polling. +- Resource names used by child `show` and action commands must come from their + corresponding parent response or `list` command. + +## Shared test setup + +```powershell +$serviceGroup = "" +$resourceGroup = "" +$usagePlan = "" +$operationId = [guid]::NewGuid().Guid +``` + +Before feature testing: + +1. Select a subscription and cloud that supports the preview API. +2. Register `Microsoft.AzureResilienceManagement` and providers used by the + protected resources. +3. Grant the tester and managed identities the required permissions. +4. Create a usage plan and enroll the service group. +5. Add representative resources to the service group. +6. Do not run concurrent actions against the same drill or recovery plan. + +## Team assignment summary + +| Team package | Command count | Primary responsibility | +|---|---:|---| +| Platform onboarding | 12 | Usage plans and service-group enrollment | +| Goals | 17 | Goal templates, assignments, recommendations, and resources | +| Drills | 28 | Drill definition, identity, execution, runs, and reports | +| Recovery operations (RO) | 33 | Recovery plans, identity, actions, jobs, and resources | +| Unified inventory | 2 | Aggregated resilience discovery | +| **Total** | **92** | | + +## Team 1: Platform onboarding + +Create the usage plan before enrollment. Delete enrollments before deleting the +plan. The service currently expects `global` for the usage-plan location. + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience usage-plan create` | `--resource-group`, `--usage-plan-name`, `--location` | `--plan-type Basic|Standard` selects the plan tier; `--tags` adds ARM metadata; use `--location global`. | +| `az resilience usage-plan show` | `--resource-group`, `--usage-plan-name` | Read-only verification of properties and provisioning state. | +| `az resilience usage-plan list` | None | `--resource-group` changes scope from subscription to one resource group; pagination controls page size/continuation. | +| `az resilience usage-plan update` | `--resource-group`, `--usage-plan-name` | `--plan-type` sends a tier change; `--tags` replaces/updates resource tags. | +| `az resilience usage-plan delete` | `--resource-group`, `--usage-plan-name` | `--yes` skips confirmation; `--no-wait` returns before deletion completes. Remove enrollments first. | +| `az resilience usage-plan wait` | `--resource-group`, `--usage-plan-name`, wait condition | Polls until the selected condition; `--interval` and `--timeout` tune polling. | +| `az resilience usage-plan enrollment create` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | `--service-group-id` associates `/providers/Microsoft.Management/serviceGroups/`; although optional in the CLI schema, it is needed for a useful enrollment. | +| `az resilience usage-plan enrollment show` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | Read-only verification of the service-group association. | +| `az resilience usage-plan enrollment list` | `--resource-group`, `--usage-plan-name` | Lists enrolled service groups; pagination controls page traversal. | +| `az resilience usage-plan enrollment update` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | `--service-group-id` changes the associated service group; `--no-wait` returns immediately. | +| `az resilience usage-plan enrollment delete` | `--resource-group`, `--usage-plan-name`, `--enrollment-name` | `--yes` skips confirmation; `--no-wait` returns immediately. | +| `az resilience usage-plan enrollment wait` | `--resource-group`, `--usage-plan-name`, `--enrollment-name`, wait condition | Polls enrollment provisioning or deletion state. | + +### Platform acceptance flow + +`usage-plan create` -> `usage-plan show/list` -> `enrollment create` -> +`enrollment show/list/update` -> `enrollment delete` -> `usage-plan delete`. + +## Team 2: Goals + +Create a goal template before a goal assignment. Goal resources appear after the +assignment is evaluated or refreshed. + +### Goal templates + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience goal-template create` | `--service-group-name`, `--goal-template-name` | `--goal-type Resiliency` identifies the goal; `--require-high-availability` and `--require-disaster-recovery` enable those evaluations; regional RPO/RTO arguments set ISO 8601 targets such as `PT15M`. | +| `az resilience goal-template show` | `--service-group-name`, `--goal-template-name` | Read-only verification of the template. | +| `az resilience goal-template list` | `--service-group-name` | `--top` limits results; `--skip-token` continues a page. | +| `az resilience goal-template update` | `--service-group-name`, `--goal-template-name` | Goal type, HA/DR requirements, and regional RPO/RTO arguments change the corresponding policy targets; `--no-wait` returns immediately. | +| `az resilience goal-template delete` | `--service-group-name`, `--goal-template-name` | `--yes` skips confirmation; delete assignments referencing the template first. | +| `az resilience goal-template wait` | `--service-group-name`, `--goal-template-name`, wait condition | Polls the selected resource condition. | + +### Goal assignments and resources + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience goal-assignment create` | `--service-group-name`, `--goal-assignment-name` | `--goal-assignment-type Resiliency` selects assignment behavior; `--goal-template-id` links the template; `--require-zonal-resiliency` enables zonal evaluation; `--service-level-resources` links SLI/SLO ARM IDs. Type and template are needed for the normal scenario even though the CLI schema marks them optional. | +| `az resilience goal-assignment show` | `--service-group-name`, `--goal-assignment-name` | Read-only verification of assignment and evaluation state. | +| `az resilience goal-assignment list` | `--service-group-name` | `--top` limits results; `--skip-token` continues a page. | +| `az resilience goal-assignment update` | `--service-group-name`, `--goal-assignment-name` | Supplying type, template ID, zonal requirement, or service-level resources changes only those assignment settings; `--no-wait` returns immediately. | +| `az resilience goal-assignment delete` | `--service-group-name`, `--goal-assignment-name` | `--yes` skips confirmation; `--no-wait` returns immediately. | +| `az resilience goal-assignment wait` | `--service-group-name`, `--goal-assignment-name`, wait condition | Polls assignment provisioning or deletion. | +| `az resilience goal-assignment recommend-capacity` | `--service-group-name`, `--goal-assignment-name`, `--resource-ids` | Requests capacity recommendations only for the supplied ARM resource IDs. | +| `az resilience goal-assignment refresh-goal-resource` | `--service-group-name`, `--goal-assignment-name` | Re-runs resource discovery and goal evaluation after membership or configuration changes. | +| `az resilience goal-assignment update-goal-resource` | `--service-group-name`, `--goal-assignment-name`, `--resources` | Each resource can change HA/DR/zonal participation and attestation. User confirmations require `confirmation-status` and `solution-display-name`; exclusion or attestation fields affect recommendation evaluation. | +| `az resilience goal-assignment goal-resource list` | `--service-group-name`, `--goal-assignment-name` | Lists discovered/evaluated resources; pagination controls page traversal. | +| `az resilience goal-assignment goal-resource show` | `--service-group-name`, `--goal-assignment-name`, `--goal-resource-name` | Shows one resource name returned by `goal-resource list`. | + +### Goals acceptance flow + +`goal-template create` -> `goal-assignment create` -> `refresh-goal-resource` -> +`goal-resource list/show` -> `recommend-capacity` -> +`update-goal-resource` -> update commands -> cleanup. + +## Team 3: Drills + +A drill requires enrolled service-group resources and identities with access to +Chaos, monitoring, recovery, and protected resources used by the scenario. + +### Drill definition, resources, and identity + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience drill create` | `--service-group-name`, `--drill-name` | Supply exactly one of `--regional` or `--zonal` to select drill type. `--system-assigned`/`--user-assigned` attach identities. `--drill-asset-properties` selects subscription, region, and optional resource group. Chaos, health-model, SLI, monitoring, and recovery-plan objects enable those integrations. `--rbac-setup-mode` chooses automated built-in/custom roles or manual setup. | +| `az resilience drill show` | `--service-group-name`, `--drill-name` | Read-only verification of configuration and readiness. | +| `az resilience drill list` | `--service-group-name` | `--top` limits results; `--skip-token` continues a page. | +| `az resilience drill update` | `--service-group-name`, `--drill-name` | Supplied regional, asset, Chaos, monitoring, RBAC, recovery-plan, or SLI settings replace those portions. Do not run while executing. The current generated update path is affected by the missing read-visible `drillType` defect. | +| `az resilience drill delete` | `--service-group-name`, `--drill-name` | Deletes a non-running drill; `--yes` skips confirmation and `--no-wait` returns immediately. | +| `az resilience drill wait` | `--service-group-name`, `--drill-name`, wait condition | Polls drill provisioning or deletion. | +| `az resilience drill add-or-update-resource` | `--service-group-name`, `--drill-name`, `--operation-id`, `--fault-duration-in-min` | `--resource-lists` includes, updates, or excludes resources. Custom faults need fault name and script resource ID; overridden faults need fault name, fault URN, and target resource ID. `--force-inclusion-and-update` overrides normal inclusion behavior. | +| `az resilience drill resync-readiness-check` | `--service-group-name`, `--drill-name`, `--operation-id` | Re-evaluates readiness after resources, RBAC, or configuration changes. | +| `az resilience drill validate-for-execution` | `--service-group-name`, `--drill-name`, `--operation-id` | `--validate-for-execution-properties` narrows/configures validation when supplied; otherwise validates the configured drill. | +| `az resilience drill drill-resource list` | `--service-group-name`, `--drill-name` | Lists resources participating in the drill; pagination controls page traversal. | +| `az resilience drill drill-resource show` | `--service-group-name`, `--drill-name`, `--drill-resource-name` | Shows one name returned by `drill-resource list`. | +| `az resilience drill identity assign` | `--service-group-name`, `--drill-name` | `--system-assigned` enables the system identity; `--user-assigned` adds identity resource IDs. At least one identity option is needed for a meaningful assignment. | +| `az resilience drill identity remove` | `--service-group-name`, `--drill-name` | `--system-assigned` removes the system identity; `--user-assigned` removes selected IDs. Do not remove identities while running. | +| `az resilience drill identity show` | `--service-group-name`, `--drill-name` | Read-only identity verification. | +| `az resilience drill identity wait` | `--service-group-name`, `--drill-name`, wait condition | Polls identity update state. | + +### Drill execution, runs, and reports + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience drill start` | `--service-group-name`, `--drill-name`, `--operation-id`, `--mode` | Starts a validated drill in the selected execution mode; capture the returned drill-run GUID. | +| `az resilience drill end` | `--service-group-name`, `--drill-name`, `--operation-id`, `--attestation`, `--attestation-notes` | Ends the active drill and records the tester's attestation and notes. | +| `az resilience drill drill-run list` | `--service-group-name`, `--drill-name` | Lists runs; pagination traverses additional pages. | +| `az resilience drill drill-run show` | `--service-group-name`, `--drill-name`, `--drill-run-name` | Shows one run GUID returned by start/list. | +| `az resilience drill drill-run add-note` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | `--notes` appends tester/operator context to the run. | +| `az resilience drill drill-run fail-over` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | `--auto-failover Enable|Disable` controls pausing for manual input. `--failover-properties` supplies direction plus source locations, optional selected resource IDs, and execution user consent. | +| `az resilience drill drill-run mark-as-complete` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id`, `--drill-run-stage` | Marks the specified manual stage complete so orchestration can continue. | +| `az resilience drill drill-run resume` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Resumes a paused run. | +| `az resilience drill drill-run reprotect` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | `--reprotect-properties` selects/configures resources for reprotection after failover. | +| `az resilience drill drill-run generate-report` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | Generates a report after sufficient run data exists. | +| `az resilience drill drill-run list-report-download-url` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--operation-id` | `--format` selects the requested report representation and returns temporary download URLs. | +| `az resilience drill drill-run drill-run-resource list` | `--service-group-name`, `--drill-name`, `--drill-run-name` | Lists resources processed by the run; pagination traverses pages. | +| `az resilience drill drill-run drill-run-resource show` | `--service-group-name`, `--drill-name`, `--drill-run-name`, `--drill-run-resource-name` | Shows one run resource returned by the list command. | + +### Drills acceptance flow + +Create -> identity/RBAC -> add resources -> resync readiness -> validate -> start -> +run actions -> end -> generate/download report -> inspect resources -> delete. + +## Team 4: Recovery operations (RO) + +Recovery commands are stateful. Run the matching `validate-for-*` command before +the destructive action and wait for each recovery job to finish. + +### Recovery-plan definition, resources, and identity + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience recovery-plan create` | `--service-group-name`, `--recovery-plan-name` | The normal service scenario also needs `--plan-type Regional|Zonal`, `--plan-description`, and `--recovery-groups-setting`. The default group requires description, unique GUID, and order; actions require name and timeout. `--system-assigned`/`--user-assigned` attach identities. | +| `az resilience recovery-plan show` | `--service-group-name`, `--recovery-plan-name` | Read-only verification of configuration and readiness. | +| `az resilience recovery-plan list` | `--service-group-name` | `--top` limits results; `--skip-token` continues a page. | +| `az resilience recovery-plan update` | `--service-group-name`, `--recovery-plan-name` | `--plan-description` changes text; `--recovery-groups-setting` replaces orchestration groups/actions. The current generated update path is affected by the missing read-visible `planType` defect. | +| `az resilience recovery-plan delete` | `--service-group-name`, `--recovery-plan-name` | Deletes an idle plan; `--yes` skips confirmation and `--no-wait` returns immediately. | +| `az resilience recovery-plan wait` | `--service-group-name`, `--recovery-plan-name`, wait condition | Polls plan provisioning or deletion. | +| `az resilience recovery-plan check-readiness` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Re-evaluates whether the plan, resources, identities, and permissions are ready. | +| `az resilience recovery-plan update-resource` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | `--resources-to-update` adds/changes entries with resource ID and protection type; `--resources-to-remove` removes existing recovery-resource IDs. | +| `az resilience recovery-plan recovery-resource list` | `--service-group-name`, `--recovery-plan-name` | Lists resources attached/discovered for the plan; pagination traverses pages. | +| `az resilience recovery-plan recovery-resource show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-resource-name` | Shows one resource GUID returned by the list command. | +| `az resilience recovery-plan identity assign` | `--service-group-name`, `--recovery-plan-name` | `--system-assigned` enables the system identity; `--user-assigned` adds identity resource IDs. | +| `az resilience recovery-plan identity remove` | `--service-group-name`, `--recovery-plan-name` | `--system-assigned` removes the system identity; `--user-assigned` removes selected IDs. The plan must be idle. | +| `az resilience recovery-plan identity show` | `--service-group-name`, `--recovery-plan-name` | Read-only identity verification. | +| `az resilience recovery-plan identity wait` | `--service-group-name`, `--recovery-plan-name`, wait condition | Polls identity update state. | + +### Recovery validation and execution + +For failover request objects, `source-locations` and +`execution-configurations.user-consent` are required when the object is supplied. +`selected-resource-ids` restricts execution; omitting it processes all qualified +resources in the source locations. + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience recovery-plan validate-for-operation` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--operation-name` | Runs generic validation for `Failover`, `FailoverCommit`, `Reprotect`, `TestFailover`, or `TestFailoverCleanup`. | +| `az resilience recovery-plan validate-for-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction` | `--failover-request-properties` supplies source locations, consent, and optional selected resources without executing failover. | +| `az resilience recovery-plan failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction` | Same request object as validation; executes production failover and creates a recovery job. | +| `az resilience recovery-plan validate-for-failover-commit` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Checks whether a completed failover can be committed. | +| `az resilience recovery-plan failover-commit` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Commits a successfully completed failover. | +| `az resilience recovery-plan validate-for-reprotect` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | `--reprotect-request-properties` selects/configures resources for validation. | +| `az resilience recovery-plan reprotect` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | `--reprotect-request-properties` selects/configures resources and executes reprotection. | +| `az resilience recovery-plan validate-for-test-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction` | Validates a non-production failover using optional selected resources in the request object. | +| `az resilience recovery-plan test-failover` | `--service-group-name`, `--recovery-plan-name`, `--operation-id`, `--failover-direction` | Executes the validated non-production failover and creates a recovery job. | +| `az resilience recovery-plan validate-for-test-failover-cleanup` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Checks whether test-created resources can be cleaned up. | +| `az resilience recovery-plan test-failover-cleanup` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | `--comments` records operator context while cleaning test-failover resources. | +| `az resilience recovery-plan finalize` | `--service-group-name`, `--recovery-plan-name`, `--operation-id` | Finalizes a completed recovery workflow after all required stages. | + +### Recovery jobs and job resources + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience recovery-plan recovery-job list` | `--service-group-name`, `--recovery-plan-name` | Lists jobs created by recovery actions; pagination traverses pages. | +| `az resilience recovery-plan recovery-job show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name` | Shows one job GUID returned by an action/list command. | +| `az resilience recovery-plan recovery-job cancel` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Cancels a cancellable job; `--description` records operator input/reason. | +| `az resilience recovery-plan recovery-job resume` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Resumes a paused/waiting job; `--description` supplies operator input. | +| `az resilience recovery-plan recovery-job retry` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--operation-id` | Retries a failed job only when the service marks it retryable. | +| `az resilience recovery-plan recovery-job recovery-job-resource list` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name` | Lists resources processed by the job; pagination traverses pages. | +| `az resilience recovery-plan recovery-job recovery-job-resource show` | `--service-group-name`, `--recovery-plan-name`, `--recovery-job-name`, `--recovery-job-resource-name` | Shows one job-resource GUID returned by the list command. | + +### Recovery acceptance flows + +Production: create -> identity -> update resources -> readiness -> validate failover -> +failover -> inspect job -> validate/commit -> validate/reprotect -> finalize. + +Test: validate test failover -> test failover -> inspect job/resources -> validate +cleanup -> cleanup -> finalize. + +## Team 5: Unified inventory + +| CLI | CLI-required | Scenario inputs and effect | +|---|---|---| +| `az resilience unified-resilience-item list` | `--service-group-name` | `--top` limits results and `--skip-token` continues a page. The service group must contain discoverable resources. | +| `az resilience unified-resilience-item show` | `--service-group-name`, `--unified-resilience-item-name` | Shows one item name returned by the list command. | + +## Test result template + +Each team should return one row per command, including commands blocked by resource +state or service defects. + +| CLI | Inputs/scenario | HTTP/result | Verdict | Job/resource ID | Notes or bug | +|---|---|---|---|---|---| +| Full tested command | Minimal/optional variant used | Status and key response | Pass/Fail/Blocked | ID if created | Reproduction details | + +Use these verdicts consistently: + +- **Pass**: CLI request and service behavior match the specification. +- **Fail - CLI**: parsing, serialization, polling, or output is incorrect while + equivalent REST succeeds. +- **Fail - service**: equivalent CLI and REST requests fail in the service. +- **Blocked**: prerequisite resource, permission, feature registration, or + lifecycle state is unavailable. + +## Known issues that should not be counted as new team regressions + +- Drill read/update generation is affected by `drillType` being create-only in + the current TypeSpec visibility. +- Recovery-plan show/update generation is affected by `planType` being + create-only in the current TypeSpec visibility. +- Some actions require specific service lifecycle states and cannot be tested + successfully by calling them out of sequence. + +For exact shorthand syntax and enum values, run the command with `--help` from the +same wheel being tested. Generic Azure CLI arguments such as `--output`, `--query`, +`--debug`, and `--subscription` are intentionally omitted from the tables. diff --git a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py index e2c6eda9946..b21ba706a01 100644 --- a/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py +++ b/src/azure-resilience-management/azext_azure_resilience_management/tests/latest/test_azure_resilience_management.py @@ -17,6 +17,7 @@ class AzureResilienceManagementGeneratedTests(unittest.TestCase): AAZ_ROOT = pathlib.Path(__file__).resolve().parents[2] / 'aaz' / 'latest' / 'resilience' EXTENSION_ROOT = pathlib.Path(__file__).resolve().parents[3] README = EXTENSION_ROOT / 'README.md' + TEAM_TESTING_README = EXTENSION_ROOT / 'TEAM-TESTING-README.md' API_VERSION = '2026-08-31-preview' EXPECTED_GROUPS = { 'resilience', @@ -82,6 +83,18 @@ def test_command_reference_matches_generated_commands(self): self.assertEqual(len(referenced_commands), len(set(referenced_commands))) self.assertEqual(set(self._registered_commands()), set(referenced_commands)) + def test_team_testing_guide_matches_generated_commands(self): + guide = self.TEAM_TESTING_README.read_text(encoding='utf-8') + documented_commands = re.findall( + r'^\| `az (resilience [^`]+)` \|', + guide, + re.MULTILINE, + ) + + self.assertEqual(92, len(documented_commands)) + self.assertEqual(len(documented_commands), len(set(documented_commands))) + self.assertEqual(set(self._registered_commands()), set(documented_commands)) + def test_expected_command_groups_are_generated(self): group_pattern = re.compile(r'@register_command_group\(\s*"([^"]+)"') groups = []