From 9fbfe4fab3c8bcd26e20450765c3203defa22f96 Mon Sep 17 00:00:00 2001 From: liusheng Date: Thu, 14 Sep 2017 11:25:34 +0800 Subject: [PATCH] Add support for rebuilding server Change-Id: I6f85e68b34a0c928c7455e624d515f12eddb5596 --- doc/source/osc/v1/index.rst | 3 ++ moganclient/osc/v1/server.py | 40 ++++++++++++++++++++ moganclient/tests/unit/osc/v1/test_server.py | 36 ++++++++++++++++++ moganclient/v1/server.py | 8 ++++ setup.cfg | 1 + 5 files changed, 88 insertions(+) diff --git a/doc/source/osc/v1/index.rst b/doc/source/osc/v1/index.rst index aeaf1d2..b6654ca 100644 --- a/doc/source/osc/v1/index.rst +++ b/doc/source/osc/v1/index.rst @@ -51,6 +51,9 @@ Baremetalcompute server .. autoprogram-cliff:: openstack.baremetal_compute.v1 :command: baremetalcompute server unset +.. autoprogram-cliff:: openstack.baremetal_compute.v1 + :command: baremetalcompute server rebuild + ============================= Baremetalcompute server group ============================= diff --git a/moganclient/osc/v1/server.py b/moganclient/osc/v1/server.py index 3f5e8c2..7c5d197 100644 --- a/moganclient/osc/v1/server.py +++ b/moganclient/osc/v1/server.py @@ -556,6 +556,46 @@ class UnsetServer(command.Command): bc_client.server.update(server.uuid, updates) +class RebuildServer(command.Command): + """Rebuild a baremetal server.""" + + def get_parser(self, prog_name): + parser = super(RebuildServer, self).get_parser(prog_name) + parser.add_argument( + 'server', + metavar='', + help=_("Baremetal server to be rebuilt (name or UUID)") + ) + parser.add_argument( + "--image", + metavar="", + help=_('Rebuild baremetal server with this image (name or ID)'), + ) + parser.add_argument( + '--preserve-ephemeral', + action='store_true', + default=False, + help=_("Preserve the ephemeral disk partition when rebuilding") + ) + return parser + + def take_action(self, parsed_args): + bc_client = self.app.client_manager.baremetal_compute + server = utils.find_resource( + bc_client.server, + parsed_args.server, + ) + if parsed_args.image: + image = utils.find_resource( + self.app.client_manager.image.images, + parsed_args.image) + image_id = image.id + else: + image_id = None + bc_client.server.rebuild(server.uuid, image_id, + parsed_args.preserve_ephemeral) + + class StartServer(ServersActionBase): """Start a baremetal server.""" diff --git a/moganclient/tests/unit/osc/v1/test_server.py b/moganclient/tests/unit/osc/v1/test_server.py index 4f4bff8..35ecff4 100644 --- a/moganclient/tests/unit/osc/v1/test_server.py +++ b/moganclient/tests/unit/osc/v1/test_server.py @@ -753,3 +753,39 @@ class TestServerRemoveInterface(TestServer): expected_url = '/servers/%(server)s/networks/interfaces/%(port_id)s' % \ {'server': server, 'port_id': port_id} mock_delete.assert_called_once_with(expected_url) + + +@mock.patch.object(utils, 'find_resource') +@mock.patch.object(server_mgr.ServerManager, '_update_all') +class TestServerRebuild(test_base.TestBaremetalComputeV1): + def setUp(self): + super(TestServerRebuild, self).setUp() + self.cmd = server.RebuildServer(self.app, None) + self.fake_server = fakes.FakeServer.create_one_server() + + def test_server_rebuild(self, mock_update_all, mock_find): + mock_find.return_value = self.fake_server + args = [self.fake_server.uuid] + verify_args = [('server', self.fake_server.uuid)] + parsed_args = self.check_parser(self.cmd, args, verify_args) + self.cmd.take_action(parsed_args) + mock_update_all.assert_called_with( + '/servers/%s/states/provision' % self.fake_server.uuid, + data={'target': 'rebuild', 'preserve_ephemeral': False}) + + def test_server_rebuild_with_image(self, mock_update_all, mock_find): + self.app.client_manager.image = mock.Mock() + mocked_img = mock.Mock() + mocked_img.id = 'mocked-img-id' + mock_find.side_effect = [self.fake_server, mocked_img] + args = ['--image', 'mocked-img-id', '--preserve-ephemeral', + self.fake_server.uuid] + verify_args = [('image', 'mocked-img-id'), + ('preserve_ephemeral', True), + ('server', self.fake_server.uuid)] + parsed_args = self.check_parser(self.cmd, args, verify_args) + self.cmd.take_action(parsed_args) + mock_update_all.assert_called_with( + '/servers/%s/states/provision' % self.fake_server.uuid, + data={'target': 'rebuild', 'image_uuid': 'mocked-img-id', + 'preserve_ephemeral': True}) diff --git a/moganclient/v1/server.py b/moganclient/v1/server.py index 9d8541f..846399f 100644 --- a/moganclient/v1/server.py +++ b/moganclient/v1/server.py @@ -119,6 +119,14 @@ class ServerManager(base.ManagerWithFind): url = '/servers/%s' % base.getid(server_id) return self._update(url, data=updates) + def rebuild(self, server_id, image_uuid=None, preserve_ephemeral=None): + url = '/servers/%s/states/provision' % base.getid(server_id) + data = {"target": "rebuild"} + data.update(preserve_ephemeral=preserve_ephemeral) + if image_uuid: + data.update(image_uuid=image_uuid) + return self._update_all(url, data=data) + def set_power_state(self, server_id, power_state): url = '/servers/%s/states/power' % base.getid(server_id) return self._update_all(url, data={'target': power_state}) diff --git a/setup.cfg b/setup.cfg index a597700..6bf18fb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,6 +45,7 @@ openstack.baremetal_compute.v1 = baremetalcompute_server_stop = moganclient.osc.v1.server:StopServer baremetalcompute_server_reboot = moganclient.osc.v1.server:RebootServer baremetalcompute_server_set = moganclient.osc.v1.server:SetServer + baremetalcompute_server_rebuild = moganclient.osc.v1.server:RebuildServer baremetalcompute_server_unset = moganclient.osc.v1.server:UnsetServer baremetalcompute_server_unlock = moganclient.osc.v1.server:UnLockServer baremetalcompute_server_netinfo = moganclient.osc.v1.server:ShowServerNetworkInfo