digraph "CloudKitty's Architecture" { // Graph parameters label="CloudKitty's Internal Architecture"; node [shape=box]; compound=true; // API api [label="API"]; // Orchestrator subgraph cluster_3 { label="Orchestrator"; node[shape=none, width=1.3, height=0, label=""]; {rank=same; o1 -> o2 -> o3 [style=invis];} } // Collector ceilometer [label="Ceilometer"]; vendor [label="Vendor specific", style=dotted]; subgraph cluster_0 { label="Collector"; style=dashed; ceilometer -> vendor [style=invis]; } // Rating hashmap [label="HashMap module"]; r_others [label="Other modules...", style=dotted]; subgraph cluster_1 { label="Rating engines"; style=dashed; hashmap -> r_others [style=invis]; } // Write Orchestrator w_orchestrator [label="Write Orchestrator"]; tdb [label="Transient DB"]; //Writers osrf [label="OpenStack\nReference Format\n(json)"]; w_others [label="Other modules...", style=dotted]; subgraph cluster_2 { label="Writers"; style=dashed; osrf -> w_others [style=invis]; } // Relations api -> hashmap; api -> r_others; o1 -> ceilometer [dir=both, ltail=cluster_3, lhead=cluster_0]; o2 -> hashmap [dir=both, ltail=cluster_3, lhead=cluster_1]; o3 -> w_orchestrator [ltail=cluster_3]; w_orchestrator -> osrf [constraint=false]; w_orchestrator -> w_others [style=dotted, constraint=false]; w_orchestrator -> tdb; }