runbooks 1.1.3__py3-none-any.whl → 1.1.5__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.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/WEIGHT_CONFIG_README.md +1 -1
- runbooks/cfat/assessment/compliance.py +8 -8
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cfat/models.py +6 -2
- runbooks/cfat/tests/__init__.py +6 -1
- runbooks/cli/__init__.py +13 -0
- runbooks/cli/commands/cfat.py +274 -0
- runbooks/cli/commands/finops.py +1164 -0
- runbooks/cli/commands/inventory.py +379 -0
- runbooks/cli/commands/operate.py +239 -0
- runbooks/cli/commands/security.py +248 -0
- runbooks/cli/commands/validation.py +825 -0
- runbooks/cli/commands/vpc.py +310 -0
- runbooks/cli/registry.py +107 -0
- runbooks/cloudops/__init__.py +23 -30
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +549 -547
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +226 -227
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +179 -215
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +11 -0
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +341 -0
- runbooks/common/aws_utils.py +75 -80
- runbooks/common/business_logic.py +127 -105
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
- runbooks/common/cross_account_manager.py +198 -205
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +235 -0
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +478 -495
- runbooks/common/mcp_integration.py +63 -74
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +176 -194
- runbooks/common/patterns.py +204 -0
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +248 -39
- runbooks/common/rich_utils.py +643 -92
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +29 -33
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +488 -622
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +40 -37
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +230 -292
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +338 -175
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1513 -482
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +25 -29
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +77 -78
- runbooks/finops/scenarios.py +1278 -439
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/tests/test_finops_dashboard.py +3 -3
- runbooks/finops/tests/test_reference_images_validation.py +2 -2
- runbooks/finops/tests/test_single_account_features.py +17 -17
- runbooks/finops/tests/validate_test_suite.py +1 -1
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +263 -269
- runbooks/finops/vpc_cleanup_exporter.py +191 -146
- runbooks/finops/vpc_cleanup_optimizer.py +593 -575
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/hitl/enhanced_workflow_engine.py +1 -1
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/README.md +3 -3
- runbooks/inventory/Tests/common_test_data.py +30 -30
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +28 -11
- runbooks/inventory/collectors/aws_networking.py +111 -101
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/discovery.md +2 -2
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/find_ec2_security_groups.py +1 -1
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/mcp_inventory_validator.py +549 -465
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +56 -52
- runbooks/inventory/rich_inventory_display.py +33 -32
- runbooks/inventory/unified_validation_engine.py +278 -251
- runbooks/inventory/vpc_analyzer.py +733 -696
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +382 -378
- runbooks/inventory/vpc_flow_analyzer.py +3 -3
- runbooks/main.py +152 -9147
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/metrics/dora_metrics_engine.py +2 -2
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/mcp_integration.py +1 -1
- runbooks/operate/networking_cost_heatmap.py +33 -10
- runbooks/operate/privatelink_operations.py +1 -1
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_endpoints.py +1 -1
- runbooks/operate/vpc_operations.py +648 -618
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +71 -67
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +91 -65
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +49 -44
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/integration_test_enterprise_security.py +5 -3
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/run_script.py +1 -1
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/mcp_reliability_engine.py +6 -6
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +51 -48
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +754 -708
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +447 -451
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +190 -162
- runbooks/vpc/mcp_no_eni_validator.py +681 -640
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1302 -1129
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.5.dist-info/METADATA +328 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -956
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.3.dist-info/METADATA +0 -799
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.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}")
|