diff options
author | Jiri Tomasek <jtomasek@redhat.com> | 2013-07-08 14:12:24 +0200 |
---|---|---|
committer | Tomas Sedovic <tomas@sedovic.cz> | 2013-08-01 16:18:56 +0200 |
commit | c6329f592b1ca60626e852d75d418e57c7ed9618 (patch) | |
tree | c5900554ac551d68a53cf3edd9adacc6e6746886 | |
parent | eec0013c5bb628edfeca51243b32d8c231780512 (diff) | |
download | tuskar-ui-c6329f592b1ca60626e852d75d418e57c7ed9618.tar.gz |
Resource Classes capacity graphs
Change-Id: I2f6dc07ba35545d0eb02b3382cf5dd1523c0b457
4 files changed, 205 insertions, 77 deletions
diff --git a/openstack_dashboard/api/management.py b/openstack_dashboard/api/management.py index 5784b7fc..a22395dc 100644 --- a/openstack_dashboard/api/management.py +++ b/openstack_dashboard/api/management.py @@ -538,8 +538,8 @@ class ResourceClass(StringIdAPIResourceWrapper): return self.__dict__['_running_virtual_machines'] @property - def total_cpu(self): - if "_total_cpu" not in self.__dict__: + def cpu(self): + if "_cpu" not in self.__dict__: try: attrs = dummymodels.Capacity.objects\ .filter(node__rack__resource_class=self._apiresource)\ @@ -550,15 +550,15 @@ class ResourceClass(StringIdAPIResourceWrapper): 'value': _('Unable to retrieve ' '(Are the nodes configured properly?)'), 'unit': ''} - total_cpu = dummymodels.Capacity(name=attrs['name'], + cpu = dummymodels.Capacity(name=attrs['name'], value=attrs['value'], unit=attrs['unit']) - self._total_cpu = Capacity(total_cpu) - return self.__dict__['_total_cpu'] + self._cpu = Capacity(cpu) + return self.__dict__['_cpu'] @property - def total_ram(self): - if "_total_ram" not in self.__dict__: + def ram(self): + if "_ram" not in self.__dict__: try: attrs = dummymodels.Capacity.objects\ .filter(node__rack__resource_class=self._apiresource)\ @@ -569,15 +569,15 @@ class ResourceClass(StringIdAPIResourceWrapper): 'value': _('Unable to retrieve ' '(Are the nodes configured properly?)'), 'unit': ''} - total_ram = dummymodels.Capacity(name=attrs['name'], + ram = dummymodels.Capacity(name=attrs['name'], value=attrs['value'], unit=attrs['unit']) - self._total_ram = Capacity(total_ram) - return self.__dict__['_total_ram'] + self._ram = Capacity(ram) + return self.__dict__['_ram'] @property - def total_storage(self): - if "_total_storage" not in self.__dict__: + def storage(self): + if "_storage" not in self.__dict__: try: attrs = dummymodels.Capacity.objects\ .filter(node__rack__resource_class=self._apiresource)\ @@ -588,11 +588,46 @@ class ResourceClass(StringIdAPIResourceWrapper): 'value': _('Unable to retrieve ' '(Are the nodes configured properly?)'), 'unit': ''} - total_storage = dummymodels.Capacity(name=attrs['name'], + storage = dummymodels.Capacity(name=attrs['name'], value=attrs['value'], unit=attrs['unit']) - self._total_storage = Capacity(total_storage) - return self.__dict__['_total_storage'] + self._storage = Capacity(storage) + return self.__dict__['_storage'] + + @property + def network(self): + if "_network" not in self.__dict__: + try: + attrs = dummymodels.Capacity.objects\ + .filter(node__rack__resource_class=self._apiresource)\ + .values('name', 'unit').annotate(value=Sum('value'))\ + .filter(name='network')[0] + except: + attrs = {'name': 'network', + 'value': _('Unable to retrieve ' + '(Are the nodes configured properly?)'), + 'unit': ''} + network = dummymodels.Capacity(name=attrs['name'], + value=attrs['value'], + unit=attrs['unit']) + self._network = Capacity(network) + return self.__dict__['_network'] + + @property + def vm_capacity(self): + if "_vm_capacity" not in self.__dict__: + try: + value = dummymodels.ResourceClassFlavor.objects\ + .filter(resource_class=self._apiresource)\ + .aggregate(Max("max_vms"))['max_vms__max'] + except: + value = _("Unable to retrieve vm capacity") + + vm_capacity = dummymodels.Capacity(name=_("Max VMs"), + value=value, + unit=_("VMs")) + self._vm_capacity = Capacity(vm_capacity) + return self.__dict__['_vm_capacity'] ########################################################################## # ResourceClass Instance methods diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tables.py b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tables.py index 2ad0ba2c..9bf9eb9f 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tables.py +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tables.py @@ -162,14 +162,18 @@ class UpdateFlavorsClass(tables.LinkAction): class ResourceClassDetailResourcesTable(racks_tables.RacksTable): - total_cpu = tables.Column("total_cpu", - verbose_name=_("Total CPU")) - total_ram = tables.Column("total_ram", - verbose_name=_("Total RAM")) - total_disk = tables.Column("total_disk", - verbose_name=_("Total DISK")) - usage = tables.Column("usage", - verbose_name=_("Usage")) + cpu = tables.Column("cpu", + verbose_name=_("Total CPU"), + filters=(lambda x: getattr(x, 'value', ''),)) + ram = tables.Column("ram", + verbose_name=_("Total RAM"), + filters=(lambda x: getattr(x, 'value', ''),)) + storage = tables.Column("storage", + verbose_name=_("Total Disk"), + filters=(lambda x: getattr(x, 'value', ''),)) + vm_capacity = tables.Column("vm_capacity", + verbose_name=_("VM Capacity"), + filters=(lambda x: getattr(x, 'value', ''),)) class Meta: name = "resources" @@ -177,7 +181,7 @@ class ResourceClassDetailResourcesTable(racks_tables.RacksTable): table_actions = (ResourcesFilterAction, UpdateResourcesClass) columns = ( 'name', 'subnet', 'location', 'node_count', - 'total_cpu', 'total_ram', 'total_disk', 'usage') + 'cpu', 'ram', 'storage', 'vm_capacity') class ResourceClassDetailFlavorsTable(flavors_tables.FlavorsTable): diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html index c9cd421b..5b5da70a 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html @@ -4,68 +4,127 @@ <h3>{% trans "Resource Class Overview" %}</h3> <div class="status row-fluid detail"> - <h4>{% trans "Info" %}</h4> - <hr class="header_rule"> - <dl> - <dt>{% trans "Name" %}</dt> - <dd>{{ resource_class.name }}</dd> - <dt>{% trans "Service Type" %}</dt> - <dd>{{ resource_class.service_type }}</dd> - <dt>{% trans "Status" %}</dt> - <dd>{{ resource_class.status|default:_("normal") }}</dd> - </dl> -</div> + <div class="span4"> + <h4>{% trans "About" %}</h4> + <hr class="header_rule"> + <dl> + <dt>{% trans "Racks" %}</dt> + <dd>{{ resource_class.racks|length }}</dd> + <dt>{% trans "Nodes" %}</dt> + <dd>{{ resource_class.nodes|length }}</dd> + </dl> + </div> -<div class="status row-fluid detail"> - <h4>{% trans "Compute Power" %}</h4> - <hr class="header_rule"> - <dl> - <dt>{% trans "Racks" %}</dt> - <dd>{{ resource_class.racks|length }}</dd> - <dt>{% trans "Nodes" %}</dt> - <dd>{{ resource_class.nodes|length }}</dd> - <dt>{% trans "Total CPU" %}</dt> - <dd>{{ resource_class.total_cpu.value }} {{ resource_class.total_cpu.unit }}</dd> - <dt>{% trans "Total RAM" %}</dt> - <dd>{{ resource_class.total_ram.value }} {{ resource_class.total_ram.unit }}</dd> - <dt>{% trans "Total Storage" %}</dt> - <dd>{{ resource_class.total_storage.value }} {{ resource_class.total_storage.unit }}</dd> - </dl> -</div> + <div class="span4"> + <h4>{% trans "Provided Service" %}</h4> + <hr class="header_rule"> + <dl> + <dt>{% trans "Type" %}</dt> + <dd>{{ resource_class.service_type }}</dd> + <dt>{% trans "Flavors" %}</dt> + <dd>{{ resource_class.flavors|length }}</dd> + <dt>{% trans "Active Instances" %}</dt> + <dd>{{ resource_class.running_virtual_machines|length }}</dd> + </dl> + </dl> + </div> -<div class="status row-fluid detail"> - <h4>{% trans "Running Virtual Machines" %}</h4> - <hr class="header_rule"> - <dl> - {% for flavor_count in resource_class.running_virtual_machines %} - <dt>{{ flavor_count.flavor.name }}</dt> - <dd>{{ flavor_count.max_vms }}</dd> - {% endfor %} - </dl> + <div class="span4"> + <h4>{% trans "Capacities" %}</h4> + <hr class="header_rule"> + <table class="capacities"> + <tr> + <td class="capacity_label">{% trans "CPU" %}:</td> + <td> + <div id="cpu_capacity_usage" + class="capacity_bar" + data-capacity-limit="{{ resource_class.cpu.value }}" + data-capacity-used="{{ resource_class.cpu.usage }}" + data-average-capacity-used="{{ 12 }}"> + </div> + </td> + <td> + <a href="#" class="modal_chart">{{ resource_class.cpu.usage }}/{{ resource_class.cpu.value }} {{ resource_class.cpu.unit }}</a> + </td> + </tr> + <tr> + <td class="capacity_label">{% trans "RAM" %}:</td> + <td> + <div id="ram_capacity_usage" + class="capacity_bar" + data-capacity-limit="{{ resource_class.ram.value }}" + data-capacity-used="{{ resource_class.ram.usage }}" + data-average-capacity-used="{{ 12 }}"> + </div> + </td> + <td> + <a href="#" class="modal_chart">{{ resource_class.ram.usage }}/{{ resource_class.ram.value }} {{ resource_class.ram.unit }}</a> + </td> + </tr> + <tr> + <td class="capacity_label">{% trans "Storage" %}:</td> + <td> + <div id="storage_capacity_usage" + class="capacity_bar" + data-capacity-limit="{{ resource_class.storage.value }}" + data-capacity-used="{{ resource_class.storage.usage }}" + data-average-capacity-used="{{ 12 }}"> + </div> + </td> + <td> + <a href="#" class="modal_chart">{{ resource_class.storage.usage }}/{{ resource_class.storage.value }} {{ resource_class.storage.unit }}</a> + </td> + </tr> + <tr> + <td class="capacity_label">{% trans "Network" %}:</td> + <td> + <div id="network_capacity_usage" + class="capacity_bar" + data-capacity-limit="{{ resource_class.network.value }}" + data-capacity-used="{{ resource_class.network.usage }}" + data-average-capacity-used="{{ 12 }}"> + </div> + </td> + <td> + <a href="#" class="modal_chart">{{ resource_class.network.usage }}/{{ resource_class.network.value }} {{ resource_class.network.unit }}</a> + </td> + </tr> + </table> + </div> </div> <div class="status row-fluid detail"> - <h4>{% trans "Virtual Capacity" %}</h4> - <hr class="header_rule"> - <dl> - {% for flavor_count in resource_class.resource_class_flavors %} - <dt>{{ flavor_count.flavor.name }}</dt> - <dd>{{ flavor_count.max_vms }}</dd> - {% endfor %} - </dl> + <div class="span6"> + <h4>{% trans "Running Virtual Machines" %}</h4> + <hr class="header_rule"> + <dl> + {% for flavor_count in resource_class.running_virtual_machines %} + <dt>{{ flavor_count.flavor.name }}</dt> + <dd>{{ flavor_count.max_vms }}</dd> + {% endfor %} + </dl> + </div> + + <div class="span6"> + <h4>{% trans "Virtual Capacity" %}</h4> + <hr class="header_rule"> + <dl> + {% for flavor_count in resource_class.resource_class_flavors %} + <dt>{{ flavor_count.flavor.name }}</dt> + <dd>{{ flavor_count.max_vms }}</dd> + {% endfor %} + </dl> + </div> </div> -<div class="row-fluid"> +<div class="row-fluid detail"> <div class="span6"> - <div class="span3"> <h4>Summary of instances and usage</h4> - </div> + <hr class="header_rule"> </div> + <div class="span6"> - <div class="span3"> - <h4>Rack health</h4> - </div> - <div class="span3 circles_chart_time_picker"> + <div class="circles_chart_time_picker"> <select data-circles-chart-command="change_time" data-receiver=".rack_health_chart"> <option value="now">Now</option> @@ -74,6 +133,8 @@ <option value="last_month">Last Month</option> </select> </div> + <h4>Rack health</h4> + <hr class="header_rule"> <div class="clear"></div> <ul class="nav nav-tabs" diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/detail.html b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/detail.html index 367fbe44..3799acab 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/detail.html +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/detail.html @@ -3,13 +3,41 @@ {% block title %}{% trans "Resource Class Detail" %}{% endblock %} {% block page_header %} - {% include "horizon/common/_page_header.html" with title="Resource Class Detail: "|add:resource_class.name %} + {% include "horizon/common/_page_header.html" with title="Resource Class Detail" %} {% endblock page_header %} {% block main %} +<h3>{{ resource_class.name }}</h3> + <div class="row-fluid"> <div class="span12"> - {{ tab_group.render }} + <div class="pull-right"> + <table class="capacities overall_usage"> + <tr> + <td class="capacity_label">{% trans "Usage" %}:</td> + <td> + <div id="resource_class_usage" + class="capacity_bar" + data-capacity-limit="{{ resource_class.vm_capacity.value }}" + data-capacity-used="{{ resource_class.vm_capacity.usage }}" + data-average-capacity-used="{{ 4 }}"> + </div> + </td> + </tr> + </table> + </div> + + {{ tab_group.render }} </div> </div> + +<script type="text/javascript" charset="utf-8"> + if(typeof horizon.Capacity !== 'undefined') { + horizon.Capacity.init(); + } else { + addHorizonLoadEvent(function() { + horizon.Capacity.init(); + }); + } +</script> {% endblock %} |