Fix usages view on project/overview page
Currently, Manila UI adds its own HTML template to project/overview
page for quota limits. It contains info for other projects.
It is fragile and redundant.
Therefore, delete that template, reusing original Horizon's one that
is flexible enough to display limits for any project.
Extend one of Horizon's view python-classes with Manila data that
will be picked up by HTML template. It is safe to do the same for
other Horizon plugins too.
Change-Id: I2e4cad33326c486352f340918395d4ee85ebe8e1
Closes-Bug: #1576791
Closes-Bug: #1630793
(clean cherry pick of commit ffe2f85b
)
This commit is contained in:
parent
e0c58ca97e
commit
da85b42fbb
|
@ -311,7 +311,7 @@ project_views.CreateProjectView.workflow_class = ManilaCreateProject
|
|||
#
|
||||
|
||||
|
||||
class ManilaBaseUsage(usage_base.BaseUsage):
|
||||
class ManilaUsage(usage_base.ProjectUsage):
|
||||
|
||||
def get_manila_limits(self):
|
||||
"""Get share limits if manila is enabled."""
|
||||
|
@ -325,8 +325,33 @@ class ManilaBaseUsage(usage_base.BaseUsage):
|
|||
return
|
||||
|
||||
def get_limits(self):
|
||||
super(ManilaBaseUsage, self).get_limits()
|
||||
super(self.__class__, self).get_limits()
|
||||
self.get_manila_limits()
|
||||
|
||||
overview_views.ProjectOverview.template_name = "usage.html"
|
||||
overview_views.ProjectOverview.usage_class = ManilaBaseUsage
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(self.__class__, self).get_context_data(**kwargs)
|
||||
types = (
|
||||
("totalSharesUsed", "maxTotalShares", _("Shares")),
|
||||
("totalShareGigabytesUsed", "maxTotalShareGigabytes",
|
||||
_("Share Storage")),
|
||||
("totalShareSnapshotsUsed", "maxTotalShareSnapshots",
|
||||
_("Share Snapshots")),
|
||||
("totalSnapshotGigabytesUsed", "maxTotalSnapshotGigabytes",
|
||||
_("Share Snapshots Storage")),
|
||||
("totalShareNetworksUsed", "maxTotalShareNetworks",
|
||||
_("Share Networks")),
|
||||
)
|
||||
for t in types:
|
||||
if t[0] in self.usage.limits and t[1] in self.usage.limits:
|
||||
context['charts'].append({
|
||||
'name': t[2],
|
||||
'used': self.usage.limits[t[0]],
|
||||
'max': self.usage.limits[t[1]],
|
||||
'text': False,
|
||||
})
|
||||
return context
|
||||
|
||||
|
||||
overview_views.ProjectOverview.get_context_data = get_context_data
|
||||
overview_views.ProjectOverview.usage_class = ManilaUsage
|
||||
|
|
|
@ -13,9 +13,11 @@
|
|||
# under the License.
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils import translation
|
||||
import mock
|
||||
|
||||
from manila_ui.api import manila as api_manila
|
||||
from manila_ui.dashboards.project import shares
|
||||
from manila_ui.dashboards.project.shares import test_data
|
||||
from manila_ui.test import helpers as test
|
||||
|
||||
|
@ -51,3 +53,64 @@ class SharesTests(test.TestCase):
|
|||
res = self.client.get(INDEX_URL)
|
||||
self.assertEqual(res.status_code, 200)
|
||||
self.assertTemplateUsed(res, 'project/shares/index.html')
|
||||
|
||||
|
||||
class PieChartsTests(test.TestCase):
|
||||
|
||||
def test_get_context_data(self):
|
||||
limits = {
|
||||
"totalSharesUsed": 1,
|
||||
"totalShareGigabytesUsed": 2,
|
||||
"totalShareNetworksUsed": 3,
|
||||
"totalShareSnapshotsUsed": 4,
|
||||
"totalSnapshotGigabytesUsed": 5,
|
||||
"maxTotalShares": 6,
|
||||
"maxTotalShareGigabytes": 7,
|
||||
"maxTotalShareNetworks": 8,
|
||||
"maxTotalShareSnapshots": 9,
|
||||
"maxTotalSnapshotGigabytes": 10,
|
||||
}
|
||||
existing_chart_name = "Foo"
|
||||
existing_chart = {
|
||||
"name": translation.ugettext_lazy(existing_chart_name),
|
||||
"used": 11,
|
||||
"max": 13,
|
||||
"text": "fake_text",
|
||||
}
|
||||
|
||||
class ParentViewInstance(mock.MagicMock):
|
||||
def get_context_data(self, **kwargs):
|
||||
return {"charts": [existing_chart]}
|
||||
|
||||
class ViewInstance(ParentViewInstance):
|
||||
usage = type("FakeUsage", (object, ), {"limits": limits})
|
||||
|
||||
view_instance = ViewInstance()
|
||||
|
||||
result = shares.get_context_data(
|
||||
view_instance, fook="foov", bark="barv")
|
||||
|
||||
charts = result.get("charts", [])
|
||||
self.assertEqual(6, len(charts))
|
||||
expected_charts = {
|
||||
existing_chart_name: {
|
||||
"name": existing_chart_name, "used": existing_chart["used"],
|
||||
"max": existing_chart["max"], "text": existing_chart["text"]},
|
||||
"Shares": {"name": "Shares", "used": 1, "max": 6, "text": False},
|
||||
"Share Storage": {
|
||||
"name": "Share Storage", 'used': 2, "max": 7, "text": False},
|
||||
"Share Networks": {
|
||||
"name": "Share Networks", "used": 3, "max": 8, "text": False},
|
||||
"Share Snapshots": {
|
||||
"name": "Share Snapshots", "used": 4, "max": 9, "text": False},
|
||||
"Share Snapshots Storage": {
|
||||
"name": "Share Snapshots Storage", "used": 5, "max": 10,
|
||||
"text": False},
|
||||
}
|
||||
for chart in charts:
|
||||
name = chart["name"].title()
|
||||
self.assertEqual(
|
||||
{"name": name, "used": chart["used"], "max": chart["max"],
|
||||
"text": chart["text"]},
|
||||
expected_charts.pop(name, "NotFound")
|
||||
)
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
{% load i18n horizon humanize sizeformat %}
|
||||
|
||||
<div class="quota-dynamic">
|
||||
<h3 class="quota-heading">{% trans "Limit Summary" %}</h3>
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalInstancesUsed usage.limits.maxTotalInstances 100 %}"></div>
|
||||
<strong>{% trans "Instances" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalInstancesUsed|intcomma available=usage.limits.maxTotalInstances|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalCoresUsed usage.limits.maxTotalCores 100 %}"></div>
|
||||
<strong>{% trans "VCPUs" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalCoresUsed|intcomma available=usage.limits.maxTotalCores|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalRAMUsed usage.limits.maxTotalRAMSize 100 %}"></div>
|
||||
<strong>{% trans "RAM" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalRAMUsed|mb_float_format available=usage.limits.maxTotalRAMSize|quotainf|mb_float_format %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalFloatingIpsUsed usage.limits.maxTotalFloatingIps 100 %}"></div>
|
||||
<strong>{% trans "Floating IPs" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalFloatingIpsUsed|intcomma available=usage.limits.maxTotalFloatingIps|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalSecurityGroupsUsed usage.limits.maxSecurityGroups 100 %}"></div>
|
||||
<strong>{% trans "Security Groups" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalSecurityGroupsUsed|intcomma available=usage.limits.maxSecurityGroups|quotainf|intcomma%}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
{% if usage.limits.totalVolumesUsed >= 0 %}
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalVolumesUsed usage.limits.maxTotalVolumes 100 %}"></div>
|
||||
<strong>{% trans "Volumes" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalVolumesUsed|intcomma available=usage.limits.maxTotalVolumes|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalGigabytesUsed usage.limits.maxTotalVolumeGigabytes 100 %}"></div>
|
||||
<strong>{% trans "Volume Storage" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalGigabytesUsed|diskgbformat available=usage.limits.maxTotalVolumeGigabytes|quotainf|diskgbformat %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if usage.limits.totalSharesUsed >= 0 %}
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalSharesUsed usage.limits.maxTotalShares 100 %}"></div>
|
||||
<strong>{% trans "Shares" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalSharesUsed|intcomma available=usage.limits.maxTotalShares|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalShareGigabytesUsed usage.limits.maxTotalShareGigabytes 100 %}"></div>
|
||||
<strong>{% trans "Share Storage" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalShareGigabytesUsed|diskgbformat available=usage.limits.maxTotalShareGigabytes|quotainf|diskgbformat %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="d3_quota_bar">
|
||||
<div class="d3_pie_chart_usage" data-used="{% widthratio usage.limits.totalShareNetworksUsed usage.limits.maxTotalShareNetworks 100 %}"></div>
|
||||
<strong>{% trans "Share Networks" %} <br />
|
||||
{% blocktrans with used=usage.limits.totalShareNetworksUsed|intcomma available=usage.limits.maxTotalShareNetworks|quotainf|intcomma %}Used <span> {{ used }} </span> of <span> {{ available }} </span>{% endblocktrans %}
|
||||
</strong>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
|
@ -1,12 +0,0 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Instance Overview" %}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% include "_limit_summary.html" %}
|
||||
|
||||
{% if simple_tenant_usage_enabled %}
|
||||
{% include "horizon/common/_usage_summary.html" %}
|
||||
{{ table.render }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
Loading…
Reference in New Issue