Support setting paravm/hvm for off, but already created, VMs.
authorEric Price <ecprice@mit.edu>
Tue, 22 Apr 2008 01:13:53 +0000 (21:13 -0400)
committerEric Price <ecprice@mit.edu>
Tue, 22 Apr 2008 01:13:53 +0000 (21:13 -0400)
svn path=/trunk/packages/sipb-xen-www/; revision=440

code/main.py
code/templates/functions.tmpl
code/templates/info.tmpl
code/templates/list.tmpl
code/validation.py

index 9caf7c4..f1ff5ac 100755 (executable)
@@ -36,7 +36,8 @@ sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages')
 
 import templates
 from Cheetah.Template import Template
-from sipb_xen_database import Machine, CDROM, ctx, connect, MachineAccess
+import sipb_xen_database
+from sipb_xen_database import Machine, CDROM, ctx, connect, MachineAccess, Type
 import validation
 from webcommon import InvalidInput, CodeError, g
 import controls
@@ -71,6 +72,7 @@ def makeErrorPre(old, addition):
     else:
         return '<p>STDERR:</p><pre>' + str(addition) + '</pre>'
 
+Template.sipb_xen_database = sipb_xen_database
 Template.helppopup = staticmethod(helppopup)
 Template.err = None
 
@@ -97,8 +99,8 @@ class Defaults:
     disk = 4.0
     cdrom = ''
     name = ''
-    vmtype = 'hvm'
     def __init__(self, max_memory=None, max_disk=None, **kws):
+        self.type = Type.get('linux-hvm')
         if max_memory is not None:
             self.memory = min(self.memory, max_memory)
         if max_disk is not None:
@@ -379,6 +381,10 @@ def modifyDict(user, fields):
             memory = validation.validMemory(user, memory, machine, on=False)
             machine.memory = memory
 
+        vm_type = validation.validVmType(fields.getfirst('vmtype'))
+        if vm_type is not None:
+            machine.type = vm_type
+
         disksize = validation.testDisk(user, fields.getfirst('disk'))
         if disksize is not None:
             disksize = validation.validDisk(user, disksize, machine)
@@ -560,7 +566,7 @@ def infoDict(user, machine):
     checkpoint.checkpoint('Got mem')
     max_disk = validation.maxDisk(user, machine)
     defaults = Defaults()
-    for name in 'machine_id name administrator owner memory contact'.split():
+    for name in 'machine_id name administrator owner memory contact type'.split():
         setattr(defaults, name, getattr(machine, name))
     defaults.disk = "%0.2f" % (machine.disks[0].size/1024.)
     checkpoint.checkpoint('Got defaults')
index 7b917b0..c3aa050 100644 (file)
 </select>
 #end def
 
+#def vmTypeList($default=None)
+#for $vmtype in $sipb_xen_database.Type.select()
+<label>
+   <input #slurp
+#if $default == $vmtype then 'checked' else ''
+ type="radio" name="vmtype" value="${vmtype.type_id}">${vmtype.description}</input>
+</label>
+#end for
+#end def
+
 #def addError(txt)
 #if $varExists('txt')
 #set global $error_text = $error_text + '----\n' + $txt
index 3dc1b37..743034f 100644 (file)
@@ -58,7 +58,6 @@ Info on $machine.name
 #if $on
 (To edit ram, disk size, or machine name, turn off the machine first.)
 #end if
-</p>
 <form action="modify" method="POST">
   <input type="hidden" name="machine_id" value="$defaults.machine_id"/>
   <table>
@@ -71,6 +70,10 @@ $errorRow('contact', $err)
 #if not $on
     <tr><td>Machine Name:</td><td><input type="text" name="name" value="$defaults.name"/></td></tr>
 $errorRow('name', $err)
+    <tr>
+      <td>HVM/ParaVM$helppopup('hvm_paravm')</td>
+      <td>$vmTypeList($defaults.type)</td>
+    </tr>
     <tr><td>Ram:</td><td><input type="text" size=3 name="memory" value="$defaults.memory"/>MiB (max $max_mem)</td></tr>
 $errorRow('memory', $err)
     <tr><td>Disk:</td><td><input type="text" size=3 name="disk" value="$defaults.disk"/>GiB (max $max_disk)</td><td>WARNING: Modifying disk size may corrupt your data.</td></tr>
index 7611329..5c0bc74 100644 (file)
@@ -35,16 +35,10 @@ $errorRow('memory', $err)
          <td><input type="text" name="disk" value="$defaults.disk" size=3/> GiB (${"%0.1f" % ($max_disk-0.05)} max)</td>
        </tr>
 $errorRow('disk', $err)
-       <tr>
-         <td>HVM/ParaVM$helppopup('hvm_paravm')</td>
-         <td>
-#for $value, $name in (('hvm', 'HVM'), ('paravm', 'ParaVM'))
-   <input #slurp
-#if $defaults.vmtype == $value then 'checked' else ''
- type="radio" name="vmtype" value="$value">$name</input>
-#end for
-         </td>
-       </tr>
+        <tr>
+          <td>HVM/ParaVM$helppopup('hvm_paravm')</td>
+          <td>$vmTypeList($defaults.type)</td>
+        </tr>
 $errorRow('vmtype', $err)
        <tr>
          <td>Boot CD</td>
index a2e19fe..97a8819 100644 (file)
@@ -18,7 +18,7 @@ MAX_VMS_ACTIVE = 4
 
 def getMachinesByOwner(user, machine=None):
     """Return the machines owned by the same as a machine.
-    
+
     If the machine is None, return the machines owned by the same
     user.
     """
@@ -31,7 +31,7 @@ def getMachinesByOwner(user, machine=None):
 def maxMemory(user, machine=None, on=True):
     """Return the maximum memory for a machine or a user.
 
-    If machine is None, return the memory available for a new 
+    If machine is None, return the memory available for a new
     machine.  Else, return the maximum that machine can have.
 
     on is whether the machine should be turned on.  If false, the max
@@ -49,6 +49,11 @@ def maxMemory(user, machine=None, on=True):
     return min(MAX_MEMORY_SINGLE, MAX_MEMORY_TOTAL-mem_usage)
 
 def maxDisk(user, machine=None):
+    """Return the maximum disk that a machine can reach.
+
+    If machine is None, the maximum disk for a new machine. Otherwise,
+    return the maximum that a given machine can be changed to.
+    """
     machines = getMachinesByOwner(user, machine)
     disk_usage = sum([sum([y.size for y in x.disks])
                       for x in machines if x != machine])
@@ -101,7 +106,7 @@ def validMemory(user, memory, machine=None, on=True):
         if memory < MIN_MEMORY_SINGLE:
             raise ValueError
     except ValueError:
-        raise InvalidInput('memory', memory, 
+        raise InvalidInput('memory', memory,
                            "Minimum %s MiB" % MIN_MEMORY_SINGLE)
     if memory > maxMemory(user, machine, on):
         raise InvalidInput('memory', memory,
@@ -125,12 +130,12 @@ def validDisk(user, disk, machine=None):
     return disk
 
 def validVmType(vm_type):
-    if vm_type == 'hvm':
-        return Type.get('linux-hvm')
-    elif vm_type == 'paravm':
-        return Type.get('linux')
-    else:
+    if vm_type is None:
+        return None
+    t = Type.get(vm_type)
+    if t is None:
         raise CodeError("Invalid vm type '%s'"  % vm_type)
+    return t
 
 def testMachineId(user, machine_id, exists=True):
     """Parse, validate and check authorization for a given user and machine.
@@ -138,7 +143,7 @@ def testMachineId(user, machine_id, exists=True):
     If exists is False, don't check that it exists.
     """
     if machine_id is None:
-        raise InvalidInput('machine_id', machine_id, 
+        raise InvalidInput('machine_id', machine_id,
                            "Must specify a machine ID.")
     try:
         machine_id = int(machine_id)
@@ -176,7 +181,7 @@ def testAdmin(user, admin, machine):
         raise InvalidInput('administrator', admin, errmsg)
     #XXX Should we require that user is in the admin group?
     return admin
-    
+
 def testOwner(user, owner, machine=None):
     """Determine whether a user can set the owner of a machine to this value.