X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/cabbf7ab8e35de060f6f4e3f75670558ad25d9b5..951f7df4a26ea47232121d8d516fc3ccec61a9ba:/code/controls.py diff --git a/code/controls.py b/code/controls.py index 808c988..b946666 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) @@ -92,18 +104,19 @@ def bootMachine(machine, cdtype): raise CodeError('"%s" on "control %s create %s' % (err, machine.name, cdtype)) -def createVm(username, state, owner, contact, name, 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() try: - validation.Validate(username, state, owner=owner, memory=memory, disksize=disksize/1024.) + validation.Validate(username, state, name=name, description=description, owner=owner, memory=memory, disksize=disksize/1024.) res = meta.engine.execute('select nextval(' '\'"machines_machine_id_seq"\')') id = res.fetchone()[0] machine = Machine() machine.machine_id = id machine.name = name + machine.description = description machine.memory = memory machine.owner = owner machine.administrator = owner @@ -129,8 +142,8 @@ def createVm(username, state, owner, contact, name, memory, disksize, machine_ty 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 @@ -138,7 +151,7 @@ def createVm(username, state, owner, contact, name, memory, disksize, machine_ty def getList(): """Return a dictionary mapping machine names to dicts.""" value_string = remctl('web', 'listvms') - value_dict = yaml.load(value_string, yaml.SafeLoader) + value_dict = yaml.load(value_string, yaml.CSafeLoader) return value_dict def parseStatus(s): @@ -175,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" % @@ -183,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) @@ -196,8 +216,6 @@ 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: