Don't log warning for missing resource_versions

Since mitaka, agents can send a new report about the resource versions
they know about, and subscribe via rpc callback push mechanisms.
Some agents don't depend on versioned objects via push, and therefore
don't need to update neutron-server about such details, anyway server
side was complaining when that dictionary was missing on the state
report.

This patch avoids the warning log for missing 'resource_versions'
field in the agent status report.

Change-Id: Ief5186871515a5700afb56ac5e3fe493b4a05e8e
Closes-Bug: 1571544
This commit is contained in:
Miguel Angel Ajo 2016-04-18 11:46:13 +02:00
parent 4d7409bb8e
commit b64b0c762b
2 changed files with 35 additions and 10 deletions

View File

@ -220,15 +220,18 @@ class AgentDbMixin(ext_agent.AgentPluginBase, AgentAvailabilityZoneMixin):
def get_configuration_dict(self, agent_db):
return self._get_dict(agent_db, 'configurations')
def _get_dict(self, agent_db, dict_name):
def _get_dict(self, agent_db, dict_name, ignore_missing=False):
json_value = None
try:
conf = jsonutils.loads(getattr(agent_db, dict_name))
json_value = getattr(agent_db, dict_name)
conf = jsonutils.loads(json_value)
except Exception:
msg = _LW('Dictionary %(dict_name)s for agent %(agent_type)s on '
'host %(host)s is invalid.')
LOG.warning(msg, {'dict_name': dict_name,
'agent_type': agent_db.agent_type,
'host': agent_db.host})
if json_value or not ignore_missing:
msg = _LW('Dictionary %(dict_name)s for agent %(agent_type)s '
'on host %(host)s is invalid.')
LOG.warning(msg, {'dict_name': dict_name,
'agent_type': agent_db.agent_type,
'host': agent_db.host})
conf = {}
return conf
@ -249,7 +252,8 @@ class AgentDbMixin(ext_agent.AgentPluginBase, AgentAvailabilityZoneMixin):
if k not in ['alive', 'configurations'])
res['alive'] = not self.is_agent_down(res['heartbeat_timestamp'])
res['configurations'] = self._get_dict(agent, 'configurations')
res['resource_versions'] = self._get_dict(agent, 'resource_versions')
res['resource_versions'] = self._get_dict(agent, 'resource_versions',
ignore_missing=True)
res['availability_zone'] = agent['availability_zone']
return self._fields(res, fields)
@ -371,7 +375,7 @@ class AgentDbMixin(ext_agent.AgentPluginBase, AgentAvailabilityZoneMixin):
# _update_local_agent_resource_versions() will call
# version_manager and bring it up to date
agent_state['resource_versions'] = self._get_dict(
agent_db, 'resource_versions')
agent_db, 'resource_versions', ignore_missing=True)
res['heartbeat_timestamp'] = current_time
if agent_state.get('start_flag'):
res['started_at'] = current_time

View File

@ -196,12 +196,33 @@ class TestAgentsDbMixin(TestAgentsDbBase):
" DHCP Agent 2015-05-06 22:40:40.432295 some.node"}
)
def test_get_dict(self):
def test__get_dict(self):
db_obj = mock.Mock(conf1='{"test": "1234"}')
conf1 = self.plugin._get_dict(db_obj, 'conf1')
self.assertIn('test', conf1)
self.assertEqual("1234", conf1['test'])
def test__get_dict_missing(self):
with mock.patch.object(agents_db.LOG, 'warning') as warn:
db_obj = mock.Mock(spec=['agent_type', 'host'])
self.plugin._get_dict(db_obj, 'missing_conf')
self.assertTrue(warn.called)
def test__get_dict_ignore_missing(self):
with mock.patch.object(agents_db.LOG, 'warning') as warn:
db_obj = mock.Mock(spec=['agent_type', 'host'])
missing_conf = self.plugin._get_dict(db_obj, 'missing_conf',
ignore_missing=True)
self.assertEqual({}, missing_conf)
warn.assert_not_called()
def test__get_dict_broken(self):
with mock.patch.object(agents_db.LOG, 'warning') as warn:
db_obj = mock.Mock(conf1='{"test": BROKEN')
conf1 = self.plugin._get_dict(db_obj, 'conf1', ignore_missing=True)
self.assertEqual({}, conf1)
self.assertTrue(warn.called)
def get_configurations_dict(self):
db_obj = mock.Mock(configurations='{"cfg1": "val1"}')
cfg = self.plugin.get_configuration_dict(db_obj)