From bc782538d6c1966dcd86cc78081945d16f68b316 Mon Sep 17 00:00:00 2001 From: huangtianhua Date: Thu, 7 Jul 2016 13:36:38 +0800 Subject: [PATCH] To delete the keypair preparing for update replacement If the keypair resource is in *_FAILED, to update it will enter UpdateReplacement, but maybe the keypair exists still in nova, then we can't recreate the new one, so try to delete the old one preparing for update replacement. Change-Id: Ic5a4e1eb4625dcefe5accc484b2c8db7fbb2940d Closes-Bug: #1597602 --- heat/engine/resources/openstack/nova/keypair.py | 7 +++++++ heat/tests/openstack/nova/test_keypair.py | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/heat/engine/resources/openstack/nova/keypair.py b/heat/engine/resources/openstack/nova/keypair.py index fab0b775eb..f2c4110644 100644 --- a/heat/engine/resources/openstack/nova/keypair.py +++ b/heat/engine/resources/openstack/nova/keypair.py @@ -135,6 +135,13 @@ class KeyPair(resource.Resource): def get_reference_id(self): return self.resource_id + def prepare_for_replace(self): + if self.resource_id is None: + return + + with self.client_plugin().ignore_not_found: + self.client().keypairs.delete(self.resource_id) + def resource_mapping(): return {'OS::Nova::KeyPair': KeyPair} diff --git a/heat/tests/openstack/nova/test_keypair.py b/heat/tests/openstack/nova/test_keypair.py index d9a8ea4936..77b8ce1813 100644 --- a/heat/tests/openstack/nova/test_keypair.py +++ b/heat/tests/openstack/nova/test_keypair.py @@ -145,6 +145,18 @@ class NovaKeyPairTest(common.HeatTestCase): self.assertIn("boom", six.text_type(exc)) self.assertEqual((res.CHECK, res.FAILED), res.state) + def test_update_replace(self): + res = self._get_test_resource(self.kp_template) + res.state_set(res.CHECK, res.FAILED, 'for test') + res.resource_id = 'my_key' + # to delete the keypair preparing for replace + self.fake_keypairs.delete('my_key') + self.m.ReplayAll() + updater = scheduler.TaskRunner(res.update, res.t) + self.assertRaises(exception.UpdateReplace, updater) + + self.m.ReplayAll() + def test_delete_key_not_found(self): """Test delete non-existent key.""" test_res = self._get_test_resource(self.kp_template)