terraformgraph 1.0.1__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.
- terraformgraph/__init__.py +19 -0
- terraformgraph/__main__.py +6 -0
- terraformgraph/aggregator.py +396 -0
- terraformgraph/config/aggregation_rules.yaml +132 -0
- terraformgraph/config/logical_connections.yaml +183 -0
- terraformgraph/config_loader.py +55 -0
- terraformgraph/icons.py +795 -0
- terraformgraph/layout.py +239 -0
- terraformgraph/main.py +194 -0
- terraformgraph/parser.py +341 -0
- terraformgraph/renderer.py +1134 -0
- terraformgraph-1.0.1.dist-info/METADATA +161 -0
- terraformgraph-1.0.1.dist-info/RECORD +17 -0
- terraformgraph-1.0.1.dist-info/WHEEL +5 -0
- terraformgraph-1.0.1.dist-info/entry_points.txt +2 -0
- terraformgraph-1.0.1.dist-info/licenses/LICENSE +21 -0
- terraformgraph-1.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Logical connections between services for diagram rendering
|
|
2
|
+
# Format: source -> target -> connection properties
|
|
3
|
+
|
|
4
|
+
connections:
|
|
5
|
+
- source: cloudfront
|
|
6
|
+
target: s3
|
|
7
|
+
label: "Origin"
|
|
8
|
+
type: data_flow
|
|
9
|
+
|
|
10
|
+
- source: cloudfront
|
|
11
|
+
target: alb
|
|
12
|
+
label: "Origin"
|
|
13
|
+
type: data_flow
|
|
14
|
+
|
|
15
|
+
- source: waf
|
|
16
|
+
target: cloudfront
|
|
17
|
+
label: "Protect"
|
|
18
|
+
type: default
|
|
19
|
+
|
|
20
|
+
- source: waf
|
|
21
|
+
target: alb
|
|
22
|
+
label: "Protect"
|
|
23
|
+
type: default
|
|
24
|
+
|
|
25
|
+
- source: route53
|
|
26
|
+
target: cloudfront
|
|
27
|
+
label: "DNS"
|
|
28
|
+
type: default
|
|
29
|
+
|
|
30
|
+
- source: route53
|
|
31
|
+
target: alb
|
|
32
|
+
label: "DNS"
|
|
33
|
+
type: default
|
|
34
|
+
|
|
35
|
+
- source: acm
|
|
36
|
+
target: cloudfront
|
|
37
|
+
label: "TLS"
|
|
38
|
+
type: default
|
|
39
|
+
|
|
40
|
+
- source: acm
|
|
41
|
+
target: alb
|
|
42
|
+
label: "TLS"
|
|
43
|
+
type: default
|
|
44
|
+
|
|
45
|
+
- source: alb
|
|
46
|
+
target: ecs
|
|
47
|
+
label: "Route"
|
|
48
|
+
type: data_flow
|
|
49
|
+
|
|
50
|
+
- source: alb
|
|
51
|
+
target: ec2
|
|
52
|
+
label: "Route"
|
|
53
|
+
type: data_flow
|
|
54
|
+
|
|
55
|
+
- source: alb
|
|
56
|
+
target: lambda
|
|
57
|
+
label: "Route"
|
|
58
|
+
type: data_flow
|
|
59
|
+
|
|
60
|
+
- source: ecs
|
|
61
|
+
target: dynamodb
|
|
62
|
+
label: "Read/Write"
|
|
63
|
+
type: data_flow
|
|
64
|
+
|
|
65
|
+
- source: ecs
|
|
66
|
+
target: s3
|
|
67
|
+
label: "Read/Write"
|
|
68
|
+
type: data_flow
|
|
69
|
+
|
|
70
|
+
- source: ecs
|
|
71
|
+
target: rds
|
|
72
|
+
label: "Read/Write"
|
|
73
|
+
type: data_flow
|
|
74
|
+
|
|
75
|
+
- source: ecs
|
|
76
|
+
target: elasticache
|
|
77
|
+
label: "Cache"
|
|
78
|
+
type: data_flow
|
|
79
|
+
|
|
80
|
+
- source: ecs
|
|
81
|
+
target: sqs
|
|
82
|
+
label: "Queue"
|
|
83
|
+
type: trigger
|
|
84
|
+
|
|
85
|
+
- source: ecs
|
|
86
|
+
target: sns
|
|
87
|
+
label: "Publish"
|
|
88
|
+
type: trigger
|
|
89
|
+
|
|
90
|
+
- source: lambda
|
|
91
|
+
target: dynamodb
|
|
92
|
+
label: "Read/Write"
|
|
93
|
+
type: data_flow
|
|
94
|
+
|
|
95
|
+
- source: lambda
|
|
96
|
+
target: s3
|
|
97
|
+
label: "Read/Write"
|
|
98
|
+
type: data_flow
|
|
99
|
+
|
|
100
|
+
- source: lambda
|
|
101
|
+
target: sqs
|
|
102
|
+
label: "Process"
|
|
103
|
+
type: trigger
|
|
104
|
+
|
|
105
|
+
- source: sqs
|
|
106
|
+
target: lambda
|
|
107
|
+
label: "Trigger"
|
|
108
|
+
type: trigger
|
|
109
|
+
|
|
110
|
+
- source: sns
|
|
111
|
+
target: sqs
|
|
112
|
+
label: "Subscribe"
|
|
113
|
+
type: trigger
|
|
114
|
+
|
|
115
|
+
- source: sns
|
|
116
|
+
target: lambda
|
|
117
|
+
label: "Trigger"
|
|
118
|
+
type: trigger
|
|
119
|
+
|
|
120
|
+
- source: eventbridge
|
|
121
|
+
target: lambda
|
|
122
|
+
label: "Trigger"
|
|
123
|
+
type: trigger
|
|
124
|
+
|
|
125
|
+
- source: eventbridge
|
|
126
|
+
target: sqs
|
|
127
|
+
label: "Route"
|
|
128
|
+
type: trigger
|
|
129
|
+
|
|
130
|
+
- source: kms
|
|
131
|
+
target: s3
|
|
132
|
+
label: "Encrypt"
|
|
133
|
+
type: encrypt
|
|
134
|
+
|
|
135
|
+
- source: kms
|
|
136
|
+
target: dynamodb
|
|
137
|
+
label: "Encrypt"
|
|
138
|
+
type: encrypt
|
|
139
|
+
|
|
140
|
+
- source: kms
|
|
141
|
+
target: sqs
|
|
142
|
+
label: "Encrypt"
|
|
143
|
+
type: encrypt
|
|
144
|
+
|
|
145
|
+
- source: kms
|
|
146
|
+
target: sns
|
|
147
|
+
label: "Encrypt"
|
|
148
|
+
type: encrypt
|
|
149
|
+
|
|
150
|
+
- source: kms
|
|
151
|
+
target: secrets_manager
|
|
152
|
+
label: "Encrypt"
|
|
153
|
+
type: encrypt
|
|
154
|
+
|
|
155
|
+
- source: secrets_manager
|
|
156
|
+
target: ecs
|
|
157
|
+
label: "Inject"
|
|
158
|
+
type: default
|
|
159
|
+
|
|
160
|
+
- source: secrets_manager
|
|
161
|
+
target: lambda
|
|
162
|
+
label: "Inject"
|
|
163
|
+
type: default
|
|
164
|
+
|
|
165
|
+
- source: cognito
|
|
166
|
+
target: api_gateway
|
|
167
|
+
label: "Auth"
|
|
168
|
+
type: default
|
|
169
|
+
|
|
170
|
+
- source: cognito
|
|
171
|
+
target: alb
|
|
172
|
+
label: "Auth"
|
|
173
|
+
type: default
|
|
174
|
+
|
|
175
|
+
- source: api_gateway
|
|
176
|
+
target: lambda
|
|
177
|
+
label: "Invoke"
|
|
178
|
+
type: trigger
|
|
179
|
+
|
|
180
|
+
- source: step_functions
|
|
181
|
+
target: lambda
|
|
182
|
+
label: "Orchestrate"
|
|
183
|
+
type: trigger
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Configuration loader for Terraform Diagram Generator."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
import yaml
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ConfigLoader:
|
|
10
|
+
"""Loads configuration from YAML files with fallback to defaults."""
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
aggregation_rules_path: Optional[Path] = None,
|
|
15
|
+
logical_connections_path: Optional[Path] = None
|
|
16
|
+
):
|
|
17
|
+
self._config_dir = Path(__file__).parent / "config"
|
|
18
|
+
self._aggregation_rules_path = aggregation_rules_path or self._config_dir / "aggregation_rules.yaml"
|
|
19
|
+
self._logical_connections_path = logical_connections_path or self._config_dir / "logical_connections.yaml"
|
|
20
|
+
|
|
21
|
+
self._aggregation_rules: Optional[Dict[str, Any]] = None
|
|
22
|
+
self._logical_connections: Optional[List[Dict[str, Any]]] = None
|
|
23
|
+
|
|
24
|
+
def get_aggregation_rules(self) -> Dict[str, Any]:
|
|
25
|
+
"""Load and return aggregation rules."""
|
|
26
|
+
if self._aggregation_rules is None:
|
|
27
|
+
self._aggregation_rules = self._load_yaml(self._aggregation_rules_path)
|
|
28
|
+
return self._aggregation_rules
|
|
29
|
+
|
|
30
|
+
def get_logical_connections(self) -> List[Dict[str, Any]]:
|
|
31
|
+
"""Load and return logical connections."""
|
|
32
|
+
if self._logical_connections is None:
|
|
33
|
+
data = self._load_yaml(self._logical_connections_path)
|
|
34
|
+
self._logical_connections = data.get("connections", [])
|
|
35
|
+
return self._logical_connections
|
|
36
|
+
|
|
37
|
+
def _load_yaml(self, path: Path) -> Dict[str, Any]:
|
|
38
|
+
"""Load YAML file and return parsed content."""
|
|
39
|
+
if not path.exists():
|
|
40
|
+
raise FileNotFoundError(f"Configuration file not found: {path}")
|
|
41
|
+
|
|
42
|
+
with open(path, "r") as f:
|
|
43
|
+
return yaml.safe_load(f) or {}
|
|
44
|
+
|
|
45
|
+
def get_flat_aggregation_rules(self) -> Dict[str, Dict[str, Any]]:
|
|
46
|
+
"""Return aggregation rules flattened to service_name -> config mapping."""
|
|
47
|
+
rules = self.get_aggregation_rules()
|
|
48
|
+
flat = {}
|
|
49
|
+
for category, services in rules.items():
|
|
50
|
+
for service_name, config in services.items():
|
|
51
|
+
flat[service_name] = {
|
|
52
|
+
"category": category,
|
|
53
|
+
**config
|
|
54
|
+
}
|
|
55
|
+
return flat
|