#!/usr/bin/env python2.5

"""
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

###

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):
  # 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)

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

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