From 663c04b2850d4f58248e28d31282fd7591dd88f0 Mon Sep 17 00:00:00 2001 From: Pradeep Kilambi Date: Tue, 15 Sep 2015 17:41:45 -0400 Subject: [PATCH] Validate required fields in meter definition Change-Id: I64b7d5b5189bb081014745bcb84edd9abefee414 Closes-Bug: #1496120 --- ceilometer/meter/notifications.py | 12 ++++++++---- ceilometer/tests/unit/meter/test_notifications.py | 13 ++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ceilometer/meter/notifications.py b/ceilometer/meter/notifications.py index de9c2480..9fb8a347 100644 --- a/ceilometer/meter/notifications.py +++ b/ceilometer/meter/notifications.py @@ -57,13 +57,17 @@ class MeterDefinition(object): JSONPATH_RW_PARSER = parser.ExtentedJsonPathParser() + REQUIRED_FIELDS = ['name', 'type', 'event_type', 'unit', 'volume', + 'resource_id'] + def __init__(self, definition_cfg): self.cfg = definition_cfg - - self._event_type = self.cfg.get('event_type') - if not self._event_type: + missing = [field for field in self.REQUIRED_FIELDS + if not self.cfg.get(field)] + if missing: raise MeterDefinitionException( - _LE("Required field event_type not specified"), self.cfg) + _LE("Required fields %s not specified") % missing, self.cfg) + self._event_type = self.cfg.get('event_type') if isinstance(self._event_type, six.string_types): self._event_type = [self._event_type] diff --git a/ceilometer/tests/unit/meter/test_notifications.py b/ceilometer/tests/unit/meter/test_notifications.py index 0ba6c644..b2750c8d 100644 --- a/ceilometer/tests/unit/meter/test_notifications.py +++ b/ceilometer/tests/unit/meter/test_notifications.py @@ -231,16 +231,19 @@ class TestMeterDefinition(test.BaseTestCase): self.assertEqual("30be1fc9a03c4e94ab05c403a8a377f2", handler.parse_fields("project_id", NOTIFICATION)) - def test_config_missing_fields(self): - cfg = dict(name="test", type="delta") + def test_config_required_missing_fields(self): + cfg = dict() try: notifications.MeterDefinition(cfg) except notifications.MeterDefinitionException as e: - self.assertEqual("Required field event_type not specified", - e.message) + self.assertEqual("Required fields ['name', 'type', 'event_type'," + " 'unit', 'volume', 'resource_id']" + " not specified", e.message) def test_bad_type_cfg_definition(self): - cfg = dict(name="test", type="foo", event_type="bar.create") + cfg = dict(name="test", type="foo", event_type="bar.create", + unit="foo", volume="bar", + resource_id="bea70e51c7340cb9d555b15cbfcaec23") try: notifications.MeterDefinition(cfg) except notifications.MeterDefinitionException as e: