runbooks 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl

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 (273) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/assessment/compliance.py +1 -1
  8. runbooks/cfat/assessment/runner.py +1 -0
  9. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  10. runbooks/cli/__init__.py +1 -1
  11. runbooks/cli/commands/cfat.py +64 -23
  12. runbooks/cli/commands/finops.py +1005 -54
  13. runbooks/cli/commands/inventory.py +135 -91
  14. runbooks/cli/commands/operate.py +9 -36
  15. runbooks/cli/commands/security.py +42 -18
  16. runbooks/cli/commands/validation.py +432 -18
  17. runbooks/cli/commands/vpc.py +81 -17
  18. runbooks/cli/registry.py +22 -10
  19. runbooks/cloudops/__init__.py +20 -27
  20. runbooks/cloudops/base.py +96 -107
  21. runbooks/cloudops/cost_optimizer.py +544 -542
  22. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  23. runbooks/cloudops/interfaces.py +224 -225
  24. runbooks/cloudops/lifecycle_manager.py +5 -4
  25. runbooks/cloudops/mcp_cost_validation.py +252 -235
  26. runbooks/cloudops/models.py +78 -53
  27. runbooks/cloudops/monitoring_automation.py +5 -4
  28. runbooks/cloudops/notebook_framework.py +177 -213
  29. runbooks/cloudops/security_enforcer.py +125 -159
  30. runbooks/common/accuracy_validator.py +17 -12
  31. runbooks/common/aws_pricing.py +349 -326
  32. runbooks/common/aws_pricing_api.py +211 -212
  33. runbooks/common/aws_profile_manager.py +40 -36
  34. runbooks/common/aws_utils.py +74 -79
  35. runbooks/common/business_logic.py +126 -104
  36. runbooks/common/cli_decorators.py +36 -60
  37. runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
  38. runbooks/common/cross_account_manager.py +197 -204
  39. runbooks/common/date_utils.py +27 -39
  40. runbooks/common/decorators.py +29 -19
  41. runbooks/common/dry_run_examples.py +173 -208
  42. runbooks/common/dry_run_framework.py +157 -155
  43. runbooks/common/enhanced_exception_handler.py +15 -4
  44. runbooks/common/enhanced_logging_example.py +50 -64
  45. runbooks/common/enhanced_logging_integration_example.py +65 -37
  46. runbooks/common/env_utils.py +16 -16
  47. runbooks/common/error_handling.py +40 -38
  48. runbooks/common/lazy_loader.py +41 -23
  49. runbooks/common/logging_integration_helper.py +79 -86
  50. runbooks/common/mcp_cost_explorer_integration.py +476 -493
  51. runbooks/common/mcp_integration.py +99 -79
  52. runbooks/common/memory_optimization.py +140 -118
  53. runbooks/common/module_cli_base.py +37 -58
  54. runbooks/common/organizations_client.py +175 -193
  55. runbooks/common/patterns.py +23 -25
  56. runbooks/common/performance_monitoring.py +67 -71
  57. runbooks/common/performance_optimization_engine.py +283 -274
  58. runbooks/common/profile_utils.py +111 -37
  59. runbooks/common/rich_utils.py +315 -141
  60. runbooks/common/sre_performance_suite.py +177 -186
  61. runbooks/enterprise/__init__.py +1 -1
  62. runbooks/enterprise/logging.py +144 -106
  63. runbooks/enterprise/security.py +187 -204
  64. runbooks/enterprise/validation.py +43 -56
  65. runbooks/finops/__init__.py +26 -30
  66. runbooks/finops/account_resolver.py +1 -1
  67. runbooks/finops/advanced_optimization_engine.py +980 -0
  68. runbooks/finops/automation_core.py +268 -231
  69. runbooks/finops/business_case_config.py +184 -179
  70. runbooks/finops/cli.py +660 -139
  71. runbooks/finops/commvault_ec2_analysis.py +157 -164
  72. runbooks/finops/compute_cost_optimizer.py +336 -320
  73. runbooks/finops/config.py +20 -20
  74. runbooks/finops/cost_optimizer.py +484 -618
  75. runbooks/finops/cost_processor.py +332 -214
  76. runbooks/finops/dashboard_runner.py +1006 -172
  77. runbooks/finops/ebs_cost_optimizer.py +991 -657
  78. runbooks/finops/elastic_ip_optimizer.py +317 -257
  79. runbooks/finops/enhanced_mcp_integration.py +340 -0
  80. runbooks/finops/enhanced_progress.py +32 -29
  81. runbooks/finops/enhanced_trend_visualization.py +3 -2
  82. runbooks/finops/enterprise_wrappers.py +223 -285
  83. runbooks/finops/executive_export.py +203 -160
  84. runbooks/finops/helpers.py +130 -288
  85. runbooks/finops/iam_guidance.py +1 -1
  86. runbooks/finops/infrastructure/__init__.py +80 -0
  87. runbooks/finops/infrastructure/commands.py +506 -0
  88. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  89. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  90. runbooks/finops/markdown_exporter.py +337 -174
  91. runbooks/finops/mcp_validator.py +1952 -0
  92. runbooks/finops/nat_gateway_optimizer.py +1512 -481
  93. runbooks/finops/network_cost_optimizer.py +657 -587
  94. runbooks/finops/notebook_utils.py +226 -188
  95. runbooks/finops/optimization_engine.py +1136 -0
  96. runbooks/finops/optimizer.py +19 -23
  97. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  98. runbooks/finops/reservation_optimizer.py +427 -363
  99. runbooks/finops/scenario_cli_integration.py +64 -65
  100. runbooks/finops/scenarios.py +1277 -438
  101. runbooks/finops/schemas.py +218 -182
  102. runbooks/finops/snapshot_manager.py +2289 -0
  103. runbooks/finops/types.py +3 -3
  104. runbooks/finops/validation_framework.py +259 -265
  105. runbooks/finops/vpc_cleanup_exporter.py +189 -144
  106. runbooks/finops/vpc_cleanup_optimizer.py +591 -573
  107. runbooks/finops/workspaces_analyzer.py +171 -182
  108. runbooks/integration/__init__.py +89 -0
  109. runbooks/integration/mcp_integration.py +1920 -0
  110. runbooks/inventory/CLAUDE.md +816 -0
  111. runbooks/inventory/__init__.py +2 -2
  112. runbooks/inventory/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -1,393 +0,0 @@
1
- """
2
- Unlimited Scenario Expansion Framework - Phase 2 Priority 1
3
-
4
- This module implements the Unlimited Scenario Expansion Framework enabling dynamic
5
- business case addition beyond the current 7 scenarios through:
6
- - Environment variable-based scenario discovery
7
- - Template-based scenario creation
8
- - Dynamic CLI integration
9
- - Automatic parameter matrix generation
10
-
11
- Strategic Achievement: Move from hardcoded 7 scenarios to unlimited enterprise
12
- customization supporting industry-specific and organization-specific business cases.
13
-
14
- Enterprise Framework Alignment:
15
- - "Do one thing and do it well": Focused on unlimited scenario expansion
16
- - "Move Fast, But Not So Fast We Crash": Proven patterns with safe defaults
17
- """
18
-
19
- import os
20
- import click
21
- from typing import Dict, List, Optional, Any
22
- from rich.console import Console
23
- from rich.table import Table
24
- from rich.panel import Panel
25
- from rich.columns import Columns
26
-
27
- from .business_case_config import (
28
- get_business_case_config,
29
- get_business_scenario_matrix,
30
- BusinessScenario,
31
- BusinessCaseType,
32
- add_scenario_from_template,
33
- get_available_templates,
34
- calculate_scenario_roi,
35
- discover_scenarios_summary,
36
- get_unlimited_scenario_choices,
37
- get_unlimited_scenario_help,
38
- create_scenario_from_environment_variables
39
- )
40
- from ..common.rich_utils import print_header, print_info, print_success, print_warning, print_error
41
-
42
-
43
- class UnlimitedScenarioManager:
44
- """
45
- Manager for unlimited business scenario expansion.
46
-
47
- Provides enterprise-grade scenario management with:
48
- - Dynamic scenario discovery from environment variables
49
- - Template-based scenario creation
50
- - CLI auto-integration
51
- - Business value calculation frameworks
52
- """
53
-
54
- def __init__(self):
55
- """Initialize unlimited scenario manager."""
56
- self.console = Console()
57
- self.business_config = get_business_case_config()
58
- self.scenario_matrix = get_business_scenario_matrix()
59
-
60
- def display_expansion_capabilities(self) -> None:
61
- """Display unlimited scenario expansion capabilities and current status."""
62
- print_header("Unlimited Scenario Expansion Framework", "Enterprise Business Case Management")
63
-
64
- # Current status summary
65
- summary = discover_scenarios_summary()
66
-
67
- status_table = Table(
68
- title="🚀 Scenario Expansion Status",
69
- show_header=True,
70
- header_style="bold cyan"
71
- )
72
- status_table.add_column("Metric", style="bold white", width=25)
73
- status_table.add_column("Value", style="green", width=15)
74
- status_table.add_column("Description", style="cyan", width=40)
75
-
76
- status_table.add_row(
77
- "Default Scenarios",
78
- str(summary["scenario_discovery"]["default_scenarios"]),
79
- "Built-in enterprise scenarios"
80
- )
81
- status_table.add_row(
82
- "Environment Discovered",
83
- str(summary["scenario_discovery"]["environment_discovered"]),
84
- "Auto-discovered from environment variables"
85
- )
86
- status_table.add_row(
87
- "Total Active Scenarios",
88
- str(summary["scenario_discovery"]["total_active"]),
89
- "Available for CLI execution"
90
- )
91
- status_table.add_row(
92
- "Potential Savings Range",
93
- summary["potential_range"],
94
- "Combined financial impact across all scenarios"
95
- )
96
-
97
- self.console.print(status_table)
98
-
99
- # Template capabilities
100
- self._display_template_capabilities()
101
-
102
- # Environment variable guide
103
- self._display_environment_guide()
104
-
105
- def _display_template_capabilities(self) -> None:
106
- """Display available template types for scenario creation."""
107
- templates = get_available_templates()
108
-
109
- template_panels = []
110
- template_descriptions = {
111
- "aws_resource_optimization": "Generic AWS resource optimization for any service",
112
- "lambda_rightsizing": "AWS Lambda function memory and timeout optimization",
113
- "s3_storage_optimization": "S3 storage class optimization based on access patterns",
114
- "healthcare_compliance": "Healthcare-specific HIPAA compliance scenarios",
115
- "finance_cost_governance": "Financial industry SOX compliance optimization",
116
- "manufacturing_automation": "Manufacturing IoT and automation cost optimization"
117
- }
118
-
119
- for template in templates:
120
- description = template_descriptions.get(template, "Custom template")
121
- panel = Panel(
122
- f"[bold]{template.replace('_', ' ').title()}[/bold]\n{description}",
123
- title=template,
124
- style="blue"
125
- )
126
- template_panels.append(panel)
127
-
128
- columns = Columns(template_panels, equal=True, expand=True)
129
-
130
- self.console.print(f"\n[bold green]📋 Available Scenario Templates[/bold green]")
131
- self.console.print(columns)
132
-
133
- def _display_environment_guide(self) -> None:
134
- """Display environment variable configuration guide."""
135
- env_guide = Panel(
136
- """[bold]Environment Variable Pattern:[/bold]
137
-
138
- [cyan]Required (Creates New Scenario):[/cyan]
139
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_DISPLAY_NAME="Scenario Name"
140
-
141
- [cyan]Optional (Customize Behavior):[/cyan]
142
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_MIN_SAVINGS=5000
143
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_MAX_SAVINGS=15000
144
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_DESCRIPTION="Business case description"
145
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_TYPE=cost_optimization
146
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_CLI_SUFFIX=custom-command
147
- • RUNBOOKS_BUSINESS_CASE_[SCENARIO]_RISK_LEVEL=Medium
148
-
149
- [bold]Example - Creating Lambda Rightsizing Scenario:[/bold]
150
- export RUNBOOKS_BUSINESS_CASE_LAMBDA_DISPLAY_NAME="Lambda Function Optimization"
151
- export RUNBOOKS_BUSINESS_CASE_LAMBDA_MIN_SAVINGS=2000
152
- export RUNBOOKS_BUSINESS_CASE_LAMBDA_MAX_SAVINGS=8000
153
- export RUNBOOKS_BUSINESS_CASE_LAMBDA_DESCRIPTION="Optimize Lambda memory allocation"
154
- export RUNBOOKS_BUSINESS_CASE_LAMBDA_TYPE=cost_optimization
155
-
156
- [bold]Usage:[/bold]
157
- runbooks finops --scenario lambda # New scenario automatically available
158
- """,
159
- title="🔧 Dynamic Scenario Configuration",
160
- style="yellow"
161
- )
162
-
163
- self.console.print(env_guide)
164
-
165
- def create_scenario_from_template(self, scenario_id: str, template_type: str,
166
- min_savings: Optional[float] = None,
167
- max_savings: Optional[float] = None) -> BusinessScenario:
168
- """
169
- Create and register a new scenario from template.
170
-
171
- Args:
172
- scenario_id: Unique identifier for the scenario
173
- template_type: Template type to use
174
- min_savings: Optional minimum savings target
175
- max_savings: Optional maximum savings target
176
-
177
- Returns:
178
- Created BusinessScenario object
179
- """
180
- try:
181
- scenario = add_scenario_from_template(scenario_id, template_type)
182
-
183
- # Override savings if provided
184
- if min_savings:
185
- scenario.target_savings_min = min_savings
186
- if max_savings:
187
- scenario.target_savings_max = max_savings
188
-
189
- # Refresh the scenario matrix to include the new scenario
190
- self.scenario_matrix._extend_matrix_with_discovered_scenarios()
191
-
192
- print_success(f"Created scenario '{scenario_id}' from template '{template_type}'")
193
- print_info(f"CLI Command: runbooks finops --scenario {scenario_id}")
194
-
195
- return scenario
196
-
197
- except Exception as e:
198
- print_error(f"Failed to create scenario: {e}")
199
- raise
200
-
201
- def discover_environment_scenarios(self) -> List[str]:
202
- """
203
- Discover scenarios from environment variables.
204
-
205
- Returns:
206
- List of scenario IDs discovered from environment
207
- """
208
- discovered = []
209
- prefix = "RUNBOOKS_BUSINESS_CASE_"
210
-
211
- for env_var in os.environ:
212
- if env_var.startswith(prefix) and "_DISPLAY_NAME" in env_var:
213
- scenario_part = env_var.replace(prefix, "").replace("_DISPLAY_NAME", "")
214
- scenario_key = scenario_part.lower().replace('_', '-')
215
- discovered.append(scenario_key)
216
-
217
- return discovered
218
-
219
- def validate_scenario_environment(self, scenario_id: str) -> Dict[str, Any]:
220
- """
221
- Validate environment variables for a specific scenario.
222
-
223
- Args:
224
- scenario_id: Scenario identifier to validate
225
-
226
- Returns:
227
- Validation results with recommendations
228
- """
229
- env_key = scenario_id.upper().replace('-', '_')
230
- prefix = f"RUNBOOKS_BUSINESS_CASE_{env_key}"
231
-
232
- validation = {
233
- "scenario_id": scenario_id,
234
- "environment_key": env_key,
235
- "required_met": False,
236
- "optional_fields": [],
237
- "missing_recommendations": [],
238
- "current_values": {}
239
- }
240
-
241
- # Check required field
242
- display_name = os.getenv(f"{prefix}_DISPLAY_NAME")
243
- if display_name:
244
- validation["required_met"] = True
245
- validation["current_values"]["display_name"] = display_name
246
- else:
247
- validation["missing_recommendations"].append(
248
- f"Set: export {prefix}_DISPLAY_NAME='Your Scenario Name'"
249
- )
250
-
251
- # Check optional fields
252
- optional_fields = {
253
- "MIN_SAVINGS": "Minimum annual savings target (integer)",
254
- "MAX_SAVINGS": "Maximum annual savings target (integer)",
255
- "DESCRIPTION": "Business case description (string)",
256
- "TYPE": "Business case type: cost_optimization, resource_cleanup, compliance_framework, security_enhancement, automation_deployment",
257
- "CLI_SUFFIX": "CLI command suffix (defaults to scenario-id)",
258
- "RISK_LEVEL": "Risk level: Low, Medium, High"
259
- }
260
-
261
- for field, description in optional_fields.items():
262
- value = os.getenv(f"{prefix}_{field}")
263
- if value:
264
- validation["optional_fields"].append({
265
- "field": field.lower(),
266
- "value": value,
267
- "description": description
268
- })
269
- validation["current_values"][field.lower()] = value
270
-
271
- return validation
272
-
273
- def calculate_business_impact(self, scenario_ids: List[str], monthly_costs: Dict[str, float]) -> Dict[str, Any]:
274
- """
275
- Calculate combined business impact for multiple scenarios.
276
-
277
- Args:
278
- scenario_ids: List of scenario identifiers
279
- monthly_costs: Current monthly costs per scenario
280
-
281
- Returns:
282
- Combined business impact analysis
283
- """
284
- total_current = sum(monthly_costs.values())
285
- scenario_projections = {}
286
-
287
- for scenario_id in scenario_ids:
288
- if scenario_id in monthly_costs:
289
- roi = calculate_scenario_roi(scenario_id, monthly_costs[scenario_id])
290
- scenario_projections[scenario_id] = roi
291
-
292
- total_annual_savings = sum(proj["annual_savings"] for proj in scenario_projections.values())
293
- total_monthly_savings = sum(proj["monthly_savings"] for proj in scenario_projections.values())
294
-
295
- return {
296
- "total_scenarios": len(scenario_ids),
297
- "total_current_monthly": total_current,
298
- "total_current_annual": total_current * 12,
299
- "total_monthly_savings": total_monthly_savings,
300
- "total_annual_savings": total_annual_savings,
301
- "combined_roi_percentage": (total_annual_savings / (total_current * 12)) * 100 if total_current > 0 else 0,
302
- "scenario_breakdown": scenario_projections
303
- }
304
-
305
- def export_scenario_configuration(self, output_file: str) -> None:
306
- """
307
- Export current scenario configuration for reuse.
308
-
309
- Args:
310
- output_file: Path to export configuration file
311
- """
312
- all_scenarios = self.business_config.get_all_scenarios()
313
- export_data = {
314
- "scenarios": {},
315
- "export_timestamp": os.popen('date').read().strip(),
316
- "unlimited_expansion_enabled": True
317
- }
318
-
319
- for scenario_id, scenario in all_scenarios.items():
320
- export_data["scenarios"][scenario_id] = {
321
- "display_name": scenario.display_name,
322
- "business_case_type": scenario.business_case_type.value,
323
- "target_savings_min": scenario.target_savings_min,
324
- "target_savings_max": scenario.target_savings_max,
325
- "business_description": scenario.business_description,
326
- "technical_focus": scenario.technical_focus,
327
- "risk_level": scenario.risk_level,
328
- "implementation_status": scenario.implementation_status,
329
- "cli_command_suffix": scenario.cli_command_suffix
330
- }
331
-
332
- import json
333
- with open(output_file, 'w') as f:
334
- json.dump(export_data, f, indent=2)
335
-
336
- print_success(f"Exported {len(all_scenarios)} scenarios to {output_file}")
337
-
338
-
339
- # CLI Integration Functions for Unlimited Scenarios
340
- def get_dynamic_scenario_choices() -> List[str]:
341
- """
342
- Get dynamic scenario choices for CLI integration.
343
-
344
- This function replaces hardcoded scenario lists in Click options,
345
- enabling unlimited scenario expansion.
346
- """
347
- return get_unlimited_scenario_choices()
348
-
349
-
350
- def display_unlimited_scenarios_help() -> None:
351
- """Display comprehensive help for unlimited scenarios."""
352
- manager = UnlimitedScenarioManager()
353
- manager.display_expansion_capabilities()
354
-
355
-
356
- def create_template_scenario_cli(scenario_id: str, template_type: str,
357
- min_savings: Optional[float] = None,
358
- max_savings: Optional[float] = None) -> None:
359
- """
360
- CLI interface for creating scenarios from templates.
361
-
362
- Args:
363
- scenario_id: Unique identifier for the scenario
364
- template_type: Template type to use
365
- min_savings: Optional minimum savings target
366
- max_savings: Optional maximum savings target
367
- """
368
- manager = UnlimitedScenarioManager()
369
- manager.create_scenario_from_template(scenario_id, template_type, min_savings, max_savings)
370
-
371
-
372
- def validate_environment_scenario_cli(scenario_id: str) -> None:
373
- """
374
- CLI interface for validating environment scenario configuration.
375
-
376
- Args:
377
- scenario_id: Scenario identifier to validate
378
- """
379
- manager = UnlimitedScenarioManager()
380
- validation = manager.validate_scenario_environment(scenario_id)
381
-
382
- if validation["required_met"]:
383
- print_success(f"Scenario '{scenario_id}' environment configuration is valid")
384
- print_info(f"Display Name: {validation['current_values']['display_name']}")
385
-
386
- if validation["optional_fields"]:
387
- print_info("Optional fields configured:")
388
- for field in validation["optional_fields"]:
389
- print_info(f" {field['field']}: {field['value']}")
390
- else:
391
- print_warning(f"Scenario '{scenario_id}' missing required configuration")
392
- for recommendation in validation["missing_recommendations"]:
393
- print_info(f" {recommendation}")