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