Skip to content

Commit aa041c5

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Make --image parameter optional in "server rebuild""
2 parents 8654e3e + a526777 commit aa041c5

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
@@ -1088,8 +1088,8 @@ def get_parser(self, prog_name):
10881088
parser.add_argument(
10891089
'--image',
10901090
metavar='<image>',
1091-
required=True,
1092-
help=_('Recreate server from this image'),
1091+
help=_('Recreate server from the specified image (name or ID).'
1092+
' Defaults to the currently used one.'),
10931093
)
10941094
parser.add_argument(
10951095
'--password',
@@ -1107,12 +1107,13 @@ def get_parser(self, prog_name):
11071107
def take_action(self, parsed_args):
11081108
compute_client = self.app.client_manager.compute
11091109

1110-
# Lookup parsed_args.image
1111-
image = utils.find_resource(compute_client.images, parsed_args.image)
1112-
11131110
server = utils.find_resource(
11141111
compute_client.servers, parsed_args.server)
11151112

1113+
# If parsed_args.image is not set, default to the currently used one.
1114+
image_id = parsed_args.image or server._info.get('image', {}).get('id')
1115+
image = utils.find_resource(compute_client.images, image_id)
1116+
11161117
server = server.rebuild(image, parsed_args.password)
11171118
if parsed_args.wait:
11181119
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
@@ -780,6 +780,76 @@ def test_server_pause_multi_servers(self):
780780
self.run_method_with_servers('pause', 3)
781781

782782

783+
class TestServerRebuild(TestServer):
784+
785+
def setUp(self):
786+
super(TestServerRebuild, self).setUp()
787+
788+
# Return value for utils.find_resource for image
789+
self.image = image_fakes.FakeImage.create_one_image()
790+
self.cimages_mock.get.return_value = self.image
791+
792+
# Fake the rebuilt new server.
793+
new_server = compute_fakes.FakeServer.create_one_server()
794+
795+
# Fake the server to be rebuilt. The IDs of them should be the same.
796+
attrs = {
797+
'id': new_server.id,
798+
'image': {
799+
'id': self.image.id
800+
},
801+
'networks': {},
802+
'adminPass': 'passw0rd',
803+
}
804+
methods = {
805+
'rebuild': new_server,
806+
}
807+
self.server = compute_fakes.FakeServer.create_one_server(
808+
attrs=attrs,
809+
methods=methods
810+
)
811+
812+
# Return value for utils.find_resource for server.
813+
self.servers_mock.get.return_value = self.server
814+
815+
self.cmd = server.RebuildServer(self.app, None)
816+
817+
def test_rebuild_with_current_image(self):
818+
arglist = [
819+
self.server.id,
820+
]
821+
verifylist = [
822+
('server', self.server.id)
823+
]
824+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
825+
826+
# Get the command object to test.
827+
self.cmd.take_action(parsed_args)
828+
829+
self.servers_mock.get.assert_called_with(self.server.id)
830+
self.cimages_mock.get.assert_called_with(self.image.id)
831+
self.server.rebuild.assert_called_with(self.image, None)
832+
833+
def test_rebuild_with_current_image_and_password(self):
834+
password = 'password-xxx'
835+
arglist = [
836+
self.server.id,
837+
'--password', password
838+
]
839+
verifylist = [
840+
('server', self.server.id),
841+
('password', password)
842+
]
843+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
844+
845+
# Get the command object to test
846+
self.cmd.take_action(parsed_args)
847+
848+
self.servers_mock.get.assert_called_with(self.server.id)
849+
self.cimages_mock.get.assert_called_with(self.image.id)
850+
self.server.rebuild.assert_called_with(self.image, password)
851+
852+
783853
class TestServerResize(TestServer):
784854

785855
def setUp(self):

0 commit comments

Comments
 (0)