Avoid spurious error logging in _get_compute_nodes_in_db

When a compute service is using the ironic driver and that compute
service is not yet managing any ironic nodes, the update_available_resource
periodic will spew errors every time it runs, e.g.:

  2019-10-07 07:32:21.268 6 ERROR nova.compute.manager
  [req-9de2cbda-9d8f-4a0f-a5be-de74d26077a2 - - - - -]
  No compute node record for host primary-ironic:
  nova.exception_Remote.ComputeHostNotFound_Remote:
  Compute host primary-ironic could not be found.

  2019-10-07 07:33:22.454 6 ERROR nova.compute.manager
  [req-9de2cbda-9d8f-4a0f-a5be-de74d26077a2 - - - - -]
  No compute node record for host primary-ironic:
  nova.exception_Remote.ComputeHostNotFound_Remote:
  Compute host primary-ironic could not be found.

  2019-10-07 07:34:22.416 6 ERROR nova.compute.manager
  [req-9de2cbda-9d8f-4a0f-a5be-de74d26077a2 - - - - -]
  No compute node record for host primary-ironic:
  nova.exception_Remote.ComputeHostNotFound_Remote:
  Compute host primary-ironic could not be found.

This is a simple change to just not log anything if there are no
compute node records in the database and the driver is not reporting
any nodes to manage.

Change-Id: Ic00c80fb89d08c19d97dad9de4061cac892ad7fb
Closes-Bug: #1847054
This commit is contained in:
Matt Riedemann 2019-11-21 10:11:28 -05:00
parent 1cd5563f2d
commit 49964bdc64
3 changed files with 37 additions and 16 deletions

@ -9192,16 +9192,17 @@ class ComputeManager(manager.Manager):
:param startup: True if this is being called when the nova-compute
service is starting, False otherwise.
"""
compute_nodes_in_db = self._get_compute_nodes_in_db(context,
use_slave=True,
startup=startup)
try:
nodenames = set(self.driver.get_available_nodes())
except exception.VirtDriverNotReady:
LOG.warning("Virt driver is not ready.")
return
compute_nodes_in_db = self._get_compute_nodes_in_db(context,
nodenames,
use_slave=True,
startup=startup)
# Delete orphan compute node not reported by driver but still in db
for cn in compute_nodes_in_db:
if cn.hypervisor_hostname not in nodenames:
@ -9226,19 +9227,24 @@ class ComputeManager(manager.Manager):
self._update_available_resource_for_node(context, nodename,
startup=startup)
def _get_compute_nodes_in_db(self, context, use_slave=False,
def _get_compute_nodes_in_db(self, context, nodenames, use_slave=False,
startup=False):
try:
return objects.ComputeNodeList.get_all_by_host(context, self.host,
use_slave=use_slave)
except exception.NotFound:
if startup:
LOG.warning(
"No compute node record found for host %s. If this is "
"the first time this service is starting on this "
"host, then you can ignore this warning.", self.host)
else:
LOG.error("No compute node record for host %s", self.host)
# If the driver is not reporting any nodenames we should not
# expect there to be compute nodes so we just return in that case.
# For example, this could be an ironic compute and it is not
# managing any nodes yet.
if nodenames:
if startup:
LOG.warning(
"No compute node record found for host %s. If this is "
"the first time this service is starting on this "
"host, then you can ignore this warning.", self.host)
else:
LOG.error("No compute node record for host %s", self.host)
return []
@periodic_task.periodic_task(

@ -166,7 +166,7 @@ class BaseTestCase(test.TestCase):
self.compute.driver)
self.compute.rt = fake_rt
def fake_get_compute_nodes_in_db(self, context, **kwargs):
def fake_get_compute_nodes_in_db(self, context, *args, **kwargs):
fake_compute_nodes = [{'local_gb': 259,
'uuid': uuids.fake_compute_node,
'vcpus_used': 0,

@ -336,8 +336,8 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
get_db_nodes.return_value = db_nodes
get_avail_nodes.return_value = avail_nodes
self.compute.update_available_resource(self.context, startup=True)
get_db_nodes.assert_called_once_with(self.context, use_slave=True,
startup=True)
get_db_nodes.assert_called_once_with(self.context, avail_nodes,
use_slave=True, startup=True)
self.assertEqual(len(avail_nodes_l), update_mock.call_count)
update_mock.assert_has_calls(
[mock.call(self.context, node, startup=True)
@ -398,12 +398,27 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
compute node on startup since this may be expected.
"""
self.assertEqual([], self.compute._get_compute_nodes_in_db(
self.context, startup=True))
self.context, {'fake-node'}, startup=True))
get_all_by_host.assert_called_once_with(
self.context, self.compute.host, use_slave=False)
self.assertTrue(mock_log.warning.called)
self.assertFalse(mock_log.error.called)
@mock.patch.object(objects.ComputeNodeList, 'get_all_by_host',
side_effect=exception.NotFound)
@mock.patch('nova.compute.manager.LOG')
def test_get_compute_nodes_in_db_not_found_no_nodenames(
self, mock_log, get_all_by_host):
"""Tests to make sure that _get_compute_nodes_in_db does not log
anything when ComputeNodeList.get_all_by_host raises NotFound and the
driver did not report any nodenames.
"""
self.assertEqual([], self.compute._get_compute_nodes_in_db(
self.context, set()))
get_all_by_host.assert_called_once_with(
self.context, self.compute.host, use_slave=False)
mock_log.assert_not_called()
def _trusted_certs_setup_instance(self, include_trusted_certs=True):
instance = fake_instance.fake_instance_obj(self.context)
if include_trusted_certs: