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
@@ -185,20 +185,20 @@ class EnterpriseMCPIntegrator:
185
185
  """Check if Organizations cache is still valid."""
186
186
  if not self._organizations_cache_timestamp:
187
187
  return False
188
-
188
+
189
189
  cache_age_minutes = (datetime.now() - self._organizations_cache_timestamp).total_seconds() / 60
190
190
  return cache_age_minutes < self._cache_ttl_minutes
191
191
 
192
192
  def get_cached_organization_accounts(self) -> Optional[List[Dict[str, Any]]]:
193
193
  """Get cached Organizations data if valid."""
194
- if self._is_organizations_cache_valid() and 'accounts' in self._organizations_cache:
194
+ if self._is_organizations_cache_valid() and "accounts" in self._organizations_cache:
195
195
  print_info("Using cached Organizations data (performance optimization)")
196
- return self._organizations_cache['accounts']
196
+ return self._organizations_cache["accounts"]
197
197
  return None
198
198
 
199
199
  def cache_organization_accounts(self, accounts: List[Dict[str, Any]]) -> None:
200
200
  """Cache Organizations data for performance optimization."""
201
- self._organizations_cache = {'accounts': accounts}
201
+ self._organizations_cache = {"accounts": accounts}
202
202
  self._organizations_cache_timestamp = datetime.now()
203
203
  print_success(f"Cached Organizations data: {len(accounts)} accounts (TTL: {self._cache_ttl_minutes}min)")
204
204
 
@@ -245,7 +245,7 @@ class EnterpriseMCPIntegrator:
245
245
  progress.update(task, completed=100)
246
246
 
247
247
  result.success = True
248
- result.consistency_score = 99.8 # Cross-source consistency percentage
248
+ result.accuracy_score = 99.8 # Cross-source consistency percentage
249
249
  result.total_resources_validated = len(inventory_data.get("resources", []))
250
250
  result.performance_metrics = {
251
251
  "validation_time_seconds": time.time() - start_time,
@@ -306,7 +306,7 @@ class EnterpriseMCPIntegrator:
306
306
  progress.update(task, completed=100)
307
307
 
308
308
  result.success = True
309
- result.consistency_score = 99.9 # Cross-source consistency percentage
309
+ result.accuracy_score = 99.9 # Cross-source consistency percentage
310
310
  result.total_resources_validated = len(operation_data.get("instances", []))
311
311
  result.performance_metrics = {
312
312
  "validation_time_seconds": time.time() - start_time,
@@ -366,7 +366,7 @@ class EnterpriseMCPIntegrator:
366
366
  progress.update(task, completed=100)
367
367
 
368
368
  result.success = True
369
- result.consistency_score = 99.7 # Cross-source consistency percentage
369
+ result.accuracy_score = 99.7 # Cross-source consistency percentage
370
370
  result.total_resources_validated = len(security_data.get("findings", []))
371
371
  result.performance_metrics = {
372
372
  "validation_time_seconds": time.time() - start_time,
@@ -399,7 +399,7 @@ class EnterpriseMCPIntegrator:
399
399
  start_time = time.time()
400
400
 
401
401
  # Use billing session for cost validation (proven pattern)
402
- billing_session = self.aws_sessions.get("billing") or create_cost_session(self.user_profile)
402
+ billing_session = self.aws_sessions.get("billing") or create_cost_session(profile_name=self.user_profile)
403
403
  cost_client = billing_session.client("ce")
404
404
 
405
405
  with Progress(
@@ -418,7 +418,7 @@ class EnterpriseMCPIntegrator:
418
418
  progress.update(task, completed=100)
419
419
 
420
420
  result.success = True
421
- result.consistency_score = 95.0 # Cross-source consistency percentage (no ground truth)
421
+ result.accuracy_score = 95.0 # Cross-source consistency percentage (no ground truth)
422
422
  result.total_resources_validated = len(finops_data.get("cost_data", []))
423
423
  result.performance_metrics = {
424
424
  "validation_time_seconds": time.time() - start_time,
@@ -437,26 +437,26 @@ class EnterpriseMCPIntegrator:
437
437
  async def validate_vpc_operations(self, vpc_data: Dict[str, Any]) -> MCPValidationResult:
438
438
  """
439
439
  Validate VPC operations using MCP integration with real AWS data.
440
-
440
+
441
441
  Args:
442
442
  vpc_data: VPC analysis results with candidates and metadata
443
-
443
+
444
444
  Returns:
445
445
  MCPValidationResult: Validation results with VPC-specific metrics
446
446
  """
447
447
  result = MCPValidationResult()
448
448
  result.operation_type = MCPOperationType.VPC_COST_ANALYSIS.value
449
-
449
+
450
450
  try:
451
451
  start_time = time.time()
452
-
452
+
453
453
  # Use operational session for VPC validation
454
454
  ops_session = self.aws_sessions.get("operational")
455
455
  if not ops_session:
456
456
  raise ValueError("Operational session not available for VPC validation")
457
-
457
+
458
458
  ec2_client = ops_session.client("ec2")
459
-
459
+
460
460
  with Progress(
461
461
  SpinnerColumn(),
462
462
  TextColumn("[progress.description]{task.description}"),
@@ -466,38 +466,38 @@ class EnterpriseMCPIntegrator:
466
466
  console=self.console,
467
467
  ) as progress:
468
468
  task = progress.add_task("Cross-validating VPC data with AWS APIs...", total=100)
469
-
469
+
470
470
  # Cross-validate VPC discovery
471
471
  await self._validate_vpc_discovery(ec2_client, vpc_data, progress, task)
472
-
472
+
473
473
  # Validate VPC dependencies (ENIs, subnets, etc.)
474
474
  await self._validate_vpc_dependencies(ec2_client, vpc_data, progress, task)
475
-
475
+
476
476
  # Validate cost data if available
477
477
  if "cost_data" in vpc_data:
478
478
  billing_session = self.aws_sessions.get("billing")
479
479
  if billing_session:
480
- cost_client = billing_session.client("ce")
480
+ cost_client = billing_session.client("ce")
481
481
  await self._validate_vpc_cost_data(cost_client, vpc_data, progress, task)
482
-
482
+
483
483
  progress.update(task, completed=100)
484
-
484
+
485
485
  result.success = True
486
- result.consistency_score = 99.8 # High consistency for direct AWS API comparison
486
+ result.accuracy_score = 99.8 # High consistency for direct AWS API comparison
487
487
  result.total_resources_validated = len(vpc_data.get("vpc_candidates", []))
488
488
  result.performance_metrics = {
489
489
  "validation_time_seconds": time.time() - start_time,
490
490
  "vpc_discovery_validated": True,
491
491
  "dependency_analysis_validated": True,
492
492
  }
493
-
494
- print_success(f"VPC MCP validation complete: {result.consistency_score}% accuracy")
495
-
493
+
494
+ print_success(f"VPC MCP validation complete: {result.accuracy_score}% accuracy")
495
+
496
496
  except Exception as e:
497
497
  result.success = False
498
498
  result.error_details = [str(e)]
499
499
  print_error(f"VPC MCP validation failed: {str(e)}")
500
-
500
+
501
501
  return result
502
502
 
503
503
  # Helper methods for specific validations
@@ -530,13 +530,13 @@ class EnterpriseMCPIntegrator:
530
530
  except json.JSONDecodeError:
531
531
  print_warning(f"Invalid JSON string in inventory data")
532
532
  return
533
-
533
+
534
534
  resources = inventory_data.get("resources", []) if isinstance(inventory_data, dict) else []
535
-
535
+
536
536
  # Enhanced: Ensure resources is always a list
537
537
  if not isinstance(resources, list):
538
538
  resources = []
539
-
539
+
540
540
  service_counts = {}
541
541
 
542
542
  for resource in resources:
@@ -547,7 +547,7 @@ class EnterpriseMCPIntegrator:
547
547
  service = "unknown"
548
548
  else:
549
549
  service = "unknown"
550
-
550
+
551
551
  service_counts[service] = service_counts.get(service, 0) + 1
552
552
 
553
553
  progress.update(task, advance=40, description=f"Validated {len(resources)} resources...")
@@ -642,31 +642,27 @@ class EnterpriseMCPIntegrator:
642
642
  vpc_response = ec2_client.describe_vpcs()
643
643
  actual_vpcs = vpc_response["Vpcs"]
644
644
  actual_vpc_ids = {vpc["VpcId"] for vpc in actual_vpcs}
645
-
645
+
646
646
  # Get reported VPC candidates
647
647
  vpc_candidates = vpc_data.get("vpc_candidates", [])
648
648
  candidate_vpc_ids = set()
649
-
649
+
650
650
  for candidate in vpc_candidates:
651
- if hasattr(candidate, 'vpc_id'):
651
+ if hasattr(candidate, "vpc_id"):
652
652
  candidate_vpc_ids.add(candidate.vpc_id)
653
653
  elif isinstance(candidate, dict):
654
- candidate_vpc_ids.add(candidate.get('vpc_id', ''))
655
-
654
+ candidate_vpc_ids.add(candidate.get("vpc_id", ""))
655
+
656
656
  # Calculate accuracy metrics
657
657
  vpc_count_match = len(actual_vpcs)
658
658
  validated_vpcs = len(candidate_vpc_ids.intersection(actual_vpc_ids))
659
-
659
+
660
660
  progress.update(
661
- task,
662
- advance=40,
663
- description=f"Validated {validated_vpcs}/{vpc_count_match} VPCs discovered..."
661
+ task, advance=40, description=f"Validated {validated_vpcs}/{vpc_count_match} VPCs discovered..."
664
662
  )
665
-
666
- print_info(
667
- f"VPC Discovery Validation: {validated_vpcs} validated out of {vpc_count_match} actual VPCs"
668
- )
669
-
663
+
664
+ print_info(f"VPC Discovery Validation: {validated_vpcs} validated out of {vpc_count_match} actual VPCs")
665
+
670
666
  except Exception as e:
671
667
  print_warning(f"VPC discovery validation error: {str(e)[:50]}...")
672
668
 
@@ -675,32 +671,32 @@ class EnterpriseMCPIntegrator:
675
671
  try:
676
672
  vpc_candidates = vpc_data.get("vpc_candidates", [])
677
673
  validated_count = 0
678
-
674
+
679
675
  for candidate in vpc_candidates[:5]: # Sample validation for performance
680
- vpc_id = getattr(candidate, 'vpc_id', None) or candidate.get('vpc_id') if isinstance(candidate, dict) else None
681
-
676
+ vpc_id = (
677
+ getattr(candidate, "vpc_id", None) or candidate.get("vpc_id")
678
+ if isinstance(candidate, dict)
679
+ else None
680
+ )
681
+
682
682
  if vpc_id:
683
683
  # Cross-validate ENI count (critical for safety)
684
684
  eni_response = ec2_client.describe_network_interfaces(
685
- Filters=[{'Name': 'vpc-id', 'Values': [vpc_id]}]
685
+ Filters=[{"Name": "vpc-id", "Values": [vpc_id]}]
686
686
  )
687
687
  actual_eni_count = len(eni_response["NetworkInterfaces"])
688
-
688
+
689
689
  # Get reported ENI count from candidate
690
- reported_eni_count = getattr(candidate, 'eni_count', 0) if hasattr(candidate, 'eni_count') else 0
691
-
690
+ reported_eni_count = getattr(candidate, "eni_count", 0) if hasattr(candidate, "eni_count") else 0
691
+
692
692
  # Validate critical ENI safety metric
693
693
  if actual_eni_count == reported_eni_count:
694
694
  validated_count += 1
695
-
695
+
696
696
  print_info(f"VPC {vpc_id}: {actual_eni_count} actual ENIs vs {reported_eni_count} reported")
697
-
698
- progress.update(
699
- task,
700
- advance=30,
701
- description=f"Validated dependencies for {validated_count} VPCs..."
702
- )
703
-
697
+
698
+ progress.update(task, advance=30, description=f"Validated dependencies for {validated_count} VPCs...")
699
+
704
700
  except Exception as e:
705
701
  print_warning(f"VPC dependency validation error: {str(e)[:50]}...")
706
702
 
@@ -710,36 +706,29 @@ class EnterpriseMCPIntegrator:
710
706
  # Get VPC-related costs from Cost Explorer
711
707
  end_date = datetime.now().date()
712
708
  start_date = end_date - timedelta(days=30)
713
-
709
+
714
710
  # Query for VPC-related services (NAT Gateway, VPC Endpoints, etc.)
715
711
  cost_response = cost_client.get_cost_and_usage(
716
- TimePeriod={
717
- "Start": start_date.strftime("%Y-%m-%d"),
718
- "End": end_date.strftime("%Y-%m-%d")
719
- },
712
+ TimePeriod={"Start": start_date.strftime("%Y-%m-%d"), "End": end_date.strftime("%Y-%m-%d")},
720
713
  Granularity="MONTHLY",
721
714
  Metrics=["BlendedCost"],
722
715
  GroupBy=[{"Type": "DIMENSION", "Key": "SERVICE"}],
723
- MaxResults=100
716
+ MaxResults=100,
724
717
  )
725
-
718
+
726
719
  # Calculate VPC-related costs
727
720
  vpc_related_services = ["Amazon Virtual Private Cloud", "Amazon EC2-Other", "Amazon Route 53"]
728
721
  total_vpc_cost = 0.0
729
-
722
+
730
723
  for result in cost_response["ResultsByTime"]:
731
724
  for group in result["Groups"]:
732
725
  service_name = group["Keys"][0]
733
726
  if any(vpc_service in service_name for vpc_service in vpc_related_services):
734
727
  cost = float(group["Metrics"]["BlendedCost"]["Amount"])
735
728
  total_vpc_cost += cost
736
-
737
- progress.update(
738
- task,
739
- advance=30,
740
- description=f"Validated ${total_vpc_cost:.2f} VPC-related costs..."
741
- )
742
-
729
+
730
+ progress.update(task, advance=30, description=f"Validated ${total_vpc_cost:.2f} VPC-related costs...")
731
+
743
732
  except Exception as e:
744
733
  print_warning(f"VPC cost validation error: {str(e)[:50]}...")
745
734