runbooks 1.1.2__tar.gz → 1.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. {runbooks-1.1.2/src/runbooks.egg-info → runbooks-1.1.3}/PKG-INFO +1 -1
  2. {runbooks-1.1.2 → runbooks-1.1.3}/pyproject.toml +1 -1
  3. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init__.py +1 -1
  4. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/cost_optimizer.py +158 -22
  5. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/business_logic.py +1 -1
  6. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/rich_utils.py +5 -5
  7. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/README.md +3 -3
  8. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cli.py +169 -103
  9. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/embedded_mcp_validator.py +101 -23
  10. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/finops_scenarios.py +90 -16
  11. runbooks-1.1.3/src/runbooks/finops/rds_snapshot_optimizer.py +1389 -0
  12. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/vpc_cleanup_optimizer.py +1 -1
  13. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/workspaces_analyzer.py +30 -12
  14. runbooks-1.1.3/src/runbooks/inventory/list_rds_snapshots_aggregator.py +745 -0
  15. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main.py +309 -38
  16. {runbooks-1.1.2 → runbooks-1.1.3/src/runbooks.egg-info}/PKG-INFO +1 -1
  17. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/SOURCES.txt +2 -0
  18. {runbooks-1.1.2 → runbooks-1.1.3}/LICENSE +0 -0
  19. {runbooks-1.1.2 → runbooks-1.1.3}/MANIFEST.in +0 -0
  20. {runbooks-1.1.2 → runbooks-1.1.3}/README.md +0 -0
  21. {runbooks-1.1.2 → runbooks-1.1.3}/setup.cfg +0 -0
  22. {runbooks-1.1.2 → runbooks-1.1.3}/src/conftest.py +0 -0
  23. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init__.py.backup +0 -0
  24. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init___optimized.py +0 -0
  25. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__main__.py +0 -0
  26. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/_platform/__init__.py +0 -0
  27. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/_platform/core/runbooks_wrapper.py +0 -0
  28. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/base.py +0 -0
  29. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/README.md +0 -0
  30. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/WEIGHT_CONFIG_README.md +0 -0
  31. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/__init__.py +0 -0
  32. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/app.ts +0 -0
  33. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/__init__.py +0 -0
  34. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/asana-import.csv +0 -0
  35. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/cfat-checks.csv +0 -0
  36. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/cfat.txt +0 -0
  37. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/collectors.py +0 -0
  38. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/compliance.py +0 -0
  39. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/jira-import.csv +0 -0
  40. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/runner.py +0 -0
  41. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/validators.py +0 -0
  42. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/cli.py +0 -0
  43. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/cloud_foundations_assessment.py +0 -0
  44. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/asana-import.csv +0 -0
  45. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cfat-checks.csv +0 -0
  46. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cfat.txt +0 -0
  47. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/checks-output.png +0 -0
  48. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-console-run.png +0 -0
  49. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-download.png +0 -0
  50. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-output.png +0 -0
  51. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/downloadfile.png +0 -0
  52. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/jira-import.csv +0 -0
  53. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/open-cloudshell.png +0 -0
  54. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/report-header.png +0 -0
  55. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/models.py +0 -0
  56. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/package-lock.json +0 -0
  57. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/package.json +0 -0
  58. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/report.py +0 -0
  59. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/__init__.py +0 -0
  60. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/exporters.py +0 -0
  61. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/formatters.py +0 -0
  62. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/templates.py +0 -0
  63. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/run-assessment.sh +0 -0
  64. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/runner.py +0 -0
  65. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-cloudtrail-existence.ts +0 -0
  66. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-config-existence.ts +0 -0
  67. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-control-tower.ts +0 -0
  68. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-ec2-existence.ts +0 -0
  69. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-iam-users.ts +0 -0
  70. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-legacy-cur.ts +0 -0
  71. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-org-cloudformation.ts +0 -0
  72. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-vpc-existence.ts +0 -0
  73. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-asanaimport.ts +0 -0
  74. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-backlog.ts +0 -0
  75. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-jiraimport.ts +0 -0
  76. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-report.ts +0 -0
  77. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/define-account-type.ts +0 -0
  78. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-enabled-org-policy-types.ts +0 -0
  79. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-enabled-org-services.ts +0 -0
  80. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-idc-info.ts +0 -0
  81. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-da-accounts.ts +0 -0
  82. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-details.ts +0 -0
  83. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-member-accounts.ts +0 -0
  84. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-ous.ts +0 -0
  85. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-regions.ts +0 -0
  86. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/zip-assessment.ts +0 -0
  87. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/types/index.d.ts +0 -0
  88. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/__init__.py +0 -0
  89. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_cli.py +0 -0
  90. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_integration.py +0 -0
  91. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_models.py +0 -0
  92. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_reporting.py +0 -0
  93. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_weight_configuration.ts +0 -0
  94. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tsconfig.json +0 -0
  95. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/webpack.config.cjs +0 -0
  96. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/weight_config.ts +0 -0
  97. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/__init__.py +0 -0
  98. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/base.py +0 -0
  99. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/infrastructure_optimizer.py +0 -0
  100. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/interfaces.py +0 -0
  101. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/lifecycle_manager.py +0 -0
  102. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/mcp_cost_validation.py +0 -0
  103. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/models.py +0 -0
  104. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/monitoring_automation.py +0 -0
  105. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/notebook_framework.py +0 -0
  106. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/security_enforcer.py +0 -0
  107. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/__init__.py +0 -0
  108. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/accuracy_validator.py +0 -0
  109. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_pricing.py +0 -0
  110. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_pricing_api.py +0 -0
  111. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_utils.py +0 -0
  112. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cli_decorators.py +0 -0
  113. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/comprehensive_cost_explorer_integration.py +0 -0
  114. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/context_logger.py +0 -0
  115. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cross_account_manager.py +0 -0
  116. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cross_module_integration.py +0 -0
  117. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/date_utils.py +0 -0
  118. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/dry_run_examples.py +0 -0
  119. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/dry_run_framework.py +0 -0
  120. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_exception_handler.py +0 -0
  121. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_logging_example.py +0 -0
  122. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_logging_integration_example.py +0 -0
  123. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enterprise_audit_integration.py +0 -0
  124. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/env_utils.py +0 -0
  125. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/error_handling.py +0 -0
  126. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/lazy_loader.py +0 -0
  127. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/logger.py +0 -0
  128. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/logging_integration_helper.py +0 -0
  129. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/mcp_cost_explorer_integration.py +0 -0
  130. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/mcp_integration.py +0 -0
  131. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/memory_optimization.py +0 -0
  132. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/module_cli_base.py +0 -0
  133. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/organizations_client.py +0 -0
  134. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_monitor.py +0 -0
  135. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_monitoring.py +0 -0
  136. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_optimization_engine.py +0 -0
  137. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/profile_utils.py +0 -0
  138. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/sre_performance_suite.py +0 -0
  139. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/config.py +0 -0
  140. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/__init__.py +0 -0
  141. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/error_handling.py +0 -0
  142. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/logging.py +0 -0
  143. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/multi_tenant.py +0 -0
  144. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/security.py +0 -0
  145. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/validation.py +0 -0
  146. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/feedback/user_feedback_collector.py +0 -0
  147. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/__init__.py +0 -0
  148. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/account_resolver.py +0 -0
  149. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/accuracy_cross_validator.py +0 -0
  150. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/automation_core.py +0 -0
  151. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/aws_client.py +0 -0
  152. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/budget_integration.py +0 -0
  153. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/business_case_config.py +0 -0
  154. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/business_cases.py +0 -0
  155. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/commvault_ec2_analysis.py +0 -0
  156. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/compute_cost_optimizer.py +0 -0
  157. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/config.py +0 -0
  158. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cost_optimizer.py +0 -0
  159. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cost_processor.py +0 -0
  160. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/dashboard_router.py +0 -0
  161. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/dashboard_runner.py +0 -0
  162. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/ebs_cost_optimizer.py +0 -0
  163. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/ebs_optimizer.py +0 -0
  164. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/elastic_ip_optimizer.py +0 -0
  165. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_dashboard_runner.py +0 -0
  166. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_progress.py +0 -0
  167. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_trend_visualization.py +0 -0
  168. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enterprise_wrappers.py +0 -0
  169. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/executive_export.py +0 -0
  170. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/finops_dashboard.py +0 -0
  171. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/helpers.py +0 -0
  172. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/iam_guidance.py +0 -0
  173. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/legacy_migration.py +0 -0
  174. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/main.py +0 -0
  175. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/markdown_exporter.py +0 -0
  176. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/multi_dashboard.py +0 -0
  177. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/nat_gateway_optimizer.py +0 -0
  178. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/network_cost_optimizer.py +0 -0
  179. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/notebook_utils.py +0 -0
  180. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/optimizer.py +0 -0
  181. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/profile_processor.py +0 -0
  182. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/reservation_optimizer.py +0 -0
  183. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/scenario_cli_integration.py +0 -0
  184. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/scenarios.py +0 -0
  185. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/schemas.py +0 -0
  186. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/service_mapping.py +0 -0
  187. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/single_dashboard.py +0 -0
  188. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/__init__.py +0 -0
  189. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/run_comprehensive_tests.py +0 -0
  190. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/run_tests.py +0 -0
  191. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_finops_dashboard.py +0 -0
  192. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_integration.py +0 -0
  193. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_performance.py +0 -0
  194. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_performance_benchmarks.py +0 -0
  195. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_reference_images_validation.py +0 -0
  196. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_single_account_features.py +0 -0
  197. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/validate_test_suite.py +0 -0
  198. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/types.py +0 -0
  199. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/unlimited_scenarios.py +0 -0
  200. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/validation_framework.py +0 -0
  201. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/visualisations.py +0 -0
  202. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/vpc_cleanup_exporter.py +0 -0
  203. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/hitl/enhanced_workflow_engine.py +0 -0
  204. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/.gitignore +0 -0
  205. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/ArgumentsClass.py +0 -0
  206. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/LandingZone/delete_lz.py +0 -0
  207. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/README.md +0 -0
  208. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/common_test_data.py +0 -0
  209. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/common_test_functions.py +0 -0
  210. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/script_test_data.py +0 -0
  211. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/setup.py +0 -0
  212. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/src.py +0 -0
  213. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_Inventory_Modules.py +0 -0
  214. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_cfn_describe_stacks.py +0 -0
  215. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_ec2_describe_instances.py +0 -0
  216. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_lambda_list_functions.py +0 -0
  217. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_moto_integration_example.py +0 -0
  218. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_org_list_accounts.py +0 -0
  219. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/__init__.py +0 -0
  220. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/account_class.py +0 -0
  221. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/all_my_instances_wrapper.py +0 -0
  222. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/aws_decorators.py +0 -0
  223. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_cloudtrail_compliance.py +0 -0
  224. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_controltower_readiness.py +0 -0
  225. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_landingzone_readiness.py +0 -0
  226. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/cloud_foundations_integration.py +0 -0
  227. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/__init__.py +0 -0
  228. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_comprehensive.py +0 -0
  229. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_compute.py +0 -0
  230. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_management.py +0 -0
  231. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_networking.py +0 -0
  232. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/base.py +0 -0
  233. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/enterprise_scale.py +0 -0
  234. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/__init__.py +0 -0
  235. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/collector.py +0 -0
  236. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/formatter.py +0 -0
  237. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/discovery.md +0 -0
  238. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/draw_org_structure.py +0 -0
  239. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/drift_detection_cli.py +0 -0
  240. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/ec2_vpc_utils.py +0 -0
  241. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_drift_detection.py +0 -0
  242. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_orphaned_stacks.py +0 -0
  243. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_stackset_drift.py +0 -0
  244. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_ec2_security_groups.py +0 -0
  245. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_landingzone_versions.py +0 -0
  246. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_vpc_flow_logs.py +0 -0
  247. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory.sh +0 -0
  248. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory_mcp_cli.py +0 -0
  249. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory_modules.py +0 -0
  250. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stacks.py +0 -0
  251. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stackset_operation_results.py +0 -0
  252. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stackset_operations.py +0 -0
  253. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stacksets.py +0 -0
  254. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_config_recorders_delivery_channels.py +0 -0
  255. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ds_directories.py +0 -0
  256. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_availability_zones.py +0 -0
  257. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_ebs_volumes.py +0 -0
  258. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_instances.py +0 -0
  259. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ecs_clusters_and_tasks.py +0 -0
  260. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_elbs_load_balancers.py +0 -0
  261. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_enis_network_interfaces.py +0 -0
  262. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_guardduty_detectors.py +0 -0
  263. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_policies.py +0 -0
  264. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_roles.py +0 -0
  265. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_saml_providers.py +0 -0
  266. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_lambda_functions.py +0 -0
  267. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_org_accounts.py +0 -0
  268. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_org_accounts_users.py +0 -0
  269. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_rds_db_instances.py +0 -0
  270. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_route53_hosted_zones.py +0 -0
  271. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_servicecatalog_provisioned_products.py +0 -0
  272. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_sns_topics.py +0 -0
  273. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ssm_parameters.py +0 -0
  274. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_vpc_subnets.py +0 -0
  275. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_vpcs.py +0 -0
  276. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/mcp_inventory_validator.py +0 -0
  277. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/mcp_vpc_validator.py +0 -0
  278. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/__init__.py +0 -0
  279. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/account.py +0 -0
  280. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/inventory.py +0 -0
  281. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/resource.py +0 -0
  282. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/organizations_discovery.py +0 -0
  283. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/recover_cfn_stack_ids.py +0 -0
  284. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/requirements.txt +0 -0
  285. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/rich_inventory_display.py +0 -0
  286. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/run_on_multi_accounts.py +0 -0
  287. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/unified_validation_engine.py +0 -0
  288. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/__init__.py +0 -0
  289. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/aws_helpers.py +0 -0
  290. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/threading_utils.py +0 -0
  291. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/validation.py +0 -0
  292. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/verify_ec2_security_groups.py +0 -0
  293. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_analyzer.py +0 -0
  294. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_architecture_validator.py +0 -0
  295. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_dependency_analyzer.py +0 -0
  296. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_flow_analyzer.py +0 -0
  297. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_final.py +0 -0
  298. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_minimal.py +0 -0
  299. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_optimized.py +0 -0
  300. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_ultra_minimal.py +0 -0
  301. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/metrics/dora_metrics_engine.py +0 -0
  302. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/monitoring/performance_monitor.py +0 -0
  303. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/README.md +0 -0
  304. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/__init__.py +0 -0
  305. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/base.py +0 -0
  306. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/cloudformation_operations.py +0 -0
  307. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/cloudwatch_operations.py +0 -0
  308. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/deployment_framework.py +0 -0
  309. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/deployment_validator.py +0 -0
  310. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/dynamodb_operations.py +0 -0
  311. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/ec2_operations.py +0 -0
  312. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/executive_dashboard.py +0 -0
  313. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/iam_operations.py +0 -0
  314. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/mcp_integration.py +0 -0
  315. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/nat_gateway_operations.py +0 -0
  316. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/networking_cost_heatmap.py +0 -0
  317. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/privatelink_operations.py +0 -0
  318. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/rds_operations.py +0 -0
  319. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/s3_operations.py +0 -0
  320. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/tagging_operations.py +0 -0
  321. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/tags.json +0 -0
  322. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/vpc_endpoints.py +0 -0
  323. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/vpc_operations.py +0 -0
  324. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/README.md +0 -0
  325. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/Tests/__init__.py +0 -0
  326. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/Tests/update_policy.py +0 -0
  327. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/__init__.py +0 -0
  328. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/acm_cert_expired_unused.py +0 -0
  329. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/acm_remediation.py +0 -0
  330. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/api_gateway_list.py +0 -0
  331. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/base.py +0 -0
  332. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cloudtrail_remediation.py +0 -0
  333. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cloudtrail_s3_modifications.py +0 -0
  334. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_active_users.py +0 -0
  335. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_remediation.py +0 -0
  336. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_user_password_reset.py +0 -0
  337. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/commons.py +0 -0
  338. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/commvault_ec2_analysis.py +0 -0
  339. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/config/accounts_example.json +0 -0
  340. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_optimize.py +0 -0
  341. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_remediation.py +0 -0
  342. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_server_side_encryption.py +0 -0
  343. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_public_ips.py +0 -0
  344. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_remediation.py +0 -0
  345. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_subnet_disable_auto_ip_assignment.py +0 -0
  346. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_unattached_ebs_volumes.py +0 -0
  347. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_unused_security_groups.py +0 -0
  348. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/kms_enable_key_rotation.py +0 -0
  349. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/kms_remediation.py +0 -0
  350. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/lambda_list.py +0 -0
  351. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/lambda_remediation.py +0 -0
  352. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/multi_account.py +0 -0
  353. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_instance_list.py +0 -0
  354. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_remediation.py +0 -0
  355. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_snapshot_list.py +0 -0
  356. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/remediation_cli.py +0 -0
  357. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/requirements.txt +0 -0
  358. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_block_public_access.py +0 -0
  359. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_bucket_public_access.py +0 -0
  360. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_disable_static_website_hosting.py +0 -0
  361. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_downloader.py +0 -0
  362. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_enable_access_logging.py +0 -0
  363. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_encryption.py +0 -0
  364. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_force_ssl_secure_policy.py +0 -0
  365. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_list.py +0 -0
  366. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_object_search.py +0 -0
  367. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_remediation.py +0 -0
  368. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/scan_for_phrase.py +0 -0
  369. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/universal_account_discovery.py +0 -0
  370. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/vpc_remediation.py +0 -0
  371. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/workspaces_list.py +0 -0
  372. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/README.md +0 -0
  373. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/__init__.py +0 -0
  374. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/__init__.py +0 -0
  375. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/account_level_bucket_public_access.py +0 -0
  376. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/alternate_contacts.py +0 -0
  377. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/bucket_public_access.py +0 -0
  378. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/cloudwatch_alarm_configuration.py +0 -0
  379. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/direct_attached_policy.py +0 -0
  380. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/guardduty_enabled.py +0 -0
  381. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/iam_password_policy.py +0 -0
  382. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/iam_user_mfa.py +0 -0
  383. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/multi_region_instance_usage.py +0 -0
  384. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/multi_region_trail.py +0 -0
  385. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_access_key.py +0 -0
  386. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_mfa.py +0 -0
  387. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_usage.py +0 -0
  388. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/trail_enabled.py +0 -0
  389. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/trusted_advisor.py +0 -0
  390. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/cloudops_automation_security_validator.py +0 -0
  391. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/compliance_automation.py +0 -0
  392. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/compliance_automation_engine.py +0 -0
  393. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/__init__.py +0 -0
  394. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/compliance_config.py +0 -0
  395. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/compliance_weights_example.json +0 -0
  396. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config-origin.json +0 -0
  397. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config.json +0 -0
  398. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config_template_generator.py +0 -0
  399. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/enterprise_security_framework.py +0 -0
  400. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/enterprise_security_policies.json +0 -0
  401. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/executive_security_dashboard.py +0 -0
  402. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/integration_test_enterprise_security.py +0 -0
  403. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/module_security_integrator.py +0 -0
  404. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/multi_account_security_controls.py +0 -0
  405. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/permission.json +0 -0
  406. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/real_time_security_monitor.py +0 -0
  407. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_generator.py +0 -0
  408. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_en.html +0 -0
  409. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_jp.html +0 -0
  410. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_kr.html +0 -0
  411. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_vn.html +0 -0
  412. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/run_script.py +0 -0
  413. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_baseline_tester.py +0 -0
  414. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_cli.py +0 -0
  415. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_export.py +0 -0
  416. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/__init__.py +0 -0
  417. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/common.py +0 -0
  418. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/enums.py +0 -0
  419. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/language.py +0 -0
  420. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/level_const.py +0 -0
  421. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/permission_list.py +0 -0
  422. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/README.md +0 -0
  423. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/__init__.py +0 -0
  424. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/mcp_reliability_engine.py +0 -0
  425. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/performance_optimization_engine.py +0 -0
  426. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/production_monitoring_framework.py +0 -0
  427. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/reliability_monitoring_framework.py +0 -0
  428. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/__init__.py +0 -0
  429. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/logger.py +0 -0
  430. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/version_validator.py +0 -0
  431. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/__init__.py +0 -0
  432. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/benchmark.py +0 -0
  433. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/cli.py +0 -0
  434. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/comprehensive_2way_validator.py +0 -0
  435. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/mcp_validator.py +0 -0
  436. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/terraform_citations_validator.py +0 -0
  437. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/terraform_drift_detector.py +0 -0
  438. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/README.md +0 -0
  439. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/__init__.py +0 -0
  440. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cleanup_wrapper.py +0 -0
  441. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/config.py +0 -0
  442. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cost_engine.py +0 -0
  443. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cross_account_session.py +0 -0
  444. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/heatmap_engine.py +0 -0
  445. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/manager_interface.py +0 -0
  446. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/mcp_no_eni_validator.py +0 -0
  447. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/networking_wrapper.py +0 -0
  448. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/performance_optimized_analyzer.py +0 -0
  449. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/rich_formatters.py +0 -0
  450. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/runbooks_adapter.py +0 -0
  451. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/__init__.py +0 -0
  452. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/conftest.py +0 -0
  453. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_cli_integration.py +0 -0
  454. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_config.py +0 -0
  455. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_cost_engine.py +0 -0
  456. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_networking_wrapper.py +0 -0
  457. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/unified_scenarios.py +0 -0
  458. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/vpc_cleanup_integration.py +0 -0
  459. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/dependency_links.txt +0 -0
  460. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/entry_points.txt +0 -0
  461. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/requires.txt +0 -0
  462. {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runbooks
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: CloudOps Automation Toolkit with Enhanced Cloud Foundations Assessment for DevOps and SRE teams.
5
5
  Author-email: Maintainers <nnthanh101@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -13,7 +13,7 @@
13
13
  ## Metadata: https://docs.astral.sh/uv/concepts/projects/config/
14
14
  name = "runbooks"
15
15
  ## Enhanced with AWS Operations integration, unified CLI architecture, and comprehensive service operations
16
- version = "1.1.2"
16
+ version = "1.1.3"
17
17
  description = "CloudOps Automation Toolkit with Enhanced Cloud Foundations Assessment for DevOps and SRE teams."
18
18
  readme = "README.md"
19
19
  requires-python = ">=3.11,<3.14"
@@ -61,7 +61,7 @@ s3_ops = S3Operations()
61
61
 
62
62
  # Centralized Version Management - Single Source of Truth
63
63
  # All modules MUST import __version__ from this location
64
- __version__ = "1.1.2"
64
+ __version__ = "1.1.3"
65
65
 
66
66
  # Fallback for legacy importlib.metadata usage during transition
67
67
  try:
@@ -20,6 +20,7 @@ Source Notebooks:
20
20
  """
21
21
 
22
22
  import asyncio
23
+ import json
23
24
  import time
24
25
  from typing import Dict, List, Optional, Any, Tuple
25
26
  import boto3
@@ -64,25 +65,31 @@ class CostOptimizer(CloudOpsBase):
64
65
  """
65
66
 
66
67
  def __init__(
67
- self,
68
- profile: str = "default",
68
+ self,
69
+ profile: str = "default",
69
70
  dry_run: bool = True,
70
- execution_mode: ExecutionMode = ExecutionMode.DRY_RUN
71
+ execution_mode: ExecutionMode = ExecutionMode.DRY_RUN,
72
+ region: str = "us-east-1"
71
73
  ):
72
74
  """
73
75
  Initialize Cost Optimizer with enterprise patterns.
74
-
76
+
75
77
  Args:
76
78
  profile: AWS profile (typically billing profile for cost data)
77
79
  dry_run: Enable safe analysis mode (default True)
78
80
  execution_mode: Execution mode for operations
81
+ region: AWS region for operations (default us-east-1)
79
82
  """
80
83
  super().__init__(profile, dry_run, execution_mode)
81
-
82
- print_header("CloudOps Cost Optimizer", "1.0.0")
84
+
85
+ # Initialize region attribute
86
+ self.region = region
87
+
88
+ from runbooks import __version__
89
+ print_header("CloudOps Cost Optimizer", __version__)
83
90
  print_info(f"Execution mode: {execution_mode.value}")
84
91
  print_info(f"Profile: {profile}")
85
-
92
+
86
93
  if dry_run:
87
94
  print_warning("🛡️ DRY RUN MODE: No resources will be modified")
88
95
 
@@ -1220,7 +1227,7 @@ class CostOptimizer(CloudOpsBase):
1220
1227
  CostOptimizationResult with WorkSpaces cleanup analysis
1221
1228
  """
1222
1229
  operation_name = "WorkSpaces Cost Optimization"
1223
- print_header(f"🏢 {operation_name} (FinOps-24)")
1230
+ print_header(f"🏢 {operation_name}")
1224
1231
 
1225
1232
  # Import existing workspaces analyzer
1226
1233
  try:
@@ -1349,20 +1356,70 @@ class CostOptimizer(CloudOpsBase):
1349
1356
  with create_progress_bar() as progress:
1350
1357
  task = progress.add_task("Analyzing RDS manual snapshots...", total=100)
1351
1358
 
1352
- # Step 1: Discover manual RDS snapshots across regions
1359
+ # Step 1: Discover manual RDS snapshots using proven AWS Config aggregator method
1353
1360
  all_manual_snapshots = []
1354
- regions = ['us-east-1', 'us-west-2', 'ap-southeast-2'] # Common regions
1355
-
1356
- for region in regions:
1357
- regional_client = self.session.client('rds', region_name=region)
1358
- try:
1359
- response = regional_client.describe_db_snapshots(
1360
- SnapshotType='manual',
1361
- MaxRecords=100
1362
- )
1363
- all_manual_snapshots.extend(response.get('DBSnapshots', []))
1364
- except Exception as e:
1365
- print_warning(f"Could not access region {region}: {e}")
1361
+
1362
+ try:
1363
+ # Use AWS Config aggregator to discover all RDS snapshots across organization
1364
+ config_client = self.session.client('config', region_name='ap-southeast-2')
1365
+
1366
+ # Get all RDS snapshots via AWS Config aggregator (proven method)
1367
+ response = config_client.select_aggregate_resource_config(
1368
+ Expression="SELECT configuration, accountId, awsRegion WHERE resourceType = 'AWS::RDS::DBSnapshot'",
1369
+ ConfigurationAggregatorName='organization-aggregator',
1370
+ MaxResults=100 # AWS limit is 100
1371
+ )
1372
+
1373
+ print_info(f"Found {len(response.get('Results', []))} RDS snapshots via AWS Config aggregator")
1374
+
1375
+ # Process snapshots found by Config aggregator
1376
+ for result in response.get('Results', []):
1377
+ try:
1378
+ resource_data = json.loads(result)
1379
+ config_data = resource_data.get('configuration', {})
1380
+
1381
+ # Handle case where configuration might be a string
1382
+ if isinstance(config_data, str):
1383
+ config_data = json.loads(config_data)
1384
+
1385
+ # Filter for manual snapshots only
1386
+ if config_data.get('snapshotType') == 'manual':
1387
+ # Create snapshot object compatible with describe_db_snapshots format
1388
+ snapshot = {
1389
+ 'DBSnapshotIdentifier': config_data.get('dBSnapshotIdentifier'),
1390
+ 'SnapshotCreateTime': datetime.fromisoformat(config_data.get('snapshotCreateTime', '').replace('Z', '+00:00')) if config_data.get('snapshotCreateTime') else datetime.now(),
1391
+ 'AllocatedStorage': config_data.get('allocatedStorage', 0),
1392
+ 'DBInstanceIdentifier': config_data.get('dBInstanceIdentifier'),
1393
+ 'SnapshotType': config_data.get('snapshotType'),
1394
+ 'Status': config_data.get('status', 'available'),
1395
+ 'Engine': config_data.get('engine'),
1396
+ 'EngineVersion': config_data.get('engineVersion')
1397
+ }
1398
+ all_manual_snapshots.append(snapshot)
1399
+ except Exception as e:
1400
+ print_warning(f"Error processing snapshot from Config: {e}")
1401
+
1402
+ print_success(f"Successfully processed {len(all_manual_snapshots)} manual snapshots from Config aggregator")
1403
+
1404
+ except Exception as e:
1405
+ print_warning(f"AWS Config aggregator query failed, falling back to regional discovery: {e}")
1406
+
1407
+ # Fallback to regional discovery if Config aggregator fails
1408
+ regions = ['us-east-1', 'us-west-2', 'ap-southeast-2', 'eu-west-1', 'ap-southeast-1'] # Extended regions
1409
+
1410
+ for region in regions:
1411
+ regional_client = self.session.client('rds', region_name=region)
1412
+ try:
1413
+ # Get all manual snapshots in this region
1414
+ paginator = regional_client.get_paginator('describe_db_snapshots')
1415
+ page_iterator = paginator.paginate(SnapshotType='manual')
1416
+
1417
+ for page in page_iterator:
1418
+ all_manual_snapshots.extend(page.get('DBSnapshots', []))
1419
+
1420
+ print_info(f"Found {len([s for s in all_manual_snapshots if 'region' not in s])} manual snapshots in {region}")
1421
+ except Exception as e:
1422
+ print_warning(f"Could not access region {region}: {e}")
1366
1423
 
1367
1424
  progress.update(task, advance=40)
1368
1425
 
@@ -1376,7 +1433,86 @@ class CostOptimizer(CloudOpsBase):
1376
1433
 
1377
1434
  progress.update(task, advance=70)
1378
1435
 
1379
- # Step 3: Calculate estimated savings
1436
+ # Step 3: Use enhanced RDS snapshot optimizer for consistent results
1437
+ try:
1438
+ from runbooks.finops.rds_snapshot_optimizer import EnhancedRDSSnapshotOptimizer
1439
+
1440
+ print_info("🔧 Using enhanced RDS snapshot optimization logic...")
1441
+ enhanced_optimizer = EnhancedRDSSnapshotOptimizer(profile=self.profile, dry_run=dry_run)
1442
+
1443
+ if enhanced_optimizer.initialize_session():
1444
+ # Discover all snapshots (not just manual)
1445
+ all_snapshots = enhanced_optimizer.discover_snapshots_via_config_aggregator()
1446
+
1447
+ if all_snapshots:
1448
+ # Run enhanced optimization analysis
1449
+ optimization_results = enhanced_optimizer.analyze_optimization_opportunities(
1450
+ all_snapshots, age_threshold=snapshot_age_threshold_days
1451
+ )
1452
+
1453
+ # Use comprehensive scenario for realistic savings
1454
+ comprehensive_scenario = optimization_results['optimization_scenarios']['comprehensive']
1455
+
1456
+ # Create resource impacts for comprehensive scenario
1457
+ resource_impacts = []
1458
+ for snapshot in comprehensive_scenario['snapshots']:
1459
+ resource_impacts.append(
1460
+ ResourceImpact(
1461
+ resource_type="rds-snapshot",
1462
+ resource_id=snapshot.get('DBSnapshotIdentifier', 'unknown'),
1463
+ region=snapshot.get('Region', 'unknown'),
1464
+ account_id=snapshot.get('AccountId', 'unknown'),
1465
+ estimated_monthly_cost=snapshot.get('EstimatedMonthlyCost', 0.0),
1466
+ projected_savings=snapshot.get('EstimatedMonthlyCost', 0.0),
1467
+ risk_level=RiskLevel.MEDIUM,
1468
+ modification_required=True,
1469
+ resource_name=f"RDS Snapshot {snapshot.get('DBSnapshotIdentifier', 'unknown')}",
1470
+ estimated_downtime=0.0
1471
+ )
1472
+ )
1473
+
1474
+ progress.update(task, advance=100)
1475
+
1476
+ return CostOptimizationResult(
1477
+ scenario=BusinessScenario.COST_OPTIMIZATION,
1478
+ scenario_name=operation_name,
1479
+ execution_timestamp=datetime.now(),
1480
+ execution_mode=self.execution_mode,
1481
+ execution_time=30.0,
1482
+ success=True,
1483
+ error_message=None,
1484
+ resources_analyzed=optimization_results['total_snapshots'],
1485
+ resources_impacted=resource_impacts,
1486
+ business_metrics=self.create_business_metrics(
1487
+ total_savings=optimization_results['potential_monthly_savings'],
1488
+ overall_risk=RiskLevel.MEDIUM
1489
+ ),
1490
+ recommendations=[
1491
+ f"Review {optimization_results['cleanup_candidates']} snapshots older than {snapshot_age_threshold_days} days",
1492
+ f"Potential annual savings: ${optimization_results['potential_annual_savings']:,.2f}",
1493
+ "Consider implementing automated retention policies",
1494
+ "Review backup requirements before deletion"
1495
+ ],
1496
+ # CostOptimizationResult specific fields
1497
+ current_monthly_spend=optimization_results.get('current_monthly_spend', 0.0),
1498
+ optimized_monthly_spend=optimization_results.get('current_monthly_spend', 0.0) - optimization_results['potential_monthly_savings'],
1499
+ savings_percentage=(optimization_results['potential_monthly_savings'] / max(optimization_results.get('current_monthly_spend', 1), 1)) * 100,
1500
+ annual_savings=optimization_results['potential_annual_savings'],
1501
+ total_monthly_savings=optimization_results['potential_monthly_savings'],
1502
+ affected_resources=optimization_results['cleanup_candidates'],
1503
+ resource_impacts=resource_impacts
1504
+ )
1505
+ else:
1506
+ print_warning("No snapshots discovered via enhanced optimizer")
1507
+
1508
+ except ImportError as e:
1509
+ print_warning(f"Enhanced optimizer not available, using legacy logic: {e}")
1510
+ except Exception as e:
1511
+ print_warning(f"Enhanced optimizer failed, using legacy logic: {e}")
1512
+
1513
+ # Fallback to legacy calculation for compatibility
1514
+ print_info("Using legacy optimization calculation...")
1515
+ # Step 3: Calculate estimated savings (legacy)
1380
1516
  # Based on JIRA data: $5K-24K range for manual snapshots
1381
1517
  total_size_gb = sum(snapshot.get('AllocatedStorage', 0) for snapshot in old_snapshots)
1382
1518
  estimated_monthly_savings = total_size_gb * 0.05 # ~$0.05/GB-month for snapshots
@@ -189,7 +189,7 @@ class UniversalBusinessLogic:
189
189
  # Apply proven profile management patterns
190
190
  selected_profile = get_profile_for_operation("operational", profile)
191
191
 
192
- print_header(f"{resource_type.title()} {operation.title()}", f"v1.0.0 - {self.module_name}")
192
+ print_header(f"{resource_type.title()} {operation.title()}", f"v1.1.2 - {self.module_name}")
193
193
  print_info(f"Using profile: {selected_profile}")
194
194
 
195
195
  # Standard operation tracking
@@ -611,14 +611,14 @@ def create_columns(items: List[Any], equal: bool = True, expand: bool = True) ->
611
611
  # Manager's Cost Optimization Scenario Formatting Functions
612
612
  def format_workspaces_analysis(workspaces_data: Dict[str, Any], target_savings: int = 12518) -> Panel:
613
613
  """
614
- Format WorkSpaces cost analysis for manager's FinOps-24 scenario.
615
-
614
+ Format WorkSpaces cost analysis for manager's priority scenario.
615
+
616
616
  Based on manager's requirement for $12,518 annual savings through
617
617
  cleanup of unused WorkSpaces with zero usage in last 6 months.
618
-
618
+
619
619
  Args:
620
620
  workspaces_data: Dictionary containing WorkSpaces cost and utilization data
621
- target_savings: Annual savings target (default: $12,518 from FinOps-24)
621
+ target_savings: Annual savings target (default: $12,518)
622
622
 
623
623
  Returns:
624
624
  Rich Panel with formatted WorkSpaces analysis
@@ -654,7 +654,7 @@ def format_workspaces_analysis(workspaces_data: Dict[str, Any], target_savings:
654
654
 
655
655
  [{status_style}]{status}[/]"""
656
656
 
657
- return Panel(content, title="[bright_cyan]FinOps-24: WorkSpaces Cost Optimization[/bright_cyan]",
657
+ return Panel(content, title="[bright_cyan]WorkSpaces Cost Optimization[/bright_cyan]",
658
658
  border_style="bright_green" if target_achievement >= 90 else "yellow")
659
659
 
660
660
 
@@ -25,9 +25,9 @@ runbooks finops --help # View all functionality
25
25
  runbooks finops --scenario workspaces --profile PROFILE # WorkSpaces optimization
26
26
  runbooks finops --scenario nat-gateway --profile PROFILE # NAT Gateway optimization
27
27
  runbooks finops --scenario elastic-ip --profile PROFILE # Elastic IP management
28
- runbooks finops --scenario ebs --profile PROFILE # EBS optimization
29
- runbooks finops --scenario snapshots --profile PROFILE # RDS snapshots cleanup
30
- runbooks finops --scenario commvault --profile PROFILE # Backup analysis
28
+ runbooks finops --scenario ebs-optimization --profile PROFILE # EBS optimization
29
+ runbooks finops --scenario rds-snapshots --profile PROFILE # RDS snapshots cleanup
30
+ runbooks finops --scenario backup-investigation --profile PROFILE # Backup analysis
31
31
  runbooks finops --scenario vpc-cleanup --profile PROFILE # VPC cleanup
32
32
 
33
33
  # AWS Cost Explorer metrics (working)
@@ -228,7 +228,7 @@ def main() -> int:
228
228
  parser.add_argument(
229
229
  "--scenario",
230
230
  type=str,
231
- help="Business scenario analysis (workspaces, snapshots, commvault, nat-gateway, elastic-ip, ebs, vpc-cleanup)",
231
+ help="Business scenario analysis (workspaces, rds-snapshots, backup-investigation, nat-gateway, elastic-ip, ebs-optimization, vpc-cleanup)",
232
232
  )
233
233
  parser.add_argument(
234
234
  "--help-scenario",
@@ -272,93 +272,58 @@ def main() -> int:
272
272
 
273
273
  console.print(f"[bold cyan]🎯 Executing Business Scenario: {args.scenario}[/bold cyan]")
274
274
 
275
- # Define scenario execution functions with proper parameters
276
- # CRITICAL FIX: Use enterprise profile management for proper BILLING_PROFILE fallback
277
- from runbooks.common.profile_utils import get_profile_for_operation
278
-
279
- def execute_workspaces_scenario():
280
- from runbooks.finops.scenarios import finops_workspaces
281
- # Use enterprise profile resolution: User > Environment > Default
282
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
283
- return finops_workspaces(profile=profile_param)
284
-
285
- def execute_snapshots_scenario():
286
- from runbooks.finops.scenarios import finops_snapshots
287
- # Use enterprise profile resolution: User > Environment > Default
288
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
289
- return finops_snapshots(profile=profile_param)
290
-
291
- def execute_commvault_scenario():
292
- from runbooks.finops.scenarios import finops_commvault
293
- # Use enterprise profile resolution: User > Environment > Default
294
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
295
- return finops_commvault(profile=profile_param)
296
-
297
- def execute_nat_gateway_scenario():
298
- from runbooks.finops.nat_gateway_optimizer import nat_gateway_optimizer
299
- # Use enterprise profile resolution: User > Environment > Default
300
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
301
- regions = args.regions if args.regions else ['us-east-1']
302
- # Call the CLI function with default parameters
303
- nat_gateway_optimizer(
304
- profile=profile_param,
305
- regions=regions,
306
- dry_run=True,
307
- export_format='json',
308
- output_file=None,
309
- usage_threshold_days=7
310
- )
311
- return {"scenario": "nat-gateway", "status": "completed", "profile": profile_param}
312
-
313
- def execute_ebs_scenario():
314
- # Create a simplified EBS scenario execution
315
- print_info("EBS optimization scenario analysis")
316
- # Use enterprise profile resolution: User > Environment > Default
317
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
318
- return {"scenario": "ebs", "status": "completed", "profile": profile_param}
319
-
320
- def execute_vpc_cleanup_scenario():
321
- # Create a simplified VPC cleanup scenario execution
322
- print_info("VPC cleanup scenario analysis")
323
- # Use enterprise profile resolution: User > Environment > Default
324
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
325
- return {"scenario": "vpc-cleanup", "status": "completed", "profile": profile_param}
326
-
327
- def execute_elastic_ip_scenario():
328
- # Create a simplified elastic IP scenario execution
329
- print_info("Elastic IP optimization scenario analysis")
330
- # Use enterprise profile resolution: User > Environment > Default
331
- profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
332
- return {"scenario": "elastic-ip", "status": "completed", "profile": profile_param}
333
-
334
- # Map scenarios to execution functions
335
- scenario_map = {
336
- 'workspaces': execute_workspaces_scenario,
337
- 'snapshots': execute_snapshots_scenario,
338
- 'commvault': execute_commvault_scenario,
339
- 'nat-gateway': execute_nat_gateway_scenario,
340
- 'ebs': execute_ebs_scenario,
341
- 'vpc-cleanup': execute_vpc_cleanup_scenario,
342
- 'elastic-ip': execute_elastic_ip_scenario,
343
- }
344
-
345
- if args.scenario not in scenario_map:
346
- print_error(f"Unknown scenario: '{args.scenario}'")
347
- print_info("Available scenarios: " + ", ".join(scenario_map.keys()))
348
- return 1
349
-
350
- # Execute scenario
351
- scenario_func = scenario_map[args.scenario]
352
- result = scenario_func()
353
-
354
- print_success(f"✅ Scenario '{args.scenario}' completed successfully")
355
-
356
- # Export results if requested
357
- if args.report_type and result:
358
- from runbooks.finops.helpers import export_scenario_results
359
- export_scenario_results(result, args.scenario, args.report_type, args.dir)
360
-
361
- return 0
275
+ # CRITICAL FIX: Handle --all flag for scenarios by using dashboard router logic
276
+ if hasattr(args, "all") and args.all:
277
+ print_info("🔍 --all flag detected: Integrating with dashboard router for organization discovery")
278
+
279
+ # Use dashboard router to handle --all flag and get profiles
280
+ from runbooks.finops.dashboard_router import create_dashboard_router
281
+ router = create_dashboard_router()
282
+ use_case, routing_config = router.detect_use_case(args)
283
+
284
+ # Extract profiles from routing config
285
+ profiles_to_use = routing_config.get("profiles_to_analyze", [])
286
+ if not profiles_to_use:
287
+ print_error("--all flag failed to discover any profiles")
288
+ return 1
289
+
290
+ print_success(f"Discovered {len(profiles_to_use)} profiles for scenario execution")
291
+
292
+ # Execute scenario across all discovered profiles
293
+ all_results = []
294
+ for profile in profiles_to_use:
295
+ print_info(f"Executing scenario '{args.scenario}' for profile: {profile}")
296
+
297
+ # Create a copy of args with single profile for execution
298
+ single_profile_args = argparse.Namespace(**vars(args))
299
+ single_profile_args.profiles = [profile]
300
+ single_profile_args.all = False # Disable --all for individual execution
301
+
302
+ # Execute scenario with single profile (recursive call but with all=False)
303
+ result = _execute_single_scenario(single_profile_args)
304
+ if result:
305
+ all_results.append(result)
306
+
307
+ # Combine results and export if requested
308
+ combined_result = {
309
+ "scenario": args.scenario,
310
+ "status": "completed",
311
+ "profiles_analyzed": len(profiles_to_use),
312
+ "individual_results": all_results,
313
+ "organization_scope": use_case == "organization_wide"
314
+ }
315
+
316
+ print_success(f"✅ Scenario '{args.scenario}' completed for {len(profiles_to_use)} profiles")
317
+
318
+ # Export results if requested
319
+ if args.report_type and combined_result:
320
+ from runbooks.finops.helpers import export_scenario_results
321
+ export_scenario_results(combined_result, args.scenario, args.report_type, args.dir)
322
+
323
+ return 0
324
+ else:
325
+ # Handle single profile execution (existing logic)
326
+ return _execute_single_scenario(args)
362
327
 
363
328
  except ImportError as e:
364
329
  console.print(f"[red]❌ Scenario '{args.scenario}' not available: {e}[/red]")
@@ -367,26 +332,127 @@ def main() -> int:
367
332
  console.print(f"[red]❌ Scenario execution failed: {e}[/red]")
368
333
  return 1
369
334
 
335
+
336
+ def _execute_single_scenario(args: argparse.Namespace) -> int:
337
+ """Execute a scenario for a single profile (internal helper function)."""
338
+ import argparse
339
+ from runbooks.common.rich_utils import print_header, print_success, print_error, print_info
340
+ from runbooks.common.profile_utils import get_profile_for_operation
341
+
342
+ def execute_workspaces_scenario():
343
+ from runbooks.finops.scenarios import finops_workspaces
344
+ # Use enterprise profile resolution: User > Environment > Default
345
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
346
+ return finops_workspaces(profile=profile_param)
347
+
348
+ def execute_snapshots_scenario():
349
+ from runbooks.finops.scenarios import finops_snapshots
350
+ # Use enterprise profile resolution: User > Environment > Default
351
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
352
+ return finops_snapshots(profile=profile_param)
353
+
354
+ def execute_commvault_scenario():
355
+ from runbooks.finops.scenarios import finops_commvault
356
+ # Use enterprise profile resolution: User > Environment > Default
357
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
358
+ return finops_commvault(profile=profile_param)
359
+
360
+ def execute_nat_gateway_scenario():
361
+ from runbooks.finops.nat_gateway_optimizer import nat_gateway_optimizer
362
+ # Use enterprise profile resolution: User > Environment > Default
363
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
364
+ regions = args.regions if args.regions else ['us-east-1']
365
+ # Call the CLI function with default parameters
366
+ nat_gateway_optimizer(
367
+ profile=profile_param,
368
+ regions=regions,
369
+ dry_run=True,
370
+ export_format='json',
371
+ output_file=None,
372
+ usage_threshold_days=7
373
+ )
374
+ return {"scenario": "nat-gateway", "status": "completed", "profile": profile_param}
375
+
376
+ def execute_ebs_scenario():
377
+ # Create a simplified EBS scenario execution
378
+ print_info("EBS optimization scenario analysis")
379
+ # Use enterprise profile resolution: User > Environment > Default
380
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
381
+ return {"scenario": "ebs", "status": "completed", "profile": profile_param}
382
+
383
+ def execute_vpc_cleanup_scenario():
384
+ # Create a simplified VPC cleanup scenario execution
385
+ print_info("VPC cleanup scenario analysis")
386
+ # Use enterprise profile resolution: User > Environment > Default
387
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
388
+ return {"scenario": "vpc-cleanup", "status": "completed", "profile": profile_param}
389
+
390
+ def execute_elastic_ip_scenario():
391
+ # Create a simplified elastic IP scenario execution
392
+ print_info("Elastic IP optimization scenario analysis")
393
+ # Use enterprise profile resolution: User > Environment > Default
394
+ profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
395
+ return {"scenario": "elastic-ip", "status": "completed", "profile": profile_param}
396
+
397
+ # Map scenarios to execution functions
398
+ scenario_map = {
399
+ 'workspaces': execute_workspaces_scenario,
400
+ 'rds-snapshots': execute_snapshots_scenario,
401
+ 'backup-investigation': execute_commvault_scenario,
402
+ 'nat-gateway': execute_nat_gateway_scenario,
403
+ 'ebs-optimization': execute_ebs_scenario,
404
+ 'vpc-cleanup': execute_vpc_cleanup_scenario,
405
+ 'elastic-ip': execute_elastic_ip_scenario,
406
+ }
407
+
408
+ if args.scenario not in scenario_map:
409
+ print_error(f"Unknown scenario: '{args.scenario}'")
410
+ print_info("Available scenarios: " + ", ".join(scenario_map.keys()))
411
+ return 1
412
+
413
+ # Execute scenario
414
+ scenario_func = scenario_map[args.scenario]
415
+ result = scenario_func()
416
+
417
+ print_success(f"✅ Scenario '{args.scenario}' completed successfully")
418
+
419
+ # Export results if requested
420
+ if args.report_type and result:
421
+ from runbooks.finops.helpers import export_scenario_results
422
+ export_scenario_results(result, args.scenario, args.report_type, args.dir)
423
+
424
+ return 0
425
+
426
+
370
427
  # Handle PDCA mode
371
428
  if args.pdca or args.pdca_continuous:
372
- import asyncio
373
-
374
- from runbooks.finops.pdca_engine import AutonomousPDCAEngine, PDCAThresholds
429
+ try:
430
+ import asyncio
431
+ from runbooks.finops.pdca_engine import AutonomousPDCAEngine, PDCAThresholds
432
+
433
+ console.print("[bold bright_cyan]🤖 Launching Autonomous PDCA Engine...[/]")
434
+
435
+ # Configure PDCA thresholds
436
+ thresholds = PDCAThresholds(
437
+ max_risk_score=25,
438
+ max_cost_increase=10.0,
439
+ max_untagged_resources=50,
440
+ max_unused_eips=5,
441
+ max_budget_overruns=1,
442
+ )
375
443
 
376
- console.print("[bold bright_cyan]🤖 Launching Autonomous PDCA Engine...[/]")
444
+ # Initialize PDCA engine
445
+ artifacts_dir = args.dir or "artifacts"
377
446
 
378
- # Configure PDCA thresholds
379
- thresholds = PDCAThresholds(
380
- max_risk_score=25,
381
- max_cost_increase=10.0,
382
- max_untagged_resources=50,
383
- max_unused_eips=5,
384
- max_budget_overruns=1,
385
- )
447
+ # Ensure artifacts directory exists
448
+ import os
449
+ os.makedirs(artifacts_dir, exist_ok=True)
386
450
 
387
- # Initialize PDCA engine
388
- artifacts_dir = args.dir or "artifacts"
389
- engine = AutonomousPDCAEngine(thresholds=thresholds, artifacts_dir=artifacts_dir)
451
+ engine = AutonomousPDCAEngine(thresholds=thresholds, artifacts_dir=artifacts_dir)
452
+ except ImportError as e:
453
+ console.print(f"[red]❌ PDCA Engine not available: {e}[/]")
454
+ console.print("[yellow]💡 PDCA functionality requires additional setup[/]")
455
+ return 1
390
456
 
391
457
  try:
392
458
  # Determine execution mode