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.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/assessment/compliance.py +1 -1
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cli/__init__.py +1 -1
- runbooks/cli/commands/cfat.py +64 -23
- runbooks/cli/commands/finops.py +1005 -54
- runbooks/cli/commands/inventory.py +135 -91
- runbooks/cli/commands/operate.py +9 -36
- runbooks/cli/commands/security.py +42 -18
- runbooks/cli/commands/validation.py +432 -18
- runbooks/cli/commands/vpc.py +81 -17
- runbooks/cli/registry.py +22 -10
- runbooks/cloudops/__init__.py +20 -27
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +544 -542
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +224 -225
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +177 -213
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +17 -12
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +40 -36
- runbooks/common/aws_utils.py +74 -79
- runbooks/common/business_logic.py +126 -104
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
- runbooks/common/cross_account_manager.py +197 -204
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +29 -19
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +476 -493
- runbooks/common/mcp_integration.py +99 -79
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +175 -193
- runbooks/common/patterns.py +23 -25
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +111 -37
- runbooks/common/rich_utils.py +315 -141
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +26 -30
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +484 -618
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +32 -29
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +223 -285
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +337 -174
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1512 -481
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +19 -23
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +64 -65
- runbooks/finops/scenarios.py +1277 -438
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +259 -265
- runbooks/finops/vpc_cleanup_exporter.py +189 -144
- runbooks/finops/vpc_cleanup_optimizer.py +591 -573
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/aws_decorators.py +2 -3
- runbooks/inventory/check_cloudtrail_compliance.py +2 -4
- runbooks/inventory/check_controltower_readiness.py +152 -151
- runbooks/inventory/check_landingzone_readiness.py +85 -84
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +1 -1
- runbooks/inventory/collectors/aws_networking.py +109 -99
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/core/formatter.py +11 -0
- runbooks/inventory/draw_org_structure.py +8 -9
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/ec2_vpc_utils.py +2 -2
- runbooks/inventory/find_cfn_drift_detection.py +5 -7
- runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
- runbooks/inventory/find_cfn_stackset_drift.py +5 -6
- runbooks/inventory/find_ec2_security_groups.py +48 -42
- runbooks/inventory/find_landingzone_versions.py +4 -6
- runbooks/inventory/find_vpc_flow_logs.py +7 -9
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/inventory_modules.py +103 -91
- runbooks/inventory/list_cfn_stacks.py +9 -10
- runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
- runbooks/inventory/list_cfn_stackset_operations.py +79 -57
- runbooks/inventory/list_cfn_stacksets.py +8 -10
- runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
- runbooks/inventory/list_ds_directories.py +65 -53
- runbooks/inventory/list_ec2_availability_zones.py +2 -4
- runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
- runbooks/inventory/list_ec2_instances.py +23 -28
- runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
- runbooks/inventory/list_elbs_load_balancers.py +22 -20
- runbooks/inventory/list_enis_network_interfaces.py +26 -33
- runbooks/inventory/list_guardduty_detectors.py +2 -4
- runbooks/inventory/list_iam_policies.py +2 -4
- runbooks/inventory/list_iam_roles.py +5 -7
- runbooks/inventory/list_iam_saml_providers.py +4 -6
- runbooks/inventory/list_lambda_functions.py +38 -38
- runbooks/inventory/list_org_accounts.py +6 -8
- runbooks/inventory/list_org_accounts_users.py +55 -44
- runbooks/inventory/list_rds_db_instances.py +31 -33
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/list_route53_hosted_zones.py +3 -5
- runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
- runbooks/inventory/list_sns_topics.py +2 -4
- runbooks/inventory/list_ssm_parameters.py +4 -7
- runbooks/inventory/list_vpc_subnets.py +2 -4
- runbooks/inventory/list_vpcs.py +7 -10
- runbooks/inventory/mcp_inventory_validator.py +554 -468
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +63 -55
- runbooks/inventory/recover_cfn_stack_ids.py +7 -8
- runbooks/inventory/requirements.txt +0 -1
- runbooks/inventory/rich_inventory_display.py +35 -34
- runbooks/inventory/run_on_multi_accounts.py +3 -5
- runbooks/inventory/unified_validation_engine.py +281 -253
- runbooks/inventory/verify_ec2_security_groups.py +1 -1
- runbooks/inventory/vpc_analyzer.py +735 -697
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +384 -380
- runbooks/inventory/vpc_flow_analyzer.py +1 -1
- runbooks/main.py +49 -34
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/networking_cost_heatmap.py +29 -8
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_operations.py +646 -616
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +70 -66
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +86 -60
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +46 -41
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +50 -47
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +745 -704
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +461 -454
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +185 -160
- runbooks/vpc/mcp_no_eni_validator.py +680 -639
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1297 -1124
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.6.dist-info/METADATA +327 -0
- runbooks-1.1.6.dist-info/RECORD +489 -0
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -973
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.4.dist-info/METADATA +0 -800
- runbooks-1.1.4.dist-info/RECORD +0 -468
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
- {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]")
|