runbooks 1.1.4__py3-none-any.whl → 1.1.6__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 (273) 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 +135 -91
  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 +17 -12
  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 +99 -79
  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 +315 -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/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -20,8 +20,6 @@ class TestNetworkingCostEngine:
20
20
  """Test Networking Cost Engine functionality."""
21
21
 
22
22
  def test_initialization_default(self):
23
- # Dynamic test period for consistent test data
24
- test_period = get_test_date_period(30)
25
23
  """Test cost engine initialization with defaults."""
26
24
  engine = NetworkingCostEngine()
27
25
 
@@ -0,0 +1,326 @@
1
+ """
2
+ Network Topology Generator - Lean wrapper leveraging existing VPC infrastructure
3
+
4
+ This module provides network topology visualization capabilities by reusing:
5
+ - HeatMapEngine for visualization and cost overlay
6
+ - NetworkingWrapper for network discovery
7
+ - RichFormatters for enterprise display formatting
8
+
9
+ Follows KISS/DRY/LEAN principles by wrapping existing functionality.
10
+ """
11
+
12
+ import logging
13
+ import os
14
+ from dataclasses import dataclass
15
+ from datetime import datetime
16
+ from pathlib import Path
17
+ from typing import Any, Dict, List, Optional
18
+
19
+ from .heatmap_engine import NetworkingCostHeatMapEngine, HeatMapConfig
20
+ from .networking_wrapper import VPCNetworkingWrapper
21
+ from .rich_formatters import (
22
+ display_heatmap,
23
+ display_transit_gateway_architecture,
24
+ display_optimization_recommendations,
25
+ display_success,
26
+ )
27
+ from ..common.rich_utils import console, print_header, print_success
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ @dataclass
33
+ class TopologyConfig:
34
+ """Configuration for network topology generation"""
35
+
36
+ profile: str
37
+ region: str
38
+ include_costs: bool = False
39
+ detail_level: str = "detailed"
40
+ output_dir: str = "./vpc_topology"
41
+ export_formats: List[str] = None
42
+
43
+
44
+ class NetworkTopologyGenerator:
45
+ """
46
+ Network topology generator leveraging existing VPC infrastructure.
47
+
48
+ This class is a lean wrapper that reuses:
49
+ - HeatMapEngine for visualization capabilities
50
+ - NetworkingWrapper for network discovery
51
+ - RichFormatters for display formatting
52
+ """
53
+
54
+ def __init__(
55
+ self,
56
+ profile: str,
57
+ region: str,
58
+ include_costs: bool = False,
59
+ detail_level: str = "detailed",
60
+ output_dir: str = "./vpc_topology",
61
+ ):
62
+ """
63
+ Initialize topology generator with existing VPC infrastructure.
64
+
65
+ Args:
66
+ profile: AWS profile for authentication
67
+ region: AWS region for analysis
68
+ include_costs: Whether to include cost overlay
69
+ detail_level: Level of detail (detailed, comprehensive, summary)
70
+ output_dir: Directory for output files
71
+ """
72
+ self.config = TopologyConfig(
73
+ profile=profile,
74
+ region=region,
75
+ include_costs=include_costs,
76
+ detail_level=detail_level,
77
+ output_dir=output_dir,
78
+ )
79
+
80
+ # Initialize existing VPC infrastructure components
81
+ self._init_vpc_components()
82
+
83
+ # Ensure output directory exists
84
+ Path(output_dir).mkdir(parents=True, exist_ok=True)
85
+
86
+ def _init_vpc_components(self):
87
+ """Initialize existing VPC infrastructure components for reuse."""
88
+ try:
89
+ # Initialize networking wrapper for discovery
90
+ self.networking_wrapper = VPCNetworkingWrapper(profile=self.config.profile, region=self.config.region)
91
+
92
+ # Initialize heatmap engine for visualization (if costs enabled)
93
+ if self.config.include_costs:
94
+ heat_config = HeatMapConfig(single_account_profile=self.config.profile, regions=[self.config.region])
95
+ self.heatmap_engine = NetworkingCostHeatMapEngine(config=heat_config)
96
+
97
+ except Exception as e:
98
+ logger.warning(f"VPC component initialization warning: {e}")
99
+ # Continue without advanced features if components unavailable
100
+
101
+ def generate_network_topology(self) -> Dict[str, Any]:
102
+ """
103
+ Generate comprehensive network topology using existing VPC infrastructure.
104
+
105
+ Main method called by CLI. Leverages existing components:
106
+ - NetworkingWrapper for network discovery
107
+ - HeatMapEngine for cost visualization
108
+ - RichFormatters for display
109
+
110
+ Returns:
111
+ Dict containing topology results and visualizations
112
+ """
113
+ print_header("Network Topology Generation", version="1.0.0")
114
+
115
+ topology_results = {
116
+ "timestamp": datetime.now().isoformat(),
117
+ "profile": self.config.profile,
118
+ "region": self.config.region,
119
+ "detail_level": self.config.detail_level,
120
+ "include_costs": self.config.include_costs,
121
+ "topology_data": {},
122
+ "visualizations": {},
123
+ "recommendations": {},
124
+ "output_files": [],
125
+ }
126
+
127
+ try:
128
+ # Phase 1: Network Discovery (reuse networking_wrapper)
129
+ topology_results["topology_data"] = self._discover_network_topology()
130
+
131
+ # Phase 2: Cost Analysis (reuse heatmap_engine if enabled)
132
+ if self.config.include_costs and hasattr(self, "heatmap_engine"):
133
+ topology_results["cost_analysis"] = self._generate_cost_overlay()
134
+
135
+ # Phase 3: Topology Visualization (reuse rich_formatters)
136
+ topology_results["visualizations"] = self._generate_topology_visualizations(
137
+ topology_results["topology_data"]
138
+ )
139
+
140
+ # Phase 4: Optimization Recommendations
141
+ topology_results["recommendations"] = self._generate_topology_recommendations(
142
+ topology_results["topology_data"]
143
+ )
144
+
145
+ # Phase 5: Export Results
146
+ self._export_topology_results(topology_results)
147
+
148
+ # Display success using rich formatters
149
+ display_success(
150
+ console,
151
+ "Network topology generated successfully",
152
+ {"profile": self.config.profile, "region": self.config.region, "output_dir": self.config.output_dir},
153
+ )
154
+
155
+ return topology_results
156
+
157
+ except Exception as e:
158
+ logger.error(f"Topology generation failed: {e}")
159
+ raise
160
+
161
+ def _discover_network_topology(self) -> Dict[str, Any]:
162
+ """
163
+ Discover network topology using existing networking wrapper.
164
+
165
+ Leverages VPCNetworkingWrapper methods for network discovery.
166
+ """
167
+ topology_data = {
168
+ "discovery_timestamp": datetime.now().isoformat(),
169
+ "vpcs": [],
170
+ "transit_gateways": [],
171
+ "nat_gateways": [],
172
+ "vpc_endpoints": [],
173
+ "network_connections": [],
174
+ }
175
+
176
+ try:
177
+ # Discover Transit Gateway architecture (reuse existing method)
178
+ tgw_data = self.networking_wrapper.analyze_transit_gateway_architecture(
179
+ include_costs=self.config.include_costs
180
+ )
181
+ topology_data["transit_gateways"] = tgw_data.get("transit_gateways", [])
182
+
183
+ # Display Transit Gateway topology using existing formatter
184
+ if topology_data["transit_gateways"]:
185
+ display_transit_gateway_architecture(console, tgw_data)
186
+
187
+ # Discover NAT Gateways (reuse existing method)
188
+ nat_analysis = self.networking_wrapper.analyze_nat_gateways()
189
+ topology_data["nat_gateways"] = nat_analysis.get("nat_gateways", [])
190
+
191
+ # Discover VPC Endpoints (reuse existing method)
192
+ endpoint_analysis = self.networking_wrapper.analyze_vpc_endpoints()
193
+ topology_data["vpc_endpoints"] = endpoint_analysis.get("endpoints", [])
194
+
195
+ console.print(f"[green]✅ Network discovery completed[/green]")
196
+ console.print(
197
+ f"[dim]Found: {len(topology_data['transit_gateways'])} TGWs, "
198
+ f"{len(topology_data['nat_gateways'])} NAT GWs, "
199
+ f"{len(topology_data['vpc_endpoints'])} Endpoints[/dim]"
200
+ )
201
+
202
+ return topology_data
203
+
204
+ except Exception as e:
205
+ logger.error(f"Network discovery failed: {e}")
206
+ raise
207
+
208
+ def _generate_cost_overlay(self) -> Dict[str, Any]:
209
+ """
210
+ Generate cost overlay using existing heatmap engine.
211
+
212
+ Leverages NetworkingCostHeatMapEngine for cost visualization.
213
+ """
214
+ if not hasattr(self, "heatmap_engine"):
215
+ return {"cost_overlay": "disabled", "reason": "heatmap_engine_unavailable"}
216
+
217
+ try:
218
+ # Generate comprehensive heat maps (reuse existing method)
219
+ heat_maps = self.heatmap_engine.generate_comprehensive_heat_maps()
220
+
221
+ # Display heat map using existing formatter
222
+ display_heatmap(console, heat_maps)
223
+
224
+ return {"cost_overlay": "enabled", "heat_maps": heat_maps, "timestamp": datetime.now().isoformat()}
225
+
226
+ except Exception as e:
227
+ logger.warning(f"Cost overlay generation failed: {e}")
228
+ return {"cost_overlay": "failed", "error": str(e)}
229
+
230
+ def _generate_topology_visualizations(self, topology_data: Dict[str, Any]) -> Dict[str, Any]:
231
+ """
232
+ Generate topology visualizations using existing rich formatters.
233
+
234
+ Creates visual representations of network topology.
235
+ """
236
+ visualizations = {"generated": True, "formats": ["rich_console", "text_summary"], "files": []}
237
+
238
+ # Generate text-based topology summary
239
+ topology_summary = self._create_topology_summary(topology_data)
240
+
241
+ # Save topology summary
242
+ summary_file = Path(self.config.output_dir) / "topology_summary.txt"
243
+ with open(summary_file, "w") as f:
244
+ f.write(topology_summary)
245
+ visualizations["files"].append(str(summary_file))
246
+
247
+ console.print(f"[green]✅ Topology visualizations generated[/green]")
248
+
249
+ return visualizations
250
+
251
+ def _create_topology_summary(self, topology_data: Dict[str, Any]) -> str:
252
+ """Create a text-based topology summary."""
253
+ summary_lines = [
254
+ "=== Network Topology Summary ===",
255
+ f"Profile: {self.config.profile}",
256
+ f"Region: {self.config.region}",
257
+ f"Generated: {topology_data.get('discovery_timestamp', 'Unknown')}",
258
+ "",
259
+ "=== Network Components ===",
260
+ f"Transit Gateways: {len(topology_data.get('transit_gateways', []))}",
261
+ f"NAT Gateways: {len(topology_data.get('nat_gateways', []))}",
262
+ f"VPC Endpoints: {len(topology_data.get('vpc_endpoints', []))}",
263
+ "",
264
+ ]
265
+
266
+ return "\n".join(summary_lines)
267
+
268
+ def _generate_topology_recommendations(self, topology_data: Dict[str, Any]) -> Dict[str, Any]:
269
+ """
270
+ Generate optimization recommendations based on topology analysis.
271
+
272
+ Uses topology data to suggest optimizations.
273
+ """
274
+ recommendations = {
275
+ "optimization_opportunities": [],
276
+ "cost_savings": [],
277
+ "security_improvements": [],
278
+ "performance_enhancements": [],
279
+ }
280
+
281
+ # Basic recommendations based on discovered components
282
+ tgw_count = len(topology_data.get("transit_gateways", []))
283
+ nat_count = len(topology_data.get("nat_gateways", []))
284
+ endpoint_count = len(topology_data.get("vpc_endpoints", []))
285
+
286
+ if nat_count > 2:
287
+ recommendations["cost_savings"].append(
288
+ {
289
+ "component": "NAT Gateways",
290
+ "suggestion": f"Consider consolidating {nat_count} NAT Gateways",
291
+ "potential_savings": "20-40% of NAT Gateway costs",
292
+ }
293
+ )
294
+
295
+ if endpoint_count == 0:
296
+ recommendations["cost_savings"].append(
297
+ {
298
+ "component": "VPC Endpoints",
299
+ "suggestion": "Consider VPC Endpoints for AWS service access",
300
+ "potential_savings": "Reduced data transfer costs",
301
+ }
302
+ )
303
+
304
+ # Display recommendations using existing formatter
305
+ if recommendations["cost_savings"] or recommendations["optimization_opportunities"]:
306
+ display_optimization_recommendations(console, recommendations)
307
+
308
+ return recommendations
309
+
310
+ def _export_topology_results(self, topology_results: Dict[str, Any]) -> None:
311
+ """
312
+ Export topology results to various formats.
313
+
314
+ Saves results to output directory in multiple formats.
315
+ """
316
+ output_dir = Path(self.config.output_dir)
317
+
318
+ # Export JSON results
319
+ json_file = output_dir / "topology_results.json"
320
+ import json
321
+
322
+ with open(json_file, "w") as f:
323
+ json.dump(topology_results, f, indent=2, default=str)
324
+ topology_results["output_files"].append(str(json_file))
325
+
326
+ console.print(f"[green]✅ Results exported to {self.config.output_dir}[/green]")