Merge "Provide missing hover hints for instance:<type> meters" into stable/havana
This commit is contained in:
commit
9465e54f7e
|
@ -159,6 +159,15 @@ class GlobalStatsTab(tabs.Tab):
|
||||||
template_name = ("admin/metering/stats.html")
|
template_name = ("admin/metering/stats.html")
|
||||||
preload = False
|
preload = False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_flavor_names(request):
|
||||||
|
try:
|
||||||
|
flavors = api.nova.flavor_list(request, None)
|
||||||
|
return [f.name for f in flavors]
|
||||||
|
except Exception:
|
||||||
|
return ['m1.tiny', 'm1.small', 'm1.medium',
|
||||||
|
'm1.large', 'm1.xlarge']
|
||||||
|
|
||||||
def get_context_data(self, request):
|
def get_context_data(self, request):
|
||||||
query = [{"field": "metadata.OS-EXT-AZ:availability_zone",
|
query = [{"field": "metadata.OS-EXT-AZ:availability_zone",
|
||||||
"op": "eq",
|
"op": "eq",
|
||||||
|
@ -180,8 +189,6 @@ class GlobalStatsTab(tabs.Tab):
|
||||||
meters = []
|
meters = []
|
||||||
|
|
||||||
meter_titles = {"instance": _("Duration of instance"),
|
meter_titles = {"instance": _("Duration of instance"),
|
||||||
"instance:<type>": _("Duration of instance <type>"
|
|
||||||
" (openstack types)"),
|
|
||||||
"memory": _("Volume of RAM in MB"),
|
"memory": _("Volume of RAM in MB"),
|
||||||
"cpu": _("CPU time used"),
|
"cpu": _("CPU time used"),
|
||||||
"cpu_util": _("Average CPU utilisation"),
|
"cpu_util": _("Average CPU utilisation"),
|
||||||
|
@ -202,6 +209,12 @@ class GlobalStatsTab(tabs.Tab):
|
||||||
"network.outgoing.packets": _("Number of outgoing "
|
"network.outgoing.packets": _("Number of outgoing "
|
||||||
"packets for a VM interface")}
|
"packets for a VM interface")}
|
||||||
|
|
||||||
|
for flavor in self._get_flavor_names(request):
|
||||||
|
name = 'instance:%s' % flavor
|
||||||
|
hint = (_('Duration of instance type %s (openstack flavor)') %
|
||||||
|
flavor)
|
||||||
|
meter_titles[name] = hint
|
||||||
|
|
||||||
class MetersWrap(object):
|
class MetersWrap(object):
|
||||||
""" A quick wrapper for meter and associated titles. """
|
""" A quick wrapper for meter and associated titles. """
|
||||||
def __init__(self, meter, meter_titles):
|
def __init__(self, meter, meter_titles):
|
||||||
|
|
|
@ -18,6 +18,7 @@ from django import http # noqa
|
||||||
from mox import IsA # noqa
|
from mox import IsA # noqa
|
||||||
|
|
||||||
from openstack_dashboard import api
|
from openstack_dashboard import api
|
||||||
|
from openstack_dashboard.dashboards.admin.metering import tabs
|
||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
|
|
||||||
INDEX_URL = reverse("horizon:admin:metering:index")
|
INDEX_URL = reverse("horizon:admin:metering:index")
|
||||||
|
@ -337,3 +338,50 @@ class MeteringViewTests(test.APITestCase, test.BaseAdminViewTests):
|
||||||
'fake_resource_id2']
|
'fake_resource_id2']
|
||||||
self._verify_series(res._container[0], 4.55, '2012-12-21T11:00:55',
|
self._verify_series(res._container[0], 4.55, '2012-12-21T11:00:55',
|
||||||
expected_names)
|
expected_names)
|
||||||
|
|
||||||
|
|
||||||
|
class MeteringStatsTabTests(test.APITestCase):
|
||||||
|
|
||||||
|
@test.create_stubs({api.nova: ('flavor_list',),
|
||||||
|
})
|
||||||
|
def test_stats_hover_hints(self):
|
||||||
|
|
||||||
|
class Struct(object):
|
||||||
|
def __init__(self, d):
|
||||||
|
self.__dict__.update(d)
|
||||||
|
|
||||||
|
def _get_link(meter):
|
||||||
|
link = ('http://localhost:8777/v2/meters/%s?'
|
||||||
|
'q.field=resource_id&q.value=fake_resource_id')
|
||||||
|
return dict(href=link % meter, rel=meter)
|
||||||
|
|
||||||
|
resources = [
|
||||||
|
Struct(dict(resource_id='fake_resource_id',
|
||||||
|
project_id='fake_project_id',
|
||||||
|
user_id='fake_user_id',
|
||||||
|
timestamp='2013-10-22T12:42:37',
|
||||||
|
metadata=dict(ramdisk_id='fake_image_id'),
|
||||||
|
links=[_get_link('instance:m1.massive'),
|
||||||
|
_get_link('instance'),
|
||||||
|
_get_link('cpu')])),
|
||||||
|
]
|
||||||
|
request = self.mox.CreateMock(http.HttpRequest)
|
||||||
|
api.nova.flavor_list(request, None).AndReturn(self.flavors.list())
|
||||||
|
|
||||||
|
ceilometerclient = self.stub_ceilometerclient()
|
||||||
|
ceilometerclient.resources = self.mox.CreateMockAnything()
|
||||||
|
ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
tab = tabs.GlobalStatsTab(None)
|
||||||
|
context_data = tab.get_context_data(request)
|
||||||
|
|
||||||
|
self.assertTrue('meters' in context_data)
|
||||||
|
meter_hints = {}
|
||||||
|
for d in context_data['meters']:
|
||||||
|
meter_hints[d.name] = d.title
|
||||||
|
|
||||||
|
for meter in ['instance:m1.massive', 'instance', 'cpu']:
|
||||||
|
self.assertTrue(meter in meter_hints)
|
||||||
|
self.assertNotEqual(meter_hints[meter], '')
|
||||||
|
|
Loading…
Reference in New Issue