diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 61fffe2d3..3f31bc26e 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1580,6 +1580,12 @@ def _match_image(image_api, wanted_properties): ] elif parsed_args.boot_from_volume: # Tell nova to create a root volume from the image provided. + if not image: + msg = _( + "An image (--image or --image-property) is required " + "to support --boot-from-volume option" + ) + raise exceptions.CommandError(msg) block_device_mapping_v2 = [ { 'uuid': image.id, diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 5ed5eee92..42fea03de 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -3436,6 +3436,34 @@ def test_server_create_volume_boot_from_volume_conflict(self): '--volume is not allowed with --boot-from-volume', str(ex) ) + def test_server_create_boot_from_volume_no_image(self): + # Test --boot-from-volume option without --image or + # --image-property. + arglist = [ + '--flavor', + self.flavor.id, + '--boot-from-volume', + '1', + self.new_server.name, + ] + verifylist = [ + ('flavor', self.flavor.id), + ('boot_from_volume', 1), + ('config_drive', False), + ('server_name', self.new_server.name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + ex = self.assertRaises( + exceptions.CommandError, self.cmd.take_action, parsed_args + ) + # Assert it is the error we expect. + self.assertIn( + 'An image (--image or --image-property) is required ' + 'to support --boot-from-volume option', + str(ex), + ) + def test_server_create_image_property(self): arglist = [ '--image-property',