diff --git a/openstackclient/compute/v2/server_image.py b/openstackclient/compute/v2/server_image.py index c12bc2b3ae..6c0e3b22cf 100644 --- a/openstackclient/compute/v2/server_image.py +++ b/openstackclient/compute/v2/server_image.py @@ -18,6 +18,7 @@ import importlib import logging +from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -48,6 +49,16 @@ class CreateServerImage(command.ShowOne): metavar='', help=_('Name of new disk image (default: server name)'), ) + parser.add_argument( + '--property', + metavar='', + dest='properties', + action=parseractions.KeyValueAction, + help=_( + 'Set a new property to meta_data.json on the metadata server ' + '(repeat option to set multiple values)' + ), + ) parser.add_argument( '--wait', action='store_true', @@ -76,6 +87,7 @@ class CreateServerImage(command.ShowOne): image_id = compute_client.servers.create_image( server.id, image_name, + parsed_args.properties, ) image_client = self.app.client_manager.image @@ -89,8 +101,8 @@ class CreateServerImage(command.ShowOne): ): self.app.stdout.write('\n') else: - LOG.error(_('Error creating server image: %s'), - parsed_args.server) + LOG.error( + _('Error creating server image: %s'), parsed_args.server) raise exceptions.CommandError if self.app.client_manager._api_version['image'] == '1': @@ -105,4 +117,5 @@ class CreateServerImage(command.ShowOne): ] ) info = image_module._format_image(image) + return zip(*sorted(info.items())) diff --git a/openstackclient/tests/unit/compute/v2/test_server_image.py b/openstackclient/tests/unit/compute/v2/test_server_image.py index 06f6017c11..66452a8bb8 100644 --- a/openstackclient/tests/unit/compute/v2/test_server_image.py +++ b/openstackclient/tests/unit/compute/v2/test_server_image.py @@ -130,6 +130,7 @@ class TestServerImageCreate(TestServerImage): self.servers_mock.create_image.assert_called_with( servers[0].id, servers[0].name, + None, ) self.assertEqual(self.image_columns(images[0]), columns) @@ -141,11 +142,13 @@ class TestServerImageCreate(TestServerImage): arglist = [ '--name', 'img-nam', + '--property', 'key=value', servers[0].id, ] verifylist = [ ('name', 'img-nam'), ('server', servers[0].id), + ('properties', {'key': 'value'}), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -158,6 +161,7 @@ class TestServerImageCreate(TestServerImage): self.servers_mock.create_image.assert_called_with( servers[0].id, 'img-nam', + {'key': 'value'}, ) self.assertEqual(self.image_columns(images[0]), columns) @@ -188,6 +192,7 @@ class TestServerImageCreate(TestServerImage): self.servers_mock.create_image.assert_called_with( servers[0].id, servers[0].name, + None, ) mock_wait_for_status.assert_called_once_with( @@ -220,6 +225,7 @@ class TestServerImageCreate(TestServerImage): self.servers_mock.create_image.assert_called_with( servers[0].id, servers[0].name, + None, ) mock_wait_for_status.assert_called_once_with( diff --git a/releasenotes/notes/add-missing-server-image-create-opts-3c19a7492dc50fd7.yaml b/releasenotes/notes/add-missing-server-image-create-opts-3c19a7492dc50fd7.yaml new file mode 100644 index 0000000000..b5e3c0627a --- /dev/null +++ b/releasenotes/notes/add-missing-server-image-create-opts-3c19a7492dc50fd7.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Add ``--property`` option to ``server image create`` command, allowing + users to record arbitrary key/value metadata to ``meta_data.json`` on + the metadata server.