X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/4663602deda7a8c90d59c8d3a57cd5a3945d73ca..de0b2b5b417d9d70283458dbc5307fd0f4d1e701:/controls.py diff --git a/controls.py b/controls.py index 3671f21..7134668 100644 --- a/controls.py +++ b/controls.py @@ -10,6 +10,7 @@ import subprocess import sys import time import re +import cache_acls # ... and stolen from xend/uuid.py def randomUUID(): @@ -74,10 +75,17 @@ def bootMachine(machine, cdtype): id of the CD (e.g. 'gutsy_i386') """ if cdtype is not None: - remctl('control', machine.name, 'create', - cdtype) + out, err = remctl('control', machine.name, 'create', + cdtype, err=True) else: - remctl('control', machine.name, 'create') + out, err = remctl('control', machine.name, 'create', + err=True) + if 'already exists' in out: + raise InvalidInput('action', 'create', + 'VM %s is already on' % machine.name) + elif err: + raise CodeError('"%s" on "control %s create %s' + % (err, machine.name, cdtype)) def registerMachine(machine): """Register a machine to be controlled by the web interface""" @@ -87,13 +95,13 @@ def unregisterMachine(machine): """Unregister a machine to not be controlled by the web interface""" remctl('web', 'unregister', machine.name) -def createVm(owner, contact, name, memory, disk, is_hvm, cdrom): +def createVm(owner, contact, name, memory, disk_size, is_hvm, cdrom): """Create a VM and put it in the database""" # put stuff in the table transaction = ctx.current.create_transaction() try: validation.validMemory(owner, memory) - validation.validDisk(owner, disk * 1. / 1024) + validation.validDisk(owner, disk_size * 1. / 1024) validation.validAddVm(owner) res = meta.engine.execute('select nextval(' '\'"machines_machine_id_seq"\')') @@ -110,8 +118,8 @@ def createVm(owner, contact, name, memory, disk, is_hvm, cdrom): machine_type = Type.get_by(hvm=is_hvm) machine.type_id = machine_type.type_id ctx.current.save(machine) - disk = Disk(machine.machine_id, - 'hda', disk) + disk = Disk(machine_id=machine.machine_id, + guest_device_name='hda', size=disk_size) open_nics = NIC.select_by(machine_id=None) if not open_nics: #No IPs left! raise CodeError("No IP addresses left! " @@ -121,6 +129,7 @@ def createVm(owner, contact, name, memory, disk, is_hvm, cdrom): nic.hostname = name ctx.current.save(nic) ctx.current.save(disk) + cache_acls.refreshMachine(machine) transaction.commit() except: transaction.rollback() @@ -201,6 +210,8 @@ def deleteVM(machine): ctx.current.save(nic) for disk in machine.disks: ctx.current.delete(disk) + for access in machine.acl: + ctx.current.delete(access) ctx.current.delete(machine) transaction.commit() except: @@ -212,11 +223,9 @@ def deleteVM(machine): def commandResult(user, fields): start_time = 0 - print >> sys.stderr, time.time()-start_time machine = validation.testMachineId(user, fields.getfirst('machine_id')) action = fields.getfirst('action') cdrom = fields.getfirst('cdrom') - print >> sys.stderr, time.time()-start_time if cdrom is not None and not CDROM.get(cdrom): raise CodeError("Invalid cdrom type '%s'" % cdrom) if action not in ('Reboot', 'Power on', 'Power off', 'Shutdown', @@ -266,7 +275,6 @@ def commandResult(user, fields): raise CodeError('ERROR on remctl') elif action == 'Delete VM': deleteVM(machine) - print >> sys.stderr, time.time()-start_time d = dict(user=user, command=action,