Merge "Display node information in a popup over the node boxes"

This commit is contained in:
Jenkins
2014-12-09 14:16:24 +00:00
committed by Gerrit Code Review
4 changed files with 87 additions and 42 deletions

View File

@@ -53,56 +53,71 @@ def node_role(request, node):
return resource.role return resource.role
def _node_data(request, nodes):
for node in nodes:
role = node_role(request, node)
yield {
'uuid': node.uuid,
'role_name': role.name if role else '',
'role_slug': django.utils.text.slugify(role.name) if role else '',
'state': node.state,
'state_slug': django.utils.text.slugify(unicode(node.state)),
'state_icon': NODE_STATE_ICON.get(node.state,
NODE_STATE_ICON[None]),
'cpu_arch': node.cpu_arch,
'cpus': node.cpus,
'memory_mb': node.memory_mb,
'local_gb': node.local_gb,
}
def _flavor_data(request, flavors, flavor_roles):
for flavor in flavors:
nodes = list(_node_data(request, flavor_nodes(request, flavor)))
roles = flavor_roles.get(flavor.name, [])
if nodes or roles:
# Don't list empty flavors
yield {
'name': flavor.name,
'vcpus': flavor.vcpus,
'ram': flavor.ram,
'disk': flavor.disk,
'cpu_arch': flavor.cpu_arch,
'nodes': nodes,
'roles': roles,
}
class IndexView(views.IndexView): class IndexView(views.IndexView):
template_name = "tuskar_boxes/overview/index.html" template_name = "tuskar_boxes/overview/index.html"
form_class = forms.EditPlan form_class = forms.EditPlan
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
context = super(IndexView, self).get_context_data(*args, **kwargs) context = super(IndexView, self).get_context_data(*args, **kwargs)
flavors = api.flavor.Flavor.list(self.request)
flavors.sort(key=lambda np: (np.vcpus, np.ram, np.disk))
for role in context['roles']:
flavor = role['role'].flavor(context['plan'])
role['flavor_name'] = flavor.name if flavor else ''
if not context['stack']: if not context['stack']:
context['flavors'] = [] roles = context['roles']
for flavor in flavors: free_roles = []
nodes = [{ flavor_roles = {}
'role': '', for role in roles:
} for node in flavor_nodes(self.request, flavor)]
roles = [role for role in context['roles']
if role['flavor_name'] == flavor.name]
flavor = {
'name': flavor.name,
'vcpus': flavor.vcpus,
'ram': flavor.ram,
'disk': flavor.disk,
'cpu_arch': flavor.cpu_arch,
'nodes': nodes,
'roles': roles,
}
if nodes or roles: # Don't list empty flavors
context['flavors'].append(flavor)
context['free_roles'] = [role for role in context['roles']
if not role['flavor_name']]
for role in context['roles']:
role['flavor_field'] = context['form'][role['id'] + '-flavor'] role['flavor_field'] = context['form'][role['id'] + '-flavor']
flavor = role['role'].flavor(context['plan'])
if flavor:
role['flavor_name'] = flavor.name
flavor_roles.setdefault(flavor.name, []).append(role)
else:
role['flavor_name'] = ''
free_roles.append(role)
context['free_roles'] = free_roles
flavors = api.flavor.Flavor.list(self.request)
flavors.sort(key=lambda np: (np.vcpus, np.ram, np.disk))
context['flavors'] = list(
_flavor_data(self.request, flavors, flavor_roles))
else: else:
nodes = [] context['nodes'] = list(_node_data(
for node in api.node.Node.list(self.request, maintenance=False): self.request,
role = node_role(self.request, node) api.node.Node.list(self.request, maintenance=False),
nodes.append({ ))
'uuid': node.uuid,
'role_name': role.name if role else '',
'role_slug': (
django.utils.text.slugify(role.name) if role else ''),
'state': node.state,
'state_slug': django.utils.text.slugify(
unicode(node.state)),
'state_icon': NODE_STATE_ICON.get(node.state,
NODE_STATE_ICON[None]),
})
context['nodes'] = nodes
return context return context
def get_progress_update(self, request, data): def get_progress_update(self, request, data):

View File

@@ -0,0 +1,18 @@
{% load i18n %}
<div
class="boxes-node"
data-toggle="popover"
title="{{ node.role_name|title|default:_('Free') }} {% trans 'node' %}"
data-content="<dl>
<dt>{% trans "Node UUID" %}</dt>
<dd>{{ node.uuid }}</dd>
<dt>{% trans "Architecture" %}</dt>
<dd>{{ node.cpu_arch }}</dd>
<dt>{% trans "CPUs" %}</dt>
<dd>{{ node.cpus }}</dt>
<dt>{% trans "RAM (MB)" %}</dt>
<dd>{{ node.memory_mb }}</dd>
<dt>{% trans "HDD (GB)" %}</dt>
<dd>{{ node.local_gb }}</dd>
</dl>"
>free</div>

View File

@@ -49,4 +49,16 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
<script type="text/javascript">
(window.$ || window.addHorizonLoadEvent)(function () {
$('div.boxes-node').popover({
'trigger': 'hover',
'placement': 'auto',
'delay': 500,
'html': true
});
});
</script>
{% endblock %} {% endblock %}

View File

@@ -68,7 +68,7 @@
</div> </div>
<div class="col-xs-7 boxes-nodes"> <div class="col-xs-7 boxes-nodes">
{% for node in flavor.nodes %}{% spaceless %} {% for node in flavor.nodes %}{% spaceless %}
<div class="boxes-node">free</div> {% include "tuskar_boxes/overview/_node_info.html" with node=node %}
{% endspaceless %}{% endfor %} {% endspaceless %}{% endfor %}
</div> </div>
</div> </div>