Better example and review changes

pull/48/head
Andrew Selivanov 6 years ago
parent c38fe6a3f4
commit 1fb41d8027

@ -165,7 +165,7 @@ class Diagram:
def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None: def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None:
"""Connect the two Nodes.""" """Connect the two Nodes."""
self.dot.edge(node.hashid, node2.hashid, **edge.to_dot()) self.dot.edge(node.hashid, node2.hashid, **edge.attrs())
def subgraph(self, dot: Digraph) -> None: def subgraph(self, dot: Digraph) -> None:
"""Create a subgraph for clustering""" """Create a subgraph for clustering"""
@ -403,7 +403,7 @@ class Edge:
reverse: bool = False, reverse: bool = False,
label: str = "", label: str = "",
color: str = "", color: str = "",
style: str = "" style: str = "",
): ):
"""Edge represents an edge between two nodes. """Edge represents an edge between two nodes.
@ -420,9 +420,9 @@ class Edge:
self.node = node self.node = node
self.forward = forward self.forward = forward
self.reverse = reverse self.reverse = reverse
self.label = label
self.color = color # graphviz complains about using label for edges, so replacing it with xlabel
self.style = style self._attrs = {"xlabel": label, "color": color, "style": style}
def __sub__(self, other: Union["Node", "Edge", List["Node"]]): def __sub__(self, other: Union["Node", "Edge", List["Node"]]):
"""Implement Self - Node or Edge and Self - [Nodes]""" """Implement Self - Node or Edge and Self - [Nodes]"""
@ -454,15 +454,12 @@ class Edge:
result = [] result = []
for o in other: for o in other:
if isinstance(o, Edge): if isinstance(o, Edge):
o.color = self.color
o.label = self.label
o.style = self.style
o.forward = forward if forward is not None else o.forward o.forward = forward if forward is not None else o.forward
o.reverse = forward if forward is not None else o.reverse o.reverse = forward if forward is not None else o.reverse
self._attrs = o._attrs.copy()
result.append(o) result.append(o)
else: else:
result.append(Edge(o, forward=forward, reverse=reverse, result.append(Edge(o, forward=forward, reverse=reverse, **self._attrs))
color=self.color, label=self.label, style=self.style))
return result return result
def connect(self, other: Union["Node", "Edge", List["Node"]]): def connect(self, other: Union["Node", "Edge", List["Node"]]):
@ -471,9 +468,7 @@ class Edge:
self.node.connect(node, self) self.node.connect(node, self)
return other return other
elif isinstance(other, Edge): elif isinstance(other, Edge):
self.label = other.label self._attrs = other._attrs.copy()
self.color = other.color
self.style = other.style
return self return self
else: else:
if self.node is not None: if self.node is not None:
@ -482,23 +477,17 @@ class Edge:
self.node = other self.node = other
return self return self
def to_dot(self) -> Dict: def attrs(self) -> Dict:
dot = {}
if self.forward and self.reverse: if self.forward and self.reverse:
dot['dir'] = 'both' direction = 'both'
elif self.forward: elif self.forward:
dot['dir'] = 'forward' direction = 'forward'
elif self.reverse: elif self.reverse:
dot['dir'] = 'back' direction = 'back'
else: else:
dot['dir'] = 'none' direction = 'none'
if self.label:
dot['label'] = self.label return {**self._attrs, 'dir': direction}
if self.color:
dot['color'] = self.color
if self.style:
dot['style'] = self.style
return dot
Group = Cluster Group = Cluster

@ -213,6 +213,49 @@ with Diagram("Advanced Web Service with On-Premise", show=False):
![advanced web service with on-premise diagram](/img/advanced_web_service_with_on-premise.png) ![advanced web service with on-premise diagram](/img/advanced_web_service_with_on-premise.png)
## Advanced Web Service with On-Premise (with colors and labels)
```python
from diagrams import Cluster, Diagram, Edge
from diagrams.onprem.analytics import Spark
from diagrams.onprem.compute import Server
from diagrams.onprem.database import PostgreSQL
from diagrams.onprem.inmemory import Redis
from diagrams.onprem.logging import Fluentd
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import Kafka
with Diagram(name="Advanced Web Service with On-Premise (colored)", show=False):
ingress = Nginx("ingress")
metrics = Prometheus("metric")
metrics << Edge(color="firebrick", style="dashed") << Grafana("monitoring")
with Cluster("Service Cluster"):
grpcsvc = [
Server("grpc1"),
Server("grpc2"),
Server("grpc3")]
with Cluster("Sessions HA"):
master = Redis("session")
master - Edge(color="brown", style="dashed") - Redis("replica") << Edge(label="collect") << metrics
grpcsvc >> Edge(color="brown") >> master
with Cluster("Database HA"):
master = PostgreSQL("users")
master - Edge(color="brown", style="dotted") - PostgreSQL("slave") << Edge(label="collect") << metrics
grpcsvc >> Edge(color="black") >> master
aggregator = Fluentd("logging")
aggregator >> Edge(label="parse") >> Kafka("stream") >> Edge(color="black", style="bold") >> Spark("analytics")
ingress >> Edge(color="darkgreen") << grpcsvc >> Edge(color="darkorange") >> aggregator
```
![advanced web service with on-premise diagram](/img/advanced_web_service_with_on-premise_colored.png)
## RabbitMQ Consumers with Custom Nodes ## RabbitMQ Consumers with Custom Nodes
```python ```python
@ -243,26 +286,3 @@ with Diagram("Broker Consumers", show=False):
``` ```
![rabbitmq consumers diagram](/img/rabbitmq_consumers_diagram.png) ![rabbitmq consumers diagram](/img/rabbitmq_consumers_diagram.png)
## Diagram with Custom Edges
```python
from diagrams import Edge
from diagrams.aws.compute import EC2
# line
[EC2("node3"), EC2("node4")] - Edge(color='red', label='label1', style='dotted') - EC2("node")
# list of nodes, one directional
[EC2("node3"), EC2("node4")] >> Edge(color='red', label='label1', style='dotted') >> EC2("node")
[EC2("node3"), EC2("node4")] << Edge(color='green', label='label2', style='dashed') << EC2("node")
# both directional
EC2("node") << Edge(color='blue', label='label3', style='bold') >> EC2("node")
# loop
node = EC2("node")
node >> Edge(color='pink', label='label4', style='solid') << node
```
![custom edges diagram](/img/custom_edges_diagram.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Loading…
Cancel
Save