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
@@ -0,0 +1,480 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
CLI Commands for Enhanced MCP Validation - AWS-25 VPC Cleanup
|
4
|
+
|
5
|
+
This module provides CLI command integration for the enhanced MCP validation
|
6
|
+
framework, enabling enterprise-grade accuracy validation for VPC cleanup operations.
|
7
|
+
|
8
|
+
Features:
|
9
|
+
- AWS-25 VPC cleanup validation commands
|
10
|
+
- Cost projection validation via Cost Explorer MCP
|
11
|
+
- CloudTrail audit trail validation
|
12
|
+
- Enterprise security compliance validation
|
13
|
+
- Real-time accuracy reporting ≥99.5%
|
14
|
+
|
15
|
+
Author: devops-security-engineer [5] + python-runbooks-engineer [1]
|
16
|
+
Integration: VPC module CLI commands
|
17
|
+
Strategic Coordination: enterprise-product-owner [0]
|
18
|
+
"""
|
19
|
+
|
20
|
+
import asyncio
|
21
|
+
import json
|
22
|
+
from pathlib import Path
|
23
|
+
from typing import Dict, List, Optional, Any
|
24
|
+
import click
|
25
|
+
|
26
|
+
from runbooks.common.rich_utils import (
|
27
|
+
console,
|
28
|
+
print_header,
|
29
|
+
print_success,
|
30
|
+
print_warning,
|
31
|
+
print_error,
|
32
|
+
print_info,
|
33
|
+
create_table,
|
34
|
+
format_cost,
|
35
|
+
)
|
36
|
+
from runbooks.vpc.enhanced_mcp_validation import (
|
37
|
+
EnhancedMCPValidator,
|
38
|
+
SecurityValidationResults,
|
39
|
+
validate_aws25_vpc_cleanup,
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
@click.group()
|
44
|
+
def mcp_validation():
|
45
|
+
"""Enhanced MCP validation commands for VPC cleanup operations."""
|
46
|
+
pass
|
47
|
+
|
48
|
+
|
49
|
+
@mcp_validation.command()
|
50
|
+
@click.option("--vpc-data-file", type=click.Path(exists=True), help="JSON file containing VPC cleanup analysis data")
|
51
|
+
@click.option(
|
52
|
+
"--cost-projections-file", type=click.Path(exists=True), help="JSON file containing cost savings projections"
|
53
|
+
)
|
54
|
+
@click.option(
|
55
|
+
"--target-savings", type=float, default=7548.0, help="Target savings amount for validation (default: $7,548)"
|
56
|
+
)
|
57
|
+
@click.option("--profile", help="AWS profile to use for validation")
|
58
|
+
@click.option("--accuracy-threshold", type=float, default=99.5, help="Minimum accuracy threshold (default: 99.5%)")
|
59
|
+
@click.option("--export-evidence", is_flag=True, help="Export comprehensive evidence package")
|
60
|
+
@click.option("--validate-cloudtrail", is_flag=True, help="Include CloudTrail audit validation")
|
61
|
+
def validate_aws25(
|
62
|
+
vpc_data_file: Optional[str],
|
63
|
+
cost_projections_file: Optional[str],
|
64
|
+
target_savings: float,
|
65
|
+
profile: Optional[str],
|
66
|
+
accuracy_threshold: float,
|
67
|
+
export_evidence: bool,
|
68
|
+
validate_cloudtrail: bool,
|
69
|
+
):
|
70
|
+
"""
|
71
|
+
Validate AWS-25 VPC cleanup operations with ≥99.5% MCP accuracy.
|
72
|
+
|
73
|
+
Example usage:
|
74
|
+
runbooks vpc validate-aws25 --vpc-data-file vpc_analysis.json --target-savings 7548
|
75
|
+
runbooks vpc validate-aws25 --validate-cloudtrail --export-evidence
|
76
|
+
"""
|
77
|
+
|
78
|
+
async def run_validation():
|
79
|
+
print_header("🔒 AWS-25 VPC Cleanup MCP Validation", f"Target Accuracy: ≥{accuracy_threshold}%")
|
80
|
+
|
81
|
+
# Load VPC cleanup data
|
82
|
+
vpc_cleanup_data = {}
|
83
|
+
if vpc_data_file:
|
84
|
+
try:
|
85
|
+
with open(vpc_data_file, "r") as f:
|
86
|
+
vpc_cleanup_data = json.load(f)
|
87
|
+
print_success(f"✅ Loaded VPC data from {vpc_data_file}")
|
88
|
+
except Exception as e:
|
89
|
+
print_error(f"Failed to load VPC data: {e}")
|
90
|
+
return
|
91
|
+
else:
|
92
|
+
# Use sample data from AWS-25 test data
|
93
|
+
vpc_cleanup_data = _generate_sample_vpc_data()
|
94
|
+
print_info("🔧 Using sample AWS-25 VPC data for validation")
|
95
|
+
|
96
|
+
# Load cost projections
|
97
|
+
cost_projections = {}
|
98
|
+
if cost_projections_file:
|
99
|
+
try:
|
100
|
+
with open(cost_projections_file, "r") as f:
|
101
|
+
cost_projections = json.load(f)
|
102
|
+
print_success(f"✅ Loaded cost projections from {cost_projections_file}")
|
103
|
+
except Exception as e:
|
104
|
+
print_error(f"Failed to load cost projections: {e}")
|
105
|
+
return
|
106
|
+
else:
|
107
|
+
cost_projections = {"aws25_vpc_cleanup": target_savings}
|
108
|
+
print_info(f"💰 Using target savings: {format_cost(target_savings)}")
|
109
|
+
|
110
|
+
# Initialize enhanced MCP validator
|
111
|
+
validator = EnhancedMCPValidator(profile)
|
112
|
+
validator.accuracy_threshold = accuracy_threshold
|
113
|
+
|
114
|
+
# Include CloudTrail validation if requested
|
115
|
+
if validate_cloudtrail:
|
116
|
+
print_info("📋 CloudTrail audit validation enabled")
|
117
|
+
|
118
|
+
# Perform comprehensive validation
|
119
|
+
results = await validator.validate_aws25_vpc_cleanup(vpc_cleanup_data, cost_projections)
|
120
|
+
|
121
|
+
# Display validation summary
|
122
|
+
_display_validation_summary(results, accuracy_threshold)
|
123
|
+
|
124
|
+
# Export evidence if requested
|
125
|
+
if export_evidence:
|
126
|
+
evidence_path = await validator._export_security_evidence(results)
|
127
|
+
print_success(f"📄 Evidence package exported to: {evidence_path}")
|
128
|
+
|
129
|
+
# Return validation status
|
130
|
+
if results.accuracy_achieved >= accuracy_threshold:
|
131
|
+
print_success(f"🎯 VALIDATION PASSED: AWS-25 ready for production execution")
|
132
|
+
return 0
|
133
|
+
else:
|
134
|
+
print_error(f"❌ VALIDATION FAILED: Accuracy below threshold")
|
135
|
+
return 1
|
136
|
+
|
137
|
+
try:
|
138
|
+
exit_code = asyncio.run(run_validation())
|
139
|
+
if exit_code and exit_code != 0:
|
140
|
+
raise click.ClickException("Validation failed - see output for details")
|
141
|
+
except Exception as e:
|
142
|
+
print_error(f"Validation error: {e}")
|
143
|
+
raise click.ClickException(str(e))
|
144
|
+
|
145
|
+
|
146
|
+
@mcp_validation.command()
|
147
|
+
@click.option("--region", default="us-east-1", help="AWS region for cost validation")
|
148
|
+
@click.option("--profile", help="AWS profile to use for Cost Explorer access")
|
149
|
+
@click.option("--days-back", type=int, default=30, help="Number of days to analyze for cost validation")
|
150
|
+
@click.option("--tolerance", type=float, default=5.0, help="Cost validation tolerance percentage (default: 5%)")
|
151
|
+
def validate_cost_projections(region: str, profile: Optional[str], days_back: int, tolerance: float):
|
152
|
+
"""
|
153
|
+
Validate cost savings projections using Cost Explorer MCP integration.
|
154
|
+
|
155
|
+
Example usage:
|
156
|
+
runbooks vpc validate-cost-projections --region us-east-1 --days-back 30
|
157
|
+
runbooks vpc validate-cost-projections --tolerance 2.0
|
158
|
+
"""
|
159
|
+
|
160
|
+
async def run_cost_validation():
|
161
|
+
print_header("💰 Cost Projections MCP Validation", f"Tolerance: ±{tolerance}%")
|
162
|
+
|
163
|
+
# Initialize validator
|
164
|
+
validator = EnhancedMCPValidator(profile)
|
165
|
+
|
166
|
+
# Sample cost projections based on AWS-25 data
|
167
|
+
cost_projections = {
|
168
|
+
"vpc_cleanup_immediate": 2700.0, # Zero-ENI VPCs
|
169
|
+
"vpc_optimization_potential": 4920.0, # High/Medium priority
|
170
|
+
"cis_compliance_value": 1260.0, # Default VPC replacements
|
171
|
+
"security_risk_mitigation": 1500.0, # Attack surface reduction
|
172
|
+
"total_aws25_savings": 7548.0, # Total target
|
173
|
+
}
|
174
|
+
|
175
|
+
print_info(f"📊 Validating {len(cost_projections)} cost projection categories")
|
176
|
+
for category, amount in cost_projections.items():
|
177
|
+
console.print(f" • {category}: {format_cost(amount)}")
|
178
|
+
|
179
|
+
# Validate cost projections
|
180
|
+
cost_validation_data = {"cost_data": cost_projections, "validation_tolerance": tolerance}
|
181
|
+
|
182
|
+
cost_accuracy = await validator._validate_cost_projections(cost_projections, None, len(cost_projections))
|
183
|
+
|
184
|
+
# Display results
|
185
|
+
accuracy_color = "green" if cost_accuracy >= 95.0 else "yellow" if cost_accuracy >= 80.0 else "red"
|
186
|
+
console.print(f"[{accuracy_color}]💰 Cost Validation Accuracy: {cost_accuracy:.2f}%[/{accuracy_color}]")
|
187
|
+
|
188
|
+
if cost_accuracy >= 95.0:
|
189
|
+
print_success("✅ Cost projections validated with high confidence")
|
190
|
+
elif cost_accuracy >= 80.0:
|
191
|
+
print_warning("⚠️ Cost projections validated with moderate confidence")
|
192
|
+
else:
|
193
|
+
print_error("❌ Cost projections require review")
|
194
|
+
|
195
|
+
return cost_accuracy
|
196
|
+
|
197
|
+
try:
|
198
|
+
accuracy = asyncio.run(run_cost_validation())
|
199
|
+
console.print(f"[cyan]Final cost validation accuracy: {accuracy:.2f}%[/cyan]")
|
200
|
+
except Exception as e:
|
201
|
+
print_error(f"Cost validation error: {e}")
|
202
|
+
raise click.ClickException(str(e))
|
203
|
+
|
204
|
+
|
205
|
+
@mcp_validation.command()
|
206
|
+
@click.option("--days-back", type=int, default=90, help="Number of days to analyze CloudTrail events")
|
207
|
+
@click.option("--profile", help="AWS profile for CloudTrail access (default: MANAGEMENT_PROFILE)")
|
208
|
+
@click.option("--vpc-ids", help="Comma-separated list of VPC IDs to validate")
|
209
|
+
@click.option("--export-audit-trail", is_flag=True, help="Export detailed audit trail evidence")
|
210
|
+
def validate_cloudtrail_audit(days_back: int, profile: Optional[str], vpc_ids: Optional[str], export_audit_trail: bool):
|
211
|
+
"""
|
212
|
+
Validate CloudTrail audit trails for VPC deletion verification.
|
213
|
+
|
214
|
+
Example usage:
|
215
|
+
runbooks vpc validate-cloudtrail-audit --days-back 90
|
216
|
+
runbooks vpc validate-cloudtrail-audit --vpc-ids vpc-123,vpc-456 --export-audit-trail
|
217
|
+
"""
|
218
|
+
|
219
|
+
async def run_cloudtrail_validation():
|
220
|
+
print_header("📋 CloudTrail Audit Trail Validation", f"Period: {days_back} days")
|
221
|
+
|
222
|
+
# Initialize CloudTrail integration
|
223
|
+
from runbooks.vpc.cloudtrail_audit_integration import CloudTrailMCPIntegration
|
224
|
+
|
225
|
+
cloudtrail_profile = profile or "MANAGEMENT_PROFILE"
|
226
|
+
cloudtrail_integration = CloudTrailMCPIntegration(profile=cloudtrail_profile, audit_period_days=days_back)
|
227
|
+
|
228
|
+
# Parse VPC IDs if provided
|
229
|
+
target_vpc_ids = None
|
230
|
+
if vpc_ids:
|
231
|
+
target_vpc_ids = [vpc_id.strip() for vpc_id in vpc_ids.split(",")]
|
232
|
+
print_info(f"🎯 Targeting {len(target_vpc_ids)} specific VPCs for validation")
|
233
|
+
|
234
|
+
# Perform CloudTrail analysis
|
235
|
+
audit_results = await cloudtrail_integration.analyze_deleted_vpc_resources(target_vpc_ids=target_vpc_ids)
|
236
|
+
|
237
|
+
# Display audit results
|
238
|
+
_display_cloudtrail_results(audit_results)
|
239
|
+
|
240
|
+
# Export audit trail if requested
|
241
|
+
if export_audit_trail:
|
242
|
+
compliance_report = await cloudtrail_integration.generate_compliance_audit_report(
|
243
|
+
audit_results, "AWS Well-Architected Security"
|
244
|
+
)
|
245
|
+
print_success("📄 Audit trail evidence exported")
|
246
|
+
|
247
|
+
return audit_results
|
248
|
+
|
249
|
+
try:
|
250
|
+
results = asyncio.run(run_cloudtrail_validation())
|
251
|
+
console.print(f"[cyan]CloudTrail validation accuracy: {results.validation_accuracy:.2f}%[/cyan]")
|
252
|
+
except Exception as e:
|
253
|
+
print_error(f"CloudTrail validation error: {e}")
|
254
|
+
raise click.ClickException(str(e))
|
255
|
+
|
256
|
+
|
257
|
+
@mcp_validation.command()
|
258
|
+
@click.option("--test-file", type=click.Path(exists=True), help="YAML test data file for validation")
|
259
|
+
@click.option("--profile", help="AWS profile for MCP server access")
|
260
|
+
@click.option("--comprehensive", is_flag=True, help="Run comprehensive validation across all MCP servers")
|
261
|
+
def test_mcp_accuracy(test_file: Optional[str], profile: Optional[str], comprehensive: bool):
|
262
|
+
"""
|
263
|
+
Test MCP server accuracy and connectivity for validation framework.
|
264
|
+
|
265
|
+
Example usage:
|
266
|
+
runbooks vpc test-mcp-accuracy --comprehensive
|
267
|
+
runbooks vpc test-mcp-accuracy --test-file aws25-test-data.yaml
|
268
|
+
"""
|
269
|
+
|
270
|
+
async def run_mcp_testing():
|
271
|
+
print_header("🧪 MCP Server Accuracy Testing", "Validation Framework Testing")
|
272
|
+
|
273
|
+
# Load test data
|
274
|
+
test_data = {}
|
275
|
+
if test_file:
|
276
|
+
try:
|
277
|
+
import yaml
|
278
|
+
|
279
|
+
with open(test_file, "r") as f:
|
280
|
+
test_data = yaml.safe_load(f)
|
281
|
+
print_success(f"✅ Loaded test data from {test_file}")
|
282
|
+
except Exception as e:
|
283
|
+
print_error(f"Failed to load test data: {e}")
|
284
|
+
return
|
285
|
+
else:
|
286
|
+
# Use AWS-25 production test data
|
287
|
+
test_data_path = (
|
288
|
+
Path(__file__).parent.parent.parent.parent
|
289
|
+
/ ".claude/config/environment-data/vpc-test-data-production.yaml"
|
290
|
+
)
|
291
|
+
if test_data_path.exists():
|
292
|
+
try:
|
293
|
+
import yaml
|
294
|
+
|
295
|
+
with open(test_data_path, "r") as f:
|
296
|
+
test_data = yaml.safe_load(f)
|
297
|
+
print_success(f"✅ Loaded AWS-25 production test data")
|
298
|
+
except Exception as e:
|
299
|
+
print_warning(f"Failed to load production test data: {e}")
|
300
|
+
test_data = _generate_sample_test_data()
|
301
|
+
else:
|
302
|
+
test_data = _generate_sample_test_data()
|
303
|
+
|
304
|
+
# Initialize MCP validator
|
305
|
+
validator = EnhancedMCPValidator(profile)
|
306
|
+
|
307
|
+
# Test MCP server connectivity
|
308
|
+
print_info("🔗 Testing MCP server connectivity...")
|
309
|
+
|
310
|
+
# Test AWS MCP servers
|
311
|
+
mcp_results = {}
|
312
|
+
|
313
|
+
# Test Cost Explorer MCP
|
314
|
+
try:
|
315
|
+
cost_test_data = {"cost_data": {"test": 100.0}}
|
316
|
+
cost_result = await validator.mcp_integrator.validate_finops_operations(cost_test_data)
|
317
|
+
mcp_results["cost_explorer"] = {"success": cost_result.success, "accuracy": cost_result.accuracy_score}
|
318
|
+
except Exception as e:
|
319
|
+
mcp_results["cost_explorer"] = {"success": False, "error": str(e)}
|
320
|
+
|
321
|
+
# Test VPC MCP validation
|
322
|
+
try:
|
323
|
+
vpc_test_data = {
|
324
|
+
"vpc_candidates": [{"vpc_id": "vpc-test", "account_id": "123456789012", "region": "us-east-1"}]
|
325
|
+
}
|
326
|
+
vpc_result = await validator.mcp_integrator.validate_vpc_operations(vpc_test_data)
|
327
|
+
mcp_results["vpc_validation"] = {"success": vpc_result.success, "accuracy": vpc_result.accuracy_score}
|
328
|
+
except Exception as e:
|
329
|
+
mcp_results["vpc_validation"] = {"success": False, "error": str(e)}
|
330
|
+
|
331
|
+
# Display MCP test results
|
332
|
+
_display_mcp_test_results(mcp_results)
|
333
|
+
|
334
|
+
# Test comprehensive accuracy if requested
|
335
|
+
if comprehensive:
|
336
|
+
print_info("📊 Running comprehensive accuracy testing...")
|
337
|
+
|
338
|
+
# Extract VPC test data
|
339
|
+
vpc_candidates = test_data.get("vpc_test_data", {}).get("active_vpcs", [])[:5] # Test subset
|
340
|
+
|
341
|
+
# Convert to validation format
|
342
|
+
validation_vpc_data = {
|
343
|
+
"vpc_candidates": [
|
344
|
+
{
|
345
|
+
"vpc_id": vpc.get("vpc_id"),
|
346
|
+
"account_id": vpc.get("account"),
|
347
|
+
"region": vpc.get("region"),
|
348
|
+
"eni_count": vpc.get("enis", 0),
|
349
|
+
}
|
350
|
+
for vpc in vpc_candidates
|
351
|
+
]
|
352
|
+
}
|
353
|
+
|
354
|
+
cost_projections = {"test_validation": 1000.0}
|
355
|
+
|
356
|
+
# Run comprehensive validation
|
357
|
+
results = await validator.validate_aws25_vpc_cleanup(validation_vpc_data, cost_projections)
|
358
|
+
|
359
|
+
print_success(f"🎯 Comprehensive accuracy achieved: {results.accuracy_achieved:.2f}%")
|
360
|
+
|
361
|
+
return mcp_results
|
362
|
+
|
363
|
+
try:
|
364
|
+
results = asyncio.run(run_mcp_testing())
|
365
|
+
success_count = sum(1 for result in results.values() if result.get("success", False))
|
366
|
+
console.print(f"[cyan]MCP server test results: {success_count}/{len(results)} servers operational[/cyan]")
|
367
|
+
except Exception as e:
|
368
|
+
print_error(f"MCP testing error: {e}")
|
369
|
+
raise click.ClickException(str(e))
|
370
|
+
|
371
|
+
|
372
|
+
# Helper functions for CLI commands
|
373
|
+
|
374
|
+
|
375
|
+
def _generate_sample_vpc_data() -> Dict[str, Any]:
|
376
|
+
"""Generate sample VPC data based on AWS-25 test scenarios."""
|
377
|
+
return {
|
378
|
+
"vpc_candidates": [
|
379
|
+
{
|
380
|
+
"vpc_id": "vpc-2c3d4e5f6g7h8i9j0",
|
381
|
+
"vpc_name": "legacy-staging-vpc",
|
382
|
+
"account_id": "123456789014",
|
383
|
+
"region": "us-east-2",
|
384
|
+
"eni_count": 0,
|
385
|
+
"cost_monthly": 135.00,
|
386
|
+
"cleanup_priority": "HIGH",
|
387
|
+
},
|
388
|
+
{
|
389
|
+
"vpc_id": "vpc-3d4e5f6g7h8i9j0k1",
|
390
|
+
"vpc_name": "dev-prototype-vpc",
|
391
|
+
"account_id": "123456789015",
|
392
|
+
"region": "eu-west-1",
|
393
|
+
"eni_count": 0,
|
394
|
+
"cost_monthly": 90.00,
|
395
|
+
"cleanup_priority": "HIGH",
|
396
|
+
},
|
397
|
+
{
|
398
|
+
"vpc_id": "vpc-5f6g7h8i9j0k1l2m3",
|
399
|
+
"vpc_name": "default-vpc-staging",
|
400
|
+
"account_id": "123456789017",
|
401
|
+
"region": "us-west-1",
|
402
|
+
"eni_count": 0,
|
403
|
+
"cost_monthly": 45.00,
|
404
|
+
"cleanup_priority": "CRITICAL",
|
405
|
+
},
|
406
|
+
],
|
407
|
+
"deleted_vpcs": [
|
408
|
+
{"vpc_id": "vpc-deleted-001", "deletion_date": "2023-12-15"},
|
409
|
+
{"vpc_id": "vpc-deleted-002", "deletion_date": "2023-11-20"},
|
410
|
+
{"vpc_id": "vpc-deleted-003", "deletion_date": "2023-10-30"},
|
411
|
+
],
|
412
|
+
}
|
413
|
+
|
414
|
+
|
415
|
+
def _generate_sample_test_data() -> Dict[str, Any]:
|
416
|
+
"""Generate sample test data for MCP accuracy testing."""
|
417
|
+
return {
|
418
|
+
"business_metrics": {"total_vpcs": 27, "annual_savings": 11070, "waste_percentage": 44},
|
419
|
+
"cloudtrail_mcp_integration": {"validation_accuracy": 99.8, "audit_trail_events": 8593},
|
420
|
+
"validation_requirements": {"mcp_accuracy_target": 99.5, "mcp_accuracy_achieved": 99.8},
|
421
|
+
}
|
422
|
+
|
423
|
+
|
424
|
+
def _display_validation_summary(results: SecurityValidationResults, threshold: float):
|
425
|
+
"""Display comprehensive validation summary."""
|
426
|
+
|
427
|
+
status_color = "green" if results.accuracy_achieved >= threshold else "red"
|
428
|
+
status_text = "PASSED" if results.accuracy_achieved >= threshold else "FAILED"
|
429
|
+
|
430
|
+
console.print(f"\n[bold {status_color}]🎯 VALIDATION {status_text}[/bold {status_color}]")
|
431
|
+
console.print(f"[{status_color}]Accuracy: {results.accuracy_achieved:.2f}% (≥{threshold}%)[/{status_color}]")
|
432
|
+
console.print(f"[cyan]VPCs Validated: {results.total_vpcs_validated}[/cyan]")
|
433
|
+
console.print(f"[yellow]Compliance Score: {results.compliance_score:.1f}%[/yellow]")
|
434
|
+
|
435
|
+
if results.remediation_required:
|
436
|
+
console.print(f"[yellow]⚠️ Remediation Items: {len(results.remediation_required)}[/yellow]")
|
437
|
+
|
438
|
+
|
439
|
+
def _display_cloudtrail_results(audit_results):
|
440
|
+
"""Display CloudTrail audit validation results."""
|
441
|
+
|
442
|
+
console.print(f"[cyan]📋 CloudTrail Validation Results[/cyan]")
|
443
|
+
console.print(f"[green]Audit Completeness: {audit_results.audit_trail_completeness:.1f}%[/green]")
|
444
|
+
console.print(f"[green]Validation Accuracy: {audit_results.validation_accuracy:.1f}%[/green]")
|
445
|
+
console.print(f"[yellow]Events Analyzed: {audit_results.total_events_analyzed:,}[/yellow]")
|
446
|
+
console.print(f"[blue]Deleted Resources: {audit_results.deleted_resources_found}[/blue]")
|
447
|
+
|
448
|
+
|
449
|
+
def _display_mcp_test_results(mcp_results: Dict[str, Any]):
|
450
|
+
"""Display MCP server test results."""
|
451
|
+
|
452
|
+
table = create_table("MCP Server Test Results")
|
453
|
+
table.add_column("Server", style="cyan")
|
454
|
+
table.add_column("Status", justify="center")
|
455
|
+
table.add_column("Accuracy", justify="right", style="green")
|
456
|
+
table.add_column("Notes", style="yellow")
|
457
|
+
|
458
|
+
for server_name, result in mcp_results.items():
|
459
|
+
if result.get("success"):
|
460
|
+
status = "✅ Online"
|
461
|
+
accuracy = f"{result.get('accuracy', 0):.1f}%"
|
462
|
+
notes = "Operational"
|
463
|
+
else:
|
464
|
+
status = "❌ Error"
|
465
|
+
accuracy = "N/A"
|
466
|
+
notes = result.get("error", "Connection failed")[:50]
|
467
|
+
|
468
|
+
table.add_row(server_name, status, accuracy, notes)
|
469
|
+
|
470
|
+
console.print(table)
|
471
|
+
|
472
|
+
|
473
|
+
# Integration with main VPC CLI
|
474
|
+
def register_mcp_validation_commands(vpc_cli_group):
|
475
|
+
"""Register MCP validation commands with the main VPC CLI group."""
|
476
|
+
vpc_cli_group.add_command(mcp_validation, name="mcp-validation")
|
477
|
+
|
478
|
+
|
479
|
+
if __name__ == "__main__":
|
480
|
+
mcp_validation()
|