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
else:
return '<p>STDERR:</p><pre>' + str(addition) + '</pre>'
+Template.sipb_xen_database = sipb_xen_database
Template.helppopup = staticmethod(helppopup)
Template.err = None
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:
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)
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')
</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
#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>
#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>
<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>
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.
"""
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
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])
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,
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.
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)
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.