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)