Skip to content

Commit 8e6772c

Browse files
committed
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
1 parent 07f5498 commit 8e6772c

9 files changed

Lines changed: 63 additions & 56 deletions

File tree

openstackclient/image/v1/image.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
else:
2727
msvcrt = None
2828

29+
from cliff import columns as cliff_columns
2930
from glanceclient.common import utils as gc_utils
31+
from osc_lib.cli import format_columns
3032
from osc_lib.cli import parseractions
3133
from osc_lib.command import command
3234
from osc_lib import utils
@@ -46,19 +48,18 @@
4648
LOG = logging.getLogger(__name__)
4749

4850

49-
def _format_visibility(data):
50-
"""Return a formatted visibility string
51+
class VisibilityColumn(cliff_columns.FormattableColumn):
52+
def human_readable(self):
53+
"""Return a formatted visibility string
5154
52-
:param data:
53-
The server's visibility (is_public) status value: True, False
54-
:rtype:
55-
A string formatted to public/private
56-
"""
55+
:rtype:
56+
A string formatted to public/private
57+
"""
5758

58-
if data:
59-
return 'public'
60-
else:
61-
return 'private'
59+
if self._value:
60+
return 'public'
61+
else:
62+
return 'private'
6263

6364

6465
class CreateImage(command.ShowOne):
@@ -281,7 +282,8 @@ def take_action(self, parsed_args):
281282
kwargs['data'].close()
282283

283284
info.update(image._info)
284-
info['properties'] = utils.format_dict(info.get('properties', {}))
285+
info['properties'] = format_columns.DictColumn(
286+
info.get('properties', {}))
285287
return zip(*sorted(six.iteritems(info)))
286288

287289

@@ -442,8 +444,8 @@ def take_action(self, parsed_args):
442444
s,
443445
columns,
444446
formatters={
445-
'is_public': _format_visibility,
446-
'properties': utils.format_dict,
447+
'is_public': VisibilityColumn,
448+
'properties': format_columns.DictColumn,
447449
},
448450
) for s in data)
449451
)
@@ -738,5 +740,6 @@ def take_action(self, parsed_args):
738740
if parsed_args.human_readable:
739741
if 'size' in info:
740742
info['size'] = utils.format_size(info['size'])
741-
info['properties'] = utils.format_dict(info.get('properties', {}))
743+
info['properties'] = format_columns.DictColumn(
744+
info.get('properties', {}))
742745
return zip(*sorted(six.iteritems(info)))

openstackclient/image/v2/image.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import logging
2020

2121
from glanceclient.common import utils as gc_utils
22+
from osc_lib.cli import format_columns
2223
from osc_lib.cli import parseractions
2324
from osc_lib.command import command
2425
from osc_lib import exceptions
@@ -62,11 +63,11 @@ def _format_image(image):
6263
properties[key] = image.get(key)
6364

6465
# format the tags if they are there
65-
info['tags'] = utils.format_list(image.get('tags'))
66+
info['tags'] = format_columns.ListColumn(image.get('tags'))
6667

6768
# add properties back into the dictionary as a top-level key
6869
if properties:
69-
info['properties'] = utils.format_dict(properties)
70+
info['properties'] = format_columns.DictColumn(properties)
7071

7172
return info
7273

@@ -585,7 +586,7 @@ def take_action(self, parsed_args):
585586
s,
586587
columns,
587588
formatters={
588-
'tags': utils.format_list,
589+
'tags': format_columns.ListColumn,
589590
},
590591
) for s in data)
591592
)

openstackclient/tests/functional/image/v1/test_image.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,6 @@ def test_image_attributes(self):
107107
self.NAME
108108
))
109109
self.assertEqual(
110-
"a='b', c='d'",
110+
{'a': 'b', 'c': 'd'},
111111
json_output["properties"],
112112
)

openstackclient/tests/functional/image/v2/test_image.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def test_image_attributes(self):
122122
self.NAME
123123
))
124124
self.assertEqual(
125-
"a='b', c='d'",
125+
{'a': 'b', 'c': 'd'},
126126
json_output["properties"],
127127
)
128128

@@ -152,7 +152,7 @@ def test_image_attributes(self):
152152
self.NAME
153153
))
154154
self.assertEqual(
155-
'01',
155+
['01'],
156156
json_output["tags"],
157157
)
158158

@@ -166,7 +166,7 @@ def test_image_attributes(self):
166166
self.NAME
167167
))
168168
self.assertEqual(
169-
'',
169+
[],
170170
json_output["tags"],
171171
)
172172

openstackclient/tests/unit/compute/v2/test_server_backup.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import mock
1515

16+
from osc_lib.cli import format_columns
1617
from osc_lib import exceptions
1718
from osc_lib import utils as common_utils
1819

@@ -69,7 +70,7 @@ def image_data(self, image):
6970
image['owner'],
7071
image['protected'],
7172
'active',
72-
common_utils.format_list(image.get('tags')),
73+
format_columns.ListColumn(image.get('tags')),
7374
image['visibility'],
7475
)
7576
return datalist
@@ -134,7 +135,7 @@ def test_server_backup_defaults(self):
134135
)
135136

136137
self.assertEqual(self.image_columns(images[0]), columns)
137-
self.assertEqual(self.image_data(images[0]), data)
138+
self.assertItemEqual(self.image_data(images[0]), data)
138139

139140
def test_server_backup_create_options(self):
140141
servers = self.setup_servers_mock(count=1)
@@ -168,7 +169,7 @@ def test_server_backup_create_options(self):
168169
)
169170

170171
self.assertEqual(self.image_columns(images[0]), columns)
171-
self.assertEqual(self.image_data(images[0]), data)
172+
self.assertItemEqual(self.image_data(images[0]), data)
172173

173174
@mock.patch.object(common_utils, 'wait_for_status', return_value=False)
174175
def test_server_backup_wait_fail(self, mock_wait_for_status):
@@ -268,4 +269,4 @@ def test_server_backup_wait_ok(self, mock_wait_for_status):
268269
)
269270

270271
self.assertEqual(self.image_columns(images[0]), columns)
271-
self.assertEqual(self.image_data(images[0]), data)
272+
self.assertItemEqual(self.image_data(images[0]), data)

openstackclient/tests/unit/compute/v2/test_server_image.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#
1313
import mock
1414

15+
from osc_lib.cli import format_columns
1516
from osc_lib import exceptions
1617
from osc_lib import utils as common_utils
1718

@@ -67,7 +68,7 @@ def image_data(self, image):
6768
image['owner'],
6869
image['protected'],
6970
'active',
70-
common_utils.format_list(image.get('tags')),
71+
format_columns.ListColumn(image.get('tags')),
7172
image['visibility'],
7273
)
7374
return datalist
@@ -129,7 +130,7 @@ def test_server_image_create_defaults(self):
129130
)
130131

131132
self.assertEqual(self.image_columns(images[0]), columns)
132-
self.assertEqual(self.image_data(images[0]), data)
133+
self.assertItemEqual(self.image_data(images[0]), data)
133134

134135
def test_server_image_create_options(self):
135136
servers = self.setup_servers_mock(count=1)
@@ -157,7 +158,7 @@ def test_server_image_create_options(self):
157158
)
158159

159160
self.assertEqual(self.image_columns(images[0]), columns)
160-
self.assertEqual(self.image_data(images[0]), data)
161+
self.assertItemEqual(self.image_data(images[0]), data)
161162

162163
@mock.patch.object(common_utils, 'wait_for_status', return_value=False)
163164
def test_server_create_image_wait_fail(self, mock_wait_for_status):
@@ -225,4 +226,4 @@ def test_server_create_image_wait_ok(self, mock_wait_for_status):
225226
)
226227

227228
self.assertEqual(self.image_columns(images[0]), columns)
228-
self.assertEqual(self.image_data(images[0]), data)
229+
self.assertItemEqual(self.image_data(images[0]), data)

openstackclient/tests/unit/image/v1/test_image.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import copy
1717
import mock
1818

19+
from osc_lib.cli import format_columns
1920
from osc_lib import exceptions
20-
from osc_lib import utils
2121

2222
from openstackclient.image.v1 import image
2323
from openstackclient.tests.unit import fakes
@@ -58,7 +58,7 @@ class TestImageCreate(TestImage):
5858
new_image.min_ram,
5959
new_image.name,
6060
new_image.owner,
61-
utils.format_dict(new_image.properties),
61+
format_columns.DictColumn(new_image.properties),
6262
new_image.protected,
6363
)
6464

@@ -106,7 +106,7 @@ def test_image_reserve_no_options(self):
106106
self.assertEqual(self.images_mock.update.call_args_list, [])
107107

108108
self.assertEqual(self.columns, columns)
109-
self.assertEqual(self.data, data)
109+
self.assertItemEqual(self.data, data)
110110

111111
def test_image_reserve_options(self):
112112
mock_exception = {
@@ -160,7 +160,7 @@ def test_image_reserve_options(self):
160160
self.assertEqual(self.images_mock.update.call_args_list, [])
161161

162162
self.assertEqual(self.columns, columns)
163-
self.assertEqual(self.data, data)
163+
self.assertItemEqual(self.data, data)
164164

165165
@mock.patch('openstackclient.image.v1.image.io.open', name='Open')
166166
def test_image_create_file(self, mock_open):
@@ -224,7 +224,7 @@ def test_image_create_file(self, mock_open):
224224
self.assertEqual(self.images_mock.update.call_args_list, [])
225225

226226
self.assertEqual(self.columns, columns)
227-
self.assertEqual(self.data, data)
227+
self.assertItemEqual(self.data, data)
228228

229229

230230
class TestImageDelete(TestImage):
@@ -410,12 +410,13 @@ def test_image_list_long_option(self):
410410
'',
411411
'',
412412
'',
413-
'public',
413+
image.VisibilityColumn(True),
414414
False,
415415
self._image.owner,
416-
"Alpha='a', Beta='b', Gamma='g'",
416+
format_columns.DictColumn(
417+
{'Alpha': 'a', 'Beta': 'b', 'Gamma': 'g'}),
417418
), )
418-
self.assertEqual(datalist, tuple(data))
419+
self.assertListItemEqual(datalist, tuple(data))
419420

420421
@mock.patch('openstackclient.api.utils.simple_filter')
421422
def test_image_list_property_option(self, sf_mock):
@@ -716,7 +717,7 @@ class TestImageShow(TestImage):
716717
_image.min_ram,
717718
_image.name,
718719
_image.owner,
719-
utils.format_dict(_image.properties),
720+
format_columns.DictColumn(_image.properties),
720721
_image.protected,
721722
_image.size,
722723
)
@@ -747,7 +748,7 @@ def test_image_show(self):
747748
)
748749

749750
self.assertEqual(self.columns, columns)
750-
self.assertEqual(self.data, data)
751+
self.assertItemEqual(self.data, data)
751752

752753
def test_image_show_human_readable(self):
753754
arglist = [

openstackclient/tests/unit/image/v2/fakes.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import uuid
2020

2121
from glanceclient.v2 import schemas
22-
from osc_lib import utils as common_utils
22+
from osc_lib.cli import format_columns
2323
import warlock
2424

2525
from openstackclient.tests.unit import fakes
@@ -48,7 +48,7 @@
4848
IMAGE_data = tuple((IMAGE[x] for x in sorted(IMAGE)))
4949

5050
IMAGE_SHOW = copy.copy(IMAGE)
51-
IMAGE_SHOW['tags'] = ''
51+
IMAGE_SHOW['tags'] = format_columns.ListColumn(IMAGE_SHOW['tags'])
5252
IMAGE_SHOW_data = tuple((IMAGE_SHOW[x] for x in sorted(IMAGE_SHOW)))
5353

5454
# Just enough v2 schema to do some testing
@@ -280,7 +280,7 @@ def get_image_data(image=None):
280280
if x == 'tags':
281281
# The 'tags' should be format_list
282282
data_list.append(
283-
common_utils.format_list(getattr(image, x)))
283+
format_columns.ListColumn(getattr(image, x)))
284284
else:
285285
data_list.append(getattr(image, x))
286286
return tuple(data_list)

0 commit comments

Comments
 (0)