From ae6731710965bd5be6827223abf4b679266d079c Mon Sep 17 00:00:00 2001 From: Adam Harwell Date: Mon, 4 May 2020 16:06:02 -0700 Subject: Correct image lookup during server rebuild The switch to using glance from the SDK accidentally used get_image directly during a server rebuild, when it should have used find_image to match existing functionality. Bug introduced in: I36f292fb70c98f6e558f58be55d533d979c47ca7 Change-Id: I2005bd40a1bd6719670c7f7854316b4f9801b140 Story: 2007620 Task: 39643 --- openstackclient/compute/v2/server.py | 9 ++++-- .../tests/unit/compute/v2/test_server.py | 36 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) (limited to 'openstackclient') diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 8be78049..93e9f966 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1921,9 +1921,12 @@ class RebuildServer(command.ShowOne): compute_client.servers, parsed_args.server) # If parsed_args.image is not set, default to the currently used one. - image_id = parsed_args.image or server.to_dict().get( - 'image', {}).get('id') - image = image_client.get_image(image_id) + 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) kwargs = {} if parsed_args.property: diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 8ec8217d..7e4c71c5 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -3577,6 +3577,41 @@ class TestServerRebuild(TestServer): self.cmd = server.RebuildServer(self.app, None) + def test_rebuild_with_image_name(self): + image_name = 'my-custom-image' + user_image = image_fakes.FakeImage.create_one_image( + attrs={'name': image_name}) + self.find_image_mock.return_value = user_image + + attrs = { + 'image': { + 'id': user_image.id + }, + 'networks': {}, + 'adminPass': 'passw0rd', + } + new_server = compute_fakes.FakeServer.create_one_server(attrs=attrs) + self.server.rebuild.return_value = new_server + + arglist = [ + self.server.id, + '--image', image_name + ] + verifylist = [ + ('server', self.server.id), + ('image', image_name) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Get the command object to test. + self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.find_image_mock.assert_called_with( + image_name, ignore_missing=False) + self.get_image_mock.assert_called_with(user_image.id) + self.server.rebuild.assert_called_with(user_image, None) + def test_rebuild_with_current_image(self): arglist = [ self.server.id, @@ -3590,6 +3625,7 @@ class TestServerRebuild(TestServer): self.cmd.take_action(parsed_args) self.servers_mock.get.assert_called_with(self.server.id) + self.find_image_mock.assert_not_called() self.get_image_mock.assert_called_with(self.image.id) self.server.rebuild.assert_called_with(self.image, None) -- cgit v1.2.1