summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-13 07:18:03 +0000
committerGerrit Code Review <review@openstack.org>2014-09-13 07:18:03 +0000
commitd4bada707b863c875b9f05a8c62c494a9a2f778d (patch)
tree4c70c795bc70b626bcad633826c84a61505381e4
parent8cf9bcb985fa3e02b6d6aab199239bf109411315 (diff)
parent8a01731d4e68152e9f575bea78b2baa085986726 (diff)
downloadpython-ceilometerclient-d4bada707b863c875b9f05a8c62c494a9a2f778d.tar.gz
Merge "Verify alarm found before modifying"
-rw-r--r--ceilometerclient/common/base.py6
-rw-r--r--ceilometerclient/tests/v2/test_alarms.py20
-rw-r--r--ceilometerclient/v2/alarms.py6
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()