From a4a24aaabab78cd1327fa09321e3631a582865e8 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Thu, 4 Jul 2013 13:49:50 +0100 Subject: [PATCH] engine : add suspend/resume support to User resource When a User resource is in suspended state, disable the keystone user owned by the resource blueprint stack-suspend-resume Change-Id: Iee8dddcfbc0fc9bd132ddfadd2a17eb1b0894f51 --- heat/common/heat_keystoneclient.py | 8 ++++++++ heat/engine/resources/user.py | 12 ++++++++++++ heat/tests/fakes.py | 6 ++++++ heat/tests/test_user.py | 3 +++ 4 files changed, 29 insertions(+) diff --git a/heat/common/heat_keystoneclient.py b/heat/common/heat_keystoneclient.py index 31a81455..f9bb9b60 100644 --- a/heat/common/heat_keystoneclient.py +++ b/heat/common/heat_keystoneclient.py @@ -143,3 +143,11 @@ class KeystoneClient(object): else: logger.error("Unexpected number of ec2 credentials %s for %s" % (len(cred), user_id)) + + def disable_stack_user(self, user_id): + # FIXME : This won't work with the v3 keystone API + self.client.users.update_enabled(user_id, False) + + def enable_stack_user(self, user_id): + # FIXME : This won't work with the v3 keystone API + self.client.users.update_enabled(user_id, True) diff --git a/heat/engine/resources/user.py b/heat/engine/resources/user.py index 6e53ea77..a3c25ccf 100644 --- a/heat/engine/resources/user.py +++ b/heat/engine/resources/user.py @@ -90,6 +90,18 @@ class User(resource.Resource): except clients.hkc.kc.exceptions.NotFound: pass + def handle_suspend(self): + if self.resource_id is None: + logger.error("Cannot suspend User resource before user created!") + return + self.keystone().disable_stack_user(self.resource_id) + + def handle_resume(self): + if self.resource_id is None: + logger.error("Cannot resume User resource before user created!") + return + self.keystone().enable_stack_user(self.resource_id) + def FnGetRefId(self): return unicode(self.physical_resource_name()) diff --git a/heat/tests/fakes.py b/heat/tests/fakes.py index 154ccd01..124bd4d0 100644 --- a/heat/tests/fakes.py +++ b/heat/tests/fakes.py @@ -127,3 +127,9 @@ class FakeKeystoneClient(): self.creds = None else: raise Exception('Incorrect user_id or access') + + def enable_stack_user(self, user_id): + pass + + def disable_stack_user(self, user_id): + pass diff --git a/heat/tests/test_user.py b/heat/tests/test_user.py index 7cef102d..280629ec 100644 --- a/heat/tests/test_user.py +++ b/heat/tests/test_user.py @@ -129,6 +129,9 @@ class UserTest(UserPolicyTestCase): self.assertRaises(resource.UpdateReplace, rsrc.handle_update, {}, {}, {}) + self.assertEqual(None, rsrc.handle_suspend()) + self.assertEqual(None, rsrc.handle_resume()) + rsrc.resource_id = None self.assertEqual(None, rsrc.delete()) self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state) -- 2.45.2