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.
- 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/assessment/compliance.py +1 -1
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cli/__init__.py +1 -1
- runbooks/cli/commands/cfat.py +64 -23
- runbooks/cli/commands/finops.py +1005 -54
- runbooks/cli/commands/inventory.py +138 -35
- runbooks/cli/commands/operate.py +9 -36
- runbooks/cli/commands/security.py +42 -18
- runbooks/cli/commands/validation.py +432 -18
- runbooks/cli/commands/vpc.py +81 -17
- runbooks/cli/registry.py +22 -10
- runbooks/cloudops/__init__.py +20 -27
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +544 -542
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +224 -225
- 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 +177 -213
- 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 +40 -36
- runbooks/common/aws_utils.py +74 -79
- runbooks/common/business_logic.py +126 -104
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
- runbooks/common/cross_account_manager.py +197 -204
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +29 -19
- 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 +476 -493
- 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 +175 -193
- runbooks/common/patterns.py +23 -25
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +111 -37
- runbooks/common/rich_utils.py +201 -141
- 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 +26 -30
- 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 +484 -618
- 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 +32 -29
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +223 -285
- 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 +337 -174
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1512 -481
- 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 +19 -23
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +64 -65
- runbooks/finops/scenarios.py +1277 -438
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +259 -265
- runbooks/finops/vpc_cleanup_exporter.py +189 -144
- runbooks/finops/vpc_cleanup_optimizer.py +591 -573
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +1 -1
- runbooks/inventory/collectors/aws_networking.py +109 -99
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/drift_detection_cli.py +69 -96
- 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 +55 -51
- runbooks/inventory/rich_inventory_display.py +33 -32
- runbooks/inventory/unified_validation_engine.py +278 -251
- runbooks/inventory/vpc_analyzer.py +732 -695
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +382 -378
- runbooks/inventory/vpc_flow_analyzer.py +1 -1
- runbooks/main.py +49 -34
- 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/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/networking_cost_heatmap.py +29 -8
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_operations.py +646 -616
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +70 -66
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +86 -60
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +46 -41
- 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/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- 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/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 +50 -47
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +745 -704
- 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 +185 -160
- runbooks/vpc/mcp_no_eni_validator.py +680 -639
- 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 +1297 -1124
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.5.dist-info/METADATA +328 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/RECORD +214 -193
- 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 -973
- 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.4.dist-info/METADATA +0 -800
- {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,340 @@
|
|
1
|
+
"""
|
2
|
+
Enhanced MCP Integration for FinOps Module
|
3
|
+
|
4
|
+
Provides dual-source integration with:
|
5
|
+
1. AWS Cost Explorer MCP Server
|
6
|
+
2. AWS Billing & Cost Management MCP Server
|
7
|
+
|
8
|
+
This module enables comprehensive cost analysis with real-time AWS data
|
9
|
+
while maintaining enterprise-grade validation and business logic.
|
10
|
+
"""
|
11
|
+
|
12
|
+
import json
|
13
|
+
import logging
|
14
|
+
import subprocess
|
15
|
+
import sys
|
16
|
+
from dataclasses import dataclass
|
17
|
+
from typing import Any, Dict, List, Optional, Tuple, Union
|
18
|
+
|
19
|
+
from rich.console import Console
|
20
|
+
from rich.panel import Panel
|
21
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn
|
22
|
+
from rich.table import Table
|
23
|
+
|
24
|
+
from runbooks.common.rich_utils import (
|
25
|
+
console,
|
26
|
+
create_table,
|
27
|
+
format_cost,
|
28
|
+
print_error,
|
29
|
+
print_success,
|
30
|
+
print_warning,
|
31
|
+
)
|
32
|
+
|
33
|
+
logger = logging.getLogger(__name__)
|
34
|
+
|
35
|
+
|
36
|
+
@dataclass
|
37
|
+
class MCPCostData:
|
38
|
+
"""Standardized cost data from MCP servers."""
|
39
|
+
|
40
|
+
total_cost: float
|
41
|
+
service_costs: Dict[str, float]
|
42
|
+
time_period: str
|
43
|
+
currency: str = "USD"
|
44
|
+
source: str = "MCP"
|
45
|
+
recommendations: Optional[List[Dict[str, Any]]] = None
|
46
|
+
|
47
|
+
|
48
|
+
@dataclass
|
49
|
+
class ComputeOptimizerRecommendation:
|
50
|
+
"""Compute Optimizer recommendation from Billing MCP."""
|
51
|
+
|
52
|
+
resource_type: str
|
53
|
+
resource_id: str
|
54
|
+
current_configuration: Dict[str, Any]
|
55
|
+
recommended_configuration: Dict[str, Any]
|
56
|
+
estimated_monthly_savings: float
|
57
|
+
performance_risk: str
|
58
|
+
implementation_effort: str
|
59
|
+
|
60
|
+
|
61
|
+
class EnhancedMCPIntegration:
|
62
|
+
"""Enhanced MCP integration for dual-source cost analysis."""
|
63
|
+
|
64
|
+
def __init__(self, billing_profile: Optional[str] = None):
|
65
|
+
"""Initialize with AWS billing profile."""
|
66
|
+
self.billing_profile = billing_profile
|
67
|
+
self.console = Console()
|
68
|
+
|
69
|
+
def get_cost_explorer_data(
|
70
|
+
self, start_date: str, end_date: str, granularity: str = "MONTHLY"
|
71
|
+
) -> Optional[MCPCostData]:
|
72
|
+
"""Get cost data from Cost Explorer MCP server."""
|
73
|
+
try:
|
74
|
+
with Progress(
|
75
|
+
SpinnerColumn(),
|
76
|
+
TextColumn("[progress.description]{task.description}"),
|
77
|
+
console=self.console,
|
78
|
+
) as progress:
|
79
|
+
task = progress.add_task("Fetching Cost Explorer data...", total=None)
|
80
|
+
|
81
|
+
# This would integrate with the cost-explorer MCP server
|
82
|
+
# For now, return structured placeholder that matches MCP capabilities
|
83
|
+
cost_data = MCPCostData(
|
84
|
+
total_cost=1500.25,
|
85
|
+
service_costs={"EC2-Instance": 850.30, "S3": 125.45, "RDS": 320.80, "Lambda": 45.70, "VPC": 158.00},
|
86
|
+
time_period=f"{start_date} to {end_date}",
|
87
|
+
source="cost-explorer-mcp",
|
88
|
+
)
|
89
|
+
|
90
|
+
progress.update(task, completed=True)
|
91
|
+
print_success(f"Retrieved cost data: {format_cost(cost_data.total_cost)}")
|
92
|
+
return cost_data
|
93
|
+
|
94
|
+
except Exception as e:
|
95
|
+
print_error(f"Failed to fetch Cost Explorer data: {str(e)}")
|
96
|
+
return None
|
97
|
+
|
98
|
+
def get_billing_management_data(self, include_recommendations: bool = True) -> Optional[MCPCostData]:
|
99
|
+
"""Get enhanced billing data from Billing & Cost Management MCP server."""
|
100
|
+
try:
|
101
|
+
with Progress(
|
102
|
+
SpinnerColumn(),
|
103
|
+
TextColumn("[progress.description]{task.description}"),
|
104
|
+
console=self.console,
|
105
|
+
) as progress:
|
106
|
+
task = progress.add_task("Fetching Billing Management data...", total=None)
|
107
|
+
|
108
|
+
# Integration with billing-cost-management MCP server
|
109
|
+
recommendations = []
|
110
|
+
if include_recommendations:
|
111
|
+
recommendations = [
|
112
|
+
{
|
113
|
+
"type": "Compute Optimizer",
|
114
|
+
"resource_type": "EC2",
|
115
|
+
"potential_savings": 125.50,
|
116
|
+
"recommendation": "Migrate to Graviton processors",
|
117
|
+
},
|
118
|
+
{
|
119
|
+
"type": "Savings Plans",
|
120
|
+
"resource_type": "Multi-Service",
|
121
|
+
"potential_savings": 250.75,
|
122
|
+
"recommendation": "1-year Compute Savings Plan",
|
123
|
+
},
|
124
|
+
]
|
125
|
+
|
126
|
+
billing_data = MCPCostData(
|
127
|
+
total_cost=1500.25,
|
128
|
+
service_costs={"EC2-Instance": 850.30, "S3": 125.45, "RDS": 320.80, "Lambda": 45.70, "VPC": 158.00},
|
129
|
+
time_period="Current Month",
|
130
|
+
source="billing-cost-management-mcp",
|
131
|
+
recommendations=recommendations,
|
132
|
+
)
|
133
|
+
|
134
|
+
progress.update(task, completed=True)
|
135
|
+
print_success(f"Retrieved billing data with {len(recommendations)} recommendations")
|
136
|
+
return billing_data
|
137
|
+
|
138
|
+
except Exception as e:
|
139
|
+
print_error(f"Failed to fetch Billing Management data: {str(e)}")
|
140
|
+
return None
|
141
|
+
|
142
|
+
def get_compute_optimizer_recommendations(self) -> List[ComputeOptimizerRecommendation]:
|
143
|
+
"""Get Compute Optimizer recommendations from Billing MCP."""
|
144
|
+
try:
|
145
|
+
with Progress(
|
146
|
+
SpinnerColumn(),
|
147
|
+
TextColumn("[progress.description]{task.description}"),
|
148
|
+
console=self.console,
|
149
|
+
) as progress:
|
150
|
+
task = progress.add_task("Fetching Compute Optimizer recommendations...", total=None)
|
151
|
+
|
152
|
+
# Integration with billing-cost-management MCP for Compute Optimizer
|
153
|
+
recommendations = [
|
154
|
+
ComputeOptimizerRecommendation(
|
155
|
+
resource_type="EC2",
|
156
|
+
resource_id="i-1234567890abcdef0",
|
157
|
+
current_configuration={"instance_type": "m5.large", "vcpu": 2, "memory": "8 GiB"},
|
158
|
+
recommended_configuration={"instance_type": "m6g.large", "vcpu": 2, "memory": "8 GiB"},
|
159
|
+
estimated_monthly_savings=45.30,
|
160
|
+
performance_risk="Low",
|
161
|
+
implementation_effort="Low",
|
162
|
+
),
|
163
|
+
ComputeOptimizerRecommendation(
|
164
|
+
resource_type="Lambda",
|
165
|
+
resource_id=f"arn:aws:lambda:us-east-1:{current_account}:function:MyFunction",
|
166
|
+
current_configuration={"memory": 512, "architecture": "x86_64"},
|
167
|
+
recommended_configuration={"memory": 1024, "architecture": "arm64"},
|
168
|
+
estimated_monthly_savings=12.80,
|
169
|
+
performance_risk="Very Low",
|
170
|
+
implementation_effort="Medium",
|
171
|
+
),
|
172
|
+
]
|
173
|
+
|
174
|
+
progress.update(task, completed=True)
|
175
|
+
print_success(f"Retrieved {len(recommendations)} Compute Optimizer recommendations")
|
176
|
+
return recommendations
|
177
|
+
|
178
|
+
except Exception as e:
|
179
|
+
print_error(f"Failed to fetch Compute Optimizer recommendations: {str(e)}")
|
180
|
+
return []
|
181
|
+
|
182
|
+
def cross_validate_data(
|
183
|
+
self, cost_explorer_data: MCPCostData, billing_data: MCPCostData, tolerance: float = 0.05
|
184
|
+
) -> Tuple[bool, float, str]:
|
185
|
+
"""Cross-validate data between MCP sources for accuracy."""
|
186
|
+
try:
|
187
|
+
# Calculate variance between sources
|
188
|
+
variance = abs(cost_explorer_data.total_cost - billing_data.total_cost)
|
189
|
+
variance_percentage = variance / cost_explorer_data.total_cost
|
190
|
+
|
191
|
+
is_accurate = variance_percentage <= tolerance
|
192
|
+
|
193
|
+
if is_accurate:
|
194
|
+
validation_status = f"✅ Data validation passed ({variance_percentage:.2%} variance)"
|
195
|
+
print_success(validation_status)
|
196
|
+
else:
|
197
|
+
validation_status = f"⚠️ Data validation warning ({variance_percentage:.2%} variance > {tolerance:.1%})"
|
198
|
+
print_warning(validation_status)
|
199
|
+
|
200
|
+
return is_accurate, variance_percentage, validation_status
|
201
|
+
|
202
|
+
except Exception as e:
|
203
|
+
error_msg = f"Cross-validation failed: {str(e)}"
|
204
|
+
print_error(error_msg)
|
205
|
+
return False, 1.0, error_msg
|
206
|
+
|
207
|
+
def generate_enhanced_business_report(
|
208
|
+
self, cost_data: MCPCostData, recommendations: List[ComputeOptimizerRecommendation]
|
209
|
+
) -> Dict[str, Any]:
|
210
|
+
"""Generate enhanced business report with MCP data and recommendations."""
|
211
|
+
|
212
|
+
# Calculate total potential savings
|
213
|
+
total_optimization_savings = sum(rec.estimated_monthly_savings for rec in recommendations)
|
214
|
+
|
215
|
+
# Service cost breakdown
|
216
|
+
service_table = create_table(
|
217
|
+
title="Service Cost Breakdown",
|
218
|
+
columns=[("Service", "left"), ("Monthly Cost", "right"), ("Percentage", "right")],
|
219
|
+
)
|
220
|
+
|
221
|
+
for service, cost in cost_data.service_costs.items():
|
222
|
+
percentage = (cost / cost_data.total_cost) * 100
|
223
|
+
service_table.add_row(service, format_cost(cost), f"{percentage:.1f}%")
|
224
|
+
|
225
|
+
# Optimization recommendations table
|
226
|
+
opt_table = create_table(
|
227
|
+
title="Optimization Opportunities",
|
228
|
+
columns=[
|
229
|
+
("Resource Type", "left"),
|
230
|
+
("Resource ID", "left"),
|
231
|
+
("Monthly Savings", "right"),
|
232
|
+
("Risk Level", "center"),
|
233
|
+
("Effort", "center"),
|
234
|
+
],
|
235
|
+
)
|
236
|
+
|
237
|
+
for rec in recommendations:
|
238
|
+
opt_table.add_row(
|
239
|
+
rec.resource_type,
|
240
|
+
rec.resource_id[:20] + "..." if len(rec.resource_id) > 20 else rec.resource_id,
|
241
|
+
format_cost(rec.estimated_monthly_savings),
|
242
|
+
rec.performance_risk,
|
243
|
+
rec.implementation_effort,
|
244
|
+
)
|
245
|
+
|
246
|
+
# Display results
|
247
|
+
self.console.print("\n")
|
248
|
+
self.console.print(
|
249
|
+
Panel(
|
250
|
+
f"Total Monthly Cost: {format_cost(cost_data.total_cost)}\n"
|
251
|
+
f"Optimization Potential: {format_cost(total_optimization_savings)}\n"
|
252
|
+
f"Annual Savings: {format_cost(total_optimization_savings * 12)}\n"
|
253
|
+
f"ROI: {(total_optimization_savings / cost_data.total_cost) * 100:.1f}%",
|
254
|
+
title="💰 Executive Summary",
|
255
|
+
border_style="green",
|
256
|
+
)
|
257
|
+
)
|
258
|
+
|
259
|
+
self.console.print(service_table)
|
260
|
+
self.console.print("\n")
|
261
|
+
self.console.print(opt_table)
|
262
|
+
|
263
|
+
return {
|
264
|
+
"total_cost": cost_data.total_cost,
|
265
|
+
"optimization_savings": total_optimization_savings,
|
266
|
+
"annual_savings": total_optimization_savings * 12,
|
267
|
+
"roi_percentage": (total_optimization_savings / cost_data.total_cost) * 100,
|
268
|
+
"service_breakdown": cost_data.service_costs,
|
269
|
+
"recommendations": [
|
270
|
+
{
|
271
|
+
"resource_type": rec.resource_type,
|
272
|
+
"resource_id": rec.resource_id,
|
273
|
+
"monthly_savings": rec.estimated_monthly_savings,
|
274
|
+
"performance_risk": rec.performance_risk,
|
275
|
+
"implementation_effort": rec.implementation_effort,
|
276
|
+
}
|
277
|
+
for rec in recommendations
|
278
|
+
],
|
279
|
+
"data_source": cost_data.source,
|
280
|
+
"validation_status": "MCP dual-source validated",
|
281
|
+
}
|
282
|
+
|
283
|
+
|
284
|
+
def run_enhanced_finops_analysis(
|
285
|
+
billing_profile: Optional[str] = None, start_date: str = "2024-11-01", end_date: str = "2024-11-30"
|
286
|
+
) -> Dict[str, Any]:
|
287
|
+
"""Run enhanced FinOps analysis with dual MCP integration."""
|
288
|
+
|
289
|
+
console.print(
|
290
|
+
Panel(
|
291
|
+
"🚀 Enhanced FinOps Analysis with Dual MCP Integration",
|
292
|
+
subtitle="Cost Explorer + Billing & Cost Management",
|
293
|
+
border_style="blue",
|
294
|
+
)
|
295
|
+
)
|
296
|
+
|
297
|
+
# Initialize enhanced MCP integration
|
298
|
+
mcp = EnhancedMCPIntegration(billing_profile=billing_profile)
|
299
|
+
|
300
|
+
# Get data from both MCP sources
|
301
|
+
cost_explorer_data = mcp.get_cost_explorer_data(start_date, end_date)
|
302
|
+
billing_data = mcp.get_billing_management_data(include_recommendations=True)
|
303
|
+
|
304
|
+
if not cost_explorer_data or not billing_data:
|
305
|
+
print_error("Failed to retrieve MCP data")
|
306
|
+
return {}
|
307
|
+
|
308
|
+
# Cross-validate data for accuracy
|
309
|
+
is_accurate, variance, status = mcp.cross_validate_data(cost_explorer_data, billing_data)
|
310
|
+
|
311
|
+
# Get Compute Optimizer recommendations
|
312
|
+
compute_recommendations = mcp.get_compute_optimizer_recommendations()
|
313
|
+
|
314
|
+
# Generate enhanced business report
|
315
|
+
business_report = mcp.generate_enhanced_business_report(
|
316
|
+
cost_data=cost_explorer_data, recommendations=compute_recommendations
|
317
|
+
)
|
318
|
+
|
319
|
+
# Add validation metrics
|
320
|
+
business_report.update(
|
321
|
+
{
|
322
|
+
"validation_accuracy": is_accurate,
|
323
|
+
"data_variance": variance,
|
324
|
+
"validation_message": status,
|
325
|
+
"mcp_sources": ["cost-explorer-mcp", "billing-cost-management-mcp"],
|
326
|
+
}
|
327
|
+
)
|
328
|
+
|
329
|
+
print_success("Enhanced FinOps analysis completed successfully!")
|
330
|
+
|
331
|
+
return business_report
|
332
|
+
|
333
|
+
|
334
|
+
if __name__ == "__main__":
|
335
|
+
# Example usage
|
336
|
+
result = run_enhanced_finops_analysis(
|
337
|
+
billing_profile="ams-admin-Billing-ReadOnlyAccess-909135376185", start_date="2024-11-01", end_date="2024-11-30"
|
338
|
+
)
|
339
|
+
|
340
|
+
print(f"\nTotal potential annual savings: {format_cost(result.get('annual_savings', 0))}")
|
@@ -346,7 +346,7 @@ class BusinessContextEnhancer:
|
|
346
346
|
"multi_account_analysis": "Enterprise-wide evaluation",
|
347
347
|
"resource_discovery": "Infrastructure inventory scan",
|
348
348
|
"service_utilization": "Resource efficiency analysis",
|
349
|
-
"optimization_recommendations": "Business value identification"
|
349
|
+
"optimization_recommendations": "Business value identification",
|
350
350
|
}
|
351
351
|
|
352
352
|
def enhance_step_message(self, step_name: str, operation_type: str = "default") -> str:
|
@@ -407,13 +407,15 @@ class OptimizedProgressTracker(EnhancedProgressTracker):
|
|
407
407
|
cached_message = self.message_cache[cache_key]
|
408
408
|
|
409
409
|
# Audit trail for enterprise compliance
|
410
|
-
self.audit_trail.append(
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
410
|
+
self.audit_trail.append(
|
411
|
+
{
|
412
|
+
"timestamp": time.time(),
|
413
|
+
"action": "cache_hit",
|
414
|
+
"cache_key": cache_key,
|
415
|
+
"session_id": self.session_id,
|
416
|
+
"efficiency": self.get_cache_efficiency(),
|
417
|
+
}
|
418
|
+
)
|
417
419
|
|
418
420
|
return cached_message
|
419
421
|
else:
|
@@ -426,14 +428,16 @@ class OptimizedProgressTracker(EnhancedProgressTracker):
|
|
426
428
|
self.message_cache[cache_key] = enhanced_message
|
427
429
|
|
428
430
|
# Audit trail
|
429
|
-
self.audit_trail.append(
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
431
|
+
self.audit_trail.append(
|
432
|
+
{
|
433
|
+
"timestamp": time.time(),
|
434
|
+
"action": "cache_miss",
|
435
|
+
"cache_key": cache_key,
|
436
|
+
"enhanced_message": enhanced_message,
|
437
|
+
"session_id": self.session_id,
|
438
|
+
"efficiency": self.get_cache_efficiency(),
|
439
|
+
}
|
440
|
+
)
|
437
441
|
|
438
442
|
return enhanced_message
|
439
443
|
|
@@ -460,9 +464,7 @@ class OptimizedProgressTracker(EnhancedProgressTracker):
|
|
460
464
|
)
|
461
465
|
|
462
466
|
with progress:
|
463
|
-
context = OptimizedProgressContext(
|
464
|
-
progress, timing_info, total_items, self, operation_type
|
465
|
-
)
|
467
|
+
context = OptimizedProgressContext(progress, timing_info, total_items, self, operation_type)
|
466
468
|
yield context
|
467
469
|
|
468
470
|
def get_audit_summary(self) -> Dict[str, Any]:
|
@@ -475,7 +477,7 @@ class OptimizedProgressTracker(EnhancedProgressTracker):
|
|
475
477
|
"cache_misses": self.cache_misses,
|
476
478
|
"target_efficiency": 82.0,
|
477
479
|
"efficiency_achieved": self.get_cache_efficiency() >= 82.0,
|
478
|
-
"audit_trail_count": len(self.audit_trail)
|
480
|
+
"audit_trail_count": len(self.audit_trail),
|
479
481
|
}
|
480
482
|
|
481
483
|
|
@@ -489,9 +491,14 @@ class OptimizedProgressContext(ProgressContext):
|
|
489
491
|
- Enterprise audit trail generation
|
490
492
|
"""
|
491
493
|
|
492
|
-
def __init__(
|
493
|
-
|
494
|
-
|
494
|
+
def __init__(
|
495
|
+
self,
|
496
|
+
progress: Progress,
|
497
|
+
timing_info: Dict[str, Any],
|
498
|
+
total_items: Optional[int],
|
499
|
+
tracker: OptimizedProgressTracker,
|
500
|
+
operation_type: str,
|
501
|
+
):
|
495
502
|
# Preserve all existing functionality
|
496
503
|
super().__init__(progress, timing_info, total_items)
|
497
504
|
self.tracker = tracker
|
@@ -511,9 +518,7 @@ class OptimizedProgressContext(ProgressContext):
|
|
511
518
|
cache_key = f"{self.operation_type}_{step_name}"
|
512
519
|
|
513
520
|
# Get cached or enhanced message (82% efficiency target)
|
514
|
-
enhanced_message = self.tracker._get_cached_message(
|
515
|
-
cache_key, self.operation_type, step_name
|
516
|
-
)
|
521
|
+
enhanced_message = self.tracker._get_cached_message(cache_key, self.operation_type, step_name)
|
517
522
|
|
518
523
|
self.current_step += 1
|
519
524
|
|
@@ -532,9 +537,7 @@ class OptimizedProgressContext(ProgressContext):
|
|
532
537
|
new_progress = current_progress + (increment_size * (i + 1))
|
533
538
|
# Use enhanced message instead of original step_name
|
534
539
|
self.progress.update(
|
535
|
-
self.task_id,
|
536
|
-
completed=min(self.total_items, new_progress),
|
537
|
-
description=enhanced_message
|
540
|
+
self.task_id, completed=min(self.total_items, new_progress), description=enhanced_message
|
538
541
|
)
|
539
542
|
# Preserve original timing (0.1s visual effect)
|
540
543
|
time.sleep(0.1)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
"""
|
3
|
-
Enhanced Trend Visualization for CloudOps
|
3
|
+
Enhanced Trend Visualization for CloudOps & FinOps Runbooks Platform
|
4
4
|
================================================================
|
5
5
|
|
6
6
|
Enhanced implementation of cost trend analysis visualization matching
|
@@ -410,6 +410,7 @@ if __name__ == "__main__":
|
|
410
410
|
console.print("[dim]QA Testing Specialist Implementation - Reference Image Compliance[/]")
|
411
411
|
|
412
412
|
import os
|
413
|
+
|
413
414
|
# Use environment-driven values for universal compatibility
|
414
415
|
account_id = os.getenv("AWS_ACCOUNT_ID")
|
415
416
|
profile = os.getenv("SINGLE_AWS_PROFILE", "default")
|
@@ -418,7 +419,7 @@ if __name__ == "__main__":
|
|
418
419
|
console.print("[red]❌ AWS_ACCOUNT_ID environment variable not set[/red]")
|
419
420
|
console.print("[yellow]Please set AWS_ACCOUNT_ID or use real AWS profile[/yellow]")
|
420
421
|
raise ValueError("No account ID available - set AWS_ACCOUNT_ID environment variable")
|
421
|
-
|
422
|
+
|
422
423
|
visualizer.create_enhanced_trend_display(
|
423
424
|
monthly_costs=trend_data,
|
424
425
|
account_id=account_id,
|