sx-remote-listvms: someone's uncommitted changes
[invirt/packages/invirt-remote.git] / files / usr / sbin / sipb-xen-remote-listvms
index f9b3f36..52f5da6 100755 (executable)
@@ -1,44 +1,52 @@
-#!/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
+try:
+    from subprocess import CalledProcessError
+except ImportError:
+    # Python 2.4 doesn't implement CalledProcessError
+    class CalledProcessError(Exception):
+        """This exception is raised when a process run by check_call() returns
+        a non-zero exit status. The exit status will be stored in the
+        returncode attribute."""
+        def __init__(self, returncode, cmd):
+            self.returncode = returncode
+            self.cmd = cmd
+        def __str__(self):
+            return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
+import sys
+import yaml
 
 ###
 
 
 ###
 
-def run(cmd):
-  """
-  Run the given command (a list of program and argument strings) and return the
-  stdout as a string, raising a CalledProcessError if the program exited with a
-  non-zero status.
-  """
-  p = Popen(cmd, stdout=PIPE)
-  stdout = p.communicate()[0]
-  if p.returncode != 0: raise CalledProcessError(p.returncode, cmd)
-  return stdout
-
 def main(argv):
 def main(argv):
-  # Query each of the server for their VMs.
-  # TODO get `servers` from a real list of all the VM hosts (instead of
-  # hardcoding the list here)
-  servers = [ 'black-mesa.mit.edu', 'sx-blade-2.mit.edu' ]
-  # XXX
-  results = [ safe_load(run(['remctl', server, 'remote', 'web', 'listvms']))
-              for server in servers ]
-  results = filter( lambda x: x is not None, results )
-
-  # Merge the results and print.
-  merged = {}
-  for result in results: merged.update(result)
-  print safe_dump(merged, default_flow_style=False)
+    # Query each of the server for their VMs.
+    # TODO get `servers` from a real list of all the VM hosts (instead of
+    # hardcoding the list here)
+    servers = ['black-mesa.mit.edu', 'sx-blade-2.mit.edu']
+    # XXX
+    pipes = [Popen(['remctl', server, 'remote', 'web', 'listvms'], stdout=PIPE)
+             for server in servers]
+    outputs = [p.communicate()[0] for p in pipes]
+    for p in pipes:
+        if p.returncode != 0:
+            raise CalledProcessError(p.returncode, 'remctl')
+    results = [yaml.load(o, yaml.CSafeLoader) for o in outputs]
+    results = filter(lambda x: x is not None, results)
+
+    # Merge the results and print.
+    merged = {}
+    for result in results:
+        merged.update(result)
+
+    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=2
+# vim:et:sw=2:ts=4