remote: proxy control requests on running VMs to right host
[invirt/packages/invirt-remote.git] / files / usr / sbin / sipb-xen-remote-listvms
index eaefffd..6690fb9 100755 (executable)
@@ -1,16 +1,13 @@
-#!/usr/bin/env python2.5
+#!/usr/bin/python
 
 """
 Collates the results of listvms from multiple VM servers.  Part of the xvm
 suite.
 """
 
 
 """
 Collates the results of listvms from multiple VM servers.  Part of the xvm
 suite.
 """
 
-from itertools import chain
-from subprocess import CalledProcessError, PIPE, Popen
-from sys import argv, stdout
-from yaml import safe_dump, safe_load
-
-###
+from subprocess import PIPE, Popen
+import sys
+import yaml
 
 def main(argv):
     # Query each of the server for their VMs.
 
 def main(argv):
     # Query each of the server for their VMs.
@@ -18,22 +15,27 @@ def main(argv):
     # hardcoding the list here)
     servers = ['black-mesa.mit.edu', 'sx-blade-2.mit.edu']
     # XXX
     # hardcoding the list here)
     servers = ['black-mesa.mit.edu', 'sx-blade-2.mit.edu']
     # XXX
-    pipes = [Popen(['remctl', server, 'remote', 'web', 'listvms'], stdout=PIPE)
+    pipes = [(server,
+              Popen(['remctl', server, 'remote', 'web', 'listvms'], stdout=PIPE))
              for server in servers]
              for server in servers]
-    outputs = [p.communicate()[0] for p in pipes]
-    for p in pipes:
+    outputs = [(s, p.communicate()[0]) for (s, p) in pipes]
+    for (s, p) in pipes:
         if p.returncode != 0:
         if p.returncode != 0:
-            raise CalledProcessError(p.returncode, cmd)
-    results = [safe_load(o) for o in outputs]
-    results = filter(lambda x: x is not None, results)
+            raise RuntimeError("remctl to host %s returned non-zero exit status %d"
+                               % (s, p.returncode)) 
+    results = [(s, yaml.load(o, yaml.CSafeLoader)) for (s, o) in outputs]
+    results = filter(lambda (_, x): x is not None, results)
 
     # Merge the results and print.
     merged = {}
 
     # Merge the results and print.
     merged = {}
-    for result in results:
+    for server, result in results:
+        for data in result.itervalues():
+            data['host'] = server
         merged.update(result)
         merged.update(result)
-    print safe_dump(merged, default_flow_style=False)
+
+    print yaml.dump(merged, Dumper=yaml.CSafeDumper, default_flow_style=False)
 
 if __name__ == '__main__':
 
 if __name__ == '__main__':
-    main(argv)
+    main(sys.argv)
 
 
-# vim:et:sw=2:ts=4
+# vim:et:sw=4:ts=4