diff --git a/aodh/api/controllers/v2/alarm_rules/gnocchi.py b/aodh/api/controllers/v2/alarm_rules/gnocchi.py index 818addd0d..cefe9ea3b 100644 --- a/aodh/api/controllers/v2/alarm_rules/gnocchi.py +++ b/aodh/api/controllers/v2/alarm_rules/gnocchi.py @@ -20,8 +20,8 @@ from gnocchiclient import client from gnocchiclient import exceptions from keystoneauth1 import exceptions as ka_exceptions from oslo_config import cfg -from oslo_serialization import jsonutils import pecan +import ujson import wsme from wsme import types as wtypes @@ -155,7 +155,7 @@ class AggregationMetricByResourcesLookupRule(AlarmGnocchiThresholdRule): # check the query string is a valid json try: - query = jsonutils.loads(rule.query) + query = ujson.loads(rule.query) except ValueError: raise wsme.exc.InvalidInput('rule/query', rule.query) @@ -178,7 +178,7 @@ class AggregationMetricByResourcesLookupRule(AlarmGnocchiThresholdRule): ]} query = {"and": [perms_filter, query]} - rule.query = jsonutils.dumps(query) + rule.query = ujson.dumps(query) gnocchi_client = client.Client( '1', keystone_client.get_session(conf), diff --git a/aodh/evaluator/event.py b/aodh/evaluator/event.py index 1be168a7e..3cdaabe80 100644 --- a/aodh/evaluator/event.py +++ b/aodh/evaluator/event.py @@ -17,10 +17,10 @@ import operator from oslo_config import cfg from oslo_log import log -from oslo_serialization import jsonutils from oslo_utils import fnmatch from oslo_utils import timeutils import six +import ujson from aodh import evaluator from aodh.i18n import _ @@ -253,8 +253,8 @@ class EventAlarmEvaluator(evaluator.Evaluator): 'query .') % {'id': event.id, 'event_type': event.get_value('event_type'), - 'alarm_query': jsonutils.dumps(alarm.obj.rule['query'], - sort_keys=True)}) + 'alarm_query': ujson.dumps(alarm.obj.rule['query'], + sort_keys=True)}) reason_data = {'type': 'event', 'event': event.obj} always_record = alarm.obj.repeat_actions self._refresh(alarm.obj, state, reason, reason_data, always_record) diff --git a/aodh/evaluator/gnocchi.py b/aodh/evaluator/gnocchi.py index a57adff4c..14aad481c 100644 --- a/aodh/evaluator/gnocchi.py +++ b/aodh/evaluator/gnocchi.py @@ -16,10 +16,10 @@ from gnocchiclient import client from gnocchiclient import exceptions from oslo_log import log -from oslo_serialization import jsonutils from aodh.evaluator import threshold from aodh import keystone_client +import ujson LOG = log.getLogger(__name__) @@ -140,7 +140,7 @@ class GnocchiAggregationResourcesThresholdEvaluator(GnocchiBase): return self._gnocchi_client.metric.aggregation( metrics=rule['metric'], granularity=rule['granularity'], - query=jsonutils.loads(rule['query']), + query=ujson.loads(rule['query']), resource_type=rule["resource_type"], start=start, stop=end, aggregation=rule['aggregation_method'], diff --git a/aodh/notifier/rest.py b/aodh/notifier/rest.py index 01da584e3..43f16f1aa 100644 --- a/aodh/notifier/rest.py +++ b/aodh/notifier/rest.py @@ -16,10 +16,10 @@ from oslo_config import cfg from oslo_log import log -from oslo_serialization import jsonutils from oslo_utils import uuidutils import requests import six.moves.urllib.parse as urlparse +import ujson from aodh import notifier @@ -77,7 +77,7 @@ class RestAlarmNotifier(notifier.AlarmNotifier): 'current': current, 'reason': reason, 'reason_data': reason_data} headers['content-type'] = 'application/json' - kwargs = {'data': jsonutils.dumps(body), + kwargs = {'data': ujson.dumps(body), 'headers': headers} if action.scheme == 'https': diff --git a/aodh/tests/functional/api/v2/test_alarm_scenarios.py b/aodh/tests/functional/api/v2/test_alarm_scenarios.py index ded010eac..5e5b9e1d2 100644 --- a/aodh/tests/functional/api/v2/test_alarm_scenarios.py +++ b/aodh/tests/functional/api/v2/test_alarm_scenarios.py @@ -18,10 +18,10 @@ import datetime import os import mock -from oslo_serialization import jsonutils from oslo_utils import uuidutils import six from six import moves +import ujson import webtest from aodh.api import app @@ -197,7 +197,7 @@ class TestAlarms(TestAlarmsBase): 'value': isotime}], expect_errors=True) self.assertEqual(resp.status_code, 400) - self.assertEqual(jsonutils.loads(resp.body)['error_message'] + self.assertEqual(ujson.loads(resp.body)['error_message'] ['faultstring'], 'Unknown argument: "timestamp": ' 'not valid for this resource') @@ -273,7 +273,7 @@ class TestAlarms(TestAlarmsBase): self.assertEqual(404, resp.status_code) self.assertEqual('Alarm alarm-id-3 not found in project %s' % self.auth_headers["X-Project-Id"], - jsonutils.loads(resp.body)['error_message'] + ujson.loads(resp.body)['error_message'] ['faultstring']) def test_get_alarm(self): @@ -1091,7 +1091,7 @@ class TestAlarms(TestAlarmsBase): aspect = 'user' if 'user' in identifiers else 'project' params = dict(aspect=aspect, id=identifiers[aspect]) self.assertEqual("Not Authorized to access %(aspect)s %(id)s" % params, - jsonutils.loads(resp.body)['error_message'] + ujson.loads(resp.body)['error_message'] ['faultstring']) def test_post_alarm_as_nonadmin_on_behalf_of_another_user(self): @@ -1829,14 +1829,14 @@ class TestAlarmsHistory(TestAlarmsBase): for k, v in six.iteritems(expected): current = actual.get(k) if k == 'detail' and isinstance(v, dict): - current = jsonutils.loads(current) + current = ujson.loads(current) self.assertEqual(v, current, 'mismatched field: %s' % k) self.assertIsNotNone(actual['event_id']) def _assert_in_json(self, expected, actual): - actual = jsonutils.dumps(jsonutils.loads(actual), sort_keys=True) + actual = ujson.dumps(ujson.loads(actual), sort_keys=True) for k, v in six.iteritems(expected): - fragment = jsonutils.dumps({k: v}, sort_keys=True)[1:-1] + fragment = ujson.dumps({k: v}, sort_keys=True)[1:-1] self.assertIn(fragment, actual, '%s not in %s' % (fragment, actual)) @@ -1862,7 +1862,7 @@ class TestAlarmsHistory(TestAlarmsBase): new_alarm = self._get_alarm('a') history = self._get_alarm_history('a') self.assertEqual(1, len(history)) - self.assertEqual(jsonutils.dumps({'severity': 'low'}), + self.assertEqual('{"severity": "low"}', history[0]['detail']) self.assertEqual('low', new_alarm['severity']) @@ -1879,7 +1879,7 @@ class TestAlarmsHistory(TestAlarmsBase): new_alarm = self._get_alarm('a') history = self._get_alarm_history('a') self.assertEqual(1, len(history)) - self.assertEqual("min", jsonutils.loads(history[0]['detail']) + self.assertEqual("min", ujson.loads(history[0]['detail']) ['rule']["statistic"]) self.assertEqual('min', new_alarm['threshold_rule']['statistic']) @@ -1893,14 +1893,14 @@ class TestAlarmsHistory(TestAlarmsBase): new_alarm = self._get_alarm('a') history = self._get_alarm_history('a') self.assertEqual(1, len(history)) - self.assertEqual(jsonutils.dumps({'severity': 'low'}), + self.assertEqual('{"severity": "low"}', history[0]['detail']) self.assertEqual('low', new_alarm['severity']) self._update_alarm('a', dict(severity='low')) updated_history = self._get_alarm_history('a') self.assertEqual(1, len(updated_history)) - self.assertEqual(jsonutils.dumps({'severity': 'low'}), + self.assertEqual('{"severity": "low"}', updated_history[0]['detail']) self.assertEqual(history, updated_history) @@ -2146,7 +2146,7 @@ class TestAlarmsHistory(TestAlarmsBase): query = dict(field='severity', op='eq', value='low') history = self._get_alarm_history('a', query=query) self.assertEqual(1, len(history)) - self.assertEqual(jsonutils.dumps({'severity': 'low'}), + self.assertEqual('{"severity": "low"}', history[0]['detail']) def test_get_nonexistent_alarm_history(self): @@ -2343,7 +2343,7 @@ class TestAlarmsRuleThreshold(TestAlarmsBase): resp = self.post_json('/alarms', params=json, expect_errors=True, status=400, headers=self.auth_headers) expected_error_message = 'The data type blob is not supported.' - resp_string = jsonutils.loads(resp.body) + resp_string = ujson.loads(resp.body) fault_string = resp_string['error_message']['faultstring'] self.assertTrue(fault_string.startswith(expected_error_message)) alarms = list(self.alarm_conn.get_alarms()) @@ -2731,7 +2731,7 @@ class TestAlarmsRuleGnocchi(TestAlarmsBase): self.assertEqual(1, len(alarms)) json['gnocchi_aggregation_by_resources_threshold_rule']['query'] = ( - jsonutils.dumps(expected_query)) + ujson.dumps(expected_query)) self._verify_alarm(json, alarms[0]) @@ -3044,7 +3044,7 @@ class TestPaginationQuery(TestAlarmsBase): "('alarm_id', 'enabled', 'name', 'type', 'severity'," " 'timestamp', 'user_id', 'project_id', 'state', " "'repeat_actions', 'state_timestamp')", - jsonutils.loads(resp.body)['error_message'] + ujson.loads(resp.body)['error_message'] ['faultstring']) def test_pagination_query_only_sort_key_specified(self): diff --git a/aodh/tests/tempest/service/client.py b/aodh/tests/tempest/service/client.py index 236d0efba..39d2cf891 100644 --- a/aodh/tests/tempest/service/client.py +++ b/aodh/tests/tempest/service/client.py @@ -13,12 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. -from oslo_serialization import jsonutils as json from six.moves.urllib import parse as urllib from tempest import config from tempest.lib.common import rest_client from tempest import manager - +import ujson CONF = config.CONF @@ -29,10 +28,10 @@ class AlarmingClient(rest_client.RestClient): uri_prefix = "v2" def deserialize(self, body): - return json.loads(body.replace("\n", "")) + return ujson.loads(body.replace("\n", "")) def serialize(self, body): - return json.dumps(body) + return ujson.dumps(body) def list_alarms(self, query=None): uri = '%s/alarms' % self.uri_prefix diff --git a/aodh/tests/unit/evaluator/test_event.py b/aodh/tests/unit/evaluator/test_event.py index df51f6a91..da4a39214 100644 --- a/aodh/tests/unit/evaluator/test_event.py +++ b/aodh/tests/unit/evaluator/test_event.py @@ -18,9 +18,9 @@ import datetime import six import mock -from oslo_serialization import jsonutils from oslo_utils import timeutils from oslo_utils import uuidutils +import ujson from aodh import evaluator from aodh.evaluator import event as event_evaluator @@ -128,8 +128,8 @@ class TestEventAlarmEvaluate(base.TestEvaluatorBase): 'query .') % { 'e': event['message_id'], 'type': event['event_type'], - 'query': jsonutils.dumps(alarm.rule['query'], - sort_keys=True)} + 'query': ujson.dumps(alarm.rule['query'], + sort_keys=True)} data = {'type': 'event', 'event': event} expected = dict(alarm_id=alarm.alarm_id, state=evaluator.ALARM, diff --git a/aodh/tests/unit/test_notifier.py b/aodh/tests/unit/test_notifier.py index 4291fc90d..7493b22e8 100644 --- a/aodh/tests/unit/test_notifier.py +++ b/aodh/tests/unit/test_notifier.py @@ -18,16 +18,16 @@ import time import mock from oslo_config import fixture as fixture_config import oslo_messaging -from oslo_serialization import jsonutils import requests import six.moves.urllib.parse as urlparse +import ujson from aodh import notifier from aodh import service from aodh.tests import base as tests_base -DATA_JSON = jsonutils.loads( +DATA_JSON = ujson.loads( '{"current": "ALARM", "alarm_id": "foobar", "alarm_name": "testalarm",' ' "severity": "critical", "reason": "what ?",' ' "reason_data": {"test": "test"}, "previous": "OK"}' @@ -175,7 +175,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): 'content-type': 'application/json' }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) self.assertEqual(2, len(m_log.info.call_args_list)) expected = mock.call('Notifying alarm <%(id)s> gets response: ' '%(status_code)s %(reason)s.', @@ -204,7 +204,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): 'content-type': 'application/json' }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_notify_alarm_rest_action_with_ssl_client_cert_and_key(self): action = 'https://host/action' @@ -229,7 +229,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): kwargs['headers']['x-openstack-request-id'], 'content-type': 'application/json'}, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_notify_alarm_rest_action_with_ssl_verify_disable_by_cfg(self): action = 'https://host/action' @@ -252,7 +252,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): 'content-type': 'application/json' }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_notify_alarm_rest_action_with_ssl_server_verify_enable(self): action = 'https://host/action' @@ -270,7 +270,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): headers=mock.ANY, verify=ca_bundle) args, kwargs = poster.call_args - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_notify_alarm_rest_action_with_ssl_verify_disable(self): action = 'https://host/action?aodh-alarm-ssl-verify=0' @@ -291,7 +291,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): 'content-type': 'application/json' }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_notify_alarm_rest_action_with_ssl_verify_enable_by_user(self): action = 'https://host/action?aodh-alarm-ssl-verify=1' @@ -314,7 +314,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): 'content-type': 'application/json' }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) @staticmethod def _fake_urlsplit(*args, **kwargs): @@ -375,7 +375,7 @@ class TestAlarmNotifier(tests_base.BaseTestCase): }, kwargs['headers']) - self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data'])) + self.assertEqual(DATA_JSON, ujson.loads(kwargs['data'])) def test_zaqar_notifier_action(self): with mock.patch.object(notifier.zaqar.ZaqarAlarmNotifier, diff --git a/requirements.txt b/requirements.txt index 7c2f077f4..8903501f6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,7 +20,6 @@ pbr>=2.0.0 # Apache-2.0 pecan>=0.8.0 oslo.messaging>=5.2.0 # Apache-2.0 oslo.middleware>=3.22.0 # Apache-2.0 -oslo.serialization>=1.4.0 # Apache-2.0 oslo.utils>=3.5.0 # Apache-2.0 python-ceilometerclient>=1.5.0 python-keystoneclient>=1.6.0 @@ -35,3 +34,4 @@ cachetools>=1.1.6 cotyledon keystoneauth1>=2.1 debtcollector>=1.2.0 # Apache-2.0 +ujson