#!/usr/bin/python

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

from subprocess import PIPE, Popen
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 = [(server,
              Popen(['remctl', server, 'remote', 'web', 'listvms'], stdout=PIPE))
             for server in servers]
    outputs = [(s, p.communicate()[0]) for (s, p) in pipes]
    for (s, p) in pipes:
        if p.returncode != 0:
            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 = {}
    for server, result in results:
        for data in result.itervalues():
            data['host'] = server
        merged.update(result)

    print yaml.dump(merged, Dumper=yaml.CSafeDumper, default_flow_style=False)

if __name__ == '__main__':
    main(sys.argv)

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