Skip to content

Commit 8d63e3f

Browse files
amotokiDean Troyer
authored andcommitted
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: Ib82e15738544975fede0c54cc5eaf239f4c67277
1 parent 1a21f02 commit 8d63e3f

9 files changed

Lines changed: 69 additions & 66 deletions

File tree

openstackclient/image/v1/image.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import os
2222
import sys
2323

24+
from cliff import columns as cliff_columns
2425
from glanceclient.common import utils as gc_utils
2526
from osc_lib.api import utils as api_utils
27+
from osc_lib.cli import format_columns
2628
from osc_lib.cli import parseractions
2729
from osc_lib.command import command
2830
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):
@@ -268,7 +269,8 @@ def take_action(self, parsed_args):
268269
kwargs['data'].close()
269270

270271
info.update(image._info)
271-
info['properties'] = utils.format_dict(info.get('properties', {}))
272+
info['properties'] = format_columns.DictColumn(
273+
info.get('properties', {}))
272274
return zip(*sorted(six.iteritems(info)))
273275

274276

@@ -429,8 +431,8 @@ def take_action(self, parsed_args):
429431
s,
430432
columns,
431433
formatters={
432-
'is_public': _format_visibility,
433-
'properties': utils.format_dict,
434+
'is_public': VisibilityColumn,
435+
'properties': format_columns.DictColumn,
434436
},
435437
) for s in data)
436438
)
@@ -714,5 +716,6 @@ def take_action(self, parsed_args):
714716
if parsed_args.human_readable:
715717
if 'size' in info:
716718
info['size'] = utils.format_size(info['size'])
717-
info['properties'] = utils.format_dict(info.get('properties', {}))
719+
info['properties'] = format_columns.DictColumn(
720+
info.get('properties', {}))
718721
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
@@ -22,6 +22,7 @@
2222
from glanceclient.common import utils as gc_utils
2323
from openstack.image import image_signer
2424
from osc_lib.api import utils as api_utils
25+
from osc_lib.cli import format_columns
2526
from osc_lib.cli import parseractions
2627
from osc_lib.command import command
2728
from osc_lib import exceptions
@@ -65,11 +66,11 @@ def _format_image(image):
6566
properties[key] = image.get(key)
6667

6768
# format the tags if they are there
68-
info['tags'] = utils.format_list(image.get('tags'))
69+
info['tags'] = format_columns.ListColumn(image.get('tags'))
6970

7071
# add properties back into the dictionary as a top-level key
7172
if properties:
72-
info['properties'] = utils.format_dict(properties)
73+
info['properties'] = format_columns.DictColumn(properties)
7374

7475
return info
7576

@@ -656,7 +657,7 @@ def take_action(self, parsed_args):
656657
s,
657658
columns,
658659
formatters={
659-
'tags': utils.format_list,
660+
'tags': format_columns.ListColumn,
660661
},
661662
) for s in data)
662663
)

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

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

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

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import uuid
1515

1616
import fixtures
17-
# from glanceclient import exc as image_exceptions
1817

1918
from openstackclient.tests.functional.image import base
2019

@@ -81,7 +80,7 @@ def test_image_list_with_tag_filter(self):
8180
json_output = json.loads(self.openstack(
8281
'image list --tag ' + self.image_tag + ' --long -f json'
8382
))
84-
for taglist in [img['Tags'].split(', ') for img in json_output]:
83+
for taglist in [img['Tags'] for img in json_output]:
8584
self.assertIn(
8685
self.image_tag,
8786
taglist
@@ -127,10 +126,8 @@ def test_image_attributes(self):
127126
'image show -f json ' +
128127
self.name
129128
))
130-
# NOTE(dtroyer): Don't do a full-string compare so we are tolerant of
131-
# new artributes in the returned data
132-
self.assertIn("a='b'", json_output["properties"])
133-
self.assertIn("c='d'", json_output["properties"])
129+
self.assertIn("a", json_output["properties"])
130+
self.assertIn("c", json_output["properties"])
134131

135132
self.openstack(
136133
'image unset ' +
@@ -142,15 +139,13 @@ def test_image_attributes(self):
142139
'image show -f json ' +
143140
self.name
144141
))
145-
# NOTE(dtroyer): Don't do a full-string compare so we are tolerant of
146-
# new artributes in the returned data
147-
self.assertNotIn("a='b'", json_output["properties"])
148-
self.assertNotIn("c='d'", json_output["properties"])
142+
self.assertNotIn("a", json_output["properties"])
143+
self.assertNotIn("c", json_output["properties"])
149144

150145
# Test tags
151146
self.assertNotIn(
152147
'01',
153-
json_output["tags"].split(', ')
148+
json_output["tags"]
154149
)
155150
self.openstack(
156151
'image set ' +
@@ -163,7 +158,7 @@ def test_image_attributes(self):
163158
))
164159
self.assertIn(
165160
'01',
166-
json_output["tags"].split(', ')
161+
json_output["tags"]
167162
)
168163

169164
self.openstack(
@@ -177,7 +172,7 @@ def test_image_attributes(self):
177172
))
178173
self.assertNotIn(
179174
'01',
180-
json_output["tags"].split(', ')
175+
json_output["tags"]
181176
)
182177

183178
def test_image_set_rename(self):

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: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
import copy
1717

1818
import mock
19+
20+
from osc_lib.cli import format_columns
1921
from osc_lib import exceptions
20-
from osc_lib import utils
2122

2223
from openstackclient.image.v1 import image
2324
from openstackclient.tests.unit import fakes
@@ -58,7 +59,7 @@ class TestImageCreate(TestImage):
5859
new_image.min_ram,
5960
new_image.name,
6061
new_image.owner,
61-
utils.format_dict(new_image.properties),
62+
format_columns.DictColumn(new_image.properties),
6263
new_image.protected,
6364
)
6465

@@ -106,7 +107,7 @@ def test_image_reserve_no_options(self):
106107
self.assertEqual(self.images_mock.update.call_args_list, [])
107108

108109
self.assertEqual(self.columns, columns)
109-
self.assertEqual(self.data, data)
110+
self.assertItemEqual(self.data, data)
110111

111112
def test_image_reserve_options(self):
112113
mock_exception = {
@@ -160,7 +161,7 @@ def test_image_reserve_options(self):
160161
self.assertEqual(self.images_mock.update.call_args_list, [])
161162

162163
self.assertEqual(self.columns, columns)
163-
self.assertEqual(self.data, data)
164+
self.assertItemEqual(self.data, data)
164165

165166
@mock.patch('openstackclient.image.v1.image.io.open', name='Open')
166167
def test_image_create_file(self, mock_open):
@@ -224,7 +225,7 @@ def test_image_create_file(self, mock_open):
224225
self.assertEqual(self.images_mock.update.call_args_list, [])
225226

226227
self.assertEqual(self.columns, columns)
227-
self.assertEqual(self.data, data)
228+
self.assertItemEqual(self.data, data)
228229

229230

230231
class TestImageDelete(TestImage):
@@ -410,12 +411,13 @@ def test_image_list_long_option(self):
410411
'',
411412
'',
412413
'',
413-
'public',
414+
image.VisibilityColumn(True),
414415
False,
415416
self._image.owner,
416-
"Alpha='a', Beta='b', Gamma='g'",
417+
format_columns.DictColumn(
418+
{'Alpha': 'a', 'Beta': 'b', 'Gamma': 'g'}),
417419
), )
418-
self.assertEqual(datalist, tuple(data))
420+
self.assertListItemEqual(datalist, tuple(data))
419421

420422
@mock.patch('osc_lib.api.utils.simple_filter')
421423
def test_image_list_property_option(self, sf_mock):
@@ -742,7 +744,7 @@ class TestImageShow(TestImage):
742744
_image.min_ram,
743745
_image.name,
744746
_image.owner,
745-
utils.format_dict(_image.properties),
747+
format_columns.DictColumn(_image.properties),
746748
_image.protected,
747749
_image.size,
748750
)
@@ -773,7 +775,7 @@ def test_image_show(self):
773775
)
774776

775777
self.assertEqual(self.columns, columns)
776-
self.assertEqual(self.data, data)
778+
self.assertItemEqual(self.data, data)
777779

778780
def test_image_show_human_readable(self):
779781
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

2020
from glanceclient.v2 import schemas
2121
import mock
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
@@ -281,7 +281,7 @@ def get_image_data(image=None):
281281
if x == 'tags':
282282
# The 'tags' should be format_list
283283
data_list.append(
284-
common_utils.format_list(getattr(image, x)))
284+
format_columns.ListColumn(getattr(image, x)))
285285
else:
286286
data_list.append(getattr(image, x))
287287
return tuple(data_list)

0 commit comments

Comments
 (0)