Quellcode durchsuchen

feat: initial commit

tags/v0.2.0
mingrammer vor 4 Jahren
Commit
b384b723b3
100 geänderte Dateien mit 3430 neuen und 0 gelöschten Zeilen
  1. +21
    -0
      .gitignore
  2. +33
    -0
      CONTRIBUTING.md
  3. +40
    -0
      README.md
  4. BIN
      assets/img/diagrams.png
  5. +39
    -0
      autogen.sh
  6. +148
    -0
      config.py
  7. +366
    -0
      diagrams/__init__.py
  8. +12
    -0
      diagrams/aws/__init__.py
  9. +77
    -0
      diagrams/aws/analytics.py
  10. +102
    -0
      diagrams/aws/compute.py
  11. +66
    -0
      diagrams/aws/database.py
  12. +58
    -0
      diagrams/aws/devtools.py
  13. +47
    -0
      diagrams/aws/integration.py
  14. +61
    -0
      diagrams/aws/iot.py
  15. +61
    -0
      diagrams/aws/migration.py
  16. +89
    -0
      diagrams/aws/ml.py
  17. +71
    -0
      diagrams/aws/network.py
  18. +95
    -0
      diagrams/aws/security.py
  19. +81
    -0
      diagrams/aws/storage.py
  20. +12
    -0
      diagrams/azure/__init__.py
  21. +55
    -0
      diagrams/azure/analytics.py
  22. +94
    -0
      diagrams/azure/compute.py
  23. +79
    -0
      diagrams/azure/database.py
  24. +43
    -0
      diagrams/azure/devops.py
  25. +63
    -0
      diagrams/azure/identity.py
  26. +51
    -0
      diagrams/azure/iot.py
  27. +23
    -0
      diagrams/azure/migration.py
  28. +43
    -0
      diagrams/azure/ml.py
  29. +23
    -0
      diagrams/azure/mobile.py
  30. +115
    -0
      diagrams/azure/network.py
  31. +23
    -0
      diagrams/azure/security.py
  32. +75
    -0
      diagrams/azure/storage.py
  33. +51
    -0
      diagrams/azure/web.py
  34. +12
    -0
      diagrams/base/__init__.py
  35. +12
    -0
      diagrams/gcp/__init__.py
  36. +54
    -0
      diagrams/gcp/analytics.py
  37. +48
    -0
      diagrams/gcp/compute.py
  38. +37
    -0
      diagrams/gcp/database.py
  39. +73
    -0
      diagrams/gcp/devtools.py
  40. +15
    -0
      diagrams/gcp/iot.py
  41. +15
    -0
      diagrams/gcp/migration.py
  42. +100
    -0
      diagrams/gcp/ml.py
  43. +81
    -0
      diagrams/gcp/network.py
  44. +34
    -0
      diagrams/gcp/security.py
  45. +25
    -0
      diagrams/gcp/storage.py
  46. +71
    -0
      docs/cluster.md
  47. +53
    -0
      docs/diagram.md
  48. +129
    -0
      docs/examples.md
  49. +37
    -0
      docs/installation.md
  50. +113
    -0
      docs/node.md
  51. +279
    -0
      poetry.lock
  52. +25
    -0
      pyproject.toml
  53. BIN
      resources/aws/analytics/analytics.png
  54. BIN
      resources/aws/analytics/athena.png
  55. BIN
      resources/aws/analytics/cloudsearch.png
  56. BIN
      resources/aws/analytics/data-pipeline.png
  57. BIN
      resources/aws/analytics/elasticsearch-service.png
  58. BIN
      resources/aws/analytics/emr.png
  59. BIN
      resources/aws/analytics/glue.png
  60. BIN
      resources/aws/analytics/kinesis-data-analytics.png
  61. BIN
      resources/aws/analytics/kinesis-data-firehose.png
  62. BIN
      resources/aws/analytics/kinesis-data-streams.png
  63. BIN
      resources/aws/analytics/kinesis-video-streams.png
  64. BIN
      resources/aws/analytics/kinesis.png
  65. BIN
      resources/aws/analytics/lake-formation.png
  66. BIN
      resources/aws/analytics/managed-streaming-for-kafka.png
  67. BIN
      resources/aws/analytics/quicksight.png
  68. BIN
      resources/aws/analytics/redshift.png
  69. BIN
      resources/aws/compute/application-auto-scaling-rounded.png
  70. BIN
      resources/aws/compute/application-auto-scaling.png
  71. BIN
      resources/aws/compute/batch-rounded.png
  72. BIN
      resources/aws/compute/batch.png
  73. BIN
      resources/aws/compute/compute-rounded.png
  74. BIN
      resources/aws/compute/compute.png
  75. BIN
      resources/aws/compute/ec2-container-registry-rounded.png
  76. BIN
      resources/aws/compute/ec2-container-registry.png
  77. BIN
      resources/aws/compute/ec2-rounded.png
  78. BIN
      resources/aws/compute/ec2.png
  79. BIN
      resources/aws/compute/elastic-beanstalk-rounded.png
  80. BIN
      resources/aws/compute/elastic-beanstalk.png
  81. BIN
      resources/aws/compute/elastic-container-service-rounded.png
  82. BIN
      resources/aws/compute/elastic-container-service.png
  83. BIN
      resources/aws/compute/elastic-kubernetes-service-rounded.png
  84. BIN
      resources/aws/compute/elastic-kubernetes-service.png
  85. BIN
      resources/aws/compute/fargate-rounded.png
  86. BIN
      resources/aws/compute/fargate.png
  87. BIN
      resources/aws/compute/lambda-rounded.png
  88. BIN
      resources/aws/compute/lambda.png
  89. BIN
      resources/aws/compute/lightsail-rounded.png
  90. BIN
      resources/aws/compute/lightsail.png
  91. BIN
      resources/aws/compute/outposts-rounded.png
  92. BIN
      resources/aws/compute/outposts.png
  93. BIN
      resources/aws/compute/serverless-application-repository-rounded.png
  94. BIN
      resources/aws/compute/serverless-application-repository.png
  95. BIN
      resources/aws/compute/thinkbox-deadline-rounded.png
  96. BIN
      resources/aws/compute/thinkbox-deadline.png
  97. BIN
      resources/aws/compute/thinkbox-draft-rounded.png
  98. BIN
      resources/aws/compute/thinkbox-draft.png
  99. BIN
      resources/aws/compute/thinkbox-frost-rounded.png
  100. BIN
      resources/aws/compute/thinkbox-frost.png

+ 21
- 0
.gitignore Datei anzeigen

@@ -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

+ 33
- 0
CONTRIBUTING.md Datei anzeigen

@@ -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
```

+ 40
- 0
README.md Datei anzeigen

@@ -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)

BIN
assets/img/diagrams.png Datei anzeigen

Vorher Nachher
Breite: 192  |  Höhe: 192  |  Größe: 6.7 KiB

+ 39
- 0
autogen.sh Datei anzeigen

@@ -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

+ 148
- 0
config.py Datei anzeigen

@@ -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",
},
},
}

+ 366
- 0
diagrams/__init__.py Datei anzeigen

@@ -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

+ 12
- 0
diagrams/aws/__init__.py Datei anzeigen

@@ -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"

+ 77
- 0
diagrams/aws/analytics.py Datei anzeigen

@@ -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

+ 102
- 0
diagrams/aws/compute.py Datei anzeigen

@@ -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

+ 66
- 0
diagrams/aws/database.py Datei anzeigen

@@ -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

+ 58
- 0
diagrams/aws/devtools.py Datei anzeigen

@@ -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

+ 47
- 0
diagrams/aws/integration.py Datei anzeigen

@@ -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

+ 61
- 0
diagrams/aws/iot.py Datei anzeigen

@@ -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

+ 61
- 0
diagrams/aws/migration.py Datei anzeigen

@@ -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

+ 89
- 0
diagrams/aws/ml.py Datei anzeigen

@@ -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

+ 71
- 0
diagrams/aws/network.py Datei anzeigen

@@ -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

+ 95
- 0
diagrams/aws/security.py Datei anzeigen

@@ -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

+ 81
- 0
diagrams/aws/storage.py Datei anzeigen

@@ -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

+ 12
- 0
diagrams/azure/__init__.py Datei anzeigen

@@ -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"

+ 55
- 0
diagrams/azure/analytics.py Datei anzeigen

@@ -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

+ 94
- 0
diagrams/azure/compute.py Datei anzeigen

@@ -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

+ 79
- 0
diagrams/azure/database.py Datei anzeigen

@@ -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

+ 43
- 0
diagrams/azure/devops.py Datei anzeigen

@@ -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

+ 63
- 0
diagrams/azure/identity.py Datei anzeigen

@@ -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

+ 51
- 0
diagrams/azure/iot.py Datei anzeigen

@@ -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

+ 23
- 0
diagrams/azure/migration.py Datei anzeigen

@@ -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

+ 43
- 0
diagrams/azure/ml.py Datei anzeigen

@@ -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

+ 23
- 0
diagrams/azure/mobile.py Datei anzeigen

@@ -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

+ 115
- 0
diagrams/azure/network.py Datei anzeigen

@@ -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

+ 23
- 0
diagrams/azure/security.py Datei anzeigen

@@ -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

+ 75
- 0
diagrams/azure/storage.py Datei anzeigen

@@ -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

+ 51
- 0
diagrams/azure/web.py Datei anzeigen

@@ -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

+ 12
- 0
diagrams/base/__init__.py Datei anzeigen

@@ -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"

+ 12
- 0
diagrams/gcp/__init__.py Datei anzeigen

@@ -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"

+ 54
- 0
diagrams/gcp/analytics.py Datei anzeigen

@@ -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

+ 48
- 0
diagrams/gcp/compute.py Datei anzeigen

@@ -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

+ 37
- 0
diagrams/gcp/database.py Datei anzeigen

@@ -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

+ 73
- 0
diagrams/gcp/devtools.py Datei anzeigen

@@ -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

+ 15
- 0
diagrams/gcp/iot.py Datei anzeigen

@@ -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

+ 15
- 0
diagrams/gcp/migration.py Datei anzeigen

@@ -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

+ 100
- 0
diagrams/gcp/ml.py Datei anzeigen

@@ -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

+ 81
- 0
diagrams/gcp/network.py Datei anzeigen

@@ -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

+ 34
- 0
diagrams/gcp/security.py Datei anzeigen

@@ -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

+ 25
- 0
diagrams/gcp/storage.py Datei anzeigen

@@ -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

+ 71
- 0
docs/cluster.md Datei anzeigen

@@ -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
```

![simple web service with db cluster diagram](/img/simple_web_service_with_db_cluster_diagram.png)

## 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
```

![event processing diagram](/img/event_processing_diagram.png)

> There is no depth limit of nesting. Feel free to create nested clusters as deep as you want.

+ 53
- 0
docs/diagram.md Datei anzeigen

@@ -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")
```

+ 129
- 0
docs/examples.md Datei anzeigen

@@ -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")

```

![grouped workers diagram](/img/grouped_workers_diagram.png)

## 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
```

![clustered web services diagram](/img/clustered_web_services_diagram.png)

## 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
```

![event processing diagram](/img/event_processing_diagram.png)

## 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
```

![message collecting diagram](/img/message_collecting_diagram.png)

+ 37
- 0
docs/installation.md Datei anzeigen

@@ -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
```

![web service diagram](/img/web_service_diagram.png)

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.

+ 113
- 0
docs/node.md Datei anzeigen

@@ -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.

![web services diagram](/img/web_services_diagram.png)

> 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
```

![workers diagram](/img/workers_diagram.png)

## 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")
```

![grouped workers diagram](/img/grouped_workers_diagram.png)

> You can't connect two **lists** directly because shift/arithmetic operations between lists are not allowed in Python.

+ 279
- 0
poetry.lock Datei anzeigen

@@ -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"]

+ 25
- 0
pyproject.toml Datei anzeigen

@@ -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

BIN
resources/aws/analytics/analytics.png Datei anzeigen

Vorher Nachher
Breite: 400  |  Höhe: 400  |  Größe: 12 KiB

BIN
resources/aws/analytics/athena.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 19 KiB

BIN
resources/aws/analytics/cloudsearch.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/analytics/data-pipeline.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 11 KiB

BIN
resources/aws/analytics/elasticsearch-service.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/analytics/emr.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 18 KiB

BIN
resources/aws/analytics/glue.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 12 KiB

BIN
resources/aws/analytics/kinesis-data-analytics.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/analytics/kinesis-data-firehose.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 13 KiB

BIN
resources/aws/analytics/kinesis-data-streams.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 17 KiB

BIN
resources/aws/analytics/kinesis-video-streams.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/analytics/kinesis.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/analytics/lake-formation.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 18 KiB

BIN
resources/aws/analytics/managed-streaming-for-kafka.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 18 KiB

BIN
resources/aws/analytics/quicksight.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 12 KiB

BIN
resources/aws/analytics/redshift.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/compute/application-auto-scaling-rounded.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 22 KiB

BIN
resources/aws/compute/application-auto-scaling.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 22 KiB

BIN
resources/aws/compute/batch-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 17 KiB

BIN
resources/aws/compute/batch.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 17 KiB

BIN
resources/aws/compute/compute-rounded.png Datei anzeigen

Vorher Nachher
Breite: 400  |  Höhe: 400  |  Größe: 11 KiB

BIN
resources/aws/compute/compute.png Datei anzeigen

Vorher Nachher
Breite: 400  |  Höhe: 400  |  Größe: 11 KiB

BIN
resources/aws/compute/ec2-container-registry-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/compute/ec2-container-registry.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 14 KiB

BIN
resources/aws/compute/ec2-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 8.7 KiB

BIN
resources/aws/compute/ec2.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 8.7 KiB

BIN
resources/aws/compute/elastic-beanstalk-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/compute/elastic-beanstalk.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/compute/elastic-container-service-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/elastic-container-service.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/elastic-kubernetes-service-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/elastic-kubernetes-service.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/fargate-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/fargate.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 16 KiB

BIN
resources/aws/compute/lambda-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 12 KiB

BIN
resources/aws/compute/lambda.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 12 KiB

BIN
resources/aws/compute/lightsail-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/compute/lightsail.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 15 KiB

BIN
resources/aws/compute/outposts-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 11 KiB

BIN
resources/aws/compute/outposts.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 11 KiB

BIN
resources/aws/compute/serverless-application-repository-rounded.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 13 KiB

BIN
resources/aws/compute/serverless-application-repository.png Datei anzeigen

Vorher Nachher
Breite: 300  |  Höhe: 300  |  Größe: 13 KiB

BIN
resources/aws/compute/thinkbox-deadline-rounded.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 30 KiB

BIN
resources/aws/compute/thinkbox-deadline.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 30 KiB

BIN
resources/aws/compute/thinkbox-draft-rounded.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 32 KiB

BIN
resources/aws/compute/thinkbox-draft.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 32 KiB

BIN
resources/aws/compute/thinkbox-frost-rounded.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 34 KiB

BIN
resources/aws/compute/thinkbox-frost.png Datei anzeigen

Vorher Nachher
Breite: 500  |  Höhe: 500  |  Größe: 34 KiB

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.

Laden…
Abbrechen
Speichern