From 40ac0edc686b0ea52b8574ba112820d925c6d87b Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Mon, 13 Apr 2020 23:14:40 -0400 Subject: [PATCH 1/8] Verify Edge attributes exist before setting --- diagrams/__init__.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index 9626ea6d..e119a60a 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -436,10 +436,13 @@ class Edge: for k, v in self._default_edge_attrs.items(): self._attrs[k] = v - # Graphviz complaining about using label for edges, so replace it with xlabel. - self._attrs["xlabel"] = label - self._attrs["color"] = color - self._attrs["style"] = style + if label: + # Graphviz complaining about using label for edges, so replace it with xlabel. + self._attrs["xlabel"] = label + if color: + self._attrs["color"] = color + if style: + self._attrs["style"] = style self._attrs.update(attrs) def __sub__(self, other: Union["Node", "Edge", List["Node"]]): From bb98452009bf5074bae2ce351464ad56d2a64301 Mon Sep 17 00:00:00 2001 From: Nick Walters Date: Thu, 16 Apr 2020 09:37:14 -0500 Subject: [PATCH 2/8] Add AWS VPC Endpoint asset --- diagrams/aws/network.py | 4 ++++ docs/nodes/aws.md | 1 + resources/aws/network/endpoint.png | Bin 0 -> 5852 bytes 3 files changed, 5 insertions(+) create mode 100644 resources/aws/network/endpoint.png diff --git a/diagrams/aws/network.py b/diagrams/aws/network.py index b3963d45..efed7223 100644 --- a/diagrams/aws/network.py +++ b/diagrams/aws/network.py @@ -36,6 +36,10 @@ class ElasticLoadBalancing(_Network): _icon = "elastic-load-balancing.png" +class Endpoint(_Network): + _icon = "endpoint.png" + + class GlobalAccelerator(_Network): _icon = "global-accelerator.png" diff --git a/docs/nodes/aws.md b/docs/nodes/aws.md index 09f68841..80ef5e99 100644 --- a/docs/nodes/aws.md +++ b/docs/nodes/aws.md @@ -62,6 +62,7 @@ Node classes list of aws provider. - **diagrams.aws.network.Cloudfront**, **CF** (alias) - **diagrams.aws.network.DirectConnect** - **diagrams.aws.network.ElasticLoadBalancing**, **ELB** (alias) +- **diagrams.aws.network.Endpoint** - **diagrams.aws.network.GlobalAccelerator**, **GAX** (alias) - **diagrams.aws.network.InternetGateway** - **diagrams.aws.network.NATGateway** diff --git a/resources/aws/network/endpoint.png b/resources/aws/network/endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..2357ce4939cbeb7a6c8f8bf83de4a4eb587ac2db GIT binary patch literal 5852 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 Date: Thu, 16 Apr 2020 10:20:03 -0500 Subject: [PATCH 3/8] Add AWS VPC Router asset --- diagrams/aws/network.py | 4 ++++ docs/nodes/aws.md | 1 + resources/aws/network/vpc-router.png | Bin 0 -> 4862 bytes 3 files changed, 5 insertions(+) create mode 100644 resources/aws/network/vpc-router.png diff --git a/diagrams/aws/network.py b/diagrams/aws/network.py index b3963d45..21ac8bf1 100644 --- a/diagrams/aws/network.py +++ b/diagrams/aws/network.py @@ -68,6 +68,10 @@ class TransitGateway(_Network): _icon = "transit-gateway.png" +class VPCRouter(_Network): + _icon = "vpc-router.png" + + class VPC(_Network): _icon = "vpc.png" diff --git a/docs/nodes/aws.md b/docs/nodes/aws.md index 09f68841..061bb5ac 100644 --- a/docs/nodes/aws.md +++ b/docs/nodes/aws.md @@ -70,6 +70,7 @@ Node classes list of aws provider. - **diagrams.aws.network.Route53** - **diagrams.aws.network.SiteToSiteVpn** - **diagrams.aws.network.TransitGateway** +- **diagrams.aws.network.VPCRouter** - **diagrams.aws.network.VPC** ## aws.management diff --git a/resources/aws/network/vpc-router.png b/resources/aws/network/vpc-router.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ae6d1483a874b75c28d13bbb284c01bd422762 GIT binary patch literal 4862 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 literal 0 HcmV?d00001 From e7db1d2ebafe1ad9dedb47daad385745eb3fe52a Mon Sep 17 00:00:00 2001 From: Viktor Orda Date: Thu, 16 Apr 2020 21:14:58 +0300 Subject: [PATCH 4/8] Add teamcity to CI section --- config.py | 1 + diagrams/onprem/ci.py | 5 + docs/nodes/onprem.md | 155 ++++++++++++++++--------------- resources/onprem/ci/teamcity.png | Bin 0 -> 17112 bytes 4 files changed, 84 insertions(+), 77 deletions(-) create mode 100644 resources/onprem/ci/teamcity.png diff --git a/config.py b/config.py index 67562868..2f569131 100644 --- a/config.py +++ b/config.py @@ -72,6 +72,7 @@ ALIASES = { "ci": { "Circleci": "CircleCI", "Travisci": "TravisCI", + "Teamcity": "TC", }, "container": { "Rkt": "RKT", diff --git a/diagrams/onprem/ci.py b/diagrams/onprem/ci.py index 490fcd83..f6302b05 100644 --- a/diagrams/onprem/ci.py +++ b/diagrams/onprem/ci.py @@ -16,6 +16,10 @@ class Jenkins(_Ci): _icon = "jenkins.png" +class Teamcity(_Ci): + _icon = "teamcity.png" + + class Travisci(_Ci): _icon = "travisci.png" @@ -24,3 +28,4 @@ class Travisci(_Ci): CircleCI = Circleci TravisCI = Travisci +TC = Teamcity diff --git a/docs/nodes/onprem.md b/docs/nodes/onprem.md index e262d1e2..1458616c 100644 --- a/docs/nodes/onprem.md +++ b/docs/nodes/onprem.md @@ -5,6 +5,60 @@ title: OnPrem Node classes list of onprem provider. +## onprem.gitops + +- **diagrams.onprem.gitops.Argocd**, **ArgoCD** (alias) + +## onprem.analytics + +- **diagrams.onprem.analytics.Beam** +- **diagrams.onprem.analytics.Flink** +- **diagrams.onprem.analytics.Hadoop** +- **diagrams.onprem.analytics.Hive** +- **diagrams.onprem.analytics.Norikra** +- **diagrams.onprem.analytics.Spark** +- **diagrams.onprem.analytics.Storm** + +## onprem.security + +- **diagrams.onprem.security.Trivy** +- **diagrams.onprem.security.Vault** + +## onprem.monitoring + +- **diagrams.onprem.monitoring.Datadog** +- **diagrams.onprem.monitoring.Grafana** +- **diagrams.onprem.monitoring.Kibana** +- **diagrams.onprem.monitoring.Prometheus** +- **diagrams.onprem.monitoring.Splunk** + +## onprem.mlops + +- **diagrams.onprem.mlops.Polyaxon** + +## onprem.etl + +- **diagrams.onprem.etl.Embulk** + +## onprem.container + +- **diagrams.onprem.container.Docker** +- **diagrams.onprem.container.Rkt**, **RKT** (alias) + +## onprem.iac + +- **diagrams.onprem.iac.Terraform** + +## onprem.logging + +- **diagrams.onprem.logging.Fluentd** +- **diagrams.onprem.logging.Logstash**, **LogStash** (alias) + +## onprem.compute + +- **diagrams.onprem.compute.Nomad** +- **diagrams.onprem.compute.Server** + ## onprem.database - **diagrams.onprem.database.Cassandra** @@ -24,24 +78,12 @@ Node classes list of onprem provider. - **diagrams.onprem.database.Postgresql**, **PostgreSQL** (alias) - **diagrams.onprem.database.Scylla** -## onprem.security - -- **diagrams.onprem.security.Trivy** -- **diagrams.onprem.security.Vault** - -## onprem.ci - -- **diagrams.onprem.ci.Circleci**, **CircleCI** (alias) -- **diagrams.onprem.ci.Jenkins** -- **diagrams.onprem.ci.Travisci**, **TravisCI** (alias) - -## onprem.etl - -- **diagrams.onprem.etl.Embulk** - -## onprem.mlops +## onprem.workflow -- **diagrams.onprem.mlops.Polyaxon** +- **diagrams.onprem.workflow.Airflow** +- **diagrams.onprem.workflow.Digdag** +- **diagrams.onprem.workflow.Kubeflow**, **KubeFlow** (alias) +- **diagrams.onprem.workflow.Nifi**, **NiFi** (alias) ## onprem.network @@ -62,44 +104,12 @@ Node classes list of onprem provider. - **diagrams.onprem.network.Vyos**, **VyOS** (alias) - **diagrams.onprem.network.Zookeeper** -## onprem.inmemory - -- **diagrams.onprem.inmemory.Aerospike** -- **diagrams.onprem.inmemory.Hazelcast** -- **diagrams.onprem.inmemory.Memcached** -- **diagrams.onprem.inmemory.Redis** - -## onprem.search - -- **diagrams.onprem.search.Elasticsearch** -- **diagrams.onprem.search.Solr** - -## onprem.container - -- **diagrams.onprem.container.Docker** -- **diagrams.onprem.container.Rkt**, **RKT** (alias) - -## onprem.iac - -- **diagrams.onprem.iac.Terraform** - -## onprem.compute - -- **diagrams.onprem.compute.Nomad** -- **diagrams.onprem.compute.Server** - -## onprem.vcs - -- **diagrams.onprem.vcs.Git** -- **diagrams.onprem.vcs.Github** -- **diagrams.onprem.vcs.Gitlab** - -## onprem.workflow +## onprem.ci -- **diagrams.onprem.workflow.Airflow** -- **diagrams.onprem.workflow.Digdag** -- **diagrams.onprem.workflow.Kubeflow**, **KubeFlow** (alias) -- **diagrams.onprem.workflow.Nifi**, **NiFi** (alias) +- **diagrams.onprem.ci.Circleci**, **CircleCI** (alias) +- **diagrams.onprem.ci.Jenkins** +- **diagrams.onprem.ci.Teamcity**, **TC** (alias) +- **diagrams.onprem.ci.Travisci**, **TravisCI** (alias) ## onprem.queue @@ -113,35 +123,26 @@ Node classes list of onprem provider. - **diagrams.onprem.cd.Spinnaker** -## onprem.gitops +## onprem.search -- **diagrams.onprem.gitops.Argocd**, **ArgoCD** (alias) +- **diagrams.onprem.search.Elasticsearch** +- **diagrams.onprem.search.Solr** -## onprem.monitoring +## onprem.vcs -- **diagrams.onprem.monitoring.Datadog** -- **diagrams.onprem.monitoring.Grafana** -- **diagrams.onprem.monitoring.Kibana** -- **diagrams.onprem.monitoring.Prometheus** -- **diagrams.onprem.monitoring.Splunk** +- **diagrams.onprem.vcs.Git** +- **diagrams.onprem.vcs.Github** +- **diagrams.onprem.vcs.Gitlab** + +## onprem.inmemory + +- **diagrams.onprem.inmemory.Aerospike** +- **diagrams.onprem.inmemory.Hazelcast** +- **diagrams.onprem.inmemory.Memcached** +- **diagrams.onprem.inmemory.Redis** ## onprem.client - **diagrams.onprem.client.Client** - **diagrams.onprem.client.User** - **diagrams.onprem.client.Users** - -## onprem.logging - -- **diagrams.onprem.logging.Fluentd** -- **diagrams.onprem.logging.Logstash**, **LogStash** (alias) - -## onprem.analytics - -- **diagrams.onprem.analytics.Beam** -- **diagrams.onprem.analytics.Flink** -- **diagrams.onprem.analytics.Hadoop** -- **diagrams.onprem.analytics.Hive** -- **diagrams.onprem.analytics.Norikra** -- **diagrams.onprem.analytics.Spark** -- **diagrams.onprem.analytics.Storm** diff --git a/resources/onprem/ci/teamcity.png b/resources/onprem/ci/teamcity.png new file mode 100644 index 0000000000000000000000000000000000000000..54e922d19c4f84645a93b57c30763e2128bb12f2 GIT binary patch literal 17112 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 literal 0 HcmV?d00001 From d6bfd41da136249c057ebdaca4a013c19a51af25 Mon Sep 17 00:00:00 2001 From: Bobby DeSimone Date: Thu, 16 Apr 2020 13:33:11 -0700 Subject: [PATCH 5/8] add pomerium Signed-off-by: Bobby DeSimone --- diagrams/onprem/network.py | 4 ++++ docs/nodes/onprem.md | 1 + resources/onprem/network/pomerium.png | Bin 0 -> 25201 bytes 3 files changed, 5 insertions(+) create mode 100644 resources/onprem/network/pomerium.png diff --git a/diagrams/onprem/network.py b/diagrams/onprem/network.py index 05203fb6..82a61499 100644 --- a/diagrams/onprem/network.py +++ b/diagrams/onprem/network.py @@ -56,6 +56,10 @@ class Pfsense(_Network): _icon = "pfsense.png" +class Pomerium(_Network): + _icon = "pomerium.png" + + class Tomcat(_Network): _icon = "tomcat.png" diff --git a/docs/nodes/onprem.md b/docs/nodes/onprem.md index e262d1e2..11215ffb 100644 --- a/docs/nodes/onprem.md +++ b/docs/nodes/onprem.md @@ -57,6 +57,7 @@ Node classes list of onprem provider. - **diagrams.onprem.network.Linkerd** - **diagrams.onprem.network.Nginx** - **diagrams.onprem.network.Pfsense**, **PFSense** (alias) +- **diagrams.onprem.network.Pomerium** - **diagrams.onprem.network.Tomcat** - **diagrams.onprem.network.Traefik** - **diagrams.onprem.network.Vyos**, **VyOS** (alias) diff --git a/resources/onprem/network/pomerium.png b/resources/onprem/network/pomerium.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf2da5140d9ea62e5605936000c1fa72f2ce1f6 GIT binary patch literal 25201 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 literal 0 HcmV?d00001 From 5061d664de347245c301c8f9e2b5dfabf69b4c7b Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Sat, 18 Apr 2020 02:26:52 -0400 Subject: [PATCH 6/8] Replace MD5 Hash with UUID (#94) * Replace MD5 hash with UUID4 * Replace reference to hash with id/nodeid * Update missed hash reference to id --- diagrams/__init__.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index e119a60a..8d35ca4e 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -1,6 +1,6 @@ import contextvars import os -from hashlib import md5 +import uuid from pathlib import Path from random import getrandbits from typing import List, Union, Dict @@ -159,13 +159,13 @@ class Diagram: return True return False - def node(self, hashid: str, label: str, **attrs) -> None: + def node(self, nodeid: str, label: str, **attrs) -> None: """Create a new node.""" - self.dot.node(hashid, label=label, **attrs) + self.dot.node(nodeid, label=label, **attrs) def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None: """Connect the two Nodes.""" - self.dot.edge(node.hashid, node2.hashid, **edge.attrs) + self.dot.edge(node.nodeid, node2.nodeid, **edge.attrs) def subgraph(self, dot: Digraph) -> None: """Create a subgraph for clustering""" @@ -243,9 +243,9 @@ class Cluster: return True return False - def node(self, hashid: str, label: str, **attrs) -> None: + def node(self, nodeid: str, label: str, **attrs) -> None: """Create a new node in the cluster.""" - self.dot.node(hashid, label=label, **attrs) + self.dot.node(nodeid, label=label, **attrs) def subgraph(self, dot: Digraph) -> None: self.dot.subgraph(dot) @@ -267,8 +267,8 @@ class Node: :param label: Node label. """ - # Generates a hash for identifying a node. - self._hash = self._rand_hash() + # Generates an ID for identifying a node. + self._id = self._rand_id() self.label = label # fmt: off @@ -291,9 +291,9 @@ class Node: # If a node is in the cluster context, add it to cluster. if self._cluster: - self._cluster.node(self._hash, self.label, **self.attrs) + self._cluster.node(self._id, self.label, **self.attrs) else: - self._diagram.node(self._hash, self.label, **self.attrs) + self._diagram.node(self._id, self.label, **self.attrs) def __repr__(self): _name = self.__class__.__name__ @@ -366,8 +366,8 @@ class Node: return self @property - def hashid(self): - return self._hash + def nodeid(self): + return self._id # TODO: option for adding flow description to the connection edge def connect(self, node: "Node", edge: "Edge"): @@ -386,8 +386,8 @@ class Node: return node @staticmethod - def _rand_hash(): - return md5(getrandbits(64).to_bytes(64, "big")).hexdigest() + def _rand_id(): + return uuid.uuid4().hex def _load_icon(self): basedir = Path(os.path.abspath(os.path.dirname(__file__))) From 3d8ab9fc91bff68505a58f5913917755b8c3e911 Mon Sep 17 00:00:00 2001 From: mingrammer Date: Sat, 18 Apr 2020 15:56:12 +0900 Subject: [PATCH 7/8] chore: update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 7b1269c1..59f09cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,8 @@ website/build # node modules node_modules +# testing +main.py + # trash .DS_Store \ No newline at end of file From e8df702981e0fe7a3431e074644389131d71c9e4 Mon Sep 17 00:00:00 2001 From: Kevin Reynolds <31418536+kreynoldsf5@users.noreply.github.com> Date: Mon, 20 Apr 2020 07:31:10 -0400 Subject: [PATCH 8/8] Added Ansible and AWX PNGs. (#110) --- diagrams/onprem/iac.py | 8 ++ docs/nodes/onprem.md | 158 ++++++++++++++++--------------- resources/onprem/iac/ansible.png | Bin 0 -> 11434 bytes resources/onprem/iac/awx.png | Bin 0 -> 31884 bytes 4 files changed, 88 insertions(+), 78 deletions(-) create mode 100644 resources/onprem/iac/ansible.png create mode 100644 resources/onprem/iac/awx.png diff --git a/diagrams/onprem/iac.py b/diagrams/onprem/iac.py index 1fda1a1b..a2ae55d1 100644 --- a/diagrams/onprem/iac.py +++ b/diagrams/onprem/iac.py @@ -8,6 +8,14 @@ class _Iac(_OnPrem): _icon_dir = "resources/onprem/iac" +class Ansible(_Iac): + _icon = "ansible.png" + + +class Awx(_Iac): + _icon = "awx.png" + + class Terraform(_Iac): _icon = "terraform.png" diff --git a/docs/nodes/onprem.md b/docs/nodes/onprem.md index a1c95a2b..c73211c2 100644 --- a/docs/nodes/onprem.md +++ b/docs/nodes/onprem.md @@ -5,60 +5,6 @@ title: OnPrem Node classes list of onprem provider. -## onprem.gitops - -- **diagrams.onprem.gitops.Argocd**, **ArgoCD** (alias) - -## onprem.analytics - -- **diagrams.onprem.analytics.Beam** -- **diagrams.onprem.analytics.Flink** -- **diagrams.onprem.analytics.Hadoop** -- **diagrams.onprem.analytics.Hive** -- **diagrams.onprem.analytics.Norikra** -- **diagrams.onprem.analytics.Spark** -- **diagrams.onprem.analytics.Storm** - -## onprem.security - -- **diagrams.onprem.security.Trivy** -- **diagrams.onprem.security.Vault** - -## onprem.monitoring - -- **diagrams.onprem.monitoring.Datadog** -- **diagrams.onprem.monitoring.Grafana** -- **diagrams.onprem.monitoring.Kibana** -- **diagrams.onprem.monitoring.Prometheus** -- **diagrams.onprem.monitoring.Splunk** - -## onprem.mlops - -- **diagrams.onprem.mlops.Polyaxon** - -## onprem.etl - -- **diagrams.onprem.etl.Embulk** - -## onprem.container - -- **diagrams.onprem.container.Docker** -- **diagrams.onprem.container.Rkt**, **RKT** (alias) - -## onprem.iac - -- **diagrams.onprem.iac.Terraform** - -## onprem.logging - -- **diagrams.onprem.logging.Fluentd** -- **diagrams.onprem.logging.Logstash**, **LogStash** (alias) - -## onprem.compute - -- **diagrams.onprem.compute.Nomad** -- **diagrams.onprem.compute.Server** - ## onprem.database - **diagrams.onprem.database.Cassandra** @@ -78,12 +24,25 @@ Node classes list of onprem provider. - **diagrams.onprem.database.Postgresql**, **PostgreSQL** (alias) - **diagrams.onprem.database.Scylla** -## onprem.workflow +## onprem.security -- **diagrams.onprem.workflow.Airflow** -- **diagrams.onprem.workflow.Digdag** -- **diagrams.onprem.workflow.Kubeflow**, **KubeFlow** (alias) -- **diagrams.onprem.workflow.Nifi**, **NiFi** (alias) +- **diagrams.onprem.security.Trivy** +- **diagrams.onprem.security.Vault** + +## onprem.ci + +- **diagrams.onprem.ci.Circleci**, **CircleCI** (alias) +- **diagrams.onprem.ci.Jenkins** +- **diagrams.onprem.ci.Teamcity**, **TC** (alias) +- **diagrams.onprem.ci.Travisci**, **TravisCI** (alias) + +## onprem.etl + +- **diagrams.onprem.etl.Embulk** + +## onprem.mlops + +- **diagrams.onprem.mlops.Polyaxon** ## onprem.network @@ -105,12 +64,46 @@ Node classes list of onprem provider. - **diagrams.onprem.network.Vyos**, **VyOS** (alias) - **diagrams.onprem.network.Zookeeper** -## onprem.ci +## onprem.inmemory -- **diagrams.onprem.ci.Circleci**, **CircleCI** (alias) -- **diagrams.onprem.ci.Jenkins** -- **diagrams.onprem.ci.Teamcity**, **TC** (alias) -- **diagrams.onprem.ci.Travisci**, **TravisCI** (alias) +- **diagrams.onprem.inmemory.Aerospike** +- **diagrams.onprem.inmemory.Hazelcast** +- **diagrams.onprem.inmemory.Memcached** +- **diagrams.onprem.inmemory.Redis** + +## onprem.search + +- **diagrams.onprem.search.Elasticsearch** +- **diagrams.onprem.search.Solr** + +## onprem.container + +- **diagrams.onprem.container.Docker** +- **diagrams.onprem.container.Rkt**, **RKT** (alias) + +## onprem.iac + +- **diagrams.onprem.iac.Ansible** +- **diagrams.onprem.iac.Awx** +- **diagrams.onprem.iac.Terraform** + +## onprem.compute + +- **diagrams.onprem.compute.Nomad** +- **diagrams.onprem.compute.Server** + +## onprem.vcs + +- **diagrams.onprem.vcs.Git** +- **diagrams.onprem.vcs.Github** +- **diagrams.onprem.vcs.Gitlab** + +## onprem.workflow + +- **diagrams.onprem.workflow.Airflow** +- **diagrams.onprem.workflow.Digdag** +- **diagrams.onprem.workflow.Kubeflow**, **KubeFlow** (alias) +- **diagrams.onprem.workflow.Nifi**, **NiFi** (alias) ## onprem.queue @@ -124,26 +117,35 @@ Node classes list of onprem provider. - **diagrams.onprem.cd.Spinnaker** -## onprem.search - -- **diagrams.onprem.search.Elasticsearch** -- **diagrams.onprem.search.Solr** - -## onprem.vcs +## onprem.gitops -- **diagrams.onprem.vcs.Git** -- **diagrams.onprem.vcs.Github** -- **diagrams.onprem.vcs.Gitlab** +- **diagrams.onprem.gitops.Argocd**, **ArgoCD** (alias) -## onprem.inmemory +## onprem.monitoring -- **diagrams.onprem.inmemory.Aerospike** -- **diagrams.onprem.inmemory.Hazelcast** -- **diagrams.onprem.inmemory.Memcached** -- **diagrams.onprem.inmemory.Redis** +- **diagrams.onprem.monitoring.Datadog** +- **diagrams.onprem.monitoring.Grafana** +- **diagrams.onprem.monitoring.Kibana** +- **diagrams.onprem.monitoring.Prometheus** +- **diagrams.onprem.monitoring.Splunk** ## onprem.client - **diagrams.onprem.client.Client** - **diagrams.onprem.client.User** - **diagrams.onprem.client.Users** + +## onprem.logging + +- **diagrams.onprem.logging.Fluentd** +- **diagrams.onprem.logging.Logstash**, **LogStash** (alias) + +## onprem.analytics + +- **diagrams.onprem.analytics.Beam** +- **diagrams.onprem.analytics.Flink** +- **diagrams.onprem.analytics.Hadoop** +- **diagrams.onprem.analytics.Hive** +- **diagrams.onprem.analytics.Norikra** +- **diagrams.onprem.analytics.Spark** +- **diagrams.onprem.analytics.Storm** diff --git a/resources/onprem/iac/ansible.png b/resources/onprem/iac/ansible.png new file mode 100644 index 0000000000000000000000000000000000000000..39d77aa640441dccb6f4c7e05ee6c0018c7393ac GIT binary patch literal 11434 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 W*Tph#c;X~+f{up1dcK-%@c#fkT8{Vt literal 0 HcmV?d00001