X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/deb49f12aad253039d9b8907dde04b89321f5e49..2be0969e153ace507ec07b27d156b50e54e00f94:/code/main.py?ds=inline diff --git a/code/main.py b/code/main.py index 7044167..86da50e 100755 --- a/code/main.py +++ b/code/main.py @@ -97,6 +97,9 @@ class InvirtWeb(View): return d def __getattr__(self, name): + # At the point __getattr__ is called, tools haven't been run. Make sure the user is logged in. + cherrypy.tools.remote_user_login.callable() + if name in ("admin", "overlord"): if not cherrypy.request.login in getAfsGroupMembers(config.adminacl, config.authz.afs.cells[0].cell): raise InvalidInput('username', cherrypy.request.login, @@ -168,8 +171,6 @@ wiki, including steps to prepare an HVM guest to boot as a ParaVM

We recommend using a ParaVM when possible and an HVM when necessary. """, - 'CPU Weight': """ -Don't ask us! We're as mystified as you are.""", 'Owner': """ The owner field is used to determine quotas. It must be the name of a @@ -193,6 +194,7 @@ your machine will run just fine, but the applet's display of the console will suffer artifacts. """, 'Windows': """ +Windows 7: The Windows 7 image is licensed for all MIT students and will automatically activate off the network; see the licensing agreement for details. The installer requires 512 MiB RAM and at least 15 GiB disk space (20 GiB or more recommended).
Windows Vista: The Vista image is licensed for all MIT students and will automatically activate off the network; see the licensing confirmation e-mail for details. The installer requires 512 MiB RAM and at least 7.5 GiB disk space (15 GiB or more recommended).
Windows XP: This is the volume license CD image. You will need your own volume license key to complete the install. We do not have these available for the general MIT community; ask your department if they have one, or visit http://msca.mit.edu/ if you are staff/faculty to request one. """ @@ -456,7 +458,8 @@ def getListDict(username, state): defaults=defaults, machines=machines, has_vnc=has_vnc, - installing=installing) + installing=installing, + disable_creation=False) return d def getHostname(nic): @@ -534,23 +537,10 @@ def modifyDict(username, state, machine_id, fields): if hasattr(validate, 'vmtype'): machine.type = validate.vmtype - if hasattr(validate, 'disksize'): - disksize = validate.disksize - disk = machine.disks[0] - if disk.size != disksize: - olddisk[disk.guest_device_name] = disksize - disk.size = disksize - session.save_or_update(disk) - update_acl = False if hasattr(validate, 'owner') and validate.owner != machine.owner: machine.owner = validate.owner update_acl = True - if hasattr(validate, 'name'): - machine.name = validate.name - for n in machine.nics: - if n.hostname == oldname: - n.hostname = validate.name if hasattr(validate, 'description'): machine.description = validate.description if hasattr(validate, 'admin') and validate.admin != machine.administrator: @@ -559,22 +549,56 @@ def modifyDict(username, state, machine_id, fields): if hasattr(validate, 'contact'): machine.contact = validate.contact - session.save_or_update(machine) - if update_acl: - cache_acls.refreshMachine(machine) + session.add(machine) session.commit() except: session.rollback() raise - for diskname in olddisk: - controls.resizeDisk(oldname, diskname, str(olddisk[diskname])) - if hasattr(validate, 'name'): - controls.renameMachine(machine, oldname, validate.name) + + session.begin() + try: + if hasattr(validate, 'disksize'): + disksize = validate.disksize + disk = machine.disks[0] + if disk.size != disksize: + olddisk[disk.guest_device_name] = disksize + disk.size = disksize + session.add(disk) + for diskname in olddisk: + controls.resizeDisk(oldname, diskname, str(olddisk[diskname])) + session.add(machine) + session.commit() + except: + session.rollback() + raise + + session.begin() + try: + if hasattr(validate, 'name'): + machine.name = validate.name + for n in machine.nics: + if n.hostname == oldname: + n.hostname = validate.name + if hasattr(validate, 'name'): + controls.renameMachine(machine, oldname, validate.name) + session.add(machine) + session.commit() + except: + session.rollback() + raise + + if update_acl: + cache_acls.refreshMachine(machine) + return dict(machine=machine) def infoDict(username, state, machine): """Get the variables used by info.tmpl.""" - status = controls.statusInfo(machine) + try: + status = controls.statusInfo(machine) + except CodeError, e: + # machine was shut down in between the call to listInfoDict and this + status = None has_vnc = hasVnc(status) if status is None: main_status = dict(name=machine.name, @@ -584,8 +608,12 @@ def infoDict(username, state, machine): else: main_status = dict(status[1:]) main_status['host'] = controls.listHost(machine) - start_time = float(main_status.get('start_time', 0)) - uptime = datetime.timedelta(seconds=int(time.time()-start_time)) + start_time = main_status.get('start_time') + if start_time is None: + uptime = "Still booting?" + else: + start_time = float(start_time) + uptime = datetime.timedelta(seconds=int(time.time()-start_time)) cpu_time_float = float(main_status.get('cpu_time', 0)) cputime = datetime.timedelta(seconds=int(cpu_time_float)) display_fields = [('name', 'Name'),