X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/907f34a95f096535be1b47e99f37b063a2a8245c..e9bbb8ed8fc6739e221a1e1c6c7f02e19b6158c8:/code/controls.py diff --git a/code/controls.py b/code/controls.py index 622dd50..b4740d4 100644 --- a/code/controls.py +++ b/code/controls.py @@ -69,6 +69,18 @@ def makeDisks(machine): for disk in machine.disks: lvcreate(machine, disk) +def getswap(disksize, memsize): + """Returns the recommended swap partition size.""" + return int(min(disksize / 4, memsize * 1.5)) + +def lvinstall(machine, autoinstall): + disksize = machine.disks[0].size + memsize = machine.memory + imagesize = disksize - getswap(disksize, memsize) + ip = machine.nics[0].ip + remctl('web', 'install', machine.name, autoinstall.distribution, + autoinstall.mirror, str(imagesize), ip) + def lvcopy(machine_orig_name, machine, rootpw): """Copy a golden image onto a machine's disk""" remctl('web', 'lvcopy', machine_orig_name, machine.name, rootpw) @@ -85,14 +97,14 @@ def bootMachine(machine, cdtype): else: out, err = remctl('control', machine.name, 'create', err=True) - if 'already exists' in out: + if 'already running' in err: 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 createVm(username, state, owner, contact, name, description, memory, disksize, machine_type, cdrom, clone_from): +def createVm(username, state, owner, contact, name, description, memory, disksize, machine_type, cdrom, autoinstall): """Create a VM and put it in the database""" # put stuff in the table transaction = ctx.current.create_transaction() @@ -130,8 +142,8 @@ def createVm(username, state, owner, contact, name, description, memory, disksiz transaction.rollback() raise makeDisks(machine) - if clone_from: - lvcopy(clone_from, machine, 'password') + if autoinstall: + lvinstall(machine, autoinstall) # tell it to boot with cdrom bootMachine(machine, cdrom) return machine @@ -176,7 +188,7 @@ def statusInfo(machine): if 'Unknown command' in err_string: raise CodeError("ERROR in remctl list-long %s is not registered" % (machine.name,)) - elif 'does not exist' in err_string: + elif 'is not on' in err_string: return None elif err_string: raise CodeError("ERROR in remctl list-long %s: %s" % @@ -184,6 +196,13 @@ def statusInfo(machine): status = parseStatus(value_string) return status +def listHost(machine): + """Return the host a machine is running on""" + out, err = remctl('control', machine.name, 'listhost', err=True) + if err: + return None + return out.strip() + def deleteVM(machine): """Delete a VM.""" remctl('control', machine.name, 'destroy', err=True) @@ -223,7 +242,7 @@ def commandResult(username, state, fields): out, err = remctl('control', machine.name, 'reboot', err=True) if err: - if re.match("Error: Domain '.*' does not exist.", err): + if re.match("machine '.*' is not on", err): raise InvalidInput("action", "reboot", "Machine is not on") else: @@ -240,7 +259,7 @@ def commandResult(username, state, fields): elif action == 'Power off': out, err = remctl('control', machine.name, 'destroy', err=True) if err: - if re.match("Error: Domain '.*' does not exist.", err): + if re.match("machine '.*' is not on", err): raise InvalidInput("action", "Power off", "Machine is not on.") else: @@ -250,7 +269,7 @@ def commandResult(username, state, fields): elif action == 'Shutdown': out, err = remctl('control', machine.name, 'shutdown', err=True) if err: - if re.match("Error: Domain '.*' does not exist.", err): + if re.match("machine '.*' is not on", err): raise InvalidInput("action", "Shutdown", "Machine is not on.") else: