diff --git a/novaclient/tests/v1_1/test_servers.py b/novaclient/tests/v1_1/test_servers.py index f13fa7577..2a812f856 100644 --- a/novaclient/tests/v1_1/test_servers.py +++ b/novaclient/tests/v1_1/test_servers.py @@ -261,6 +261,15 @@ class ServersTest(utils.TestCase): def test_rebuild_server_disk_config_manual(self): self._rebuild_resize_disk_config('MANUAL') + def test_rebuild_server_preserve_ephemeral(self): + s = cs.servers.get(1234) + s.rebuild(image=1, preserve_ephemeral=True) + cs.assert_called('POST', '/servers/1234/action') + body = cs.client.callstack[-1][-1] + d = body['rebuild'] + self.assertIn('preserve_ephemeral', d) + self.assertEqual(d['preserve_ephemeral'], True) + def test_resize_server(self): s = cs.servers.get(1234) s.resize(flavor=1) diff --git a/novaclient/tests/v1_1/test_shell.py b/novaclient/tests/v1_1/test_shell.py index c02dc3dcf..9e29a1425 100644 --- a/novaclient/tests/v1_1/test_shell.py +++ b/novaclient/tests/v1_1/test_shell.py @@ -733,6 +733,27 @@ class ShellTest(utils.TestCase): self.assert_called('GET', '/flavors/1', pos=-2) self.assert_called('GET', '/images/2') + def test_rebuild_preserve_ephemeral(self): + self.run_command('rebuild sample-server 1 --preserve-ephemeral') + self.assert_called('GET', '/servers', pos=-8) + self.assert_called('GET', '/servers/1234', pos=-7) + self.assert_called('GET', '/images/1', pos=-6) + self.assert_called('POST', '/servers/1234/action', + {'rebuild': {'imageRef': 1, + 'preserve_ephemeral': True}}, pos=-5) + self.assert_called('GET', '/flavors/1', pos=-2) + self.assert_called('GET', '/images/2') + + self.run_command('rebuild sample-server 1 --rebuild-password asdf') + self.assert_called('GET', '/servers', pos=-8) + self.assert_called('GET', '/servers/1234', pos=-7) + self.assert_called('GET', '/images/1', pos=-6) + self.assert_called('POST', '/servers/1234/action', + {'rebuild': {'imageRef': 1, 'adminPass': 'asdf'}}, + pos=-5) + self.assert_called('GET', '/flavors/1', pos=-2) + self.assert_called('GET', '/images/2') + def test_start(self): self.run_command('start sample-server') self.assert_called('POST', '/servers/1234/action', {'os-start': None}) diff --git a/novaclient/v1_1/servers.py b/novaclient/v1_1/servers.py index dbbad7b22..9133d4057 100644 --- a/novaclient/v1_1/servers.py +++ b/novaclient/v1_1/servers.py @@ -241,14 +241,18 @@ class Server(base.Resource): """ self.manager.reboot(self, reboot_type) - def rebuild(self, image, password=None, **kwargs): + def rebuild(self, image, password=None, preserve_ephemeral=False, + **kwargs): """ Rebuild -- shut down and then re-image -- this server. :param image: the :class:`Image` (or its ID) to re-image with. :param password: string to set as password on the rebuilt server. + :param preserve_ephemeral: If True, request that any ephemeral device + be preserved when rebuilding the instance. Defaults to False. """ - return self.manager.rebuild(self, image, password=password, **kwargs) + return self.manager.rebuild(self, image, password=password, + preserve_ephemeral=preserve_ephemeral, **kwargs) def resize(self, flavor, **kwargs): """ @@ -748,7 +752,7 @@ class ServerManager(base.BootingManagerWithFind): self._action('reboot', server, {'type': reboot_type}) def rebuild(self, server, image, password=None, disk_config=None, - **kwargs): + preserve_ephemeral=False, **kwargs): """ Rebuild -- shut down and then re-image -- a server. @@ -757,12 +761,16 @@ class ServerManager(base.BootingManagerWithFind): :param password: string to set as password on the rebuilt server. :param disk_config: partitioning mode to use on the rebuilt server. Valid values are 'AUTO' or 'MANUAL' + :param preserve_ephemeral: If True, request that any ephemeral device + be preserved when rebuilding the instance. Defaults to False. """ body = {'imageRef': base.getid(image)} if password is not None: body['adminPass'] = password if disk_config is not None: body['OS-DCF:diskConfig'] = disk_config + if preserve_ephemeral is not False: + body['preserve_ephemeral'] = True _resp, body = self._action('rebuild', server, body, **kwargs) return Server(self, body['server']) diff --git a/novaclient/v1_1/shell.py b/novaclient/v1_1/shell.py index 890fd0daa..97a377fc4 100644 --- a/novaclient/v1_1/shell.py +++ b/novaclient/v1_1/shell.py @@ -1207,6 +1207,10 @@ def do_reboot(cs, args): action="store_true", default=False, help='Skips flavor/image lookups when showing servers') +@utils.arg('--preserve-ephemeral', + action="store_true", + default=False, + help='Preserve the default ephemeral storage partition on rebuild.') def do_rebuild(cs, args): """Shutdown, re-image, and re-boot a server.""" server = _find_server(cs, args.server) @@ -1218,6 +1222,7 @@ def do_rebuild(cs, args): _password = None kwargs = utils.get_resource_manager_extra_kwargs(do_rebuild, args) + kwargs['preserve_ephemeral'] = args.preserve_ephemeral server.rebuild(image, _password, **kwargs) _print_server(cs, args)