#!/usr/bin/python

"""
Collates the results of listvms from multiple VM servers.  Part of the xvm
suite.
"""

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 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
    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, cmd)
    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__':
    main(sys.argv)

# vim:et:sw=2:ts=4