Merge "Add support for rebuild --preserve-ephemeral."
This commit is contained in:
commit
494f3eaaaf
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue