summaryrefslogtreecommitdiffstats
path: root/overview.py
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2013-05-10 16:27:43 +0200
committerJan Pokorný <jpokorny@redhat.com>2013-05-10 16:27:43 +0200
commit7fb68c6e8614164cbc9b6eaa86a927ca8a2ded51 (patch)
treea8ecd3c2b47afa3960127ef82a740d7f2b82b51a /overview.py
parent89c0111b5bf1b03854b345664586884a89488daa (diff)
downloadcluster-overview-7fb68c6e8614164cbc9b6eaa86a927ca8a2ded51.tar.gz
cluster-overview-7fb68c6e8614164cbc9b6eaa86a927ca8a2ded51.tar.xz
cluster-overview-7fb68c6e8614164cbc9b6eaa86a927ca8a2ded51.zip
Big refactoring towards more concise+flexible notation
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'overview.py')
-rwxr-xr-xoverview.py432
1 files changed, 134 insertions, 298 deletions
diff --git a/overview.py b/overview.py
index 18703f7..70f20f3 100755
--- a/overview.py
+++ b/overview.py
@@ -16,9 +16,9 @@ conveniently using XDot: http://code.google.com/p/jrfonseca/wiki/XDot
"""
# TODO: integrate ^^^? http://code.google.com/p/jrfonseca/wiki/XDot#Embedding
-from pydot import Dot, Edge, Node, Subgraph
from sys import argv
from os.path import extsep, splitext
+from lib import *
FONT = 'Inconsolata'
@@ -26,302 +26,138 @@ FONTDEF = map(lambda switch: '-' + switch + 'fontname=' + FONT, "GNE")
OUTPUT = splitext(__file__)[0]
-#
-# Subgraph inheritance
-#
-
-
-class GraphNode(Subgraph):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('style', 'bold')
- super(GraphNode, self).__init__(*args, **kwargs)
-
-
-class GraphSubnode(Subgraph):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('fillcolor', 'azure')
- kwargs.setdefault('style', 'filled')
- super(GraphSubnode, self).__init__(*args, **kwargs)
-
-
-#
-# Node inheritance
-#
-
-
-class Program(Node):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('shape', 'box')
- super(Program, self).__init__(*args, **kwargs)
-
-
-class Agent(Program):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('fillcolor', 'lavenderblush')
- kwargs.setdefault('style', 'filled')
- super(Agent, self).__init__(*args, **kwargs)
-
-
-class Executable(Program):
- pass
-
-
-class Daemon(Executable):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('fillcolor', 'cornsilk')
- kwargs.setdefault('style', 'filled')
- super(Daemon, self).__init__(*args, **kwargs)
-
-
-class Artefact(Node):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('shape', 'box3d')
- kwargs.setdefault('fillcolor', 'wheat')
- kwargs.setdefault('style', 'filled')
- super(Artefact, self).__init__(*args, **kwargs)
-
-
-#
-# Edge inheritance
-#
-
-
-class DBUS(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('style', 'dotted')
- super(DBUS, self).__init__(*args, **kwargs)
-
-
-class OddjobExec(DBUS):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('label', 'oddjob exec')
- super(OddjobExec, self).__init__(*args, **kwargs)
-
-
-class HTTPS(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('style', 'bold')
- super(HTTPS, self).__init__(*args, **kwargs)
-
-
-class LuciHTTPS(HTTPS):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('label', 'port 8084')
- super(LuciHTTPS, self).__init__(*args, **kwargs)
-
-
-class ApplicationSpecificProtocol(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('style', 'dashed')
- super(ApplicationSpecificProtocol, self).__init__(*args, **kwargs)
-
-
-class RICCIRPC(ApplicationSpecificProtocol):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('label', 'port 11111')
- super(RICCIRPC, self).__init__(*args, **kwargs)
-
-
-class SNMP(ApplicationSpecificProtocol):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('label', 'port 161')
- super(SNMP, self).__init__(*args, **kwargs)
-
-
-class CIM(ApplicationSpecificProtocol):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('label', 'port 898[89]')
- super(CIM, self).__init__(*args, **kwargs)
-
-
-class Consume(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('color', 'darkgreen')
- kwargs.setdefault('fontcolor', 'darkgreen')
- super(Consume, self).__init__(*args, **kwargs)
-
-
-class ConsumeReversed(Consume):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('dir', 'back')
- super(ConsumeReversed, self).__init__(*reversed(args), **kwargs)
-
-
-class Produce(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('color', 'orangered')
- kwargs.setdefault('fontcolor', 'orangered')
- super(Produce, self).__init__(*args, **kwargs)
-
-
-class Delegate(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('color', 'navy')
- kwargs.setdefault('fontcolor', 'navy')
- kwargs.setdefault('dir', 'both')
- super(Delegate, self).__init__(*args, **kwargs)
-
-
-# peer-to-peer
-class Exchange(Edge):
- def __init__(self, *args, **kwargs):
- kwargs.setdefault('color', 'saddlebrown')
- kwargs.setdefault('fontcolor', 'saddlebrown')
- kwargs.setdefault('dir', 'both')
- super(Exchange, self).__init__(*args, **kwargs)
-
-
-# mixing
-
-class DelegateOddjobExec(Delegate, OddjobExec):
- pass
-
-
-class DelegateRICCIRPC(Delegate, RICCIRPC):
- pass
-
-
-class DelegateLuciHTTPS(Delegate, LuciHTTPS):
- pass
-
-
-class DelegateSNMP(Delegate, SNMP):
- pass
-
-
-class DelegateCIM(Delegate, CIM):
- pass
-
-
-#
-# Here we go
-#
-
-
-# management client
-
-node_mgmt = Subgraph('cluster-climgmt', label='management client')
-
-node_mgmt.add_node(Program('luci'))
-node_mgmt.add_node(Program('ccs'))
-
-
-# other monitoring
-
-node_mon = Subgraph('cluster-monitor', label='other monitoring')
-
-node_mon.add_node(Program('snmpwalk'))
-node_mon.add_node(Program('wbemcli'))
-
-
-# node b - management
-
-node_b_conga = GraphSubnode('cluster-node_b-conga', label='management')
-
-node_b_conga.add_node(Agent('node_b-libClusterMonitorSnmp.so', label='libClusterMonitorSnmp.so'))
-node_b_conga.add_node(Agent('node_b-libRedHatClusterProvider.so', label='libRedHatClusterProvider.so'))
-node_b_conga.add_node(Artefact('node_b-clumond.sock', label='/var/run/clumond.sock'))
-node_b_conga.add_node(Daemon('node_b-ricci', label='ricci'))
-node_b_conga.add_node(Daemon('node_b-modclusterd', label='modclusterd'))
-node_b_conga.add_node(Program('node_b-modcluster', label='modcluster'))
-
-node_b_conga.add_edge(Consume('node_b-libClusterMonitorSnmp.so', 'node_b-clumond.sock'))
-node_b_conga.add_edge(Consume('node_b-libRedHatClusterProvider.so', 'node_b-clumond.sock'))
-node_b_conga.add_edge(Consume('node_b-modcluster', 'node_b-clumond.sock'))
-node_b_conga.add_edge(Produce('node_b-modclusterd', 'node_b-clumond.sock'))
-
-
-# node b - core
-
-node_b_core = GraphSubnode('cluster-node_b-core', label='core')
-
-node_b_core.add_node(Node('node_b-libccsconfdb', label='libccsconfdb'))
-node_b_core.add_node(Daemon('node_b-rgmanager', label='rgmanager'))
-node_b_core.add_node(Program('node_b-clustat', label='clustat'))
-node_b_core.add_node(Artefact('node_b-rgmanager.sk', label='/var/run/cluster/rgmanager.sk'))
-
-node_b_core.add_edge(Consume('node_b-clustat', 'node_b-rgmanager.sk'))
-node_b_core.add_edge(Consume('node_b-rgmanager', 'node_b-libccsconfdb'))
-node_b_core.add_edge(Produce('node_b-rgmanager', 'node_b-rgmanager.sk'))
-
-
-# node b - general
-
-node_b = GraphNode('cluster-node_b', label='NODE B')
-node_b.add_subgraph(node_b_conga)
-node_b.add_subgraph(node_b_core)
-
-node_b.add_node(Artefact('node_b-cluster.conf', label='/etc/cluster/cluster.conf'))
-node_b.add_node(Daemon('node_b-snmpd', label='snmpd'))
-node_b.add_node(Daemon('node_b-cimserver', label='cimserver'))
-
-node_b.add_edge(Consume('node_b-modcluster', 'node_b-cluster.conf', label='version?'))
-node_b.add_edge(Consume('node_b-modclusterd', 'node_b-cluster.conf', label='version?'))
-node_b.add_edge(Consume('node_b-libccsconfdb', 'node_b-cluster.conf', label='version?'))
-node_b.add_edge(Consume('node_b-ricci', 'node_b-cluster.conf', label='clustername\nclusteralias'))
-node_b.add_edge(Consume('node_b-snmpd', 'node_b-libClusterMonitorSnmp.so'))
-node_b.add_edge(Consume('node_b-cimserver', 'node_b-libRedHatClusterProvider.so'))
-node_b.add_edge(DelegateOddjobExec('node_b-ricci', 'node_b-modcluster'))
-
-
-# node a - management
-
-node_a_conga = GraphSubnode('cluster-node_a-conga', label='management (incomplete)')
-
-node_a_conga.add_node(Daemon('node_a-ricci', label='ricci'))
-node_a_conga.add_node(Daemon('node_a-modclusterd', label='modclusterd'))
-
-
-# node a - general
-
-node_a = GraphNode('cluster-node_a', label='NODE A')
-node_a.add_subgraph(node_a_conga)
-
-
-# node c - management
-
-node_c_conga = GraphSubnode('cluster-node_c-conga', label='management (incomplete)')
-
-node_c_conga.add_node(Daemon('node_c-ricci', label='ricci'))
-node_c_conga.add_node(Daemon('node_c-modclusterd', label='modclusterd'))
-
-
-# node c - general
-
-node_c = GraphNode('cluster-node_c', label='NODE C')
-node_c.add_subgraph(node_c_conga)
-
-
-# nodes
-
-nodes = Subgraph('cluster-nodes', style='invis')
-nodes.add_subgraph(node_b)
-nodes.add_subgraph(node_c)
-nodes.add_subgraph(node_a)
-
-
-# global environment
-
-graph = Dot('Cluster.conf-related tools', graph_type='digraph', overlap='scalexy', compound='true', splines='yes') # , ranksep='1.2'
-graph.add_subgraph(node_mgmt)
-graph.add_subgraph(node_mon)
-#graph.add_subgraph(node_a)
-#graph.add_subgraph(node_b)
-graph.add_subgraph(nodes)
-
-graph.add_node(Program('firefox'))
-
-graph.add_edge(DelegateRICCIRPC('luci', 'node_a-ricci', ltail='cluster-climgmt', constraint='false'))
-graph.add_edge(DelegateRICCIRPC('luci', 'node_b-ricci', ltail='cluster-climgmt'))
-graph.add_edge(DelegateRICCIRPC('luci', 'node_c-ricci', ltail='cluster-climgmt', constraint='false'))
-graph.add_edge(DelegateLuciHTTPS('firefox', 'luci'))
-
-graph.add_edge(DelegateSNMP('snmpwalk', 'node_b-snmpd'))
-graph.add_edge(DelegateCIM('wbemcli', 'node_b-cimserver'))
-
-graph.add_edge(Exchange('node_a-modclusterd', 'node_b-modclusterd', label='port 16851 (either direction)', constraint='false'))
-graph.add_edge(Exchange('node_a-modclusterd', 'node_c-modclusterd', label='port 16851 (either direction)', constraint='false'))
-graph.add_edge(Exchange('node_b-modclusterd', 'node_c-modclusterd', label='port 16851 (either direction)', constraint='false'))
+graph = lambda BLACKLIST=(): \
+LibDot('Cluster.conf-related tools',
+ overlap='scalexy',
+ compound='true',
+ splines='yes',
+ # , ranksep='1.2',
+ _subgraphs=[
+ # management client
+ LibSubgraph('cluster-climgmt',
+ label='management client',
+ _nodes=[
+ Program('luci'),
+ Program('ccs'),
+ ]
+ ),
+ # other monitoring
+ LibSubgraph('cluster-monitor',
+ label='other monitoring',
+ _nodes=[
+ Program('snmpwalk'),
+ Program('wbemcli'),
+ ]
+ ),
+ # nodes
+ LibSubgraph('cluster-nodes',
+ style='invis',
+ _subgraphs=[
+ # node a
+ GraphNode('cluster-node_a',
+ label='NODE A',
+ _subgraphs=[
+ # node a - management
+ GraphSubnode('cluster-node_a-conga',
+ label='management (incomplete)',
+ _nodes=[
+ Daemon('node_a-ricci',
+ label='ricci'),
+ Daemon('node_a-modclusterd',
+ label='modclusterd'),
+ ]
+ )
+ ]
+ ),
+ # node b
+ GraphNode('cluster-node_b',
+ label='NODE B',
+ _subgraphs=[
+ # node b - management
+ GraphSubnode('cluster-node_b-conga',
+ label='management',
+ _nodes=[
+ Agent('node_b-libClusterMonitorSnmp.so', label='libClusterMonitorSnmp.so'),
+ Agent('node_b-libRedHatClusterProvider.so', label='libRedHatClusterProvider.so'),
+ Artefact('node_b-clumond.sock', label='/var/run/clumond.sock'),
+ Daemon('node_b-ricci', label='ricci'),
+ Daemon('node_b-modclusterd', label='modclusterd'),
+ Program('node_b-modcluster', label='modcluster'),
+ ],
+ _edges=[
+ Consume('node_b-libClusterMonitorSnmp.so', 'node_b-clumond.sock'),
+ Consume('node_b-libRedHatClusterProvider.so', 'node_b-clumond.sock'),
+ Consume('node_b-modcluster', 'node_b-clumond.sock'),
+ Produce('node_b-modclusterd', 'node_b-clumond.sock'),
+ ]
+ ),
+ # node b - core
+ GraphSubnode('cluster-node_b-core',
+ label='core',
+ _nodes=[
+ LibNode('node_b-libccsconfdb', label='libccsconfdb'),
+ Daemon('node_b-rgmanager', label='rgmanager'),
+ Program('node_b-clustat', label='clustat'),
+ Artefact('node_b-rgmanager.sk', label='/var/run/cluster/rgmanager.sk'),
+ ],
+ _edges=[
+ Consume('node_b-clustat', 'node_b-rgmanager.sk'),
+ Consume('node_b-rgmanager', 'node_b-libccsconfdb'),
+ Produce('node_b-rgmanager', 'node_b-rgmanager.sk'),
+ ]
+ )
+ ],
+ _nodes=[
+ Artefact('node_b-cluster.conf', label='/etc/cluster/cluster.conf'),
+ Daemon('node_b-snmpd', label='snmpd'),
+ Daemon('node_b-cimserver', label='cimserver'),
+ ],
+ _edges=[
+ Consume('node_b-modcluster', 'node_b-cluster.conf', label='version?'),
+ Consume('node_b-modclusterd', 'node_b-cluster.conf', label='version?'),
+ Consume('node_b-libccsconfdb', 'node_b-cluster.conf', label='version?'),
+ Consume('node_b-ricci', 'node_b-cluster.conf', label='clustername\nclusteralias'),
+ Consume('node_b-snmpd', 'node_b-libClusterMonitorSnmp.so'),
+ Consume('node_b-cimserver', 'node_b-libRedHatClusterProvider.so'),
+ DelegateOddjobExec('node_b-ricci', 'node_b-modcluster'),
+ ]
+ ),
+ # node c - general
+ GraphNode('cluster-node_c',
+ label='NODE C',
+ _subgraphs=[
+ # node c - management
+ GraphSubnode('cluster-node_c-conga',
+ label='management (incomplete)',
+ _nodes=[
+ Daemon('node_c-ricci',
+ label='ricci'),
+ Daemon('node_c-modclusterd',
+ label='modclusterd')
+ ]
+ )
+ ]
+ )
+ ]
+ ),
+ ],
+ _nodes=[
+ Program('firefox')
+ ],
+ _edges=[
+ DelegateRICCIRPC('luci', 'node_a-ricci', ltail='cluster-climgmt', constraint='false'),
+ DelegateRICCIRPC('luci', 'node_b-ricci', ltail='cluster-climgmt'),
+ DelegateRICCIRPC('luci', 'node_c-ricci', ltail='cluster-climgmt', constraint='false'),
+ DelegateLuciHTTPS('firefox', 'luci'),
+
+ DelegateSNMP('snmpwalk', 'node_b-snmpd'),
+ DelegateCIM('wbemcli', 'node_b-cimserver'),
+
+ Exchange('node_a-modclusterd', 'node_b-modclusterd', label='port 16851 (either direction)', constraint='false'),
+ Exchange('node_a-modclusterd', 'node_c-modclusterd', label='port 16851 (either direction)', constraint='false'),
+ Exchange('node_b-modclusterd', 'node_c-modclusterd', label='port 16851 (either direction)', constraint='false'),
+ ]
+)
###
@@ -330,4 +166,4 @@ graph.add_edge(Exchange('node_b-modclusterd', 'node_c-modclusterd', label='port
if __name__ == '__main__':
ext = argv[1] if len(argv) > 1 else 'pdf'
fmt = {'dot': 'raw'}.get(ext, ext)
- graph.write(OUTPUT + extsep + ext, format=fmt, prog=['dot'] + FONTDEF)
+ graph((DBUS)).write(OUTPUT + extsep + ext, format=fmt, prog=['dot'] + FONTDEF)