diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-09-13 07:18:03 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-09-13 07:18:03 +0000 |
commit | d4bada707b863c875b9f05a8c62c494a9a2f778d (patch) | |
tree | 4c70c795bc70b626bcad633826c84a61505381e4 | |
parent | 8cf9bcb985fa3e02b6d6aab199239bf109411315 (diff) | |
parent | 8a01731d4e68152e9f575bea78b2baa085986726 (diff) | |
download | python-ceilometerclient-d4bada707b863c875b9f05a8c62c494a9a2f778d.tar.gz |
Merge "Verify alarm found before modifying"
-rw-r--r-- | ceilometerclient/common/base.py | 6 | ||||
-rw-r--r-- | ceilometerclient/tests/v2/test_alarms.py | 20 | ||||
-rw-r--r-- | ceilometerclient/v2/alarms.py | 6 |
3 files changed, 30 insertions, 2 deletions
diff --git a/ceilometerclient/common/base.py b/ceilometerclient/common/base.py index 7d4be24..4129176 100644 --- a/ceilometerclient/common/base.py +++ b/ceilometerclient/common/base.py @@ -19,6 +19,7 @@ Base utilities to build API operation managers and objects on top of. import copy +from ceilometerclient import exc from ceilometerclient.openstack.common.apiclient import base # Python 2.4 compat @@ -55,7 +56,10 @@ class Manager(object): def _list(self, url, response_key=None, obj_class=None, body=None, expect_single=False): - body = self.api.get(url).json() + resp = self.api.get(url) + if not resp.content: + raise exc.HTTPNotFound + body = resp.json() if obj_class is None: obj_class = self.resource_class diff --git a/ceilometerclient/tests/v2/test_alarms.py b/ceilometerclient/tests/v2/test_alarms.py index c3aa6d5..7f0d8bf 100644 --- a/ceilometerclient/tests/v2/test_alarms.py +++ b/ceilometerclient/tests/v2/test_alarms.py @@ -21,6 +21,7 @@ import six from six.moves import xrange # noqa import testtools +from ceilometerclient import exc from ceilometerclient.openstack.common.apiclient import client from ceilometerclient.openstack.common.apiclient import fake_client from ceilometerclient.v2 import alarms @@ -207,6 +208,17 @@ fixtures = { None, ), }, + '/v2/alarms/unk-alarm-id': + { + 'GET': ( + {}, + None, + ), + 'PUT': ( + {}, + None, + ), + }, '/v2/alarms/alarm-id/state': { 'PUT': ( @@ -380,6 +392,14 @@ class AlarmManagerTest(testtools.TestCase): self.http_client.assert_called(*expect_get_2, pos=1) self.assertEqual('alarm', state) + def test_update_missing(self): + alarm = None + try: + alarm = self.mgr.update(alarm_id='unk-alarm-id', **UPDATE_ALARM) + except exc.CommandError: + pass + self.assertEqual(alarm, None) + def test_delete_from_alarm_class(self): alarm = self.mgr.get(alarm_id='alarm-id') self.assertIsNotNone(alarm) diff --git a/ceilometerclient/v2/alarms.py b/ceilometerclient/v2/alarms.py index 341cbb7..694b5c0 100644 --- a/ceilometerclient/v2/alarms.py +++ b/ceilometerclient/v2/alarms.py @@ -84,6 +84,7 @@ class AlarmManager(base.Manager): return self._list(self._path(alarm_id), expect_single=True)[0] except IndexError: return None + except exc.HTTPNotFound: # When we try to get deleted alarm HTTPNotFound occurs # or when alarm doesn't exists this exception don't must @@ -156,7 +157,10 @@ class AlarmManager(base.Manager): def update(self, alarm_id, **kwargs): self._compat_legacy_alarm_kwargs(kwargs) - updated = self.get(alarm_id).to_dict() + alarm = self.get(alarm_id) + if alarm is None: + raise exc.CommandError('Alarm not found: %s' % alarm_id) + updated = alarm.to_dict() updated['time_constraints'] = self._merge_time_constraints( updated.get('time_constraints', []), kwargs) kwargs = dict((k, v) for k, v in kwargs.items() |