Merge "Add support for rebuild --preserve-ephemeral."

This commit is contained in:
Jenkins 2013-12-18 07:54:08 +00:00 committed by Gerrit Code Review
commit 494f3eaaaf
3 changed files with 31 additions and 8 deletions

View File

@ -245,9 +245,14 @@ def check_resize(server, flavor, flavor_id):
@scheduler.wrappertask
def rebuild(server, image_id):
def rebuild(server, image_id, preserve_ephemeral=False):
"""Rebuild the server and call check_rebuild to verify."""
server.rebuild(image_id)
# Only require a newer nova client if the new preserve_ephemeral feature is
# actually used.
kwargs = {}
if preserve_ephemeral:
kwargs['preserve_ephemeral'] = True
server.rebuild(image_id, **kwargs)
yield check_rebuild(server, image_id)

View File

@ -110,7 +110,8 @@ class Server(resource.Resource):
'Description': _('Policy on how to apply an image-id update; '
'either by requesting a server rebuild or by '
'replacing the entire server'),
'AllowedValues': ['REBUILD', 'REPLACE'],
'AllowedValues': ['REBUILD', 'REPLACE',
'REBUILD_PRESERVE_EPHEMERAL'],
'UpdateAllowed': True},
'key_name': {
'Type': 'String',
@ -401,8 +402,11 @@ class Server(resource.Resource):
image_id = nova_utils.get_image_id(self.nova(), image)
if not server:
server = self.nova().servers.get(self.resource_id)
checker = scheduler.TaskRunner(nova_utils.rebuild, server,
image_id)
preserve_ephemeral = (
image_update_policy == 'REBUILD_PRESERVE_EPHEMERAL')
checker = scheduler.TaskRunner(
nova_utils.rebuild, server, image_id,
preserve_ephemeral=preserve_ephemeral)
checkers.append(checker)
# Optimization: make sure the first task is started before

View File

@ -620,7 +620,7 @@ class ServersTest(HeatTestCase):
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
def _test_server_update_image_rebuild(self, status):
def _test_server_update_image_rebuild(self, status, policy='REBUILD'):
# Server.handle_update supports changing the image, and makes
# the change making a rebuild API call against Nova.
return_server = self.fc.servers.list()[1]
@ -631,13 +631,17 @@ class ServersTest(HeatTestCase):
new_image = 'F17-x86_64-gold'
update_template = copy.deepcopy(server.t)
update_template['Properties']['image'] = new_image
server.t['Properties']['image_update_policy'] = 'REBUILD'
server.t['Properties']['image_update_policy'] = policy
self.m.StubOutWithMock(self.fc.servers, 'get')
self.fc.servers.get(1234).MultipleTimes().AndReturn(return_server)
self.m.StubOutWithMock(self.fc.servers, 'rebuild')
# 744 is a static lookup from the fake images list
self.fc.servers.rebuild(return_server, 744, password=None)
if 'REBUILD' == policy:
self.fc.servers.rebuild(return_server, 744, password=None)
else:
self.fc.servers.rebuild(
return_server, 744, password=None, preserve_ephemeral=True)
self.m.StubOutWithMock(self.fc.client, 'post_servers_1234_action')
for stat in status:
def activate_status(serv):
@ -657,6 +661,16 @@ class ServersTest(HeatTestCase):
# It is possible for us to miss the REBUILD status.
self._test_server_update_image_rebuild(status=('ACTIVE',))
def test_server_update_image_rebuild_status_rebuild_keep_ephemeral(self):
# Normally we will see 'REBUILD' first and then 'ACTIVE".
self._test_server_update_image_rebuild(
policy='REBUILD_PRESERVE_EPHEMERAL', status=('REBUILD', 'ACTIVE'))
def test_server_update_image_rebuild_status_active_keep_ephemeral(self):
# It is possible for us to miss the REBUILD status.
self._test_server_update_image_rebuild(
policy='REBUILD_PRESERVE_EPHEMERAL', status=('ACTIVE'))
def test_server_update_image_rebuild_failed(self):
# If the status after a rebuild is not REBUILD or ACTIVE, it means the
# rebuild call failed, so we raise an explicit error.