digraph "ganeti-2.0-architecture" {
  compound=false
  concentrate=true
  mclimit=100.0
  nslimit=100.0
  edge[fontsize="8" fontname="Helvetica-Oblique"]
  node[width="0" height="0" fontsize="12" fontcolor="black" shape=rect]

  subgraph outside {
    rclient[label="external clients"]
    label="Outside the cluster"
  }

  subgraph cluster_inside {
    label="ganeti cluster"
    labeljust=l
    subgraph cluster_master_node {
      label="master node"
      rapi[label="RAPI daemon"]
      cli[label="CLI"]
      watcher[label="Watcher"]
      burnin[label="Burnin"]
      masterd[shape=record style=filled label="{ <luxi> luxi endpoint | master I/O thread | job queue | {<w1> worker| <w2> worker | <w3> worker }}"]
      {rapi;cli;watcher;burnin} -> masterd:luxi [label="LUXI" labelpos=100]
    }

    subgraph cluster_nodes {
        label="nodes"
        noded1 [shape=record label="{ RPC listener | Disk management | Network management | Hypervisor } "]
        noded2 [shape=record label="{ RPC listener | Disk management | Network management | Hypervisor } "]
        noded3 [shape=record label="{ RPC listener | Disk management | Network management | Hypervisor } "]
    }
    masterd:w2 -> {noded1;noded2;noded3} [label="node RPC"]
    cli -> {noded1;noded2;noded3} [label="SSH"]
  }

  rclient -> rapi [label="RAPI protocol"]
}