Merge "To display image size in human friendly format"
This commit is contained in:
commit
3707717f8f
@ -713,6 +713,12 @@ class ShowImage(command.ShowOne):
|
|||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(ShowImage, self).get_parser(prog_name)
|
parser = super(ShowImage, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
"--human-readable",
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help=_("Print image size in a human-friendly format."),
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"image",
|
"image",
|
||||||
metavar="<image>",
|
metavar="<image>",
|
||||||
@ -729,5 +735,8 @@ class ShowImage(command.ShowOne):
|
|||||||
|
|
||||||
info = {}
|
info = {}
|
||||||
info.update(image._info)
|
info.update(image._info)
|
||||||
|
if parsed_args.human_readable:
|
||||||
|
if 'size' in info:
|
||||||
|
info['size'] = utils.format_size(info['size'])
|
||||||
info['properties'] = utils.format_dict(info.get('properties', {}))
|
info['properties'] = utils.format_dict(info.get('properties', {}))
|
||||||
return zip(*sorted(six.iteritems(info)))
|
return zip(*sorted(six.iteritems(info)))
|
||||||
|
@ -905,6 +905,12 @@ class ShowImage(command.ShowOne):
|
|||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(ShowImage, self).get_parser(prog_name)
|
parser = super(ShowImage, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
"--human-readable",
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help=_("Print image size in a human-friendly format."),
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"image",
|
"image",
|
||||||
metavar="<image>",
|
metavar="<image>",
|
||||||
@ -918,6 +924,8 @@ class ShowImage(command.ShowOne):
|
|||||||
image_client.images,
|
image_client.images,
|
||||||
parsed_args.image,
|
parsed_args.image,
|
||||||
)
|
)
|
||||||
|
if parsed_args.human_readable:
|
||||||
|
image['size'] = utils.format_size(image['size'])
|
||||||
|
|
||||||
info = _format_image(image)
|
info = _format_image(image)
|
||||||
return zip(*sorted(six.iteritems(info)))
|
return zip(*sorted(six.iteritems(info)))
|
||||||
|
@ -34,6 +34,7 @@ image_properties = {
|
|||||||
}
|
}
|
||||||
image_properties_str = "Alpha='a', Beta='b', Gamma='g'"
|
image_properties_str = "Alpha='a', Beta='b', Gamma='g'"
|
||||||
image_data = 'line 1\nline 2\n'
|
image_data = 'line 1\nline 2\n'
|
||||||
|
image_size = 0
|
||||||
|
|
||||||
IMAGE = {
|
IMAGE = {
|
||||||
'id': image_id,
|
'id': image_id,
|
||||||
@ -46,6 +47,7 @@ IMAGE = {
|
|||||||
'is_public': image_public,
|
'is_public': image_public,
|
||||||
'protected': image_protected,
|
'protected': image_protected,
|
||||||
'properties': image_properties,
|
'properties': image_properties,
|
||||||
|
'size': image_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
IMAGE_columns = tuple(sorted(IMAGE))
|
IMAGE_columns = tuple(sorted(IMAGE))
|
||||||
|
@ -692,7 +692,8 @@ class TestImageSet(TestImage):
|
|||||||
|
|
||||||
class TestImageShow(TestImage):
|
class TestImageShow(TestImage):
|
||||||
|
|
||||||
_image = image_fakes.FakeImage.create_one_image()
|
_image = image_fakes.FakeImage.create_one_image(
|
||||||
|
attrs={'size': 2000})
|
||||||
columns = (
|
columns = (
|
||||||
'container_format',
|
'container_format',
|
||||||
'disk_format',
|
'disk_format',
|
||||||
@ -704,6 +705,7 @@ class TestImageShow(TestImage):
|
|||||||
'owner',
|
'owner',
|
||||||
'properties',
|
'properties',
|
||||||
'protected',
|
'protected',
|
||||||
|
'size',
|
||||||
)
|
)
|
||||||
data = (
|
data = (
|
||||||
_image.container_format,
|
_image.container_format,
|
||||||
@ -716,6 +718,7 @@ class TestImageShow(TestImage):
|
|||||||
_image.owner,
|
_image.owner,
|
||||||
utils.format_dict(_image.properties),
|
utils.format_dict(_image.properties),
|
||||||
_image.protected,
|
_image.protected,
|
||||||
|
_image.size,
|
||||||
)
|
)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -745,3 +748,25 @@ class TestImageShow(TestImage):
|
|||||||
|
|
||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
self.assertEqual(self.data, data)
|
self.assertEqual(self.data, data)
|
||||||
|
|
||||||
|
def test_image_show_human_readable(self):
|
||||||
|
arglist = [
|
||||||
|
'--human-readable',
|
||||||
|
self._image.id,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('human_readable', True),
|
||||||
|
('image', self._image.id),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
# In base command class ShowOne in cliff, abstract method take_action()
|
||||||
|
# returns a two-part tuple with a tuple of column names and a tuple of
|
||||||
|
# data to be shown.
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
self.images_mock.get.assert_called_with(
|
||||||
|
self._image.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
size_index = columns.index('size')
|
||||||
|
self.assertEqual(data[size_index], '2K')
|
||||||
|
@ -32,6 +32,7 @@ image_owner = 'baal'
|
|||||||
image_protected = False
|
image_protected = False
|
||||||
image_visibility = 'public'
|
image_visibility = 'public'
|
||||||
image_tags = []
|
image_tags = []
|
||||||
|
image_size = 0
|
||||||
|
|
||||||
IMAGE = {
|
IMAGE = {
|
||||||
'id': image_id,
|
'id': image_id,
|
||||||
@ -39,7 +40,8 @@ IMAGE = {
|
|||||||
'owner': image_owner,
|
'owner': image_owner,
|
||||||
'protected': image_protected,
|
'protected': image_protected,
|
||||||
'visibility': image_visibility,
|
'visibility': image_visibility,
|
||||||
'tags': image_tags
|
'tags': image_tags,
|
||||||
|
'size': image_size
|
||||||
}
|
}
|
||||||
|
|
||||||
IMAGE_columns = tuple(sorted(IMAGE))
|
IMAGE_columns = tuple(sorted(IMAGE))
|
||||||
@ -106,7 +108,8 @@ IMAGE_schema = {
|
|||||||
"size": {
|
"size": {
|
||||||
"type": [
|
"type": [
|
||||||
"null",
|
"null",
|
||||||
"integer"
|
"integer",
|
||||||
|
"string"
|
||||||
],
|
],
|
||||||
"description": "Size of image file in bytes (READ-ONLY)"
|
"description": "Size of image file in bytes (READ-ONLY)"
|
||||||
},
|
},
|
||||||
@ -185,7 +188,7 @@ class FakeImage(object):
|
|||||||
A dictionary with all attrbutes of image
|
A dictionary with all attrbutes of image
|
||||||
:return:
|
:return:
|
||||||
A FakeResource object with id, name, owner, protected,
|
A FakeResource object with id, name, owner, protected,
|
||||||
visibility and tags attrs
|
visibility, tags and size attrs
|
||||||
"""
|
"""
|
||||||
attrs = attrs or {}
|
attrs = attrs or {}
|
||||||
|
|
||||||
|
@ -1288,6 +1288,9 @@ class TestImageSet(TestImage):
|
|||||||
|
|
||||||
class TestImageShow(TestImage):
|
class TestImageShow(TestImage):
|
||||||
|
|
||||||
|
new_image = image_fakes.FakeImage.create_one_image(
|
||||||
|
attrs={'size': 1000})
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestImageShow, self).setUp()
|
super(TestImageShow, self).setUp()
|
||||||
|
|
||||||
@ -1322,6 +1325,29 @@ class TestImageShow(TestImage):
|
|||||||
self.assertEqual(image_fakes.IMAGE_columns, columns)
|
self.assertEqual(image_fakes.IMAGE_columns, columns)
|
||||||
self.assertEqual(image_fakes.IMAGE_SHOW_data, data)
|
self.assertEqual(image_fakes.IMAGE_SHOW_data, data)
|
||||||
|
|
||||||
|
def test_image_show_human_readable(self):
|
||||||
|
self.images_mock.get.return_value = self.new_image
|
||||||
|
arglist = [
|
||||||
|
'--human-readable',
|
||||||
|
self.new_image.id,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('human_readable', True),
|
||||||
|
('image', self.new_image.id),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
# In base command class ShowOne in cliff, abstract method take_action()
|
||||||
|
# returns a two-part tuple with a tuple of column names and a tuple of
|
||||||
|
# data to be shown.
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
self.images_mock.get.assert_called_with(
|
||||||
|
self.new_image.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
size_index = columns.index('size')
|
||||||
|
self.assertEqual(data[size_index], '1K')
|
||||||
|
|
||||||
|
|
||||||
class TestImageUnset(TestImage):
|
class TestImageUnset(TestImage):
|
||||||
|
|
||||||
|
6
releasenotes/notes/bug-1640086-21d7e5f2ce18f53c.yaml
Normal file
6
releasenotes/notes/bug-1640086-21d7e5f2ce18f53c.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Add ``--human-readable`` option to ``image show`` to display
|
||||||
|
image size in human readable format (such as K, M, G, T,..)
|
||||||
|
[Bug `1640086 <https://bugs.launchpad.net/bugs/1640086>`_]
|
Loading…
Reference in New Issue
Block a user