Implement handle_check for Rackspace Cloud Servers

This allows Rackspace::Cloud::Server to perform a sanity check when
doing a stack.check()

Change-Id: I2300a3d1f5f83969a398e8ac11656e181bc744a6
Implements: blueprint stack-check
This commit is contained in:
Anderson Mesquita 2014-10-14 13:40:56 -03:00
parent b36dfd335f
commit 869978606c
2 changed files with 66 additions and 1 deletions

View File

@ -197,7 +197,7 @@ class CloudServer(server.Server):
def check_create_complete(self, server): def check_create_complete(self, server):
"""Check if server creation is complete and handle server configs.""" """Check if server creation is complete and handle server configs."""
if not self._check_active(server): if not super(CloudServer, self).check_create_complete(server):
return False return False
self.client_plugin().refresh_server(server) self.client_plugin().refresh_server(server)
@ -234,6 +234,26 @@ class CloudServer(server.Server):
return server return server
def handle_check(self):
server = self._check_server_status()
checks = []
if 'rack_connect' in self.context.roles:
rc_status = self._check_rack_connect_complete(server)
checks.append(
{'attr': 'rackconnect complete', 'expected': True,
'current': rc_status}
)
if 'rax_managed' in self.context.roles:
mc_status = self._check_managed_cloud_complete(server)
checks.append(
{'attr': 'managed_cloud complete', 'expected': True,
'current': mc_status}
)
self._verify_check_conditions(checks)
def resource_mapping(): def resource_mapping():
return {'Rackspace::Cloud::Server': CloudServer} return {'Rackspace::Cloud::Server': CloudServer}

View File

@ -325,6 +325,51 @@ class CloudServersTest(common.HeatTestCase):
self.assertEqual('Error: Unknown Managed Cloud automation status: FOO', self.assertEqual('Error: Unknown Managed Cloud automation status: FOO',
six.text_type(exc)) six.text_type(exc))
def _prepare_server_check(self):
templ, stack = self._setup_test_stack('server_check')
server = self.fc.servers.list()[1]
res = stack['WebServer']
res.nova = mock.Mock()
res.nova().servers.get = mock.Mock(return_value=server)
return res
def test_check_rackconnect(self):
res = self._prepare_server_check()
res._check_rack_connect_complete = mock.Mock(return_value=True)
self.ctx.roles = ['rack_connect']
scheduler.TaskRunner(res.check)()
self.assertEqual((res.CHECK, res.COMPLETE), res.state)
def test_check_rackconnect_failure(self):
self.ctx.roles = ['rack_connect']
res = self._prepare_server_check()
res._check_active = mock.Mock(return_value=True)
res._check_rack_connect_complete = mock.Mock(return_value=False)
exc = self.assertRaises(exception.ResourceFailure,
scheduler.TaskRunner(res.check))
self.assertIn('False', six.text_type(exc))
self.assertEqual((res.CHECK, res.FAILED), res.state)
def test_check_managed_cloud(self):
res = self._prepare_server_check()
res._check_managed_cloud_complete = mock.Mock(return_value=True)
self.ctx.roles = ['rax_managed']
scheduler.TaskRunner(res.check)()
self.assertEqual((res.CHECK, res.COMPLETE), res.state)
def test_check_managed_cloud_failure(self):
res = self._prepare_server_check()
res._check_managed_cloud_complete = mock.Mock(return_value=False)
self.ctx.roles = ['rax_managed']
exc = self.assertRaises(exception.ResourceFailure,
scheduler.TaskRunner(res.check))
self.assertIn('False', six.text_type(exc))
self.assertEqual((res.CHECK, res.FAILED), res.state)
@mock.patch.object(resource.Resource, 'data_set') @mock.patch.object(resource.Resource, 'data_set')
def test_create_store_admin_pass_resource_data(self, def test_create_store_admin_pass_resource_data(self,
mock_data_set): mock_data_set):