runbooks 1.0.1__tar.gz → 1.0.2__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 (445) hide show
  1. {runbooks-1.0.1/src/runbooks.egg-info → runbooks-1.0.2}/PKG-INFO +1 -1
  2. {runbooks-1.0.1 → runbooks-1.0.2}/pyproject.toml +1 -1
  3. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/models.py +20 -14
  4. runbooks-1.0.2/src/runbooks/common/aws_pricing_api.py +437 -0
  5. runbooks-1.0.2/src/runbooks/common/dry_run_examples.py +587 -0
  6. runbooks-1.0.2/src/runbooks/common/dry_run_framework.py +520 -0
  7. runbooks-1.0.2/src/runbooks/common/memory_optimization.py +533 -0
  8. runbooks-1.0.2/src/runbooks/common/performance_optimization_engine.py +1153 -0
  9. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/profile_utils.py +10 -3
  10. runbooks-1.0.2/src/runbooks/common/sre_performance_suite.py +574 -0
  11. runbooks-1.0.2/src/runbooks/finops/business_case_config.py +314 -0
  12. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/cost_processor.py +19 -4
  13. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/ebs_cost_optimizer.py +1 -1
  14. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/embedded_mcp_validator.py +642 -36
  15. runbooks-1.0.2/src/runbooks/finops/executive_export.py +789 -0
  16. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/finops_scenarios.py +34 -27
  17. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/notebook_utils.py +1 -1
  18. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/schemas.py +73 -58
  19. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/single_dashboard.py +20 -4
  20. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/vpc_cleanup_exporter.py +2 -1
  21. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/models/account.py +5 -3
  22. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/models/inventory.py +1 -1
  23. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/models/resource.py +5 -3
  24. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/organizations_discovery.py +89 -5
  25. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/main.py +182 -61
  26. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/vpc_operations.py +60 -31
  27. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/workspaces_list.py +2 -2
  28. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/config.py +17 -8
  29. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/heatmap_engine.py +425 -53
  30. runbooks-1.0.2/src/runbooks/vpc/performance_optimized_analyzer.py +546 -0
  31. {runbooks-1.0.1 → runbooks-1.0.2/src/runbooks.egg-info}/PKG-INFO +1 -1
  32. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks.egg-info/SOURCES.txt +8 -0
  33. runbooks-1.0.1/src/runbooks/common/aws_pricing_api.py +0 -205
  34. {runbooks-1.0.1 → runbooks-1.0.2}/LICENSE +0 -0
  35. {runbooks-1.0.1 → runbooks-1.0.2}/MANIFEST.in +0 -0
  36. {runbooks-1.0.1 → runbooks-1.0.2}/README.md +0 -0
  37. {runbooks-1.0.1 → runbooks-1.0.2}/setup.cfg +0 -0
  38. {runbooks-1.0.1 → runbooks-1.0.2}/src/conftest.py +0 -0
  39. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/__init__.py +0 -0
  40. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/__main__.py +0 -0
  41. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/_platform/__init__.py +0 -0
  42. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/_platform/core/runbooks_wrapper.py +0 -0
  43. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/base.py +0 -0
  44. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/README.md +0 -0
  45. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/WEIGHT_CONFIG_README.md +0 -0
  46. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/__init__.py +0 -0
  47. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/app.ts +0 -0
  48. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/__init__.py +0 -0
  49. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/asana-import.csv +0 -0
  50. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/cfat-checks.csv +0 -0
  51. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/cfat.txt +0 -0
  52. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/collectors.py +0 -0
  53. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/compliance.py +0 -0
  54. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/jira-import.csv +0 -0
  55. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/runner.py +0 -0
  56. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/assessment/validators.py +0 -0
  57. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/cli.py +0 -0
  58. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/cloud_foundations_assessment.py +0 -0
  59. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/asana-import.csv +0 -0
  60. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/cfat-checks.csv +0 -0
  61. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/cfat.txt +0 -0
  62. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/checks-output.png +0 -0
  63. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/cloudshell-console-run.png +0 -0
  64. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/cloudshell-download.png +0 -0
  65. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/cloudshell-output.png +0 -0
  66. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/downloadfile.png +0 -0
  67. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/jira-import.csv +0 -0
  68. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/open-cloudshell.png +0 -0
  69. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/docs/report-header.png +0 -0
  70. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/models.py +0 -0
  71. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/package-lock.json +0 -0
  72. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/package.json +0 -0
  73. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/report.py +0 -0
  74. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/reporting/__init__.py +0 -0
  75. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/reporting/exporters.py +0 -0
  76. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/reporting/formatters.py +0 -0
  77. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/reporting/templates.py +0 -0
  78. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/run-assessment.sh +0 -0
  79. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/runner.py +0 -0
  80. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-cloudtrail-existence.ts +0 -0
  81. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-config-existence.ts +0 -0
  82. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-control-tower.ts +0 -0
  83. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-ec2-existence.ts +0 -0
  84. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-iam-users.ts +0 -0
  85. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-legacy-cur.ts +0 -0
  86. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-org-cloudformation.ts +0 -0
  87. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/check-vpc-existence.ts +0 -0
  88. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/create-asanaimport.ts +0 -0
  89. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/create-backlog.ts +0 -0
  90. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/create-jiraimport.ts +0 -0
  91. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/create-report.ts +0 -0
  92. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/define-account-type.ts +0 -0
  93. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-enabled-org-policy-types.ts +0 -0
  94. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-enabled-org-services.ts +0 -0
  95. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-idc-info.ts +0 -0
  96. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-org-da-accounts.ts +0 -0
  97. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-org-details.ts +0 -0
  98. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-org-member-accounts.ts +0 -0
  99. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-org-ous.ts +0 -0
  100. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/get-regions.ts +0 -0
  101. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/actions/zip-assessment.ts +0 -0
  102. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/src/types/index.d.ts +0 -0
  103. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/__init__.py +0 -0
  104. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/test_cli.py +0 -0
  105. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/test_integration.py +0 -0
  106. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/test_models.py +0 -0
  107. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/test_reporting.py +0 -0
  108. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tests/test_weight_configuration.ts +0 -0
  109. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/tsconfig.json +0 -0
  110. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/webpack.config.cjs +0 -0
  111. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cfat/weight_config.ts +0 -0
  112. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/__init__.py +0 -0
  113. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/base.py +0 -0
  114. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/cost_optimizer.py +0 -0
  115. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/infrastructure_optimizer.py +0 -0
  116. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/interfaces.py +0 -0
  117. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/lifecycle_manager.py +0 -0
  118. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/mcp_cost_validation.py +0 -0
  119. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/monitoring_automation.py +0 -0
  120. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/notebook_framework.py +0 -0
  121. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/cloudops/security_enforcer.py +0 -0
  122. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/__init__.py +0 -0
  123. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/accuracy_validator.py +0 -0
  124. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/aws_pricing.py +0 -0
  125. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/aws_utils.py +0 -0
  126. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/comprehensive_cost_explorer_integration.py +0 -0
  127. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/context_logger.py +0 -0
  128. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/cross_account_manager.py +0 -0
  129. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/cross_module_integration.py +0 -0
  130. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/date_utils.py +0 -0
  131. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/enhanced_exception_handler.py +0 -0
  132. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/enhanced_logging_example.py +0 -0
  133. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/enhanced_logging_integration_example.py +0 -0
  134. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/enterprise_audit_integration.py +0 -0
  135. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/env_utils.py +0 -0
  136. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/logger.py +0 -0
  137. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/logging_integration_helper.py +0 -0
  138. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/mcp_cost_explorer_integration.py +0 -0
  139. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/mcp_integration.py +0 -0
  140. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/organizations_client.py +0 -0
  141. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/performance_monitor.py +0 -0
  142. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/common/rich_utils.py +0 -0
  143. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/config.py +0 -0
  144. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/enterprise/__init__.py +0 -0
  145. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/enterprise/error_handling.py +0 -0
  146. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/enterprise/logging.py +0 -0
  147. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/enterprise/multi_tenant.py +0 -0
  148. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/enterprise/security.py +0 -0
  149. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/feedback/user_feedback_collector.py +0 -0
  150. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/README.md +0 -0
  151. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/__init__.py +0 -0
  152. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/account_resolver.py +0 -0
  153. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/accuracy_cross_validator.py +0 -0
  154. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/automation_core.py +0 -0
  155. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/aws_client.py +0 -0
  156. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/budget_integration.py +0 -0
  157. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/business_cases.py +0 -0
  158. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/cli.py +0 -0
  159. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/commvault_ec2_analysis.py +0 -0
  160. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/compute_cost_optimizer.py +0 -0
  161. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/cost_optimizer.py +0 -0
  162. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/dashboard_router.py +0 -0
  163. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/dashboard_runner.py +0 -0
  164. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/ebs_optimizer.py +0 -0
  165. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/elastic_ip_optimizer.py +0 -0
  166. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/enhanced_dashboard_runner.py +0 -0
  167. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/enhanced_progress.py +0 -0
  168. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/enhanced_trend_visualization.py +0 -0
  169. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/enterprise_wrappers.py +0 -0
  170. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/finops_dashboard.py +0 -0
  171. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/helpers.py +0 -0
  172. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/iam_guidance.py +0 -0
  173. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/legacy_migration.py +0 -0
  174. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/main.py +0 -0
  175. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/markdown_exporter.py +0 -0
  176. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/multi_dashboard.py +0 -0
  177. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/nat_gateway_optimizer.py +0 -0
  178. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/network_cost_optimizer.py +0 -0
  179. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/optimizer.py +0 -0
  180. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/profile_processor.py +0 -0
  181. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/reservation_optimizer.py +0 -0
  182. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/scenarios.py +0 -0
  183. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/service_mapping.py +0 -0
  184. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/__init__.py +0 -0
  185. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/run_comprehensive_tests.py +0 -0
  186. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/run_tests.py +0 -0
  187. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_finops_dashboard.py +0 -0
  188. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_integration.py +0 -0
  189. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_performance.py +0 -0
  190. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_performance_benchmarks.py +0 -0
  191. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_reference_images_validation.py +0 -0
  192. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/test_single_account_features.py +0 -0
  193. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/tests/validate_test_suite.py +0 -0
  194. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/types.py +0 -0
  195. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/validation_framework.py +0 -0
  196. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/visualisations.py +0 -0
  197. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/vpc_cleanup_optimizer.py +0 -0
  198. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/finops/workspaces_analyzer.py +0 -0
  199. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/hitl/enhanced_workflow_engine.py +0 -0
  200. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/.gitignore +0 -0
  201. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/ArgumentsClass.py +0 -0
  202. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/LandingZone/delete_lz.py +0 -0
  203. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/README.md +0 -0
  204. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/common_test_data.py +0 -0
  205. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/common_test_functions.py +0 -0
  206. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/script_test_data.py +0 -0
  207. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/setup.py +0 -0
  208. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/src.py +0 -0
  209. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_Inventory_Modules.py +0 -0
  210. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_cfn_describe_stacks.py +0 -0
  211. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_ec2_describe_instances.py +0 -0
  212. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_lambda_list_functions.py +0 -0
  213. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_moto_integration_example.py +0 -0
  214. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/Tests/test_org_list_accounts.py +0 -0
  215. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/__init__.py +0 -0
  216. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/account_class.py +0 -0
  217. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/all_my_instances_wrapper.py +0 -0
  218. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/aws_decorators.py +0 -0
  219. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/check_cloudtrail_compliance.py +0 -0
  220. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/check_controltower_readiness.py +0 -0
  221. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/check_landingzone_readiness.py +0 -0
  222. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/cloud_foundations_integration.py +0 -0
  223. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/__init__.py +0 -0
  224. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/aws_comprehensive.py +0 -0
  225. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/aws_compute.py +0 -0
  226. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/aws_management.py +0 -0
  227. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/aws_networking.py +0 -0
  228. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/base.py +0 -0
  229. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/collectors/enterprise_scale.py +0 -0
  230. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/core/__init__.py +0 -0
  231. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/core/collector.py +0 -0
  232. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/core/formatter.py +0 -0
  233. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/discovery.md +0 -0
  234. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/draw_org_structure.py +0 -0
  235. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/drift_detection_cli.py +0 -0
  236. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/ec2_vpc_utils.py +0 -0
  237. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_cfn_drift_detection.py +0 -0
  238. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_cfn_orphaned_stacks.py +0 -0
  239. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_cfn_stackset_drift.py +0 -0
  240. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_ec2_security_groups.py +0 -0
  241. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_landingzone_versions.py +0 -0
  242. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/find_vpc_flow_logs.py +0 -0
  243. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/inventory.sh +0 -0
  244. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/inventory_mcp_cli.py +0 -0
  245. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/inventory_modules.py +0 -0
  246. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_cfn_stacks.py +0 -0
  247. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_cfn_stackset_operation_results.py +0 -0
  248. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_cfn_stackset_operations.py +0 -0
  249. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_cfn_stacksets.py +0 -0
  250. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_config_recorders_delivery_channels.py +0 -0
  251. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ds_directories.py +0 -0
  252. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ec2_availability_zones.py +0 -0
  253. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ec2_ebs_volumes.py +0 -0
  254. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ec2_instances.py +0 -0
  255. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ecs_clusters_and_tasks.py +0 -0
  256. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_elbs_load_balancers.py +0 -0
  257. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_enis_network_interfaces.py +0 -0
  258. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_guardduty_detectors.py +0 -0
  259. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_iam_policies.py +0 -0
  260. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_iam_roles.py +0 -0
  261. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_iam_saml_providers.py +0 -0
  262. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_lambda_functions.py +0 -0
  263. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_org_accounts.py +0 -0
  264. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_org_accounts_users.py +0 -0
  265. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_rds_db_instances.py +0 -0
  266. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_route53_hosted_zones.py +0 -0
  267. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_servicecatalog_provisioned_products.py +0 -0
  268. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_sns_topics.py +0 -0
  269. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_ssm_parameters.py +0 -0
  270. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_vpc_subnets.py +0 -0
  271. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/list_vpcs.py +0 -0
  272. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/mcp_inventory_validator.py +0 -0
  273. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/mcp_vpc_validator.py +0 -0
  274. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/models/__init__.py +0 -0
  275. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/recover_cfn_stack_ids.py +0 -0
  276. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/requirements.txt +0 -0
  277. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/rich_inventory_display.py +0 -0
  278. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/run_on_multi_accounts.py +0 -0
  279. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/unified_validation_engine.py +0 -0
  280. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/utils/__init__.py +0 -0
  281. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/utils/aws_helpers.py +0 -0
  282. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/utils/threading_utils.py +0 -0
  283. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/utils/validation.py +0 -0
  284. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/verify_ec2_security_groups.py +0 -0
  285. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/vpc_analyzer.py +0 -0
  286. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/vpc_architecture_validator.py +0 -0
  287. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/vpc_dependency_analyzer.py +0 -0
  288. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/inventory/vpc_flow_analyzer.py +0 -0
  289. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/metrics/dora_metrics_engine.py +0 -0
  290. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/monitoring/performance_monitor.py +0 -0
  291. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/README.md +0 -0
  292. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/__init__.py +0 -0
  293. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/base.py +0 -0
  294. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/cloudformation_operations.py +0 -0
  295. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/cloudwatch_operations.py +0 -0
  296. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/deployment_framework.py +0 -0
  297. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/deployment_validator.py +0 -0
  298. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/dynamodb_operations.py +0 -0
  299. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/ec2_operations.py +0 -0
  300. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/executive_dashboard.py +0 -0
  301. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/iam_operations.py +0 -0
  302. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/mcp_integration.py +0 -0
  303. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/nat_gateway_operations.py +0 -0
  304. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/networking_cost_heatmap.py +0 -0
  305. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/privatelink_operations.py +0 -0
  306. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/rds_operations.py +0 -0
  307. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/s3_operations.py +0 -0
  308. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/tagging_operations.py +0 -0
  309. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/tags.json +0 -0
  310. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/operate/vpc_endpoints.py +0 -0
  311. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/README.md +0 -0
  312. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/Tests/__init__.py +0 -0
  313. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/Tests/update_policy.py +0 -0
  314. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/__init__.py +0 -0
  315. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/acm_cert_expired_unused.py +0 -0
  316. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/acm_remediation.py +0 -0
  317. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/api_gateway_list.py +0 -0
  318. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/base.py +0 -0
  319. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/cloudtrail_remediation.py +0 -0
  320. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/cloudtrail_s3_modifications.py +0 -0
  321. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/cognito_active_users.py +0 -0
  322. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/cognito_remediation.py +0 -0
  323. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/cognito_user_password_reset.py +0 -0
  324. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/commons.py +0 -0
  325. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/commvault_ec2_analysis.py +0 -0
  326. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/config/accounts_example.json +0 -0
  327. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/dynamodb_optimize.py +0 -0
  328. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/dynamodb_remediation.py +0 -0
  329. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/dynamodb_server_side_encryption.py +0 -0
  330. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/ec2_public_ips.py +0 -0
  331. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/ec2_remediation.py +0 -0
  332. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/ec2_subnet_disable_auto_ip_assignment.py +0 -0
  333. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/ec2_unattached_ebs_volumes.py +0 -0
  334. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/ec2_unused_security_groups.py +0 -0
  335. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/kms_enable_key_rotation.py +0 -0
  336. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/kms_remediation.py +0 -0
  337. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/lambda_list.py +0 -0
  338. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/lambda_remediation.py +0 -0
  339. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/multi_account.py +0 -0
  340. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/rds_instance_list.py +0 -0
  341. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/rds_remediation.py +0 -0
  342. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/rds_snapshot_list.py +0 -0
  343. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/remediation_cli.py +0 -0
  344. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/requirements.txt +0 -0
  345. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_block_public_access.py +0 -0
  346. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_bucket_public_access.py +0 -0
  347. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_disable_static_website_hosting.py +0 -0
  348. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_downloader.py +0 -0
  349. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_enable_access_logging.py +0 -0
  350. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_encryption.py +0 -0
  351. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_force_ssl_secure_policy.py +0 -0
  352. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_list.py +0 -0
  353. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_object_search.py +0 -0
  354. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/s3_remediation.py +0 -0
  355. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/scan_for_phrase.py +0 -0
  356. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/universal_account_discovery.py +0 -0
  357. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/remediation/vpc_remediation.py +0 -0
  358. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/README.md +0 -0
  359. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/__init__.py +0 -0
  360. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/__init__.py +0 -0
  361. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/account_level_bucket_public_access.py +0 -0
  362. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/alternate_contacts.py +0 -0
  363. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/bucket_public_access.py +0 -0
  364. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/cloudwatch_alarm_configuration.py +0 -0
  365. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/direct_attached_policy.py +0 -0
  366. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/guardduty_enabled.py +0 -0
  367. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/iam_password_policy.py +0 -0
  368. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/iam_user_mfa.py +0 -0
  369. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/multi_region_instance_usage.py +0 -0
  370. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/multi_region_trail.py +0 -0
  371. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/root_access_key.py +0 -0
  372. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/root_mfa.py +0 -0
  373. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/root_usage.py +0 -0
  374. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/trail_enabled.py +0 -0
  375. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/checklist/trusted_advisor.py +0 -0
  376. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/cloudops_automation_security_validator.py +0 -0
  377. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/compliance_automation.py +0 -0
  378. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/compliance_automation_engine.py +0 -0
  379. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config/__init__.py +0 -0
  380. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config/compliance_config.py +0 -0
  381. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config/compliance_weights_example.json +0 -0
  382. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config-origin.json +0 -0
  383. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config.json +0 -0
  384. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/config_template_generator.py +0 -0
  385. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/enterprise_security_framework.py +0 -0
  386. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/enterprise_security_policies.json +0 -0
  387. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/executive_security_dashboard.py +0 -0
  388. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/integration_test_enterprise_security.py +0 -0
  389. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/module_security_integrator.py +0 -0
  390. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/multi_account_security_controls.py +0 -0
  391. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/permission.json +0 -0
  392. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/real_time_security_monitor.py +0 -0
  393. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/report_generator.py +0 -0
  394. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/report_template_en.html +0 -0
  395. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/report_template_jp.html +0 -0
  396. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/report_template_kr.html +0 -0
  397. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/report_template_vn.html +0 -0
  398. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/run_script.py +0 -0
  399. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/security_baseline_tester.py +0 -0
  400. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/security_cli.py +0 -0
  401. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/security_export.py +0 -0
  402. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/__init__.py +0 -0
  403. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/common.py +0 -0
  404. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/enums.py +0 -0
  405. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/language.py +0 -0
  406. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/level_const.py +0 -0
  407. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/security/utils/permission_list.py +0 -0
  408. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/README.md +0 -0
  409. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/__init__.py +0 -0
  410. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/mcp_reliability_engine.py +0 -0
  411. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/performance_optimization_engine.py +0 -0
  412. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/production_monitoring_framework.py +0 -0
  413. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/sre/reliability_monitoring_framework.py +0 -0
  414. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/utils/__init__.py +0 -0
  415. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/utils/logger.py +0 -0
  416. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/utils/version_validator.py +0 -0
  417. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/__init__.py +0 -0
  418. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/benchmark.py +0 -0
  419. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/cli.py +0 -0
  420. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/comprehensive_2way_validator.py +0 -0
  421. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/mcp_validator.py +0 -0
  422. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/terraform_citations_validator.py +0 -0
  423. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/validation/terraform_drift_detector.py +0 -0
  424. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/README.md +0 -0
  425. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/__init__.py +0 -0
  426. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/cleanup_wrapper.py +0 -0
  427. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/cost_engine.py +0 -0
  428. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/cross_account_session.py +0 -0
  429. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/manager_interface.py +0 -0
  430. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/mcp_no_eni_validator.py +0 -0
  431. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/networking_wrapper.py +0 -0
  432. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/rich_formatters.py +0 -0
  433. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/runbooks_adapter.py +0 -0
  434. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/__init__.py +0 -0
  435. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/conftest.py +0 -0
  436. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/test_cli_integration.py +0 -0
  437. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/test_config.py +0 -0
  438. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/test_cost_engine.py +0 -0
  439. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/tests/test_networking_wrapper.py +0 -0
  440. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/unified_scenarios.py +0 -0
  441. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks/vpc/vpc_cleanup_integration.py +0 -0
  442. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks.egg-info/dependency_links.txt +0 -0
  443. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks.egg-info/entry_points.txt +0 -0
  444. {runbooks-1.0.1 → runbooks-1.0.2}/src/runbooks.egg-info/requires.txt +0 -0
  445. {runbooks-1.0.1 → runbooks-1.0.2}/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.0.1
3
+ Version: 1.0.2
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.0.1"
16
+ version = "1.0.2"
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"
@@ -10,7 +10,7 @@ Strategic Alignment:
10
10
  - Integration with Rich CLI for consistent UX
11
11
  """
12
12
 
13
- from pydantic import BaseModel, Field, validator, root_validator
13
+ from pydantic import BaseModel, Field, field_validator
14
14
  from typing import List, Dict, Optional, Union, Any
15
15
  from enum import Enum
16
16
  from datetime import datetime
@@ -58,7 +58,8 @@ class ResourceImpact(BaseModel):
58
58
  modification_required: bool = Field(description="Whether resource requires modification", default=False)
59
59
  estimated_downtime: Optional[float] = Field(description="Expected downtime in minutes", default=None)
60
60
 
61
- @validator('risk_level')
61
+ @field_validator('risk_level')
62
+ @classmethod
62
63
  def validate_risk_level(cls, v):
63
64
  """Ensure risk level is valid."""
64
65
  if isinstance(v, str):
@@ -68,11 +69,12 @@ class ResourceImpact(BaseModel):
68
69
  raise ValueError(f'Risk level must be one of: {[e.value for e in RiskLevel]}')
69
70
  return v
70
71
 
71
- @validator('projected_savings')
72
- def validate_savings(cls, v, values):
72
+ @field_validator('projected_savings')
73
+ @classmethod
74
+ def validate_savings(cls, v, info):
73
75
  """Validate savings against current cost."""
74
- if v is not None and 'estimated_monthly_cost' in values:
75
- current_cost = values['estimated_monthly_cost']
76
+ if v is not None and 'estimated_monthly_cost' in info.data:
77
+ current_cost = info.data['estimated_monthly_cost']
76
78
  if current_cost is not None and v > current_cost:
77
79
  raise ValueError('Projected savings cannot exceed current cost')
78
80
  return v
@@ -85,10 +87,11 @@ class ComplianceMetrics(BaseModel):
85
87
  violations_found: int = Field(ge=0, description="Number of violations identified")
86
88
  violations_fixed: int = Field(ge=0, description="Number of violations remediated")
87
89
 
88
- @validator('violations_fixed')
89
- def validate_violations_fixed(cls, v, values):
90
+ @field_validator('violations_fixed')
91
+ @classmethod
92
+ def validate_violations_fixed(cls, v, info):
90
93
  """Ensure violations fixed doesn't exceed violations found."""
91
- if 'violations_found' in values and v > values['violations_found']:
94
+ if 'violations_found' in info.data and v > info.data['violations_found']:
92
95
  raise ValueError('Violations fixed cannot exceed violations found')
93
96
  return v
94
97
 
@@ -137,7 +140,8 @@ class CloudOpsExecutionResult(BaseModel):
137
140
  regions_analyzed: List[str] = Field(description="AWS regions analyzed", default=[])
138
141
  services_analyzed: List[str] = Field(description="AWS services analyzed", default=[])
139
142
 
140
- @validator('execution_time')
143
+ @field_validator('execution_time')
144
+ @classmethod
141
145
  def validate_execution_time(cls, v):
142
146
  """Ensure execution time is positive."""
143
147
  if v < 0:
@@ -171,10 +175,11 @@ class CostOptimizationResult(CloudOpsExecutionResult):
171
175
  oversized_resources: List[ResourceImpact] = Field(description="Identified oversized resources", default=[])
172
176
  unattached_resources: List[ResourceImpact] = Field(description="Identified unattached resources", default=[])
173
177
 
174
- @validator('optimized_monthly_spend')
175
- def validate_optimized_spend(cls, v, values):
178
+ @field_validator('optimized_monthly_spend')
179
+ @classmethod
180
+ def validate_optimized_spend(cls, v, info):
176
181
  """Ensure optimized spend is less than current spend."""
177
- if 'current_monthly_spend' in values and v > values['current_monthly_spend']:
182
+ if 'current_monthly_spend' in info.data and v > info.data['current_monthly_spend']:
178
183
  raise ValueError('Optimized spend cannot exceed current spend')
179
184
  return v
180
185
 
@@ -205,7 +210,8 @@ class ProfileConfiguration(BaseModel):
205
210
  account_id: Optional[str] = Field(description="AWS account ID")
206
211
  regions: List[str] = Field(description="Target AWS regions", default=["us-east-1"])
207
212
 
208
- @validator('profile_name')
213
+ @field_validator('profile_name')
214
+ @classmethod
209
215
  def validate_profile_exists(cls, v):
210
216
  """Validate that AWS profile exists in local configuration."""
211
217
  try:
@@ -0,0 +1,437 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ AWS Pricing API Integration - Real-time Dynamic Pricing
4
+ ========================================================
5
+
6
+ ZERO HARDCODED VALUES - All pricing from AWS Pricing API
7
+ This module provides real-time AWS pricing data to replace ALL hardcoded defaults.
8
+
9
+ Enterprise Compliance: NO hardcoded cost values allowed
10
+ """
11
+
12
+ import boto3
13
+ import json
14
+ from typing import Dict, Optional, Any
15
+ from functools import lru_cache
16
+ from datetime import datetime, timedelta
17
+ import os
18
+
19
+ class AWSPricingAPI:
20
+ """Real-time AWS Pricing API integration - ZERO hardcoded values."""
21
+
22
+ def __init__(self, profile: Optional[str] = None):
23
+ """Initialize with AWS Pricing API client."""
24
+ session = boto3.Session(profile_name=profile) if profile else boto3.Session()
25
+ self.pricing_client = session.client('pricing', region_name='us-east-1')
26
+ self.ce_client = session.client('ce') # Cost Explorer for real costs
27
+ self._cache = {}
28
+ self._cache_expiry = {}
29
+
30
+ @lru_cache(maxsize=128)
31
+ def get_ebs_gp3_cost_per_gb(self, region: str = 'us-east-1') -> float:
32
+ """Get real-time EBS GP3 cost per GB per month from AWS Pricing API."""
33
+ try:
34
+ response = self.pricing_client.get_products(
35
+ ServiceCode='AmazonEC2',
36
+ Filters=[
37
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'Storage'},
38
+ {'Type': 'TERM_MATCH', 'Field': 'volumeType', 'Value': 'General Purpose'},
39
+ {'Type': 'TERM_MATCH', 'Field': 'storageMedia', 'Value': 'SSD-backed'},
40
+ {'Type': 'TERM_MATCH', 'Field': 'volumeApiName', 'Value': 'gp3'},
41
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
42
+ ],
43
+ MaxResults=1
44
+ )
45
+
46
+ if response['PriceList']:
47
+ price_data = json.loads(response['PriceList'][0])
48
+ on_demand = price_data['terms']['OnDemand']
49
+ for term in on_demand.values():
50
+ for price_dimension in term['priceDimensions'].values():
51
+ if 'GB-month' in price_dimension.get('unit', ''):
52
+ return float(price_dimension['pricePerUnit']['USD'])
53
+
54
+ # Fallback to Cost Explorer actual costs if Pricing API fails
55
+ return self._get_from_cost_explorer('EBS', 'gp3')
56
+
57
+ except Exception as e:
58
+ # Use Cost Explorer as ultimate fallback
59
+ return self._get_from_cost_explorer('EBS', 'gp3')
60
+
61
+ @lru_cache(maxsize=128)
62
+ def get_ebs_gp2_cost_per_gb(self, region: str = 'us-east-1') -> float:
63
+ """Get real-time EBS GP2 cost per GB per month from AWS Pricing API."""
64
+ try:
65
+ response = self.pricing_client.get_products(
66
+ ServiceCode='AmazonEC2',
67
+ Filters=[
68
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'Storage'},
69
+ {'Type': 'TERM_MATCH', 'Field': 'volumeType', 'Value': 'General Purpose'},
70
+ {'Type': 'TERM_MATCH', 'Field': 'volumeApiName', 'Value': 'gp2'},
71
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
72
+ ],
73
+ MaxResults=1
74
+ )
75
+
76
+ if response['PriceList']:
77
+ price_data = json.loads(response['PriceList'][0])
78
+ on_demand = price_data['terms']['OnDemand']
79
+ for term in on_demand.values():
80
+ for price_dimension in term['priceDimensions'].values():
81
+ if 'GB-month' in price_dimension.get('unit', ''):
82
+ return float(price_dimension['pricePerUnit']['USD'])
83
+
84
+ return self._get_from_cost_explorer('EBS', 'gp2')
85
+
86
+ except Exception:
87
+ return self._get_from_cost_explorer('EBS', 'gp2')
88
+
89
+ @lru_cache(maxsize=128)
90
+ def get_rds_snapshot_cost_per_gb(self, region: str = 'us-east-1') -> float:
91
+ """Get real-time RDS snapshot cost per GB per month from AWS Pricing API."""
92
+ try:
93
+ response = self.pricing_client.get_products(
94
+ ServiceCode='AmazonRDS',
95
+ Filters=[
96
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'Storage Snapshot'},
97
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
98
+ ],
99
+ MaxResults=1
100
+ )
101
+
102
+ if response['PriceList']:
103
+ price_data = json.loads(response['PriceList'][0])
104
+ on_demand = price_data['terms']['OnDemand']
105
+ for term in on_demand.values():
106
+ for price_dimension in term['priceDimensions'].values():
107
+ if 'GB-month' in price_dimension.get('unit', ''):
108
+ return float(price_dimension['pricePerUnit']['USD'])
109
+
110
+ return self._get_from_cost_explorer('RDS', 'Snapshot')
111
+
112
+ except Exception:
113
+ return self._get_from_cost_explorer('RDS', 'Snapshot')
114
+
115
+ @lru_cache(maxsize=128)
116
+ def get_nat_gateway_monthly_cost(self, region: str = 'us-east-1') -> float:
117
+ """Get real-time NAT Gateway monthly cost from AWS Pricing API with enterprise regional fallback."""
118
+
119
+ # Enterprise Regional Fallback Strategy
120
+ fallback_regions = ['us-east-1', 'us-west-2', 'eu-west-1']
121
+ if region not in fallback_regions:
122
+ fallback_regions.insert(0, region)
123
+
124
+ last_error = None
125
+
126
+ for attempt_region in fallback_regions:
127
+ try:
128
+ # Try AWS Pricing API for this region
129
+ response = self.pricing_client.get_products(
130
+ ServiceCode='AmazonVPC',
131
+ Filters=[
132
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'NAT Gateway'},
133
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(attempt_region)}
134
+ ],
135
+ MaxResults=1
136
+ )
137
+
138
+ if response['PriceList']:
139
+ price_data = json.loads(response['PriceList'][0])
140
+ on_demand = price_data['terms']['OnDemand']
141
+ for term in on_demand.values():
142
+ for price_dimension in term['priceDimensions'].values():
143
+ if 'Hrs' in price_dimension.get('unit', ''):
144
+ hourly_rate = float(price_dimension['pricePerUnit']['USD'])
145
+ monthly_cost = hourly_rate * 24 * 30 # Convert to monthly
146
+ print(f"✅ NAT Gateway pricing: ${monthly_cost:.2f}/month from {attempt_region}")
147
+ return monthly_cost
148
+
149
+ # Try Cost Explorer for this region
150
+ ce_cost = self._get_from_cost_explorer('VPC', 'NAT Gateway', attempt_region)
151
+ if ce_cost > 0:
152
+ print(f"✅ NAT Gateway pricing: ${ce_cost:.2f}/month from Cost Explorer")
153
+ return ce_cost
154
+
155
+ except Exception as e:
156
+ last_error = e
157
+ print(f"⚠️ Pricing API failed for region {attempt_region}: {e}")
158
+ continue
159
+
160
+ # Enterprise fallback with graceful degradation
161
+ return self._get_enterprise_fallback_pricing('nat_gateway', region, last_error)
162
+
163
+ def _get_from_cost_explorer(self, service: str, resource_type: str, region: str = None) -> float:
164
+ """Get actual costs from Cost Explorer as ultimate source of truth."""
165
+ try:
166
+ end_date = datetime.now()
167
+ start_date = end_date - timedelta(days=30)
168
+
169
+ # Build filter with optional region
170
+ filter_conditions = [
171
+ {'Dimensions': {'Key': 'SERVICE', 'Values': [f'Amazon {service}']}}
172
+ ]
173
+
174
+ if region:
175
+ filter_conditions.append({
176
+ 'Dimensions': {'Key': 'REGION', 'Values': [region]}
177
+ })
178
+
179
+ # Add resource type filter if it helps
180
+ if resource_type != service:
181
+ filter_conditions.append({
182
+ 'Dimensions': {'Key': 'USAGE_TYPE_GROUP', 'Values': [resource_type]}
183
+ })
184
+
185
+ cost_filter = {'And': filter_conditions} if len(filter_conditions) > 1 else filter_conditions[0]
186
+
187
+ response = self.ce_client.get_cost_and_usage(
188
+ TimePeriod={
189
+ 'Start': start_date.strftime('%Y-%m-%d'),
190
+ 'End': end_date.strftime('%Y-%m-%d')
191
+ },
192
+ Granularity='MONTHLY',
193
+ Metrics=['UnblendedCost'],
194
+ Filter=cost_filter
195
+ )
196
+
197
+ if response['ResultsByTime'] and response['ResultsByTime'][0]['Total']['UnblendedCost']['Amount']:
198
+ total_cost = float(response['ResultsByTime'][0]['Total']['UnblendedCost']['Amount'])
199
+ if total_cost > 0:
200
+ # Calculate per-unit cost based on usage
201
+ return self._calculate_unit_cost(total_cost, service, resource_type)
202
+
203
+ return 0.0 # No cost data found
204
+
205
+ except Exception as e:
206
+ print(f"⚠️ Cost Explorer query failed: {e}")
207
+ return 0.0
208
+
209
+ def _calculate_unit_cost(self, total_cost: float, service: str, resource_type: str) -> float:
210
+ """Calculate per-unit cost from total cost and usage metrics."""
211
+ # This would query CloudWatch for usage metrics and calculate unit cost
212
+ # For now, returning calculated estimates based on typical usage patterns
213
+ usage_multipliers = {
214
+ 'EBS': {'gp3': 1000, 'gp2': 1200}, # Typical GB usage
215
+ 'RDS': {'Snapshot': 5000}, # Typical snapshot GB
216
+ 'VPC': {'NAT Gateway': 1} # Per gateway
217
+ }
218
+
219
+ divisor = usage_multipliers.get(service, {}).get(resource_type, 1000)
220
+ return total_cost / divisor
221
+
222
+ def _get_enterprise_fallback_pricing(self, resource_type: str, region: str, last_error: Exception = None) -> float:
223
+ """Enterprise-compliant fallback pricing with graceful degradation."""
224
+
225
+ # Check for enterprise configuration override
226
+ override_env = f"AWS_PRICING_OVERRIDE_{resource_type.upper()}_MONTHLY"
227
+ override_value = os.getenv(override_env)
228
+ if override_value:
229
+ print(f"💼 Using enterprise pricing override: ${override_value}/month")
230
+ return float(override_value)
231
+
232
+ # Check if running in compliance-mode or analysis can proceed with warnings
233
+ compliance_mode = os.getenv("AWS_PRICING_STRICT_COMPLIANCE", "false").lower() == "true"
234
+
235
+ if compliance_mode:
236
+ # Strict compliance: block operation
237
+ error_msg = f"ENTERPRISE VIOLATION: Cannot proceed without dynamic {resource_type} pricing. " \
238
+ f"Last error: {last_error}. Set {override_env} or enable fallback pricing."
239
+ print(f"🚫 {error_msg}")
240
+ raise ValueError(error_msg)
241
+ else:
242
+ # Graceful degradation: allow analysis with standard AWS rates (documented approach)
243
+ standard_rates = {
244
+ 'nat_gateway': 32.40, # AWS standard us-east-1 rate: $0.045/hour * 24 * 30
245
+ 'transit_gateway': 36.00, # AWS standard us-east-1 rate: $0.05/hour * 24 * 30
246
+ 'vpc_endpoint_interface': 7.20, # AWS standard us-east-1 rate: $0.01/hour * 24 * 30
247
+ 'elastic_ip_idle': 3.60, # AWS standard us-east-1 rate: $0.005/hour * 24 * 30
248
+ }
249
+
250
+ if resource_type in standard_rates:
251
+ fallback_cost = standard_rates[resource_type]
252
+ print(f"⚠️ FALLBACK PRICING: Using standard AWS rate ${fallback_cost}/month for {resource_type}")
253
+ print(f" ℹ️ To fix: Check IAM permissions for pricing:GetProducts and ce:GetCostAndUsage")
254
+ print(f" ℹ️ Or set {override_env} for enterprise override")
255
+ return fallback_cost
256
+
257
+ # Last resort: query MCP servers for validation
258
+ return self._query_mcp_servers(resource_type, region, last_error)
259
+
260
+ @lru_cache(maxsize=128)
261
+ def get_vpc_endpoint_monthly_cost(self, region: str = 'us-east-1') -> float:
262
+ """Get real-time VPC Endpoint monthly cost from AWS Pricing API."""
263
+ try:
264
+ response = self.pricing_client.get_products(
265
+ ServiceCode='AmazonVPC',
266
+ Filters=[
267
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'VpcEndpoint'},
268
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
269
+ ],
270
+ MaxResults=1
271
+ )
272
+
273
+ if response['PriceList']:
274
+ price_data = json.loads(response['PriceList'][0])
275
+ on_demand = price_data['terms']['OnDemand']
276
+ for term in on_demand.values():
277
+ for price_dimension in term['priceDimensions'].values():
278
+ if 'Hrs' in price_dimension.get('unit', ''):
279
+ hourly_rate = float(price_dimension['pricePerUnit']['USD'])
280
+ monthly_cost = hourly_rate * 24 * 30 # Convert to monthly
281
+ return monthly_cost
282
+
283
+ # Fallback to Cost Explorer
284
+ return self._get_from_cost_explorer('VPC', 'VpcEndpoint', region)
285
+
286
+ except Exception as e:
287
+ return self._get_from_cost_explorer('VPC', 'VpcEndpoint', region)
288
+
289
+ @lru_cache(maxsize=128)
290
+ def get_transit_gateway_monthly_cost(self, region: str = 'us-east-1') -> float:
291
+ """Get real-time Transit Gateway monthly cost from AWS Pricing API."""
292
+ try:
293
+ response = self.pricing_client.get_products(
294
+ ServiceCode='AmazonVPC',
295
+ Filters=[
296
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'Transit Gateway'},
297
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
298
+ ],
299
+ MaxResults=1
300
+ )
301
+
302
+ if response['PriceList']:
303
+ price_data = json.loads(response['PriceList'][0])
304
+ on_demand = price_data['terms']['OnDemand']
305
+ for term in on_demand.values():
306
+ for price_dimension in term['priceDimensions'].values():
307
+ if 'Hrs' in price_dimension.get('unit', ''):
308
+ hourly_rate = float(price_dimension['pricePerUnit']['USD'])
309
+ monthly_cost = hourly_rate * 24 * 30 # Convert to monthly
310
+ return monthly_cost
311
+
312
+ # Fallback to Cost Explorer
313
+ return self._get_from_cost_explorer('VPC', 'Transit Gateway', region)
314
+
315
+ except Exception as e:
316
+ return self._get_from_cost_explorer('VPC', 'Transit Gateway', region)
317
+
318
+ @lru_cache(maxsize=128)
319
+ def get_elastic_ip_monthly_cost(self, region: str = 'us-east-1') -> float:
320
+ """Get real-time Elastic IP monthly cost from AWS Pricing API."""
321
+ try:
322
+ response = self.pricing_client.get_products(
323
+ ServiceCode='AmazonEC2',
324
+ Filters=[
325
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'IP Address'},
326
+ {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': self._get_region_name(region)}
327
+ ],
328
+ MaxResults=1
329
+ )
330
+
331
+ if response['PriceList']:
332
+ price_data = json.loads(response['PriceList'][0])
333
+ on_demand = price_data['terms']['OnDemand']
334
+ for term in on_demand.values():
335
+ for price_dimension in term['priceDimensions'].values():
336
+ if 'Hrs' in price_dimension.get('unit', ''):
337
+ hourly_rate = float(price_dimension['pricePerUnit']['USD'])
338
+ monthly_cost = hourly_rate * 24 * 30 # Convert to monthly
339
+ return monthly_cost
340
+
341
+ # Fallback to Cost Explorer
342
+ return self._get_from_cost_explorer('EC2', 'Elastic IP', region)
343
+
344
+ except Exception as e:
345
+ return self._get_from_cost_explorer('EC2', 'Elastic IP', region)
346
+
347
+ @lru_cache(maxsize=128)
348
+ def get_data_transfer_monthly_cost(self, region: str = 'us-east-1') -> float:
349
+ """Get real-time Data Transfer cost per GB from AWS Pricing API."""
350
+ try:
351
+ response = self.pricing_client.get_products(
352
+ ServiceCode='AmazonEC2',
353
+ Filters=[
354
+ {'Type': 'TERM_MATCH', 'Field': 'productFamily', 'Value': 'Data Transfer'},
355
+ {'Type': 'TERM_MATCH', 'Field': 'fromLocation', 'Value': self._get_region_name(region)},
356
+ {'Type': 'TERM_MATCH', 'Field': 'toLocation', 'Value': 'External'}
357
+ ],
358
+ MaxResults=1
359
+ )
360
+
361
+ if response['PriceList']:
362
+ price_data = json.loads(response['PriceList'][0])
363
+ on_demand = price_data['terms']['OnDemand']
364
+ for term in on_demand.values():
365
+ for price_dimension in term['priceDimensions'].values():
366
+ if 'GB' in price_dimension.get('unit', ''):
367
+ return float(price_dimension['pricePerUnit']['USD'])
368
+
369
+ # Fallback to Cost Explorer
370
+ return self._get_from_cost_explorer('EC2', 'Data Transfer', region)
371
+
372
+ except Exception as e:
373
+ return self._get_from_cost_explorer('EC2', 'Data Transfer', region)
374
+
375
+ def _query_mcp_servers(self, resource_type: str, region: str, last_error: Exception = None) -> float:
376
+ """Query MCP servers for cost validation as final fallback."""
377
+ try:
378
+ # This would integrate with MCP servers for real-time validation
379
+ # For now, provide guidance for resolution
380
+ guidance_msg = f"""
381
+ 🔧 VPC PRICING RESOLUTION REQUIRED:
382
+
383
+ Resource: {resource_type}
384
+ Region: {region}
385
+ Last Error: {last_error}
386
+
387
+ 📋 RESOLUTION OPTIONS:
388
+
389
+ 1. IAM Permissions (Most Common Fix):
390
+ Add these policies to your AWS profile:
391
+ - pricing:GetProducts
392
+ - ce:GetCostAndUsage
393
+ - ce:GetDimensionValues
394
+
395
+ 2. Enterprise Override:
396
+ export AWS_PRICING_OVERRIDE_{resource_type.upper()}_MONTHLY=32.40
397
+
398
+ 3. Enable Fallback Mode:
399
+ export AWS_PRICING_STRICT_COMPLIANCE=false
400
+
401
+ 4. Alternative Region:
402
+ Try with --region us-east-1 (best Pricing API support)
403
+
404
+ 5. MCP Server Integration:
405
+ Ensure MCP servers are accessible and operational
406
+
407
+ 💡 TIP: Run 'aws pricing get-products --service-code AmazonVPC' to test permissions
408
+ """
409
+ print(guidance_msg)
410
+
411
+ # ENTERPRISE COMPLIANCE: Do not return hardcoded fallback
412
+ raise ValueError(f"Unable to get pricing for {resource_type} in {region}. Check IAM permissions and MCP server connectivity.")
413
+
414
+ except Exception as mcp_error:
415
+ print(f"🚫 Final fallback failed: {mcp_error}")
416
+ raise ValueError(f"Unable to get pricing for {resource_type} in {region}. Check IAM permissions and MCP server connectivity.")
417
+
418
+ def _get_region_name(self, region_code: str) -> str:
419
+ """Convert region code to full region name for Pricing API."""
420
+ region_map = {
421
+ 'us-east-1': 'US East (N. Virginia)',
422
+ 'us-west-1': 'US West (N. California)',
423
+ 'us-west-2': 'US West (Oregon)',
424
+ 'eu-west-1': 'EU (Ireland)',
425
+ 'eu-west-2': 'EU (London)',
426
+ 'eu-central-1': 'EU (Frankfurt)',
427
+ 'ap-southeast-1': 'Asia Pacific (Singapore)',
428
+ 'ap-southeast-2': 'Asia Pacific (Sydney)',
429
+ 'ap-northeast-1': 'Asia Pacific (Tokyo)',
430
+ 'ap-south-1': 'Asia Pacific (Mumbai)',
431
+ 'ca-central-1': 'Canada (Central)',
432
+ 'sa-east-1': 'South America (São Paulo)',
433
+ }
434
+ return region_map.get(region_code, 'US East (N. Virginia)')
435
+
436
+ # Global instance for easy import
437
+ pricing_api = AWSPricingAPI()