From 8e6772c36fdb99ca763d08eb2d91699376b4807f Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Mon, 15 May 2017 04:00:53 +0000 Subject: [PATCH] Use cliff formattable columns in image commands Related functional tests are converted into JSON format. Otherwise, it is not easy to check results. Partial-Bug: #1687955 Partially implement blueprint osc-formattable-columns Change-Id: I682e67be24372c0de145f8db20911b13530ae6c6 --- openstackclient/image/v1/image.py | 33 ++++++++++--------- openstackclient/image/v2/image.py | 7 ++-- .../tests/functional/image/v1/test_image.py | 2 +- .../tests/functional/image/v2/test_image.py | 6 ++-- .../unit/compute/v2/test_server_backup.py | 9 ++--- .../unit/compute/v2/test_server_image.py | 9 ++--- .../tests/unit/image/v1/test_image.py | 21 ++++++------ openstackclient/tests/unit/image/v2/fakes.py | 6 ++-- .../tests/unit/image/v2/test_image.py | 26 +++++++-------- 9 files changed, 63 insertions(+), 56 deletions(-) diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index b92da8ce5b..09f5c51058 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -26,7 +26,9 @@ if os.name == "nt": else: msvcrt = None +from cliff import columns as cliff_columns from glanceclient.common import utils as gc_utils +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import utils @@ -46,19 +48,18 @@ DISK_CHOICES = ["ami", "ari", "aki", "vhd", "vmdk", "raw", "qcow2", "vhdx", LOG = logging.getLogger(__name__) -def _format_visibility(data): - """Return a formatted visibility string +class VisibilityColumn(cliff_columns.FormattableColumn): + def human_readable(self): + """Return a formatted visibility string - :param data: - The server's visibility (is_public) status value: True, False - :rtype: - A string formatted to public/private - """ + :rtype: + A string formatted to public/private + """ - if data: - return 'public' - else: - return 'private' + if self._value: + return 'public' + else: + return 'private' class CreateImage(command.ShowOne): @@ -281,7 +282,8 @@ class CreateImage(command.ShowOne): kwargs['data'].close() info.update(image._info) - info['properties'] = utils.format_dict(info.get('properties', {})) + info['properties'] = format_columns.DictColumn( + info.get('properties', {})) return zip(*sorted(six.iteritems(info))) @@ -442,8 +444,8 @@ class ListImage(command.Lister): s, columns, formatters={ - 'is_public': _format_visibility, - 'properties': utils.format_dict, + 'is_public': VisibilityColumn, + 'properties': format_columns.DictColumn, }, ) for s in data) ) @@ -738,5 +740,6 @@ class ShowImage(command.ShowOne): 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'] = format_columns.DictColumn( + info.get('properties', {})) return zip(*sorted(six.iteritems(info))) diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index c2c5c594ce..1b4c8b661a 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -19,6 +19,7 @@ import argparse import logging from glanceclient.common import utils as gc_utils +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -62,11 +63,11 @@ def _format_image(image): properties[key] = image.get(key) # format the tags if they are there - info['tags'] = utils.format_list(image.get('tags')) + info['tags'] = format_columns.ListColumn(image.get('tags')) # add properties back into the dictionary as a top-level key if properties: - info['properties'] = utils.format_dict(properties) + info['properties'] = format_columns.DictColumn(properties) return info @@ -585,7 +586,7 @@ class ListImage(command.Lister): s, columns, formatters={ - 'tags': utils.format_list, + 'tags': format_columns.ListColumn, }, ) for s in data) ) diff --git a/openstackclient/tests/functional/image/v1/test_image.py b/openstackclient/tests/functional/image/v1/test_image.py index fa073f99a3..46b22134bd 100644 --- a/openstackclient/tests/functional/image/v1/test_image.py +++ b/openstackclient/tests/functional/image/v1/test_image.py @@ -107,6 +107,6 @@ class ImageTests(base.TestCase): self.NAME )) self.assertEqual( - "a='b', c='d'", + {'a': 'b', 'c': 'd'}, json_output["properties"], ) diff --git a/openstackclient/tests/functional/image/v2/test_image.py b/openstackclient/tests/functional/image/v2/test_image.py index 278ba5b948..3ba2b51c73 100644 --- a/openstackclient/tests/functional/image/v2/test_image.py +++ b/openstackclient/tests/functional/image/v2/test_image.py @@ -122,7 +122,7 @@ class ImageTests(base.TestCase): self.NAME )) self.assertEqual( - "a='b', c='d'", + {'a': 'b', 'c': 'd'}, json_output["properties"], ) @@ -152,7 +152,7 @@ class ImageTests(base.TestCase): self.NAME )) self.assertEqual( - '01', + ['01'], json_output["tags"], ) @@ -166,7 +166,7 @@ class ImageTests(base.TestCase): self.NAME )) self.assertEqual( - '', + [], json_output["tags"], ) diff --git a/openstackclient/tests/unit/compute/v2/test_server_backup.py b/openstackclient/tests/unit/compute/v2/test_server_backup.py index 9a481e0a67..24a94531a4 100644 --- a/openstackclient/tests/unit/compute/v2/test_server_backup.py +++ b/openstackclient/tests/unit/compute/v2/test_server_backup.py @@ -13,6 +13,7 @@ import mock +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib import utils as common_utils @@ -69,7 +70,7 @@ class TestServerBackupCreate(TestServerBackup): image['owner'], image['protected'], 'active', - common_utils.format_list(image.get('tags')), + format_columns.ListColumn(image.get('tags')), image['visibility'], ) return datalist @@ -134,7 +135,7 @@ class TestServerBackupCreate(TestServerBackup): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) def test_server_backup_create_options(self): servers = self.setup_servers_mock(count=1) @@ -168,7 +169,7 @@ class TestServerBackupCreate(TestServerBackup): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) @mock.patch.object(common_utils, 'wait_for_status', return_value=False) def test_server_backup_wait_fail(self, mock_wait_for_status): @@ -268,4 +269,4 @@ class TestServerBackupCreate(TestServerBackup): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) diff --git a/openstackclient/tests/unit/compute/v2/test_server_image.py b/openstackclient/tests/unit/compute/v2/test_server_image.py index 47bd682f17..02e43129ed 100644 --- a/openstackclient/tests/unit/compute/v2/test_server_image.py +++ b/openstackclient/tests/unit/compute/v2/test_server_image.py @@ -12,6 +12,7 @@ # import mock +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib import utils as common_utils @@ -67,7 +68,7 @@ class TestServerImageCreate(TestServerImage): image['owner'], image['protected'], 'active', - common_utils.format_list(image.get('tags')), + format_columns.ListColumn(image.get('tags')), image['visibility'], ) return datalist @@ -129,7 +130,7 @@ class TestServerImageCreate(TestServerImage): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) def test_server_image_create_options(self): servers = self.setup_servers_mock(count=1) @@ -157,7 +158,7 @@ class TestServerImageCreate(TestServerImage): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) @mock.patch.object(common_utils, 'wait_for_status', return_value=False) def test_server_create_image_wait_fail(self, mock_wait_for_status): @@ -225,4 +226,4 @@ class TestServerImageCreate(TestServerImage): ) self.assertEqual(self.image_columns(images[0]), columns) - self.assertEqual(self.image_data(images[0]), data) + self.assertItemEqual(self.image_data(images[0]), data) diff --git a/openstackclient/tests/unit/image/v1/test_image.py b/openstackclient/tests/unit/image/v1/test_image.py index 41ddc49fa5..ec1b4a775c 100644 --- a/openstackclient/tests/unit/image/v1/test_image.py +++ b/openstackclient/tests/unit/image/v1/test_image.py @@ -16,8 +16,8 @@ import copy import mock +from osc_lib.cli import format_columns from osc_lib import exceptions -from osc_lib import utils from openstackclient.image.v1 import image from openstackclient.tests.unit import fakes @@ -58,7 +58,7 @@ class TestImageCreate(TestImage): new_image.min_ram, new_image.name, new_image.owner, - utils.format_dict(new_image.properties), + format_columns.DictColumn(new_image.properties), new_image.protected, ) @@ -106,7 +106,7 @@ class TestImageCreate(TestImage): self.assertEqual(self.images_mock.update.call_args_list, []) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_image_reserve_options(self): mock_exception = { @@ -160,7 +160,7 @@ class TestImageCreate(TestImage): self.assertEqual(self.images_mock.update.call_args_list, []) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) @mock.patch('openstackclient.image.v1.image.io.open', name='Open') def test_image_create_file(self, mock_open): @@ -224,7 +224,7 @@ class TestImageCreate(TestImage): self.assertEqual(self.images_mock.update.call_args_list, []) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) class TestImageDelete(TestImage): @@ -410,12 +410,13 @@ class TestImageList(TestImage): '', '', '', - 'public', + image.VisibilityColumn(True), False, self._image.owner, - "Alpha='a', Beta='b', Gamma='g'", + format_columns.DictColumn( + {'Alpha': 'a', 'Beta': 'b', 'Gamma': 'g'}), ), ) - self.assertEqual(datalist, tuple(data)) + self.assertListItemEqual(datalist, tuple(data)) @mock.patch('openstackclient.api.utils.simple_filter') def test_image_list_property_option(self, sf_mock): @@ -716,7 +717,7 @@ class TestImageShow(TestImage): _image.min_ram, _image.name, _image.owner, - utils.format_dict(_image.properties), + format_columns.DictColumn(_image.properties), _image.protected, _image.size, ) @@ -747,7 +748,7 @@ class TestImageShow(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_image_show_human_readable(self): arglist = [ diff --git a/openstackclient/tests/unit/image/v2/fakes.py b/openstackclient/tests/unit/image/v2/fakes.py index 0255ce38dc..6c0d45fef6 100644 --- a/openstackclient/tests/unit/image/v2/fakes.py +++ b/openstackclient/tests/unit/image/v2/fakes.py @@ -19,7 +19,7 @@ import random import uuid from glanceclient.v2 import schemas -from osc_lib import utils as common_utils +from osc_lib.cli import format_columns import warlock from openstackclient.tests.unit import fakes @@ -48,7 +48,7 @@ IMAGE_columns = tuple(sorted(IMAGE)) IMAGE_data = tuple((IMAGE[x] for x in sorted(IMAGE))) IMAGE_SHOW = copy.copy(IMAGE) -IMAGE_SHOW['tags'] = '' +IMAGE_SHOW['tags'] = format_columns.ListColumn(IMAGE_SHOW['tags']) IMAGE_SHOW_data = tuple((IMAGE_SHOW[x] for x in sorted(IMAGE_SHOW))) # Just enough v2 schema to do some testing @@ -280,7 +280,7 @@ class FakeImage(object): if x == 'tags': # The 'tags' should be format_list data_list.append( - common_utils.format_list(getattr(image, x))) + format_columns.ListColumn(getattr(image, x))) else: data_list.append(getattr(image, x)) return tuple(data_list) diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index 484a2bc64b..e8c4c7fa34 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -17,8 +17,8 @@ import copy import mock from glanceclient.v2 import schemas +from osc_lib.cli import format_columns from osc_lib import exceptions -from osc_lib import utils as common_utils import warlock from openstackclient.image.v2 import image @@ -115,7 +115,7 @@ class TestImageCreate(TestImage): self.assertEqual( image_fakes.FakeImage.get_image_columns(self.new_image), columns) - self.assertEqual( + self.assertItemEqual( image_fakes.FakeImage.get_image_data(self.new_image), data) @@ -183,7 +183,7 @@ class TestImageCreate(TestImage): self.assertEqual( image_fakes.FakeImage.get_image_columns(self.new_image), columns) - self.assertEqual( + self.assertItemEqual( image_fakes.FakeImage.get_image_data(self.new_image), data) @@ -317,7 +317,7 @@ class TestImageCreate(TestImage): self.assertEqual( image_fakes.FakeImage.get_image_columns(self.new_image), columns) - self.assertEqual( + self.assertItemEqual( image_fakes.FakeImage.get_image_data(self.new_image), data) @@ -540,7 +540,7 @@ class TestImageList(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) def test_image_list_public_option(self): arglist = [ @@ -564,7 +564,7 @@ class TestImageList(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) def test_image_list_private_option(self): arglist = [ @@ -588,7 +588,7 @@ class TestImageList(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) def test_image_list_shared_option(self): arglist = [ @@ -612,7 +612,7 @@ class TestImageList(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) def test_image_list_long_option(self): arglist = [ @@ -657,9 +657,9 @@ class TestImageList(TestImage): self._image.visibility, self._image.protected, self._image.owner, - common_utils.format_list(self._image.tags), + format_columns.ListColumn(self._image.tags), ), ) - self.assertEqual(datalist, tuple(data)) + self.assertListItemEqual(datalist, tuple(data)) @mock.patch('openstackclient.api.utils.simple_filter') def test_image_list_property_option(self, sf_mock): @@ -688,7 +688,7 @@ class TestImageList(TestImage): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) @mock.patch('osc_lib.utils.sort_items') def test_image_list_sort_option(self, si_mock): @@ -710,7 +710,7 @@ class TestImageList(TestImage): 'name:asc' ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) + self.assertListItemEqual(self.datalist, tuple(data)) def test_image_list_limit_option(self): arglist = [ @@ -1351,7 +1351,7 @@ class TestImageShow(TestImage): ) self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_SHOW_data, data) + self.assertItemEqual(image_fakes.IMAGE_SHOW_data, data) def test_image_show_human_readable(self): self.images_mock.get.return_value = self.new_image