Skip bad meter definitions instead of erroring out

Currently we raise an exception once we hit a bad
meter definition in the yaml. Instead, skip the
bad ones and proceed with rest of the yaml.

Closes-Bug: #1503433

Change-Id: I1dd5b69bf9a92b5af5692ea75010f11a863b0afc
(cherry picked from commit 5d5aaf58c8)
This commit is contained in:
Pradeep Kilambi 2015-10-06 15:35:21 -04:00
parent 026a5d475e
commit 5cdeeacafb
2 changed files with 38 additions and 3 deletions

View File

@ -182,10 +182,17 @@ def setup_meters_config():
def load_definitions(config_def):
if not config_def:
return []
return [MeterDefinition(event_def)
for event_def in reversed(config_def['metric'])
meter_defs = []
for event_def in reversed(config_def['metric']):
try:
if (event_def['volume'] != 1 or
not cfg.CONF.notification.disable_non_metric_meters)]
not cfg.CONF.notification.disable_non_metric_meters):
meter_defs.append(MeterDefinition(event_def))
except MeterDefinitionException as me:
errmsg = (_LE("Error loading meter definition : %(err)s")
% dict(err=me.message))
LOG.error(errmsg)
return meter_defs
class InvalidPayload(Exception):

View File

@ -276,6 +276,34 @@ class TestMeterProcessing(test.BaseTestCase):
cfg = notifications.setup_meters_config()
return cfg
@mock.patch('ceilometer.meter.notifications.LOG')
def test_bad_meter_definition_skip(self, LOG):
cfg = yaml.dump(
{'metric': [dict(name="good_test_1",
event_type="test.create",
type="delta",
unit="B",
volume="$.payload.volume",
resource_id="$.payload.resource_id",
project_id="$.payload.project_id"),
dict(name="bad_test_2", type="bad_type",
event_type="bar.create",
unit="foo", volume="bar",
resource_id="bea70e51c7340cb9d555b15cbfcaec23"),
dict(name="good_test_3",
event_type="test.create",
type="delta",
unit="B",
volume="$.payload.volume",
resource_id="$.payload.resource_id",
project_id="$.payload.project_id")]})
data = self.__setup_meter_def_file(cfg)
meter_loaded = notifications.load_definitions(data)
self.assertEqual(2, len(meter_loaded))
LOG.error.assert_called_with(
"Error loading meter definition : "
"Invalid type bad_type specified")
def test_jsonpath_values_parsed(self):
cfg = yaml.dump(
{'metric': [dict(name="test1",