From d6f73ec1c3bc8c771215d4b4d49a6038b4644415 Mon Sep 17 00:00:00 2001 From: Dan Aharon-Shalom Date: Thu, 24 Dec 2020 08:33:14 +0200 Subject: [PATCH] Azure base clusters --- diagrams/azure/cluster.py | 143 ++++++++++++++++++++++++++++++++++++++++++++++ examples/azure.png | Bin 0 -> 52059 bytes examples/azure.py | 24 ++++++++ 3 files changed, 167 insertions(+) create mode 100644 diagrams/azure/cluster.py create mode 100644 examples/azure.png create mode 100644 examples/azure.py diff --git a/diagrams/azure/cluster.py b/diagrams/azure/cluster.py new file mode 100644 index 0000000..73bfcda --- /dev/null +++ b/diagrams/azure/cluster.py @@ -0,0 +1,143 @@ +from diagrams import Cluster +from diagrams.azure.compute import VM, VMWindows, VMLinux #, VMScaleSet # Depends on PR-404 +from diagrams.azure.network import VirtualNetworks, Subnets, NetworkSecurityGroupsClassic + +class Subscription(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "dotted", + "labeljust": "l", + "pencolor": "#AEB6BE", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + +class Region(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "dotted", + "labeljust": "l", + "pencolor": "#AEB6BE", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + +class AvailabilityZone(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "dashed", + "labeljust": "l", + "pencolor": "#27a0ff", + "fontname": "sans-serif", + "fontsize": "12", + } + # fmt: on + +class VirtualNetwork(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#00D110", + "fontname": "sans-serif", + "fontsize": "12", + } + # fmt: on + _icon = VirtualNetworks + +class SubnetWithNSG(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#329CFF", + "fontname": "sans-serif", + "fontsize": "12", + } + # fmt: on + _icon = NetworkSecurityGroupsClassic + +class Subnet(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#00D110", + "fontname": "sans-serif", + "fontsize": "12", + } + # fmt: on + _icon = Subnets + +class SecurityGroup(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "dashed", + "labeljust": "l", + "pencolor": "#FF361E", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + +class VMContents(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#FFB432", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + _icon = VM + +class VMLinuxContents(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#FFB432", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + _icon = VMLinux + +class VMWindowsContents(Cluster): + # fmt: off + _default_graph_attrs = { + "shape": "box", + "style": "", + "labeljust": "l", + "pencolor": "#FFB432", + "fontname": "Sans-Serif", + "fontsize": "12", + } + # fmt: on + _icon = VMWindows + +# Depends on PR-404 +# class VMSS(Cluster): +# # fmt: off +# _default_graph_attrs = { +# "shape": "box", +# "style": "dashed", +# "labeljust": "l", +# "pencolor": "#FF7D1E", +# "fontname": "Sans-Serif", +# "fontsize": "12", +# } +# # fmt: on +# _icon = VMScaleSet diff --git a/examples/azure.png b/examples/azure.png new file mode 100644 index 0000000000000000000000000000000000000000..04af158c1380ba1d9d4de4950bb998f1b40d7c2d GIT binary patch literal 52059 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 literal 0 HcmV?d00001 diff --git a/examples/azure.py b/examples/azure.py new file mode 100644 index 0000000..e094887 --- /dev/null +++ b/examples/azure.py @@ -0,0 +1,24 @@ +from diagrams import Diagram, Edge +from diagrams.azure.cluster import * +from diagrams.azure.compute import VM +from diagrams.onprem.container import Docker +from diagrams.onprem.cluster import * +from diagrams.azure.network import LoadBalancers + +with Diagram(name="", filename="azure", direction="TB", show=True): + with Cluster("Azure"): + with Region("East US2"): + with AvailabilityZone("Zone 2"): + with VirtualNetwork(""): + with SubnetWithNSG("Private"): + # with VMScaleSet(""): # Depends on PR-404 + with VMContents("A"): + d1 = Docker("Container") + with ServerContents("A1"): + d2 = Docker("Container") + + with Subnet("Public"): + lb = LoadBalancers() + + lb >> Edge(forward=True, reverse=True) >> d1 + lb >> Edge(forward=True, reverse=True) >> d2