summaryrefslogtreecommitdiff
path: root/nova/api/openstack/compute/services.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/api/openstack/compute/services.py')
-rw-r--r--nova/api/openstack/compute/services.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/nova/api/openstack/compute/services.py b/nova/api/openstack/compute/services.py
index b462b1a9d9..be35f62ee3 100644
--- a/nova/api/openstack/compute/services.py
+++ b/nova/api/openstack/compute/services.py
@@ -267,10 +267,25 @@ class ServiceController(wsgi.Controller):
# service delete since we could orphan resource providers and
# break the ability to do things like confirm/revert instances
# in VERIFY_RESIZE status.
- compute_nodes = objects.ComputeNodeList.get_all_by_host(
- context, service.host)
- self._assert_no_in_progress_migrations(
- context, id, compute_nodes)
+ compute_nodes = []
+ try:
+ compute_nodes = objects.ComputeNodeList.get_all_by_host(
+ context, service.host)
+ self._assert_no_in_progress_migrations(
+ context, id, compute_nodes)
+ except exception.ComputeHostNotFound:
+ # NOTE(artom) Consider the following situation:
+ # - Using the Ironic virt driver
+ # - Replacing (so removing and re-adding) all baremetal
+ # nodes associated with a single nova-compute service
+ # The update resources periodic will have destroyed the
+ # compute node records because they're no longer being
+ # reported by the virt driver. If we then attempt to
+ # manually delete the compute service record,
+ # get_all_host() above will raise, as there are no longer
+ # any compute node records for the host. Catch it here and
+ # continue to allow compute service deletion.
+ pass
aggrs = self.aggregate_api.get_aggregates_by_host(context,
service.host)