@ -0,0 +1,21 @@
|
||||
# ide & editor
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# compiled & binary
|
||||
*.egg-info/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.egg-info
|
||||
|
||||
# graphviz
|
||||
*.gv*
|
||||
|
||||
# dist
|
||||
dist
|
||||
|
||||
# node modules
|
||||
node_modules
|
||||
|
||||
# trash
|
||||
.DS_Store
|
||||
@ -0,0 +1,33 @@
|
||||
# Contributiton Guide
|
||||
|
||||
You shouldn't edit the node class files (all files under `diagram` directory) by yourself.
|
||||
|
||||
## Resources
|
||||
|
||||
### Update nodes
|
||||
|
||||
All node classes was auto-generated from image resource files. For example, the `diagram.aws.compute.EC2` class was auto-generated based on `resources/aws/compute/ec2.png` image resource file.
|
||||
|
||||
So, if you want to add new node resources or update existing node resources, you can just add or update the image files in `resources/<provider>/<type>/<image>`.
|
||||
|
||||
Then just run the `./autogen.sh` to generate the added or updated node classes.
|
||||
|
||||
> IMPORTANT NOTE: To run `autogen.sh`, you need [round](https://github.com/mingrammer/round) and [inkscape](https://inkscape.org/ko/release) command lines that are used for clearning the image resource filenames.
|
||||
>
|
||||
> macOS users can download the inkscape via Homebrew.
|
||||
|
||||
### Update Aliases
|
||||
|
||||
Some node classes have alias. For example, `aws.compute.ECS` class is an alias of `aws.compute.ElasticContainerService` class. Aliases also were auto-generated from `ALIASES` map in [config.py](config.py).
|
||||
|
||||
So, if you want to add new aliases or update existing aliases, you can just add or update the `ALIASES` map in [config.py](config.py).
|
||||
|
||||
Then just run the `./autogen.sh` to generate the added or updated aliases.
|
||||
|
||||
> IMPORTANT NOTE: To run `autogen.sh`, you need [round](https://github.com/mingrammer/round) and [inkscape](https://inkscape.org/ko/release) command lines that are used for clearning the image resource filenames.
|
||||
|
||||
## Run Tests
|
||||
|
||||
```shell
|
||||
$ python -m unittest tests/*.py -v
|
||||
```
|
||||
@ -0,0 +1,40 @@
|
||||
<p align="center">
|
||||
<img src="assets/img/diagrams.png"/>
|
||||
</p>
|
||||
|
||||
<h1 align="center">Diagrams</h1>
|
||||
<p align="center">
|
||||
Diagram as Code
|
||||
</p>
|
||||
|
||||
Diagrams lets you to draw the cloud system architectures in Python code.
|
||||
|
||||
It was born for prototyping a new system architecture without any design tools. You can also describe or visualize the existing system architecture as well.
|
||||
|
||||
> NOTE: It does not control the actual cloud resources like cloudformation or terraform, but just for drawing the system architecutrre.
|
||||
|
||||
`Diagram as Code` allows you to track the architecture diagram changes on any version control system (same as source code tracking)
|
||||
|
||||
Diagrams currently supports three major cloud providers: `AWS`, `Azure`, `GCP`.
|
||||
|
||||
> Let me know if you are using diagram! I'll add you in showcase page. (I'm working on it!) :)
|
||||
|
||||
## Getting Started
|
||||
|
||||
It uses [Graphviz](https://www.graphviz.org/) to render the diagram, so you need to [install Graphviz](https://graphviz.gitlab.io/download/) to use **diagrams**. After installing graphviz (or already have it), install the **diagrams**.
|
||||
|
||||
```shell
|
||||
$ pip install diagrams
|
||||
```
|
||||
|
||||
You can start with [quick start](https://diagram.mingrammer.com/docs/installattion/#quick-start). And you can find [guides](https://diagram.mingrammer.com/diagram) for more details.
|
||||
|
||||
## Examples
|
||||
|
||||
## ContributingF
|
||||
|
||||
To contribute to diagram, check out [CONTRIBUTING](CONTRIBUTING.md).
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE.md)
|
||||
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
app_root_dir="diagrams"
|
||||
|
||||
# NOTE: azure icon set is not latest version
|
||||
providers=("aws" "azure" "gcp")
|
||||
|
||||
if ! [ -x "$(command -v round)" ]; then
|
||||
echo 'round is not installed'
|
||||
fi
|
||||
|
||||
if ! [ -x "$(command -v inkscape)" ]; then
|
||||
echo 'inkscape is not installed'
|
||||
fi
|
||||
|
||||
# preprocess the resources
|
||||
for pvd in "${providers[@]}"; do
|
||||
# convert the svg to png for azure provider
|
||||
if [ "$pvd" = "azure" ]; then
|
||||
echo "converting the svg to png for provider '$pvd'"
|
||||
python -m scripts.resource svg2png "$pvd"
|
||||
fi
|
||||
echo "cleaning the resource names for provider '$pvd'"
|
||||
python -m scripts.resource clean "$pvd"
|
||||
# round the all png images for aws provider
|
||||
if [ "$pvd" = "aws" ]; then
|
||||
echo "rounding the resources for provider '$pvd'"
|
||||
python -m scripts.resource round "$pvd"
|
||||
fi
|
||||
done
|
||||
|
||||
# generate the module classes
|
||||
for pvd in "${providers[@]}"; do
|
||||
echo "generating the modules for provider '$pvd'"
|
||||
python -m scripts.generate "$pvd"
|
||||
done
|
||||
|
||||
# run black
|
||||
echo "linting the all the diagram modules"
|
||||
black "$app_root_dir"/**/*.py
|
||||
@ -0,0 +1,148 @@
|
||||
# fmt: off
|
||||
|
||||
#########################
|
||||
# Application #
|
||||
#########################
|
||||
|
||||
APP_NAME = "diagrams"
|
||||
|
||||
DIR_APP_ROOT = "diagrams"
|
||||
DIR_RESOURCE = "resources"
|
||||
DIR_TEMPLATE = "templates"
|
||||
|
||||
PROVIDERS = ("base", "aws", "azure", "gcp")
|
||||
|
||||
#########################
|
||||
# Resource Processing #
|
||||
#########################
|
||||
|
||||
CMD_ROUND = "round"
|
||||
CMD_ROUND_OPTS = ("-w",)
|
||||
CMD_SVG2PNG = "inkscape"
|
||||
CMD_SVG2PNG_OPTS = ("-z", "-w", "256", "-h", "256", "--export-type", "png")
|
||||
|
||||
FILE_PREFIXES = {
|
||||
"aws": ("amazon-", "aws-"),
|
||||
"azure": ("azure-",),
|
||||
"gcp": ("cloud-",)
|
||||
}
|
||||
|
||||
#########################
|
||||
# Class Auto Generation #
|
||||
#########################
|
||||
|
||||
TMPL_MODULE = "module.tmpl"
|
||||
|
||||
UPPER_WORDS = {
|
||||
"aws": ("aws", "api", "ebs", "ec2", "efs", "emr", "rds", "ml", "mq", "vpc", "waf"),
|
||||
"azure": ("ad", "b2c", "ai", "api", "cdn", "ddos", "dns", "fxt", "hana", "hd", "id", "sap", "sql", "vm"),
|
||||
"gcp": ("gcp", "ai", "api", "cdn", "dns", "gke", "gpu", "ml", "nat", "os", "sdk", "sql", "tpu", "vpn"),
|
||||
}
|
||||
|
||||
# TODO: check if the classname exists
|
||||
ALIASES = {
|
||||
"aws": {
|
||||
"analytics": {
|
||||
"ElasticsearchService": "ES",
|
||||
},
|
||||
"compute": {
|
||||
"ApplicationAutoScaling": "AutoScaling",
|
||||
"EC2ContainerRegistry": "ECR",
|
||||
"ElasticBeanstalk": "EB",
|
||||
"ElasticContainerService": "ECS",
|
||||
"ElasticKubernetesService": "EKS",
|
||||
"ServerlessApplicationRepository": "SAR",
|
||||
},
|
||||
"database": {
|
||||
"DatabaseMigrationService": "DMS",
|
||||
"DocumentdbMongodbCompatibility": "DocumentDB",
|
||||
"Database": "DB",
|
||||
"Dynamodb": "DDB",
|
||||
"Elasticache": "ElastiCache",
|
||||
"QuantumLedgerDatabaseQldb": "QLDB",
|
||||
},
|
||||
"devtools": {
|
||||
"CommandLineInterface": "CLI",
|
||||
"DeveloperTools": "DevTools",
|
||||
},
|
||||
"integration": {
|
||||
"SimpleNotificationServiceSns": "SNS",
|
||||
"SimpleQueueServiceSqs": "SQS",
|
||||
"StepFunctions": "SF",
|
||||
},
|
||||
"iot": {
|
||||
"Freertos": "FreeRTOS",
|
||||
},
|
||||
"migration": {
|
||||
"ApplicationDiscoveryService": "ADS",
|
||||
"CloudendureMigration": "CEM",
|
||||
"DatabaseMigrationService": "DMS",
|
||||
"MigrationAndTransfer": "MAT",
|
||||
"ServerMigrationService": "SMS",
|
||||
},
|
||||
"ml": {
|
||||
"DeepLearningContainers": "DLC",
|
||||
},
|
||||
"network": {
|
||||
"Cloudfront": "CF",
|
||||
"ElasticLoadBalancing": "ELB",
|
||||
"GlobalAccelerator": "GAX",
|
||||
},
|
||||
"security": {
|
||||
"CertificateManager": "ACM",
|
||||
"Cloudhsm": "CloudHSM",
|
||||
"DirectoryService": "DS",
|
||||
"FirewallManager": "FMS",
|
||||
"IdentityAndAccessManagementIam": "IAM",
|
||||
"KeyManagementService": "KMS",
|
||||
"ResourceAccessManager": "RAM",
|
||||
},
|
||||
"storage": {
|
||||
"CloudendureDisasterRecovery": "CDR",
|
||||
"ElasticBlockStoreEBS": "EBS",
|
||||
"ElasticFileSystemEFS": "EFS",
|
||||
"Fsx": "FSx",
|
||||
"SimpleStorageServiceS3": "S3",
|
||||
},
|
||||
},
|
||||
"azure": {
|
||||
"compute": {
|
||||
"ContainerRegistries": "ACR",
|
||||
"KubernetesServices": "AKS",
|
||||
},
|
||||
},
|
||||
"gcp": {
|
||||
"analytics": {
|
||||
"Bigquery": "BigQuery",
|
||||
"Pubsub": "PubSub",
|
||||
},
|
||||
"compute": {
|
||||
"AppEngine": "GAE",
|
||||
"Functions": "GCF",
|
||||
"ComputeEngine": "GCE",
|
||||
"KubernetesEngine": "GKE",
|
||||
},
|
||||
"database": {
|
||||
"Bigtable": "BigTable",
|
||||
},
|
||||
"devtools": {
|
||||
"ContainerRegistry": "GCR",
|
||||
},
|
||||
"ml": {
|
||||
"Automl": "AutoML",
|
||||
"NaturalLanguageAPI": "NLAPI",
|
||||
"SpeechToText": "STT",
|
||||
"TextToSpeech": "TTS",
|
||||
},
|
||||
"network": {
|
||||
"VirtualPrivateCloud": "VPC"
|
||||
},
|
||||
"security": {
|
||||
"KeyManagementService": "KMS",
|
||||
"SecurityCommandCenter": "SCC",
|
||||
},
|
||||
"storage": {
|
||||
"Storage": "GCS",
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -0,0 +1,366 @@
|
||||
import contextvars
|
||||
import os
|
||||
from hashlib import md5
|
||||
from pathlib import Path
|
||||
from random import getrandbits
|
||||
from typing import List, Union
|
||||
|
||||
from graphviz import Digraph
|
||||
|
||||
__version__ = "0.1.0"
|
||||
|
||||
# Global context for a diagrams and a cluster.
|
||||
#
|
||||
# Theses global contexts are for letting the clusters and nodes know
|
||||
# where context they are belong to. So the all clusters and nodes does
|
||||
# not need to specify the current diagrams or cluster via parameters.
|
||||
__diagram = contextvars.ContextVar("diagrams")
|
||||
__cluster = contextvars.ContextVar("cluster")
|
||||
|
||||
|
||||
def getdiagram():
|
||||
try:
|
||||
return __diagram.get()
|
||||
except LookupError:
|
||||
return None
|
||||
|
||||
|
||||
def setdiagram(diagram):
|
||||
__diagram.set(diagram)
|
||||
|
||||
|
||||
def getcluster():
|
||||
try:
|
||||
return __cluster.get()
|
||||
except LookupError:
|
||||
return None
|
||||
|
||||
|
||||
def setcluster(cluster):
|
||||
__cluster.set(cluster)
|
||||
|
||||
|
||||
class Diagram:
|
||||
__directions = ("TB", "BT", "LR", "RL")
|
||||
__outformats = ("png", "jpg", "svg", "pdf")
|
||||
|
||||
# fmt: off
|
||||
_default_graph_attrs = {
|
||||
"pad": "2.0",
|
||||
"splines": "ortho",
|
||||
"nodesep": "0.60",
|
||||
"ranksep": "0.75",
|
||||
"fontname": "Sans-Serif",
|
||||
"fontsize": "15",
|
||||
"fontcolor": "#2D3436",
|
||||
}
|
||||
_default_node_attrs = {
|
||||
"shape": "box",
|
||||
"style": "rounded",
|
||||
"fixedsize": "true",
|
||||
"width": "1.4",
|
||||
"height": "1.4",
|
||||
"labelloc": "b",
|
||||
"imagepos": "tc",
|
||||
"imagescale": "true",
|
||||
"fontname": "Sans-Serif",
|
||||
"fontsize": "13",
|
||||
"fontcolor": "#2D3436",
|
||||
}
|
||||
_default_edge_attrs = {
|
||||
"color": "#7B8894",
|
||||
}
|
||||
|
||||
# fmt: on
|
||||
|
||||
# TODO: Label position option
|
||||
# TODO: Save directory option (filename + directory?)
|
||||
def __init__(self, name: str = "", direction: str = "LR", outformat: str = "png", show: bool = True):
|
||||
"""Diagram represents a global diagrams context.
|
||||
|
||||
:param name: Diagram name. It will be used for output filename.
|
||||
:param direction: Data flow direction. Default is 'left to right'.
|
||||
:param outformat: Output file format. Default is 'png'.
|
||||
:param show: Open generated image after save if true, just only save otherwise.
|
||||
"""
|
||||
self.name = name
|
||||
|
||||
self.filename = "_".join(self.name.split()).lower()
|
||||
self.dot = Digraph(self.name, filename=self.filename)
|
||||
|
||||
# Set attributes.
|
||||
for k, v in self._default_graph_attrs.items():
|
||||
self.dot.graph_attr[k] = v
|
||||
self.dot.graph_attr["label"] = self.name
|
||||
for k, v in self._default_node_attrs.items():
|
||||
self.dot.node_attr[k] = v
|
||||
for k, v in self._default_edge_attrs.items():
|
||||
self.dot.edge_attr[k] = v
|
||||
|
||||
if not self._validate_direction(direction):
|
||||
raise ValueError(f'"{direction}" is not a valid direction')
|
||||
self.dot.graph_attr["rankdir"] = direction
|
||||
|
||||
if not self._validate_outformat(outformat):
|
||||
raise ValueError(f'"{outformat}" is not a valid output format')
|
||||
self.outformat = outformat
|
||||
|
||||
self.show = show
|
||||
|
||||
def __enter__(self):
|
||||
setdiagram(self)
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
self.render()
|
||||
# Remove the graphviz file leaving only the image.
|
||||
os.remove(self.filename)
|
||||
setdiagram(None)
|
||||
|
||||
def _validate_direction(self, direction: str) -> bool:
|
||||
direction = direction.upper()
|
||||
for v in self.__directions:
|
||||
if v == direction:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _validate_outformat(self, outformat: str) -> bool:
|
||||
outformat = outformat.lower()
|
||||
for v in self.__outformats:
|
||||
if v == outformat:
|
||||
return True
|
||||
return False
|
||||
|
||||
def node(self, hashid: str, label: str, **attrs) -> None:
|
||||
"""Create a new node."""
|
||||
self.dot.node(hashid, label=label, **attrs)
|
||||
|
||||
def connect(self, node: "Node", node2: "Node", directed=True) -> None:
|
||||
"""Connect the two Nodes."""
|
||||
attrs = {"dir": "none"} if not directed else {}
|
||||
self.dot.edge(node.hashid, node2.hashid, **attrs)
|
||||
|
||||
def reverse(self, node: "Node", node2: "Node", directed=True) -> None:
|
||||
"""Connect the two Nodes in reverse direction."""
|
||||
attrs = {"dir": "none"} if not directed else {"dir": "back"}
|
||||
self.dot.edge(node.hashid, node2.hashid, **attrs)
|
||||
|
||||
def subgraph(self, dot: Digraph) -> None:
|
||||
"""Create a subgraph for clustering"""
|
||||
self.dot.subgraph(dot)
|
||||
|
||||
def render(self) -> None:
|
||||
self.dot.render(format=self.outformat, view=self.show)
|
||||
|
||||
|
||||
class Cluster:
|
||||
__directions = ("TB", "BT", "LR", "RL")
|
||||
__bgcolors = ("#E5F5FD", "#EBF3E7", "#ECE8F6", "#FDF7E3")
|
||||
|
||||
# fmt: off
|
||||
_default_graph_attrs = {
|
||||
"shape": "box",
|
||||
"style": "rounded",
|
||||
"labeljust": "l",
|
||||
"pencolor": "#AEB6BE",
|
||||
"fontname": "Sans-Serif",
|
||||
"fontsize": "12",
|
||||
}
|
||||
|
||||
# fmt: on
|
||||
|
||||
# FIXME:
|
||||
# Cluster direction does not work now. Graphviz couldn't render
|
||||
# correctly for a subgraph that has a different rank direction.
|
||||
def __init__(self, label: str = "cluster", direction: str = "LR"):
|
||||
"""Cluster represents a cluster context.
|
||||
|
||||
:param label: Cluster label.
|
||||
:param direction: Data flow direction. Default is 'left to right'.
|
||||
"""
|
||||
self.label = label
|
||||
self.name = "cluster_" + self.label
|
||||
|
||||
self.dot = Digraph(self.name)
|
||||
|
||||
# Set attributes.
|
||||
for k, v in self._default_graph_attrs.items():
|
||||
self.dot.graph_attr[k] = v
|
||||
self.dot.graph_attr["label"] = self.label
|
||||
|
||||
if not self._validate_direction(direction):
|
||||
raise ValueError(f'"{direction}" is not a valid direction')
|
||||
self.dot.graph_attr["rankdir"] = direction
|
||||
|
||||
# Node must be belong to a diagrams.
|
||||
self._diagram = getdiagram()
|
||||
if self._diagram is None:
|
||||
raise EnvironmentError("Global diagrams context not set up")
|
||||
self._parent = getcluster()
|
||||
|
||||
# Set cluster depth for distinguishing the background color
|
||||
self.depth = self._parent.depth + 1 if self._parent else 0
|
||||
coloridx = self.depth % len(self.__bgcolors)
|
||||
self.dot.graph_attr["bgcolor"] = self.__bgcolors[coloridx]
|
||||
|
||||
def __enter__(self):
|
||||
setcluster(self)
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
if self._parent:
|
||||
self._parent.subgraph(self.dot)
|
||||
else:
|
||||
self._diagram.subgraph(self.dot)
|
||||
setcluster(self._parent)
|
||||
|
||||
def _validate_direction(self, direction: str):
|
||||
direction = direction.upper()
|
||||
for v in self.__directions:
|
||||
if v == direction:
|
||||
return True
|
||||
return False
|
||||
|
||||
def node(self, hashid: str, label: str, **attrs) -> None:
|
||||
"""Create a new node in the cluster."""
|
||||
self.dot.node(hashid, label=label, **attrs)
|
||||
|
||||
def subgraph(self, dot: Digraph) -> None:
|
||||
self.dot.subgraph(dot)
|
||||
|
||||
|
||||
class Node:
|
||||
"""Node represents a node for a specific backend service."""
|
||||
|
||||
_provider = None
|
||||
_type = None
|
||||
|
||||
_icon_dir = None
|
||||
_icon = None
|
||||
|
||||
def __init__(self, label: str = ""):
|
||||
"""Node represents a system component.
|
||||
|
||||
:param label: Node label.
|
||||
"""
|
||||
# Generates a hash for identifying a node.
|
||||
self._hash = self._rand_hash()
|
||||
self.label = label
|
||||
|
||||
# fmt: off
|
||||
# If a node has an icon, increase the height slightly to avoid
|
||||
# that label being spanned between icon image and white space.
|
||||
self.attrs = {
|
||||
"shape": "none",
|
||||
"height": "1.6",
|
||||
"image": self._load_icon(),
|
||||
} if self._icon else {}
|
||||
# fmt: on
|
||||
|
||||
# Node must be belong to a diagrams.
|
||||
self._diagram = getdiagram()
|
||||
if self._diagram is None:
|
||||
raise EnvironmentError("Global diagrams context not set up")
|
||||
self._cluster = getcluster()
|
||||
|
||||
# If a node is in the cluster context, add it to cluster.
|
||||
if self._cluster:
|
||||
self._cluster.node(self._hash, self.label, **self.attrs)
|
||||
else:
|
||||
self._diagram.node(self._hash, self.label, **self.attrs)
|
||||
|
||||
def __repr__(self):
|
||||
_name = self.__class__.__name__
|
||||
return f"<{self._provider}.{self._type}.{_name}>"
|
||||
|
||||
def __sub__(self, other: Union["Node", List["Node"]]):
|
||||
"""Implement Self - Node and Self - [Nodes]"""
|
||||
if not isinstance(other, list):
|
||||
return self.connect(other, directed=False)
|
||||
for node in other:
|
||||
self.connect(node, directed=False)
|
||||
return other
|
||||
|
||||
def __rsub__(self, other: List["Node"]):
|
||||
"""
|
||||
Called for [Nodes] - Self because list of Nodes don't have
|
||||
__sub__ operators.
|
||||
"""
|
||||
self.__sub__(other)
|
||||
return self
|
||||
|
||||
def __rshift__(self, other: Union["Node", List["Node"]]):
|
||||
"""Implements Self >> Node and Self >> [Nodes]."""
|
||||
if not isinstance(other, list):
|
||||
return self.connect(other)
|
||||
for node in other:
|
||||
self.connect(node)
|
||||
return other
|
||||
|
||||
def __lshift__(self, other: Union["Node", List["Node"]]):
|
||||
"""Implements Self << Node and Self << [Nodes]."""
|
||||
if not isinstance(other, list):
|
||||
return self.reverse(other)
|
||||
for node in other:
|
||||
self.reverse(node)
|
||||
return other
|
||||
|
||||
def __rrshift__(self, other: List["Node"]):
|
||||
"""
|
||||
Called for [Nodes] >> Self because list of Nodes don't have
|
||||
__rshift__ operators.
|
||||
"""
|
||||
for node in other:
|
||||
node.connect(self)
|
||||
return self
|
||||
|
||||
def __rlshift__(self, other: List["Node"]):
|
||||
"""
|
||||
Called for [Nodes] << Self because list of Nodes don't have
|
||||
__lshift__ operators.
|
||||
"""
|
||||
for node in other:
|
||||
node.reverse(self)
|
||||
return self
|
||||
|
||||
@property
|
||||
def hashid(self):
|
||||
return self._hash
|
||||
|
||||
# TODO: option for adding flow description to the connection edge
|
||||
def connect(self, node: "Node", directed=True):
|
||||
"""Connect to other node.
|
||||
|
||||
:param node: Other node instance.
|
||||
:param directed: Whether the flow is directed or not.
|
||||
:return: Connected node.
|
||||
"""
|
||||
if not isinstance(node, Node):
|
||||
ValueError(f"{node} is not a valid Node")
|
||||
# An edge must be added on the global diagrams, not a cluster.
|
||||
self._diagram.connect(self, node, directed)
|
||||
return node
|
||||
|
||||
def reverse(self, node: "Node", directed=True):
|
||||
"""Connect to other node in reverse direction.
|
||||
|
||||
:param node: Other node instance.
|
||||
:param directed: Whether the flow is directed or not.
|
||||
:return: Connected node.
|
||||
"""
|
||||
if not isinstance(node, Node):
|
||||
ValueError(f"{node} is not a valid Node")
|
||||
# An edge must be added on the global diagrams, not a cluster.
|
||||
self._diagram.reverse(self, node, directed)
|
||||
return node
|
||||
|
||||
@staticmethod
|
||||
def _rand_hash():
|
||||
return md5(getrandbits(64).to_bytes(64, "big")).hexdigest()
|
||||
|
||||
def _load_icon(self):
|
||||
basedir = Path(os.path.abspath(os.path.dirname(__file__)))
|
||||
return os.path.join(basedir.parent, self._icon_dir, self._icon)
|
||||
|
||||
|
||||
Group = Cluster
|
||||
@ -0,0 +1,12 @@
|
||||
"""
|
||||
AWS provides a set of services for Amazon Web Service provider.
|
||||
"""
|
||||
|
||||
from diagrams import Node
|
||||
|
||||
|
||||
class _AWS(Node):
|
||||
_provider = "aws"
|
||||
_icon_dir = "resources/aws"
|
||||
|
||||
fontcolor = "#ffffff"
|
||||
@ -0,0 +1,77 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Analytics(_AWS):
|
||||
_type = "analytics"
|
||||
_icon_dir = "resources/aws/analytics"
|
||||
|
||||
|
||||
class Analytics(_Analytics):
|
||||
_icon = "analytics.png"
|
||||
|
||||
|
||||
class Athena(_Analytics):
|
||||
_icon = "athena.png"
|
||||
|
||||
|
||||
class Cloudsearch(_Analytics):
|
||||
_icon = "cloudsearch.png"
|
||||
|
||||
|
||||
class DataPipeline(_Analytics):
|
||||
_icon = "data-pipeline.png"
|
||||
|
||||
|
||||
class ElasticsearchService(_Analytics):
|
||||
_icon = "elasticsearch-service.png"
|
||||
|
||||
|
||||
class EMR(_Analytics):
|
||||
_icon = "emr.png"
|
||||
|
||||
|
||||
class Glue(_Analytics):
|
||||
_icon = "glue.png"
|
||||
|
||||
|
||||
class KinesisDataAnalytics(_Analytics):
|
||||
_icon = "kinesis-data-analytics.png"
|
||||
|
||||
|
||||
class KinesisDataFirehose(_Analytics):
|
||||
_icon = "kinesis-data-firehose.png"
|
||||
|
||||
|
||||
class KinesisDataStreams(_Analytics):
|
||||
_icon = "kinesis-data-streams.png"
|
||||
|
||||
|
||||
class KinesisVideoStreams(_Analytics):
|
||||
_icon = "kinesis-video-streams.png"
|
||||
|
||||
|
||||
class Kinesis(_Analytics):
|
||||
_icon = "kinesis.png"
|
||||
|
||||
|
||||
class LakeFormation(_Analytics):
|
||||
_icon = "lake-formation.png"
|
||||
|
||||
|
||||
class ManagedStreamingForKafka(_Analytics):
|
||||
_icon = "managed-streaming-for-kafka.png"
|
||||
|
||||
|
||||
class Quicksight(_Analytics):
|
||||
_icon = "quicksight.png"
|
||||
|
||||
|
||||
class Redshift(_Analytics):
|
||||
_icon = "redshift.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
ES = ElasticsearchService
|
||||
@ -0,0 +1,102 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Compute(_AWS):
|
||||
_type = "compute"
|
||||
_icon_dir = "resources/aws/compute"
|
||||
|
||||
|
||||
class ApplicationAutoScaling(_Compute):
|
||||
_icon = "application-auto-scaling.png"
|
||||
|
||||
|
||||
class Batch(_Compute):
|
||||
_icon = "batch.png"
|
||||
|
||||
|
||||
class Compute(_Compute):
|
||||
_icon = "compute.png"
|
||||
|
||||
|
||||
class EC2ContainerRegistry(_Compute):
|
||||
_icon = "ec2-container-registry.png"
|
||||
|
||||
|
||||
class EC2(_Compute):
|
||||
_icon = "ec2.png"
|
||||
|
||||
|
||||
class ElasticBeanstalk(_Compute):
|
||||
_icon = "elastic-beanstalk.png"
|
||||
|
||||
|
||||
class ElasticContainerService(_Compute):
|
||||
_icon = "elastic-container-service.png"
|
||||
|
||||
|
||||
class ElasticKubernetesService(_Compute):
|
||||
_icon = "elastic-kubernetes-service.png"
|
||||
|
||||
|
||||
class Fargate(_Compute):
|
||||
_icon = "fargate.png"
|
||||
|
||||
|
||||
class Lambda(_Compute):
|
||||
_icon = "lambda.png"
|
||||
|
||||
|
||||
class Lightsail(_Compute):
|
||||
_icon = "lightsail.png"
|
||||
|
||||
|
||||
class Outposts(_Compute):
|
||||
_icon = "outposts.png"
|
||||
|
||||
|
||||
class ServerlessApplicationRepository(_Compute):
|
||||
_icon = "serverless-application-repository.png"
|
||||
|
||||
|
||||
class ThinkboxDeadline(_Compute):
|
||||
_icon = "thinkbox-deadline.png"
|
||||
|
||||
|
||||
class ThinkboxDraft(_Compute):
|
||||
_icon = "thinkbox-draft.png"
|
||||
|
||||
|
||||
class ThinkboxFrost(_Compute):
|
||||
_icon = "thinkbox-frost.png"
|
||||
|
||||
|
||||
class ThinkboxKrakatoa(_Compute):
|
||||
_icon = "thinkbox-krakatoa.png"
|
||||
|
||||
|
||||
class ThinkboxSequoia(_Compute):
|
||||
_icon = "thinkbox-sequoia.png"
|
||||
|
||||
|
||||
class ThinkboxStoke(_Compute):
|
||||
_icon = "thinkbox-stoke.png"
|
||||
|
||||
|
||||
class ThinkboxXmesh(_Compute):
|
||||
_icon = "thinkbox-xmesh.png"
|
||||
|
||||
|
||||
class VmwareCloudOnAWS(_Compute):
|
||||
_icon = "vmware-cloud-on-aws.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
AutoScaling = ApplicationAutoScaling
|
||||
ECR = EC2ContainerRegistry
|
||||
EB = ElasticBeanstalk
|
||||
ECS = ElasticContainerService
|
||||
EKS = ElasticKubernetesService
|
||||
SAR = ServerlessApplicationRepository
|
||||
@ -0,0 +1,66 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Database(_AWS):
|
||||
_type = "database"
|
||||
_icon_dir = "resources/aws/database"
|
||||
|
||||
|
||||
class Aurora(_Database):
|
||||
_icon = "aurora.png"
|
||||
|
||||
|
||||
class DatabaseMigrationService(_Database):
|
||||
_icon = "database-migration-service.png"
|
||||
|
||||
|
||||
class Database(_Database):
|
||||
_icon = "database.png"
|
||||
|
||||
|
||||
class DocumentdbMongodbCompatibility(_Database):
|
||||
_icon = "documentdb-mongodb-compatibility.png"
|
||||
|
||||
|
||||
class Dynamodb(_Database):
|
||||
_icon = "dynamodb.png"
|
||||
|
||||
|
||||
class Elasticache(_Database):
|
||||
_icon = "elasticache.png"
|
||||
|
||||
|
||||
class Neptune(_Database):
|
||||
_icon = "neptune.png"
|
||||
|
||||
|
||||
class QuantumLedgerDatabaseQldb(_Database):
|
||||
_icon = "quantum-ledger-database-qldb.png"
|
||||
|
||||
|
||||
class RDSOnVmware(_Database):
|
||||
_icon = "rds-on-vmware.png"
|
||||
|
||||
|
||||
class RDS(_Database):
|
||||
_icon = "rds.png"
|
||||
|
||||
|
||||
class Redshift(_Database):
|
||||
_icon = "redshift.png"
|
||||
|
||||
|
||||
class Timestream(_Database):
|
||||
_icon = "timestream.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
DMS = DatabaseMigrationService
|
||||
DocumentDB = DocumentdbMongodbCompatibility
|
||||
DB = Database
|
||||
DDB = Dynamodb
|
||||
ElastiCache = Elasticache
|
||||
QLDB = QuantumLedgerDatabaseQldb
|
||||
@ -0,0 +1,58 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Devtools(_AWS):
|
||||
_type = "devtools"
|
||||
_icon_dir = "resources/aws/devtools"
|
||||
|
||||
|
||||
class CloudDevelopmentKit(_Devtools):
|
||||
_icon = "cloud-development-kit.png"
|
||||
|
||||
|
||||
class Cloud9(_Devtools):
|
||||
_icon = "cloud9.png"
|
||||
|
||||
|
||||
class Codebuild(_Devtools):
|
||||
_icon = "codebuild.png"
|
||||
|
||||
|
||||
class Codecommit(_Devtools):
|
||||
_icon = "codecommit.png"
|
||||
|
||||
|
||||
class Codedeploy(_Devtools):
|
||||
_icon = "codedeploy.png"
|
||||
|
||||
|
||||
class Codepipeline(_Devtools):
|
||||
_icon = "codepipeline.png"
|
||||
|
||||
|
||||
class Codestar(_Devtools):
|
||||
_icon = "codestar.png"
|
||||
|
||||
|
||||
class CommandLineInterface(_Devtools):
|
||||
_icon = "command-line-interface.png"
|
||||
|
||||
|
||||
class DeveloperTools(_Devtools):
|
||||
_icon = "developer-tools.png"
|
||||
|
||||
|
||||
class ToolsAndSdks(_Devtools):
|
||||
_icon = "tools-and-sdks.png"
|
||||
|
||||
|
||||
class XRay(_Devtools):
|
||||
_icon = "x-ray.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
CLI = CommandLineInterface
|
||||
DevTools = DeveloperTools
|
||||
@ -0,0 +1,47 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Integration(_AWS):
|
||||
_type = "integration"
|
||||
_icon_dir = "resources/aws/integration"
|
||||
|
||||
|
||||
class ApplicationIntegration(_Integration):
|
||||
_icon = "application-integration.png"
|
||||
|
||||
|
||||
class Appsync(_Integration):
|
||||
_icon = "appsync.png"
|
||||
|
||||
|
||||
class ConsoleMobileApplication(_Integration):
|
||||
_icon = "console-mobile-application.png"
|
||||
|
||||
|
||||
class Eventbridge(_Integration):
|
||||
_icon = "eventbridge.png"
|
||||
|
||||
|
||||
class MQ(_Integration):
|
||||
_icon = "mq.png"
|
||||
|
||||
|
||||
class SimpleNotificationServiceSns(_Integration):
|
||||
_icon = "simple-notification-service-sns.png"
|
||||
|
||||
|
||||
class SimpleQueueServiceSqs(_Integration):
|
||||
_icon = "simple-queue-service-sqs.png"
|
||||
|
||||
|
||||
class StepFunctions(_Integration):
|
||||
_icon = "step-functions.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
SNS = SimpleNotificationServiceSns
|
||||
SQS = SimpleQueueServiceSqs
|
||||
SF = StepFunctions
|
||||
@ -0,0 +1,61 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Iot(_AWS):
|
||||
_type = "iot"
|
||||
_icon_dir = "resources/aws/iot"
|
||||
|
||||
|
||||
class Freertos(_Iot):
|
||||
_icon = "freertos.png"
|
||||
|
||||
|
||||
class InternetOfThings(_Iot):
|
||||
_icon = "internet-of-things.png"
|
||||
|
||||
|
||||
class Iot1Click(_Iot):
|
||||
_icon = "iot-1-click.png"
|
||||
|
||||
|
||||
class IotAnalytics(_Iot):
|
||||
_icon = "iot-analytics.png"
|
||||
|
||||
|
||||
class IotButton(_Iot):
|
||||
_icon = "iot-button.png"
|
||||
|
||||
|
||||
class IotCore(_Iot):
|
||||
_icon = "iot-core.png"
|
||||
|
||||
|
||||
class IotDeviceDefender(_Iot):
|
||||
_icon = "iot-device-defender.png"
|
||||
|
||||
|
||||
class IotDeviceManagement(_Iot):
|
||||
_icon = "iot-device-management.png"
|
||||
|
||||
|
||||
class IotEvents(_Iot):
|
||||
_icon = "iot-events.png"
|
||||
|
||||
|
||||
class IotGreengrass(_Iot):
|
||||
_icon = "iot-greengrass.png"
|
||||
|
||||
|
||||
class IotSitewise(_Iot):
|
||||
_icon = "iot-sitewise.png"
|
||||
|
||||
|
||||
class IotThingsGraph(_Iot):
|
||||
_icon = "iot-things-graph.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
FreeRTOS = Freertos
|
||||
@ -0,0 +1,61 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Migration(_AWS):
|
||||
_type = "migration"
|
||||
_icon_dir = "resources/aws/migration"
|
||||
|
||||
|
||||
class ApplicationDiscoveryService(_Migration):
|
||||
_icon = "application-discovery-service.png"
|
||||
|
||||
|
||||
class CloudendureMigration(_Migration):
|
||||
_icon = "cloudendure-migration.png"
|
||||
|
||||
|
||||
class DatabaseMigrationService(_Migration):
|
||||
_icon = "database-migration-service.png"
|
||||
|
||||
|
||||
class Datasync(_Migration):
|
||||
_icon = "datasync.png"
|
||||
|
||||
|
||||
class MigrationAndTransfer(_Migration):
|
||||
_icon = "migration-and-transfer.png"
|
||||
|
||||
|
||||
class MigrationHub(_Migration):
|
||||
_icon = "migration-hub.png"
|
||||
|
||||
|
||||
class ServerMigrationService(_Migration):
|
||||
_icon = "server-migration-service.png"
|
||||
|
||||
|
||||
class SnowballEdge(_Migration):
|
||||
_icon = "snowball-edge.png"
|
||||
|
||||
|
||||
class Snowball(_Migration):
|
||||
_icon = "snowball.png"
|
||||
|
||||
|
||||
class Snowmobile(_Migration):
|
||||
_icon = "snowmobile.png"
|
||||
|
||||
|
||||
class TransferForSftp(_Migration):
|
||||
_icon = "transfer-for-sftp.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
ADS = ApplicationDiscoveryService
|
||||
CEM = CloudendureMigration
|
||||
DMS = DatabaseMigrationService
|
||||
MAT = MigrationAndTransfer
|
||||
SMS = ServerMigrationService
|
||||
@ -0,0 +1,89 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _ML(_AWS):
|
||||
_type = "ml"
|
||||
_icon_dir = "resources/aws/ml"
|
||||
|
||||
|
||||
class ApacheMxnetOnAWS(_ML):
|
||||
_icon = "apache-mxnet-on-aws.png"
|
||||
|
||||
|
||||
class Comprehend(_ML):
|
||||
_icon = "comprehend.png"
|
||||
|
||||
|
||||
class DeepLearningAmis(_ML):
|
||||
_icon = "deep-learning-amis.png"
|
||||
|
||||
|
||||
class DeepLearningContainers(_ML):
|
||||
_icon = "deep-learning-containers.png"
|
||||
|
||||
|
||||
class Deeplens(_ML):
|
||||
_icon = "deeplens.png"
|
||||
|
||||
|
||||
class Deepracer(_ML):
|
||||
_icon = "deepracer.png"
|
||||
|
||||
|
||||
class ElasticInference(_ML):
|
||||
_icon = "elastic-inference.png"
|
||||
|
||||
|
||||
class Forecast(_ML):
|
||||
_icon = "forecast.png"
|
||||
|
||||
|
||||
class Lex(_ML):
|
||||
_icon = "lex.png"
|
||||
|
||||
|
||||
class MachineLearning(_ML):
|
||||
_icon = "machine-learning.png"
|
||||
|
||||
|
||||
class Personalize(_ML):
|
||||
_icon = "personalize.png"
|
||||
|
||||
|
||||
class Polly(_ML):
|
||||
_icon = "polly.png"
|
||||
|
||||
|
||||
class Rekognition(_ML):
|
||||
_icon = "rekognition.png"
|
||||
|
||||
|
||||
class SagemakerGroundTruth(_ML):
|
||||
_icon = "sagemaker-ground-truth.png"
|
||||
|
||||
|
||||
class Sagemaker(_ML):
|
||||
_icon = "sagemaker.png"
|
||||
|
||||
|
||||
class TensorflowOnAWS(_ML):
|
||||
_icon = "tensorflow-on-aws.png"
|
||||
|
||||
|
||||
class Textract(_ML):
|
||||
_icon = "textract.png"
|
||||
|
||||
|
||||
class Transcribe(_ML):
|
||||
_icon = "transcribe.png"
|
||||
|
||||
|
||||
class Translate(_ML):
|
||||
_icon = "translate.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
DLC = DeepLearningContainers
|
||||
@ -0,0 +1,71 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Network(_AWS):
|
||||
_type = "network"
|
||||
_icon_dir = "resources/aws/network"
|
||||
|
||||
|
||||
class APIGateway(_Network):
|
||||
_icon = "api-gateway.png"
|
||||
|
||||
|
||||
class AppMesh(_Network):
|
||||
_icon = "app-mesh.png"
|
||||
|
||||
|
||||
class ClientVpn(_Network):
|
||||
_icon = "client-vpn.png"
|
||||
|
||||
|
||||
class CloudMap(_Network):
|
||||
_icon = "cloud-map.png"
|
||||
|
||||
|
||||
class Cloudfront(_Network):
|
||||
_icon = "cloudfront.png"
|
||||
|
||||
|
||||
class DirectConnect(_Network):
|
||||
_icon = "direct-connect.png"
|
||||
|
||||
|
||||
class ElasticLoadBalancing(_Network):
|
||||
_icon = "elastic-load-balancing.png"
|
||||
|
||||
|
||||
class GlobalAccelerator(_Network):
|
||||
_icon = "global-accelerator.png"
|
||||
|
||||
|
||||
class NetworkingAndContentDelivery(_Network):
|
||||
_icon = "networking-and-content-delivery.png"
|
||||
|
||||
|
||||
class Privatelink(_Network):
|
||||
_icon = "privatelink.png"
|
||||
|
||||
|
||||
class Route53(_Network):
|
||||
_icon = "route-53.png"
|
||||
|
||||
|
||||
class SiteToSiteVpn(_Network):
|
||||
_icon = "site-to-site-vpn.png"
|
||||
|
||||
|
||||
class TransitGateway(_Network):
|
||||
_icon = "transit-gateway.png"
|
||||
|
||||
|
||||
class VPC(_Network):
|
||||
_icon = "vpc.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
CF = Cloudfront
|
||||
ELB = ElasticLoadBalancing
|
||||
GAX = GlobalAccelerator
|
||||
@ -0,0 +1,95 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Security(_AWS):
|
||||
_type = "security"
|
||||
_icon_dir = "resources/aws/security"
|
||||
|
||||
|
||||
class Artifact(_Security):
|
||||
_icon = "artifact.png"
|
||||
|
||||
|
||||
class CertificateManager(_Security):
|
||||
_icon = "certificate-manager.png"
|
||||
|
||||
|
||||
class CloudDirectory(_Security):
|
||||
_icon = "cloud-directory.png"
|
||||
|
||||
|
||||
class Cloudhsm(_Security):
|
||||
_icon = "cloudhsm.png"
|
||||
|
||||
|
||||
class Cognito(_Security):
|
||||
_icon = "cognito.png"
|
||||
|
||||
|
||||
class DirectoryService(_Security):
|
||||
_icon = "directory-service.png"
|
||||
|
||||
|
||||
class FirewallManager(_Security):
|
||||
_icon = "firewall-manager.png"
|
||||
|
||||
|
||||
class Guardduty(_Security):
|
||||
_icon = "guardduty.png"
|
||||
|
||||
|
||||
class IdentityAndAccessManagementIam(_Security):
|
||||
_icon = "identity-and-access-management-iam.png"
|
||||
|
||||
|
||||
class Inspector(_Security):
|
||||
_icon = "inspector.png"
|
||||
|
||||
|
||||
class KeyManagementService(_Security):
|
||||
_icon = "key-management-service.png"
|
||||
|
||||
|
||||
class Macie(_Security):
|
||||
_icon = "macie.png"
|
||||
|
||||
|
||||
class ResourceAccessManager(_Security):
|
||||
_icon = "resource-access-manager.png"
|
||||
|
||||
|
||||
class SecretsManager(_Security):
|
||||
_icon = "secrets-manager.png"
|
||||
|
||||
|
||||
class SecurityHub(_Security):
|
||||
_icon = "security-hub.png"
|
||||
|
||||
|
||||
class SecurityIdentityAndCompliance(_Security):
|
||||
_icon = "security-identity-and-compliance.png"
|
||||
|
||||
|
||||
class Shield(_Security):
|
||||
_icon = "shield.png"
|
||||
|
||||
|
||||
class SingleSignOn(_Security):
|
||||
_icon = "single-sign-on.png"
|
||||
|
||||
|
||||
class WAF(_Security):
|
||||
_icon = "waf.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
ACM = CertificateManager
|
||||
CloudHSM = Cloudhsm
|
||||
DS = DirectoryService
|
||||
FMS = FirewallManager
|
||||
IAM = IdentityAndAccessManagementIam
|
||||
KMS = KeyManagementService
|
||||
RAM = ResourceAccessManager
|
||||
@ -0,0 +1,81 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _AWS
|
||||
|
||||
|
||||
class _Storage(_AWS):
|
||||
_type = "storage"
|
||||
_icon_dir = "resources/aws/storage"
|
||||
|
||||
|
||||
class Backup(_Storage):
|
||||
_icon = "backup.png"
|
||||
|
||||
|
||||
class CloudendureDisasterRecovery(_Storage):
|
||||
_icon = "cloudendure-disaster-recovery.png"
|
||||
|
||||
|
||||
class EFSInfrequentaccessPrimaryBg(_Storage):
|
||||
_icon = "efs-infrequentaccess-primary-bg.png"
|
||||
|
||||
|
||||
class EFSStandardPrimaryBg(_Storage):
|
||||
_icon = "efs-standard-primary-bg.png"
|
||||
|
||||
|
||||
class ElasticBlockStoreEBS(_Storage):
|
||||
_icon = "elastic-block-store-ebs.png"
|
||||
|
||||
|
||||
class ElasticFileSystemEFS(_Storage):
|
||||
_icon = "elastic-file-system-efs.png"
|
||||
|
||||
|
||||
class FsxForLustre(_Storage):
|
||||
_icon = "fsx-for-lustre.png"
|
||||
|
||||
|
||||
class FsxForWindowsFileServer(_Storage):
|
||||
_icon = "fsx-for-windows-file-server.png"
|
||||
|
||||
|
||||
class Fsx(_Storage):
|
||||
_icon = "fsx.png"
|
||||
|
||||
|
||||
class S3Glacier(_Storage):
|
||||
_icon = "s3-glacier.png"
|
||||
|
||||
|
||||
class SimpleStorageServiceS3(_Storage):
|
||||
_icon = "simple-storage-service-s3.png"
|
||||
|
||||
|
||||
class SnowballEdge(_Storage):
|
||||
_icon = "snowball-edge.png"
|
||||
|
||||
|
||||
class Snowball(_Storage):
|
||||
_icon = "snowball.png"
|
||||
|
||||
|
||||
class Snowmobile(_Storage):
|
||||
_icon = "snowmobile.png"
|
||||
|
||||
|
||||
class StorageGateway(_Storage):
|
||||
_icon = "storage-gateway.png"
|
||||
|
||||
|
||||
class Storage(_Storage):
|
||||
_icon = "storage.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
CDR = CloudendureDisasterRecovery
|
||||
EBS = ElasticBlockStoreEBS
|
||||
EFS = ElasticFileSystemEFS
|
||||
FSx = Fsx
|
||||
S3 = SimpleStorageServiceS3
|
||||
@ -0,0 +1,12 @@
|
||||
"""
|
||||
Azure provides a set of services for Microsoft Azure provider.
|
||||
"""
|
||||
|
||||
from diagrams import Node
|
||||
|
||||
|
||||
class _Azure(Node):
|
||||
_provider = "azure"
|
||||
_icon_dir = "resources/azure"
|
||||
|
||||
fontcolor = "#ffffff"
|
||||
@ -0,0 +1,55 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Analytics(_Azure):
|
||||
_type = "analytics"
|
||||
_icon_dir = "resources/azure/analytics"
|
||||
|
||||
|
||||
class AnalysisServices(_Analytics):
|
||||
_icon = "analysis-services.png"
|
||||
|
||||
|
||||
class DataExplorerClusters(_Analytics):
|
||||
_icon = "data-explorer-clusters.png"
|
||||
|
||||
|
||||
class DataFactories(_Analytics):
|
||||
_icon = "data-factories.png"
|
||||
|
||||
|
||||
class DataLakeAnalytics(_Analytics):
|
||||
_icon = "data-lake-analytics.png"
|
||||
|
||||
|
||||
class DataLakeStoreGen1(_Analytics):
|
||||
_icon = "data-lake-store-gen1.png"
|
||||
|
||||
|
||||
class Databricks(_Analytics):
|
||||
_icon = "databricks.png"
|
||||
|
||||
|
||||
class EventHubClusters(_Analytics):
|
||||
_icon = "event-hub-clusters.png"
|
||||
|
||||
|
||||
class EventHubs(_Analytics):
|
||||
_icon = "event-hubs.png"
|
||||
|
||||
|
||||
class Hdinsightclusters(_Analytics):
|
||||
_icon = "hdinsightclusters.png"
|
||||
|
||||
|
||||
class LogAnalyticsWorkspaces(_Analytics):
|
||||
_icon = "log-analytics-workspaces.png"
|
||||
|
||||
|
||||
class StreamAnalyticsJobs(_Analytics):
|
||||
_icon = "stream-analytics-jobs.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,94 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Compute(_Azure):
|
||||
_type = "compute"
|
||||
_icon_dir = "resources/azure/compute"
|
||||
|
||||
|
||||
class AvailabilitySets(_Compute):
|
||||
_icon = "availability-sets.png"
|
||||
|
||||
|
||||
class BatchAccounts(_Compute):
|
||||
_icon = "batch-accounts.png"
|
||||
|
||||
|
||||
class CitrixVirtualDesktopsEssentials(_Compute):
|
||||
_icon = "citrix-virtual-desktops-essentials.png"
|
||||
|
||||
|
||||
class CloudServicesClassic(_Compute):
|
||||
_icon = "cloud-services-classic.png"
|
||||
|
||||
|
||||
class CloudServices(_Compute):
|
||||
_icon = "cloud-services.png"
|
||||
|
||||
|
||||
class CloudsimpleVirtualMachines(_Compute):
|
||||
_icon = "cloudsimple-virtual-machines.png"
|
||||
|
||||
|
||||
class ContainerInstances(_Compute):
|
||||
_icon = "container-instances.png"
|
||||
|
||||
|
||||
class ContainerRegistries(_Compute):
|
||||
_icon = "container-registries.png"
|
||||
|
||||
|
||||
class DiskSnapshots(_Compute):
|
||||
_icon = "disk-snapshots.png"
|
||||
|
||||
|
||||
class Disks(_Compute):
|
||||
_icon = "disks.png"
|
||||
|
||||
|
||||
class FunctionApps(_Compute):
|
||||
_icon = "function-apps.png"
|
||||
|
||||
|
||||
class KubernetesServices(_Compute):
|
||||
_icon = "kubernetes-services.png"
|
||||
|
||||
|
||||
class MeshApplications(_Compute):
|
||||
_icon = "mesh-applications.png"
|
||||
|
||||
|
||||
class SAPHANAOnAzure(_Compute):
|
||||
_icon = "sap-hana-on-azure.png"
|
||||
|
||||
|
||||
class ServiceFabricClusters(_Compute):
|
||||
_icon = "service-fabric-clusters.png"
|
||||
|
||||
|
||||
class VMClassic(_Compute):
|
||||
_icon = "vm-classic.png"
|
||||
|
||||
|
||||
class VMImages(_Compute):
|
||||
_icon = "vm-images.png"
|
||||
|
||||
|
||||
class VMLinux(_Compute):
|
||||
_icon = "vm-linux.png"
|
||||
|
||||
|
||||
class VMWindows(_Compute):
|
||||
_icon = "vm-windows.png"
|
||||
|
||||
|
||||
class VM(_Compute):
|
||||
_icon = "vm.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
ACR = ContainerRegistries
|
||||
AKS = KubernetesServices
|
||||
@ -0,0 +1,79 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Database(_Azure):
|
||||
_type = "database"
|
||||
_icon_dir = "resources/azure/database"
|
||||
|
||||
|
||||
class BlobStorage(_Database):
|
||||
_icon = "blob-storage.png"
|
||||
|
||||
|
||||
class CacheForRedis(_Database):
|
||||
_icon = "cache-for-redis.png"
|
||||
|
||||
|
||||
class CosmosDb(_Database):
|
||||
_icon = "cosmos-db.png"
|
||||
|
||||
|
||||
class DataLake(_Database):
|
||||
_icon = "data-lake.png"
|
||||
|
||||
|
||||
class DatabaseForMariadbServers(_Database):
|
||||
_icon = "database-for-mariadb-servers.png"
|
||||
|
||||
|
||||
class DatabaseForMysqlServers(_Database):
|
||||
_icon = "database-for-mysql-servers.png"
|
||||
|
||||
|
||||
class DatabaseForPostgresqlServers(_Database):
|
||||
_icon = "database-for-postgresql-servers.png"
|
||||
|
||||
|
||||
class ElasticDatabasePools(_Database):
|
||||
_icon = "elastic-database-pools.png"
|
||||
|
||||
|
||||
class ElasticJobAgents(_Database):
|
||||
_icon = "elastic-job-agents.png"
|
||||
|
||||
|
||||
class ManagedDatabases(_Database):
|
||||
_icon = "managed-databases.png"
|
||||
|
||||
|
||||
class SQLDatabases(_Database):
|
||||
_icon = "sql-databases.png"
|
||||
|
||||
|
||||
class SQLDatawarehouse(_Database):
|
||||
_icon = "sql-datawarehouse.png"
|
||||
|
||||
|
||||
class SQLManagedInstances(_Database):
|
||||
_icon = "sql-managed-instances.png"
|
||||
|
||||
|
||||
class SQLServerStretchDatabases(_Database):
|
||||
_icon = "sql-server-stretch-databases.png"
|
||||
|
||||
|
||||
class SQLServers(_Database):
|
||||
_icon = "sql-servers.png"
|
||||
|
||||
|
||||
class VirtualClusters(_Database):
|
||||
_icon = "virtual-clusters.png"
|
||||
|
||||
|
||||
class VirtualDatacenter(_Database):
|
||||
_icon = "virtual-datacenter.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,43 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Devops(_Azure):
|
||||
_type = "devops"
|
||||
_icon_dir = "resources/azure/devops"
|
||||
|
||||
|
||||
class ApplicationInsights(_Devops):
|
||||
_icon = "application-insights.png"
|
||||
|
||||
|
||||
class Artifacts(_Devops):
|
||||
_icon = "artifacts.png"
|
||||
|
||||
|
||||
class Boards(_Devops):
|
||||
_icon = "boards.png"
|
||||
|
||||
|
||||
class Devops(_Devops):
|
||||
_icon = "devops.png"
|
||||
|
||||
|
||||
class DevtestLabs(_Devops):
|
||||
_icon = "devtest-labs.png"
|
||||
|
||||
|
||||
class Pipelines(_Devops):
|
||||
_icon = "pipelines.png"
|
||||
|
||||
|
||||
class Repos(_Devops):
|
||||
_icon = "repos.png"
|
||||
|
||||
|
||||
class TestPlans(_Devops):
|
||||
_icon = "test-plans.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,63 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Identity(_Azure):
|
||||
_type = "identity"
|
||||
_icon_dir = "resources/azure/identity"
|
||||
|
||||
|
||||
class AccessReview(_Identity):
|
||||
_icon = "access-review.png"
|
||||
|
||||
|
||||
class ActiveDirectoryConnectHealth(_Identity):
|
||||
_icon = "active-directory-connect-health.png"
|
||||
|
||||
|
||||
class ActiveDirectory(_Identity):
|
||||
_icon = "active-directory.png"
|
||||
|
||||
|
||||
class ADB2C(_Identity):
|
||||
_icon = "ad-b2c.png"
|
||||
|
||||
|
||||
class ADDomainServices(_Identity):
|
||||
_icon = "ad-domain-services.png"
|
||||
|
||||
|
||||
class ADIdentityProtection(_Identity):
|
||||
_icon = "ad-identity-protection.png"
|
||||
|
||||
|
||||
class ADPrivilegedIdentityManagement(_Identity):
|
||||
_icon = "ad-privileged-identity-management.png"
|
||||
|
||||
|
||||
class AppRegistrations(_Identity):
|
||||
_icon = "app-registrations.png"
|
||||
|
||||
|
||||
class ConditionalAccess(_Identity):
|
||||
_icon = "conditional-access.png"
|
||||
|
||||
|
||||
class EnterpriseApplications(_Identity):
|
||||
_icon = "enterprise-applications.png"
|
||||
|
||||
|
||||
class IdentityGovernance(_Identity):
|
||||
_icon = "identity-governance.png"
|
||||
|
||||
|
||||
class InformationProtection(_Identity):
|
||||
_icon = "information-protection.png"
|
||||
|
||||
|
||||
class ManagedIdentities(_Identity):
|
||||
_icon = "managed-identities.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,51 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Iot(_Azure):
|
||||
_type = "iot"
|
||||
_icon_dir = "resources/azure/iot"
|
||||
|
||||
|
||||
class DeviceProvisioningServices(_Iot):
|
||||
_icon = "device-provisioning-services.png"
|
||||
|
||||
|
||||
class DigitalTwins(_Iot):
|
||||
_icon = "digital-twins.png"
|
||||
|
||||
|
||||
class IotCentralApplications(_Iot):
|
||||
_icon = "iot-central-applications.png"
|
||||
|
||||
|
||||
class IotHubSecurity(_Iot):
|
||||
_icon = "iot-hub-security.png"
|
||||
|
||||
|
||||
class IotHub(_Iot):
|
||||
_icon = "iot-hub.png"
|
||||
|
||||
|
||||
class Maps(_Iot):
|
||||
_icon = "maps.png"
|
||||
|
||||
|
||||
class Sphere(_Iot):
|
||||
_icon = "sphere.png"
|
||||
|
||||
|
||||
class TimeSeriesInsightsEnvironments(_Iot):
|
||||
_icon = "time-series-insights-environments.png"
|
||||
|
||||
|
||||
class TimeSeriesInsightsEventsSources(_Iot):
|
||||
_icon = "time-series-insights-events-sources.png"
|
||||
|
||||
|
||||
class Windows10IotCoreServices(_Iot):
|
||||
_icon = "windows-10-iot-core-services.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,23 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Migration(_Azure):
|
||||
_type = "migration"
|
||||
_icon_dir = "resources/azure/migration"
|
||||
|
||||
|
||||
class DatabaseMigrationServices(_Migration):
|
||||
_icon = "database-migration-services.png"
|
||||
|
||||
|
||||
class MigrationProjects(_Migration):
|
||||
_icon = "migration-projects.png"
|
||||
|
||||
|
||||
class RecoveryServicesVaults(_Migration):
|
||||
_icon = "recovery-services-vaults.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,43 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Ml(_Azure):
|
||||
_type = "ml"
|
||||
_icon_dir = "resources/azure/ml"
|
||||
|
||||
|
||||
class BatchAI(_Ml):
|
||||
_icon = "batch-ai.png"
|
||||
|
||||
|
||||
class BotServices(_Ml):
|
||||
_icon = "bot-services.png"
|
||||
|
||||
|
||||
class CognitiveServices(_Ml):
|
||||
_icon = "cognitive-services.png"
|
||||
|
||||
|
||||
class GenomicsAccounts(_Ml):
|
||||
_icon = "genomics-accounts.png"
|
||||
|
||||
|
||||
class MachineLearningServiceWorkspaces(_Ml):
|
||||
_icon = "machine-learning-service-workspaces.png"
|
||||
|
||||
|
||||
class MachineLearningStudioWebServicePlans(_Ml):
|
||||
_icon = "machine-learning-studio-web-service-plans.png"
|
||||
|
||||
|
||||
class MachineLearningStudioWebServices(_Ml):
|
||||
_icon = "machine-learning-studio-web-services.png"
|
||||
|
||||
|
||||
class MachineLearningStudioWorkspaces(_Ml):
|
||||
_icon = "machine-learning-studio-workspaces.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,23 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Mobile(_Azure):
|
||||
_type = "mobile"
|
||||
_icon_dir = "resources/azure/mobile"
|
||||
|
||||
|
||||
class AppServiceMobile(_Mobile):
|
||||
_icon = "app-service---mobile.png"
|
||||
|
||||
|
||||
class MobileEngagement(_Mobile):
|
||||
_icon = "mobile-engagement.png"
|
||||
|
||||
|
||||
class NotificationHubs(_Mobile):
|
||||
_icon = "notification-hubs.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,115 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Network(_Azure):
|
||||
_type = "network"
|
||||
_icon_dir = "resources/azure/network"
|
||||
|
||||
|
||||
class ApplicationGateway(_Network):
|
||||
_icon = "application-gateway.png"
|
||||
|
||||
|
||||
class ApplicationSecurityGroups(_Network):
|
||||
_icon = "application-security-groups.png"
|
||||
|
||||
|
||||
class CDNProfiles(_Network):
|
||||
_icon = "cdn-profiles.png"
|
||||
|
||||
|
||||
class Connections(_Network):
|
||||
_icon = "connections.png"
|
||||
|
||||
|
||||
class DDOSProtectionPlans(_Network):
|
||||
_icon = "ddos-protection-plans.png"
|
||||
|
||||
|
||||
class DNSPrivateZones(_Network):
|
||||
_icon = "dns-private-zones.png"
|
||||
|
||||
|
||||
class DNSZones(_Network):
|
||||
_icon = "dns-zones.png"
|
||||
|
||||
|
||||
class ExpressrouteCircuits(_Network):
|
||||
_icon = "expressroute-circuits.png"
|
||||
|
||||
|
||||
class Firewall(_Network):
|
||||
_icon = "firewall.png"
|
||||
|
||||
|
||||
class FrontDoors(_Network):
|
||||
_icon = "front-doors.png"
|
||||
|
||||
|
||||
class LoadBalancers(_Network):
|
||||
_icon = "load-balancers.png"
|
||||
|
||||
|
||||
class LocalNetworkGateways(_Network):
|
||||
_icon = "local-network-gateways.png"
|
||||
|
||||
|
||||
class NetworkInterfaces(_Network):
|
||||
_icon = "network-interfaces.png"
|
||||
|
||||
|
||||
class NetworkSecurityGroupsClassic(_Network):
|
||||
_icon = "network-security-groups-classic.png"
|
||||
|
||||
|
||||
class NetworkWatcher(_Network):
|
||||
_icon = "network-watcher.png"
|
||||
|
||||
|
||||
class OnPremisesDataGateways(_Network):
|
||||
_icon = "on-premises-data-gateways.png"
|
||||
|
||||
|
||||
class PublicIpAddresses(_Network):
|
||||
_icon = "public-ip-addresses.png"
|
||||
|
||||
|
||||
class ReservedIpAddressesClassic(_Network):
|
||||
_icon = "reserved-ip-addresses-classic.png"
|
||||
|
||||
|
||||
class RouteFilters(_Network):
|
||||
_icon = "route-filters.png"
|
||||
|
||||
|
||||
class RouteTables(_Network):
|
||||
_icon = "route-tables.png"
|
||||
|
||||
|
||||
class ServiceEndpointPolicies(_Network):
|
||||
_icon = "service-endpoint-policies.png"
|
||||
|
||||
|
||||
class TrafficManagerProfiles(_Network):
|
||||
_icon = "traffic-manager-profiles.png"
|
||||
|
||||
|
||||
class VirtualNetworkClassic(_Network):
|
||||
_icon = "virtual-network-classic.png"
|
||||
|
||||
|
||||
class VirtualNetworkGateways(_Network):
|
||||
_icon = "virtual-network-gateways.png"
|
||||
|
||||
|
||||
class VirtualNetworks(_Network):
|
||||
_icon = "virtual-networks.png"
|
||||
|
||||
|
||||
class VirtualWans(_Network):
|
||||
_icon = "virtual-wans.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,23 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Security(_Azure):
|
||||
_type = "security"
|
||||
_icon_dir = "resources/azure/security"
|
||||
|
||||
|
||||
class KeyVaults(_Security):
|
||||
_icon = "key-vaults.png"
|
||||
|
||||
|
||||
class SecurityCenter(_Security):
|
||||
_icon = "security-center.png"
|
||||
|
||||
|
||||
class Sentinel(_Security):
|
||||
_icon = "sentinel.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,75 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Storage(_Azure):
|
||||
_type = "storage"
|
||||
_icon_dir = "resources/azure/storage"
|
||||
|
||||
|
||||
class ArchiveStorage(_Storage):
|
||||
_icon = "archive-storage.png"
|
||||
|
||||
|
||||
class Azurefxtedgefiler(_Storage):
|
||||
_icon = "azurefxtedgefiler.png"
|
||||
|
||||
|
||||
class BlobStorage(_Storage):
|
||||
_icon = "blob-storage.png"
|
||||
|
||||
|
||||
class DataBoxEdgeDataBoxGateway(_Storage):
|
||||
_icon = "data-box-edge---data-box-gateway.png"
|
||||
|
||||
|
||||
class DataBox(_Storage):
|
||||
_icon = "data-box.png"
|
||||
|
||||
|
||||
class DataLakeStorage(_Storage):
|
||||
_icon = "data-lake-storage.png"
|
||||
|
||||
|
||||
class GeneralStorage(_Storage):
|
||||
_icon = "general-storage.png"
|
||||
|
||||
|
||||
class NetappFiles(_Storage):
|
||||
_icon = "netapp-files.png"
|
||||
|
||||
|
||||
class QueuesStorage(_Storage):
|
||||
_icon = "queues-storage.png"
|
||||
|
||||
|
||||
class StorageAccountsClassic(_Storage):
|
||||
_icon = "storage-accounts-classic.png"
|
||||
|
||||
|
||||
class StorageAccounts(_Storage):
|
||||
_icon = "storage-accounts.png"
|
||||
|
||||
|
||||
class StorageExplorer(_Storage):
|
||||
_icon = "storage-explorer.png"
|
||||
|
||||
|
||||
class StorageSyncServices(_Storage):
|
||||
_icon = "storage-sync-services.png"
|
||||
|
||||
|
||||
class StorsimpleDataManagers(_Storage):
|
||||
_icon = "storsimple-data-managers.png"
|
||||
|
||||
|
||||
class StorsimpleDeviceManagers(_Storage):
|
||||
_icon = "storsimple-device-managers.png"
|
||||
|
||||
|
||||
class TableStorage(_Storage):
|
||||
_icon = "table-storage.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,51 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _Azure
|
||||
|
||||
|
||||
class _Web(_Azure):
|
||||
_type = "web"
|
||||
_icon_dir = "resources/azure/web"
|
||||
|
||||
|
||||
class APIConnections(_Web):
|
||||
_icon = "api-connections.png"
|
||||
|
||||
|
||||
class AppServiceCertificates(_Web):
|
||||
_icon = "app-service-certificates.png"
|
||||
|
||||
|
||||
class AppServiceDomains(_Web):
|
||||
_icon = "app-service-domains.png"
|
||||
|
||||
|
||||
class AppServiceEnvironments(_Web):
|
||||
_icon = "app-service-environments.png"
|
||||
|
||||
|
||||
class AppServicePlans(_Web):
|
||||
_icon = "app-service-plans.png"
|
||||
|
||||
|
||||
class AppServices(_Web):
|
||||
_icon = "app-services.png"
|
||||
|
||||
|
||||
class MediaServices(_Web):
|
||||
_icon = "media-services.png"
|
||||
|
||||
|
||||
class NotificationHubNamespaces(_Web):
|
||||
_icon = "notification-hub-namespaces.png"
|
||||
|
||||
|
||||
class Search(_Web):
|
||||
_icon = "search.png"
|
||||
|
||||
|
||||
class Signalr(_Web):
|
||||
_icon = "signalr.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,12 @@
|
||||
"""
|
||||
Base provides a set of general services for backend infrastructure.
|
||||
"""
|
||||
|
||||
from diagrams import Node
|
||||
|
||||
|
||||
class _Base(Node):
|
||||
_provider = "base"
|
||||
_icon_dir = "resources/base"
|
||||
|
||||
fontcolor = "#ffffff"
|
||||
@ -0,0 +1,12 @@
|
||||
"""
|
||||
GCP provides a set of services for Google Cloud Platform provider.
|
||||
"""
|
||||
|
||||
from diagrams import Node
|
||||
|
||||
|
||||
class _GCP(Node):
|
||||
_provider = "gcp"
|
||||
_icon_dir = "resources/gcp"
|
||||
|
||||
fontcolor = "#2d3436"
|
||||
@ -0,0 +1,54 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Analytics(_GCP):
|
||||
_type = "analytics"
|
||||
_icon_dir = "resources/gcp/analytics"
|
||||
|
||||
|
||||
class Bigquery(_Analytics):
|
||||
_icon = "bigquery.png"
|
||||
|
||||
|
||||
class Composer(_Analytics):
|
||||
_icon = "composer.png"
|
||||
|
||||
|
||||
class DataCatalog(_Analytics):
|
||||
_icon = "data-catalog.png"
|
||||
|
||||
|
||||
class DataFusion(_Analytics):
|
||||
_icon = "data-fusion.png"
|
||||
|
||||
|
||||
class Dataflow(_Analytics):
|
||||
_icon = "dataflow.png"
|
||||
|
||||
|
||||
class Datalab(_Analytics):
|
||||
_icon = "datalab.png"
|
||||
|
||||
|
||||
class Dataprep(_Analytics):
|
||||
_icon = "dataprep.png"
|
||||
|
||||
|
||||
class Dataproc(_Analytics):
|
||||
_icon = "dataproc.png"
|
||||
|
||||
|
||||
class Genomics(_Analytics):
|
||||
_icon = "genomics.png"
|
||||
|
||||
|
||||
class Pubsub(_Analytics):
|
||||
_icon = "pubsub.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
BigQuery = Bigquery
|
||||
PubSub = Pubsub
|
||||
@ -0,0 +1,48 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Compute(_GCP):
|
||||
_type = "compute"
|
||||
_icon_dir = "resources/gcp/compute"
|
||||
|
||||
|
||||
class AppEngine(_Compute):
|
||||
_icon = "app-engine.png"
|
||||
|
||||
|
||||
class ComputeEngine(_Compute):
|
||||
_icon = "compute-engine.png"
|
||||
|
||||
|
||||
class ContainerOptimizedOS(_Compute):
|
||||
_icon = "container-optimized-os.png"
|
||||
|
||||
|
||||
class Functions(_Compute):
|
||||
_icon = "functions.png"
|
||||
|
||||
|
||||
class GKEOnPrem(_Compute):
|
||||
_icon = "gke-on-prem.png"
|
||||
|
||||
|
||||
class GPU(_Compute):
|
||||
_icon = "gpu.png"
|
||||
|
||||
|
||||
class KubernetesEngine(_Compute):
|
||||
_icon = "kubernetes-engine.png"
|
||||
|
||||
|
||||
class Run(_Compute):
|
||||
_icon = "run.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
GAE = AppEngine
|
||||
GCF = Functions
|
||||
GCE = ComputeEngine
|
||||
GKE = KubernetesEngine
|
||||
@ -0,0 +1,37 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Database(_GCP):
|
||||
_type = "database"
|
||||
_icon_dir = "resources/gcp/database"
|
||||
|
||||
|
||||
class Bigtable(_Database):
|
||||
_icon = "bigtable.png"
|
||||
|
||||
|
||||
class Datastore(_Database):
|
||||
_icon = "datastore.png"
|
||||
|
||||
|
||||
class Firestore(_Database):
|
||||
_icon = "firestore.png"
|
||||
|
||||
|
||||
class Memorystore(_Database):
|
||||
_icon = "memorystore.png"
|
||||
|
||||
|
||||
class Spanner(_Database):
|
||||
_icon = "spanner.png"
|
||||
|
||||
|
||||
class SQL(_Database):
|
||||
_icon = "sql.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
BigTable = Bigtable
|
||||
@ -0,0 +1,73 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Devtools(_GCP):
|
||||
_type = "devtools"
|
||||
_icon_dir = "resources/gcp/devtools"
|
||||
|
||||
|
||||
class Build(_Devtools):
|
||||
_icon = "build.png"
|
||||
|
||||
|
||||
class CodeForIntellij(_Devtools):
|
||||
_icon = "code-for-intellij.png"
|
||||
|
||||
|
||||
class Code(_Devtools):
|
||||
_icon = "code.png"
|
||||
|
||||
|
||||
class ContainerRegistry(_Devtools):
|
||||
_icon = "container-registry.png"
|
||||
|
||||
|
||||
class GradleAppEnginePlugin(_Devtools):
|
||||
_icon = "gradle-app-engine-plugin.png"
|
||||
|
||||
|
||||
class IdePlugins(_Devtools):
|
||||
_icon = "ide-plugins.png"
|
||||
|
||||
|
||||
class MavenAppEnginePlugin(_Devtools):
|
||||
_icon = "maven-app-engine-plugin.png"
|
||||
|
||||
|
||||
class Scheduler(_Devtools):
|
||||
_icon = "scheduler.png"
|
||||
|
||||
|
||||
class SDK(_Devtools):
|
||||
_icon = "sdk.png"
|
||||
|
||||
|
||||
class SourceRepositories(_Devtools):
|
||||
_icon = "source-repositories.png"
|
||||
|
||||
|
||||
class Tasks(_Devtools):
|
||||
_icon = "tasks.png"
|
||||
|
||||
|
||||
class TestLab(_Devtools):
|
||||
_icon = "test-lab.png"
|
||||
|
||||
|
||||
class ToolsForEclipse(_Devtools):
|
||||
_icon = "tools-for-eclipse.png"
|
||||
|
||||
|
||||
class ToolsForPowershell(_Devtools):
|
||||
_icon = "tools-for-powershell.png"
|
||||
|
||||
|
||||
class ToolsForVisualStudio(_Devtools):
|
||||
_icon = "tools-for-visual-studio.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
GCR = ContainerRegistry
|
||||
@ -0,0 +1,15 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Iot(_GCP):
|
||||
_type = "iot"
|
||||
_icon_dir = "resources/gcp/iot"
|
||||
|
||||
|
||||
class IotCore(_Iot):
|
||||
_icon = "iot-core.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,15 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Migration(_GCP):
|
||||
_type = "migration"
|
||||
_icon_dir = "resources/gcp/migration"
|
||||
|
||||
|
||||
class TransferAppliance(_Migration):
|
||||
_icon = "transfer-appliance.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
@ -0,0 +1,100 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _ML(_GCP):
|
||||
_type = "ml"
|
||||
_icon_dir = "resources/gcp/ml"
|
||||
|
||||
|
||||
class AdvancedSolutionsLab(_ML):
|
||||
_icon = "advanced-solutions-lab.png"
|
||||
|
||||
|
||||
class AIHub(_ML):
|
||||
_icon = "ai-hub.png"
|
||||
|
||||
|
||||
class AIPlatformDataLabelingService(_ML):
|
||||
_icon = "ai-platform-data-labeling-service.png"
|
||||
|
||||
|
||||
class AIPlatform(_ML):
|
||||
_icon = "ai-platform.png"
|
||||
|
||||
|
||||
class AutomlNaturalLanguage(_ML):
|
||||
_icon = "automl-natural-language.png"
|
||||
|
||||
|
||||
class AutomlTables(_ML):
|
||||
_icon = "automl-tables.png"
|
||||
|
||||
|
||||
class AutomlTranslation(_ML):
|
||||
_icon = "automl-translation.png"
|
||||
|
||||
|
||||
class AutomlVideoIntelligence(_ML):
|
||||
_icon = "automl-video-intelligence.png"
|
||||
|
||||
|
||||
class AutomlVision(_ML):
|
||||
_icon = "automl-vision.png"
|
||||
|
||||
|
||||
class Automl(_ML):
|
||||
_icon = "automl.png"
|
||||
|
||||
|
||||
class DialogFlowEnterpriseEdition(_ML):
|
||||
_icon = "dialog-flow-enterprise-edition.png"
|
||||
|
||||
|
||||
class InferenceAPI(_ML):
|
||||
_icon = "inference-api.png"
|
||||
|
||||
|
||||
class JobsAPI(_ML):
|
||||
_icon = "jobs-api.png"
|
||||
|
||||
|
||||
class NaturalLanguageAPI(_ML):
|
||||
_icon = "natural-language-api.png"
|
||||
|
||||
|
||||
class RecommendationsAI(_ML):
|
||||
_icon = "recommendations-ai.png"
|
||||
|
||||
|
||||
class SpeechToText(_ML):
|
||||
_icon = "speech-to-text.png"
|
||||
|
||||
|
||||
class TextToSpeech(_ML):
|
||||
_icon = "text-to-speech.png"
|
||||
|
||||
|
||||
class TPU(_ML):
|
||||
_icon = "tpu.png"
|
||||
|
||||
|
||||
class TranslationAPI(_ML):
|
||||
_icon = "translation-api.png"
|
||||
|
||||
|
||||
class VideoIntelligenceAPI(_ML):
|
||||
_icon = "video-intelligence-api.png"
|
||||
|
||||
|
||||
class VisionAPI(_ML):
|
||||
_icon = "vision-api.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
AutoML = Automl
|
||||
NLAPI = NaturalLanguageAPI
|
||||
STT = SpeechToText
|
||||
TTS = TextToSpeech
|
||||
@ -0,0 +1,81 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Network(_GCP):
|
||||
_type = "network"
|
||||
_icon_dir = "resources/gcp/network"
|
||||
|
||||
|
||||
class Armor(_Network):
|
||||
_icon = "armor.png"
|
||||
|
||||
|
||||
class CDN(_Network):
|
||||
_icon = "cdn.png"
|
||||
|
||||
|
||||
class DedicatedInterconnect(_Network):
|
||||
_icon = "dedicated-interconnect.png"
|
||||
|
||||
|
||||
class DNS(_Network):
|
||||
_icon = "dns.png"
|
||||
|
||||
|
||||
class ExternalIpAddresses(_Network):
|
||||
_icon = "external-ip-addresses.png"
|
||||
|
||||
|
||||
class FirewallRules(_Network):
|
||||
_icon = "firewall-rules.png"
|
||||
|
||||
|
||||
class LoadBalancing(_Network):
|
||||
_icon = "load-balancing.png"
|
||||
|
||||
|
||||
class NAT(_Network):
|
||||
_icon = "nat.png"
|
||||
|
||||
|
||||
class Network(_Network):
|
||||
_icon = "network.png"
|
||||
|
||||
|
||||
class PartnerInterconnect(_Network):
|
||||
_icon = "partner-interconnect.png"
|
||||
|
||||
|
||||
class PremiumNetworkTier(_Network):
|
||||
_icon = "premium-network-tier.png"
|
||||
|
||||
|
||||
class Router(_Network):
|
||||
_icon = "router.png"
|
||||
|
||||
|
||||
class Routes(_Network):
|
||||
_icon = "routes.png"
|
||||
|
||||
|
||||
class StandardNetworkTier(_Network):
|
||||
_icon = "standard-network-tier.png"
|
||||
|
||||
|
||||
class TrafficDirector(_Network):
|
||||
_icon = "traffic-director.png"
|
||||
|
||||
|
||||
class VirtualPrivateCloud(_Network):
|
||||
_icon = "virtual-private-cloud.png"
|
||||
|
||||
|
||||
class VPN(_Network):
|
||||
_icon = "vpn.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
VPC = VirtualPrivateCloud
|
||||
@ -0,0 +1,34 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Security(_GCP):
|
||||
_type = "security"
|
||||
_icon_dir = "resources/gcp/security"
|
||||
|
||||
|
||||
class Iam(_Security):
|
||||
_icon = "iam.png"
|
||||
|
||||
|
||||
class KeyManagementService(_Security):
|
||||
_icon = "key-management-service.png"
|
||||
|
||||
|
||||
class ResourceManager(_Security):
|
||||
_icon = "resource-manager.png"
|
||||
|
||||
|
||||
class SecurityCommandCenter(_Security):
|
||||
_icon = "security-command-center.png"
|
||||
|
||||
|
||||
class SecurityScanner(_Security):
|
||||
_icon = "security-scanner.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
KMS = KeyManagementService
|
||||
SCC = SecurityCommandCenter
|
||||
@ -0,0 +1,25 @@
|
||||
# This module is automatically generated by autogen.sh. DO NOT EDIT.
|
||||
|
||||
from . import _GCP
|
||||
|
||||
|
||||
class _Storage(_GCP):
|
||||
_type = "storage"
|
||||
_icon_dir = "resources/gcp/storage"
|
||||
|
||||
|
||||
class Filestore(_Storage):
|
||||
_icon = "filestore.png"
|
||||
|
||||
|
||||
class PersistentDisk(_Storage):
|
||||
_icon = "persistent-disk.png"
|
||||
|
||||
|
||||
class Storage(_Storage):
|
||||
_icon = "storage.png"
|
||||
|
||||
|
||||
# Aliases
|
||||
|
||||
GCS = Storage
|
||||
@ -0,0 +1,71 @@
|
||||
---
|
||||
id: cluster
|
||||
title: Clusters
|
||||
---
|
||||
|
||||
Cluster allows you group (or clustering) the nodes in an isolated group.
|
||||
|
||||
## Basic
|
||||
|
||||
Cluster represents a local cluster context.
|
||||
|
||||
You can create a cluster context with Cluster class. And you can also connect the nodes in a cluster to other nodes outside a cluster.
|
||||
|
||||
```python
|
||||
from diagrams import Cluster, Diagram
|
||||
from diagrams.aws.compute import ECS
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import Route53
|
||||
|
||||
with Diagram("Simple Web Service with DB Cluster", show=False):
|
||||
dns = Route53("dns")
|
||||
web = ECS("service")
|
||||
|
||||
with Cluster("DB Cluster"):
|
||||
db_master = RDS("master")
|
||||
db_master - [RDS("slave1"),
|
||||
RDS("slave2")]
|
||||
|
||||
dns >> web >> db_master
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Nested Clusters
|
||||
|
||||
Nested clustering is also possible.
|
||||
|
||||
```python
|
||||
from diagrams import Cluster, Diagram
|
||||
from diagrams.aws.compute import ECS, EKS, Lambda
|
||||
from diagrams.aws.database import Redshift
|
||||
from diagrams.aws.integration import SQS
|
||||
from diagrams.aws.storage import S3
|
||||
|
||||
with Diagram("Event Processing", show=False):
|
||||
source = EKS("k8s source")
|
||||
|
||||
with Cluster("Event Flows"):
|
||||
with Cluster("Event Workers"):
|
||||
workers = [ECS("worker1"),
|
||||
ECS("worker2"),
|
||||
ECS("worker3")]
|
||||
|
||||
queue = SQS("event queue")
|
||||
|
||||
with Cluster("Processing"):
|
||||
handlers = [Lambda("proc1"),
|
||||
Lambda("proc2"),
|
||||
Lambda("proc3")]
|
||||
|
||||
store = S3("events store")
|
||||
dw = Redshift("analytics")
|
||||
|
||||
source >> workers >> queue >> handlers
|
||||
handlers >> store
|
||||
handlers >> dw
|
||||
```
|
||||
|
||||

|
||||
|
||||
> There is no depth limit of nesting. Feel free to create nested clusters as deep as you want.
|
||||
@ -0,0 +1,53 @@
|
||||
---
|
||||
id: diagram
|
||||
title: Diagrams
|
||||
---
|
||||
|
||||
Diagram is a primary object representing a diagram.
|
||||
|
||||
## Basic
|
||||
|
||||
Diagram represents a global diagram context.
|
||||
|
||||
You can create a diagram context with Diagram class. The first parameter of Diagram constructor will be used for output filename.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
|
||||
with Diagram("Simple Diagram"):
|
||||
EC2("web")
|
||||
```
|
||||
|
||||
And if you run the above script with below command,
|
||||
|
||||
```shell
|
||||
$ python diagram.py
|
||||
```
|
||||
|
||||
It will generate an image file with single `EC2` node drawn as `simple_diagram.png` on your working directory, and open that created image file immediately.
|
||||
|
||||
## Options
|
||||
|
||||
You can specify the output file format with `outformat` parameter. Default is **png**.
|
||||
|
||||
> (png, jpg, svg, and pdf) are allowed.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
|
||||
with Diagram("Simple Diagram", outformat="jpg"):
|
||||
EC2("web")
|
||||
```
|
||||
|
||||
You can also disable the automatic file opening by setting the `show` parameter as **false**. Default is **true**.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
|
||||
with Diagram("Simple Diagram", show=False):
|
||||
EC2("web")
|
||||
```
|
||||
|
||||
@ -0,0 +1,129 @@
|
||||
---
|
||||
id: examples
|
||||
title: Examples
|
||||
---
|
||||
|
||||
Here are some more examples.
|
||||
|
||||
## Grouped Workers
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import ELB
|
||||
|
||||
with Diagram("Grouped Workers", show=False, direction="TB"):
|
||||
ELB("lb") >> [EC2("worker1"),
|
||||
EC2("worker2"),
|
||||
EC2("worker3"),
|
||||
EC2("worker4"),
|
||||
EC2("worker5")] >> RDS("events")
|
||||
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Clustered Web Services
|
||||
|
||||
```python
|
||||
from diagrams import Cluster, Diagram
|
||||
from diagrams.aws.compute import ECS
|
||||
from diagrams.aws.database import ElastiCache, RDS
|
||||
from diagrams.aws.network import ELB
|
||||
from diagrams.aws.network import Route53
|
||||
|
||||
with Diagram("Clustered Web Services", show=False):
|
||||
dns = Route53("dns")
|
||||
lb = ELB("lb")
|
||||
|
||||
with Cluster("Services"):
|
||||
svc_group = [ECS("web1"),
|
||||
ECS("web2"),
|
||||
ECS("web3")]
|
||||
|
||||
with Cluster("DB Cluster"):
|
||||
db_master = RDS("userdb")
|
||||
db_master - [RDS("userdb ro")]
|
||||
|
||||
memcached = ElastiCache("memcached")
|
||||
|
||||
dns >> lb >> svc_group
|
||||
svc_group >> db_master
|
||||
svc_group >> memcached
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Event Processing
|
||||
|
||||
```python
|
||||
from diagrams import Cluster, Diagram
|
||||
from diagrams.aws.compute import ECS, EKS, Lambda
|
||||
from diagrams.aws.database import Redshift
|
||||
from diagrams.aws.integration import SQS
|
||||
from diagrams.aws.storage import S3
|
||||
|
||||
with Diagram("Event Processing", show=False):
|
||||
source = EKS("k8s source")
|
||||
|
||||
with Cluster("Event Flows"):
|
||||
with Cluster("Event Workers"):
|
||||
workers = [ECS("worker1"),
|
||||
ECS("worker2"),
|
||||
ECS("worker3")]
|
||||
|
||||
queue = SQS("event queue")
|
||||
|
||||
with Cluster("Processing"):
|
||||
handlers = [Lambda("proc1"),
|
||||
Lambda("proc2"),
|
||||
Lambda("proc3")]
|
||||
|
||||
store = S3("events store")
|
||||
dw = Redshift("analytics")
|
||||
|
||||
source >> workers >> queue >> handlers
|
||||
handlers >> store
|
||||
handlers >> dw
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Message Collecting System
|
||||
|
||||
```python
|
||||
from diagrams import Cluster, Diagram
|
||||
from diagrams.gcp.analytics import BigQuery, Dataflow, PubSub
|
||||
from diagrams.gcp.compute import AppEngine, Functions
|
||||
from diagrams.gcp.database import BigTable
|
||||
from diagrams.gcp.iot import IotCore
|
||||
from diagrams.gcp.storage import GCS
|
||||
|
||||
with Diagram("Message Collecting", show=False):
|
||||
pubsub = PubSub("pubsub")
|
||||
|
||||
with Cluster("Source of Data"):
|
||||
[IotCore("core1"),
|
||||
IotCore("core2"),
|
||||
IotCore("core3")] >> pubsub
|
||||
|
||||
with Cluster("Targets"):
|
||||
with Cluster("Data Flow"):
|
||||
flow = Dataflow("data flow")
|
||||
|
||||
with Cluster("Data Lake"):
|
||||
flow >> [BigQuery("bq"),
|
||||
GCS("storage")]
|
||||
|
||||
with Cluster("Event Driven"):
|
||||
with Cluster("Processing"):
|
||||
flow >> AppEngine("engine") >> BigTable("bigtable")
|
||||
|
||||
with Cluster("Serverless"):
|
||||
flow >> Functions("func") >> AppEngine("appengine")
|
||||
|
||||
pubsub >> flow
|
||||
```
|
||||
|
||||

|
||||
@ -0,0 +1,37 @@
|
||||
---
|
||||
id: installation
|
||||
title: Installation
|
||||
---
|
||||
|
||||
It uses [Graphviz](https://www.graphviz.org/) to render the diagram, so you need to [install Graphviz](https://graphviz.gitlab.io/download/) to use **diagrams**. After installing graphviz (or already have it), install the **diagrams**.
|
||||
|
||||
```shell
|
||||
$ pip install diagrams
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```python
|
||||
# diagram.py
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import ELB
|
||||
|
||||
with Diagram("Web Service", show=False):
|
||||
ELB("lb") >> EC2("web") >> RDS("userdb")
|
||||
```
|
||||
|
||||
This code generates below diagram.
|
||||
|
||||
```shell
|
||||
$ python diagram.py
|
||||
```
|
||||
|
||||

|
||||
|
||||
It will be saved as `web_service.png` on your working directory.
|
||||
|
||||
## Next
|
||||
|
||||
See more [Examples](/docs/examples) or see [Guides](/docs/diagram) page for more details.
|
||||
@ -0,0 +1,113 @@
|
||||
---
|
||||
id: node
|
||||
title: Nodes
|
||||
---
|
||||
|
||||
Node is a second object representing a node or system component.
|
||||
|
||||
## Basic
|
||||
|
||||
Node is an abstract concept that represents a single system component object.
|
||||
|
||||
A node object consists of three parts: **provider**, **resource type** and **name**. You may already have seen each part in the previous example.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
|
||||
with Diagram("Simple Diagram"):
|
||||
EC2("web")
|
||||
```
|
||||
|
||||
In above example, the `EC2` is a node of `compute` resource type which provided by `aws` provider.
|
||||
|
||||
You can use other node objects in a similar manner like:
|
||||
|
||||
```python
|
||||
# aws resources
|
||||
from diagrams.aws.compute import ECS, Lambda
|
||||
from diagrams.aws.database import RDS, ElastiCache
|
||||
from diagrams.aws.network import ELB, Route53, VPC
|
||||
...
|
||||
|
||||
# azure resources
|
||||
from diagrams.azure.compute import FunctionApps
|
||||
from diagrams.azure.storage import BlobStorage
|
||||
...
|
||||
|
||||
# gcp resources
|
||||
from diagrams.gcp.compute import AppEngine, GKE
|
||||
from diagrams.gcp.ml import AutoML
|
||||
...
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
|
||||
You can represent data flow by connecting the nodes with these operators: `>>`, `<<` and `-`.
|
||||
|
||||
* **>>**: Connect nodes in left to right direction.
|
||||
* **<<**: Connect nodes in right to left direction.
|
||||
* **-**: Connect nodes in no direction. Undirected.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import ELB
|
||||
from diagrams.aws.storage import S3
|
||||
|
||||
with Diagram("Web Services", show=False):
|
||||
ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
|
||||
ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
|
||||
(ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")
|
||||
```
|
||||
|
||||
> Be careful when using the `-` and any shift operators together, which could cause unexpected results due to operator precedence.
|
||||
|
||||

|
||||
|
||||
> The order of rendered diagrams is the reverse of the declaration order.
|
||||
|
||||
You can change the data flow direction with `direction` parameter. Default is **LR**.
|
||||
|
||||
> (TB, BT, LR and RL) are allowed.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import ELB
|
||||
|
||||
with Diagram("Workers", show=False, direction="TB"):
|
||||
lb = ELB("lb")
|
||||
db = RDS("events")
|
||||
lb >> EC2("worker1") >> db
|
||||
lb >> EC2("worker2") >> db
|
||||
lb >> EC2("worker3") >> db
|
||||
lb >> EC2("worker4") >> db
|
||||
lb >> EC2("worker5") >> db
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Group Data Flow
|
||||
|
||||
Above worker example has too many redundant flows. In this case, you can group nodes into a list so that all nodes are connected to other nodes at once.
|
||||
|
||||
```python
|
||||
from diagrams import Diagram
|
||||
from diagrams.aws.compute import EC2
|
||||
from diagrams.aws.database import RDS
|
||||
from diagrams.aws.network import ELB
|
||||
|
||||
with Diagram("Grouped Workers", show=False, direction="TB"):
|
||||
ELB("lb") >> [EC2("worker1"),
|
||||
EC2("worker2"),
|
||||
EC2("worker3"),
|
||||
EC2("worker4"),
|
||||
EC2("worker5")] >> RDS("events")
|
||||
```
|
||||
|
||||

|
||||
|
||||
> You can't connect two **lists** directly because shift/arithmetic operations between lists are not allowed in Python.
|
||||
@ -0,0 +1,279 @@
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||
name = "appdirs"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "1.4.3"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "An abstract syntax tree for Python with inference support."
|
||||
name = "astroid"
|
||||
optional = false
|
||||
python-versions = ">=3.5.*"
|
||||
version = "2.3.3"
|
||||
|
||||
[package.dependencies]
|
||||
lazy-object-proxy = ">=1.4.0,<1.5.0"
|
||||
six = ">=1.12,<2.0"
|
||||
wrapt = ">=1.11.0,<1.12.0"
|
||||
|
||||
[package.dependencies.typed-ast]
|
||||
python = "<3.8"
|
||||
version = ">=1.4.0,<1.5"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Atomic file writes."
|
||||
name = "atomicwrites"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "1.3.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Classes Without Boilerplate"
|
||||
name = "attrs"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "19.3.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "The uncompromising code formatter."
|
||||
name = "black"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
version = "18.9b0"
|
||||
|
||||
[package.dependencies]
|
||||
appdirs = "*"
|
||||
attrs = ">=17.4.0"
|
||||
click = ">=6.5"
|
||||
toml = ">=0.9.4"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Composable command line interface toolkit"
|
||||
name = "click"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "7.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Cross-platform colored terminal text."
|
||||
marker = "sys_platform == \"win32\""
|
||||
name = "colorama"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "0.4.1"
|
||||
|
||||
[[package]]
|
||||
category = "main"
|
||||
description = "Simple Python interface for Graphviz"
|
||||
name = "graphviz"
|
||||
optional = false
|
||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
|
||||
version = "0.13.2"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Read metadata from Python packages"
|
||||
marker = "python_version < \"3.8\""
|
||||
name = "importlib-metadata"
|
||||
optional = false
|
||||
python-versions = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3"
|
||||
version = "0.23"
|
||||
|
||||
[package.dependencies]
|
||||
zipp = ">=0.5"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "A Python utility / library to sort Python imports."
|
||||
name = "isort"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "4.3.21"
|
||||
|
||||
[[package]]
|
||||
category = "main"
|
||||
description = "A very fast and expressive template engine."
|
||||
name = "jinja2"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "2.10.3"
|
||||
|
||||
[package.dependencies]
|
||||
MarkupSafe = ">=0.23"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "A fast and thorough lazy object proxy."
|
||||
name = "lazy-object-proxy"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "1.4.3"
|
||||
|
||||
[[package]]
|
||||
category = "main"
|
||||
description = "Safely add untrusted strings to HTML/XML markup."
|
||||
name = "markupsafe"
|
||||
optional = false
|
||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
|
||||
version = "1.1.1"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "McCabe checker, plugin for flake8"
|
||||
name = "mccabe"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "0.6.1"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "More routines for operating on iterables, beyond itertools"
|
||||
name = "more-itertools"
|
||||
optional = false
|
||||
python-versions = ">=3.4"
|
||||
version = "7.2.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "plugin and hook calling mechanisms for python"
|
||||
name = "pluggy"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "0.13.0"
|
||||
|
||||
[package.dependencies]
|
||||
[package.dependencies.importlib-metadata]
|
||||
python = "<3.8"
|
||||
version = ">=0.12"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
||||
name = "py"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "1.8.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "python code static checker"
|
||||
name = "pylint"
|
||||
optional = false
|
||||
python-versions = ">=3.5.*"
|
||||
version = "2.4.4"
|
||||
|
||||
[package.dependencies]
|
||||
astroid = ">=2.3.0,<2.4"
|
||||
colorama = "*"
|
||||
isort = ">=4.2.5,<5"
|
||||
mccabe = ">=0.6,<0.7"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "pytest: simple powerful testing with Python"
|
||||
name = "pytest"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
version = "3.10.1"
|
||||
|
||||
[package.dependencies]
|
||||
atomicwrites = ">=1.0"
|
||||
attrs = ">=17.4.0"
|
||||
colorama = "*"
|
||||
more-itertools = ">=4.0.0"
|
||||
pluggy = ">=0.7"
|
||||
py = ">=1.5.0"
|
||||
setuptools = "*"
|
||||
six = ">=1.10.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "a python refactoring library..."
|
||||
name = "rope"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "0.14.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Python 2 and 3 compatibility utilities"
|
||||
name = "six"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*"
|
||||
version = "1.13.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||
name = "toml"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "0.10.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
||||
marker = "implementation_name == \"cpython\" and python_version < \"3.8\""
|
||||
name = "typed-ast"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "1.4.0"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Module for decorators, wrappers and monkey patching."
|
||||
name = "wrapt"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "1.11.2"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
marker = "python_version < \"3.8\""
|
||||
name = "zipp"
|
||||
optional = false
|
||||
python-versions = ">=2.7"
|
||||
version = "0.6.0"
|
||||
|
||||
[package.dependencies]
|
||||
more-itertools = "*"
|
||||
|
||||
[metadata]
|
||||
content-hash = "3b785a1e91f632b465008b9c48568990a6466dcf38b52f47d0cf982b706c4659"
|
||||
python-versions = "^3.7"
|
||||
|
||||
[metadata.hashes]
|
||||
appdirs = ["9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", "d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"]
|
||||
astroid = ["71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", "840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"]
|
||||
atomicwrites = ["03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", "75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"]
|
||||
attrs = ["08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", "f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"]
|
||||
black = ["817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"]
|
||||
click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"]
|
||||
colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"]
|
||||
graphviz = ["241fb099e32b8e8c2acca747211c8237e40c0b89f24b1622860075d59f4c4b25", "60acbeee346e8c14555821eab57dbf68a169e6c10bce40e83c1bf44f63a62a01"]
|
||||
importlib-metadata = ["aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", "d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af"]
|
||||
isort = ["54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", "6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"]
|
||||
jinja2 = ["74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", "9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"]
|
||||
lazy-object-proxy = ["0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", "194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", "1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", "4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", "48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", "5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", "59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", "8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", "9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", "9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", "97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", "9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", "a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", "a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", "ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", "cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", "d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", "d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", "eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", "efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", "f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"]
|
||||
markupsafe = ["00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", "09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", "24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", "62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", "6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", "7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", "88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", "8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", "98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", "9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", "9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", "ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", "b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", "b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", "b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", "ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", "e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"]
|
||||
mccabe = ["ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"]
|
||||
more-itertools = ["409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", "92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4"]
|
||||
pluggy = ["0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", "fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34"]
|
||||
py = ["64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", "dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"]
|
||||
pylint = ["3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd", "886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"]
|
||||
pytest = ["3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec", "e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"]
|
||||
rope = ["6b728fdc3e98a83446c27a91fc5d56808a004f8beab7a31ab1d7224cecc7d969", "c5c5a6a87f7b1a2095fb311135e2a3d1f194f5ecb96900fdd0a9100881f48aaf", "f0dcf719b63200d492b85535ebe5ea9b29e0d0b8aebeb87fe03fc1a65924fdaf"]
|
||||
six = ["1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", "30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"]
|
||||
toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"]
|
||||
typed-ast = ["1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", "18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", "262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", "2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", "354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", "48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", "4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", "630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", "66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", "71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", "7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", "838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", "95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", "bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", "cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", "d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", "d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", "d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", "fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", "ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"]
|
||||
wrapt = ["565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"]
|
||||
zipp = ["3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", "f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"]
|
||||
@ -0,0 +1,25 @@
|
||||
[tool.poetry]
|
||||
name = "diagrams"
|
||||
version = "0.1.0"
|
||||
description = "Diagram as Code"
|
||||
license = "MIT"
|
||||
authors = ["mingrammer <mingrammer@gmail.com>"]
|
||||
readme = "README.md"
|
||||
homepage = "https://diagrams.mingrammer.com"
|
||||
repository = "https://github.com/mingrammer/diagrams"
|
||||
include = ["resources/**/*"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.6"
|
||||
graphviz = "^0.13.2"
|
||||
jinja2 = "^2.10"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
pytest = "^3.0"
|
||||
pylint = "^2.4"
|
||||
black = {version = "^18.3-alpha.0", allows-prereleases = true}
|
||||
rope = "^0.14.0"
|
||||
isort = "^4.3"
|
||||
|
||||
[tool.black]
|
||||
line-length = 120
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 34 KiB |