Add support for rebuilding server

Change-Id: I6f85e68b34a0c928c7455e624d515f12eddb5596
This commit is contained in:
liusheng 2017-09-14 11:25:34 +08:00
parent 9e24ea4212
commit 9fbfe4fab3
5 changed files with 88 additions and 0 deletions

View File

@ -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
=============================

View File

@ -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='<server>',
help=_("Baremetal server to be rebuilt (name or UUID)")
)
parser.add_argument(
"--image",
metavar="<image>",
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."""

View File

@ -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})

View File

@ -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})

View File

@ -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