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:
Valeriy Ponomaryov 2016-05-05 21:02:26 +03:00 committed by vponomaryov
parent e0c58ca97e
commit da85b42fbb
4 changed files with 92 additions and 92 deletions

View File

@ -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

View File

@ -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")
)

View File

@ -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>

View File

@ -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 %}