From 73a1eed1bc27dec3682446acf53ab20ddfbce8a3 Mon Sep 17 00:00:00 2001 From: Ethan Lynn Date: Wed, 24 Aug 2016 17:38:51 +0800 Subject: [PATCH] Check action status instead of cluster status for cluster creation Senlin return an action id for asynchronous operations, we can track action status for cluster creation. Change-Id: I10ba894573f6b31d3109beadbe88b27766c97185 --- .../resources/openstack/senlin/cluster.py | 16 ++++---------- heat/tests/openstack/senlin/test_cluster.py | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/heat/engine/resources/openstack/senlin/cluster.py b/heat/engine/resources/openstack/senlin/cluster.py index 224dcae37a..7567040ade 100644 --- a/heat/engine/resources/openstack/senlin/cluster.py +++ b/heat/engine/resources/openstack/senlin/cluster.py @@ -160,20 +160,12 @@ class Cluster(resource.Resource): 'timeout': self.properties[self.TIMEOUT] } cluster = self.client().create_cluster(**params) + action_id = cluster.location.split('/')[-1] self.resource_id_set(cluster.id) - return cluster.id + return action_id - def check_create_complete(self, resource_id): - cluster = self.client().get_cluster(resource_id) - if cluster.status in [self.CLUSTER_ACTIVE, self.CLUSTER_WARNING]: - return True - elif cluster.status in [self.CLUSTER_INIT, self.CLUSTER_CREATING]: - return False - else: - raise exception.ResourceInError( - status_reason=cluster.status_reason, - resource_status=cluster.status - ) + def check_create_complete(self, action_id): + return self.client_plugin().check_action_status(action_id) def handle_delete(self): if self.resource_id is not None: diff --git a/heat/tests/openstack/senlin/test_cluster.py b/heat/tests/openstack/senlin/test_cluster.py index ff797c23b0..f68e463798 100644 --- a/heat/tests/openstack/senlin/test_cluster.py +++ b/heat/tests/openstack/senlin/test_cluster.py @@ -60,6 +60,7 @@ class FakeCluster(object): self.timeout = 3600 self.max_size = -1 self.min_size = 0 + self.location = 'actions/fake-action' def to_dict(self): return { @@ -81,6 +82,8 @@ class SenlinClusterTest(common.HeatTestCase): super(SenlinClusterTest, self).setUp() self.senlin_mock = mock.MagicMock() self.patchobject(sc.Cluster, 'client', return_value=self.senlin_mock) + self.patchobject(senlin.SenlinClientPlugin, 'client', + return_value=self.senlin_mock) self.patchobject(senlin.ProfileConstraint, 'validate', return_value=True) self.fake_cl = FakeCluster() @@ -95,6 +98,8 @@ class SenlinClusterTest(common.HeatTestCase): cluster = self._init_cluster(template) self.senlin_mock.create_cluster.return_value = self.fake_cl self.senlin_mock.get_cluster.return_value = self.fake_cl + self.senlin_mock.get_action.return_value = mock.Mock( + status='SUCCEEDED') scheduler.TaskRunner(cluster.create)() self.assertEqual((cluster.CREATE, cluster.COMPLETE), cluster.state) @@ -114,18 +119,20 @@ class SenlinClusterTest(common.HeatTestCase): } self.senlin_mock.create_cluster.assert_called_once_with( **expect_kwargs) - self.senlin_mock.get_cluster.assert_called_once_with(self.fake_cl.id) + self.senlin_mock.get_action.assert_called_once_with('fake-action') def test_cluster_create_error(self): cfg.CONF.set_override('action_retry_limit', 0, enforce_type=True) cluster = self._init_cluster(self.t) self.senlin_mock.create_cluster.return_value = self.fake_cl - self.senlin_mock.get_cluster.return_value = FakeCluster( - status='ERROR') + mock_action = mock.MagicMock() + mock_action.status = 'FAILED' + mock_action.status_reason = 'oops' + self.senlin_mock.get_action.return_value = mock_action create_task = scheduler.TaskRunner(cluster.create) ex = self.assertRaises(exception.ResourceFailure, create_task) expected = ('ResourceInError: resources.senlin-cluster: ' - 'Went to status ERROR due to "Unknown"') + 'Went to status FAILED due to "oops"') self.assertEqual(expected, six.text_type(ex)) def test_cluster_delete_success(self): @@ -165,8 +172,7 @@ class SenlinClusterTest(common.HeatTestCase): } self.senlin_mock.update_cluster.assert_called_once_with( cluster.resource_id, **cluster_update_kwargs) - self.senlin_mock.get_action.assert_called_once_with( - 'fake-action') + self.assertEqual(2, self.senlin_mock.get_action.call_count) def test_cluster_update_desire_capacity(self): cluster = self._create_cluster(self.t) @@ -187,8 +193,7 @@ class SenlinClusterTest(common.HeatTestCase): } self.senlin_mock.cluster_resize.assert_called_once_with( cluster.resource_id, **cluster_resize_kwargs) - self.senlin_mock.get_action.assert_called_once_with( - 'fake-action') + self.assertEqual(2, self.senlin_mock.get_action.call_count) def test_cluster_update_failed(self): cluster = self._create_cluster(self.t)