From af668d395dd93f6ddadf94b6eb761f31f8e83a7c Mon Sep 17 00:00:00 2001 From: Pavel Glushchak Date: Mon, 18 Nov 2019 14:53:42 +0300 Subject: [PATCH] Don't delete compute node, when deleting service other than nova-compute We should not try to delete compute node from compute_nodes table, when destroying service other than nova-compute. Change-Id: If5b5945e699ec2e2da51d5fa90616431274849b0 Closes-Bug: #1852993 Signed-off-by: Pavel Glushchak (cherry picked from commit cff9ecb20870daa56b1cfd6fbb9f5817d1306fda) (cherry picked from commit 716cde5454a5cd527040c60dbfd2b6ed37a1975c) (cherry picked from commit e00fa24a18909d543e7761a76d7fa25145212aa7) --- nova/db/sqlalchemy/api.py | 13 +++++++------ nova/tests/unit/db/test_db_api.py | 9 +++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ed915ece1994..3b1601b96456 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -402,12 +402,13 @@ def service_destroy(context, service_id): filter_by(id=service_id).\ soft_delete(synchronize_session=False) - # TODO(sbauza): Remove the service_id filter in a later release - # once we are sure that all compute nodes report the host field - model_query(context, models.ComputeNode).\ - filter(or_(models.ComputeNode.service_id == service_id, - models.ComputeNode.host == service['host'])).\ - soft_delete(synchronize_session=False) + if service.binary == 'nova-compute': + # TODO(sbauza): Remove the service_id filter in a later release + # once we are sure that all compute nodes report the host field + model_query(context, models.ComputeNode).\ + filter(or_(models.ComputeNode.service_id == service_id, + models.ComputeNode.host == service['host'])).\ + soft_delete(synchronize_session=False) @pick_context_manager_reader diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index 9d48d08c266c..6c85996dd0f0 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -3116,6 +3116,15 @@ class ServiceTestCase(test.TestCase, ModelsObjectComparatorMixin): self._assertEqualObjects(db.service_get(self.ctxt, service2['id']), service2, ignored_keys=['compute_node']) + def test_service_destroy_not_nova_compute(self): + service = self._create_service({'binary': 'nova-consoleauth', + 'host': 'host1'}) + compute_node_dict = _make_compute_node('host1', 'node1', 'kvm', None) + compute_node = db.compute_node_create(self.ctxt, compute_node_dict) + db.service_destroy(self.ctxt, service['id']) + # make sure ComputeHostNotFound is not raised + db.compute_node_get(self.ctxt, compute_node['id']) + def test_service_update(self): service = self._create_service({}) new_values = {