summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwhoami-rajat <rajatdhasmana@gmail.com>2022-09-14 11:01:31 +0100
committerStephen Finucane <sfinucan@redhat.com>2022-09-30 11:32:54 +0100
commitdb417598ed958b3f1877906d5d1bc7c5896ea168 (patch)
tree961191e85d1f3b57cae7a61be15e8355784dda10
parent1c97e1495573ea44de9b48ea83d7c8fe6096cc9b (diff)
downloadpython-openstackclient-db417598ed958b3f1877906d5d1bc7c5896ea168.tar.gz
compute: Require image when rebuilding a volume-backed server5.6.1
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 1f63034441a63b968185e1678049c01205b8e6d7) (cherry picked from commit 0118d57c027c630f726dba4659c1e554ba833405) (cherry picked from commit 53d8667b4bdd749177f39473674a917c0ad5df22)
-rw-r--r--openstackclient/compute/v2/server.py14
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py19
2 files changed, 30 insertions, 3 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 60e2572d..8597c4b5 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -3313,13 +3313,21 @@ class RebuildServer(command.ShowOne):
server = utils.find_resource(
compute_client.servers, parsed_args.server)
- # If parsed_args.image is not set, default to the currently used one.
+ # If parsed_args.image is not set and if the instance is image backed,
+ # default to the currently used one. If the instance is volume backed,
+ # it is not trivial to fetch the current image and probably better
+ # to error out in this case and ask user to supply the image.
if parsed_args.image:
image = image_client.find_image(
parsed_args.image, ignore_missing=False)
else:
- image_id = server.to_dict().get('image', {}).get('id')
- image = image_client.get_image(image_id)
+ if not server.image:
+ msg = _(
+ 'The --image option is required when rebuilding a '
+ 'volume-backed server'
+ )
+ raise exceptions.CommandError(msg)
+ image = image_client.get_image(server.image['id'])
kwargs = {}
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 8ccec91b..2b612778 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -5860,6 +5860,25 @@ class TestServerRebuild(TestServer):
self.get_image_mock.assert_called_with(self.image.id)
self.server.rebuild.assert_called_with(self.image, None)
+ def test_rebuild_with_volume_backed_server_no_image(self):
+ # the volume-backed server will have the image attribute set to an
+ # empty string, not null/None
+ self.server.image = ''
+
+ arglist = [
+ self.server.id,
+ ]
+ verifylist = [
+ ('server', self.server.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ exc = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+ self.assertIn('The --image option is required', str(exc))
+
def test_rebuild_with_name(self):
name = 'test-server-xxx'
arglist = [