Merge "Delete resource providers for all nodes when deleting compute service" into stable/rocky

This commit is contained in:
Zuul 2019-07-04 18:03:33 +00:00 committed by Gerrit Code Review
commit 98a335c905
3 changed files with 32 additions and 9 deletions

View File

@ -245,9 +245,14 @@ class ServiceController(wsgi.Controller):
ag.id,
service.host)
# remove the corresponding resource provider record from
# placement for this compute node
self.placementclient.delete_resource_provider(
context, service.compute_node, cascade=True)
# placement for the compute nodes managed by this service;
# remember that an ironic compute service can manage multiple
# nodes
compute_nodes = objects.ComputeNodeList.get_all_by_host(
context, service.host)
for compute_node in compute_nodes:
self.placementclient.delete_resource_provider(
context, compute_node, cascade=True)
# remove the host_mapping of this host.
try:
hm = objects.HostMapping.get_by_host(context, service.host)

View File

@ -712,25 +712,33 @@ class ServicesTestV21(test.TestCase):
"""Tests that we are still able to successfully delete a nova-compute
service even if the HostMapping is not found.
"""
@mock.patch('nova.objects.ComputeNodeList.get_all_by_host',
return_value=objects.ComputeNodeList(objects=[
objects.ComputeNode(host='host1',
hypervisor_hostname='node1'),
objects.ComputeNode(host='host1',
hypervisor_hostname='node2')]))
@mock.patch.object(self.controller.host_api, 'service_get_by_id',
return_value=objects.Service(
host='host1', binary='nova-compute',
compute_node=objects.ComputeNode()))
host='host1', binary='nova-compute'))
@mock.patch.object(self.controller.aggregate_api,
'get_aggregates_by_host',
return_value=objects.AggregateList())
@mock.patch.object(self.controller.placementclient,
'delete_resource_provider')
def _test(delete_resource_provider,
get_aggregates_by_host, service_get_by_id):
get_aggregates_by_host, service_get_by_id,
cn_get_all_by_host):
self.controller.delete(self.req, 2)
ctxt = self.req.environ['nova.context']
service_get_by_id.assert_called_once_with(ctxt, 2)
get_instances.assert_called_once_with(ctxt, 'host1')
get_aggregates_by_host.assert_called_once_with(ctxt, 'host1')
delete_resource_provider.assert_called_once_with(
ctxt, service_get_by_id.return_value.compute_node,
cascade=True)
self.assertEqual(2, delete_resource_provider.call_count)
nodes = cn_get_all_by_host.return_value
delete_resource_provider.assert_has_calls([
mock.call(ctxt, node, cascade=True) for node in nodes
], any_order=True)
get_hm.assert_called_once_with(ctxt, 'host1')
service_delete.assert_called_once_with()
_test()

View File

@ -0,0 +1,10 @@
---
fixes:
- |
`Bug 1811726`_ is fixed by deleting the resource provider (in placement)
associated with each compute node record managed by a ``nova-compute``
service when that service is deleted via the
``DELETE /os-services/{service_id}`` API. This is particularly important
for compute services managing ironic baremetal nodes.
.. _Bug 1811726: https://bugs.launchpad.net/nova/+bug/1811726