commit b384b723b38183efc5f3b9681d1361f74216d573 Author: mingrammer Date: Mon Feb 3 00:29:39 2020 +0900 feat: initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..00e91420 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..d541633f --- /dev/null +++ b/CONTRIBUTING.md @@ -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///`. + +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 +``` diff --git a/README.md b/README.md new file mode 100644 index 00000000..70b6ba54 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +

+ +

+ +

Diagrams

+

+ Diagram as Code +

+ +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) \ No newline at end of file diff --git a/assets/img/diagrams.png b/assets/img/diagrams.png new file mode 100644 index 00000000..1c36914c Binary files /dev/null and b/assets/img/diagrams.png differ diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..c5859de3 --- /dev/null +++ b/autogen.sh @@ -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 diff --git a/config.py b/config.py new file mode 100644 index 00000000..f19bec87 --- /dev/null +++ b/config.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", + }, + }, +} diff --git a/diagrams/__init__.py b/diagrams/__init__.py new file mode 100644 index 00000000..7c2c3523 --- /dev/null +++ b/diagrams/__init__.py @@ -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 diff --git a/diagrams/aws/__init__.py b/diagrams/aws/__init__.py new file mode 100644 index 00000000..1550a0df --- /dev/null +++ b/diagrams/aws/__init__.py @@ -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" diff --git a/diagrams/aws/analytics.py b/diagrams/aws/analytics.py new file mode 100644 index 00000000..dc8e6527 --- /dev/null +++ b/diagrams/aws/analytics.py @@ -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 diff --git a/diagrams/aws/compute.py b/diagrams/aws/compute.py new file mode 100644 index 00000000..923a1252 --- /dev/null +++ b/diagrams/aws/compute.py @@ -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 diff --git a/diagrams/aws/database.py b/diagrams/aws/database.py new file mode 100644 index 00000000..84065363 --- /dev/null +++ b/diagrams/aws/database.py @@ -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 diff --git a/diagrams/aws/devtools.py b/diagrams/aws/devtools.py new file mode 100644 index 00000000..650c16f9 --- /dev/null +++ b/diagrams/aws/devtools.py @@ -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 diff --git a/diagrams/aws/integration.py b/diagrams/aws/integration.py new file mode 100644 index 00000000..24b7241e --- /dev/null +++ b/diagrams/aws/integration.py @@ -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 diff --git a/diagrams/aws/iot.py b/diagrams/aws/iot.py new file mode 100644 index 00000000..d413d3ed --- /dev/null +++ b/diagrams/aws/iot.py @@ -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 diff --git a/diagrams/aws/migration.py b/diagrams/aws/migration.py new file mode 100644 index 00000000..d7a8bdbc --- /dev/null +++ b/diagrams/aws/migration.py @@ -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 diff --git a/diagrams/aws/ml.py b/diagrams/aws/ml.py new file mode 100644 index 00000000..b09a4a3a --- /dev/null +++ b/diagrams/aws/ml.py @@ -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 diff --git a/diagrams/aws/network.py b/diagrams/aws/network.py new file mode 100644 index 00000000..be9cd6e0 --- /dev/null +++ b/diagrams/aws/network.py @@ -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 diff --git a/diagrams/aws/security.py b/diagrams/aws/security.py new file mode 100644 index 00000000..d03d7175 --- /dev/null +++ b/diagrams/aws/security.py @@ -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 diff --git a/diagrams/aws/storage.py b/diagrams/aws/storage.py new file mode 100644 index 00000000..65efe40e --- /dev/null +++ b/diagrams/aws/storage.py @@ -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 diff --git a/diagrams/azure/__init__.py b/diagrams/azure/__init__.py new file mode 100644 index 00000000..0b80ace0 --- /dev/null +++ b/diagrams/azure/__init__.py @@ -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" diff --git a/diagrams/azure/analytics.py b/diagrams/azure/analytics.py new file mode 100644 index 00000000..85c994eb --- /dev/null +++ b/diagrams/azure/analytics.py @@ -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 diff --git a/diagrams/azure/compute.py b/diagrams/azure/compute.py new file mode 100644 index 00000000..aad7b171 --- /dev/null +++ b/diagrams/azure/compute.py @@ -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 diff --git a/diagrams/azure/database.py b/diagrams/azure/database.py new file mode 100644 index 00000000..8e2fb540 --- /dev/null +++ b/diagrams/azure/database.py @@ -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 diff --git a/diagrams/azure/devops.py b/diagrams/azure/devops.py new file mode 100644 index 00000000..b7c1e8fe --- /dev/null +++ b/diagrams/azure/devops.py @@ -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 diff --git a/diagrams/azure/identity.py b/diagrams/azure/identity.py new file mode 100644 index 00000000..19a0e394 --- /dev/null +++ b/diagrams/azure/identity.py @@ -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 diff --git a/diagrams/azure/iot.py b/diagrams/azure/iot.py new file mode 100644 index 00000000..5d6dce8e --- /dev/null +++ b/diagrams/azure/iot.py @@ -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 diff --git a/diagrams/azure/migration.py b/diagrams/azure/migration.py new file mode 100644 index 00000000..3c69da4e --- /dev/null +++ b/diagrams/azure/migration.py @@ -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 diff --git a/diagrams/azure/ml.py b/diagrams/azure/ml.py new file mode 100644 index 00000000..295a261e --- /dev/null +++ b/diagrams/azure/ml.py @@ -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 diff --git a/diagrams/azure/mobile.py b/diagrams/azure/mobile.py new file mode 100644 index 00000000..a0663f3d --- /dev/null +++ b/diagrams/azure/mobile.py @@ -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 diff --git a/diagrams/azure/network.py b/diagrams/azure/network.py new file mode 100644 index 00000000..2e3e4043 --- /dev/null +++ b/diagrams/azure/network.py @@ -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 diff --git a/diagrams/azure/security.py b/diagrams/azure/security.py new file mode 100644 index 00000000..0c4fe96e --- /dev/null +++ b/diagrams/azure/security.py @@ -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 diff --git a/diagrams/azure/storage.py b/diagrams/azure/storage.py new file mode 100644 index 00000000..80f54633 --- /dev/null +++ b/diagrams/azure/storage.py @@ -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 diff --git a/diagrams/azure/web.py b/diagrams/azure/web.py new file mode 100644 index 00000000..b99a61cc --- /dev/null +++ b/diagrams/azure/web.py @@ -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 diff --git a/diagrams/base/__init__.py b/diagrams/base/__init__.py new file mode 100644 index 00000000..8180b7c4 --- /dev/null +++ b/diagrams/base/__init__.py @@ -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" diff --git a/diagrams/gcp/__init__.py b/diagrams/gcp/__init__.py new file mode 100644 index 00000000..1188a8d0 --- /dev/null +++ b/diagrams/gcp/__init__.py @@ -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" diff --git a/diagrams/gcp/analytics.py b/diagrams/gcp/analytics.py new file mode 100644 index 00000000..25395466 --- /dev/null +++ b/diagrams/gcp/analytics.py @@ -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 diff --git a/diagrams/gcp/compute.py b/diagrams/gcp/compute.py new file mode 100644 index 00000000..6225de03 --- /dev/null +++ b/diagrams/gcp/compute.py @@ -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 diff --git a/diagrams/gcp/database.py b/diagrams/gcp/database.py new file mode 100644 index 00000000..36851ae4 --- /dev/null +++ b/diagrams/gcp/database.py @@ -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 diff --git a/diagrams/gcp/devtools.py b/diagrams/gcp/devtools.py new file mode 100644 index 00000000..a22d209e --- /dev/null +++ b/diagrams/gcp/devtools.py @@ -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 diff --git a/diagrams/gcp/iot.py b/diagrams/gcp/iot.py new file mode 100644 index 00000000..9a792cd6 --- /dev/null +++ b/diagrams/gcp/iot.py @@ -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 diff --git a/diagrams/gcp/migration.py b/diagrams/gcp/migration.py new file mode 100644 index 00000000..8929cf71 --- /dev/null +++ b/diagrams/gcp/migration.py @@ -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 diff --git a/diagrams/gcp/ml.py b/diagrams/gcp/ml.py new file mode 100644 index 00000000..080067db --- /dev/null +++ b/diagrams/gcp/ml.py @@ -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 diff --git a/diagrams/gcp/network.py b/diagrams/gcp/network.py new file mode 100644 index 00000000..1863b169 --- /dev/null +++ b/diagrams/gcp/network.py @@ -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 diff --git a/diagrams/gcp/security.py b/diagrams/gcp/security.py new file mode 100644 index 00000000..227b730e --- /dev/null +++ b/diagrams/gcp/security.py @@ -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 diff --git a/diagrams/gcp/storage.py b/diagrams/gcp/storage.py new file mode 100644 index 00000000..d6549567 --- /dev/null +++ b/diagrams/gcp/storage.py @@ -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 diff --git a/docs/cluster.md b/docs/cluster.md new file mode 100644 index 00000000..6cbf820e --- /dev/null +++ b/docs/cluster.md @@ -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. \ No newline at end of file diff --git a/docs/diagram.md b/docs/diagram.md new file mode 100644 index 00000000..14895427 --- /dev/null +++ b/docs/diagram.md @@ -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") +``` + \ No newline at end of file diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 00000000..0ea7fa6e --- /dev/null +++ b/docs/examples.md @@ -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) diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000..0ed4c8ec --- /dev/null +++ b/docs/installation.md @@ -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. diff --git a/docs/node.md b/docs/node.md new file mode 100644 index 00000000..91657539 --- /dev/null +++ b/docs/node.md @@ -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. diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..81723be6 --- /dev/null +++ b/poetry.lock @@ -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"] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..824b2fd6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "diagrams" +version = "0.1.0" +description = "Diagram as Code" +license = "MIT" +authors = ["mingrammer "] +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 diff --git a/resources/aws/analytics/analytics.png b/resources/aws/analytics/analytics.png new file mode 100644 index 00000000..c9fc7c63 Binary files /dev/null and b/resources/aws/analytics/analytics.png differ diff --git a/resources/aws/analytics/athena.png b/resources/aws/analytics/athena.png new file mode 100644 index 00000000..e51abb58 Binary files /dev/null and b/resources/aws/analytics/athena.png differ diff --git a/resources/aws/analytics/cloudsearch.png b/resources/aws/analytics/cloudsearch.png new file mode 100644 index 00000000..1bc03c15 Binary files /dev/null and b/resources/aws/analytics/cloudsearch.png differ diff --git a/resources/aws/analytics/data-pipeline.png b/resources/aws/analytics/data-pipeline.png new file mode 100644 index 00000000..3e3036bf Binary files /dev/null and b/resources/aws/analytics/data-pipeline.png differ diff --git a/resources/aws/analytics/elasticsearch-service.png b/resources/aws/analytics/elasticsearch-service.png new file mode 100644 index 00000000..da8f9a6f Binary files /dev/null and b/resources/aws/analytics/elasticsearch-service.png differ diff --git a/resources/aws/analytics/emr.png b/resources/aws/analytics/emr.png new file mode 100644 index 00000000..df85811e Binary files /dev/null and b/resources/aws/analytics/emr.png differ diff --git a/resources/aws/analytics/glue.png b/resources/aws/analytics/glue.png new file mode 100644 index 00000000..b91416f0 Binary files /dev/null and b/resources/aws/analytics/glue.png differ diff --git a/resources/aws/analytics/kinesis-data-analytics.png b/resources/aws/analytics/kinesis-data-analytics.png new file mode 100644 index 00000000..0f52bd2e Binary files /dev/null and b/resources/aws/analytics/kinesis-data-analytics.png differ diff --git a/resources/aws/analytics/kinesis-data-firehose.png b/resources/aws/analytics/kinesis-data-firehose.png new file mode 100644 index 00000000..b543e85f Binary files /dev/null and b/resources/aws/analytics/kinesis-data-firehose.png differ diff --git a/resources/aws/analytics/kinesis-data-streams.png b/resources/aws/analytics/kinesis-data-streams.png new file mode 100644 index 00000000..badec2f0 Binary files /dev/null and b/resources/aws/analytics/kinesis-data-streams.png differ diff --git a/resources/aws/analytics/kinesis-video-streams.png b/resources/aws/analytics/kinesis-video-streams.png new file mode 100644 index 00000000..1c3930ac Binary files /dev/null and b/resources/aws/analytics/kinesis-video-streams.png differ diff --git a/resources/aws/analytics/kinesis.png b/resources/aws/analytics/kinesis.png new file mode 100644 index 00000000..16812b3c Binary files /dev/null and b/resources/aws/analytics/kinesis.png differ diff --git a/resources/aws/analytics/lake-formation.png b/resources/aws/analytics/lake-formation.png new file mode 100644 index 00000000..61f32979 Binary files /dev/null and b/resources/aws/analytics/lake-formation.png differ diff --git a/resources/aws/analytics/managed-streaming-for-kafka.png b/resources/aws/analytics/managed-streaming-for-kafka.png new file mode 100644 index 00000000..f090b78c Binary files /dev/null and b/resources/aws/analytics/managed-streaming-for-kafka.png differ diff --git a/resources/aws/analytics/quicksight.png b/resources/aws/analytics/quicksight.png new file mode 100644 index 00000000..3c7c974e Binary files /dev/null and b/resources/aws/analytics/quicksight.png differ diff --git a/resources/aws/analytics/redshift.png b/resources/aws/analytics/redshift.png new file mode 100644 index 00000000..23253ba4 Binary files /dev/null and b/resources/aws/analytics/redshift.png differ diff --git a/resources/aws/compute/application-auto-scaling-rounded.png b/resources/aws/compute/application-auto-scaling-rounded.png new file mode 100644 index 00000000..b91b06ed Binary files /dev/null and b/resources/aws/compute/application-auto-scaling-rounded.png differ diff --git a/resources/aws/compute/application-auto-scaling.png b/resources/aws/compute/application-auto-scaling.png new file mode 100755 index 00000000..b91b06ed Binary files /dev/null and b/resources/aws/compute/application-auto-scaling.png differ diff --git a/resources/aws/compute/batch-rounded.png b/resources/aws/compute/batch-rounded.png new file mode 100644 index 00000000..e2e5e18b Binary files /dev/null and b/resources/aws/compute/batch-rounded.png differ diff --git a/resources/aws/compute/batch.png b/resources/aws/compute/batch.png new file mode 100644 index 00000000..e2e5e18b Binary files /dev/null and b/resources/aws/compute/batch.png differ diff --git a/resources/aws/compute/compute-rounded.png b/resources/aws/compute/compute-rounded.png new file mode 100644 index 00000000..a50bbaff Binary files /dev/null and b/resources/aws/compute/compute-rounded.png differ diff --git a/resources/aws/compute/compute.png b/resources/aws/compute/compute.png new file mode 100644 index 00000000..a50bbaff Binary files /dev/null and b/resources/aws/compute/compute.png differ diff --git a/resources/aws/compute/ec2-container-registry-rounded.png b/resources/aws/compute/ec2-container-registry-rounded.png new file mode 100644 index 00000000..1dbfed05 Binary files /dev/null and b/resources/aws/compute/ec2-container-registry-rounded.png differ diff --git a/resources/aws/compute/ec2-container-registry.png b/resources/aws/compute/ec2-container-registry.png new file mode 100644 index 00000000..1dbfed05 Binary files /dev/null and b/resources/aws/compute/ec2-container-registry.png differ diff --git a/resources/aws/compute/ec2-rounded.png b/resources/aws/compute/ec2-rounded.png new file mode 100644 index 00000000..cca18d73 Binary files /dev/null and b/resources/aws/compute/ec2-rounded.png differ diff --git a/resources/aws/compute/ec2.png b/resources/aws/compute/ec2.png new file mode 100644 index 00000000..cca18d73 Binary files /dev/null and b/resources/aws/compute/ec2.png differ diff --git a/resources/aws/compute/elastic-beanstalk-rounded.png b/resources/aws/compute/elastic-beanstalk-rounded.png new file mode 100644 index 00000000..a38a6e51 Binary files /dev/null and b/resources/aws/compute/elastic-beanstalk-rounded.png differ diff --git a/resources/aws/compute/elastic-beanstalk.png b/resources/aws/compute/elastic-beanstalk.png new file mode 100644 index 00000000..a38a6e51 Binary files /dev/null and b/resources/aws/compute/elastic-beanstalk.png differ diff --git a/resources/aws/compute/elastic-container-service-rounded.png b/resources/aws/compute/elastic-container-service-rounded.png new file mode 100644 index 00000000..274c5e47 Binary files /dev/null and b/resources/aws/compute/elastic-container-service-rounded.png differ diff --git a/resources/aws/compute/elastic-container-service.png b/resources/aws/compute/elastic-container-service.png new file mode 100644 index 00000000..274c5e47 Binary files /dev/null and b/resources/aws/compute/elastic-container-service.png differ diff --git a/resources/aws/compute/elastic-kubernetes-service-rounded.png b/resources/aws/compute/elastic-kubernetes-service-rounded.png new file mode 100644 index 00000000..98ee8d3a Binary files /dev/null and b/resources/aws/compute/elastic-kubernetes-service-rounded.png differ diff --git a/resources/aws/compute/elastic-kubernetes-service.png b/resources/aws/compute/elastic-kubernetes-service.png new file mode 100644 index 00000000..98ee8d3a Binary files /dev/null and b/resources/aws/compute/elastic-kubernetes-service.png differ diff --git a/resources/aws/compute/fargate-rounded.png b/resources/aws/compute/fargate-rounded.png new file mode 100644 index 00000000..c9ec76e5 Binary files /dev/null and b/resources/aws/compute/fargate-rounded.png differ diff --git a/resources/aws/compute/fargate.png b/resources/aws/compute/fargate.png new file mode 100644 index 00000000..c9ec76e5 Binary files /dev/null and b/resources/aws/compute/fargate.png differ diff --git a/resources/aws/compute/lambda-rounded.png b/resources/aws/compute/lambda-rounded.png new file mode 100644 index 00000000..af5c8889 Binary files /dev/null and b/resources/aws/compute/lambda-rounded.png differ diff --git a/resources/aws/compute/lambda.png b/resources/aws/compute/lambda.png new file mode 100644 index 00000000..af5c8889 Binary files /dev/null and b/resources/aws/compute/lambda.png differ diff --git a/resources/aws/compute/lightsail-rounded.png b/resources/aws/compute/lightsail-rounded.png new file mode 100644 index 00000000..b8e2f5f5 Binary files /dev/null and b/resources/aws/compute/lightsail-rounded.png differ diff --git a/resources/aws/compute/lightsail.png b/resources/aws/compute/lightsail.png new file mode 100644 index 00000000..b8e2f5f5 Binary files /dev/null and b/resources/aws/compute/lightsail.png differ diff --git a/resources/aws/compute/outposts-rounded.png b/resources/aws/compute/outposts-rounded.png new file mode 100644 index 00000000..76fa693c Binary files /dev/null and b/resources/aws/compute/outposts-rounded.png differ diff --git a/resources/aws/compute/outposts.png b/resources/aws/compute/outposts.png new file mode 100644 index 00000000..76fa693c Binary files /dev/null and b/resources/aws/compute/outposts.png differ diff --git a/resources/aws/compute/serverless-application-repository-rounded.png b/resources/aws/compute/serverless-application-repository-rounded.png new file mode 100644 index 00000000..c7aaa4c0 Binary files /dev/null and b/resources/aws/compute/serverless-application-repository-rounded.png differ diff --git a/resources/aws/compute/serverless-application-repository.png b/resources/aws/compute/serverless-application-repository.png new file mode 100644 index 00000000..c7aaa4c0 Binary files /dev/null and b/resources/aws/compute/serverless-application-repository.png differ diff --git a/resources/aws/compute/thinkbox-deadline-rounded.png b/resources/aws/compute/thinkbox-deadline-rounded.png new file mode 100644 index 00000000..725c1519 Binary files /dev/null and b/resources/aws/compute/thinkbox-deadline-rounded.png differ diff --git a/resources/aws/compute/thinkbox-deadline.png b/resources/aws/compute/thinkbox-deadline.png new file mode 100755 index 00000000..725c1519 Binary files /dev/null and b/resources/aws/compute/thinkbox-deadline.png differ diff --git a/resources/aws/compute/thinkbox-draft-rounded.png b/resources/aws/compute/thinkbox-draft-rounded.png new file mode 100644 index 00000000..286bf2f1 Binary files /dev/null and b/resources/aws/compute/thinkbox-draft-rounded.png differ diff --git a/resources/aws/compute/thinkbox-draft.png b/resources/aws/compute/thinkbox-draft.png new file mode 100755 index 00000000..286bf2f1 Binary files /dev/null and b/resources/aws/compute/thinkbox-draft.png differ diff --git a/resources/aws/compute/thinkbox-frost-rounded.png b/resources/aws/compute/thinkbox-frost-rounded.png new file mode 100644 index 00000000..3e63f714 Binary files /dev/null and b/resources/aws/compute/thinkbox-frost-rounded.png differ diff --git a/resources/aws/compute/thinkbox-frost.png b/resources/aws/compute/thinkbox-frost.png new file mode 100755 index 00000000..3e63f714 Binary files /dev/null and b/resources/aws/compute/thinkbox-frost.png differ diff --git a/resources/aws/compute/thinkbox-krakatoa-rounded.png b/resources/aws/compute/thinkbox-krakatoa-rounded.png new file mode 100644 index 00000000..07b5f35a Binary files /dev/null and b/resources/aws/compute/thinkbox-krakatoa-rounded.png differ diff --git a/resources/aws/compute/thinkbox-krakatoa.png b/resources/aws/compute/thinkbox-krakatoa.png new file mode 100755 index 00000000..07b5f35a Binary files /dev/null and b/resources/aws/compute/thinkbox-krakatoa.png differ diff --git a/resources/aws/compute/thinkbox-sequoia-rounded.png b/resources/aws/compute/thinkbox-sequoia-rounded.png new file mode 100644 index 00000000..99931cf6 Binary files /dev/null and b/resources/aws/compute/thinkbox-sequoia-rounded.png differ diff --git a/resources/aws/compute/thinkbox-sequoia.png b/resources/aws/compute/thinkbox-sequoia.png new file mode 100755 index 00000000..99931cf6 Binary files /dev/null and b/resources/aws/compute/thinkbox-sequoia.png differ diff --git a/resources/aws/compute/thinkbox-stoke-rounded.png b/resources/aws/compute/thinkbox-stoke-rounded.png new file mode 100644 index 00000000..ad869a87 Binary files /dev/null and b/resources/aws/compute/thinkbox-stoke-rounded.png differ diff --git a/resources/aws/compute/thinkbox-stoke.png b/resources/aws/compute/thinkbox-stoke.png new file mode 100755 index 00000000..ad869a87 Binary files /dev/null and b/resources/aws/compute/thinkbox-stoke.png differ diff --git a/resources/aws/compute/thinkbox-xmesh-rounded.png b/resources/aws/compute/thinkbox-xmesh-rounded.png new file mode 100644 index 00000000..01379b09 Binary files /dev/null and b/resources/aws/compute/thinkbox-xmesh-rounded.png differ diff --git a/resources/aws/compute/thinkbox-xmesh.png b/resources/aws/compute/thinkbox-xmesh.png new file mode 100755 index 00000000..01379b09 Binary files /dev/null and b/resources/aws/compute/thinkbox-xmesh.png differ diff --git a/resources/aws/compute/vmware-cloud-on-aws-rounded.png b/resources/aws/compute/vmware-cloud-on-aws-rounded.png new file mode 100644 index 00000000..24b3534b Binary files /dev/null and b/resources/aws/compute/vmware-cloud-on-aws-rounded.png differ diff --git a/resources/aws/compute/vmware-cloud-on-aws.png b/resources/aws/compute/vmware-cloud-on-aws.png new file mode 100644 index 00000000..24b3534b Binary files /dev/null and b/resources/aws/compute/vmware-cloud-on-aws.png differ diff --git a/resources/aws/database/aurora.png b/resources/aws/database/aurora.png new file mode 100644 index 00000000..cc04dc49 Binary files /dev/null and b/resources/aws/database/aurora.png differ diff --git a/resources/aws/database/database-migration-service.png b/resources/aws/database/database-migration-service.png new file mode 100644 index 00000000..0b0028cb Binary files /dev/null and b/resources/aws/database/database-migration-service.png differ diff --git a/resources/aws/database/database.png b/resources/aws/database/database.png new file mode 100644 index 00000000..76e96fa9 Binary files /dev/null and b/resources/aws/database/database.png differ diff --git a/resources/aws/database/documentdb-mongodb-compatibility.png b/resources/aws/database/documentdb-mongodb-compatibility.png new file mode 100644 index 00000000..9917c9b6 Binary files /dev/null and b/resources/aws/database/documentdb-mongodb-compatibility.png differ diff --git a/resources/aws/database/dynamodb.png b/resources/aws/database/dynamodb.png new file mode 100644 index 00000000..00132a19 Binary files /dev/null and b/resources/aws/database/dynamodb.png differ diff --git a/resources/aws/database/elasticache.png b/resources/aws/database/elasticache.png new file mode 100644 index 00000000..40f2db77 Binary files /dev/null and b/resources/aws/database/elasticache.png differ diff --git a/resources/aws/database/neptune.png b/resources/aws/database/neptune.png new file mode 100644 index 00000000..a2434736 Binary files /dev/null and b/resources/aws/database/neptune.png differ diff --git a/resources/aws/database/quantum-ledger-database-qldb.png b/resources/aws/database/quantum-ledger-database-qldb.png new file mode 100644 index 00000000..e3080f20 Binary files /dev/null and b/resources/aws/database/quantum-ledger-database-qldb.png differ diff --git a/resources/aws/database/rds-on-vmware.png b/resources/aws/database/rds-on-vmware.png new file mode 100644 index 00000000..1992a12d Binary files /dev/null and b/resources/aws/database/rds-on-vmware.png differ diff --git a/resources/aws/database/rds.png b/resources/aws/database/rds.png new file mode 100644 index 00000000..42f849c9 Binary files /dev/null and b/resources/aws/database/rds.png differ diff --git a/resources/aws/database/redshift.png b/resources/aws/database/redshift.png new file mode 100644 index 00000000..63cea3c2 Binary files /dev/null and b/resources/aws/database/redshift.png differ diff --git a/resources/aws/database/timestream.png b/resources/aws/database/timestream.png new file mode 100644 index 00000000..ea14fa60 Binary files /dev/null and b/resources/aws/database/timestream.png differ diff --git a/resources/aws/devtools/cloud-development-kit.png b/resources/aws/devtools/cloud-development-kit.png new file mode 100755 index 00000000..8ca818fe Binary files /dev/null and b/resources/aws/devtools/cloud-development-kit.png differ diff --git a/resources/aws/devtools/cloud9.png b/resources/aws/devtools/cloud9.png new file mode 100644 index 00000000..780b5401 Binary files /dev/null and b/resources/aws/devtools/cloud9.png differ diff --git a/resources/aws/devtools/codebuild.png b/resources/aws/devtools/codebuild.png new file mode 100644 index 00000000..163a33b4 Binary files /dev/null and b/resources/aws/devtools/codebuild.png differ diff --git a/resources/aws/devtools/codecommit.png b/resources/aws/devtools/codecommit.png new file mode 100644 index 00000000..b971c0fd Binary files /dev/null and b/resources/aws/devtools/codecommit.png differ diff --git a/resources/aws/devtools/codedeploy.png b/resources/aws/devtools/codedeploy.png new file mode 100644 index 00000000..7165aff5 Binary files /dev/null and b/resources/aws/devtools/codedeploy.png differ diff --git a/resources/aws/devtools/codepipeline.png b/resources/aws/devtools/codepipeline.png new file mode 100644 index 00000000..8e3bde57 Binary files /dev/null and b/resources/aws/devtools/codepipeline.png differ diff --git a/resources/aws/devtools/codestar.png b/resources/aws/devtools/codestar.png new file mode 100644 index 00000000..5ac4fe6b Binary files /dev/null and b/resources/aws/devtools/codestar.png differ diff --git a/resources/aws/devtools/command-line-interface.png b/resources/aws/devtools/command-line-interface.png new file mode 100644 index 00000000..cb9720f3 Binary files /dev/null and b/resources/aws/devtools/command-line-interface.png differ diff --git a/resources/aws/devtools/developer-tools.png b/resources/aws/devtools/developer-tools.png new file mode 100644 index 00000000..16755c92 Binary files /dev/null and b/resources/aws/devtools/developer-tools.png differ diff --git a/resources/aws/devtools/tools-and-sdks.png b/resources/aws/devtools/tools-and-sdks.png new file mode 100644 index 00000000..5ae1429f Binary files /dev/null and b/resources/aws/devtools/tools-and-sdks.png differ diff --git a/resources/aws/devtools/x-ray.png b/resources/aws/devtools/x-ray.png new file mode 100644 index 00000000..578b3a30 Binary files /dev/null and b/resources/aws/devtools/x-ray.png differ diff --git a/resources/aws/integration/application-integration.png b/resources/aws/integration/application-integration.png new file mode 100644 index 00000000..235cfd80 Binary files /dev/null and b/resources/aws/integration/application-integration.png differ diff --git a/resources/aws/integration/appsync.png b/resources/aws/integration/appsync.png new file mode 100644 index 00000000..b1b4b125 Binary files /dev/null and b/resources/aws/integration/appsync.png differ diff --git a/resources/aws/integration/console-mobile-application.png b/resources/aws/integration/console-mobile-application.png new file mode 100755 index 00000000..8459a9fb Binary files /dev/null and b/resources/aws/integration/console-mobile-application.png differ diff --git a/resources/aws/integration/eventbridge.png b/resources/aws/integration/eventbridge.png new file mode 100755 index 00000000..e541e382 Binary files /dev/null and b/resources/aws/integration/eventbridge.png differ diff --git a/resources/aws/integration/mq.png b/resources/aws/integration/mq.png new file mode 100644 index 00000000..ab16ce3a Binary files /dev/null and b/resources/aws/integration/mq.png differ diff --git a/resources/aws/integration/simple-notification-service-sns.png b/resources/aws/integration/simple-notification-service-sns.png new file mode 100644 index 00000000..80d45a84 Binary files /dev/null and b/resources/aws/integration/simple-notification-service-sns.png differ diff --git a/resources/aws/integration/simple-queue-service-sqs.png b/resources/aws/integration/simple-queue-service-sqs.png new file mode 100644 index 00000000..46f9d762 Binary files /dev/null and b/resources/aws/integration/simple-queue-service-sqs.png differ diff --git a/resources/aws/integration/step-functions.png b/resources/aws/integration/step-functions.png new file mode 100644 index 00000000..f9a25e87 Binary files /dev/null and b/resources/aws/integration/step-functions.png differ diff --git a/resources/aws/iot/freertos.png b/resources/aws/iot/freertos.png new file mode 100644 index 00000000..81c7ae05 Binary files /dev/null and b/resources/aws/iot/freertos.png differ diff --git a/resources/aws/iot/internet-of-things.png b/resources/aws/iot/internet-of-things.png new file mode 100644 index 00000000..66930190 Binary files /dev/null and b/resources/aws/iot/internet-of-things.png differ diff --git a/resources/aws/iot/iot-1-click.png b/resources/aws/iot/iot-1-click.png new file mode 100644 index 00000000..ef9017b7 Binary files /dev/null and b/resources/aws/iot/iot-1-click.png differ diff --git a/resources/aws/iot/iot-analytics.png b/resources/aws/iot/iot-analytics.png new file mode 100644 index 00000000..e2e4d110 Binary files /dev/null and b/resources/aws/iot/iot-analytics.png differ diff --git a/resources/aws/iot/iot-button.png b/resources/aws/iot/iot-button.png new file mode 100644 index 00000000..1737b67e Binary files /dev/null and b/resources/aws/iot/iot-button.png differ diff --git a/resources/aws/iot/iot-core.png b/resources/aws/iot/iot-core.png new file mode 100644 index 00000000..37d3dcca Binary files /dev/null and b/resources/aws/iot/iot-core.png differ diff --git a/resources/aws/iot/iot-device-defender.png b/resources/aws/iot/iot-device-defender.png new file mode 100644 index 00000000..54962ebf Binary files /dev/null and b/resources/aws/iot/iot-device-defender.png differ diff --git a/resources/aws/iot/iot-device-management.png b/resources/aws/iot/iot-device-management.png new file mode 100644 index 00000000..8de6bb55 Binary files /dev/null and b/resources/aws/iot/iot-device-management.png differ diff --git a/resources/aws/iot/iot-events.png b/resources/aws/iot/iot-events.png new file mode 100644 index 00000000..173e0a00 Binary files /dev/null and b/resources/aws/iot/iot-events.png differ diff --git a/resources/aws/iot/iot-greengrass.png b/resources/aws/iot/iot-greengrass.png new file mode 100644 index 00000000..22acd32d Binary files /dev/null and b/resources/aws/iot/iot-greengrass.png differ diff --git a/resources/aws/iot/iot-sitewise.png b/resources/aws/iot/iot-sitewise.png new file mode 100644 index 00000000..26b85674 Binary files /dev/null and b/resources/aws/iot/iot-sitewise.png differ diff --git a/resources/aws/iot/iot-things-graph.png b/resources/aws/iot/iot-things-graph.png new file mode 100644 index 00000000..7290b3ae Binary files /dev/null and b/resources/aws/iot/iot-things-graph.png differ diff --git a/resources/aws/migration/application-discovery-service.png b/resources/aws/migration/application-discovery-service.png new file mode 100644 index 00000000..79ccd8cb Binary files /dev/null and b/resources/aws/migration/application-discovery-service.png differ diff --git a/resources/aws/migration/cloudendure-migration.png b/resources/aws/migration/cloudendure-migration.png new file mode 100755 index 00000000..a6da8169 Binary files /dev/null and b/resources/aws/migration/cloudendure-migration.png differ diff --git a/resources/aws/migration/database-migration-service.png b/resources/aws/migration/database-migration-service.png new file mode 100644 index 00000000..d22e1d47 Binary files /dev/null and b/resources/aws/migration/database-migration-service.png differ diff --git a/resources/aws/migration/datasync.png b/resources/aws/migration/datasync.png new file mode 100644 index 00000000..e4f909cd Binary files /dev/null and b/resources/aws/migration/datasync.png differ diff --git a/resources/aws/migration/migration-and-transfer.png b/resources/aws/migration/migration-and-transfer.png new file mode 100644 index 00000000..461a0d97 Binary files /dev/null and b/resources/aws/migration/migration-and-transfer.png differ diff --git a/resources/aws/migration/migration-hub.png b/resources/aws/migration/migration-hub.png new file mode 100644 index 00000000..b6296811 Binary files /dev/null and b/resources/aws/migration/migration-hub.png differ diff --git a/resources/aws/migration/server-migration-service.png b/resources/aws/migration/server-migration-service.png new file mode 100644 index 00000000..3c8c29af Binary files /dev/null and b/resources/aws/migration/server-migration-service.png differ diff --git a/resources/aws/migration/snowball-edge.png b/resources/aws/migration/snowball-edge.png new file mode 100644 index 00000000..8c7c0ca9 Binary files /dev/null and b/resources/aws/migration/snowball-edge.png differ diff --git a/resources/aws/migration/snowball.png b/resources/aws/migration/snowball.png new file mode 100644 index 00000000..9771c382 Binary files /dev/null and b/resources/aws/migration/snowball.png differ diff --git a/resources/aws/migration/snowmobile.png b/resources/aws/migration/snowmobile.png new file mode 100644 index 00000000..728ee459 Binary files /dev/null and b/resources/aws/migration/snowmobile.png differ diff --git a/resources/aws/migration/transfer-for-sftp.png b/resources/aws/migration/transfer-for-sftp.png new file mode 100644 index 00000000..7766f911 Binary files /dev/null and b/resources/aws/migration/transfer-for-sftp.png differ diff --git a/resources/aws/ml/apache-mxnet-on-aws.png b/resources/aws/ml/apache-mxnet-on-aws.png new file mode 100644 index 00000000..b50b3435 Binary files /dev/null and b/resources/aws/ml/apache-mxnet-on-aws.png differ diff --git a/resources/aws/ml/comprehend.png b/resources/aws/ml/comprehend.png new file mode 100644 index 00000000..46bcf7e5 Binary files /dev/null and b/resources/aws/ml/comprehend.png differ diff --git a/resources/aws/ml/deep-learning-amis.png b/resources/aws/ml/deep-learning-amis.png new file mode 100644 index 00000000..f9e764d5 Binary files /dev/null and b/resources/aws/ml/deep-learning-amis.png differ diff --git a/resources/aws/ml/deep-learning-containers.png b/resources/aws/ml/deep-learning-containers.png new file mode 100644 index 00000000..f7be334a Binary files /dev/null and b/resources/aws/ml/deep-learning-containers.png differ diff --git a/resources/aws/ml/deeplens.png b/resources/aws/ml/deeplens.png new file mode 100644 index 00000000..b1867fa6 Binary files /dev/null and b/resources/aws/ml/deeplens.png differ diff --git a/resources/aws/ml/deepracer.png b/resources/aws/ml/deepracer.png new file mode 100644 index 00000000..5c9468d5 Binary files /dev/null and b/resources/aws/ml/deepracer.png differ diff --git a/resources/aws/ml/elastic-inference.png b/resources/aws/ml/elastic-inference.png new file mode 100644 index 00000000..72823648 Binary files /dev/null and b/resources/aws/ml/elastic-inference.png differ diff --git a/resources/aws/ml/forecast.png b/resources/aws/ml/forecast.png new file mode 100644 index 00000000..3d011470 Binary files /dev/null and b/resources/aws/ml/forecast.png differ diff --git a/resources/aws/ml/lex.png b/resources/aws/ml/lex.png new file mode 100644 index 00000000..36e9bb2c Binary files /dev/null and b/resources/aws/ml/lex.png differ diff --git a/resources/aws/ml/machine-learning.png b/resources/aws/ml/machine-learning.png new file mode 100644 index 00000000..881f4dd6 Binary files /dev/null and b/resources/aws/ml/machine-learning.png differ diff --git a/resources/aws/ml/personalize.png b/resources/aws/ml/personalize.png new file mode 100644 index 00000000..3c89844c Binary files /dev/null and b/resources/aws/ml/personalize.png differ diff --git a/resources/aws/ml/polly.png b/resources/aws/ml/polly.png new file mode 100644 index 00000000..0b8422b3 Binary files /dev/null and b/resources/aws/ml/polly.png differ diff --git a/resources/aws/ml/rekognition.png b/resources/aws/ml/rekognition.png new file mode 100644 index 00000000..5baecf15 Binary files /dev/null and b/resources/aws/ml/rekognition.png differ diff --git a/resources/aws/ml/sagemaker-ground-truth.png b/resources/aws/ml/sagemaker-ground-truth.png new file mode 100644 index 00000000..c917546e Binary files /dev/null and b/resources/aws/ml/sagemaker-ground-truth.png differ diff --git a/resources/aws/ml/sagemaker.png b/resources/aws/ml/sagemaker.png new file mode 100644 index 00000000..c9096ea4 Binary files /dev/null and b/resources/aws/ml/sagemaker.png differ diff --git a/resources/aws/ml/tensorflow-on-aws.png b/resources/aws/ml/tensorflow-on-aws.png new file mode 100644 index 00000000..b50b3435 Binary files /dev/null and b/resources/aws/ml/tensorflow-on-aws.png differ diff --git a/resources/aws/ml/textract.png b/resources/aws/ml/textract.png new file mode 100644 index 00000000..07665a3a Binary files /dev/null and b/resources/aws/ml/textract.png differ diff --git a/resources/aws/ml/transcribe.png b/resources/aws/ml/transcribe.png new file mode 100644 index 00000000..5754d256 Binary files /dev/null and b/resources/aws/ml/transcribe.png differ diff --git a/resources/aws/ml/translate.png b/resources/aws/ml/translate.png new file mode 100644 index 00000000..94e5a4a0 Binary files /dev/null and b/resources/aws/ml/translate.png differ diff --git a/resources/aws/network/api-gateway.png b/resources/aws/network/api-gateway.png new file mode 100644 index 00000000..c1918fa3 Binary files /dev/null and b/resources/aws/network/api-gateway.png differ diff --git a/resources/aws/network/app-mesh.png b/resources/aws/network/app-mesh.png new file mode 100644 index 00000000..a8d58ed8 Binary files /dev/null and b/resources/aws/network/app-mesh.png differ diff --git a/resources/aws/network/client-vpn.png b/resources/aws/network/client-vpn.png new file mode 100644 index 00000000..4f9243cd Binary files /dev/null and b/resources/aws/network/client-vpn.png differ diff --git a/resources/aws/network/cloud-map.png b/resources/aws/network/cloud-map.png new file mode 100644 index 00000000..2502b91b Binary files /dev/null and b/resources/aws/network/cloud-map.png differ diff --git a/resources/aws/network/cloudfront.png b/resources/aws/network/cloudfront.png new file mode 100644 index 00000000..70992d92 Binary files /dev/null and b/resources/aws/network/cloudfront.png differ diff --git a/resources/aws/network/direct-connect.png b/resources/aws/network/direct-connect.png new file mode 100644 index 00000000..9851b696 Binary files /dev/null and b/resources/aws/network/direct-connect.png differ diff --git a/resources/aws/network/elastic-load-balancing.png b/resources/aws/network/elastic-load-balancing.png new file mode 100644 index 00000000..56f26cee Binary files /dev/null and b/resources/aws/network/elastic-load-balancing.png differ diff --git a/resources/aws/network/global-accelerator.png b/resources/aws/network/global-accelerator.png new file mode 100644 index 00000000..d677ee1f Binary files /dev/null and b/resources/aws/network/global-accelerator.png differ diff --git a/resources/aws/network/networking-and-content-delivery.png b/resources/aws/network/networking-and-content-delivery.png new file mode 100644 index 00000000..aef8cf72 Binary files /dev/null and b/resources/aws/network/networking-and-content-delivery.png differ diff --git a/resources/aws/network/privatelink.png b/resources/aws/network/privatelink.png new file mode 100644 index 00000000..b38ed76b Binary files /dev/null and b/resources/aws/network/privatelink.png differ diff --git a/resources/aws/network/route-53.png b/resources/aws/network/route-53.png new file mode 100644 index 00000000..9e7d1697 Binary files /dev/null and b/resources/aws/network/route-53.png differ diff --git a/resources/aws/network/site-to-site-vpn.png b/resources/aws/network/site-to-site-vpn.png new file mode 100644 index 00000000..2c660783 Binary files /dev/null and b/resources/aws/network/site-to-site-vpn.png differ diff --git a/resources/aws/network/transit-gateway.png b/resources/aws/network/transit-gateway.png new file mode 100644 index 00000000..1c467e28 Binary files /dev/null and b/resources/aws/network/transit-gateway.png differ diff --git a/resources/aws/network/vpc.png b/resources/aws/network/vpc.png new file mode 100644 index 00000000..172aee85 Binary files /dev/null and b/resources/aws/network/vpc.png differ diff --git a/resources/aws/security/artifact.png b/resources/aws/security/artifact.png new file mode 100644 index 00000000..bfddb00e Binary files /dev/null and b/resources/aws/security/artifact.png differ diff --git a/resources/aws/security/certificate-manager.png b/resources/aws/security/certificate-manager.png new file mode 100644 index 00000000..543ce00a Binary files /dev/null and b/resources/aws/security/certificate-manager.png differ diff --git a/resources/aws/security/cloud-directory.png b/resources/aws/security/cloud-directory.png new file mode 100644 index 00000000..f9f58c70 Binary files /dev/null and b/resources/aws/security/cloud-directory.png differ diff --git a/resources/aws/security/cloudhsm.png b/resources/aws/security/cloudhsm.png new file mode 100644 index 00000000..788badfd Binary files /dev/null and b/resources/aws/security/cloudhsm.png differ diff --git a/resources/aws/security/cognito.png b/resources/aws/security/cognito.png new file mode 100644 index 00000000..a7cd7ecb Binary files /dev/null and b/resources/aws/security/cognito.png differ diff --git a/resources/aws/security/directory-service.png b/resources/aws/security/directory-service.png new file mode 100644 index 00000000..453e6350 Binary files /dev/null and b/resources/aws/security/directory-service.png differ diff --git a/resources/aws/security/firewall-manager.png b/resources/aws/security/firewall-manager.png new file mode 100644 index 00000000..3019a5ef Binary files /dev/null and b/resources/aws/security/firewall-manager.png differ diff --git a/resources/aws/security/guardduty.png b/resources/aws/security/guardduty.png new file mode 100644 index 00000000..d02e2024 Binary files /dev/null and b/resources/aws/security/guardduty.png differ diff --git a/resources/aws/security/identity-and-access-management-iam.png b/resources/aws/security/identity-and-access-management-iam.png new file mode 100644 index 00000000..1c3bb9c0 Binary files /dev/null and b/resources/aws/security/identity-and-access-management-iam.png differ diff --git a/resources/aws/security/inspector.png b/resources/aws/security/inspector.png new file mode 100644 index 00000000..24238da4 Binary files /dev/null and b/resources/aws/security/inspector.png differ diff --git a/resources/aws/security/key-management-service.png b/resources/aws/security/key-management-service.png new file mode 100644 index 00000000..e830844e Binary files /dev/null and b/resources/aws/security/key-management-service.png differ diff --git a/resources/aws/security/macie.png b/resources/aws/security/macie.png new file mode 100644 index 00000000..e292ce00 Binary files /dev/null and b/resources/aws/security/macie.png differ diff --git a/resources/aws/security/resource-access-manager.png b/resources/aws/security/resource-access-manager.png new file mode 100644 index 00000000..924ff8a1 Binary files /dev/null and b/resources/aws/security/resource-access-manager.png differ diff --git a/resources/aws/security/secrets-manager.png b/resources/aws/security/secrets-manager.png new file mode 100644 index 00000000..e6852b0e Binary files /dev/null and b/resources/aws/security/secrets-manager.png differ diff --git a/resources/aws/security/security-hub.png b/resources/aws/security/security-hub.png new file mode 100644 index 00000000..26ba9558 Binary files /dev/null and b/resources/aws/security/security-hub.png differ diff --git a/resources/aws/security/security-identity-and-compliance.png b/resources/aws/security/security-identity-and-compliance.png new file mode 100644 index 00000000..00939544 Binary files /dev/null and b/resources/aws/security/security-identity-and-compliance.png differ diff --git a/resources/aws/security/shield.png b/resources/aws/security/shield.png new file mode 100644 index 00000000..843ca98c Binary files /dev/null and b/resources/aws/security/shield.png differ diff --git a/resources/aws/security/single-sign-on.png b/resources/aws/security/single-sign-on.png new file mode 100644 index 00000000..6a0ea5d4 Binary files /dev/null and b/resources/aws/security/single-sign-on.png differ diff --git a/resources/aws/security/waf.png b/resources/aws/security/waf.png new file mode 100644 index 00000000..06f6632d Binary files /dev/null and b/resources/aws/security/waf.png differ diff --git a/resources/aws/storage/backup.png b/resources/aws/storage/backup.png new file mode 100644 index 00000000..5f002f60 Binary files /dev/null and b/resources/aws/storage/backup.png differ diff --git a/resources/aws/storage/cloudendure-disaster-recovery.png b/resources/aws/storage/cloudendure-disaster-recovery.png new file mode 100755 index 00000000..53957828 Binary files /dev/null and b/resources/aws/storage/cloudendure-disaster-recovery.png differ diff --git a/resources/aws/storage/efs-infrequentaccess-primary-bg.png b/resources/aws/storage/efs-infrequentaccess-primary-bg.png new file mode 100644 index 00000000..41932778 Binary files /dev/null and b/resources/aws/storage/efs-infrequentaccess-primary-bg.png differ diff --git a/resources/aws/storage/efs-standard-primary-bg.png b/resources/aws/storage/efs-standard-primary-bg.png new file mode 100755 index 00000000..4d3fcaee Binary files /dev/null and b/resources/aws/storage/efs-standard-primary-bg.png differ diff --git a/resources/aws/storage/elastic-block-store-ebs.png b/resources/aws/storage/elastic-block-store-ebs.png new file mode 100644 index 00000000..e51ef08e Binary files /dev/null and b/resources/aws/storage/elastic-block-store-ebs.png differ diff --git a/resources/aws/storage/elastic-file-system-efs.png b/resources/aws/storage/elastic-file-system-efs.png new file mode 100644 index 00000000..435becb1 Binary files /dev/null and b/resources/aws/storage/elastic-file-system-efs.png differ diff --git a/resources/aws/storage/fsx-for-lustre.png b/resources/aws/storage/fsx-for-lustre.png new file mode 100644 index 00000000..7a3948b5 Binary files /dev/null and b/resources/aws/storage/fsx-for-lustre.png differ diff --git a/resources/aws/storage/fsx-for-windows-file-server.png b/resources/aws/storage/fsx-for-windows-file-server.png new file mode 100644 index 00000000..6ab37f1d Binary files /dev/null and b/resources/aws/storage/fsx-for-windows-file-server.png differ diff --git a/resources/aws/storage/fsx.png b/resources/aws/storage/fsx.png new file mode 100644 index 00000000..73b2be83 Binary files /dev/null and b/resources/aws/storage/fsx.png differ diff --git a/resources/aws/storage/s3-glacier.png b/resources/aws/storage/s3-glacier.png new file mode 100644 index 00000000..ff0e563a Binary files /dev/null and b/resources/aws/storage/s3-glacier.png differ diff --git a/resources/aws/storage/simple-storage-service-s3.png b/resources/aws/storage/simple-storage-service-s3.png new file mode 100644 index 00000000..eae74b55 Binary files /dev/null and b/resources/aws/storage/simple-storage-service-s3.png differ diff --git a/resources/aws/storage/snowball-edge.png b/resources/aws/storage/snowball-edge.png new file mode 100644 index 00000000..33966be9 Binary files /dev/null and b/resources/aws/storage/snowball-edge.png differ diff --git a/resources/aws/storage/snowball.png b/resources/aws/storage/snowball.png new file mode 100644 index 00000000..7f9a6229 Binary files /dev/null and b/resources/aws/storage/snowball.png differ diff --git a/resources/aws/storage/snowmobile.png b/resources/aws/storage/snowmobile.png new file mode 100644 index 00000000..7f21f8cd Binary files /dev/null and b/resources/aws/storage/snowmobile.png differ diff --git a/resources/aws/storage/storage-gateway.png b/resources/aws/storage/storage-gateway.png new file mode 100644 index 00000000..906f596b Binary files /dev/null and b/resources/aws/storage/storage-gateway.png differ diff --git a/resources/aws/storage/storage.png b/resources/aws/storage/storage.png new file mode 100644 index 00000000..f1533b71 Binary files /dev/null and b/resources/aws/storage/storage.png differ diff --git a/resources/azure/analytics/analysis-services.png b/resources/azure/analytics/analysis-services.png new file mode 100644 index 00000000..ae5627dc Binary files /dev/null and b/resources/azure/analytics/analysis-services.png differ diff --git a/resources/azure/analytics/data-explorer-clusters.png b/resources/azure/analytics/data-explorer-clusters.png new file mode 100644 index 00000000..2c4f8021 Binary files /dev/null and b/resources/azure/analytics/data-explorer-clusters.png differ diff --git a/resources/azure/analytics/data-factories.png b/resources/azure/analytics/data-factories.png new file mode 100644 index 00000000..6016899e Binary files /dev/null and b/resources/azure/analytics/data-factories.png differ diff --git a/resources/azure/analytics/data-lake-analytics.png b/resources/azure/analytics/data-lake-analytics.png new file mode 100644 index 00000000..e561bfc4 Binary files /dev/null and b/resources/azure/analytics/data-lake-analytics.png differ diff --git a/resources/azure/analytics/data-lake-store-gen1.png b/resources/azure/analytics/data-lake-store-gen1.png new file mode 100644 index 00000000..b8881b0b Binary files /dev/null and b/resources/azure/analytics/data-lake-store-gen1.png differ diff --git a/resources/azure/analytics/databricks.png b/resources/azure/analytics/databricks.png new file mode 100644 index 00000000..5842e283 Binary files /dev/null and b/resources/azure/analytics/databricks.png differ diff --git a/resources/azure/analytics/event-hub-clusters.png b/resources/azure/analytics/event-hub-clusters.png new file mode 100644 index 00000000..dd7e9a9b Binary files /dev/null and b/resources/azure/analytics/event-hub-clusters.png differ diff --git a/resources/azure/analytics/event-hubs.png b/resources/azure/analytics/event-hubs.png new file mode 100644 index 00000000..567526b2 Binary files /dev/null and b/resources/azure/analytics/event-hubs.png differ diff --git a/resources/azure/analytics/hdinsightclusters.png b/resources/azure/analytics/hdinsightclusters.png new file mode 100644 index 00000000..5d382b16 Binary files /dev/null and b/resources/azure/analytics/hdinsightclusters.png differ diff --git a/resources/azure/analytics/log-analytics-workspaces.png b/resources/azure/analytics/log-analytics-workspaces.png new file mode 100644 index 00000000..01001212 Binary files /dev/null and b/resources/azure/analytics/log-analytics-workspaces.png differ diff --git a/resources/azure/analytics/stream-analytics-jobs.png b/resources/azure/analytics/stream-analytics-jobs.png new file mode 100644 index 00000000..fb957eee Binary files /dev/null and b/resources/azure/analytics/stream-analytics-jobs.png differ diff --git a/resources/azure/compute/availability-sets.png b/resources/azure/compute/availability-sets.png new file mode 100644 index 00000000..57664dd2 Binary files /dev/null and b/resources/azure/compute/availability-sets.png differ diff --git a/resources/azure/compute/batch-accounts.png b/resources/azure/compute/batch-accounts.png new file mode 100644 index 00000000..c3afcc09 Binary files /dev/null and b/resources/azure/compute/batch-accounts.png differ diff --git a/resources/azure/compute/citrix-virtual-desktops-essentials.png b/resources/azure/compute/citrix-virtual-desktops-essentials.png new file mode 100644 index 00000000..fc262400 Binary files /dev/null and b/resources/azure/compute/citrix-virtual-desktops-essentials.png differ diff --git a/resources/azure/compute/cloud-services-classic.png b/resources/azure/compute/cloud-services-classic.png new file mode 100644 index 00000000..4a784eb7 Binary files /dev/null and b/resources/azure/compute/cloud-services-classic.png differ diff --git a/resources/azure/compute/cloud-services.png b/resources/azure/compute/cloud-services.png new file mode 100644 index 00000000..0e403583 Binary files /dev/null and b/resources/azure/compute/cloud-services.png differ diff --git a/resources/azure/compute/cloudsimple-virtual-machines.png b/resources/azure/compute/cloudsimple-virtual-machines.png new file mode 100644 index 00000000..8c8b1c64 Binary files /dev/null and b/resources/azure/compute/cloudsimple-virtual-machines.png differ diff --git a/resources/azure/compute/container-instances.png b/resources/azure/compute/container-instances.png new file mode 100644 index 00000000..9ec2a8c8 Binary files /dev/null and b/resources/azure/compute/container-instances.png differ diff --git a/resources/azure/compute/container-registries.png b/resources/azure/compute/container-registries.png new file mode 100644 index 00000000..17bd6678 Binary files /dev/null and b/resources/azure/compute/container-registries.png differ diff --git a/resources/azure/compute/disk-snapshots.png b/resources/azure/compute/disk-snapshots.png new file mode 100644 index 00000000..cc83dda9 Binary files /dev/null and b/resources/azure/compute/disk-snapshots.png differ diff --git a/resources/azure/compute/disks.png b/resources/azure/compute/disks.png new file mode 100644 index 00000000..dbaab8a6 Binary files /dev/null and b/resources/azure/compute/disks.png differ diff --git a/resources/azure/compute/function-apps.png b/resources/azure/compute/function-apps.png new file mode 100644 index 00000000..1a34e258 Binary files /dev/null and b/resources/azure/compute/function-apps.png differ diff --git a/resources/azure/compute/kubernetes-services.png b/resources/azure/compute/kubernetes-services.png new file mode 100644 index 00000000..a96f3598 Binary files /dev/null and b/resources/azure/compute/kubernetes-services.png differ diff --git a/resources/azure/compute/mesh-applications.png b/resources/azure/compute/mesh-applications.png new file mode 100644 index 00000000..b65ba3e7 Binary files /dev/null and b/resources/azure/compute/mesh-applications.png differ diff --git a/resources/azure/compute/sap-hana-on-azure.png b/resources/azure/compute/sap-hana-on-azure.png new file mode 100644 index 00000000..8641469f Binary files /dev/null and b/resources/azure/compute/sap-hana-on-azure.png differ diff --git a/resources/azure/compute/service-fabric-clusters.png b/resources/azure/compute/service-fabric-clusters.png new file mode 100644 index 00000000..be522e37 Binary files /dev/null and b/resources/azure/compute/service-fabric-clusters.png differ diff --git a/resources/azure/compute/vm-classic.png b/resources/azure/compute/vm-classic.png new file mode 100644 index 00000000..e470d3a3 Binary files /dev/null and b/resources/azure/compute/vm-classic.png differ diff --git a/resources/azure/compute/vm-images.png b/resources/azure/compute/vm-images.png new file mode 100644 index 00000000..42ed0178 Binary files /dev/null and b/resources/azure/compute/vm-images.png differ diff --git a/resources/azure/compute/vm-linux.png b/resources/azure/compute/vm-linux.png new file mode 100644 index 00000000..d5f0f2bb Binary files /dev/null and b/resources/azure/compute/vm-linux.png differ diff --git a/resources/azure/compute/vm-windows.png b/resources/azure/compute/vm-windows.png new file mode 100644 index 00000000..5239bbb6 Binary files /dev/null and b/resources/azure/compute/vm-windows.png differ diff --git a/resources/azure/compute/vm.png b/resources/azure/compute/vm.png new file mode 100644 index 00000000..5c419476 Binary files /dev/null and b/resources/azure/compute/vm.png differ diff --git a/resources/azure/database/blob-storage.png b/resources/azure/database/blob-storage.png new file mode 100644 index 00000000..5764c131 Binary files /dev/null and b/resources/azure/database/blob-storage.png differ diff --git a/resources/azure/database/cache-for-redis.png b/resources/azure/database/cache-for-redis.png new file mode 100644 index 00000000..cbe96de0 Binary files /dev/null and b/resources/azure/database/cache-for-redis.png differ diff --git a/resources/azure/database/cosmos-db.png b/resources/azure/database/cosmos-db.png new file mode 100644 index 00000000..bc9cdbb4 Binary files /dev/null and b/resources/azure/database/cosmos-db.png differ diff --git a/resources/azure/database/data-lake.png b/resources/azure/database/data-lake.png new file mode 100644 index 00000000..e50ee889 Binary files /dev/null and b/resources/azure/database/data-lake.png differ diff --git a/resources/azure/database/database-for-mariadb-servers.png b/resources/azure/database/database-for-mariadb-servers.png new file mode 100644 index 00000000..d7023871 Binary files /dev/null and b/resources/azure/database/database-for-mariadb-servers.png differ diff --git a/resources/azure/database/database-for-mysql-servers.png b/resources/azure/database/database-for-mysql-servers.png new file mode 100644 index 00000000..26dce53a Binary files /dev/null and b/resources/azure/database/database-for-mysql-servers.png differ diff --git a/resources/azure/database/database-for-postgresql-servers.png b/resources/azure/database/database-for-postgresql-servers.png new file mode 100644 index 00000000..c7c5f052 Binary files /dev/null and b/resources/azure/database/database-for-postgresql-servers.png differ diff --git a/resources/azure/database/elastic-database-pools.png b/resources/azure/database/elastic-database-pools.png new file mode 100644 index 00000000..b53ed5f5 Binary files /dev/null and b/resources/azure/database/elastic-database-pools.png differ diff --git a/resources/azure/database/elastic-job-agents.png b/resources/azure/database/elastic-job-agents.png new file mode 100644 index 00000000..4af86031 Binary files /dev/null and b/resources/azure/database/elastic-job-agents.png differ diff --git a/resources/azure/database/managed-databases.png b/resources/azure/database/managed-databases.png new file mode 100644 index 00000000..00ab8256 Binary files /dev/null and b/resources/azure/database/managed-databases.png differ diff --git a/resources/azure/database/sql-databases.png b/resources/azure/database/sql-databases.png new file mode 100644 index 00000000..b5da5a4b Binary files /dev/null and b/resources/azure/database/sql-databases.png differ diff --git a/resources/azure/database/sql-datawarehouse.png b/resources/azure/database/sql-datawarehouse.png new file mode 100644 index 00000000..c712f929 Binary files /dev/null and b/resources/azure/database/sql-datawarehouse.png differ diff --git a/resources/azure/database/sql-managed-instances.png b/resources/azure/database/sql-managed-instances.png new file mode 100644 index 00000000..62f9fb85 Binary files /dev/null and b/resources/azure/database/sql-managed-instances.png differ diff --git a/resources/azure/database/sql-server-stretch-databases.png b/resources/azure/database/sql-server-stretch-databases.png new file mode 100644 index 00000000..8aa364c5 Binary files /dev/null and b/resources/azure/database/sql-server-stretch-databases.png differ diff --git a/resources/azure/database/sql-servers.png b/resources/azure/database/sql-servers.png new file mode 100644 index 00000000..d76abf39 Binary files /dev/null and b/resources/azure/database/sql-servers.png differ diff --git a/resources/azure/database/virtual-clusters.png b/resources/azure/database/virtual-clusters.png new file mode 100644 index 00000000..ca559883 Binary files /dev/null and b/resources/azure/database/virtual-clusters.png differ diff --git a/resources/azure/database/virtual-datacenter.png b/resources/azure/database/virtual-datacenter.png new file mode 100644 index 00000000..31ebc4c8 Binary files /dev/null and b/resources/azure/database/virtual-datacenter.png differ diff --git a/resources/azure/devops/application-insights.png b/resources/azure/devops/application-insights.png new file mode 100644 index 00000000..58d8f7ed Binary files /dev/null and b/resources/azure/devops/application-insights.png differ diff --git a/resources/azure/devops/artifacts.png b/resources/azure/devops/artifacts.png new file mode 100644 index 00000000..dc928c1d Binary files /dev/null and b/resources/azure/devops/artifacts.png differ diff --git a/resources/azure/devops/boards.png b/resources/azure/devops/boards.png new file mode 100644 index 00000000..1813eba5 Binary files /dev/null and b/resources/azure/devops/boards.png differ diff --git a/resources/azure/devops/devops.png b/resources/azure/devops/devops.png new file mode 100644 index 00000000..9d124a1f Binary files /dev/null and b/resources/azure/devops/devops.png differ diff --git a/resources/azure/devops/devtest-labs.png b/resources/azure/devops/devtest-labs.png new file mode 100644 index 00000000..7f64b581 Binary files /dev/null and b/resources/azure/devops/devtest-labs.png differ diff --git a/resources/azure/devops/pipelines.png b/resources/azure/devops/pipelines.png new file mode 100644 index 00000000..631e082d Binary files /dev/null and b/resources/azure/devops/pipelines.png differ diff --git a/resources/azure/devops/repos.png b/resources/azure/devops/repos.png new file mode 100644 index 00000000..636be5d4 Binary files /dev/null and b/resources/azure/devops/repos.png differ diff --git a/resources/azure/devops/test-plans.png b/resources/azure/devops/test-plans.png new file mode 100644 index 00000000..3543c991 Binary files /dev/null and b/resources/azure/devops/test-plans.png differ diff --git a/resources/azure/identity/access-review.png b/resources/azure/identity/access-review.png new file mode 100644 index 00000000..22064e8b Binary files /dev/null and b/resources/azure/identity/access-review.png differ diff --git a/resources/azure/identity/active-directory-connect-health.png b/resources/azure/identity/active-directory-connect-health.png new file mode 100644 index 00000000..a39d673f Binary files /dev/null and b/resources/azure/identity/active-directory-connect-health.png differ diff --git a/resources/azure/identity/active-directory.png b/resources/azure/identity/active-directory.png new file mode 100644 index 00000000..ed59b58a Binary files /dev/null and b/resources/azure/identity/active-directory.png differ diff --git a/resources/azure/identity/ad-b2c.png b/resources/azure/identity/ad-b2c.png new file mode 100644 index 00000000..9269ae71 Binary files /dev/null and b/resources/azure/identity/ad-b2c.png differ diff --git a/resources/azure/identity/ad-domain-services.png b/resources/azure/identity/ad-domain-services.png new file mode 100644 index 00000000..9eb472b9 Binary files /dev/null and b/resources/azure/identity/ad-domain-services.png differ diff --git a/resources/azure/identity/ad-identity-protection.png b/resources/azure/identity/ad-identity-protection.png new file mode 100644 index 00000000..4d4f7a47 Binary files /dev/null and b/resources/azure/identity/ad-identity-protection.png differ diff --git a/resources/azure/identity/ad-privileged-identity-management.png b/resources/azure/identity/ad-privileged-identity-management.png new file mode 100644 index 00000000..aca32aa5 Binary files /dev/null and b/resources/azure/identity/ad-privileged-identity-management.png differ diff --git a/resources/azure/identity/app-registrations.png b/resources/azure/identity/app-registrations.png new file mode 100644 index 00000000..9ba2c2bf Binary files /dev/null and b/resources/azure/identity/app-registrations.png differ diff --git a/resources/azure/identity/conditional-access.png b/resources/azure/identity/conditional-access.png new file mode 100644 index 00000000..e0fa97e2 Binary files /dev/null and b/resources/azure/identity/conditional-access.png differ diff --git a/resources/azure/identity/enterprise-applications.png b/resources/azure/identity/enterprise-applications.png new file mode 100644 index 00000000..efd78ea0 Binary files /dev/null and b/resources/azure/identity/enterprise-applications.png differ diff --git a/resources/azure/identity/identity-governance.png b/resources/azure/identity/identity-governance.png new file mode 100644 index 00000000..b4eb671a Binary files /dev/null and b/resources/azure/identity/identity-governance.png differ diff --git a/resources/azure/identity/information-protection.png b/resources/azure/identity/information-protection.png new file mode 100644 index 00000000..e7f561cf Binary files /dev/null and b/resources/azure/identity/information-protection.png differ diff --git a/resources/azure/identity/managed-identities.png b/resources/azure/identity/managed-identities.png new file mode 100644 index 00000000..20c4093d Binary files /dev/null and b/resources/azure/identity/managed-identities.png differ diff --git a/resources/azure/iot/device-provisioning-services.png b/resources/azure/iot/device-provisioning-services.png new file mode 100644 index 00000000..95ce7026 Binary files /dev/null and b/resources/azure/iot/device-provisioning-services.png differ diff --git a/resources/azure/iot/digital-twins.png b/resources/azure/iot/digital-twins.png new file mode 100644 index 00000000..ceb39f8a Binary files /dev/null and b/resources/azure/iot/digital-twins.png differ diff --git a/resources/azure/iot/iot-central-applications.png b/resources/azure/iot/iot-central-applications.png new file mode 100644 index 00000000..e2e91513 Binary files /dev/null and b/resources/azure/iot/iot-central-applications.png differ diff --git a/resources/azure/iot/iot-hub-security.png b/resources/azure/iot/iot-hub-security.png new file mode 100644 index 00000000..2b4d980c Binary files /dev/null and b/resources/azure/iot/iot-hub-security.png differ diff --git a/resources/azure/iot/iot-hub.png b/resources/azure/iot/iot-hub.png new file mode 100644 index 00000000..198dec19 Binary files /dev/null and b/resources/azure/iot/iot-hub.png differ diff --git a/resources/azure/iot/maps.png b/resources/azure/iot/maps.png new file mode 100644 index 00000000..1fcef393 Binary files /dev/null and b/resources/azure/iot/maps.png differ diff --git a/resources/azure/iot/sphere.png b/resources/azure/iot/sphere.png new file mode 100644 index 00000000..5fef9d0c Binary files /dev/null and b/resources/azure/iot/sphere.png differ diff --git a/resources/azure/iot/time-series-insights-environments.png b/resources/azure/iot/time-series-insights-environments.png new file mode 100644 index 00000000..66f39234 Binary files /dev/null and b/resources/azure/iot/time-series-insights-environments.png differ diff --git a/resources/azure/iot/time-series-insights-events-sources.png b/resources/azure/iot/time-series-insights-events-sources.png new file mode 100644 index 00000000..4c4e716b Binary files /dev/null and b/resources/azure/iot/time-series-insights-events-sources.png differ diff --git a/resources/azure/iot/windows-10-iot-core-services.png b/resources/azure/iot/windows-10-iot-core-services.png new file mode 100644 index 00000000..54b6f7e8 Binary files /dev/null and b/resources/azure/iot/windows-10-iot-core-services.png differ diff --git a/resources/azure/migration/database-migration-services.png b/resources/azure/migration/database-migration-services.png new file mode 100644 index 00000000..95d69907 Binary files /dev/null and b/resources/azure/migration/database-migration-services.png differ diff --git a/resources/azure/migration/migration-projects.png b/resources/azure/migration/migration-projects.png new file mode 100644 index 00000000..1d9d553d Binary files /dev/null and b/resources/azure/migration/migration-projects.png differ diff --git a/resources/azure/migration/recovery-services-vaults.png b/resources/azure/migration/recovery-services-vaults.png new file mode 100644 index 00000000..a766c96a Binary files /dev/null and b/resources/azure/migration/recovery-services-vaults.png differ diff --git a/resources/azure/ml/batch-ai.png b/resources/azure/ml/batch-ai.png new file mode 100644 index 00000000..935f482e Binary files /dev/null and b/resources/azure/ml/batch-ai.png differ diff --git a/resources/azure/ml/bot-services.png b/resources/azure/ml/bot-services.png new file mode 100644 index 00000000..f7c9f46c Binary files /dev/null and b/resources/azure/ml/bot-services.png differ diff --git a/resources/azure/ml/cognitive-services.png b/resources/azure/ml/cognitive-services.png new file mode 100644 index 00000000..08681246 Binary files /dev/null and b/resources/azure/ml/cognitive-services.png differ diff --git a/resources/azure/ml/genomics-accounts.png b/resources/azure/ml/genomics-accounts.png new file mode 100644 index 00000000..782eba24 Binary files /dev/null and b/resources/azure/ml/genomics-accounts.png differ diff --git a/resources/azure/ml/machine-learning-service-workspaces.png b/resources/azure/ml/machine-learning-service-workspaces.png new file mode 100644 index 00000000..b1e967bb Binary files /dev/null and b/resources/azure/ml/machine-learning-service-workspaces.png differ diff --git a/resources/azure/ml/machine-learning-studio-web-service-plans.png b/resources/azure/ml/machine-learning-studio-web-service-plans.png new file mode 100644 index 00000000..1dbf0383 Binary files /dev/null and b/resources/azure/ml/machine-learning-studio-web-service-plans.png differ diff --git a/resources/azure/ml/machine-learning-studio-web-services.png b/resources/azure/ml/machine-learning-studio-web-services.png new file mode 100644 index 00000000..77bfc1ab Binary files /dev/null and b/resources/azure/ml/machine-learning-studio-web-services.png differ diff --git a/resources/azure/ml/machine-learning-studio-workspaces.png b/resources/azure/ml/machine-learning-studio-workspaces.png new file mode 100644 index 00000000..7b98af9c Binary files /dev/null and b/resources/azure/ml/machine-learning-studio-workspaces.png differ diff --git a/resources/azure/mobile/app-service---mobile.png b/resources/azure/mobile/app-service---mobile.png new file mode 100644 index 00000000..28ec8b60 Binary files /dev/null and b/resources/azure/mobile/app-service---mobile.png differ diff --git a/resources/azure/mobile/mobile-engagement.png b/resources/azure/mobile/mobile-engagement.png new file mode 100644 index 00000000..d42a91bb Binary files /dev/null and b/resources/azure/mobile/mobile-engagement.png differ diff --git a/resources/azure/mobile/notification-hubs.png b/resources/azure/mobile/notification-hubs.png new file mode 100644 index 00000000..1d69e504 Binary files /dev/null and b/resources/azure/mobile/notification-hubs.png differ diff --git a/resources/azure/network/application-gateway.png b/resources/azure/network/application-gateway.png new file mode 100644 index 00000000..a88f21c4 Binary files /dev/null and b/resources/azure/network/application-gateway.png differ diff --git a/resources/azure/network/application-security-groups.png b/resources/azure/network/application-security-groups.png new file mode 100644 index 00000000..0e0b6be9 Binary files /dev/null and b/resources/azure/network/application-security-groups.png differ diff --git a/resources/azure/network/cdn-profiles.png b/resources/azure/network/cdn-profiles.png new file mode 100644 index 00000000..9b1ca9e4 Binary files /dev/null and b/resources/azure/network/cdn-profiles.png differ diff --git a/resources/azure/network/connections.png b/resources/azure/network/connections.png new file mode 100644 index 00000000..cceef7a4 Binary files /dev/null and b/resources/azure/network/connections.png differ diff --git a/resources/azure/network/ddos-protection-plans.png b/resources/azure/network/ddos-protection-plans.png new file mode 100644 index 00000000..90a6a889 Binary files /dev/null and b/resources/azure/network/ddos-protection-plans.png differ diff --git a/resources/azure/network/dns-private-zones.png b/resources/azure/network/dns-private-zones.png new file mode 100644 index 00000000..60bd589e Binary files /dev/null and b/resources/azure/network/dns-private-zones.png differ diff --git a/resources/azure/network/dns-zones.png b/resources/azure/network/dns-zones.png new file mode 100644 index 00000000..37b8f0d5 Binary files /dev/null and b/resources/azure/network/dns-zones.png differ diff --git a/resources/azure/network/expressroute-circuits.png b/resources/azure/network/expressroute-circuits.png new file mode 100644 index 00000000..207646f6 Binary files /dev/null and b/resources/azure/network/expressroute-circuits.png differ diff --git a/resources/azure/network/firewall.png b/resources/azure/network/firewall.png new file mode 100644 index 00000000..dd8879ab Binary files /dev/null and b/resources/azure/network/firewall.png differ diff --git a/resources/azure/network/front-doors.png b/resources/azure/network/front-doors.png new file mode 100644 index 00000000..0dc539d5 Binary files /dev/null and b/resources/azure/network/front-doors.png differ diff --git a/resources/azure/network/load-balancers.png b/resources/azure/network/load-balancers.png new file mode 100644 index 00000000..aa968112 Binary files /dev/null and b/resources/azure/network/load-balancers.png differ diff --git a/resources/azure/network/local-network-gateways.png b/resources/azure/network/local-network-gateways.png new file mode 100644 index 00000000..5a9d4223 Binary files /dev/null and b/resources/azure/network/local-network-gateways.png differ diff --git a/resources/azure/network/network-interfaces.png b/resources/azure/network/network-interfaces.png new file mode 100644 index 00000000..1c4e0ba0 Binary files /dev/null and b/resources/azure/network/network-interfaces.png differ diff --git a/resources/azure/network/network-security-groups-classic.png b/resources/azure/network/network-security-groups-classic.png new file mode 100644 index 00000000..d9555caf Binary files /dev/null and b/resources/azure/network/network-security-groups-classic.png differ diff --git a/resources/azure/network/network-watcher.png b/resources/azure/network/network-watcher.png new file mode 100644 index 00000000..98a15adb Binary files /dev/null and b/resources/azure/network/network-watcher.png differ diff --git a/resources/azure/network/on-premises-data-gateways.png b/resources/azure/network/on-premises-data-gateways.png new file mode 100644 index 00000000..fb1b0ecb Binary files /dev/null and b/resources/azure/network/on-premises-data-gateways.png differ diff --git a/resources/azure/network/public-ip-addresses.png b/resources/azure/network/public-ip-addresses.png new file mode 100644 index 00000000..f1c81609 Binary files /dev/null and b/resources/azure/network/public-ip-addresses.png differ diff --git a/resources/azure/network/reserved-ip-addresses-classic.png b/resources/azure/network/reserved-ip-addresses-classic.png new file mode 100644 index 00000000..7a784120 Binary files /dev/null and b/resources/azure/network/reserved-ip-addresses-classic.png differ diff --git a/resources/azure/network/route-filters.png b/resources/azure/network/route-filters.png new file mode 100644 index 00000000..92bcb587 Binary files /dev/null and b/resources/azure/network/route-filters.png differ diff --git a/resources/azure/network/route-tables.png b/resources/azure/network/route-tables.png new file mode 100644 index 00000000..1c1ea36a Binary files /dev/null and b/resources/azure/network/route-tables.png differ diff --git a/resources/azure/network/service-endpoint-policies.png b/resources/azure/network/service-endpoint-policies.png new file mode 100644 index 00000000..c13e57a7 Binary files /dev/null and b/resources/azure/network/service-endpoint-policies.png differ diff --git a/resources/azure/network/traffic-manager-profiles.png b/resources/azure/network/traffic-manager-profiles.png new file mode 100644 index 00000000..889a3d3f Binary files /dev/null and b/resources/azure/network/traffic-manager-profiles.png differ diff --git a/resources/azure/network/virtual-network-classic.png b/resources/azure/network/virtual-network-classic.png new file mode 100644 index 00000000..42a30259 Binary files /dev/null and b/resources/azure/network/virtual-network-classic.png differ diff --git a/resources/azure/network/virtual-network-gateways.png b/resources/azure/network/virtual-network-gateways.png new file mode 100644 index 00000000..9645786b Binary files /dev/null and b/resources/azure/network/virtual-network-gateways.png differ diff --git a/resources/azure/network/virtual-networks.png b/resources/azure/network/virtual-networks.png new file mode 100644 index 00000000..5066d26c Binary files /dev/null and b/resources/azure/network/virtual-networks.png differ diff --git a/resources/azure/network/virtual-wans.png b/resources/azure/network/virtual-wans.png new file mode 100644 index 00000000..fc5e589d Binary files /dev/null and b/resources/azure/network/virtual-wans.png differ diff --git a/resources/azure/security/key-vaults.png b/resources/azure/security/key-vaults.png new file mode 100644 index 00000000..bc57429f Binary files /dev/null and b/resources/azure/security/key-vaults.png differ diff --git a/resources/azure/security/security-center.png b/resources/azure/security/security-center.png new file mode 100644 index 00000000..e0fa97e2 Binary files /dev/null and b/resources/azure/security/security-center.png differ diff --git a/resources/azure/security/sentinel.png b/resources/azure/security/sentinel.png new file mode 100644 index 00000000..ecceee66 Binary files /dev/null and b/resources/azure/security/sentinel.png differ diff --git a/resources/azure/storage/archive-storage.png b/resources/azure/storage/archive-storage.png new file mode 100644 index 00000000..f80a1066 Binary files /dev/null and b/resources/azure/storage/archive-storage.png differ diff --git a/resources/azure/storage/azurefxtedgefiler.png b/resources/azure/storage/azurefxtedgefiler.png new file mode 100644 index 00000000..052a8b1d Binary files /dev/null and b/resources/azure/storage/azurefxtedgefiler.png differ diff --git a/resources/azure/storage/blob-storage.png b/resources/azure/storage/blob-storage.png new file mode 100644 index 00000000..e849152a Binary files /dev/null and b/resources/azure/storage/blob-storage.png differ diff --git a/resources/azure/storage/data-box-edge---data-box-gateway.png b/resources/azure/storage/data-box-edge---data-box-gateway.png new file mode 100644 index 00000000..8eec00e4 Binary files /dev/null and b/resources/azure/storage/data-box-edge---data-box-gateway.png differ diff --git a/resources/azure/storage/data-box.png b/resources/azure/storage/data-box.png new file mode 100644 index 00000000..c80eb2fa Binary files /dev/null and b/resources/azure/storage/data-box.png differ diff --git a/resources/azure/storage/data-lake-storage.png b/resources/azure/storage/data-lake-storage.png new file mode 100644 index 00000000..8f22588a Binary files /dev/null and b/resources/azure/storage/data-lake-storage.png differ diff --git a/resources/azure/storage/general-storage.png b/resources/azure/storage/general-storage.png new file mode 100644 index 00000000..03955bd2 Binary files /dev/null and b/resources/azure/storage/general-storage.png differ diff --git a/resources/azure/storage/netapp-files.png b/resources/azure/storage/netapp-files.png new file mode 100644 index 00000000..84e1c669 Binary files /dev/null and b/resources/azure/storage/netapp-files.png differ diff --git a/resources/azure/storage/queues-storage.png b/resources/azure/storage/queues-storage.png new file mode 100644 index 00000000..565aba78 Binary files /dev/null and b/resources/azure/storage/queues-storage.png differ diff --git a/resources/azure/storage/storage-accounts-classic.png b/resources/azure/storage/storage-accounts-classic.png new file mode 100644 index 00000000..81369a9e Binary files /dev/null and b/resources/azure/storage/storage-accounts-classic.png differ diff --git a/resources/azure/storage/storage-accounts.png b/resources/azure/storage/storage-accounts.png new file mode 100644 index 00000000..8f57412e Binary files /dev/null and b/resources/azure/storage/storage-accounts.png differ diff --git a/resources/azure/storage/storage-explorer.png b/resources/azure/storage/storage-explorer.png new file mode 100644 index 00000000..c623801f Binary files /dev/null and b/resources/azure/storage/storage-explorer.png differ diff --git a/resources/azure/storage/storage-sync-services.png b/resources/azure/storage/storage-sync-services.png new file mode 100644 index 00000000..c2ddfdae Binary files /dev/null and b/resources/azure/storage/storage-sync-services.png differ diff --git a/resources/azure/storage/storsimple-data-managers.png b/resources/azure/storage/storsimple-data-managers.png new file mode 100644 index 00000000..7f736062 Binary files /dev/null and b/resources/azure/storage/storsimple-data-managers.png differ diff --git a/resources/azure/storage/storsimple-device-managers.png b/resources/azure/storage/storsimple-device-managers.png new file mode 100644 index 00000000..b29ce455 Binary files /dev/null and b/resources/azure/storage/storsimple-device-managers.png differ diff --git a/resources/azure/storage/table-storage.png b/resources/azure/storage/table-storage.png new file mode 100644 index 00000000..7dd762fd Binary files /dev/null and b/resources/azure/storage/table-storage.png differ diff --git a/resources/azure/web/api-connections.png b/resources/azure/web/api-connections.png new file mode 100644 index 00000000..3c0db2e6 Binary files /dev/null and b/resources/azure/web/api-connections.png differ diff --git a/resources/azure/web/app-service-certificates.png b/resources/azure/web/app-service-certificates.png new file mode 100644 index 00000000..66e533f9 Binary files /dev/null and b/resources/azure/web/app-service-certificates.png differ diff --git a/resources/azure/web/app-service-domains.png b/resources/azure/web/app-service-domains.png new file mode 100644 index 00000000..26b3b799 Binary files /dev/null and b/resources/azure/web/app-service-domains.png differ diff --git a/resources/azure/web/app-service-environments.png b/resources/azure/web/app-service-environments.png new file mode 100644 index 00000000..39c7a5f4 Binary files /dev/null and b/resources/azure/web/app-service-environments.png differ diff --git a/resources/azure/web/app-service-plans.png b/resources/azure/web/app-service-plans.png new file mode 100644 index 00000000..65d774da Binary files /dev/null and b/resources/azure/web/app-service-plans.png differ diff --git a/resources/azure/web/app-services.png b/resources/azure/web/app-services.png new file mode 100644 index 00000000..2cb88f60 Binary files /dev/null and b/resources/azure/web/app-services.png differ diff --git a/resources/azure/web/media-services.png b/resources/azure/web/media-services.png new file mode 100644 index 00000000..38001ecc Binary files /dev/null and b/resources/azure/web/media-services.png differ diff --git a/resources/azure/web/notification-hub-namespaces.png b/resources/azure/web/notification-hub-namespaces.png new file mode 100644 index 00000000..1d69e504 Binary files /dev/null and b/resources/azure/web/notification-hub-namespaces.png differ diff --git a/resources/azure/web/search.png b/resources/azure/web/search.png new file mode 100644 index 00000000..5cd48eed Binary files /dev/null and b/resources/azure/web/search.png differ diff --git a/resources/azure/web/signalr.png b/resources/azure/web/signalr.png new file mode 100644 index 00000000..8596a694 Binary files /dev/null and b/resources/azure/web/signalr.png differ diff --git a/resources/gcp/analytics/bigquery.png b/resources/gcp/analytics/bigquery.png new file mode 100644 index 00000000..a7e0a715 Binary files /dev/null and b/resources/gcp/analytics/bigquery.png differ diff --git a/resources/gcp/analytics/composer.png b/resources/gcp/analytics/composer.png new file mode 100644 index 00000000..1c62a13b Binary files /dev/null and b/resources/gcp/analytics/composer.png differ diff --git a/resources/gcp/analytics/data-catalog.png b/resources/gcp/analytics/data-catalog.png new file mode 100644 index 00000000..36531689 Binary files /dev/null and b/resources/gcp/analytics/data-catalog.png differ diff --git a/resources/gcp/analytics/data-fusion.png b/resources/gcp/analytics/data-fusion.png new file mode 100644 index 00000000..62c1b347 Binary files /dev/null and b/resources/gcp/analytics/data-fusion.png differ diff --git a/resources/gcp/analytics/dataflow.png b/resources/gcp/analytics/dataflow.png new file mode 100644 index 00000000..c53ddf83 Binary files /dev/null and b/resources/gcp/analytics/dataflow.png differ diff --git a/resources/gcp/analytics/datalab.png b/resources/gcp/analytics/datalab.png new file mode 100644 index 00000000..9c5ad7d7 Binary files /dev/null and b/resources/gcp/analytics/datalab.png differ diff --git a/resources/gcp/analytics/dataprep.png b/resources/gcp/analytics/dataprep.png new file mode 100644 index 00000000..17132f25 Binary files /dev/null and b/resources/gcp/analytics/dataprep.png differ diff --git a/resources/gcp/analytics/dataproc.png b/resources/gcp/analytics/dataproc.png new file mode 100644 index 00000000..eb5ed2ce Binary files /dev/null and b/resources/gcp/analytics/dataproc.png differ diff --git a/resources/gcp/analytics/genomics.png b/resources/gcp/analytics/genomics.png new file mode 100644 index 00000000..3a463caa Binary files /dev/null and b/resources/gcp/analytics/genomics.png differ diff --git a/resources/gcp/analytics/pubsub.png b/resources/gcp/analytics/pubsub.png new file mode 100644 index 00000000..5b5610c9 Binary files /dev/null and b/resources/gcp/analytics/pubsub.png differ diff --git a/resources/gcp/compute/app-engine.png b/resources/gcp/compute/app-engine.png new file mode 100644 index 00000000..b82ddbda Binary files /dev/null and b/resources/gcp/compute/app-engine.png differ diff --git a/resources/gcp/compute/compute-engine.png b/resources/gcp/compute/compute-engine.png new file mode 100644 index 00000000..a4b52d92 Binary files /dev/null and b/resources/gcp/compute/compute-engine.png differ diff --git a/resources/gcp/compute/container-optimized-os.png b/resources/gcp/compute/container-optimized-os.png new file mode 100644 index 00000000..67a2504d Binary files /dev/null and b/resources/gcp/compute/container-optimized-os.png differ diff --git a/resources/gcp/compute/functions.png b/resources/gcp/compute/functions.png new file mode 100644 index 00000000..24188a42 Binary files /dev/null and b/resources/gcp/compute/functions.png differ diff --git a/resources/gcp/compute/gke-on-prem.png b/resources/gcp/compute/gke-on-prem.png new file mode 100644 index 00000000..1e18cba8 Binary files /dev/null and b/resources/gcp/compute/gke-on-prem.png differ diff --git a/resources/gcp/compute/gpu.png b/resources/gcp/compute/gpu.png new file mode 100644 index 00000000..94a26fd4 Binary files /dev/null and b/resources/gcp/compute/gpu.png differ diff --git a/resources/gcp/compute/kubernetes-engine.png b/resources/gcp/compute/kubernetes-engine.png new file mode 100644 index 00000000..0e434e31 Binary files /dev/null and b/resources/gcp/compute/kubernetes-engine.png differ diff --git a/resources/gcp/compute/run.png b/resources/gcp/compute/run.png new file mode 100644 index 00000000..c614b401 Binary files /dev/null and b/resources/gcp/compute/run.png differ diff --git a/resources/gcp/database/bigtable.png b/resources/gcp/database/bigtable.png new file mode 100644 index 00000000..afce5e05 Binary files /dev/null and b/resources/gcp/database/bigtable.png differ diff --git a/resources/gcp/database/datastore.png b/resources/gcp/database/datastore.png new file mode 100644 index 00000000..43a77a8c Binary files /dev/null and b/resources/gcp/database/datastore.png differ diff --git a/resources/gcp/database/firestore.png b/resources/gcp/database/firestore.png new file mode 100644 index 00000000..a161e8ce Binary files /dev/null and b/resources/gcp/database/firestore.png differ diff --git a/resources/gcp/database/memorystore.png b/resources/gcp/database/memorystore.png new file mode 100644 index 00000000..ceb3b893 Binary files /dev/null and b/resources/gcp/database/memorystore.png differ diff --git a/resources/gcp/database/spanner.png b/resources/gcp/database/spanner.png new file mode 100644 index 00000000..88068fbb Binary files /dev/null and b/resources/gcp/database/spanner.png differ diff --git a/resources/gcp/database/sql.png b/resources/gcp/database/sql.png new file mode 100644 index 00000000..9763c557 Binary files /dev/null and b/resources/gcp/database/sql.png differ diff --git a/resources/gcp/devtools/build.png b/resources/gcp/devtools/build.png new file mode 100644 index 00000000..d09c343e Binary files /dev/null and b/resources/gcp/devtools/build.png differ diff --git a/resources/gcp/devtools/code-for-intellij.png b/resources/gcp/devtools/code-for-intellij.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/code-for-intellij.png differ diff --git a/resources/gcp/devtools/code.png b/resources/gcp/devtools/code.png new file mode 100644 index 00000000..0a5f58c7 Binary files /dev/null and b/resources/gcp/devtools/code.png differ diff --git a/resources/gcp/devtools/container-registry.png b/resources/gcp/devtools/container-registry.png new file mode 100644 index 00000000..e645187b Binary files /dev/null and b/resources/gcp/devtools/container-registry.png differ diff --git a/resources/gcp/devtools/gradle-app-engine-plugin.png b/resources/gcp/devtools/gradle-app-engine-plugin.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/gradle-app-engine-plugin.png differ diff --git a/resources/gcp/devtools/ide-plugins.png b/resources/gcp/devtools/ide-plugins.png new file mode 100644 index 00000000..bc2bd2c5 Binary files /dev/null and b/resources/gcp/devtools/ide-plugins.png differ diff --git a/resources/gcp/devtools/maven-app-engine-plugin.png b/resources/gcp/devtools/maven-app-engine-plugin.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/maven-app-engine-plugin.png differ diff --git a/resources/gcp/devtools/scheduler.png b/resources/gcp/devtools/scheduler.png new file mode 100644 index 00000000..87ebc123 Binary files /dev/null and b/resources/gcp/devtools/scheduler.png differ diff --git a/resources/gcp/devtools/sdk.png b/resources/gcp/devtools/sdk.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/sdk.png differ diff --git a/resources/gcp/devtools/source-repositories.png b/resources/gcp/devtools/source-repositories.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/source-repositories.png differ diff --git a/resources/gcp/devtools/tasks.png b/resources/gcp/devtools/tasks.png new file mode 100644 index 00000000..39a54f00 Binary files /dev/null and b/resources/gcp/devtools/tasks.png differ diff --git a/resources/gcp/devtools/test-lab.png b/resources/gcp/devtools/test-lab.png new file mode 100644 index 00000000..9ab38918 Binary files /dev/null and b/resources/gcp/devtools/test-lab.png differ diff --git a/resources/gcp/devtools/tools-for-eclipse.png b/resources/gcp/devtools/tools-for-eclipse.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/devtools/tools-for-eclipse.png differ diff --git a/resources/gcp/devtools/tools-for-powershell.png b/resources/gcp/devtools/tools-for-powershell.png new file mode 100644 index 00000000..bc2bd2c5 Binary files /dev/null and b/resources/gcp/devtools/tools-for-powershell.png differ diff --git a/resources/gcp/devtools/tools-for-visual-studio.png b/resources/gcp/devtools/tools-for-visual-studio.png new file mode 100644 index 00000000..bc2bd2c5 Binary files /dev/null and b/resources/gcp/devtools/tools-for-visual-studio.png differ diff --git a/resources/gcp/iot/iot-core.png b/resources/gcp/iot/iot-core.png new file mode 100644 index 00000000..cdb2ab73 Binary files /dev/null and b/resources/gcp/iot/iot-core.png differ diff --git a/resources/gcp/migration/transfer-appliance.png b/resources/gcp/migration/transfer-appliance.png new file mode 100644 index 00000000..8b9cf7ac Binary files /dev/null and b/resources/gcp/migration/transfer-appliance.png differ diff --git a/resources/gcp/ml/advanced-solutions-lab.png b/resources/gcp/ml/advanced-solutions-lab.png new file mode 100644 index 00000000..d7ddd494 Binary files /dev/null and b/resources/gcp/ml/advanced-solutions-lab.png differ diff --git a/resources/gcp/ml/ai-hub.png b/resources/gcp/ml/ai-hub.png new file mode 100644 index 00000000..3b770bec Binary files /dev/null and b/resources/gcp/ml/ai-hub.png differ diff --git a/resources/gcp/ml/ai-platform-data-labeling-service.png b/resources/gcp/ml/ai-platform-data-labeling-service.png new file mode 100644 index 00000000..1ff83f6e Binary files /dev/null and b/resources/gcp/ml/ai-platform-data-labeling-service.png differ diff --git a/resources/gcp/ml/ai-platform.png b/resources/gcp/ml/ai-platform.png new file mode 100644 index 00000000..f85ff7f8 Binary files /dev/null and b/resources/gcp/ml/ai-platform.png differ diff --git a/resources/gcp/ml/automl-natural-language.png b/resources/gcp/ml/automl-natural-language.png new file mode 100644 index 00000000..02ceffe8 Binary files /dev/null and b/resources/gcp/ml/automl-natural-language.png differ diff --git a/resources/gcp/ml/automl-tables.png b/resources/gcp/ml/automl-tables.png new file mode 100644 index 00000000..2235b0c5 Binary files /dev/null and b/resources/gcp/ml/automl-tables.png differ diff --git a/resources/gcp/ml/automl-translation.png b/resources/gcp/ml/automl-translation.png new file mode 100644 index 00000000..37fa0293 Binary files /dev/null and b/resources/gcp/ml/automl-translation.png differ diff --git a/resources/gcp/ml/automl-video-intelligence.png b/resources/gcp/ml/automl-video-intelligence.png new file mode 100644 index 00000000..ec99fa33 Binary files /dev/null and b/resources/gcp/ml/automl-video-intelligence.png differ diff --git a/resources/gcp/ml/automl-vision.png b/resources/gcp/ml/automl-vision.png new file mode 100644 index 00000000..37489265 Binary files /dev/null and b/resources/gcp/ml/automl-vision.png differ diff --git a/resources/gcp/ml/automl.png b/resources/gcp/ml/automl.png new file mode 100644 index 00000000..b147e074 Binary files /dev/null and b/resources/gcp/ml/automl.png differ diff --git a/resources/gcp/ml/dialog-flow-enterprise-edition.png b/resources/gcp/ml/dialog-flow-enterprise-edition.png new file mode 100644 index 00000000..7166aec7 Binary files /dev/null and b/resources/gcp/ml/dialog-flow-enterprise-edition.png differ diff --git a/resources/gcp/ml/inference-api.png b/resources/gcp/ml/inference-api.png new file mode 100644 index 00000000..8821845f Binary files /dev/null and b/resources/gcp/ml/inference-api.png differ diff --git a/resources/gcp/ml/jobs-api.png b/resources/gcp/ml/jobs-api.png new file mode 100644 index 00000000..271b502e Binary files /dev/null and b/resources/gcp/ml/jobs-api.png differ diff --git a/resources/gcp/ml/natural-language-api.png b/resources/gcp/ml/natural-language-api.png new file mode 100644 index 00000000..a8c4308d Binary files /dev/null and b/resources/gcp/ml/natural-language-api.png differ diff --git a/resources/gcp/ml/recommendations-ai.png b/resources/gcp/ml/recommendations-ai.png new file mode 100644 index 00000000..b05ac59b Binary files /dev/null and b/resources/gcp/ml/recommendations-ai.png differ diff --git a/resources/gcp/ml/speech-to-text.png b/resources/gcp/ml/speech-to-text.png new file mode 100644 index 00000000..fd5ccea5 Binary files /dev/null and b/resources/gcp/ml/speech-to-text.png differ diff --git a/resources/gcp/ml/text-to-speech.png b/resources/gcp/ml/text-to-speech.png new file mode 100644 index 00000000..5822fa63 Binary files /dev/null and b/resources/gcp/ml/text-to-speech.png differ diff --git a/resources/gcp/ml/tpu.png b/resources/gcp/ml/tpu.png new file mode 100644 index 00000000..158946a9 Binary files /dev/null and b/resources/gcp/ml/tpu.png differ diff --git a/resources/gcp/ml/translation-api.png b/resources/gcp/ml/translation-api.png new file mode 100644 index 00000000..6997d9f5 Binary files /dev/null and b/resources/gcp/ml/translation-api.png differ diff --git a/resources/gcp/ml/video-intelligence-api.png b/resources/gcp/ml/video-intelligence-api.png new file mode 100644 index 00000000..1c6e00c1 Binary files /dev/null and b/resources/gcp/ml/video-intelligence-api.png differ diff --git a/resources/gcp/ml/vision-api.png b/resources/gcp/ml/vision-api.png new file mode 100644 index 00000000..28e2d631 Binary files /dev/null and b/resources/gcp/ml/vision-api.png differ diff --git a/resources/gcp/network/armor.png b/resources/gcp/network/armor.png new file mode 100644 index 00000000..5cc9bc13 Binary files /dev/null and b/resources/gcp/network/armor.png differ diff --git a/resources/gcp/network/cdn.png b/resources/gcp/network/cdn.png new file mode 100644 index 00000000..b2ac3981 Binary files /dev/null and b/resources/gcp/network/cdn.png differ diff --git a/resources/gcp/network/dedicated-interconnect.png b/resources/gcp/network/dedicated-interconnect.png new file mode 100644 index 00000000..d11202df Binary files /dev/null and b/resources/gcp/network/dedicated-interconnect.png differ diff --git a/resources/gcp/network/dns.png b/resources/gcp/network/dns.png new file mode 100644 index 00000000..2d8c27be Binary files /dev/null and b/resources/gcp/network/dns.png differ diff --git a/resources/gcp/network/external-ip-addresses.png b/resources/gcp/network/external-ip-addresses.png new file mode 100644 index 00000000..a3f1b891 Binary files /dev/null and b/resources/gcp/network/external-ip-addresses.png differ diff --git a/resources/gcp/network/firewall-rules.png b/resources/gcp/network/firewall-rules.png new file mode 100644 index 00000000..ff4a8390 Binary files /dev/null and b/resources/gcp/network/firewall-rules.png differ diff --git a/resources/gcp/network/load-balancing.png b/resources/gcp/network/load-balancing.png new file mode 100644 index 00000000..b245d3ca Binary files /dev/null and b/resources/gcp/network/load-balancing.png differ diff --git a/resources/gcp/network/nat.png b/resources/gcp/network/nat.png new file mode 100644 index 00000000..e4b8788c Binary files /dev/null and b/resources/gcp/network/nat.png differ diff --git a/resources/gcp/network/network.png b/resources/gcp/network/network.png new file mode 100644 index 00000000..3dde3517 Binary files /dev/null and b/resources/gcp/network/network.png differ diff --git a/resources/gcp/network/partner-interconnect.png b/resources/gcp/network/partner-interconnect.png new file mode 100644 index 00000000..be0e43f5 Binary files /dev/null and b/resources/gcp/network/partner-interconnect.png differ diff --git a/resources/gcp/network/premium-network-tier.png b/resources/gcp/network/premium-network-tier.png new file mode 100644 index 00000000..5de7b572 Binary files /dev/null and b/resources/gcp/network/premium-network-tier.png differ diff --git a/resources/gcp/network/router.png b/resources/gcp/network/router.png new file mode 100644 index 00000000..f00fdf61 Binary files /dev/null and b/resources/gcp/network/router.png differ diff --git a/resources/gcp/network/routes.png b/resources/gcp/network/routes.png new file mode 100644 index 00000000..51743c98 Binary files /dev/null and b/resources/gcp/network/routes.png differ diff --git a/resources/gcp/network/standard-network-tier.png b/resources/gcp/network/standard-network-tier.png new file mode 100644 index 00000000..674e95ff Binary files /dev/null and b/resources/gcp/network/standard-network-tier.png differ diff --git a/resources/gcp/network/traffic-director.png b/resources/gcp/network/traffic-director.png new file mode 100644 index 00000000..0b4efb53 Binary files /dev/null and b/resources/gcp/network/traffic-director.png differ diff --git a/resources/gcp/network/virtual-private-cloud.png b/resources/gcp/network/virtual-private-cloud.png new file mode 100644 index 00000000..7944217c Binary files /dev/null and b/resources/gcp/network/virtual-private-cloud.png differ diff --git a/resources/gcp/network/vpn.png b/resources/gcp/network/vpn.png new file mode 100644 index 00000000..ef511948 Binary files /dev/null and b/resources/gcp/network/vpn.png differ diff --git a/resources/gcp/security/iam.png b/resources/gcp/security/iam.png new file mode 100644 index 00000000..31e24bab Binary files /dev/null and b/resources/gcp/security/iam.png differ diff --git a/resources/gcp/security/key-management-service.png b/resources/gcp/security/key-management-service.png new file mode 100644 index 00000000..46edd260 Binary files /dev/null and b/resources/gcp/security/key-management-service.png differ diff --git a/resources/gcp/security/resource-manager.png b/resources/gcp/security/resource-manager.png new file mode 100644 index 00000000..31e24bab Binary files /dev/null and b/resources/gcp/security/resource-manager.png differ diff --git a/resources/gcp/security/security-command-center.png b/resources/gcp/security/security-command-center.png new file mode 100644 index 00000000..fd93a89f Binary files /dev/null and b/resources/gcp/security/security-command-center.png differ diff --git a/resources/gcp/security/security-scanner.png b/resources/gcp/security/security-scanner.png new file mode 100644 index 00000000..fca9bed3 Binary files /dev/null and b/resources/gcp/security/security-scanner.png differ diff --git a/resources/gcp/storage/filestore.png b/resources/gcp/storage/filestore.png new file mode 100644 index 00000000..dca1ffa2 Binary files /dev/null and b/resources/gcp/storage/filestore.png differ diff --git a/resources/gcp/storage/persistent-disk.png b/resources/gcp/storage/persistent-disk.png new file mode 100644 index 00000000..4be2acf2 Binary files /dev/null and b/resources/gcp/storage/persistent-disk.png differ diff --git a/resources/gcp/storage/storage.png b/resources/gcp/storage/storage.png new file mode 100644 index 00000000..3b7bb1ae Binary files /dev/null and b/resources/gcp/storage/storage.png differ diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 00000000..285441b7 --- /dev/null +++ b/scripts/__init__.py @@ -0,0 +1,19 @@ +import os +from pathlib import Path + +import config as cfg + + +def app_root_dir(pvd: str) -> str: + basedir = Path(os.path.abspath(os.path.dirname(__file__))) + return os.path.join(basedir.parent, cfg.DIR_APP_ROOT, pvd) + + +def resource_dir(pvd: str) -> str: + basedir = Path(os.path.abspath(os.path.dirname(__file__))) + return os.path.join(basedir.parent, cfg.DIR_RESOURCE, pvd) + + +def template_dir() -> str: + basedir = Path(os.path.abspath(os.path.dirname(__file__))) + return os.path.join(basedir.parent, cfg.DIR_TEMPLATE) diff --git a/scripts/generate.py b/scripts/generate.py new file mode 100644 index 00000000..6c8cb707 --- /dev/null +++ b/scripts/generate.py @@ -0,0 +1,65 @@ +import os +import sys +from typing import Iterable + +from jinja2 import Environment, FileSystemLoader, Template + +import config as cfg +from . import app_root_dir, resource_dir, template_dir + +_usage = "Usage: generate.py " + + +def load_tmpl(tmpl: str) -> Template: + env = Environment(loader=FileSystemLoader(template_dir())) + env.filters["up_or_title"] = up_or_title + return env.get_template(tmpl) + + +def up_or_title(pvd: str, s: str) -> str: + return s.upper() if s in cfg.UPPER_WORDS[pvd] else s.title() + + +def gen_classes(pvd: str, typ: str, paths: Iterable[str]) -> str: + """Generate all service node classes based on resources paths with class templates.""" + tmpl = load_tmpl(cfg.TMPL_MODULE) + + def _gen_class_meta(path: str) -> dict: + base = os.path.splitext(path)[0] + name = "".join([up_or_title(pvd, s) for s in base.split("-")]) + return {"name": name, "icon": path} + + metas = map(_gen_class_meta, paths) + aliases = cfg.ALIASES[pvd][typ] if typ in cfg.ALIASES[pvd] else {} + return tmpl.render(pvd=pvd, typ=typ, metas=metas, aliases=aliases) + + +def make_module(pvd: str, typ: str, classes: str) -> None: + """Create a module file""" + mod_path = os.path.join(app_root_dir(pvd), f"{typ}.py") + with open(mod_path, "w+") as f: + f.write(classes) + + +def generate(pvd: str) -> None: + """Generates a service node classes.""" + for root, _, files in os.walk(resource_dir(pvd)): + # Extract the names and paths from resources. + files.sort() + pngs = filter(lambda f: f.endswith(".png"), files) + paths = filter(lambda f: "rounded" not in f, pngs) + + # Skip the top-root directory. + typ = os.path.basename(root) + if typ == pvd: + continue + + classes = gen_classes(pvd, typ, paths) + make_module(pvd, typ, classes) + + +if __name__ == "__main__": + pvd = sys.argv[1] + if pvd not in cfg.PROVIDERS: + sys.exit() + generate(pvd) diff --git a/scripts/resource.py b/scripts/resource.py new file mode 100644 index 00000000..79b15712 --- /dev/null +++ b/scripts/resource.py @@ -0,0 +1,116 @@ +""" +resources.py provides useful tools for resources processing. + +There are 2 commands available. +- clean: clean and unify the resources file names with some rules. +- round: generate the rounded images from the original squared images. +""" + +import os +import subprocess +import sys + +import config as cfg +from . import resource_dir + +_usage = "Usage: resources.py " + + +def cleaner_aws(f): + f = f.replace("_", "-") + f = f.replace("@4x", "") + for p in cfg.FILE_PREFIXES["aws"]: + if f.startswith(p): + f = f[len(p):] + break + return f.lower() + + +def cleaner_azure(f): + f = f.replace("_", "-") + f = f.replace("(", "").replace(")", "") + f = "-".join(f.split()) + for p in cfg.FILE_PREFIXES["azure"]: + if f.startswith(p): + f = f[len(p):] + break + return f.lower() + + +def cleaner_gcp(f): + f = f.replace("_", "-") + f = "-".join(f.split()) + for p in cfg.FILE_PREFIXES["gcp"]: + if f.startswith(p): + f = f[len(p):] + break + return f.lower() + + +cleaners = { + "aws": cleaner_aws, + "azure": cleaner_azure, + "gcp": cleaner_gcp, +} + + +def clean_png(pvd: str) -> None: + """Refine the resources files names.""" + + def _rename(base: str, png: str): + new = cleaners[pvd](png) + old_path = os.path.join(base, png) + new_path = os.path.join(base, new) + os.rename(old_path, new_path) + + for root, _, files in os.walk(resource_dir(pvd)): + pngs = filter(lambda f: f.endswith(".png"), files) + [_rename(root, png) for png in pngs] + + +def round_png(pvd: str) -> None: + """Round the images.""" + + def _round(base: str, path: str): + path = os.path.join(base, path) + subprocess.call([cfg.CMD_ROUND, *cfg.CMD_ROUND_OPTS, path]) + + for root, _, files in os.walk(resource_dir(pvd)): + pngs = filter(lambda f: f.endswith(".png"), files) + paths = filter(lambda f: "rounded" not in f, pngs) + [_round(root, path) for path in paths] + + +def svg2png(pvd: str) -> None: + """Convert the svg into png""" + + def _convert(base: str, path: str): + path = os.path.join(base, path) + subprocess.call([cfg.CMD_SVG2PNG, *cfg.CMD_SVG2PNG_OPTS, path]) + subprocess.call(['rm', path]) + + for root, _, files in os.walk(resource_dir(pvd)): + svgs = filter(lambda f: f.endswith(".svg"), files) + [_convert(root, path) for path in svgs] + + +# fmt: off +commands = { + "clean": clean_png, + "round": round_png, + "svg2png": svg2png, +} +# fmt: on + +if __name__ == "__main__": + if len(sys.argv) < 3: + print(_usage) + sys.exit() + + cmd = sys.argv[1] + pvd = sys.argv[2] + if cmd not in commands: + sys.exit() + if pvd not in cfg.PROVIDERS: + sys.exit() + commands[cmd](pvd) diff --git a/templates/module.tmpl b/templates/module.tmpl new file mode 100644 index 00000000..d1c5f5ca --- /dev/null +++ b/templates/module.tmpl @@ -0,0 +1,15 @@ +# This module is automatically generated by autogen.sh. DO NOT EDIT. + +from . import _{{ pvd|up_or_title(pvd) }} + +class _{{ pvd|up_or_title(typ) }}(_{{ pvd|up_or_title(pvd) }}): + _type = "{{ typ }}" + _icon_dir = "resources/{{ pvd }}/{{ typ }}" + +{% for meta in metas %} +class {{ meta["name"] }}(_{{ pvd|up_or_title(typ) }}): + _icon = "{{ meta["icon"] }}"{% endfor %} + +# Aliases +{% for svc, alias in aliases.items() %} +{{ alias }} = {{ svc }}{% endfor %} diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_diagram.py b/tests/test_diagram.py new file mode 100644 index 00000000..2c036b1a --- /dev/null +++ b/tests/test_diagram.py @@ -0,0 +1,149 @@ +import os +import unittest + +from diagrams import Cluster, Diagram, Node +from diagrams import getcluster, getdiagram, setcluster, setdiagram + + +class DiagramTest(unittest.TestCase): + def setUp(self): + self.name = "test" + + def tearDown(self): + setdiagram(None) + setcluster(None) + # Only some tests generate the image file. + try: + os.remove(self.name + ".png") + except FileNotFoundError: + pass + + def test_validate_direction(self): + # Normal directions. + for dir in ("TB", "BT", "LR", "RL"): + Diagram(direction=dir) + + # Invalid directions. + for dir in ("BR", "TL", "Unknown"): + with self.assertRaises(ValueError): + Diagram(direction=dir) + + def test_validate_outformat(self): + # Normal output formats. + for fmt in ("png", "jpg", "svg", "pdf"): + Diagram(outformat=fmt) + + # Invalid output formats. + for fmt in ("pnp", "jpe", "unknown"): + with self.assertRaises(ValueError): + Diagram(outformat=fmt) + + def test_with_global_context(self): + self.assertIsNone(getdiagram()) + with Diagram(name=self.name, show=False): + self.assertIsNotNone(getdiagram()) + self.assertIsNone(getdiagram()) + + def test_node_not_in_diagram(self): + # Node must be belong to a diagrams. + with self.assertRaises(EnvironmentError): + Node("node") + + def test_node_to_node(self): + with Diagram(name=self.name, show=False): + node1 = Node("node1") + node2 = Node("node2") + self.assertEqual(node1 - node2, node2) + self.assertEqual(node1 >> node2, node2) + self.assertEqual(node1 << node2, node2) + + def test_node_to_nodes(self): + with Diagram(name=self.name, show=False): + node1 = Node("node1") + nodes = [Node("node2"), Node("node3")] + self.assertEqual(node1 - nodes, nodes) + self.assertEqual(node1 >> nodes, nodes) + self.assertEqual(node1 << nodes, nodes) + + def test_nodes_to_node(self): + with Diagram(name=self.name, show=False): + node1 = Node("node1") + nodes = [Node("node2"), Node("node3")] + self.assertEqual(nodes - node1, node1) + self.assertEqual(nodes >> node1, node1) + self.assertEqual(nodes << node1, node1) + + +class ClusterTest(unittest.TestCase): + def setUp(self): + self.name = "test" + + def tearDown(self): + setdiagram(None) + setcluster(None) + # Only some tests generate the image file. + try: + os.remove(self.name + ".png") + except FileNotFoundError: + pass + + def test_validate_direction(self): + # Normal directions. + for dir in ("TB", "BT", "LR", "RL"): + with Diagram(name=self.name, show=False): + Cluster(direction=dir) + + # Invalid directions. + for dir in ("BR", "TL", "Unknown"): + with self.assertRaises(ValueError): + with Diagram(name=self.name, show=False): + Cluster(direction=dir) + + def test_with_global_context(self): + with Diagram(name=self.name, show=False): + self.assertIsNone(getcluster()) + with Cluster(): + self.assertIsNotNone(getcluster()) + self.assertIsNone(getcluster()) + + def test_with_nested_cluster(self): + with Diagram(name=self.name, show=False): + self.assertIsNone(getcluster()) + with Cluster() as c1: + self.assertEqual(c1, getcluster()) + with Cluster() as c2: + self.assertEqual(c2, getcluster()) + self.assertEqual(c1, getcluster()) + self.assertIsNone(getcluster()) + + def test_node_not_in_diagram(self): + # Node must be belong to a diagrams. + with self.assertRaises(EnvironmentError): + Node("node") + + def test_node_to_node(self): + with Diagram(name=self.name, show=False): + with Cluster(): + node1 = Node("node1") + node2 = Node("node2") + self.assertEqual(node1 - node2, node2) + self.assertEqual(node1 >> node2, node2) + self.assertEqual(node1 << node2, node2) + + def test_node_to_nodes(self): + with Diagram(name=self.name, show=False): + with Cluster(): + node1 = Node("node1") + nodes = [Node("node2"), Node("node3")] + self.assertEqual(node1 - nodes, nodes) + self.assertEqual(node1 >> nodes, nodes) + self.assertEqual(node1 << nodes, nodes) + + def test_nodes_to_node(self): + with Diagram(name=self.name, show=False): + with Cluster(): + node1 = Node("node1") + nodes = [Node("node2"), Node("node3")] + self.assertEqual(nodes - node1, node1) + self.assertEqual(nodes >> node1, node1) + self.assertEqual(nodes << node1, node1) diff --git a/website/core/Footer.js b/website/core/Footer.js new file mode 100644 index 00000000..de1cfe1f --- /dev/null +++ b/website/core/Footer.js @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const React = require('react'); + +class Footer extends React.Component { + docUrl(doc, language) { + const baseUrl = this.props.config.baseUrl; + const docsUrl = this.props.config.docsUrl; + const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; + const langPart = `${language ? `${language}/` : ''}`; + return `${baseUrl}${docsPart}${langPart}${doc}`; + } + + pageUrl(doc, language) { + const baseUrl = this.props.config.baseUrl; + return baseUrl + (language ? `${language}/` : '') + doc; + } + + render() { + return ( + + ); + } +} + +module.exports = Footer; diff --git a/website/i18n/en.json b/website/i18n/en.json new file mode 100644 index 00000000..7a80deb6 --- /dev/null +++ b/website/i18n/en.json @@ -0,0 +1,39 @@ +{ + "_comment": "This file is auto-generated by write-translations.js", + "localized-strings": { + "next": "Next", + "previous": "Previous", + "tagline": "Diagram as Code", + "docs": { + "cluster": { + "title": "Clusters" + }, + "diagram": { + "title": "Diagrams" + }, + "examples": { + "title": "Examples" + }, + "installation": { + "title": "Installation" + }, + "node": { + "title": "Nodes" + } + }, + "links": { + "Docs": "Docs", + "Guides": "Guides", + "GitHub": "GitHub" + }, + "categories": { + "Getting Started": "Getting Started", + "Guides": "Guides" + } + }, + "pages-strings": { + "Help Translate|recruit community translators for your project": "Help Translate", + "Edit this Doc|recruitment message asking to edit the doc source": "Edit", + "Translate this Doc|recruitment message asking to translate the docs": "Translate" + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 00000000..1f87392a --- /dev/null +++ b/website/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "examples": "docusaurus-examples", + "start": "docusaurus-start", + "build": "docusaurus-build", + "publish-gh-pages": "docusaurus-publish", + "write-translations": "docusaurus-write-translations", + "version": "docusaurus-version", + "rename-version": "docusaurus-rename-version" + }, + "devDependencies": { + "docusaurus": "^1.14.4" + } +} diff --git a/website/pages/en/index.js b/website/pages/en/index.js new file mode 100644 index 00000000..c9638a46 --- /dev/null +++ b/website/pages/en/index.js @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const React = require('react'); + +const CompLibrary = require('../../core/CompLibrary.js'); + +const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */ +const Container = CompLibrary.Container; +const GridBlock = CompLibrary.GridBlock; + +class HomeSplash extends React.Component { + render() { + const {siteConfig, language = ''} = this.props; + const {baseUrl, docsUrl} = siteConfig; + const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; + const langPart = `${language ? `${language}/` : ''}`; + const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`; + + const SplashContainer = props => ( +
+
+
{props.children}
+
+
+ ); + + const Logo = props => ( +
+ Project Logo +
+ ); + + const ProjectTitle = props => ( +

+ {props.title} + {props.tagline} +

+ ); + + const PromoSection = props => ( +
+
+
{props.children}
+
+
+ ); + + const Button = props => ( + + ); + + return ( + + +
+ + + + + +
+
+ ); + } +} + +class Index extends React.Component { + render() { + const {config: siteConfig, language = ''} = this.props; + const {baseUrl} = siteConfig; + + const Block = props => ( + + + + ); + + const About = () => ( +
+

About Diagram

+ + Diagrams lets you to draw the cloud system architecture **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. + + + `Diagram as Code` allows you to **tracking** the architecture diagram changes on any **version control** system. + + + Diagrams currently supports three major cloud providers: `AWS`, `Azure`, `GCP`. + +
+ ); + + const Example = () => ( + + {[ + { + image: `${baseUrl}img/message_collecting_code.png`, + imageAlign: 'left', + }, + { + image: `${baseUrl}img/message_collecting_diagram.png`, + imageAlign: 'right', + }, + ]} + + ); + + const Example2 = () => ( + + {[ + { + image: `${baseUrl}img/event_processing_code.png`, + imageAlign: 'left', + }, + { + image: `${baseUrl}img/event_processing_diagram.png`, + imageAlign: 'right', + }, + ]} + + ); + + return ( +
+ +
+ + + +
+
+ ); + } +} + +module.exports = Index; diff --git a/website/sidebars.json b/website/sidebars.json new file mode 100644 index 00000000..709141e0 --- /dev/null +++ b/website/sidebars.json @@ -0,0 +1,6 @@ +{ + "docs": { + "Getting Started": ["installation", "examples"], + "Guides": ["diagram", "node", "cluster"] + } +} diff --git a/website/siteConfig.js b/website/siteConfig.js new file mode 100644 index 00000000..2be1c3a6 --- /dev/null +++ b/website/siteConfig.js @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// See https://docusaurus.io/docs/site-config for all the possible +// site configuration options. + +const siteConfig = { + title: 'Diagrams', + tagline: 'Diagram as Code', + url: 'diagrams.mingrrammer.com', + baseUrl: '/', + cname: 'diagrams.mingrrammer.com', + projectName: 'diagrams', + organizationName: 'mingrammer', + + headerLinks: [ + {doc: 'installation', label: 'Docs'}, + {doc: 'diagram', label: 'Guides'}, + {href: 'https://github.com/mingrammer/diagrams', label: 'GitHub'}, + ], + + headerIcon: 'img/diagrams.ico', + footerIcon: 'img/diagrams.ico', + favicon: 'img/diagrams.ico', + + colors: { + primaryColor: '#5E73E5', + secondaryColor: '#5E89E5', + }, + + copyright: `Copyright © ${new Date().getFullYear()} mingrammer`, + + highlight: { + // Highlight.js theme to use for syntax highlighting in code blocks. + theme: 'default', + }, + + // Add custom scripts here that would be placed in