|
|
|
@ -73,12 +73,13 @@ var Docker = function() { |
|
|
|
|
|
|
|
|
|
var _containers = this; |
|
|
|
|
|
|
|
|
|
var Status = Object.freeze({ |
|
|
|
|
this.Status = Object.freeze({ |
|
|
|
|
Error: {color: "red", action1: "start", action2: "remove", bash: false}, |
|
|
|
|
Terminated: {color: "yellow", action1: "start", action2: "remove", bash: false}, |
|
|
|
|
Restarting: {color: "lightblue", action1: "start", action2: "remove", bash: false}, |
|
|
|
|
Paused: {color: "lightgrey", action1: "unpause", action2: null, bash: false}, |
|
|
|
|
Running: {color: "lightgreen", action1: "pause", action2: "stop", bash: true} |
|
|
|
|
Paused: {color: "grey", action1: "unpause", action2: null, bash: false}, |
|
|
|
|
Running: {color: "lightgreen", action1: "pause", action2: "stop", bash: true}, |
|
|
|
|
Preview: {color: "lightgrey"} |
|
|
|
|
}); |
|
|
|
|
var containers = []; |
|
|
|
|
var nodes = []; |
|
|
|
@ -93,7 +94,7 @@ var Docker = function() { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
function getIps(n, ips) { |
|
|
|
|
n.ports.forEach(function(p) { |
|
|
|
|
if (n.ports) n.ports.forEach(function(p) { |
|
|
|
|
if (!ips[p.ip]) ips[p.ip] = []; |
|
|
|
|
ips[p.ip].push(p); |
|
|
|
|
}); |
|
|
|
@ -119,32 +120,33 @@ var Docker = function() { |
|
|
|
|
res+="}\n"; |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
function graphNode(n) { |
|
|
|
|
function graphNode(n, omitstats) { |
|
|
|
|
var res = ""; |
|
|
|
|
var label = n.image.name+'\\n'+n.name+'\\ncpu: ????? mem: ?????'; |
|
|
|
|
var label = n.image.name+'\\n'+n.name |
|
|
|
|
+(omitstats?'':'\\ncpu: ????? mem: ?????'); |
|
|
|
|
res += '"'+n.name+'"' |
|
|
|
|
+' [label="'+label |
|
|
|
|
+'",URL="#'+n.name |
|
|
|
|
+'",style=filled,fillcolor='+n.status.color+"];\n"; |
|
|
|
|
n.ports.forEach(function(p) { |
|
|
|
|
if (n.ports) n.ports.forEach(function(p) { |
|
|
|
|
res += '"'+(p.ip?p.ip+":":"")+p.external+'" -> "'+n.name |
|
|
|
|
+'" [label="'+p.internal+'"];\n'; |
|
|
|
|
}); |
|
|
|
|
n.links.forEach(function(l) { |
|
|
|
|
if (n.links) n.links.forEach(function(l) { |
|
|
|
|
res += '"'+n.name+'" -> "'+l.container+'" [label="link: '+l.name+'"];\n' |
|
|
|
|
}); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
function graphVolumesInside(n) { |
|
|
|
|
var res = ""; |
|
|
|
|
n.volumes.forEach(function(v) { |
|
|
|
|
if (n.volumes) n.volumes.forEach(function(v) { |
|
|
|
|
res += '"'+v.id+'" [label="'+v.inside+'",shape=box];\n'; |
|
|
|
|
}); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
function graphVolumesOutside(n) { |
|
|
|
|
var res = ""; |
|
|
|
|
n.volumes.forEach(function(v) { |
|
|
|
|
if (n.volumes) n.volumes.forEach(function(v) { |
|
|
|
|
if (v.host) |
|
|
|
|
res += '"'+v.outside+'" [label="'+v.host+'",shape=box];\n'; |
|
|
|
|
}); |
|
|
|
@ -152,23 +154,23 @@ var Docker = function() { |
|
|
|
|
} |
|
|
|
|
function graphVolumesConnections(n) { |
|
|
|
|
var res = ""; |
|
|
|
|
n.volumes.forEach(function(v) { |
|
|
|
|
if (n.volumes) n.volumes.forEach(function(v) { |
|
|
|
|
if (v.host) |
|
|
|
|
res += '"'+v.id+'" -> "'+v.outside+'" [label="mounted from"]\n'; |
|
|
|
|
res += '"'+n.name+'" -> "'+v.id+'" [label="volume/'+v.rw+'"]\n'; |
|
|
|
|
}); |
|
|
|
|
n.volumesfrom.forEach(function(o) { |
|
|
|
|
if (n.volumesfrom) n.volumesfrom.forEach(function(o) { |
|
|
|
|
res += '"'+n.name+'" -> "'+nodes[o].name+'" [label="volumes from"]\n'; |
|
|
|
|
}); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
this.graph = function(n) { |
|
|
|
|
this.graph = function(n, omitstats) { |
|
|
|
|
var res = ""; |
|
|
|
|
var ips = []; |
|
|
|
|
n = n || nodes; |
|
|
|
|
for (name in n) getIps(n[name], ips); |
|
|
|
|
res += graphIpClusters(ips); |
|
|
|
|
for (name in n) res += graphNode(n[name]); |
|
|
|
|
for (name in n) res += graphNode(n[name], omitstats); |
|
|
|
|
res += "{rank=same;\n"; |
|
|
|
|
for (name in n) res += graphVolumesInside(n[name]); |
|
|
|
|
res+="}\n"; |
|
|
|
@ -179,28 +181,28 @@ var Docker = function() { |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
function addNodes(ns, name) { |
|
|
|
|
var n = nodes[name]; |
|
|
|
|
var n = nodes[name] || ns[name]; |
|
|
|
|
ns[name] = n; |
|
|
|
|
n.links.forEach(function(peer) { |
|
|
|
|
if (n.links) n.links.forEach(function(peer) { |
|
|
|
|
if (!ns[peer.container]) addNodes(ns, peer.container); |
|
|
|
|
}); |
|
|
|
|
n.usedby.forEach(function(peer) { |
|
|
|
|
if (n.usedby) n.usedby.forEach(function(peer) { |
|
|
|
|
if (!ns[peer]) addNodes(ns, peer); |
|
|
|
|
}); |
|
|
|
|
n.volumesfrom.forEach(function(peer) { |
|
|
|
|
if (n.volumesfrom) n.volumesfrom.forEach(function(peer) { |
|
|
|
|
if (!ns[peer]) addNodes(ns, peer); |
|
|
|
|
}); |
|
|
|
|
n.volumesto.forEach(function(peer) { |
|
|
|
|
if (n.volumesto) n.volumesto.forEach(function(peer) { |
|
|
|
|
if (!ns[peer]) addNodes(ns, peer); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
this.subnet = function(name) { |
|
|
|
|
var ns = {}; |
|
|
|
|
this.subnet = function(name, nodes) { |
|
|
|
|
var ns = nodes || {}; |
|
|
|
|
addNodes(ns, name); |
|
|
|
|
return ns; |
|
|
|
|
} |
|
|
|
|
this.subgraph = function(name) { |
|
|
|
|
return this.graph(this.subnet(name)); |
|
|
|
|
this.subgraph = function(name, nodes) { |
|
|
|
|
return this.graph(this.subnet(name, nodes), nodes); |
|
|
|
|
} |
|
|
|
|
this.configuration = function(name) { |
|
|
|
|
var ns = this.subnet(name); |
|
|
|
@ -303,11 +305,11 @@ var Docker = function() { |
|
|
|
|
ip: ip |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
if (c.State.Paused) nodes[name].status = Status.Paused; |
|
|
|
|
else if (c.State.Running) nodes[name].status = Status.Running; |
|
|
|
|
else if (c.State.Restarting) nodes[name].status = Status.Restarting; |
|
|
|
|
else if (c.State.ExitCode == 0) nodes[name].status = Status.Terminated; |
|
|
|
|
else nodes[name].status = Status.Error; |
|
|
|
|
if (c.State.Paused) nodes[name].status = _containers.Status.Paused; |
|
|
|
|
else if (c.State.Running) nodes[name].status = _containers.Status.Running; |
|
|
|
|
else if (c.State.Restarting) nodes[name].status = _containers.Status.Restarting; |
|
|
|
|
else if (c.State.ExitCode == 0) nodes[name].status = _containers.Status.Terminated; |
|
|
|
|
else nodes[name].status = _containers.Status.Error; |
|
|
|
|
nodes[name].volumes = []; |
|
|
|
|
var volumes = c.Volumes || c.Config.Volumes; |
|
|
|
|
nodes[name].volumes = []; |
|
|
|
|