X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/ceda9a313ca44b55cf860185247668e4db6ba48a..52d630b4ed2f7bbdd61b3eada7a2c38d64c077cb:/code/main.py diff --git a/code/main.py b/code/main.py index f89763c..f235c53 100755 --- a/code/main.py +++ b/code/main.py @@ -86,7 +86,7 @@ class InvirtWeb(View): def __getattr__(self, name): if name in ("admin", "overlord"): - if not cherrypy.request.login in getAfsGroupMembers(config.adminacl, config.authz[0].cell): + if not cherrypy.request.login in getAfsGroupMembers(config.adminacl, config.authz.cells[0].cell): raise InvalidInput('username', cherrypy.request.login, 'Not in admin group %s.' % config.adminacl) cherrypy.request.state = State(cherrypy.request.login, isadmin=True) @@ -199,9 +199,9 @@ console will suffer artifacts. help._cp_config['tools.require_login.on'] = False def parseCreate(self, fields): - kws = dict([(kw, fields.get(kw)) for kw in + kws = dict([(kw, fields[kw]) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split() - if fields.get(kw)]) + if fields[kw]]) validate = validation.Validate(cherrypy.request.login, cherrypy.request.state, strict=True, **kws) @@ -229,8 +229,8 @@ console will suffer artifacts. d = getListDict(cherrypy.request.login, cherrypy.request.state) d['err'] = err if err: - for field in fields.keys(): - setattr(d['defaults'], field, fields.get(field)) + for field, value in fields.items(): + setattr(d['defaults'], field, value) else: d['new_machine'] = parsed_fields['name'] return d @@ -248,14 +248,19 @@ console will suffer artifacts. raise RuntimeError("test of the emergency broadcast system") class MachineView(View): - # This is hairy. Fix when CherryPy 3.2 is out. (rename to - # _cp_dispatch, and parse the argument as a list instead of - # string - def __getattr__(self, name): + """Synthesize attributes to allow RESTful URLs like + /machine/13/info. This is hairy. CherryPy 3.2 adds a + method called _cp_dispatch that allows you to explicitly + handle URLs that can't be mapped, and it allows you to + rewrite the path components and continue processing. + + This function gets the next path component being resolved + as a string. _cp_dispatch will get an array of strings + representing any subsequent path components as well.""" + try: - machine_id = int(name) - cherrypy.request.params['machine_id'] = machine_id + cherrypy.request.params['machine_id'] = int(name) return self except ValueError: return None @@ -294,8 +299,8 @@ console will suffer artifacts. cherrypy.request.state, machine) info_dict['err'] = err if err: - for field in fields.keys(): - setattr(info_dict['defaults'], field, fields.get(field)) + for field, value in fields.items(): + setattr(info_dict['defaults'], field, value) info_dict['result'] = result return info_dict @@ -341,12 +346,13 @@ console will suffer artifacts. port=port, authtoken=token) return d + @cherrypy.expose @cherrypy.tools.mako(filename="/command.mako") @cherrypy.tools.require_POST() def command(self, command_name, machine_id, **kwargs): """Handler for running commands like boot and delete on a VM.""" - back = kwargs.get('back', None) + back = kwargs.get('back') try: d = controls.commandResult(cherrypy.request.login, cherrypy.request.state, @@ -527,9 +533,9 @@ def modifyDict(username, state, machine_id, fields): olddisk = {} session.begin() try: - kws = dict([(kw, fields.get(kw)) for kw in + kws = dict([(kw, fields[kw]) for kw in 'owner admin contact name description memory vmtype disksize'.split() - if fields.get(kw)]) + if fields[kw]]) kws['machine_id'] = machine_id validate = validation.Validate(username, state, **kws) machine = validate.machine @@ -683,4 +689,4 @@ Subject: %s p.stdin.close() p.wait() -random.seed() +random.seed() #sigh