diff options
author | Ladislav Smola <lsmola@redhat.com> | 2013-07-29 08:45:56 +0200 |
---|---|---|
committer | Tomas Sedovic <tomas@sedovic.cz> | 2013-08-01 16:18:58 +0200 |
commit | b28ae98f317cfd6c8016a5f263e46a94dafbfbe7 (patch) | |
tree | 2bdaff953b24f950bc0da7f23427daef6f11d854 | |
parent | 4a315458a58ac1e585a763c384f6b9f27f59b9f5 (diff) | |
download | tuskar-ui-b28ae98f317cfd6c8016a5f263e46a94dafbfbe7.tar.gz |
Node instaces from nova
- connecting nova baremaetal instances, to nova instances
Change-Id: If8a8ae1c98325faec2a0e1ad2a9ccb3bc8fa9cc5
3 files changed, 72 insertions, 36 deletions
diff --git a/openstack_dashboard/api/tuskar.py b/openstack_dashboard/api/tuskar.py index db2ae0e1..6c0fabda 100644 --- a/openstack_dashboard/api/tuskar.py +++ b/openstack_dashboard/api/tuskar.py @@ -139,7 +139,7 @@ class Node(StringIdAPIResourceWrapper): dummy model. """ _attrs = ['id', 'pm_address', 'cpus', 'memory_mb', 'service_host', - 'local_gb'] + 'local_gb', 'pm_user'] @classmethod def manager(cls): @@ -153,7 +153,36 @@ class Node(StringIdAPIResourceWrapper): @classmethod def get(cls, request, node_id): - return cls(cls.manager().get(node_id)) + # FIXME ugly, fix after demo, make abstraction of instance details + # this is realy not optimal, but i dont hve time do fix it now + instances, more = nova.server_list( + request, + search_opts={'paginate': True}, + all_tenants=True) + + instance_details = {} + for instance in instances: + id = (instance. + _apiresource._info['OS-EXT-SRV-ATTR:hypervisor_hostname']) + instance_details[id] = instance + + node = cls(cls.manager().get(node_id)) + + detail = instance_details.get(node_id) + if detail: + addresses = detail._apiresource.addresses.get('ctlplane') + if addresses: + node.ip_address_other = (", " + .join([addr['addr'] for addr in addresses])) + + node.status = detail._apiresource._info['OS-EXT-STS:vm_state'] + node.power_mamanegemt = "" + if node.pm_user: + node.power_mamanegemt = node.pm_user + "/********" + else: + node.status = 'unprovisioned' + + return node @classmethod def list(cls, request): @@ -178,18 +207,22 @@ class Node(StringIdAPIResourceWrapper): # FIXME: just a mock of used instances, add real values used_instances = 0 + if not self.rack or not self.rack.resource_class: + return [] resource_class = self.rack.resource_class + added_flavors = tuskarclient(self.request).flavors\ .list(resource_class.id) self._flavors = [] - for f in added_flavors: - flavor_obj = Flavor(f) - #flavor_obj.max_vms = f.max_vms + if added_flavors: + for f in added_flavors: + flavor_obj = Flavor(f) + #flavor_obj.max_vms = f.max_vms - # FIXME just a mock of used instances, add real values - used_instances += 5 - flavor_obj.used_instances = used_instances - self._flavors.append(flavor_obj) + # FIXME just a mock of used instances, add real values + used_instances += 5 + flavor_obj.used_instances = used_instances + self._flavors.append(flavor_obj) return self._flavors @@ -202,9 +235,13 @@ class Node(StringIdAPIResourceWrapper): @property def rack(self): - if not hasattr(self, '_rack'): - self._rack = self._apiresource.rack - return self._rack + # FIXME association should always contain something + try: + if not hasattr(self, '_rack'): + self._rack = self._apiresource.rack + return self._rack + except: + return None @property def cpu(self): @@ -300,7 +337,7 @@ class Node(StringIdAPIResourceWrapper): @property # FIXME: just mock implementation, add proper one def is_provisioned(self): - return self.rack is not None + return self.status != "unprovisioned" and self.rack @property def alerts(self): @@ -365,6 +402,7 @@ class Rack(StringIdAPIResourceWrapper): @classmethod def get(cls, request, rack_id): rack = cls(tuskarclient(request).racks.get(rack_id)) + rack.request = request return rack @property @@ -388,7 +426,7 @@ class Rack(StringIdAPIResourceWrapper): @property def list_nodes(self): if not hasattr(self, '_nodes'): - self._nodes = [Node.get(None, node['id']) for node in ( + self._nodes = [Node.get(self.request, node['id']) for node in ( self._apiresource.nodes)] return self._nodes @@ -468,21 +506,25 @@ class Rack(StringIdAPIResourceWrapper): @property def list_flavors(self): + if not hasattr(self, '_flavors'): # FIXME just a mock of used instances, add real values used_instances = 0 + if not self.resource_class: + return [] added_flavors = tuskarclient(self.request).flavors\ .list(self.resource_class.id) self._flavors = [] - for f in added_flavors: - flavor_obj = Flavor(f) - #flavor_obj.max_vms = f.max_vms - - # FIXME just a mock of used instances, add real values - used_instances += 2 - flavor_obj.used_instances = used_instances - self._flavors.append(flavor_obj) + if added_flavors: + for f in added_flavors: + flavor_obj = Flavor(f) + #flavor_obj.max_vms = f.max_vms + + # FIXME just a mock of used instances, add real values + used_instances += 2 + flavor_obj.used_instances = used_instances + self._flavors.append(flavor_obj) return self._flavors diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/nodes/tables.py b/openstack_dashboard/dashboards/infrastructure/resource_management/nodes/tables.py index f1b19783..2bcf1cdc 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/nodes/tables.py +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/nodes/tables.py @@ -35,10 +35,6 @@ class NodesFilterAction(tables.FilterAction): class NodesTable(tables.DataTable): - STATUS_CHOICES = ( - ("active", True), - ("error", False), - ) service_host = tables.Column("service_host", link=("horizon:infrastructure:" "resource_management:nodes:detail"), @@ -46,9 +42,7 @@ class NodesTable(tables.DataTable): mac_address = tables.Column("mac_address", verbose_name=_("MAC Address")) pm_address = tables.Column("pm_address", verbose_name=_("IP Address")) status = tables.Column("status", - verbose_name=_("Status"), - status=True, - status_choices=STATUS_CHOICES) + verbose_name=_("Status")) usage = tables.Column("usage", verbose_name=_("Usage")) diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/nodes/_detail_overview.html b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/nodes/_detail_overview.html index 82cc68e3..f4cad731 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/nodes/_detail_overview.html +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/nodes/_detail_overview.html @@ -9,12 +9,12 @@ <dl> <dt>{% trans "MAC Address" %}</dt> <dd>{{ node.mac_address|default:_("None") }}</dd> - <dt>{% trans "Management IP" %}</dt> - <dd>{{ node.ip_address|default:_("None") }}</dd> - <dt>{% trans "IP Address (Other)" %}</dt> + <dt>{% trans "IPs" %}</dt> <dd>{{ node.ip_address_other|default:_("None") }}</dd> - <dt>{% trans "Location" %}</dt> - <dd>{{ node.rack.location|default:_("None") }}</dd> + <dt>{% trans "Management IP" %}</dt> + <dd>{{ node.pm_address|default:_("None") }}</dd> + <dt>{% trans "Power Management" %}</dt> + <dd>{{ node.rack.power_management|default:_("-") }}</dd> <dt>{% trans "Status" %}</dt> <dd>{{ node.status|default:_("None") }}</dd> </dl> @@ -29,8 +29,8 @@ {% else %} <dd>{% trans "None" %}</dd> {% endif %} - <dt>{% trans "Region" %}</dt> - <dd>{{ node.region|default:_("None") }}</dd> + <!--<dt>{% trans "Region" %}</dt> + <dd>{{ node.region|default:_("None") }}</dd>--> <dt>{% trans "Node Type" %}</dt> <dd>{{ node.type|default:_("none") }}</dd> <dt>{% trans "Provisioned Image" %}</dt> |