cdrom = ''
autoinstall = ''
name = ''
+ description = ''
type = 'linux-hvm'
def __init__(self, max_memory=None, max_disk=None, **kws):
DEFAULT_HEADERS = {'Content-Type': 'text/html'}
-def error(op, username, fields, err, emsg, traceback):
- """Print an error page when a CodeError occurs"""
- d = dict(op=op, user=username, fields=fields,
- errorMessage=str(err), stderr=emsg, traceback=traceback)
- details = templates.error_raw(searchList=[d])
- send_error_mail('xvm error on %s for %s: %s' % (op, username, err),
- details)
- d['details'] = details
- return templates.error(searchList=[d])
-
def invalidInput(op, username, fields, err, emsg):
"""Print an error page when an InvalidInput exception occurs"""
d = dict(op=op, user=username, err_field=err.err_field,
return False
def parseCreate(username, state, fields):
- kws = dict([(kw, fields.getfirst(kw)) for kw in 'name owner memory disksize vmtype cdrom clone_from'.split()])
+ kws = dict([(kw, fields.getfirst(kw)) for kw in 'name description owner memory disksize vmtype cdrom clone_from'.split()])
validate = validation.Validate(username, state, strict=True, **kws)
- return dict(contact=username, name=validate.name, memory=validate.memory,
+ return dict(contact=username, name=validate.name, description=validate.description, memory=validate.memory,
disksize=validate.disksize, owner=validate.owner, machine_type=validate.vmtype,
cdrom=getattr(validate, 'cdrom', None),
clone_from=getattr(validate, 'clone_from', None))
olddisk = {}
transaction = ctx.current.create_transaction()
try:
- kws = dict([(kw, fields.getfirst(kw)) for kw in 'machine_id owner admin contact name memory vmtype disksize'.split()])
+ kws = dict([(kw, fields.getfirst(kw)) for kw in 'machine_id owner admin contact name description memory vmtype disksize'.split()])
validate = validation.Validate(username, state, **kws)
machine = validate.machine
oldname = machine.name
update_acl = True
if hasattr(validate, 'name'):
machine.name = validate.name
+ if hasattr(validate, 'description'):
+ machine.description = validate.description
if hasattr(validate, 'admin') and validate.admin != machine.administrator:
machine.administrator = validate.admin
update_acl = True
def badOperation(u, s, e):
"""Function called when accessing an unknown URI."""
- raise CodeError("Unknown operation")
+ return ({'Status': '404 Not Found'}, 'Invalid operation.')
def infoDict(username, state, machine):
"""Get the variables used by info.tmpl."""
display_fields = """name uptime memory state cpu_weight on_reboot
on_poweroff on_crash on_xend_start on_xend_stop bootloader""".split()
display_fields = [('name', 'Name'),
+ ('description', 'Description'),
('owner', 'Owner'),
('administrator', 'Administrator'),
('contact', 'Contact'),
fields = []
machine_info = {}
machine_info['name'] = machine.name
+ machine_info['description'] = machine.description
machine_info['type'] = machine.type.hvm and 'HVM' or 'ParaVM'
machine_info['owner'] = machine.owner
machine_info['administrator'] = machine.administrator
checkpoint.checkpoint('Got mem')
max_disk = validation.maxDisk(machine.owner, machine)
defaults = Defaults()
- for name in 'machine_id name administrator owner memory contact'.split():
+ for name in 'machine_id name description administrator owner memory contact'.split():
setattr(defaults, name, getattr(machine, name))
defaults.type = machine.type.type_id
defaults.disk = "%0.2f" % (machine.disks[0].size/1024.)
def throwError(_, __, ___):
"""Throw an error, to test the error-tracing mechanisms."""
- raise CodeError("test of the emergency broadcast system")
+ raise RuntimeError("test of the emergency broadcast system")
mapping = dict(list=listVms,
vnc=vnc,
p.stdin.close()
p.wait()
+def show_error(op, username, fields, err, emsg, traceback):
+ """Print an error page when an exception occurs"""
+ d = dict(op=op, user=username, fields=fields,
+ errorMessage=str(err), stderr=emsg, traceback=traceback)
+ details = templates.error_raw(searchList=[d])
+ send_error_mail('xvm error on %s for %s: %s' % (op, username, err),
+ details)
+ d['details'] = details
+ return templates.error(searchList=[d])
+
def getUser(environ):
"""Return the current user based on the SSL environment variables"""
email = environ.get('SSL_CLIENT_S_DN_Email', None)
if isinstance(output, tuple):
new_headers, output = output
headers.update(new_headers)
- print 'MOO2'
e = revertStandardError()
if e:
if isinstance(output, basestring):
output_string = str(output)
checkpoint.checkpoint('output as a string')
except Exception, err:
- import traceback
if not fields.has_key('js'):
- if isinstance(err, CodeError):
- self.start('500 Internal Server Error', [('Content-Type', 'text/html')])
- e = revertStandardError()
- s = error(operation, self.username, fields,
- err, e, traceback.format_exc())
- yield str(s)
- return
if isinstance(err, InvalidInput):
self.start('200 OK', [('Content-Type', 'text/html')])
e = revertStandardError()
- yield str(invalidInput(operation, self.username, fields, err, e))
+ yield str(invalidInput(operation, self.username, fields,
+ err, e))
return
- self.start('500 Internal Server Error', [('Content-Type', 'text/plain')])
- send_error_mail('xvm error: %s' % (err,),
- '%s\n' % (traceback.format_exc(),))
- yield '''Uh-oh! We experienced an error.
-Sorry about that. We've gotten mail about it.
-
-Feel free to poke us at xvm@mit.edu if this bug is
-consistently biting you and we don't seem to be fixing it.
-
-In case you're curious, the gory details are here.
-----
-%s
-----
-%s
-----''' % (str(err), traceback.format_exc())
+ import traceback
+ self.start('500 Internal Server Error',
+ [('Content-Type', 'text/html')])
+ e = revertStandardError()
+ s = show_error(operation, self.username, fields,
+ err, e, traceback.format_exc())
+ yield str(s)
+ return
status = headers.setdefault('Status', '200 OK')
del headers['Status']
self.start(status, headers.items())