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
 
 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
 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>'
 
     else:
         return '<p>STDERR:</p><pre>' + str(addition) + '</pre>'
 
+Template.sipb_xen_database = sipb_xen_database
 Template.helppopup = staticmethod(helppopup)
 Template.err = None
 
 Template.helppopup = staticmethod(helppopup)
 Template.err = None
 
@@ -97,8 +99,8 @@ class Defaults:
     disk = 4.0
     cdrom = ''
     name = ''
     disk = 4.0
     cdrom = ''
     name = ''
-    vmtype = 'hvm'
     def __init__(self, max_memory=None, max_disk=None, **kws):
     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:
         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
 
             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)
         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()
     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')
         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
 
 </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
 #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
 #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>
 <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)
 #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>
     <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)
          <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>
 $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.
 
 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.
     """
     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.
 
 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
     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 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])
     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:
         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,
                            "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):
     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)
         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.
 
 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:
     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)
                            "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
         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.
 
 def testOwner(user, owner, machine=None):
     """Determine whether a user can set the owner of a machine to this value.