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
This commit is contained in:
@@ -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)))
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -107,6 +107,6 @@ class ImageTests(base.TestCase):
|
||||
self.NAME
|
||||
))
|
||||
self.assertEqual(
|
||||
"a='b', c='d'",
|
||||
{'a': 'b', 'c': 'd'},
|
||||
json_output["properties"],
|
||||
)
|
||||
|
||||
@@ -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"],
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user