diff options
author | Zhang Yang <neil.zhangyang@huawei.com> | 2014-05-15 00:29:27 -0700 |
---|---|---|
committer | Kieran Spear <kispear@gmail.com> | 2014-09-05 11:58:30 +1000 |
commit | 3cebf6da901b93414224a75f10661081cbc11f12 (patch) | |
tree | 83032cc8e0f7f0e72d13023719d23edc19c9b985 | |
parent | 93f3c78a8bd9ecb79fa3d719468b371e67519969 (diff) | |
download | heat-3cebf6da901b93414224a75f10661081cbc11f12.tar.gz |
Handle NotFoundException when deleting alarm
If delete a alarm which has been deleted from ceilometer
already, ceilometer client will throw a exception, and deletion
will fail, so we need to ignore NotFoundException when
deleting alarm.
Change-Id: I224c2de575106d3ce827d48853e0729b6bf9a221
(cherry picked from commit c661482b2edace9f8bded182548ba0db7a2cdafa)
-rw-r--r-- | heat/engine/resources/ceilometer/alarm.py | 12 | ||||
-rw-r--r-- | heat/tests/test_ceilometer_alarm.py | 29 |
2 files changed, 39 insertions, 2 deletions
diff --git a/heat/engine/resources/ceilometer/alarm.py b/heat/engine/resources/ceilometer/alarm.py index a0b92863e..1d288f6b8 100644 --- a/heat/engine/resources/ceilometer/alarm.py +++ b/heat/engine/resources/ceilometer/alarm.py @@ -12,6 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. +from ceilometerclient import exc as ceilometerclient_exc + from heat.common import exception from heat.engine import constraints from heat.engine import properties @@ -195,7 +197,10 @@ class CeilometerAlarm(resource.Resource): pass if self.resource_id is not None: - self.ceilometer().alarms.delete(self.resource_id) + try: + self.ceilometer().alarms.delete(self.resource_id) + except ceilometerclient_exc.HTTPNotFound: + pass class CombinationAlarm(resource.Resource): @@ -260,7 +265,10 @@ class CombinationAlarm(resource.Resource): alarm_id=self.resource_id, enabled=True) def handle_delete(self): - self.ceilometer().alarms.delete(self.resource_id) + try: + self.ceilometer().alarms.delete(self.resource_id) + except ceilometerclient_exc.HTTPNotFound: + pass def resource_mapping(): diff --git a/heat/tests/test_ceilometer_alarm.py b/heat/tests/test_ceilometer_alarm.py index 82271043a..3aac4c5c5 100644 --- a/heat/tests/test_ceilometer_alarm.py +++ b/heat/tests/test_ceilometer_alarm.py @@ -330,6 +330,23 @@ class CeilometerAlarmTest(HeatTestCase): 'MEMAlarmHigh', snippet['Resources']['MEMAlarmHigh'], stack) self.assertIsNone(rsrc.validate()) + def test_delete_alarm_not_found(self): + t = template_format.parse(alarm_template) + + self.stack = self.create_stack(template=json.dumps(t)) + self.m.StubOutWithMock(self.fa.alarms, 'delete') + self.fa.alarms.delete('foo').AndRaise( + alarm.ceilometerclient_exc.HTTPNotFound()) + + self.m.ReplayAll() + self.stack.create() + rsrc = self.stack['MEMAlarmHigh'] + + scheduler.TaskRunner(rsrc.delete)() + self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) + + self.m.VerifyAll() + @testtools.skipIf(ceilometerclient is None, 'ceilometerclient unavailable') class CombinationAlarmTest(HeatTestCase): @@ -431,3 +448,15 @@ class CombinationAlarmTest(HeatTestCase): self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll() + + def test_delete_not_found(self): + rsrc = self.create_alarm() + self.m.StubOutWithMock(self.fc.alarms, 'delete') + self.fc.alarms.delete('foo').AndRaise( + alarm.ceilometerclient_exc.HTTPNotFound()) + self.m.ReplayAll() + scheduler.TaskRunner(rsrc.create)() + scheduler.TaskRunner(rsrc.delete)() + self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) + + self.m.VerifyAll() |