runbooks 1.1.4__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.
Files changed (228) 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 +138 -35
  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 +11 -0
  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 +63 -74
  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 +201 -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/cloud_foundations_integration.py +144 -149
  113. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  114. runbooks/inventory/collectors/aws_networking.py +109 -99
  115. runbooks/inventory/collectors/base.py +4 -0
  116. runbooks/inventory/core/collector.py +495 -313
  117. runbooks/inventory/drift_detection_cli.py +69 -96
  118. runbooks/inventory/inventory_mcp_cli.py +48 -46
  119. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  120. runbooks/inventory/mcp_inventory_validator.py +549 -465
  121. runbooks/inventory/mcp_vpc_validator.py +359 -442
  122. runbooks/inventory/organizations_discovery.py +55 -51
  123. runbooks/inventory/rich_inventory_display.py +33 -32
  124. runbooks/inventory/unified_validation_engine.py +278 -251
  125. runbooks/inventory/vpc_analyzer.py +732 -695
  126. runbooks/inventory/vpc_architecture_validator.py +293 -348
  127. runbooks/inventory/vpc_dependency_analyzer.py +382 -378
  128. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  129. runbooks/main.py +49 -34
  130. runbooks/main_final.py +91 -60
  131. runbooks/main_minimal.py +22 -10
  132. runbooks/main_optimized.py +131 -100
  133. runbooks/main_ultra_minimal.py +7 -2
  134. runbooks/mcp/__init__.py +36 -0
  135. runbooks/mcp/integration.py +679 -0
  136. runbooks/monitoring/performance_monitor.py +9 -4
  137. runbooks/operate/dynamodb_operations.py +3 -1
  138. runbooks/operate/ec2_operations.py +145 -137
  139. runbooks/operate/iam_operations.py +146 -152
  140. runbooks/operate/networking_cost_heatmap.py +29 -8
  141. runbooks/operate/rds_operations.py +223 -254
  142. runbooks/operate/s3_operations.py +107 -118
  143. runbooks/operate/vpc_operations.py +646 -616
  144. runbooks/remediation/base.py +1 -1
  145. runbooks/remediation/commons.py +10 -7
  146. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  147. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  148. runbooks/remediation/multi_account.py +24 -21
  149. runbooks/remediation/rds_snapshot_list.py +86 -60
  150. runbooks/remediation/remediation_cli.py +92 -146
  151. runbooks/remediation/universal_account_discovery.py +83 -79
  152. runbooks/remediation/workspaces_list.py +46 -41
  153. runbooks/security/__init__.py +19 -0
  154. runbooks/security/assessment_runner.py +1150 -0
  155. runbooks/security/baseline_checker.py +812 -0
  156. runbooks/security/cloudops_automation_security_validator.py +509 -535
  157. runbooks/security/compliance_automation_engine.py +17 -17
  158. runbooks/security/config/__init__.py +2 -2
  159. runbooks/security/config/compliance_config.py +50 -50
  160. runbooks/security/config_template_generator.py +63 -76
  161. runbooks/security/enterprise_security_framework.py +1 -1
  162. runbooks/security/executive_security_dashboard.py +519 -508
  163. runbooks/security/multi_account_security_controls.py +959 -1210
  164. runbooks/security/real_time_security_monitor.py +422 -444
  165. runbooks/security/security_baseline_tester.py +1 -1
  166. runbooks/security/security_cli.py +143 -112
  167. runbooks/security/test_2way_validation.py +439 -0
  168. runbooks/security/two_way_validation_framework.py +852 -0
  169. runbooks/sre/production_monitoring_framework.py +167 -177
  170. runbooks/tdd/__init__.py +15 -0
  171. runbooks/tdd/cli.py +1071 -0
  172. runbooks/utils/__init__.py +14 -17
  173. runbooks/utils/logger.py +7 -2
  174. runbooks/utils/version_validator.py +50 -47
  175. runbooks/validation/__init__.py +6 -6
  176. runbooks/validation/cli.py +9 -3
  177. runbooks/validation/comprehensive_2way_validator.py +745 -704
  178. runbooks/validation/mcp_validator.py +906 -228
  179. runbooks/validation/terraform_citations_validator.py +104 -115
  180. runbooks/validation/terraform_drift_detector.py +447 -451
  181. runbooks/vpc/README.md +617 -0
  182. runbooks/vpc/__init__.py +8 -1
  183. runbooks/vpc/analyzer.py +577 -0
  184. runbooks/vpc/cleanup_wrapper.py +476 -413
  185. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  186. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  187. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  188. runbooks/vpc/config.py +92 -97
  189. runbooks/vpc/cost_engine.py +411 -148
  190. runbooks/vpc/cost_explorer_integration.py +553 -0
  191. runbooks/vpc/cross_account_session.py +101 -106
  192. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  193. runbooks/vpc/eni_gate_validator.py +961 -0
  194. runbooks/vpc/heatmap_engine.py +185 -160
  195. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  196. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  197. runbooks/vpc/networking_wrapper.py +15 -8
  198. runbooks/vpc/pdca_remediation_planner.py +528 -0
  199. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  200. runbooks/vpc/runbooks_adapter.py +1167 -241
  201. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  202. runbooks/vpc/test_data_loader.py +358 -0
  203. runbooks/vpc/tests/conftest.py +314 -4
  204. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  205. runbooks/vpc/tests/test_cost_engine.py +0 -2
  206. runbooks/vpc/topology_generator.py +326 -0
  207. runbooks/vpc/unified_scenarios.py +1297 -1124
  208. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  209. runbooks-1.1.5.dist-info/METADATA +328 -0
  210. {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/RECORD +214 -193
  211. runbooks/finops/README.md +0 -414
  212. runbooks/finops/accuracy_cross_validator.py +0 -647
  213. runbooks/finops/business_cases.py +0 -950
  214. runbooks/finops/dashboard_router.py +0 -922
  215. runbooks/finops/ebs_optimizer.py +0 -973
  216. runbooks/finops/embedded_mcp_validator.py +0 -1629
  217. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  218. runbooks/finops/finops_dashboard.py +0 -584
  219. runbooks/finops/finops_scenarios.py +0 -1218
  220. runbooks/finops/legacy_migration.py +0 -730
  221. runbooks/finops/multi_dashboard.py +0 -1519
  222. runbooks/finops/single_dashboard.py +0 -1113
  223. runbooks/finops/unlimited_scenarios.py +0 -393
  224. runbooks-1.1.4.dist-info/METADATA +0 -800
  225. {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
  226. {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
  227. {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
  228. {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -1,950 +0,0 @@
1
- """
2
- šŸ¢ CloudOps-Automation Business Cases Module (Enhanced latest version)
3
- Enterprise Business Logic Extraction from 67+ Notebooks
4
-
5
- Strategic Achievement: Business logic consolidation enabling $78,500+ annual savings
6
- through 75% maintenance cost reduction via modular architecture patterns.
7
-
8
- Module Focus: Extract and standardize business cases from legacy CloudOps-Automation
9
- notebooks into reusable, testable business logic components for enterprise stakeholders.
10
-
11
- Enhanced Features:
12
- - Real AWS data integration (no hardcoded values)
13
- - ROI calculation methodologies with risk adjustment
14
- - Business case categorization for enterprise stakeholders
15
- - Multi-stakeholder priority mapping (CFO, CISO, CTO, Procurement)
16
- - Legacy notebook consolidation patterns
17
- - Executive dashboard integration
18
-
19
- Author: Enterprise Agile Team (6-Agent Coordination)
20
- Version: latest version - Distributed Architecture Framework
21
- """
22
-
23
- import os
24
- import json
25
- import subprocess
26
- from typing import Dict, List, Optional, Any, Union
27
- from datetime import datetime, timedelta
28
- from dataclasses import dataclass
29
- from enum import Enum
30
-
31
- from ..common.rich_utils import console, format_cost, print_header, print_success, create_table
32
-
33
-
34
- class BusinessCaseCategory(Enum):
35
- """Business case categorization for enterprise stakeholders (CloudOps-Automation)."""
36
- COST_OPTIMIZATION = "cost_optimization" # 18 notebooks → 4-5 modules
37
- SECURITY_COMPLIANCE = "security_compliance" # 15 notebooks → 3-4 modules
38
- RESOURCE_MANAGEMENT = "resource_management" # 14 notebooks → 3-4 modules
39
- NETWORK_INFRASTRUCTURE = "network_infrastructure" # 8 notebooks → 2-3 modules
40
- SPECIALIZED_OPERATIONS = "specialized_operations" # 12 notebooks → 2-3 modules
41
-
42
-
43
- class StakeholderPriority(Enum):
44
- """Stakeholder priority mapping for business case targeting."""
45
- CFO_FINANCIAL = "cfo_financial" # Cost reduction, ROI analysis
46
- CISO_SECURITY = "ciso_security" # Compliance, risk mitigation
47
- CTO_TECHNICAL = "cto_technical" # Performance, scalability
48
- PROCUREMENT_SOURCING = "procurement" # Vendor optimization, contracts
49
-
50
-
51
- @dataclass
52
- class LegacyNotebookPattern:
53
- """Pattern extracted from CloudOps-Automation legacy notebooks."""
54
- notebook_name: str
55
- business_logic: str
56
- target_module: str
57
- savings_potential: str
58
- user_type: str # Technical or Business
59
- consolidation_priority: int # 1=highest, 5=lowest
60
-
61
-
62
- @dataclass
63
- class ConsolidationMatrix:
64
- """Comprehensive consolidation analysis for executive reporting."""
65
- total_notebooks: int
66
- consolidation_opportunity_lines: int # 15,000+ redundant lines
67
- target_lines_modular: int # 3,400 lines modular framework
68
- annual_savings: int # $78,500+ through 75% maintenance reduction
69
- business_impact: str # $5.7M-$16.6M optimization potential
70
- consolidation_phases: List[str]
71
- success_metrics: List[str]
72
-
73
-
74
- class RiskLevel(Enum):
75
- """Business risk levels for cost optimization initiatives"""
76
- LOW = "Low"
77
- MEDIUM = "Medium"
78
- HIGH = "High"
79
- CRITICAL = "Critical"
80
-
81
-
82
- class BusinessCaseStatus(Enum):
83
- """Business case lifecycle status"""
84
- INVESTIGATION = "Investigation Phase"
85
- ANALYSIS = "Analysis Complete"
86
- APPROVED = "Approved for Implementation"
87
- IN_PROGRESS = "Implementation In Progress"
88
- COMPLETED = "Implementation Complete"
89
- CANCELLED = "Cancelled"
90
-
91
-
92
- @dataclass
93
- class ROIMetrics:
94
- """ROI calculation results with enhanced validation"""
95
- # PRESERVE all existing fields exactly as they are
96
- annual_savings: float
97
- implementation_cost: float
98
- roi_percentage: float
99
- payback_months: float
100
- net_first_year: float
101
- risk_adjusted_savings: float
102
-
103
- # ADD these new fields with default values for backward compatibility
104
- confidence_level: str = "MEDIUM" # HIGH/MEDIUM/LOW based on validation
105
- validation_evidence: Optional[Dict[str, Any]] = None # MCP validation results
106
- business_tier: str = "TIER_2" # TIER_1/TIER_2/TIER_3 classification
107
-
108
-
109
- @dataclass
110
- class BusinessCase:
111
- """Complete business case analysis"""
112
- title: str
113
- scenario_key: str
114
- status: BusinessCaseStatus
115
- risk_level: RiskLevel
116
- roi_metrics: ROIMetrics
117
- implementation_time: str
118
- resource_count: int
119
- affected_accounts: List[str]
120
- next_steps: List[str]
121
- data_source: str
122
- validation_status: str
123
- timestamp: str
124
-
125
-
126
- class BusinessCaseAnalyzer:
127
- """
128
- Enterprise business case analyzer for cost optimization scenarios.
129
-
130
- This class provides reusable business case analysis capabilities that
131
- can be used across multiple enterprises and projects.
132
- """
133
-
134
- def __init__(self, profile: Optional[str] = None, enterprise_config: Optional[Dict] = None):
135
- """
136
- Initialize business case analyzer.
137
-
138
- Args:
139
- profile: AWS profile for data collection
140
- enterprise_config: Enterprise-specific configuration
141
- """
142
- self.profile = profile or os.getenv('AWS_PROFILE')
143
- self.enterprise_config = enterprise_config or {}
144
- self.runbooks_cmd = 'runbooks'
145
-
146
- # Enterprise cost configuration
147
- self.hourly_rate = self.enterprise_config.get('technical_hourly_rate', 150)
148
- self.risk_multipliers = self.enterprise_config.get('risk_multipliers', {
149
- RiskLevel.LOW: 1.0,
150
- RiskLevel.MEDIUM: 0.85,
151
- RiskLevel.HIGH: 0.7,
152
- RiskLevel.CRITICAL: 0.5
153
- })
154
-
155
- def execute_runbooks_command(self, command_args: List[str], json_output: bool = True) -> Dict[str, Any]:
156
- """
157
- Execute runbooks CLI command for data collection.
158
-
159
- Args:
160
- command_args: CLI command arguments
161
- json_output: Whether to parse JSON output
162
-
163
- Returns:
164
- Command results or error information
165
- """
166
- cmd = [self.runbooks_cmd] + command_args
167
-
168
- if self.profile:
169
- cmd.extend(['--profile', self.profile])
170
-
171
- if json_output:
172
- cmd.append('--json')
173
-
174
- try:
175
- result = subprocess.run(
176
- cmd,
177
- capture_output=True,
178
- text=True,
179
- check=True,
180
- timeout=60 # 1 minute timeout for CLI operations
181
- )
182
-
183
- if json_output:
184
- return json.loads(result.stdout)
185
- return {'stdout': result.stdout, 'success': True}
186
-
187
- except subprocess.CalledProcessError as e:
188
- return {
189
- 'error': True,
190
- 'message': f"CLI command failed: {e}",
191
- 'stderr': e.stderr,
192
- 'returncode': e.returncode
193
- }
194
- except subprocess.TimeoutExpired:
195
- return {
196
- 'error': True,
197
- 'message': "CLI command timeout after 60 seconds",
198
- 'timeout': True
199
- }
200
- except json.JSONDecodeError as e:
201
- return {
202
- 'error': True,
203
- 'message': f"Failed to parse JSON output: {e}",
204
- 'raw_output': result.stdout
205
- }
206
- except Exception as e:
207
- return {
208
- 'error': True,
209
- 'message': f"Unexpected error: {e}"
210
- }
211
-
212
- def calculate_roi_metrics(
213
- self,
214
- annual_savings: float,
215
- implementation_hours: float = 8,
216
- additional_costs: float = 0,
217
- risk_level: RiskLevel = RiskLevel.MEDIUM,
218
- validation_evidence: Optional[Dict] = None # ADD this parameter
219
- ) -> ROIMetrics:
220
- """
221
- Calculate comprehensive ROI metrics for business case analysis.
222
-
223
- Args:
224
- annual_savings: Projected annual cost savings
225
- implementation_hours: Estimated implementation time in hours
226
- additional_costs: Additional implementation costs (tools, training, etc.)
227
- risk_level: Business risk assessment
228
-
229
- Returns:
230
- Complete ROI metrics analysis
231
- """
232
- # Calculate total implementation cost
233
- labor_cost = implementation_hours * self.hourly_rate
234
- total_implementation_cost = labor_cost + additional_costs
235
-
236
- # Risk-adjusted savings calculation
237
- risk_multiplier = self.risk_multipliers.get(risk_level, 0.85)
238
- risk_adjusted_savings = annual_savings * risk_multiplier
239
-
240
- # ROI calculations
241
- if total_implementation_cost > 0:
242
- roi_percentage = ((risk_adjusted_savings - total_implementation_cost) / total_implementation_cost) * 100
243
- payback_months = (total_implementation_cost / annual_savings) * 12 if annual_savings > 0 else 0
244
- else:
245
- roi_percentage = float('inf')
246
- payback_months = 0
247
-
248
- net_first_year = risk_adjusted_savings - total_implementation_cost
249
-
250
- # ADD this logic before the existing return statement
251
- confidence_level = "MEDIUM" # Default
252
- business_tier = "TIER_2" # Default
253
-
254
- # Calculate confidence level based on validation evidence
255
- if validation_evidence:
256
- mcp_accuracy = validation_evidence.get("total_accuracy", 0)
257
- if mcp_accuracy >= 99.5:
258
- confidence_level = "HIGH"
259
- business_tier = "TIER_1" # PROVEN with real data
260
- elif mcp_accuracy >= 95.0:
261
- confidence_level = "MEDIUM"
262
- business_tier = "TIER_2" # OPERATIONAL with good data
263
- else:
264
- confidence_level = "LOW"
265
- business_tier = "TIER_3" # STRATEGIC with limited validation
266
-
267
- return ROIMetrics(
268
- # PRESERVE all existing fields exactly as they are
269
- annual_savings=annual_savings,
270
- implementation_cost=total_implementation_cost,
271
- roi_percentage=roi_percentage,
272
- payback_months=payback_months,
273
- net_first_year=net_first_year,
274
- risk_adjusted_savings=risk_adjusted_savings,
275
- # ADD new fields
276
- confidence_level=confidence_level,
277
- validation_evidence=validation_evidence,
278
- business_tier=business_tier
279
- )
280
-
281
- def analyze_workspaces_scenario(self) -> BusinessCase:
282
- """
283
- Analyze WorkSpaces cleanup business case using real AWS data.
284
-
285
- Returns:
286
- Complete WorkSpaces business case analysis
287
- """
288
- # Get real data from runbooks CLI
289
- data = self.execute_runbooks_command(['finops', '--scenario', 'workspaces'])
290
-
291
- if data.get('error'):
292
- # Return error case for handling
293
- return BusinessCase(
294
- title="WorkSpaces Cleanup Initiative",
295
- scenario_key="workspaces",
296
- status=BusinessCaseStatus.INVESTIGATION,
297
- risk_level=RiskLevel.MEDIUM,
298
- roi_metrics=ROIMetrics(0, 0, 0, 0, 0, 0),
299
- implementation_time="Pending data collection",
300
- resource_count=0,
301
- affected_accounts=[],
302
- next_steps=["Connect to AWS environment for data collection"],
303
- data_source=f"Error: {data.get('message', 'Unknown error')}",
304
- validation_status="Failed - no data available",
305
- timestamp=datetime.now().isoformat()
306
- )
307
-
308
- # Extract real data from CLI response
309
- unused_workspaces = data.get('unused_workspaces', [])
310
-
311
- # Calculate actual savings from real data
312
- annual_savings = sum(
313
- ws.get('monthly_cost', 0) * 12
314
- for ws in unused_workspaces
315
- )
316
-
317
- # Get unique accounts
318
- unique_accounts = list(set(
319
- ws.get('account_id')
320
- for ws in unused_workspaces
321
- if ws.get('account_id')
322
- ))
323
-
324
- # Estimate implementation time based on resource count
325
- resource_count = len(unused_workspaces)
326
- if resource_count <= 10:
327
- implementation_time = "4-6 hours"
328
- implementation_hours = 6
329
- elif resource_count <= 25:
330
- implementation_time = "6-8 hours"
331
- implementation_hours = 8
332
- else:
333
- implementation_time = "1-2 days"
334
- implementation_hours = 16
335
-
336
- # Calculate ROI metrics
337
- roi_metrics = self.calculate_roi_metrics(
338
- annual_savings=annual_savings,
339
- implementation_hours=implementation_hours,
340
- risk_level=RiskLevel.LOW # WorkSpaces deletion is low risk
341
- )
342
-
343
- return BusinessCase(
344
- title="WorkSpaces Cleanup Initiative",
345
- scenario_key="workspaces",
346
- status=BusinessCaseStatus.ANALYSIS,
347
- risk_level=RiskLevel.LOW,
348
- roi_metrics=roi_metrics,
349
- implementation_time=implementation_time,
350
- resource_count=resource_count,
351
- affected_accounts=unique_accounts,
352
- next_steps=[
353
- "Review unused WorkSpaces list with business stakeholders",
354
- "Schedule maintenance window for WorkSpaces deletion",
355
- "Execute cleanup during planned maintenance",
356
- "Validate cost reduction in next billing cycle"
357
- ],
358
- data_source="Real AWS API via runbooks CLI",
359
- validation_status=data.get('validation_status', 'CLI validated'),
360
- timestamp=datetime.now().isoformat()
361
- )
362
-
363
- def analyze_rds_snapshots_scenario(self) -> BusinessCase:
364
- """
365
- Analyze RDS snapshots cleanup business case using real AWS data.
366
-
367
- Returns:
368
- Complete RDS snapshots business case analysis
369
- """
370
- # Get real data from runbooks CLI
371
- data = self.execute_runbooks_command(['finops', '--scenario', 'snapshots'])
372
-
373
- if data.get('error'):
374
- return BusinessCase(
375
- title="RDS Storage Optimization",
376
- scenario_key="rds_snapshots",
377
- status=BusinessCaseStatus.INVESTIGATION,
378
- risk_level=RiskLevel.MEDIUM,
379
- roi_metrics=ROIMetrics(0, 0, 0, 0, 0, 0),
380
- implementation_time="Pending data collection",
381
- resource_count=0,
382
- affected_accounts=[],
383
- next_steps=["Connect to AWS environment for data collection"],
384
- data_source=f"Error: {data.get('message', 'Unknown error')}",
385
- validation_status="Failed - no data available",
386
- timestamp=datetime.now().isoformat()
387
- )
388
-
389
- # Extract real snapshot data
390
- snapshots = data.get('manual_snapshots', [])
391
-
392
- # Calculate storage and costs
393
- total_storage_gb = sum(
394
- s.get('size_gb', 0)
395
- for s in snapshots
396
- )
397
-
398
- # AWS snapshot storage pricing (current as of 2024)
399
- cost_per_gb_month = 0.095
400
-
401
- # Conservative savings estimate (assume 70% can be safely deleted)
402
- conservative_savings = total_storage_gb * cost_per_gb_month * 12 * 0.7
403
-
404
- # Get unique accounts
405
- unique_accounts = list(set(
406
- s.get('account_id')
407
- for s in snapshots
408
- if s.get('account_id')
409
- ))
410
-
411
- # Estimate implementation time based on accounts and snapshots
412
- account_count = len(unique_accounts)
413
- resource_count = len(snapshots)
414
- implementation_hours = max(8, account_count * 4) # Minimum 8 hours, 4 hours per account
415
- implementation_time = f"{implementation_hours//8}-{(implementation_hours//8)+1} days"
416
-
417
- # Calculate ROI metrics
418
- roi_metrics = self.calculate_roi_metrics(
419
- annual_savings=conservative_savings,
420
- implementation_hours=implementation_hours,
421
- risk_level=RiskLevel.MEDIUM # RDS snapshots require careful analysis
422
- )
423
-
424
- return BusinessCase(
425
- title="RDS Storage Optimization",
426
- scenario_key="rds_snapshots",
427
- status=BusinessCaseStatus.ANALYSIS,
428
- risk_level=RiskLevel.MEDIUM,
429
- roi_metrics=roi_metrics,
430
- implementation_time=implementation_time,
431
- resource_count=resource_count,
432
- affected_accounts=unique_accounts,
433
- next_steps=[
434
- "Review snapshot retention policies with database teams",
435
- "Identify snapshots safe for deletion (>30 days old)",
436
- "Create automated cleanup policies for ongoing management",
437
- "Implement lifecycle policies for future snapshots"
438
- ],
439
- data_source="Real AWS API via runbooks CLI",
440
- validation_status=data.get('validation_status', 'CLI validated'),
441
- timestamp=datetime.now().isoformat()
442
- )
443
-
444
- def analyze_commvault_scenario(self) -> BusinessCase:
445
- """
446
- Analyze Commvault infrastructure investigation case.
447
-
448
- Returns:
449
- Complete Commvault investigation business case
450
- """
451
- # Get real data from runbooks CLI
452
- data = self.execute_runbooks_command(['finops', '--scenario', 'commvault'])
453
-
454
- if data.get('error'):
455
- return BusinessCase(
456
- title="Infrastructure Utilization Investigation",
457
- scenario_key="commvault",
458
- status=BusinessCaseStatus.INVESTIGATION,
459
- risk_level=RiskLevel.MEDIUM,
460
- roi_metrics=ROIMetrics(0, 0, 0, 0, 0, 0),
461
- implementation_time="Investigation phase",
462
- resource_count=0,
463
- affected_accounts=[],
464
- next_steps=["Connect to AWS environment for data collection"],
465
- data_source=f"Error: {data.get('message', 'Unknown error')}",
466
- validation_status="Failed - no data available",
467
- timestamp=datetime.now().isoformat()
468
- )
469
-
470
- # This scenario is in investigation phase - no concrete savings yet
471
- account_id = data.get('account_id', 'Unknown')
472
-
473
- return BusinessCase(
474
- title="Infrastructure Utilization Investigation",
475
- scenario_key="commvault",
476
- status=BusinessCaseStatus.INVESTIGATION,
477
- risk_level=RiskLevel.MEDIUM,
478
- roi_metrics=ROIMetrics(0, 0, 0, 0, 0, 0), # No concrete savings yet
479
- implementation_time="Assessment: 1-2 days, Implementation: TBD",
480
- resource_count=0, # Will be determined during investigation
481
- affected_accounts=[account_id] if account_id != 'Unknown' else [],
482
- next_steps=[
483
- "Analyze EC2 utilization metrics for all instances",
484
- "Determine if instances are actively used by applications",
485
- "Calculate potential savings IF decommissioning is viable",
486
- "Develop implementation plan based on utilization analysis"
487
- ],
488
- data_source="Investigation framework via runbooks CLI",
489
- validation_status=data.get('validation_status', 'Investigation phase'),
490
- timestamp=datetime.now().isoformat()
491
- )
492
-
493
- def get_all_business_cases(self) -> Dict[str, BusinessCase]:
494
- """
495
- Analyze all available business cases and return comprehensive results.
496
-
497
- Returns:
498
- Dictionary of all business case analyses
499
- """
500
- cases = {
501
- 'workspaces': self.analyze_workspaces_scenario(),
502
- 'rds_snapshots': self.analyze_rds_snapshots_scenario(),
503
- 'commvault': self.analyze_commvault_scenario()
504
- }
505
-
506
- return cases
507
-
508
- def calculate_portfolio_roi(self, business_cases: Dict[str, BusinessCase]) -> Dict[str, Any]:
509
- """
510
- Calculate portfolio-level ROI across all business cases.
511
-
512
- Args:
513
- business_cases: Dictionary of business case analyses
514
-
515
- Returns:
516
- Portfolio ROI analysis
517
- """
518
- total_annual_savings = 0
519
- total_implementation_cost = 0
520
- total_risk_adjusted_savings = 0
521
-
522
- for case in business_cases.values():
523
- if case.roi_metrics:
524
- total_annual_savings += case.roi_metrics.annual_savings
525
- total_implementation_cost += case.roi_metrics.implementation_cost
526
- total_risk_adjusted_savings += case.roi_metrics.risk_adjusted_savings
527
-
528
- if total_implementation_cost > 0:
529
- portfolio_roi = ((total_risk_adjusted_savings - total_implementation_cost) / total_implementation_cost) * 100
530
- portfolio_payback = (total_implementation_cost / total_annual_savings) * 12 if total_annual_savings > 0 else 0
531
- else:
532
- portfolio_roi = 0
533
- portfolio_payback = 0
534
-
535
- return {
536
- 'total_annual_savings': total_annual_savings,
537
- 'total_implementation_cost': total_implementation_cost,
538
- 'total_risk_adjusted_savings': total_risk_adjusted_savings,
539
- 'portfolio_roi_percentage': portfolio_roi,
540
- 'portfolio_payback_months': portfolio_payback,
541
- 'net_first_year_value': total_risk_adjusted_savings - total_implementation_cost,
542
- 'analysis_timestamp': datetime.now().isoformat()
543
- }
544
-
545
-
546
- class CloudOpsNotebookExtractor:
547
- """
548
- Extract and analyze CloudOps-Automation notebooks for consolidation opportunities.
549
-
550
- Strategic Focus: Convert 67+ notebooks with 15,000+ redundant lines into modular
551
- architecture enabling $78,500+ annual savings through 75% maintenance reduction.
552
- """
553
-
554
- def __init__(self):
555
- """Initialize CloudOps notebook extraction engine."""
556
- self.notebook_patterns: List[LegacyNotebookPattern] = []
557
- self.consolidation_matrix = None
558
-
559
- def extract_cost_optimization_patterns(self) -> List[LegacyNotebookPattern]:
560
- """
561
- Extract cost optimization patterns from 18 identified notebooks.
562
-
563
- Strategic Value: $1.5M-$16.6M optimization potential across enterprise accounts
564
- Consolidation: 18 notebooks → 4-5 unified modules
565
- """
566
- cost_patterns = [
567
- LegacyNotebookPattern(
568
- notebook_name="AWS_Change_EBS_Volume_To_GP3_Type",
569
- business_logic="GP2→GP3 conversion with performance analysis",
570
- target_module="ebs_cost_optimizer.py",
571
- savings_potential="$1.5M-$9.3M annual",
572
- user_type="Technical",
573
- consolidation_priority=1
574
- ),
575
- LegacyNotebookPattern(
576
- notebook_name="AWS_Delete_Unused_NAT_Gateways",
577
- business_logic="NAT Gateway utilization and cost optimization",
578
- target_module="nat_gateway_optimizer.py",
579
- savings_potential="$2.4M-$4.2M annual",
580
- user_type="Technical",
581
- consolidation_priority=1
582
- ),
583
- LegacyNotebookPattern(
584
- notebook_name="AWS_Release_Unattached_Elastic_IPs",
585
- business_logic="Elastic IP optimization and cleanup",
586
- target_module="elastic_ip_optimizer.py",
587
- savings_potential="$1.8M-$3.1M annual",
588
- user_type="Technical",
589
- consolidation_priority=1
590
- ),
591
- LegacyNotebookPattern(
592
- notebook_name="AWS_Stop_Idle_EC2_Instances",
593
- business_logic="EC2 rightsizing based on utilization",
594
- target_module="ec2_cost_optimizer.py",
595
- savings_potential="$2M-$8M annual",
596
- user_type="Technical",
597
- consolidation_priority=2
598
- ),
599
- LegacyNotebookPattern(
600
- notebook_name="AWS_Purchase_Reserved_Instances_For_Long_Running_RDS_Instances",
601
- business_logic="RDS Reserved Instance optimization strategy",
602
- target_module="reservation_optimizer.py",
603
- savings_potential="$2M-$10M annual",
604
- user_type="Business",
605
- consolidation_priority=2
606
- )
607
- ]
608
-
609
- self.notebook_patterns.extend(cost_patterns)
610
- return cost_patterns
611
-
612
- def extract_security_compliance_patterns(self) -> List[LegacyNotebookPattern]:
613
- """
614
- Extract security & compliance patterns from 15 identified notebooks.
615
-
616
- Strategic Value: Risk mitigation and regulatory compliance automation
617
- Consolidation: 15 notebooks → 3-4 unified security modules
618
- """
619
- security_patterns = [
620
- LegacyNotebookPattern(
621
- notebook_name="AWS_Remediate_unencrypted_S3_buckets",
622
- business_logic="S3 encryption automation with compliance reporting",
623
- target_module="s3_security_optimizer.py",
624
- savings_potential="Risk mitigation value",
625
- user_type="Technical",
626
- consolidation_priority=1
627
- ),
628
- LegacyNotebookPattern(
629
- notebook_name="AWS_Access_Key_Rotation",
630
- business_logic="IAM security automation with least privilege",
631
- target_module="iam_security_optimizer.py",
632
- savings_potential="Security baseline value",
633
- user_type="Technical",
634
- consolidation_priority=2
635
- ),
636
- LegacyNotebookPattern(
637
- notebook_name="Enforce_Mandatory_Tags_Across_All_AWS_Resources",
638
- business_logic="Resource governance and policy compliance",
639
- target_module="governance_optimizer.py",
640
- savings_potential="Policy compliance value",
641
- user_type="Business",
642
- consolidation_priority=2
643
- )
644
- ]
645
-
646
- self.notebook_patterns.extend(security_patterns)
647
- return security_patterns
648
-
649
- def generate_consolidation_analysis(self) -> ConsolidationMatrix:
650
- """
651
- Generate comprehensive consolidation matrix for executive reporting.
652
-
653
- Strategic Output: Executive-ready analysis with quantified business impact
654
- """
655
- # Extract all patterns
656
- self.extract_cost_optimization_patterns()
657
- self.extract_security_compliance_patterns()
658
-
659
- self.consolidation_matrix = ConsolidationMatrix(
660
- total_notebooks=67, # From comprehensive analysis
661
- consolidation_opportunity_lines=15000, # Redundant code identified
662
- target_lines_modular=3400, # Efficient modular architecture
663
- annual_savings=78500, # Through 75% maintenance cost reduction
664
- business_impact="$5.7M-$16.6M optimization potential",
665
- consolidation_phases=[
666
- "Phase 3A: High-Impact Consolidation (6-8 weeks)",
667
- "Phase 3B: Security & Compliance Consolidation (4-6 weeks)",
668
- "Phase 3C: Operations Excellence (2-4 weeks)"
669
- ],
670
- success_metrics=[
671
- "≄75% redundancy elimination achieved",
672
- "<30s execution for all optimization analyses",
673
- "≄99.5% MCP validation accuracy maintained",
674
- "$78,500+ annual savings realized",
675
- "≄90% automated test coverage across all modules"
676
- ]
677
- )
678
-
679
- return self.consolidation_matrix
680
-
681
- def create_stakeholder_prioritization(self) -> Dict[str, List[LegacyNotebookPattern]]:
682
- """
683
- Organize patterns by stakeholder priority for targeted implementation.
684
-
685
- Returns:
686
- Stakeholder-organized patterns for executive planning
687
- """
688
- stakeholder_map = {
689
- "cfo_financial": [],
690
- "ciso_security": [],
691
- "cto_technical": [],
692
- "procurement": []
693
- }
694
-
695
- for pattern in self.notebook_patterns:
696
- if "cost" in pattern.business_logic.lower() or "saving" in pattern.savings_potential:
697
- stakeholder_map["cfo_financial"].append(pattern)
698
- elif "security" in pattern.business_logic.lower() or "compliance" in pattern.business_logic.lower():
699
- stakeholder_map["ciso_security"].append(pattern)
700
- elif pattern.user_type == "Technical":
701
- stakeholder_map["cto_technical"].append(pattern)
702
- else:
703
- stakeholder_map["procurement"].append(pattern)
704
-
705
- return stakeholder_map
706
-
707
- def generate_executive_dashboard_data(self) -> Dict[str, Any]:
708
- """
709
- Generate executive dashboard data for C-suite presentation.
710
-
711
- Strategic Output: Manager/Financial/CTO ready presentation data
712
- """
713
- if not self.consolidation_matrix:
714
- self.generate_consolidation_analysis()
715
-
716
- stakeholder_priorities = self.create_stakeholder_prioritization()
717
-
718
- dashboard_data = {
719
- "executive_summary": {
720
- "total_notebooks": self.consolidation_matrix.total_notebooks,
721
- "consolidation_opportunity": f"{self.consolidation_matrix.consolidation_opportunity_lines:,}+ lines",
722
- "target_efficiency": f"{self.consolidation_matrix.target_lines_modular:,} lines modular",
723
- "annual_savings": f"${self.consolidation_matrix.annual_savings:,}+ through 75% maintenance reduction",
724
- "business_impact": self.consolidation_matrix.business_impact
725
- },
726
- "stakeholder_breakdown": {
727
- stakeholder: {
728
- "pattern_count": len(patterns),
729
- "high_priority_count": len([p for p in patterns if p.consolidation_priority <= 2]),
730
- "example_modules": [p.target_module for p in patterns[:3]]
731
- }
732
- for stakeholder, patterns in stakeholder_priorities.items()
733
- },
734
- "implementation_roadmap": self.consolidation_matrix.consolidation_phases,
735
- "success_criteria": self.consolidation_matrix.success_metrics,
736
- "generated_timestamp": datetime.now().isoformat()
737
- }
738
-
739
- return dashboard_data
740
-
741
-
742
- class EnhancedBusinessCaseDashboard:
743
- """
744
- Enhanced executive dashboard combining real FinOps cases with CloudOps consolidation.
745
-
746
- Integration Focus: Merge Universal $132K methodology with CloudOps consolidation
747
- for comprehensive enterprise business case presentation.
748
- """
749
-
750
- def __init__(self, profile: Optional[str] = None):
751
- """Initialize enhanced dashboard with both analyzers."""
752
- self.finops_analyzer = BusinessCaseAnalyzer(profile=profile)
753
- self.cloudops_extractor = CloudOpsNotebookExtractor()
754
-
755
- def generate_comprehensive_executive_summary(self) -> str:
756
- """
757
- Generate comprehensive executive summary combining both frameworks.
758
-
759
- Strategic Output: Complete business case portfolio for C-suite presentation
760
- """
761
- print_header("Enterprise Business Case Portfolio Analysis", "latest version")
762
-
763
- # Get FinOps business cases (Universal $132K methodology)
764
- finops_cases = self.finops_analyzer.get_all_business_cases()
765
- finops_portfolio = self.finops_analyzer.calculate_portfolio_roi(finops_cases)
766
-
767
- # Get CloudOps consolidation analysis
768
- cloudops_matrix = self.cloudops_extractor.generate_consolidation_analysis()
769
- cloudops_dashboard = self.cloudops_extractor.generate_executive_dashboard_data()
770
-
771
- # Create comprehensive summary table
772
- summary_table = create_table(
773
- title="Enterprise Business Case Portfolio Summary",
774
- caption="Combined FinOps + CloudOps Consolidation: Total Enterprise Value Creation"
775
- )
776
-
777
- summary_table.add_column("Initiative", style="cyan", no_wrap=True)
778
- summary_table.add_column("Scope", justify="center")
779
- summary_table.add_column("Annual Value", style="green", justify="right")
780
- summary_table.add_column("Implementation", style="blue", justify="center")
781
- summary_table.add_column("Status", style="yellow", justify="center")
782
-
783
- # Add FinOps row
784
- finops_value = f"${finops_portfolio['total_annual_savings']:,.0f}"
785
- if finops_portfolio['total_annual_savings'] == 0:
786
- finops_value = "Under Analysis"
787
-
788
- summary_table.add_row(
789
- "FinOps Cost Optimization",
790
- "3 Priority Scenarios",
791
- finops_value,
792
- "4-16 hours per scenario",
793
- "Analysis Complete"
794
- )
795
-
796
- # Add CloudOps row
797
- summary_table.add_row(
798
- "CloudOps Consolidation",
799
- "67 Legacy Notebooks",
800
- f"${cloudops_matrix.annual_savings:,}+ savings",
801
- "12-18 weeks systematic",
802
- "Phase 3 Implementation"
803
- )
804
-
805
- # Add combined portfolio row
806
- combined_savings = finops_portfolio['total_annual_savings'] + cloudops_matrix.annual_savings
807
- summary_table.add_row(
808
- "šŸ† Combined Portfolio",
809
- "Enterprise-wide",
810
- f"${combined_savings:,.0f}+ total",
811
- "Parallel execution",
812
- "āœ… Ready for Approval"
813
- )
814
-
815
- console.print(summary_table)
816
-
817
- print_success(f"Portfolio Analysis Complete: ${combined_savings:,.0f}+ annual value potential")
818
- print_success(f"CloudOps Impact: {cloudops_matrix.business_impact}")
819
-
820
- # Generate combined export data
821
- portfolio_data = {
822
- "finops_methodology": {
823
- "cases": len(finops_cases),
824
- "annual_savings": finops_portfolio['total_annual_savings'],
825
- "roi_percentage": finops_portfolio['portfolio_roi_percentage'],
826
- "methodology": "Universal $132K Cost Optimization (380-757% ROI achievement)"
827
- },
828
- "cloudops_consolidation": {
829
- "notebooks": cloudops_matrix.total_notebooks,
830
- "annual_savings": cloudops_matrix.annual_savings,
831
- "consolidation_efficiency": "75% maintenance cost reduction",
832
- "business_impact": cloudops_matrix.business_impact
833
- },
834
- "combined_portfolio": {
835
- "total_annual_value": combined_savings,
836
- "implementation_approach": "Parallel FinOps scenarios + CloudOps consolidation",
837
- "enterprise_readiness": "Executive approval ready",
838
- "strategic_alignment": "3 major objectives advancement"
839
- },
840
- "executive_dashboard_data": cloudops_dashboard,
841
- "analysis_timestamp": datetime.now().isoformat()
842
- }
843
-
844
- return json.dumps(portfolio_data, indent=2)
845
-
846
- def export_comprehensive_analysis(self, output_path: str) -> None:
847
- """Export comprehensive business case portfolio for stakeholder integration."""
848
- comprehensive_data = self.generate_comprehensive_executive_summary()
849
-
850
- with open(output_path, 'w', encoding='utf-8') as f:
851
- f.write(comprehensive_data)
852
-
853
- print_success(f"Comprehensive business case portfolio exported: {output_path}")
854
-
855
-
856
- def main():
857
- """Enhanced main execution with comprehensive business case portfolio."""
858
- enhanced_dashboard = EnhancedBusinessCaseDashboard()
859
- portfolio_analysis = enhanced_dashboard.generate_comprehensive_executive_summary()
860
-
861
- # Export for enterprise stakeholder integration
862
- export_path = "./tmp/comprehensive_business_case_portfolio.json"
863
- enhanced_dashboard.export_comprehensive_analysis(export_path)
864
-
865
- return portfolio_analysis
866
-
867
-
868
- if __name__ == "__main__":
869
- main()
870
-
871
-
872
- class BusinessCaseFormatter:
873
- """Format business cases for different audiences"""
874
-
875
- @staticmethod
876
- def format_for_business_audience(business_cases: Dict[str, BusinessCase]) -> str:
877
- """
878
- Format business cases for manager/financial audience.
879
-
880
- Args:
881
- business_cases: Dictionary of business case analyses
882
-
883
- Returns:
884
- Business-friendly formatted summary
885
- """
886
- output = []
887
- output.append("Executive Summary - Cost Optimization Business Cases")
888
- output.append("=" * 60)
889
-
890
- for case in business_cases.values():
891
- output.append(f"\nšŸ“‹ {case.title}")
892
- output.append(f" Status: {case.status.value}")
893
-
894
- if case.roi_metrics.annual_savings > 0:
895
- output.append(f" šŸ’° Annual Savings: {format_cost(case.roi_metrics.annual_savings)}")
896
- output.append(f" šŸ“ˆ ROI: {case.roi_metrics.roi_percentage:.0f}%")
897
- output.append(f" ā±ļø Payback: {case.roi_metrics.payback_months:.1f} months")
898
- else:
899
- output.append(f" šŸ’° Annual Savings: Under investigation")
900
-
901
- output.append(f" šŸ›”ļø Risk Level: {case.risk_level.value}")
902
- output.append(f" ā° Implementation Time: {case.implementation_time}")
903
-
904
- if case.resource_count > 0:
905
- output.append(f" šŸ“Š Resources: {case.resource_count} items")
906
-
907
- return "\n".join(output)
908
-
909
- @staticmethod
910
- def format_for_technical_audience(business_cases: Dict[str, BusinessCase]) -> str:
911
- """
912
- Format business cases for technical audience.
913
-
914
- Args:
915
- business_cases: Dictionary of business case analyses
916
-
917
- Returns:
918
- Technical implementation details
919
- """
920
- output = []
921
- output.append("Technical Implementation Guide - FinOps Business Cases")
922
- output.append("=" * 60)
923
-
924
- for key, case in business_cases.items():
925
- output.append(f"\nšŸ”§ {case.title}")
926
- output.append(f" Scenario Key: {case.scenario_key}")
927
- output.append(f" Data Source: {case.data_source}")
928
- output.append(f" Validation: {case.validation_status}")
929
-
930
- if case.affected_accounts:
931
- output.append(f" Affected Accounts: {', '.join(case.affected_accounts)}")
932
-
933
- output.append(f" Resource Count: {case.resource_count}")
934
-
935
- # CLI commands for implementation
936
- output.append(f"\n CLI Implementation:")
937
- output.append(f" runbooks finops --scenario {key} --validate")
938
-
939
- if key == 'workspaces':
940
- output.append(f" runbooks finops --scenario workspaces --delete --dry-run")
941
- elif key == 'rds_snapshots':
942
- output.append(f" runbooks finops --scenario snapshots --cleanup --dry-run")
943
- elif key == 'commvault':
944
- output.append(f" runbooks finops --scenario commvault --investigate")
945
-
946
- output.append(f"\n Next Steps:")
947
- for step in case.next_steps:
948
- output.append(f" • {step}")
949
-
950
- return "\n".join(output)