Merge "Remove use of "quota_tenant_usages" in Volumes page"
This commit is contained in:
commit
36cb07c721
|
@ -353,6 +353,7 @@ def volume_type_extra_delete(request, type_id, keys):
|
||||||
return vol_type.unset_keys([keys])
|
return vol_type.unset_keys([keys])
|
||||||
|
|
||||||
|
|
||||||
|
@memoized
|
||||||
def tenant_absolute_limits(request):
|
def tenant_absolute_limits(request):
|
||||||
limits = cinderclient(request).limits.get().absolute
|
limits = cinderclient(request).limits.get().absolute
|
||||||
limits_dict = {}
|
limits_dict = {}
|
||||||
|
|
|
@ -17,7 +17,6 @@ from mox import IsA # noqa
|
||||||
|
|
||||||
from openstack_dashboard import api
|
from openstack_dashboard import api
|
||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
from openstack_dashboard.usage import quotas
|
|
||||||
|
|
||||||
|
|
||||||
INDEX_URL = reverse('horizon:project:volumes:index')
|
INDEX_URL = reverse('horizon:project:volumes:index')
|
||||||
|
@ -58,8 +57,8 @@ class VolumeBackupsViewTests(test.TestCase):
|
||||||
'volume_list',
|
'volume_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',
|
'volume_backup_list',
|
||||||
'volume_backup_delete'),
|
'volume_backup_delete',
|
||||||
quotas: ('tenant_quota_usages',)})
|
'tenant_absolute_limits')})
|
||||||
def test_delete_volume_backup(self):
|
def test_delete_volume_backup(self):
|
||||||
vol_backups = self.cinder_volume_backups.list()
|
vol_backups = self.cinder_volume_backups.list()
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
|
@ -85,8 +84,8 @@ class VolumeBackupsViewTests(test.TestCase):
|
||||||
AndReturn(vol_backups)
|
AndReturn(vol_backups)
|
||||||
api.cinder.volume_list(IsA(http.HttpRequest)). \
|
api.cinder.volume_list(IsA(http.HttpRequest)). \
|
||||||
AndReturn(volumes)
|
AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes(). \
|
api.cinder.tenant_absolute_limits(IsA(http.HttpRequest))\
|
||||||
AndReturn(self.quota_usages.first())
|
.MultipleTimes().AndReturn(self.cinder_limits['absolute'])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
formData = {'action':
|
formData = {'action':
|
||||||
|
|
|
@ -106,12 +106,12 @@ class VolumeSnapshotsViewTests(test.TestCase):
|
||||||
self.assertRedirectsNoFollow(res, VOLUME_SNAPSHOTS_TAB_URL)
|
self.assertRedirectsNoFollow(res, VOLUME_SNAPSHOTS_TAB_URL)
|
||||||
|
|
||||||
@test.create_stubs({api.nova: ('server_list',),
|
@test.create_stubs({api.nova: ('server_list',),
|
||||||
api.cinder: ('volume_snapshot_list',
|
api.cinder: ('tenant_absolute_limits',
|
||||||
|
'volume_snapshot_list',
|
||||||
'volume_list',
|
'volume_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',
|
'volume_backup_list',
|
||||||
'volume_snapshot_delete'),
|
'volume_snapshot_delete')})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def test_delete_volume_snapshot(self):
|
def test_delete_volume_snapshot(self):
|
||||||
vol_snapshots = self.cinder_volume_snapshots.list()
|
vol_snapshots = self.cinder_volume_snapshots.list()
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
|
@ -138,8 +138,8 @@ class VolumeSnapshotsViewTests(test.TestCase):
|
||||||
AndReturn(vol_backups)
|
AndReturn(vol_backups)
|
||||||
api.cinder.volume_list(IsA(http.HttpRequest)). \
|
api.cinder.volume_list(IsA(http.HttpRequest)). \
|
||||||
AndReturn(volumes)
|
AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes(). \
|
api.cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes(). \
|
||||||
AndReturn(self.quota_usages.first())
|
AndReturn(self.cinder_limits['absolute'])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
formData = {'action':
|
formData = {'action':
|
||||||
|
|
|
@ -19,20 +19,19 @@ from mox import IsA # noqa
|
||||||
|
|
||||||
from openstack_dashboard import api
|
from openstack_dashboard import api
|
||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
from openstack_dashboard.usage import quotas
|
|
||||||
|
|
||||||
|
|
||||||
INDEX_URL = reverse('horizon:project:volumes:index')
|
INDEX_URL = reverse('horizon:project:volumes:index')
|
||||||
|
|
||||||
|
|
||||||
class VolumeAndSnapshotsTests(test.TestCase):
|
class VolumeAndSnapshotsTests(test.TestCase):
|
||||||
@test.create_stubs({api.cinder: ('volume_list',
|
@test.create_stubs({api.cinder: ('tenant_absolute_limits',
|
||||||
|
'volume_list',
|
||||||
'volume_snapshot_list',
|
'volume_snapshot_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',
|
'volume_backup_list',
|
||||||
),
|
),
|
||||||
api.nova: ('server_list',),
|
api.nova: ('server_list',)})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def _test_index(self, backup_supported=True):
|
def _test_index(self, backup_supported=True):
|
||||||
vol_backups = self.cinder_volume_backups.list()
|
vol_backups = self.cinder_volume_backups.list()
|
||||||
vol_snaps = self.cinder_volume_snapshots.list()
|
vol_snaps = self.cinder_volume_snapshots.list()
|
||||||
|
@ -51,8 +50,8 @@ class VolumeAndSnapshotsTests(test.TestCase):
|
||||||
api.cinder.volume_backup_list(IsA(http.HttpRequest)).\
|
api.cinder.volume_backup_list(IsA(http.HttpRequest)).\
|
||||||
AndReturn(vol_backups)
|
AndReturn(vol_backups)
|
||||||
api.cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
api.cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes(). \
|
api.cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes(). \
|
||||||
AndReturn(self.quota_usages.first())
|
AndReturn(self.cinder_limits['absolute'])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
res = self.client.get(INDEX_URL)
|
res = self.client.get(INDEX_URL)
|
||||||
|
|
|
@ -28,7 +28,6 @@ from horizon import tables
|
||||||
from openstack_dashboard import api
|
from openstack_dashboard import api
|
||||||
from openstack_dashboard.api import cinder
|
from openstack_dashboard.api import cinder
|
||||||
from openstack_dashboard import policy
|
from openstack_dashboard import policy
|
||||||
from openstack_dashboard.usage import quotas
|
|
||||||
|
|
||||||
|
|
||||||
DELETABLE_STATES = ("available", "error", "error_extending")
|
DELETABLE_STATES = ("available", "error", "error_extending")
|
||||||
|
@ -99,9 +98,14 @@ class CreateVolume(tables.LinkAction):
|
||||||
super(CreateVolume, self).__init__(attrs, **kwargs)
|
super(CreateVolume, self).__init__(attrs, **kwargs)
|
||||||
|
|
||||||
def allowed(self, request, volume=None):
|
def allowed(self, request, volume=None):
|
||||||
usages = quotas.tenant_quota_usages(request)
|
limits = api.cinder.tenant_absolute_limits(request)
|
||||||
if usages['gigabytes']['available'] <= 0 or\
|
|
||||||
usages['volumes']['available'] <= 0:
|
gb_available = (limits.get('maxTotalVolumeGigabytes', float("inf"))
|
||||||
|
- limits.get('totalGigabytesUsed', 0))
|
||||||
|
volumes_available = (limits.get('maxTotalVolumes', float("inf"))
|
||||||
|
- limits.get('totalVolumesUsed', 0))
|
||||||
|
|
||||||
|
if gb_available <= 0 or volumes_available <= 0:
|
||||||
if "disabled" not in self.classes:
|
if "disabled" not in self.classes:
|
||||||
self.classes = [c for c in self.classes] + ['disabled']
|
self.classes = [c for c in self.classes] + ['disabled']
|
||||||
self.verbose_name = string_concat(self.verbose_name, ' ',
|
self.verbose_name = string_concat(self.verbose_name, ' ',
|
||||||
|
|
|
@ -704,13 +704,13 @@ class VolumeViewTests(test.TestCase):
|
||||||
' volumes.']
|
' volumes.']
|
||||||
self.assertEqual(res.context['form'].errors['__all__'], expected_error)
|
self.assertEqual(res.context['form'].errors['__all__'], expected_error)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_list',
|
@test.create_stubs({cinder: ('tenant_absolute_limits',
|
||||||
|
'volume_list',
|
||||||
'volume_snapshot_list',
|
'volume_snapshot_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',
|
'volume_backup_list',
|
||||||
'volume_delete',),
|
'volume_delete',),
|
||||||
api.nova: ('server_list',),
|
api.nova: ('server_list',)})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def test_delete_volume(self):
|
def test_delete_volume(self):
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
volume = self.cinder_volumes.first()
|
volume = self.cinder_volumes.first()
|
||||||
|
@ -735,8 +735,8 @@ class VolumeViewTests(test.TestCase):
|
||||||
api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\
|
api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\
|
||||||
AndReturn([self.servers.list(), False])
|
AndReturn([self.servers.list(), False])
|
||||||
cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes().\
|
cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes().\
|
||||||
AndReturn(self.quota_usages.first())
|
AndReturn(self.cinder_limits['absolute'])
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
@ -745,13 +745,13 @@ class VolumeViewTests(test.TestCase):
|
||||||
self.assertIn("Scheduled deletion of Volume: Volume name",
|
self.assertIn("Scheduled deletion of Volume: Volume name",
|
||||||
[m.message for m in res.context['messages']])
|
[m.message for m in res.context['messages']])
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_list',
|
@test.create_stubs({cinder: ('tenant_absolute_limits',
|
||||||
|
'volume_list',
|
||||||
'volume_snapshot_list',
|
'volume_snapshot_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',
|
'volume_backup_list',
|
||||||
'volume_delete',),
|
'volume_delete',),
|
||||||
api.nova: ('server_list',),
|
api.nova: ('server_list',)})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def test_delete_volume_error_existing_snapshot(self):
|
def test_delete_volume_error_existing_snapshot(self):
|
||||||
volume = self.cinder_volumes.first()
|
volume = self.cinder_volumes.first()
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
|
@ -779,9 +779,8 @@ class VolumeViewTests(test.TestCase):
|
||||||
AndReturn(self.cinder_volume_backups.list())
|
AndReturn(self.cinder_volume_backups.list())
|
||||||
cinder.volume_list(IsA(http.HttpRequest)).\
|
cinder.volume_list(IsA(http.HttpRequest)).\
|
||||||
AndReturn(volumes)
|
AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes().\
|
cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes().\
|
||||||
AndReturn(self.quota_usages.first())
|
AndReturn(self.cinder_limits['absolute'])
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
url = VOLUME_INDEX_URL
|
url = VOLUME_INDEX_URL
|
||||||
|
@ -845,8 +844,7 @@ class VolumeViewTests(test.TestCase):
|
||||||
widgets.HiddenInput))
|
widgets.HiddenInput))
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_get',),
|
@test.create_stubs({cinder: ('volume_get',),
|
||||||
api.nova: ('server_get', 'server_list',),
|
api.nova: ('server_list',)})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def test_edit_attachments_attached_volume(self):
|
def test_edit_attachments_attached_volume(self):
|
||||||
servers = [s for s in self.servers.list()
|
servers = [s for s in self.servers.list()
|
||||||
if s.tenant_id == self.request.user.tenant_id]
|
if s.tenant_id == self.request.user.tenant_id]
|
||||||
|
@ -872,15 +870,15 @@ class VolumeViewTests(test.TestCase):
|
||||||
server.id)
|
server.id)
|
||||||
self.assertEqual(res.status_code, 200)
|
self.assertEqual(res.status_code, 200)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_list',
|
@test.create_stubs({cinder: ('tenant_absolute_limits',
|
||||||
|
'volume_list',
|
||||||
'volume_snapshot_list',
|
'volume_snapshot_list',
|
||||||
'volume_backup_supported',
|
'volume_backup_supported',
|
||||||
'volume_backup_list',),
|
'volume_backup_list',),
|
||||||
api.nova: ('server_list',),
|
api.nova: ('server_list',)})
|
||||||
quotas: ('tenant_quota_usages',)})
|
|
||||||
def test_create_button_disabled_when_quota_exceeded(self):
|
def test_create_button_disabled_when_quota_exceeded(self):
|
||||||
quota_usages = self.quota_usages.first()
|
limits = self.cinder_limits['absolute']
|
||||||
quota_usages['volumes']['available'] = 0
|
limits['totalVolumesUsed'] = limits['maxTotalVolumes']
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
|
|
||||||
api.cinder.volume_backup_supported(IsA(http.HttpRequest)). \
|
api.cinder.volume_backup_supported(IsA(http.HttpRequest)). \
|
||||||
|
@ -895,9 +893,8 @@ class VolumeViewTests(test.TestCase):
|
||||||
cinder.volume_backup_list(IsA(http.HttpRequest))\
|
cinder.volume_backup_list(IsA(http.HttpRequest))\
|
||||||
.AndReturn(self.cinder_volume_backups.list())
|
.AndReturn(self.cinder_volume_backups.list())
|
||||||
cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
cinder.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest))\
|
cinder.tenant_absolute_limits(IsA(http.HttpRequest))\
|
||||||
.MultipleTimes().AndReturn(quota_usages)
|
.MultipleTimes().AndReturn(limits)
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
res = self.client.get(VOLUME_INDEX_URL)
|
res = self.client.get(VOLUME_INDEX_URL)
|
||||||
|
@ -1066,14 +1063,14 @@ class VolumeViewTests(test.TestCase):
|
||||||
self._test_encryption(True)
|
self._test_encryption(True)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_list', 'volume_snapshot_list',
|
@test.create_stubs({cinder: ('volume_list', 'volume_snapshot_list',
|
||||||
'volume_backup_supported'),
|
'volume_backup_supported',
|
||||||
api.nova: ('server_list',),
|
'tenant_absolute_limits'),
|
||||||
quotas: ('tenant_quota_usages',)})
|
api.nova: ('server_list',)})
|
||||||
def _test_encryption(self, encryption):
|
def _test_encryption(self, encryption):
|
||||||
volumes = self.volumes.list()
|
volumes = self.volumes.list()
|
||||||
for volume in volumes:
|
for volume in volumes:
|
||||||
volume.encrypted = encryption
|
volume.encrypted = encryption
|
||||||
quota_usages = self.quota_usages.first()
|
limits = self.cinder_limits['absolute']
|
||||||
|
|
||||||
cinder.volume_backup_supported(IsA(http.HttpRequest))\
|
cinder.volume_backup_supported(IsA(http.HttpRequest))\
|
||||||
.MultipleTimes().AndReturn(False)
|
.MultipleTimes().AndReturn(False)
|
||||||
|
@ -1083,8 +1080,8 @@ class VolumeViewTests(test.TestCase):
|
||||||
cinder.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([])
|
cinder.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([])
|
||||||
api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\
|
api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\
|
||||||
.AndReturn([self.servers.list(), False])
|
.AndReturn([self.servers.list(), False])
|
||||||
quotas.tenant_quota_usages(IsA(http.HttpRequest))\
|
cinder.tenant_absolute_limits(IsA(http.HttpRequest))\
|
||||||
.MultipleTimes().AndReturn(quota_usages)
|
.MultipleTimes().AndReturn(limits)
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue