Index: trunk/packages/sipb-xen-database/sipb_xen_database/models.py
===================================================================
--- trunk/packages/sipb-xen-database/sipb_xen_database/models.py	(revision 608)
+++ trunk/packages/sipb-xen-database/sipb_xen_database/models.py	(revision 609)
@@ -29,4 +29,5 @@
        Column('machine_id', Integer, primary_key=True, nullable=False),
        Column('name', String, nullable=False),
+       Column('description', String, nullable=False),
        Column('memory', Integer, nullable=False),
        Column('owner', String, nullable=False),
Index: trunk/packages/sipb-xen-www/code/controls.py
===================================================================
--- trunk/packages/sipb-xen-www/code/controls.py	(revision 608)
+++ trunk/packages/sipb-xen-www/code/controls.py	(revision 609)
@@ -93,10 +93,10 @@
                         % (err, machine.name, cdtype))
 
-def createVm(username, state, owner, contact, name, memory, disksize, machine_type, cdrom, clone_from):
+def createVm(username, state, owner, contact, name, description, memory, disksize, machine_type, cdrom, clone_from):
     """Create a VM and put it in the database"""
     # put stuff in the table
     transaction = ctx.current.create_transaction()
     try:
-        validation.Validate(username, state, name=name, owner=owner, memory=memory, disksize=disksize/1024.)
+        validation.Validate(username, state, name=name, description=description, owner=owner, memory=memory, disksize=disksize/1024.)
         res = meta.engine.execute('select nextval('
                                   '\'"machines_machine_id_seq"\')')
@@ -105,4 +105,5 @@
         machine.machine_id = id
         machine.name = name
+        machine.description = description
         machine.memory = memory
         machine.owner = owner
Index: trunk/packages/sipb-xen-www/code/main.py
===================================================================
--- trunk/packages/sipb-xen-www/code/main.py	(revision 608)
+++ trunk/packages/sipb-xen-www/code/main.py	(revision 609)
@@ -104,4 +104,5 @@
     autoinstall = ''
     name = ''
+    description = ''
     type = 'linux-hvm'
 
@@ -136,7 +137,7 @@
 
 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),
@@ -347,5 +348,5 @@
     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
@@ -372,4 +373,6 @@
         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
@@ -489,4 +492,5 @@
      on_poweroff on_crash on_xend_start on_xend_stop bootloader""".split()
     display_fields = [('name', 'Name'),
+                      ('description', 'Description'),
                       ('owner', 'Owner'),
                       ('administrator', 'Administrator'),
@@ -510,4 +514,5 @@
     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
@@ -544,5 +549,5 @@
     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
@@ -613,6 +618,4 @@
              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])
Index: trunk/packages/sipb-xen-www/code/templates/info.tmpl
===================================================================
--- trunk/packages/sipb-xen-www/code/templates/info.tmpl	(revision 608)
+++ trunk/packages/sipb-xen-www/code/templates/info.tmpl	(revision 609)
@@ -66,4 +66,5 @@
   <input type="hidden" name="machine_id" value="$defaults.machine_id"/>
   <table>
+    <tr><td>Description:</td><td colspan="2"><textarea name="description" rows="4" cols="60">$defaults.description</textarea></td></tr>
     <tr><td>Owner#slurp
 #filter None
Index: trunk/packages/sipb-xen-www/code/templates/list.tmpl
===================================================================
--- trunk/packages/sipb-xen-www/code/templates/list.tmpl	(revision 608)
+++ trunk/packages/sipb-xen-www/code/templates/list.tmpl	(revision 609)
@@ -30,4 +30,11 @@
 #filter None
 $errorRow('name', $err)
+#end filter
+	<tr>
+	  <td>Description</td>
+	  <td><textarea name="description" rows="4" cols="60">$defaults.description</textarea></td>
+	</tr>
+#filter None
+$errorRow('description', $err)
 #end filter
 	<tr>
@@ -136,5 +143,5 @@
 #end if
 </td>
-	<td>
+	<td rowspan="2">
 	  <form action="command" method="post">
 	    <input type="hidden" name="back" value="list"/>
@@ -146,4 +153,7 @@
 	  </form>
 	</td>
+      </tr>
+      <tr>
+        <td colspan="7" style="padding-left: 1em; color: #666">$machine.description</td>
       </tr>
 #end def
Index: trunk/packages/sipb-xen-www/code/validation.py
===================================================================
--- trunk/packages/sipb-xen-www/code/validation.py	(revision 608)
+++ trunk/packages/sipb-xen-www/code/validation.py	(revision 609)
@@ -18,5 +18,5 @@
 
 class Validate:
-    def __init__(self, username, state, machine_id=None, name=None, owner=None,
+    def __init__(self, username, state, machine_id=None, name=None, description=None, owner=None,
                  admin=None, contact=None, memory=None, disksize=None,
                  vmtype=None, cdrom=None, clone_from=None, strict=False):
@@ -29,4 +29,6 @@
             if name is None:
                 raise InvalidInput('name', name, "You must provide a machine name.")
+            if description is None:
+                raise InvalidInput('description', description, "You must provide a description.")
             if memory is None:
                 raise InvalidInput('memory', memory, "You must provide a memory size.")
@@ -50,4 +52,7 @@
         if name is not None:
             self.name = name
+        description = testDescription(username, description, machine)
+        if description is not None:
+            self.description = description
         if memory is not None:
             self.memory = validMemory(self.owner, state, memory, machine,
@@ -270,4 +275,9 @@
     raise InvalidInput('name', name, "Name is already taken.")
 
+def testDescription(user, description, machine=None):
+    if description is None or description.strip() == '':
+        return None
+    return description.strip()
+
 def testHostname(user, hostname, machine):
     for nic in machine.nics:
