diff --git a/monasca_api/tests/test_query_helpers.py b/monasca_api/tests/test_query_helpers.py index a409f9fdf..9de82acb7 100644 --- a/monasca_api/tests/test_query_helpers.py +++ b/monasca_api/tests/test_query_helpers.py @@ -17,7 +17,6 @@ import unittest from mock import Mock -from monasca_api.v2.common.exceptions import HTTPUnprocessableEntityError import monasca_api.v2.reference.helpers as helpers @@ -92,12 +91,23 @@ class TestGetQueryDimension(unittest.TestCase): result = helpers.get_query_dimensions(req) self.assertEqual(result, {"Dimension_multi_value": "one|two|three"}) - def test_malformed_dimension_extra_colons(self): + def test_dimension_with_multi_colons(self): req = Mock() - req.query_string = ("foo=bar&dimensions=Dimension:Value1:Value2") + req.query_string = ("foo=bar&dimensions=url:http://192.168.10.4:5601," + "hostname:monasca,component:kibana,service:monitoring") - self.assertRaises( - HTTPUnprocessableEntityError, helpers.get_query_dimensions, req) + result = helpers.get_query_dimensions(req) + self.assertEqual(result, {"url": "http://192.168.10.4:5601", + "hostname": "monasca", + "component": "kibana", + "service": "monitoring"}) + + def test_empty_dimension(self): + req = Mock() + req.query_string = ("foo=bar&dimensions=") + + result = helpers.get_query_dimensions(req) + self.assertEqual(result, {}) class TestGetOldQueryParams(unittest.TestCase): diff --git a/monasca_api/v2/reference/helpers.py b/monasca_api/v2/reference/helpers.py index 431daa68f..d5309fa71 100644 --- a/monasca_api/v2/reference/helpers.py +++ b/monasca_api/v2/reference/helpers.py @@ -164,13 +164,11 @@ def get_query_dimensions(req, param_key='dimensions'): raise Exception("Error parsing dimensions, unknown format") for dimension in dimensions_str_array: - dimension_name_value = dimension.split(':') + dimension_name_value = dimension.split(':', 1) if len(dimension_name_value) == 2: dimensions[dimension_name_value[0]] = dimension_name_value[1] elif len(dimension_name_value) == 1: dimensions[dimension_name_value[0]] = "" - else: - raise Exception('Dimensions are malformed') return dimensions except Exception as ex: LOG.debug(ex) diff --git a/monasca_tempest_tests/tests/api/test_metrics.py b/monasca_tempest_tests/tests/api/test_metrics.py index 123a7609a..5d6b17820 100644 --- a/monasca_tempest_tests/tests/api/test_metrics.py +++ b/monasca_tempest_tests/tests/api/test_metrics.py @@ -216,6 +216,42 @@ class TestMetrics(base.BaseMonascaTest): "metrics = 0" self.fail(error_msg) + @test.attr(type='gate') + def test_create_metric_with_colon_in_dimension_value(self): + name = data_utils.rand_name('name') + key = 'url' + value = 'http://localhost:8070/v2.0' + timestamp = int(round(time.time() * 1000)) + time_iso = helpers.timestamp_to_iso(timestamp) + end_timestamp = int(round((time.time() + 3600 * 24) * 1000)) + end_time_iso = helpers.timestamp_to_iso(end_timestamp) + metric = helpers.create_metric(name=name, + dimensions={key: value}) + resp, response_body = self.monasca_client.create_metrics(metric) + self.assertEqual(204, resp.status) + query_param = '?name=' + name + '&start_time=' + time_iso + \ + '&end_time=' + end_time_iso + \ + '&dimensions=' + key + ':' + value + for i in xrange(constants.MAX_RETRIES): + resp, response_body = self.monasca_client. \ + list_measurements(query_param) + self.assertEqual(200, resp.status) + elements = response_body['elements'] + for element in elements: + if str(element['name']) == name: + self._verify_list_measurements_element(element, key, value) + measurement = element['measurements'][0] + self._verify_list_measurements_measurement( + measurement, metric, None, None) + return + time.sleep(constants.RETRY_WAIT_SECS) + if i == constants.MAX_RETRIES - 1: + error_msg = "Failed test_create_metric: " \ + "timeout on waiting for metrics: at least " \ + "one metric is needed. Current number of " \ + "metrics = 0" + self.fail(error_msg) + @test.attr(type='gate') @test.attr(type=['negative']) def test_create_metric_with_no_timestamp(self):