X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-remote.git/blobdiff_plain/1e5aac7e0d73433d65b17b5345a03deb822b43cc..e1b9196f42941a70ad972951214eec684290f9f8:/server/usr/sbin/invirt-remote-create diff --git a/server/usr/sbin/invirt-remote-create b/server/usr/sbin/invirt-remote-create index 714d846..3ec70a5 100755 --- a/server/usr/sbin/invirt-remote-create +++ b/server/usr/sbin/invirt-remote-create @@ -12,10 +12,21 @@ from invirt.remote import bcast from subprocess import PIPE, Popen, call import sys import yaml +import invirt.database + +def maxMemory(owner, xmlist): + """ + Return the memory available for a new machine. + """ + machines = invirt.database.Machine.query().filter_by(owner=owner) + (quota_total, quota_single) = invirt.database.Owner.getMemoryQuotas(owner) + + active_machines = [m for m in machines if m.name in xmlist] + mem_usage = sum([x.memory for x in active_machines]) + return min(quota_single, quota_total-mem_usage) def choose_host(): # Query each of the hosts. - # XXX will the output of 'xm info' always be parseable YAML? results = bcast('availability') return max((int(o), s) for (s, o) in results)[1] @@ -50,6 +61,18 @@ def main(argv): % (machine_name, host)) return 1 + if operation == "create": + invirt.database.connect() + machine = invirt.database.Machine.query().filter_by(name=machine_name).first() + + owner = machine.owner + vm_memory = machine.memory + + max_memory = maxMemory(owner, vms.keys()) + if vm_memory > max_memory: + print >>sys.stderr, "owner %s requested %d MB of memory for vm %s; %d MB allowed" % (owner, vm_memory, machine_name, max_memory) + return 1 + host = choose_host() print 'Creating on host %s...' % host sys.stdout.flush()