From f3454692fbd6808a8bd82844a1b191bc8d912a16 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 23 Apr 2013 13:21:28 +0200 Subject: [PATCH] Get rid of create state in Instance We don't want to store any state in the Instance object, instead take advantage of the new mechanism whereby the result of handle_create() is passed to check_active(). This makes the autoscaling code uglier for now (since it must still store the instance state in the instance), but this will go away when we move to using co-routines to create resources in parallel. Change-Id: Ib11c8da22900453eb9713eba5106859c8a09dbe2 --- heat/engine/resources/autoscaling.py | 4 +++- heat/engine/resources/instance.py | 10 ++++------ heat/tests/test_autoscaling.py | 7 ++++--- heat/tests/test_instance_group.py | 7 ++++--- heat/tests/test_metadata_refresh.py | 12 ++++++------ 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py index f03c1725..ec716d54 100644 --- a/heat/engine/resources/autoscaling.py +++ b/heat/engine/resources/autoscaling.py @@ -84,7 +84,8 @@ class InstanceGroup(resource.Resource): def check_active(self, instances): if instances: - check_active = lambda i: i.check_active(override=False) + check_active = lambda i: i.check_active(i._create_data, + override=False) remaining = itertools.dropwhile(check_active, instances) instances[:] = list(remaining) if not instances: @@ -151,6 +152,7 @@ class InstanceGroup(resource.Resource): won't wait for it in create(). ''' if override: + self._create_data = create_data return True return super(GroupedInstance, self).check_active(create_data) diff --git a/heat/engine/resources/instance.py b/heat/engine/resources/instance.py index 315ae123..487b75dc 100644 --- a/heat/engine/resources/instance.py +++ b/heat/engine/resources/instance.py @@ -114,7 +114,6 @@ class Instance(resource.Resource): super(Instance, self).__init__(name, json_snippet, stack) self.ipaddress = None self.mime_string = None - self._server_status = None def _set_ipaddress(self, networks): ''' @@ -311,14 +310,13 @@ class Instance(resource.Resource): if server is not None: self.resource_id_set(server.id) - self._server_status = server.status + return server - def check_active(self, create_data=None): - if self._server_status == 'ACTIVE': + def check_active(self, server): + if server.status == 'ACTIVE': return True - server = self.nova().servers.get(self.resource_id) - self._server_status = server.status + server.get() if server.status == 'BUILD': return False if server.status == 'ACTIVE': diff --git a/heat/tests/test_autoscaling.py b/heat/tests/test_autoscaling.py index 1bf063af..069f98f0 100644 --- a/heat/tests/test_autoscaling.py +++ b/heat/tests/test_autoscaling.py @@ -88,11 +88,12 @@ class AutoScalingTest(unittest.TestCase): self.m.StubOutWithMock(instance.Instance, 'handle_create') self.m.StubOutWithMock(instance.Instance, 'check_active') + cookie = object() for x in range(num): - instance.Instance.handle_create().AndReturn(None) - instance.Instance.check_active(None).AndReturn(False) + instance.Instance.handle_create().AndReturn(cookie) + instance.Instance.check_active(cookie).AndReturn(False) eventlet.sleep(mox.IsA(int)).AndReturn(None) - instance.Instance.check_active(None).MultipleTimes().AndReturn(True) + instance.Instance.check_active(cookie).MultipleTimes().AndReturn(True) def _stub_lb_reload(self, expected_list, unset=True): if unset: diff --git a/heat/tests/test_instance_group.py b/heat/tests/test_instance_group.py index 55d64516..bcf4faa2 100644 --- a/heat/tests/test_instance_group.py +++ b/heat/tests/test_instance_group.py @@ -68,11 +68,12 @@ class InstanceGroupTest(unittest.TestCase): self.m.StubOutWithMock(instance.Instance, 'handle_create') self.m.StubOutWithMock(instance.Instance, 'check_active') + cookie = object() for x in range(num): - instance.Instance.handle_create().AndReturn(None) - instance.Instance.check_active(None).AndReturn(False) + instance.Instance.handle_create().AndReturn(cookie) + instance.Instance.check_active(cookie).AndReturn(False) eventlet.sleep(mox.IsA(int)).AndReturn(None) - instance.Instance.check_active(None).MultipleTimes().AndReturn(True) + instance.Instance.check_active(cookie).MultipleTimes().AndReturn(True) def create_instance_group(self, t, stack, resource_name): resource = asc.InstanceGroup(resource_name, diff --git a/heat/tests/test_metadata_refresh.py b/heat/tests/test_metadata_refresh.py index 689adfa8..ddaffe35 100644 --- a/heat/tests/test_metadata_refresh.py +++ b/heat/tests/test_metadata_refresh.py @@ -148,10 +148,9 @@ class MetadataRefreshTest(unittest.TestCase): self.m.StubOutWithMock(instance.Instance, 'handle_create') self.m.StubOutWithMock(instance.Instance, 'check_active') - instance.Instance.handle_create().AndReturn(None) - instance.Instance.check_active(None).AndReturn(True) - instance.Instance.handle_create().AndReturn(None) - instance.Instance.check_active(None).AndReturn(True) + for cookie in (object(), object()): + instance.Instance.handle_create().AndReturn(cookie) + instance.Instance.check_active(cookie).AndReturn(True) self.m.StubOutWithMock(instance.Instance, 'FnGetAtt') return stack @@ -213,8 +212,9 @@ class WaitCondMetadataUpdateTest(unittest.TestCase): self.m.StubOutWithMock(instance.Instance, 'handle_create') self.m.StubOutWithMock(instance.Instance, 'check_active') - instance.Instance.handle_create().AndReturn(None) - instance.Instance.check_active(None).AndReturn(True) + cookie = object() + instance.Instance.handle_create().AndReturn(cookie) + instance.Instance.check_active(cookie).AndReturn(True) self.m.StubOutWithMock(wc.WaitConditionHandle, 'keystone') wc.WaitConditionHandle.keystone().MultipleTimes().AndReturn(self.fc) -- 2.45.2