X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/ffedf521f48eafd55ed0569b6e3b3697fb27cc92..7268d3236dc1ea69c8ff786e43ea77939c6d1a97:/templates/main.py?ds=inline diff --git a/templates/main.py b/templates/main.py index f798cbf..36ea239 100755 --- a/templates/main.py +++ b/templates/main.py @@ -13,6 +13,7 @@ import sha import hmac import datetime import StringIO +import getafsgroups sys.stderr = StringIO.StringIO() sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages') @@ -117,7 +118,7 @@ def haveAccess(user, machine): """Return whether a user has access to a machine""" if user.username == 'moo': return True - return machine.owner == user.username + return getafsgroups.checkLockerOwner(user.username,machine.owner) def error(op, user, fields, err, emsg): """Print an error page when a CodeError occurs""" @@ -352,7 +353,7 @@ def create(user, fields): name = fields.getfirst('name') if not validMachineName(name): raise InvalidInput('name', name) - name = user.username + '_' + name.lower() + name = name.lower() if Machine.get_by(name=name): raise InvalidInput('name', name, @@ -510,6 +511,10 @@ def getDiskInfo(data_dict, machine): def deleteVM(machine): """Delete a VM.""" + try: + remctl('destroy', machine.name) + except: + pass transaction = ctx.current.create_transaction() delete_disk_pairs = [(machine.name, d.guest_device_name) for d in machine.disks] try: @@ -563,7 +568,7 @@ def command(user, fields): return Template(file="command.tmpl", searchList=[d, global_dict]) def testOwner(user, owner, machine=None): - if owner != user.username: + if not getafsgroups.checkLockerOwner(user.username, owner): raise InvalidInput('owner', owner, "Invalid") return owner @@ -574,10 +579,19 @@ def testContact(user, contact, machine=None): "Invalid") return contact +def testDisk(user, disksize, machine=None): + return disksize + +def testName(user, name, machine=None): + return name + def testHostname(user, hostname, machine): for nic in machine.nics: if hostname == nic.hostname: return hostname + # check if doesn't already exist + if NIC.select_by(hostname=hostname) == []: + return hostname raise InvalidInput('hostname', hostname, "Different from before") @@ -585,19 +599,59 @@ def testHostname(user, hostname, machine): def modify(user, fields): """Handler for modifying attributes of a machine.""" #XXX not written yet - machine = testMachineId(user, fields.getfirst('machine_id')) - owner = testOwner(user, fields.getfirst('owner'), machine) - contact = testContact(user, fields.getfirst('contact')) - hostname = testHostname(user, fields.getfirst('hostname'), + + transaction = ctx.current.create_transaction() + try: + machine = testMachineId(user, fields.getfirst('machine_id')) + owner = testOwner(user, fields.getfirst('owner'), machine) + contact = testContact(user, fields.getfirst('contact')) + hostname = testHostname(owner, fields.getfirst('hostname'), machine) - ram = fields.getfirst('memory') - if ram is not None: - ram = validMemory(user, ram, machine) - disk = testDisk(user, fields.getfirst('disk')) - if disk is not None: - disk = validDisk(user, disk, machine) + name = testName(user, fields.getfirst('name')) + oldname = machine.name + olddisk = {} + + memory = fields.getfirst('memory') + if memory is not None: + memory = validMemory(user, memory, machine) + if memory != machine.memory: + machine.memory = memory + + disksize = testDisk(user, fields.getfirst('disk')) + if disksize is not None: + disksize = validDisk(user, disksize, machine) + + for disk in machine.disks: + disk.size = disksize + olddisk[disk.guest_device_name] = disk.size + ctx.current.save(disk) + + # XXX all NICs get same hostname on change? Interface doesn't support more. + for nic in machine.nics: + nic.hostname = hostname + ctx.current.save(nic) + + if owner != machine.owner: + machine.owner = owner + if name != machine.name: + machine.name = name + + ctx.current.save(machine) + transaction.commit() + except: + transaction.rollback() + remctl("web", "moveregister", oldname, name) + for disk in machine.disks: + # XXX all disks get the same size on change? Interface doesn't support more. + if disk.size != olddisk[disk.guest_device_name]: + remctl("web", "lvresize", oldname, disk.guest_device_name, str(disk.size)) + if oldname != name: + remctl("web", "lvrename", oldname, disk.guest_device_name, name) + d = dict(user=user, + command="modify", + machine=machine) + return Template(file="command.tmpl", searchList=[d, global_dict]) - def help(user, fields): """Handler for help messages."""