Remove overrides reference from Manila-UI plug-in
Plug-ins should not be using the "customization_module" override mechanism to change default Horizon behavior. Any "override" code should live with the __init__.py file of the appropriate plug-in directory. Change-Id: Idc2c66e2994780298725535f00184d4e3f2f6bb9 Closes-Bug: #1485112
This commit is contained in:
parent
8fe95c64e8
commit
871f5ce4eb
@ -0,0 +1,332 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import functools
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
import horizon
|
||||||
|
|
||||||
|
from manila_ui.api import manila
|
||||||
|
|
||||||
|
from openstack_dashboard.api import base
|
||||||
|
from openstack_dashboard.dashboards.admin.defaults import tables as quota_tbl
|
||||||
|
from openstack_dashboard.dashboards.admin.defaults import views \
|
||||||
|
as default_views
|
||||||
|
from openstack_dashboard.dashboards.admin.defaults import workflows \
|
||||||
|
as default_workflows
|
||||||
|
from openstack_dashboard.dashboards.identity.projects import views \
|
||||||
|
as project_views
|
||||||
|
from openstack_dashboard.dashboards.identity.projects import workflows \
|
||||||
|
as project_workflows
|
||||||
|
from openstack_dashboard.dashboards.project.overview import views \
|
||||||
|
as overview_views
|
||||||
|
from openstack_dashboard.usage import base as usage_base
|
||||||
|
from openstack_dashboard.usage import quotas
|
||||||
|
|
||||||
|
|
||||||
|
def wrap(orig_func):
|
||||||
|
"""decorator to wrap an existing function
|
||||||
|
Modified post from http://downgra.de/2009/05/16/python-monkey-patching/
|
||||||
|
to work with functions
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
@wrap(quotas.tenant_limit_usages)
|
||||||
|
def tenant_limit_usages(orig, self):
|
||||||
|
limits = orig(request)
|
||||||
|
limits['disksUsed'] = 100
|
||||||
|
return limits
|
||||||
|
|
||||||
|
the first parameter of the new function is the the original,
|
||||||
|
overwritten function ('orig').
|
||||||
|
"""
|
||||||
|
|
||||||
|
def outer(new_func):
|
||||||
|
@functools.wraps(orig_func)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
return new_func(orig_func, *args, **kwargs)
|
||||||
|
# Replace the original function in the module with the wrapper
|
||||||
|
orig_module = sys.modules[orig_func.__module__]
|
||||||
|
setattr(orig_module, orig_func.__name__, wrapper)
|
||||||
|
return wrapper
|
||||||
|
return outer
|
||||||
|
|
||||||
|
|
||||||
|
# All public methods in openstack_dashboard.usage.quotas are hardcoded to
|
||||||
|
# only look at a fixed set of services (nova, cinder, etc.). In order to
|
||||||
|
# incorporate manila quotas and usage, all public functions must be
|
||||||
|
# monkey-patched to add that information in.
|
||||||
|
|
||||||
|
MANILA_QUOTA_FIELDS = (
|
||||||
|
"shares",
|
||||||
|
"snapshots",
|
||||||
|
"gigabytes",
|
||||||
|
"share_networks",
|
||||||
|
)
|
||||||
|
MANILA_QUOTA_NAMES = {
|
||||||
|
'shares': _('Shares'),
|
||||||
|
'share_networks': _('Shares Networks'),
|
||||||
|
}
|
||||||
|
|
||||||
|
quotas.QUOTA_FIELDS = quotas.QUOTA_FIELDS + MANILA_QUOTA_FIELDS
|
||||||
|
|
||||||
|
|
||||||
|
def _get_manila_disabled_quotas(request):
|
||||||
|
disabled_quotas = []
|
||||||
|
if not base.is_service_enabled(request, 'share'):
|
||||||
|
disabled_quotas.extend(MANILA_QUOTA_FIELDS)
|
||||||
|
|
||||||
|
return disabled_quotas
|
||||||
|
|
||||||
|
|
||||||
|
def _get_manila_quota_data(request, method_name, disabled_quotas=None,
|
||||||
|
tenant_id=None):
|
||||||
|
if not tenant_id:
|
||||||
|
tenant_id = request.user.tenant_id
|
||||||
|
if disabled_quotas is None:
|
||||||
|
disabled_quotas = _get_manila_disabled_quotas(request)
|
||||||
|
if 'shares' not in disabled_quotas:
|
||||||
|
return getattr(manila, method_name)(request, tenant_id)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quotas.get_default_quota_data)
|
||||||
|
def get_default_quota_data(f, request, disabled_quotas=None, tenant_id=None):
|
||||||
|
qs = f(request, disabled_quotas, tenant_id)
|
||||||
|
manila_quota = _get_manila_quota_data(request, "default_quota_get",
|
||||||
|
disabled_quotas=disabled_quotas,
|
||||||
|
tenant_id=tenant_id)
|
||||||
|
if manila_quota:
|
||||||
|
qs.add(manila_quota)
|
||||||
|
return qs
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quotas.get_tenant_quota_data)
|
||||||
|
def get_tenant_quota_data(f, request, disabled_quotas=None, tenant_id=None):
|
||||||
|
qs = f(request, disabled_quotas, tenant_id)
|
||||||
|
manila_quota = _get_manila_quota_data(request, "tenant_quota_get",
|
||||||
|
disabled_quotas=disabled_quotas,
|
||||||
|
tenant_id=tenant_id)
|
||||||
|
if manila_quota:
|
||||||
|
qs.add(manila_quota)
|
||||||
|
return qs
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quotas.get_disabled_quotas)
|
||||||
|
def get_disabled_quotas(f, request):
|
||||||
|
disabled_quotas = f(request)
|
||||||
|
disabled_quotas.extend(_get_manila_disabled_quotas(request))
|
||||||
|
return disabled_quotas
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quotas.tenant_quota_usages)
|
||||||
|
def tenant_quota_usages(f, request, tenant_id=None):
|
||||||
|
|
||||||
|
usages = f(request, tenant_id)
|
||||||
|
|
||||||
|
if 'shares' not in _get_manila_disabled_quotas(request):
|
||||||
|
shares = manila.share_list(request)
|
||||||
|
snapshots = manila.share_snapshot_list(request)
|
||||||
|
sn_l = manila.share_network_list(request)
|
||||||
|
gig_s = sum([int(v.size) for v in shares])
|
||||||
|
gig_ss = sum([int(v.size) for v in snapshots])
|
||||||
|
usages.tally('gigabytes', gig_s + gig_ss)
|
||||||
|
usages.tally('shares', len(shares))
|
||||||
|
usages.tally('snapshots', len(snapshots))
|
||||||
|
usages.tally('share_networks', len(sn_l))
|
||||||
|
|
||||||
|
return usages
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quotas.tenant_limit_usages)
|
||||||
|
def tenant_limit_usages(f, request):
|
||||||
|
|
||||||
|
limits = f(request)
|
||||||
|
|
||||||
|
if base.is_service_enabled(request, 'share'):
|
||||||
|
try:
|
||||||
|
limits.update(manila.tenant_absolute_limits(request))
|
||||||
|
shares = manila.share_list(request)
|
||||||
|
snapshots = manila.share_snapshot_list(request)
|
||||||
|
total_s_size = sum([getattr(share, 'size', 0) for share in shares])
|
||||||
|
total_ss_size = sum([getattr(ss, 'size', 0) for ss in snapshots])
|
||||||
|
limits['totalGigabytesUsed'] = total_s_size + total_ss_size
|
||||||
|
limits['totalSharesUsed'] = len(shares)
|
||||||
|
limits['totalSnapshotsUsed'] = len(snapshots)
|
||||||
|
except Exception:
|
||||||
|
msg = _("Unable to retrieve share limit information.")
|
||||||
|
horizon.exceptions.handle(request, msg)
|
||||||
|
|
||||||
|
return limits
|
||||||
|
|
||||||
|
|
||||||
|
@wrap(quota_tbl.get_quota_name)
|
||||||
|
def get_quota_name(f, quota):
|
||||||
|
if quota.name in MANILA_QUOTA_NAMES:
|
||||||
|
return MANILA_QUOTA_NAMES.get(quota.name)
|
||||||
|
else:
|
||||||
|
return f(quota)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add manila fields to Admin/Defaults/Update Defaults
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaUpdateDefaultQuotaAction(
|
||||||
|
default_workflows.UpdateDefaultQuotasAction):
|
||||||
|
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
||||||
|
share_networks = horizon.forms.IntegerField(min_value=-1,
|
||||||
|
label=_("Share Networks"))
|
||||||
|
|
||||||
|
class Meta(object):
|
||||||
|
name = _("Default Quota")
|
||||||
|
slug = 'update_default_quotas'
|
||||||
|
help_text = _("From here you can update the default quotas "
|
||||||
|
"(max limits).")
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaUpdateDefaultQuotasStep(default_workflows.UpdateDefaultQuotasStep):
|
||||||
|
action_class = ManilaUpdateDefaultQuotaAction
|
||||||
|
contributes = quotas.QUOTA_FIELDS
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaUpdateDefaultQuotas(default_workflows.UpdateDefaultQuotas):
|
||||||
|
default_steps = (ManilaUpdateDefaultQuotasStep,)
|
||||||
|
|
||||||
|
def handle(self, request, data):
|
||||||
|
try:
|
||||||
|
super(ManilaUpdateDefaultQuotas, self).handle(request, data)
|
||||||
|
|
||||||
|
if base.is_service_enabled(request, 'share'):
|
||||||
|
manila_data = dict([(key, data[key]) for key in
|
||||||
|
MANILA_QUOTA_FIELDS])
|
||||||
|
manila.default_quota_update(request, **manila_data)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
horizon.exceptions.handle(request,
|
||||||
|
_('Unable to update default quotas.'))
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
default_views.UpdateDefaultQuotasView.workflow_class = \
|
||||||
|
ManilaUpdateDefaultQuotas
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add manila fields to Identity/Projects/Modify Quotas
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaUpdateProjectQuotaAction(
|
||||||
|
project_workflows.UpdateProjectQuotaAction):
|
||||||
|
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
||||||
|
share_networks = horizon.forms.IntegerField(min_value=-1,
|
||||||
|
label=_("Share Networks"))
|
||||||
|
|
||||||
|
class Meta(object):
|
||||||
|
name = _("Quota")
|
||||||
|
slug = 'update_quotas'
|
||||||
|
help_text = _("Set maximum quotas for the project.")
|
||||||
|
|
||||||
|
project_workflows.UpdateProjectQuota.action_class = \
|
||||||
|
ManilaUpdateProjectQuotaAction
|
||||||
|
project_workflows.UpdateProjectQuota.contributes = quotas.QUOTA_FIELDS
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaUpdateProject(project_workflows.UpdateProject):
|
||||||
|
def handle(self, request, data):
|
||||||
|
try:
|
||||||
|
super(ManilaUpdateProject, self).handle(request, data)
|
||||||
|
|
||||||
|
if base.is_service_enabled(request, 'share'):
|
||||||
|
manila_data = dict([(key, data[key]) for key in
|
||||||
|
MANILA_QUOTA_FIELDS])
|
||||||
|
manila.tenant_quota_update(request,
|
||||||
|
data['project_id'],
|
||||||
|
**manila_data)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
horizon.exceptions.handle(request,
|
||||||
|
_('Modified project information and '
|
||||||
|
'members, but unable to modify '
|
||||||
|
'project quotas.'))
|
||||||
|
return True
|
||||||
|
|
||||||
|
project_views.UpdateProjectView.workflow_class = ManilaUpdateProject
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add manila fields to Identity/Projects/Create Project
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaCreateProjectQuotaAction(
|
||||||
|
project_workflows.CreateProjectQuotaAction):
|
||||||
|
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
||||||
|
share_networks = horizon.forms.IntegerField(min_value=-1,
|
||||||
|
label=_("Share Networks"))
|
||||||
|
|
||||||
|
class Meta(object):
|
||||||
|
name = _("Quota")
|
||||||
|
slug = 'create_quotas'
|
||||||
|
help_text = _("Set maximum quotas for the project.")
|
||||||
|
|
||||||
|
project_workflows.CreateProjectQuota.action_class = \
|
||||||
|
ManilaCreateProjectQuotaAction
|
||||||
|
project_workflows.CreateProjectQuota.contributes = quotas.QUOTA_FIELDS
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaCreateProject(project_workflows.CreateProject):
|
||||||
|
def handle(self, request, data):
|
||||||
|
try:
|
||||||
|
super(ManilaCreateProject, self).handle(request, data)
|
||||||
|
|
||||||
|
if base.is_service_enabled(request, 'share'):
|
||||||
|
manila_data = dict([(key, data[key]) for key in
|
||||||
|
MANILA_QUOTA_FIELDS])
|
||||||
|
manila.tenant_quota_update(request,
|
||||||
|
self.object.id,
|
||||||
|
**manila_data)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
horizon.exceptions.handle(request,
|
||||||
|
_('Unable to set project quotas.'))
|
||||||
|
return True
|
||||||
|
|
||||||
|
project_views.CreateProjectView.workflow_class = ManilaCreateProject
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add extra pie charts to Project/Compute Overview
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class ManilaBaseUsage(usage_base.BaseUsage):
|
||||||
|
|
||||||
|
def get_manila_limits(self):
|
||||||
|
"""Get share limits if manila is enabled."""
|
||||||
|
if not base.is_service_enabled(self.request, 'share'):
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
self.limits.update(manila.tenant_absolute_limits(self.request))
|
||||||
|
except Exception:
|
||||||
|
msg = _("Unable to retrieve share limit information.")
|
||||||
|
horizon.exceptions.handle(self.request, msg)
|
||||||
|
return
|
||||||
|
|
||||||
|
def get_limits(self):
|
||||||
|
super(ManilaBaseUsage, self).get_limits()
|
||||||
|
self.get_manila_limits()
|
||||||
|
|
||||||
|
overview_views.ProjectOverview.template_name = "usage.html"
|
||||||
|
overview_views.ProjectOverview.usage_class = ManilaBaseUsage
|
@ -2,6 +2,3 @@ PANEL_DASHBOARD = 'admin'
|
|||||||
PANEL_GROUP = 'admin'
|
PANEL_GROUP = 'admin'
|
||||||
PANEL = 'shares'
|
PANEL = 'shares'
|
||||||
ADD_PANEL = 'manila_ui.dashboards.admin.shares.panel.Shares'
|
ADD_PANEL = 'manila_ui.dashboards.admin.shares.panel.Shares'
|
||||||
UPDATE_HORIZON_CONFIG = {
|
|
||||||
'customization_module': 'manila_ui.overrides',
|
|
||||||
}
|
|
||||||
|
@ -4,6 +4,3 @@ PANEL = 'shares'
|
|||||||
ADD_PANEL = 'manila_ui.dashboards.project.shares.panel.Shares'
|
ADD_PANEL = 'manila_ui.dashboards.project.shares.panel.Shares'
|
||||||
# ADD_INSTALLED_APPS enables using html templates from within the plugin
|
# ADD_INSTALLED_APPS enables using html templates from within the plugin
|
||||||
ADD_INSTALLED_APPS = ['manila_ui.dashboards.project']
|
ADD_INSTALLED_APPS = ['manila_ui.dashboards.project']
|
||||||
UPDATE_HORIZON_CONFIG = {
|
|
||||||
'customization_module': 'manila_ui.overrides',
|
|
||||||
}
|
|
||||||
|
@ -1,332 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import functools
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
import horizon
|
|
||||||
|
|
||||||
from manila_ui.api import manila
|
|
||||||
|
|
||||||
from openstack_dashboard.api import base
|
|
||||||
from openstack_dashboard.dashboards.admin.defaults import tables as quota_tbl
|
|
||||||
from openstack_dashboard.dashboards.admin.defaults import views \
|
|
||||||
as default_views
|
|
||||||
from openstack_dashboard.dashboards.admin.defaults import workflows \
|
|
||||||
as default_workflows
|
|
||||||
from openstack_dashboard.dashboards.identity.projects import views \
|
|
||||||
as project_views
|
|
||||||
from openstack_dashboard.dashboards.identity.projects import workflows \
|
|
||||||
as project_workflows
|
|
||||||
from openstack_dashboard.dashboards.project.overview import views \
|
|
||||||
as overview_views
|
|
||||||
from openstack_dashboard.usage import base as usage_base
|
|
||||||
from openstack_dashboard.usage import quotas
|
|
||||||
|
|
||||||
|
|
||||||
def wrap(orig_func):
|
|
||||||
"""decorator to wrap an existing function
|
|
||||||
Modified post from http://downgra.de/2009/05/16/python-monkey-patching/
|
|
||||||
to work with functions
|
|
||||||
e.g.
|
|
||||||
|
|
||||||
@wrap(quotas.tenant_limit_usages)
|
|
||||||
def tenant_limit_usages(orig, self):
|
|
||||||
limits = orig(request)
|
|
||||||
limits['disksUsed'] = 100
|
|
||||||
return limits
|
|
||||||
|
|
||||||
the first parameter of the new function is the the original,
|
|
||||||
overwritten function ('orig').
|
|
||||||
"""
|
|
||||||
|
|
||||||
def outer(new_func):
|
|
||||||
@functools.wraps(orig_func)
|
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
return new_func(orig_func, *args, **kwargs)
|
|
||||||
# Replace the original function in the module with the wrapper
|
|
||||||
orig_module = sys.modules[orig_func.__module__]
|
|
||||||
setattr(orig_module, orig_func.__name__, wrapper)
|
|
||||||
return wrapper
|
|
||||||
return outer
|
|
||||||
|
|
||||||
|
|
||||||
# All public methods in openstack_dashboard.usage.quotas are hardcoded to
|
|
||||||
# only look at a fixed set of services (nova, cinder, etc.). In order to
|
|
||||||
# incorporate manila quotas and usage, all public functions must be
|
|
||||||
# monkey-patched to add that information in.
|
|
||||||
|
|
||||||
MANILA_QUOTA_FIELDS = (
|
|
||||||
"shares",
|
|
||||||
"snapshots",
|
|
||||||
"gigabytes",
|
|
||||||
"share_networks",
|
|
||||||
)
|
|
||||||
MANILA_QUOTA_NAMES = {
|
|
||||||
'shares': _('Shares'),
|
|
||||||
'share_networks': _('Shares Networks'),
|
|
||||||
}
|
|
||||||
|
|
||||||
quotas.QUOTA_FIELDS = quotas.QUOTA_FIELDS + MANILA_QUOTA_FIELDS
|
|
||||||
|
|
||||||
|
|
||||||
def _get_manila_disabled_quotas(request):
|
|
||||||
disabled_quotas = []
|
|
||||||
if not base.is_service_enabled(request, 'share'):
|
|
||||||
disabled_quotas.extend(MANILA_QUOTA_FIELDS)
|
|
||||||
|
|
||||||
return disabled_quotas
|
|
||||||
|
|
||||||
|
|
||||||
def _get_manila_quota_data(request, method_name, disabled_quotas=None,
|
|
||||||
tenant_id=None):
|
|
||||||
if not tenant_id:
|
|
||||||
tenant_id = request.user.tenant_id
|
|
||||||
if disabled_quotas is None:
|
|
||||||
disabled_quotas = _get_manila_disabled_quotas(request)
|
|
||||||
if 'shares' not in disabled_quotas:
|
|
||||||
return getattr(manila, method_name)(request, tenant_id)
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quotas.get_default_quota_data)
|
|
||||||
def get_default_quota_data(f, request, disabled_quotas=None, tenant_id=None):
|
|
||||||
qs = f(request, disabled_quotas, tenant_id)
|
|
||||||
manila_quota = _get_manila_quota_data(request, "default_quota_get",
|
|
||||||
disabled_quotas=disabled_quotas,
|
|
||||||
tenant_id=tenant_id)
|
|
||||||
if manila_quota:
|
|
||||||
qs.add(manila_quota)
|
|
||||||
return qs
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quotas.get_tenant_quota_data)
|
|
||||||
def get_tenant_quota_data(f, request, disabled_quotas=None, tenant_id=None):
|
|
||||||
qs = f(request, disabled_quotas, tenant_id)
|
|
||||||
manila_quota = _get_manila_quota_data(request, "tenant_quota_get",
|
|
||||||
disabled_quotas=disabled_quotas,
|
|
||||||
tenant_id=tenant_id)
|
|
||||||
if manila_quota:
|
|
||||||
qs.add(manila_quota)
|
|
||||||
return qs
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quotas.get_disabled_quotas)
|
|
||||||
def get_disabled_quotas(f, request):
|
|
||||||
disabled_quotas = f(request)
|
|
||||||
disabled_quotas.extend(_get_manila_disabled_quotas(request))
|
|
||||||
return disabled_quotas
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quotas.tenant_quota_usages)
|
|
||||||
def tenant_quota_usages(f, request, tenant_id=None):
|
|
||||||
|
|
||||||
usages = f(request, tenant_id)
|
|
||||||
|
|
||||||
if 'shares' not in _get_manila_disabled_quotas(request):
|
|
||||||
shares = manila.share_list(request)
|
|
||||||
snapshots = manila.share_snapshot_list(request)
|
|
||||||
sn_l = manila.share_network_list(request)
|
|
||||||
gig_s = sum([int(v.size) for v in shares])
|
|
||||||
gig_ss = sum([int(v.size) for v in snapshots])
|
|
||||||
usages.tally('gigabytes', gig_s + gig_ss)
|
|
||||||
usages.tally('shares', len(shares))
|
|
||||||
usages.tally('snapshots', len(snapshots))
|
|
||||||
usages.tally('share_networks', len(sn_l))
|
|
||||||
|
|
||||||
return usages
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quotas.tenant_limit_usages)
|
|
||||||
def tenant_limit_usages(f, request):
|
|
||||||
|
|
||||||
limits = f(request)
|
|
||||||
|
|
||||||
if base.is_service_enabled(request, 'share'):
|
|
||||||
try:
|
|
||||||
limits.update(manila.tenant_absolute_limits(request))
|
|
||||||
shares = manila.share_list(request)
|
|
||||||
snapshots = manila.share_snapshot_list(request)
|
|
||||||
total_s_size = sum([getattr(share, 'size', 0) for share in shares])
|
|
||||||
total_ss_size = sum([getattr(ss, 'size', 0) for ss in snapshots])
|
|
||||||
limits['totalGigabytesUsed'] = total_s_size + total_ss_size
|
|
||||||
limits['totalSharesUsed'] = len(shares)
|
|
||||||
limits['totalSnapshotsUsed'] = len(snapshots)
|
|
||||||
except Exception:
|
|
||||||
msg = _("Unable to retrieve share limit information.")
|
|
||||||
horizon.exceptions.handle(request, msg)
|
|
||||||
|
|
||||||
return limits
|
|
||||||
|
|
||||||
|
|
||||||
@wrap(quota_tbl.get_quota_name)
|
|
||||||
def get_quota_name(f, quota):
|
|
||||||
if quota.name in MANILA_QUOTA_NAMES:
|
|
||||||
return MANILA_QUOTA_NAMES.get(quota.name)
|
|
||||||
else:
|
|
||||||
return f(quota)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Add manila fields to Admin/Defaults/Update Defaults
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaUpdateDefaultQuotaAction(
|
|
||||||
default_workflows.UpdateDefaultQuotasAction):
|
|
||||||
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
|
||||||
share_networks = horizon.forms.IntegerField(min_value=-1,
|
|
||||||
label=_("Share Networks"))
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = _("Default Quota")
|
|
||||||
slug = 'update_default_quotas'
|
|
||||||
help_text = _("From here you can update the default quotas "
|
|
||||||
"(max limits).")
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaUpdateDefaultQuotasStep(default_workflows.UpdateDefaultQuotasStep):
|
|
||||||
action_class = ManilaUpdateDefaultQuotaAction
|
|
||||||
contributes = quotas.QUOTA_FIELDS
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaUpdateDefaultQuotas(default_workflows.UpdateDefaultQuotas):
|
|
||||||
default_steps = (ManilaUpdateDefaultQuotasStep,)
|
|
||||||
|
|
||||||
def handle(self, request, data):
|
|
||||||
try:
|
|
||||||
super(ManilaUpdateDefaultQuotas, self).handle(request, data)
|
|
||||||
|
|
||||||
if base.is_service_enabled(request, 'share'):
|
|
||||||
manila_data = dict([(key, data[key]) for key in
|
|
||||||
MANILA_QUOTA_FIELDS])
|
|
||||||
manila.default_quota_update(request, **manila_data)
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
horizon.exceptions.handle(request,
|
|
||||||
_('Unable to update default quotas.'))
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
default_views.UpdateDefaultQuotasView.workflow_class = \
|
|
||||||
ManilaUpdateDefaultQuotas
|
|
||||||
|
|
||||||
#
|
|
||||||
# Add manila fields to Identity/Projects/Modify Quotas
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaUpdateProjectQuotaAction(
|
|
||||||
project_workflows.UpdateProjectQuotaAction):
|
|
||||||
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
|
||||||
share_networks = horizon.forms.IntegerField(min_value=-1,
|
|
||||||
label=_("Share Networks"))
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = _("Quota")
|
|
||||||
slug = 'update_quotas'
|
|
||||||
help_text = _("Set maximum quotas for the project.")
|
|
||||||
|
|
||||||
project_workflows.UpdateProjectQuota.action_class = \
|
|
||||||
ManilaUpdateProjectQuotaAction
|
|
||||||
project_workflows.UpdateProjectQuota.contributes = quotas.QUOTA_FIELDS
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaUpdateProject(project_workflows.UpdateProject):
|
|
||||||
def handle(self, request, data):
|
|
||||||
try:
|
|
||||||
super(ManilaUpdateProject, self).handle(request, data)
|
|
||||||
|
|
||||||
if base.is_service_enabled(request, 'share'):
|
|
||||||
manila_data = dict([(key, data[key]) for key in
|
|
||||||
MANILA_QUOTA_FIELDS])
|
|
||||||
manila.tenant_quota_update(request,
|
|
||||||
data['project_id'],
|
|
||||||
**manila_data)
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
horizon.exceptions.handle(request,
|
|
||||||
_('Modified project information and '
|
|
||||||
'members, but unable to modify '
|
|
||||||
'project quotas.'))
|
|
||||||
return True
|
|
||||||
|
|
||||||
project_views.UpdateProjectView.workflow_class = ManilaUpdateProject
|
|
||||||
|
|
||||||
#
|
|
||||||
# Add manila fields to Identity/Projects/Create Project
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaCreateProjectQuotaAction(
|
|
||||||
project_workflows.CreateProjectQuotaAction):
|
|
||||||
shares = horizon.forms.IntegerField(min_value=-1, label=_("Shares"))
|
|
||||||
share_networks = horizon.forms.IntegerField(min_value=-1,
|
|
||||||
label=_("Share Networks"))
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = _("Quota")
|
|
||||||
slug = 'create_quotas'
|
|
||||||
help_text = _("Set maximum quotas for the project.")
|
|
||||||
|
|
||||||
project_workflows.CreateProjectQuota.action_class = \
|
|
||||||
ManilaCreateProjectQuotaAction
|
|
||||||
project_workflows.CreateProjectQuota.contributes = quotas.QUOTA_FIELDS
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaCreateProject(project_workflows.CreateProject):
|
|
||||||
def handle(self, request, data):
|
|
||||||
try:
|
|
||||||
super(ManilaCreateProject, self).handle(request, data)
|
|
||||||
|
|
||||||
if base.is_service_enabled(request, 'share'):
|
|
||||||
manila_data = dict([(key, data[key]) for key in
|
|
||||||
MANILA_QUOTA_FIELDS])
|
|
||||||
manila.tenant_quota_update(request,
|
|
||||||
self.object.id,
|
|
||||||
**manila_data)
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
horizon.exceptions.handle(request,
|
|
||||||
_('Unable to set project quotas.'))
|
|
||||||
return True
|
|
||||||
|
|
||||||
project_views.CreateProjectView.workflow_class = ManilaCreateProject
|
|
||||||
|
|
||||||
#
|
|
||||||
# Add extra pie charts to Project/Compute Overview
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class ManilaBaseUsage(usage_base.BaseUsage):
|
|
||||||
|
|
||||||
def get_manila_limits(self):
|
|
||||||
"""Get share limits if manila is enabled."""
|
|
||||||
if not base.is_service_enabled(self.request, 'share'):
|
|
||||||
return
|
|
||||||
try:
|
|
||||||
self.limits.update(manila.tenant_absolute_limits(self.request))
|
|
||||||
except Exception:
|
|
||||||
msg = _("Unable to retrieve share limit information.")
|
|
||||||
horizon.exceptions.handle(self.request, msg)
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_limits(self):
|
|
||||||
super(ManilaBaseUsage, self).get_limits()
|
|
||||||
self.get_manila_limits()
|
|
||||||
|
|
||||||
overview_views.ProjectOverview.template_name = "usage.html"
|
|
||||||
overview_views.ProjectOverview.usage_class = ManilaBaseUsage
|
|
Loading…
Reference in New Issue
Block a user