X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/a6b3091d1a405ce7ece30be84596cd37afce4911..87b47a1da6fb8cb3a203f1e906cd9066ec335cae:/code/main.py
diff --git a/code/main.py b/code/main.py
index d938450..7ab52b5 100755
--- a/code/main.py
+++ b/code/main.py
@@ -58,10 +58,12 @@ class InvirtWeb(View):
@cherrypy.expose
@cherrypy.tools.mako(filename="/list.mako")
- def list(self):
+ def list(self, result=None):
"""Handler for list requests."""
checkpoint.checkpoint('Getting list dict')
d = getListDict(cherrypy.request.login, cherrypy.request.state)
+ if result is not None:
+ d['result'] = result
checkpoint.checkpoint('Got list dict')
return d
index=list
@@ -130,7 +132,7 @@ console will suffer artifacts.
""",
'Windows': """
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.
+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.
"""
}
@@ -144,6 +146,36 @@ console will suffer artifacts.
mapping=help_mapping)
help._cp_config['tools.require_login.on'] = False
+ def parseCreate(self, fields):
+ kws = dict([(kw, fields.get(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()])
+ validate = validation.Validate(cherrypy.request.login, cherrypy.request.state, strict=True, **kws)
+ return dict(contact=cherrypy.request.login, name=validate.name, description=validate.description, memory=validate.memory,
+ disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type),
+ cdrom=getattr(validate, 'cdrom', None),
+ autoinstall=getattr(validate, 'autoinstall', None))
+
+ @cherrypy.expose
+ @cherrypy.tools.mako(filename="/list.mako")
+ @cherrypy.tools.require_POST()
+ def create(self, **fields):
+ """Handler for create requests."""
+ try:
+ parsed_fields = self.parseCreate(fields)
+ machine = controls.createVm(cherrypy.request.login, cherrypy.request.state, **parsed_fields)
+ except InvalidInput, err:
+ pass
+ else:
+ err = None
+ cherrypy.request.state.clear() #Changed global state
+ 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))
+ else:
+ d['new_machine'] = parsed_fields['name']
+ return d
+
@cherrypy.expose
@cherrypy.tools.mako(filename="/helloworld.mako")
def helloworld(self, **kwargs):
@@ -214,6 +246,32 @@ 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)
+ try:
+ d = controls.commandResult(cherrypy.request.login, cherrypy.request.state, command_name, machine_id, kwargs)
+ if d['command'] == 'Delete VM':
+ back = 'list'
+ except InvalidInput, err:
+ if not back:
+ raise
+ print >> sys.stderr, err
+ result = err
+ else:
+ result = 'Success!'
+ if not back:
+ return d
+ if back == 'list':
+ cherrypy.request.state.clear() #Changed global state
+ raise cherrypy.InternalRedirect('/list?result=%s' % urllib.quote(result))
+ elif back == 'info':
+ raise cherrypy.HTTPRedirect(cherrypy.request.base + '/machine/%d/' % machine_id, status=303)
+ else:
+ raise InvalidInput('back', back, 'Not a known back page.')
machine = MachineView()
@@ -308,33 +366,6 @@ def hasVnc(status):
return 'location' in d
return False
-def parseCreate(username, state, fields):
- kws = dict([(kw, fields.getfirst(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()])
- validate = validation.Validate(username, state, strict=True, **kws)
- return dict(contact=username, name=validate.name, description=validate.description, memory=validate.memory,
- disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type),
- cdrom=getattr(validate, 'cdrom', None),
- autoinstall=getattr(validate, 'autoinstall', None))
-
-def create(username, state, path, fields):
- """Handler for create requests."""
- try:
- parsed_fields = parseCreate(username, state, fields)
- machine = controls.createVm(username, state, **parsed_fields)
- except InvalidInput, err:
- pass
- else:
- err = None
- state.clear() #Changed global state
- d = getListDict(username, state)
- d['err'] = err
- if err:
- for field in fields.keys():
- setattr(d['defaults'], field, fields.getfirst(field))
- else:
- d['new_machine'] = parsed_fields['name']
- return templates.list(searchList=[d])
-
def getListDict(username, state):
"""Gets the list of local variables used by list.tmpl."""
@@ -431,35 +462,6 @@ def getDiskInfo(data_dict, machine):
data_dict['%s_size' % name] = "%0.1f GiB" % (disk.size / 1024.)
return disk_fields
-def command(username, state, path, fields):
- """Handler for running commands like boot and delete on a VM."""
- back = fields.getfirst('back')
- try:
- d = controls.commandResult(username, state, fields)
- if d['command'] == 'Delete VM':
- back = 'list'
- except InvalidInput, err:
- if not back:
- raise
- print >> sys.stderr, err
- result = err
- else:
- result = 'Success!'
- if not back:
- return templates.command(searchList=[d])
- if back == 'list':
- state.clear() #Changed global state
- d = getListDict(username, state)
- d['result'] = result
- return templates.list(searchList=[d])
- elif back == 'info':
- machine = validation.Validate(username, state, machine_id=fields.getfirst('machine_id')).machine
- return ({'Status': '303 See Other',
- 'Location': 'info?machine_id=%d' % machine.machine_id},
- "You shouldn't see this message.")
- else:
- raise InvalidInput('back', back, 'Not a known back page.')
-
def modifyDict(username, state, fields):
"""Modify a machine as specified by CGI arguments.
@@ -651,9 +653,7 @@ def throwError(_, __, ___, ____):
raise RuntimeError("test of the emergency broadcast system")
mapping = dict(
- command=command,
modify=modify,
- create=create,
unauth=unauthFront,
admin=admin,
overlord=admin,