From a62babaddb788f2e23e089a58c3c0a4a432aac53 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Sat, 2 Aug 2008 20:28:18 -0400 Subject: [PATCH] - use invirt.config to get hostnames - refactoring: extracted bcast() function into invirt.remote package - fixed os.rename import bug - using correct default paths in invirt-getconf svn path=/trunk/packages/sipb-xen-remote-server/; revision=816 --- config.todo | 2 -- files/usr/sbin/sipb-xen-remote-create | 29 +++++++---------------------- files/usr/sbin/sipb-xen-remote-listvms | 21 ++++----------------- 3 files changed, 11 insertions(+), 41 deletions(-) diff --git a/config.todo b/config.todo index 2bf3f32..32fd3e3 100644 --- a/config.todo +++ b/config.todo @@ -1,6 +1,4 @@ files/usr/sbin/sipb-xen-remconffs: realm files/usr/sbin/sipb-xen-remconffs: db uri files/usr/sbin/sipb-xen-remote-proxy: any one host name -files/usr/sbin/sipb-xen-remote-create: host hostnames -files/usr/sbin/sipb-xen-remote-listvms: host hostnames files/usr/sbin/sipb-xen-remctl-help: remote-proxy hostname diff --git a/files/usr/sbin/sipb-xen-remote-create b/files/usr/sbin/sipb-xen-remote-create index 214097f..32e875a 100755 --- a/files/usr/sbin/sipb-xen-remote-create +++ b/files/usr/sbin/sipb-xen-remote-create @@ -1,4 +1,5 @@ #!/usr/bin/python + """ Picks a host to "create" (boot) a VM on, and does so. @@ -7,39 +8,24 @@ Current load-balancing algorithm: wherever there's more free RAM. TODO: use a lock to avoid creating the same VM twice in a race """ - +from invirt.remote import bcast from subprocess import PIPE, Popen, call import sys import yaml - def choose_host(): # Query each of the hosts. - # 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'] - pipes = [(server, - Popen(['remctl', server, 'remote', 'web', 'info'], 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] # XXX will the output of 'xm info' always be parseable YAML? - - return max( (int(o['free_memory']), s) for (s, o) in results )[1] - + results = bcast('info') + return max((int(o['free_memory']), s) for (s, o) in results)[1] def main(argv): if len(argv) < 2: - print >>sys.stderr, "usage: sipb-xen-remote-create []" + print >> sys.stderr, "usage: sipb-xen-remote-create []" return 2 machine_name = argv[1] args = argv[2:] - p = Popen(['/usr/sbin/sipb-xen-remote-proxy-web', 'listvms'], stdout=PIPE) output = p.communicate()[0] if p.returncode != 0: @@ -49,11 +35,10 @@ def main(argv): if machine_name in vms: host = vms[machine_name]['host'] - print >>sys.stderr, ("machine '%s' is already running on host %s" - % (machine_name, host)) + print >> sys.stderr, ("machine '%s' is already running on host %s" + % (machine_name, host)) return 1 - host = choose_host() print 'Creating on host %s...' % host sys.stdout.flush() diff --git a/files/usr/sbin/sipb-xen-remote-listvms b/files/usr/sbin/sipb-xen-remote-listvms index 6690fb9..8c25d09 100755 --- a/files/usr/sbin/sipb-xen-remote-listvms +++ b/files/usr/sbin/sipb-xen-remote-listvms @@ -5,26 +5,13 @@ Collates the results of listvms from multiple VM servers. Part of the xvm suite. """ -from subprocess import PIPE, Popen +from invirt.remote import bcast 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) + # Query each of the hosts. + results = filter(lambda (_, x): x is not None, bcast('listvms')) # Merge the results and print. merged = {} @@ -36,6 +23,6 @@ def main(argv): print yaml.dump(merged, Dumper=yaml.CSafeDumper, default_flow_style=False) if __name__ == '__main__': - main(sys.argv) + sys.exit(main(sys.argv)) # vim:et:sw=4:ts=4 -- 1.7.9.5