Skip to content

Commit db41759

Browse files
rajatherestephenfin
authored andcommitted
compute: Require image when rebuilding a volume-backed server
A volume-backed server will have no image attribute (or rather the image property will be set to the empty string). As such, if you want to try rebuild you will need to specify an image [*]. Enforce this. [*] Before microversion 2.93, this must be the same image. However, we don't touch on that here. This will be addressed later. Change-Id: I6842dabd7acb4e3a78f894e55e616625757eb6a4 Story: 2010297 Task: 46290 (cherry picked from commit 1f63034) (cherry picked from commit 0118d57) (cherry picked from commit 53d8667)
1 parent 1c97e14 commit db41759

2 files changed

Lines changed: 30 additions & 3 deletions

File tree

‎openstackclient/compute/v2/server.py‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3313,13 +3313,21 @@ def _show_progress(progress):
33133313
server = utils.find_resource(
33143314
compute_client.servers, parsed_args.server)
33153315

3316-
# If parsed_args.image is not set, default to the currently used one.
3316+
# If parsed_args.image is not set and if the instance is image backed,
3317+
# default to the currently used one. If the instance is volume backed,
3318+
# it is not trivial to fetch the current image and probably better
3319+
# to error out in this case and ask user to supply the image.
33173320
if parsed_args.image:
33183321
image = image_client.find_image(
33193322
parsed_args.image, ignore_missing=False)
33203323
else:
3321-
image_id = server.to_dict().get('image', {}).get('id')
3322-
image = image_client.get_image(image_id)
3324+
if not server.image:
3325+
msg = _(
3326+
'The --image option is required when rebuilding a '
3327+
'volume-backed server'
3328+
)
3329+
raise exceptions.CommandError(msg)
3330+
image = image_client.get_image(server.image['id'])
33233331

33243332
kwargs = {}
33253333

‎openstackclient/tests/unit/compute/v2/test_server.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5860,6 +5860,25 @@ def test_rebuild_with_current_image(self):
58605860
self.get_image_mock.assert_called_with(self.image.id)
58615861
self.server.rebuild.assert_called_with(self.image, None)
58625862

5863+
def test_rebuild_with_volume_backed_server_no_image(self):
5864+
# the volume-backed server will have the image attribute set to an
5865+
# empty string, not null/None
5866+
self.server.image = ''
5867+
5868+
arglist = [
5869+
self.server.id,
5870+
]
5871+
verifylist = [
5872+
('server', self.server.id),
5873+
]
5874+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5875+
5876+
exc = self.assertRaises(
5877+
exceptions.CommandError,
5878+
self.cmd.take_action,
5879+
parsed_args)
5880+
self.assertIn('The --image option is required', str(exc))
5881+
58635882
def test_rebuild_with_name(self):
58645883
name = 'test-server-xxx'
58655884
arglist = [

0 commit comments

Comments
 (0)