Check if volume service is enabled in quota update
Quotas fail to load on the project quota update form in the admin dashboard when the volume service is disabled. Change the get_default_quota_data and get_tenant_quota_data functions to always check for a disabled volume service, so we don't have to remember to do it every time we call the functions. Moved *QUOTA_FIELDS to usage/quotas.py to avoid a circular import. Fixes bug #1155878. Change-Id: I7150c4d7c318b6199ff03825cf5d770c7741b379
This commit is contained in:
parent
6a2c1763d4
commit
1935a3d8d2
@ -23,8 +23,6 @@ from openstack_dashboard.api import keystone
|
||||
from openstack_dashboard.usage import quotas
|
||||
from .tables import QuotasTable, ServicesTable
|
||||
from openstack_dashboard.api.base import is_service_enabled
|
||||
from openstack_dashboard.dashboards.admin.projects.workflows import \
|
||||
CINDER_QUOTA_FIELDS
|
||||
|
||||
|
||||
class DefaultQuotasTab(tabs.TableTab):
|
||||
@ -35,11 +33,8 @@ class DefaultQuotasTab(tabs.TableTab):
|
||||
|
||||
def get_quotas_data(self):
|
||||
request = self.tab_group.request
|
||||
disabled_quotas = []
|
||||
if not is_service_enabled(self.request, 'volume'):
|
||||
disabled_quotas.extend(CINDER_QUOTA_FIELDS)
|
||||
try:
|
||||
quota_set = quotas.get_default_quota_data(request, disabled_quotas)
|
||||
quota_set = quotas.get_default_quota_data(request)
|
||||
data = quota_set.items
|
||||
except:
|
||||
data = []
|
||||
|
@ -26,9 +26,7 @@ from horizon import exceptions
|
||||
from openstack_dashboard import api
|
||||
from openstack_dashboard.test import helpers as test
|
||||
from openstack_dashboard.usage import quotas
|
||||
from .workflows import CreateProject, UpdateProject, NOVA_QUOTA_FIELDS, \
|
||||
CINDER_QUOTA_FIELDS
|
||||
from .views import QUOTA_FIELDS
|
||||
from .workflows import CreateProject, UpdateProject
|
||||
|
||||
INDEX_URL = reverse('horizon:admin:projects:index')
|
||||
|
||||
@ -60,7 +58,7 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
|
||||
def _get_quota_info(self, quota):
|
||||
quota_data = {}
|
||||
for field in QUOTA_FIELDS:
|
||||
for field in quotas.QUOTA_FIELDS:
|
||||
quota_data[field] = int(quota.get(field).limit)
|
||||
return quota_data
|
||||
|
||||
@ -153,12 +151,12 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
role_id=role.id)
|
||||
|
||||
nova_updated_quota = dict([(key, quota_data[key]) for key in
|
||||
NOVA_QUOTA_FIELDS])
|
||||
quotas.NOVA_QUOTA_FIELDS])
|
||||
api.nova.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**nova_updated_quota)
|
||||
cinder_updated_quota = dict([(key, quota_data[key]) for key in
|
||||
CINDER_QUOTA_FIELDS])
|
||||
quotas.CINDER_QUOTA_FIELDS])
|
||||
api.cinder.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**cinder_updated_quota)
|
||||
@ -283,7 +281,7 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
role_id=role.id)
|
||||
|
||||
nova_updated_quota = dict([(key, quota_data[key]) for key in
|
||||
NOVA_QUOTA_FIELDS])
|
||||
quotas.NOVA_QUOTA_FIELDS])
|
||||
api.nova.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**nova_updated_quota) \
|
||||
@ -348,13 +346,13 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
break
|
||||
|
||||
nova_updated_quota = dict([(key, quota_data[key]) for key in
|
||||
NOVA_QUOTA_FIELDS])
|
||||
quotas.NOVA_QUOTA_FIELDS])
|
||||
api.nova.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**nova_updated_quota)
|
||||
|
||||
cinder_updated_quota = dict([(key, quota_data[key]) for key in
|
||||
CINDER_QUOTA_FIELDS])
|
||||
quotas.CINDER_QUOTA_FIELDS])
|
||||
api.cinder.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**cinder_updated_quota)
|
||||
@ -405,7 +403,7 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
def _get_quota_info(self, quota):
|
||||
quota_data = {}
|
||||
for field in QUOTA_FIELDS:
|
||||
for field in quotas.QUOTA_FIELDS:
|
||||
quota_data[field] = int(quota.get(field).limit)
|
||||
return quota_data
|
||||
|
||||
@ -561,13 +559,13 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
role_id='1')
|
||||
|
||||
nova_updated_quota = dict([(key, updated_quota[key]) for key in
|
||||
NOVA_QUOTA_FIELDS])
|
||||
quotas.NOVA_QUOTA_FIELDS])
|
||||
api.nova.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**nova_updated_quota)
|
||||
|
||||
cinder_updated_quota = dict([(key, updated_quota[key]) for key in
|
||||
CINDER_QUOTA_FIELDS])
|
||||
quotas.CINDER_QUOTA_FIELDS])
|
||||
api.cinder.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**cinder_updated_quota)
|
||||
@ -763,7 +761,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
||||
role_id='2')
|
||||
|
||||
nova_updated_quota = dict([(key, updated_quota[key]) for key in
|
||||
NOVA_QUOTA_FIELDS])
|
||||
quotas.NOVA_QUOTA_FIELDS])
|
||||
api.nova.tenant_quota_update(IsA(http.HttpRequest),
|
||||
project.id,
|
||||
**nova_updated_quota) \
|
||||
|
@ -33,7 +33,7 @@ from openstack_dashboard.usage import quotas
|
||||
from openstack_dashboard.dashboards.admin.users.views import CreateView
|
||||
from .forms import CreateUser
|
||||
from .tables import TenantsTable, TenantUsersTable, AddUsersTable
|
||||
from .workflows import CreateProject, UpdateProject, QUOTA_FIELDS
|
||||
from .workflows import CreateProject, UpdateProject
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -136,7 +136,7 @@ class CreateProjectView(workflows.WorkflowView):
|
||||
# get initial quota defaults
|
||||
try:
|
||||
quota_defaults = quotas.get_default_quota_data(self.request)
|
||||
for field in QUOTA_FIELDS:
|
||||
for field in quotas.QUOTA_FIELDS:
|
||||
initial[field] = quota_defaults.get(field).limit
|
||||
|
||||
except:
|
||||
@ -166,7 +166,7 @@ class UpdateProjectView(workflows.WorkflowView):
|
||||
# get initial project quota
|
||||
quota_data = quotas.get_tenant_quota_data(self.request,
|
||||
tenant_id=project_id)
|
||||
for field in QUOTA_FIELDS:
|
||||
for field in quotas.QUOTA_FIELDS:
|
||||
initial[field] = quota_data.get(field).limit
|
||||
except:
|
||||
exceptions.handle(self.request,
|
||||
|
@ -31,25 +31,14 @@ from horizon import messages
|
||||
from openstack_dashboard import api
|
||||
from openstack_dashboard.api import cinder, nova
|
||||
from openstack_dashboard.api.base import is_service_enabled
|
||||
from openstack_dashboard.usage.quotas import (NOVA_QUOTA_FIELDS,
|
||||
CINDER_QUOTA_FIELDS,
|
||||
QUOTA_FIELDS,
|
||||
get_disabled_quotas)
|
||||
|
||||
INDEX_URL = "horizon:admin:projects:index"
|
||||
ADD_USER_URL = "horizon:admin:projects:create_user"
|
||||
|
||||
NOVA_QUOTA_FIELDS = ("metadata_items",
|
||||
"cores",
|
||||
"instances",
|
||||
"injected_files",
|
||||
"injected_file_content_bytes",
|
||||
"ram",
|
||||
"floating_ips",
|
||||
"security_groups",
|
||||
"security_group_rules",)
|
||||
|
||||
CINDER_QUOTA_FIELDS = ("volumes",
|
||||
"gigabytes",)
|
||||
|
||||
QUOTA_FIELDS = NOVA_QUOTA_FIELDS + CINDER_QUOTA_FIELDS
|
||||
|
||||
|
||||
class UpdateProjectQuotaAction(workflows.Action):
|
||||
ifcb_label = _("Injected File Content Bytes")
|
||||
@ -70,6 +59,16 @@ class UpdateProjectQuotaAction(workflows.Action):
|
||||
security_group_rules = forms.IntegerField(min_value=-1,
|
||||
label=_("Security Group Rules"))
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(UpdateProjectQuotaAction, self).__init__(request,
|
||||
*args,
|
||||
**kwargs)
|
||||
disabled_quotas = get_disabled_quotas(request)
|
||||
for field in disabled_quotas:
|
||||
if field in self.fields:
|
||||
self.fields[field].required = False
|
||||
self.fields[field].widget = forms.HiddenInput()
|
||||
|
||||
class Meta:
|
||||
name = _("Quota")
|
||||
slug = 'update_quotas'
|
||||
|
@ -6,8 +6,21 @@ from horizon.utils.memoized import memoized
|
||||
|
||||
from openstack_dashboard.api import nova, cinder, network
|
||||
from openstack_dashboard.api.base import is_service_enabled, QuotaSet
|
||||
from openstack_dashboard.dashboards.admin.projects.workflows import \
|
||||
CINDER_QUOTA_FIELDS
|
||||
|
||||
NOVA_QUOTA_FIELDS = ("metadata_items",
|
||||
"cores",
|
||||
"instances",
|
||||
"injected_files",
|
||||
"injected_file_content_bytes",
|
||||
"ram",
|
||||
"floating_ips",
|
||||
"security_groups",
|
||||
"security_group_rules",)
|
||||
|
||||
CINDER_QUOTA_FIELDS = ("volumes",
|
||||
"gigabytes",)
|
||||
|
||||
QUOTA_FIELDS = NOVA_QUOTA_FIELDS + CINDER_QUOTA_FIELDS
|
||||
|
||||
|
||||
class QuotaUsage(dict):
|
||||
@ -54,12 +67,15 @@ class QuotaUsage(dict):
|
||||
self.usages[name]['available'] = available
|
||||
|
||||
|
||||
def _get_quota_data(request, method_name, disabled_quotas=[], tenant_id=None):
|
||||
def _get_quota_data(request, method_name, disabled_quotas=None,
|
||||
tenant_id=None):
|
||||
quotasets = []
|
||||
if not tenant_id:
|
||||
tenant_id = request.user.tenant_id
|
||||
quotasets.append(getattr(nova, method_name)(request, tenant_id))
|
||||
qs = QuotaSet()
|
||||
if disabled_quotas is None:
|
||||
disabled_quotas = get_disabled_quotas(request)
|
||||
if 'volumes' not in disabled_quotas:
|
||||
quotasets.append(getattr(cinder, method_name)(request, tenant_id))
|
||||
for quota in itertools.chain(*quotasets):
|
||||
@ -68,29 +84,35 @@ def _get_quota_data(request, method_name, disabled_quotas=[], tenant_id=None):
|
||||
return qs
|
||||
|
||||
|
||||
def get_default_quota_data(request, disabled_quotas=[], tenant_id=None):
|
||||
def get_default_quota_data(request, disabled_quotas=None, tenant_id=None):
|
||||
return _get_quota_data(request,
|
||||
"default_quota_get",
|
||||
disabled_quotas,
|
||||
tenant_id)
|
||||
disabled_quotas=disabled_quotas,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
|
||||
def get_tenant_quota_data(request, disabled_quotas=[], tenant_id=None):
|
||||
def get_tenant_quota_data(request, disabled_quotas=None, tenant_id=None):
|
||||
return _get_quota_data(request,
|
||||
"tenant_quota_get",
|
||||
disabled_quotas,
|
||||
tenant_id)
|
||||
disabled_quotas=disabled_quotas,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
|
||||
def get_disabled_quotas(request):
|
||||
disabled_quotas = []
|
||||
if not is_service_enabled(request, 'volume'):
|
||||
disabled_quotas.extend(CINDER_QUOTA_FIELDS)
|
||||
return disabled_quotas
|
||||
|
||||
|
||||
@memoized
|
||||
def tenant_quota_usages(request):
|
||||
# Get our quotas and construct our usage object.
|
||||
disabled_quotas = []
|
||||
if not is_service_enabled(request, 'volume'):
|
||||
disabled_quotas.extend(CINDER_QUOTA_FIELDS)
|
||||
disabled_quotas = get_disabled_quotas(request)
|
||||
|
||||
usages = QuotaUsage()
|
||||
for quota in get_tenant_quota_data(request, disabled_quotas):
|
||||
for quota in get_tenant_quota_data(request,
|
||||
disabled_quotas=disabled_quotas):
|
||||
usages.add_quota(quota)
|
||||
|
||||
# Get our usages.
|
||||
|
Loading…
Reference in New Issue
Block a user