summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Yang <neil.zhangyang@huawei.com>2014-05-15 00:29:27 -0700
committerKieran Spear <kispear@gmail.com>2014-09-05 11:58:30 +1000
commit3cebf6da901b93414224a75f10661081cbc11f12 (patch)
tree83032cc8e0f7f0e72d13023719d23edc19c9b985
parent93f3c78a8bd9ecb79fa3d719468b371e67519969 (diff)
downloadheat-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.py12
-rw-r--r--heat/tests/test_ceilometer_alarm.py29
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()