Skip to content

Commit a526777

Browse files
David Moreau Simardtang-chen
andcommitted
Make --image parameter optional in "server rebuild"
The command will now default to the image currently in-use by the server, effectively making the --image parameter optional. This commit also adds basic tests for ServerRebuild since there wasn't any. Will add more full tests for it. Change-Id: I733fd3ad5a825f06563c72aa430122e1a0e3b3b0 Closes-bug: #1524406 Co-Authored-By: David Moreau Simard <dms@redhat.com> Co-Authored-By: Tang Chen <tangchen@cn.fujitsu.com>
1 parent f65f82e commit a526777

3 files changed

Lines changed: 79 additions & 7 deletions

File tree

doc/source/command-objects/server.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,15 @@ Rebuild server
375375
.. code:: bash
376376
377377
os server rebuild
378-
--image <image>
378+
[--image <image>]
379379
[--password <password>]
380380
[--wait]
381381
<server>
382382
383383
.. option:: --image <image>
384384
385-
Recreate server from this image
385+
Recreate server from the specified image (name or ID). Defaults to the
386+
currently used one.
386387
387388
.. option:: --password <password>
388389

openstackclient/compute/v2/server.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,8 +1096,8 @@ def get_parser(self, prog_name):
10961096
parser.add_argument(
10971097
'--image',
10981098
metavar='<image>',
1099-
required=True,
1100-
help=_('Recreate server from this image'),
1099+
help=_('Recreate server from the specified image (name or ID).'
1100+
' Defaults to the currently used one.'),
11011101
)
11021102
parser.add_argument(
11031103
'--password',
@@ -1115,12 +1115,13 @@ def get_parser(self, prog_name):
11151115
def take_action(self, parsed_args):
11161116
compute_client = self.app.client_manager.compute
11171117

1118-
# Lookup parsed_args.image
1119-
image = utils.find_resource(compute_client.images, parsed_args.image)
1120-
11211118
server = utils.find_resource(
11221119
compute_client.servers, parsed_args.server)
11231120

1121+
# If parsed_args.image is not set, default to the currently used one.
1122+
image_id = parsed_args.image or server._info.get('image', {}).get('id')
1123+
image = utils.find_resource(compute_client.images, image_id)
1124+
11241125
server = server.rebuild(image, parsed_args.password)
11251126
if parsed_args.wait:
11261127
if utils.wait_for_status(

openstackclient/tests/compute/v2/test_server.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,76 @@ def test_server_pause_multi_servers(self):
736736
self.run_method_with_servers('pause', 3)
737737

738738

739+
class TestServerRebuild(TestServer):
740+
741+
def setUp(self):
742+
super(TestServerRebuild, self).setUp()
743+
744+
# Return value for utils.find_resource for image
745+
self.image = image_fakes.FakeImage.create_one_image()
746+
self.cimages_mock.get.return_value = self.image
747+
748+
# Fake the rebuilt new server.
749+
new_server = compute_fakes.FakeServer.create_one_server()
750+
751+
# Fake the server to be rebuilt. The IDs of them should be the same.
752+
attrs = {
753+
'id': new_server.id,
754+
'image': {
755+
'id': self.image.id
756+
},
757+
'networks': {},
758+
'adminPass': 'passw0rd',
759+
}
760+
methods = {
761+
'rebuild': new_server,
762+
}
763+
self.server = compute_fakes.FakeServer.create_one_server(
764+
attrs=attrs,
765+
methods=methods
766+
)
767+
768+
# Return value for utils.find_resource for server.
769+
self.servers_mock.get.return_value = self.server
770+
771+
self.cmd = server.RebuildServer(self.app, None)
772+
773+
def test_rebuild_with_current_image(self):
774+
arglist = [
775+
self.server.id,
776+
]
777+
verifylist = [
778+
('server', self.server.id)
779+
]
780+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
781+
782+
# Get the command object to test.
783+
self.cmd.take_action(parsed_args)
784+
785+
self.servers_mock.get.assert_called_with(self.server.id)
786+
self.cimages_mock.get.assert_called_with(self.image.id)
787+
self.server.rebuild.assert_called_with(self.image, None)
788+
789+
def test_rebuild_with_current_image_and_password(self):
790+
password = 'password-xxx'
791+
arglist = [
792+
self.server.id,
793+
'--password', password
794+
]
795+
verifylist = [
796+
('server', self.server.id),
797+
('password', password)
798+
]
799+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
800+
801+
# Get the command object to test
802+
self.cmd.take_action(parsed_args)
803+
804+
self.servers_mock.get.assert_called_with(self.server.id)
805+
self.cimages_mock.get.assert_called_with(self.image.id)
806+
self.server.rebuild.assert_called_with(self.image, password)
807+
808+
739809
class TestServerResize(TestServer):
740810

741811
def setUp(self):

0 commit comments

Comments
 (0)