From ac0f6eb063fc5a5c0a9410402ecf57fae1faf594 Mon Sep 17 00:00:00 2001 From: Devananda van der Veen Date: Fri, 1 Mar 2013 14:05:35 -0800 Subject: Compute manager should remove dead resources While most hypervisors return a single - and constant - value from driver.get_available_nodes, baremetal does not. When a node is deleted from the baremetal database, it is no longer returned from driver.get_available_nodes. However, Nova's compute_node record is not directly updated. This patch allows Compute Manager to detect missing nodes within update_available_resources. It then invokes resource_tracker to update the dead node and remove it from compute. This in turn allows the ServiceGroup API to properly update the servicegroup when a baremetal node is no longer in service. Fixes bug 1138184 Change-Id: Icfff3f8e3099668806633a6a58a152b32ec8b49b --- nova/virt/baremetal/driver.py | 10 +++++++--- nova/virt/fake.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'nova/virt') diff --git a/nova/virt/baremetal/driver.py b/nova/virt/baremetal/driver.py index 3c4dd579f..94d3f0a92 100755 --- a/nova/virt/baremetal/driver.py +++ b/nova/virt/baremetal/driver.py @@ -410,9 +410,13 @@ class BareMetalDriver(driver.ComputeDriver): def get_available_resource(self, nodename): context = nova_context.get_admin_context() - node = db.bm_node_get_by_node_uuid(context, nodename) - dic = self._node_resource(node) - return dic + resource = {} + try: + node = db.bm_node_get_by_node_uuid(context, nodename) + resource = self._node_resource(node) + except exception.NodeNotFoundByUUID: + pass + return resource def ensure_filtering_rules_for_instance(self, instance_ref, network_info): self.firewall_driver.setup_basic_filtering(instance_ref, network_info) diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 8afff569c..58f303efc 100755 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -321,7 +321,7 @@ class FakeDriver(driver.ComputeDriver): disk and ram. """ if nodename not in _FAKE_NODES: - raise exception.NovaException("node %s is not found" % nodename) + return {} dic = {'vcpus': 1, 'memory_mb': 8192, -- cgit