Merge "Support time-delays in server.resize"

This commit is contained in:
Jenkins 2015-07-07 03:16:52 +00:00 committed by Gerrit Code Review
commit d481619ed5
3 changed files with 59 additions and 9 deletions

View File

@ -432,7 +432,10 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
If that's the case, confirm the resize, if not raise an error.
"""
self.refresh_server(server)
while server.status == 'RESIZE':
# resize operation is asynchronous so the server resize may not start
# when checking server status (the server may stay ACTIVE instead
# of RESIZE).
while server.status in ('RESIZE', 'ACTIVE'):
yield
self.refresh_server(server)
if server.status == 'VERIFY_RESIZE':

View File

@ -701,9 +701,9 @@ class InstancesTest(common.HeatTestCase):
self.m.StubOutWithMock(self.fc.servers, 'get')
self.fc.servers.get('1234').AndReturn(return_server)
def activate_status(server):
server.status = 'ACTIVE'
return_server.get = activate_status.__get__(return_server)
def fail_status(server):
server.status = 'ERROR'
return_server.get = fail_status.__get__(return_server)
self.m.StubOutWithMock(self.fc.client, 'post_servers_1234_action')
self.fc.client.post_servers_1234_action(
@ -714,7 +714,7 @@ class InstancesTest(common.HeatTestCase):
error = self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual(
"Error: resources.ud_type_f: "
"Resizing to 'm1.small' failed, status 'ACTIVE'",
"Resizing to 'm1.small' failed, status 'ERROR'",
six.text_type(error))
self.assertEqual((instance.UPDATE, instance.FAILED), instance.state)
self.m.VerifyAll()

View File

@ -1605,9 +1605,9 @@ class ServersTest(common.HeatTestCase):
self.m.StubOutWithMock(self.fc.servers, 'get')
self.fc.servers.get('1234').AndReturn(return_server)
def activate_status(server):
server.status = 'ACTIVE'
return_server.get = activate_status.__get__(return_server)
def fail_status(server):
server.status = 'ERROR'
return_server.get = fail_status.__get__(return_server)
self.m.StubOutWithMock(self.fc.client, 'post_servers_1234_action')
self.fc.client.post_servers_1234_action(
@ -1618,10 +1618,57 @@ class ServersTest(common.HeatTestCase):
error = self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual(
"Error: resources.srv_update2: Resizing to 'm1.small' failed, "
"status 'ACTIVE'", six.text_type(error))
"status 'ERROR'", six.text_type(error))
self.assertEqual((server.UPDATE, server.FAILED), server.state)
self.m.VerifyAll()
def test_server_update_flavor_resize_has_not_started(self):
"""Test update of server flavour if server resize has not started.
Server resize is asynchronous operation in nova. So when heat is
requesting resize and polling the server then the server may still be
in ACTIVE state. So we need to wait some amount of time till the server
status becomes RESIZE.
"""
# create the server for resizing
server = self.fc.servers.list()[1]
server.id = '1234'
server_resource = self._create_test_server(server,
'resize_server')
# prepare template with resized server
update_template = copy.deepcopy(server_resource.t)
update_template['Properties']['flavor'] = 'm1.small'
self.m.StubOutWithMock(self.fc.servers, 'get')
self.fc.servers.get('1234').AndReturn(server)
# define status transition when server resize
# ACTIVE(initial) -> ACTIVE -> RESIZE -> VERIFY_RESIZE
def active_status(srv):
srv.status = 'ACTIVE'
server.get = active_status.__get__(server)
def resize_status(srv):
srv.status = 'RESIZE'
server.get = resize_status.__get__(server)
def verify_resize_status(srv):
srv.status = 'VERIFY_RESIZE'
server.get = verify_resize_status.__get__(server)
self.m.StubOutWithMock(self.fc.client, 'post_servers_1234_action')
self.fc.client.post_servers_1234_action(
body={'resize': {'flavorRef': 2}}).AndReturn((202, None))
self.fc.client.post_servers_1234_action(
body={'confirmResize': None}).AndReturn((202, None))
self.m.ReplayAll()
# check that server resize has finished correctly
scheduler.TaskRunner(server_resource.update, update_template)()
self.assertEqual((server_resource.UPDATE, server_resource.COMPLETE),
server_resource.state)
self.m.VerifyAll()
def test_server_update_server_flavor_replace(self):
stack_name = 'update_flvrep'
(tmpl, stack) = self._setup_test_stack(stack_name)