X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/eabe84bd3f3ea514893ec700d598a06c2418f37e..refs/heads/mitchb:/code/validation.py diff --git a/code/validation.py b/code/validation.py index 18666be..da01d8d 100755 --- a/code/validation.py +++ b/code/validation.py @@ -99,18 +99,26 @@ def maxDisk(owner, 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. + return the maximum that a given machine can be changed to. If the + disk currently exceeds the quotas, it can be changed to anything up + to its current size. """ (quota_total, quota_single) = Owner.getDiskQuotas(machine.owner if machine else owner) - if machine is not None: + machine_id, current_size = None, 0 + if machine is not None and machine.disks: machine_id = machine.machine_id - else: - machine_id = None - disk_usage = Disk.query.filter(Disk.c.machine_id != machine_id).\ - join('machine').\ - filter_by(owner=owner).sum(Disk.c.size) or 0 - return min(quota_single, quota_total-disk_usage/1024.) + # XXX The machine modification form doesn't currently handle the + # case of machines with multiple disks. It simply addresses the "first" + # disk (which is possibly nondeterministic and wrong). Since we're + # doing validation for that form, we have to use the same logic it + # does. + current_size = machine.disks[0].size / 1024. + disk_usage_query = Disk.query.filter(Disk.machine_id != machine_id).\ + join('machine').filter_by(owner=owner) + + disk_usage = sum([m.size for m in disk_usage_query]) or 0 + return max(current_size, min(quota_single, quota_total-disk_usage/1024.)) def cantAddVm(owner, g): machines = getMachinesByOwner(owner) @@ -243,7 +251,8 @@ def testOwner(user, owner, machine=None): try: if user not in authz.expandOwner(owner): raise InvalidInput('owner', owner, 'You do not have access to the ' - + owner + ' locker') + + owner + ' locker (Is system:anyuser missing ' + + 'the l permission?)') except getafsgroups.AfsProcessError, e: raise InvalidInput('owner', owner, str(e)) return owner