diff --git a/monasca_common/tests/validation/test_metric_validation.py b/monasca_common/tests/validation/test_metric_validation.py index 5f942bd6..5c0f0ade 100644 --- a/monasca_common/tests/validation/test_metric_validation.py +++ b/monasca_common/tests/validation/test_metric_validation.py @@ -126,7 +126,7 @@ class TestMetricValidation(unittest.TestCase): "value": 5} self.assertRaisesRegexp( metric_validator.InvalidDimensionKey, - "invalid length for dimension key", + "invalid length \(0\) for dimension key", metric_validator.validate, metric) def test_invalid_dimension_empty_value(self): @@ -136,7 +136,7 @@ class TestMetricValidation(unittest.TestCase): "value": 5} self.assertRaisesRegexp( metric_validator.InvalidDimensionValue, - "invalid length for dimension value", + "invalid length \(0\) for dimension value", metric_validator.validate, metric) def test_invalid_dimension_non_str_key(self): @@ -166,7 +166,7 @@ class TestMetricValidation(unittest.TestCase): "value": 5} self.assertRaisesRegexp( metric_validator.InvalidDimensionKey, - "invalid length for dimension key", + "invalid length \(256\) for dimension key", metric_validator.validate, metric) def test_invalid_dimension_value_length(self): @@ -176,7 +176,7 @@ class TestMetricValidation(unittest.TestCase): "value": 5} self.assertRaisesRegexp( metric_validator.InvalidDimensionValue, - "invalid length for dimension value", + "invalid length \(256\) for dimension value", metric_validator.validate, metric) def test_invalid_dimension_key_restricted_characters(self): diff --git a/monasca_common/validation/metrics.py b/monasca_common/validation/metrics.py index 10bf9e73..e0ef0199 100644 --- a/monasca_common/validation/metrics.py +++ b/monasca_common/validation/metrics.py @@ -102,33 +102,39 @@ def validate_value_meta(value_meta): raise InvalidValueMeta("Unable to serialize valueMeta into JSON") +def validate_dimension_key(k): + if not isinstance(k, (str, unicode)): + msg = "invalid dimension key type: " \ + "{0} is not a string type".format(k) + raise InvalidDimensionKey(msg) + if len(k) > 255 or len(k) < 1: + msg = "invalid length ({0}) for dimension key {1}". \ + format(len(k), k) + raise InvalidDimensionKey(msg) + if RESTRICTED_DIMENSION_CHARS.search(k) or re.match('^_', k): + msg = "invalid characters in dimension key {0}". \ + format(k) + raise InvalidDimensionKey(msg) + + +def validate_dimension_value(k, v): + if not isinstance(v, (str, unicode)): + msg = "invalid dimension value type: {0} must be a " \ + "string (from key {1})".format(v, k) + raise InvalidDimensionValue(msg) + if len(v) > 255 or len(v) < 1: + msg = "invalid length ({0}) for dimension value {1} from key {2}". \ + format(len(v), v, k) + raise InvalidDimensionValue(msg) + if RESTRICTED_DIMENSION_CHARS.search(v): + msg = "invalid characters in dimension value {0} from key {1}".format(v, k) + raise InvalidDimensionValue(msg) + + def validate_dimensions(dimensions): for k, v in dimensions.iteritems(): - if not isinstance(k, (str, unicode)): - msg = "invalid dimension key type: " \ - "{0} in {1} is not a string type".format(k, dimensions) - raise InvalidDimensionKey(msg) - if len(k) > 255 or len(k) < 1: - msg = "invalid length for dimension key {0}: {1}".\ - format(k, dimensions) - raise InvalidDimensionKey(msg) - if RESTRICTED_DIMENSION_CHARS.search(k) or re.match('^_', k): - msg = "invalid characters in dimension key {0}: {1}".\ - format(k, dimensions) - raise InvalidDimensionKey(msg) - - if not isinstance(v, (str, unicode)): - msg = "invalid dimension value type: {0} for key {1} must be a " \ - "string: {2}".format(v, k, dimensions) - raise InvalidDimensionValue(msg) - if len(v) > 255 or len(v) < 1: - msg = "invalid length for dimension value {0} in key {1}: {2}".\ - format(v, k, dimensions) - raise InvalidDimensionValue(msg) - if RESTRICTED_DIMENSION_CHARS.search(v): - msg = "invalid characters in dimension value {0} for key {1}: " \ - "{2}".format(v, k, dimensions) - raise InvalidDimensionValue(msg) + validate_dimension_key(k) + validate_dimension_value(k, v) def validate_name(name):