diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/aggregate.py | 5 | ||||
| -rw-r--r-- | openstackclient/compute/v2/flavor.py | 33 | ||||
| -rw-r--r-- | openstackclient/compute/v2/server.py | 35 | ||||
| -rw-r--r-- | openstackclient/compute/v2/server_backup.py | 5 | ||||
| -rw-r--r-- | openstackclient/compute/v2/server_group.py | 9 | ||||
| -rw-r--r-- | openstackclient/compute/v2/server_image.py | 5 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_aggregate.py | 14 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_flavor.py | 31 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_server.py | 53 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_server_group.py | 24 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_aggregate.py | 5 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_flavor.py | 32 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server.py | 91 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server_group.py | 19 |
14 files changed, 186 insertions, 175 deletions
diff --git a/openstackclient/compute/v2/aggregate.py b/openstackclient/compute/v2/aggregate.py index 7f9161a9..a9df0102 100644 --- a/openstackclient/compute/v2/aggregate.py +++ b/openstackclient/compute/v2/aggregate.py @@ -18,6 +18,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -324,7 +325,9 @@ class ShowAggregate(command.ShowOne): # 'metadata' --> 'properties' data._info.update( { - 'properties': utils.format_dict(data._info.pop('metadata')), + 'properties': format_columns.DictColumn( + data._info.pop('metadata') + ), }, ) diff --git a/openstackclient/compute/v2/flavor.py b/openstackclient/compute/v2/flavor.py index bf9921b7..56ad672a 100644 --- a/openstackclient/compute/v2/flavor.py +++ b/openstackclient/compute/v2/flavor.py @@ -17,6 +17,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -180,7 +181,14 @@ class CreateFlavor(command.ShowOne): flavor_info = flavor._info.copy() flavor_info.pop("links") - flavor_info['properties'] = utils.format_dict(flavor.get_keys()) + flavor_info['properties'] = format_columns.DictColumn( + # NOTE(RuiChen): novaclient flavor.get_keys() return a mixin class + # DictWithMeta, that can't be represented properly + # in yaml format(-f yaml), wrapping it in base type + # dict is a workaround, please do not remove the + # conversion. + dict(flavor.get_keys()) + ) return zip(*sorted(six.iteritems(flavor_info))) @@ -291,13 +299,19 @@ class ListFlavor(command.Lister): "Properties", ) for f in data: - f.properties = f.get_keys() + # NOTE(RuiChen): novaclient flavor.get_keys() return a mixin + # class DictWithMeta, that can't be represented + # properly in yaml format(-f yaml), wrapping it + # in base type dict is a workaround, please do + # not remove the conversion. + f.properties = dict(f.get_keys()) column_headers = columns return (column_headers, (utils.get_item_properties( - s, columns, formatters={'Properties': utils.format_dict}, + s, columns, + formatters={'Properties': format_columns.DictColumn}, ) for s in data)) @@ -405,9 +419,7 @@ class ShowFlavor(command.ShowOne): flavor=resource_flavor.id) projects = [utils.get_field(access, 'tenant_id') for access in flavor_access] - # TODO(Huanxuan Ao): This format case can be removed after - # patch https://review.openstack.org/#/c/330223/ merged. - access_projects = utils.format_list(projects) + access_projects = format_columns.ListColumn(projects) except Exception as e: msg = _("Failed to get access projects list " "for flavor '%(flavor)s': %(e)s") @@ -419,7 +431,14 @@ class ShowFlavor(command.ShowOne): }) flavor.pop("links", None) - flavor['properties'] = utils.format_dict(resource_flavor.get_keys()) + flavor['properties'] = format_columns.DictColumn( + # NOTE(RuiChen): novaclient flavor.get_keys() return a mixin class + # DictWithMeta, that can't be represented properly + # in yaml format(-f yaml), wrapping it in base type + # dict is a workaround, please do not remove the + # conversion. + dict(resource_flavor.get_keys()) + ) return zip(*sorted(six.iteritems(flavor))) diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 151c6783..f2647a3f 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -23,6 +23,7 @@ import os import sys from novaclient.v2 import servers +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -37,22 +38,6 @@ from openstackclient.identity import common as identity_common LOG = logging.getLogger(__name__) -def _format_servers_list_networks(networks): - """Return a formatted string of a server's networks - - :param networks: a Server.networks field - :rtype: a string of formatted network addresses - """ - output = [] - for (network, addresses) in networks.items(): - if not addresses: - continue - addresses_csv = ', '.join(addresses) - group = "%s=%s" % (network, addresses_csv) - output.append(group) - return '; '.join(output) - - def _format_servers_list_power_state(state): """Return a formatted string of a server's power state @@ -154,24 +139,26 @@ def _prep_server_detail(compute_client, image_client, server): if 'os-extended-volumes:volumes_attached' in info: info.update( { - 'volumes_attached': utils.format_list_of_dicts( - info.pop('os-extended-volumes:volumes_attached')) + 'volumes_attached': format_columns.ListDictColumn( + info.pop('os-extended-volumes:volumes_attached') + ) } ) if 'security_groups' in info: info.update( { - 'security_groups': utils.format_list_of_dicts( - info.pop('security_groups')) + 'security_groups': format_columns.ListDictColumn( + info.pop('security_groups') + ) } ) # NOTE(dtroyer): novaclient splits these into separate entries... # Format addresses in a useful way - info['addresses'] = _format_servers_list_networks(server.networks) + info['addresses'] = format_columns.DictListColumn(server.networks) # Map 'metadata' field to 'properties' info.update( - {'properties': utils.format_dict(info.pop('metadata'))} + {'properties': format_columns.DictColumn(info.pop('metadata'))} ) # Migrate tenant_id to project_id naming @@ -1161,8 +1148,8 @@ class ListServer(command.Lister): formatters={ 'OS-EXT-STS:power_state': _format_servers_list_power_state, - 'Networks': _format_servers_list_networks, - 'Metadata': utils.format_dict, + 'Networks': format_columns.DictListColumn, + 'Metadata': format_columns.DictColumn, }, ) for s in data)) return table diff --git a/openstackclient/compute/v2/server_backup.py b/openstackclient/compute/v2/server_backup.py index ddcf9101..7634a31b 100644 --- a/openstackclient/compute/v2/server_backup.py +++ b/openstackclient/compute/v2/server_backup.py @@ -17,6 +17,7 @@ import sys +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -122,7 +123,9 @@ class CreateServerBackup(command.ShowOne): if self.app.client_manager._api_version['image'] == '1': info = {} info.update(image._info) - info['properties'] = utils.format_dict(info.get('properties', {})) + info['properties'] = format_columns.DictColumn( + info.get('properties', {}) + ) else: # Get the right image module to format the output image_module = importutils.import_module( diff --git a/openstackclient/compute/v2/server_group.py b/openstackclient/compute/v2/server_group.py index c6e2161f..c39e75b6 100644 --- a/openstackclient/compute/v2/server_group.py +++ b/openstackclient/compute/v2/server_group.py @@ -17,6 +17,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -28,8 +29,8 @@ LOG = logging.getLogger(__name__) _formatters = { - 'policies': utils.format_list, - 'members': utils.format_list, + 'policies': format_columns.ListColumn, + 'members': format_columns.ListColumn, } @@ -155,8 +156,8 @@ class ListServerGroup(command.Lister): (utils.get_item_properties( s, columns, formatters={ - 'Policies': utils.format_list, - 'Members': utils.format_list, + 'Policies': format_columns.ListColumn, + 'Members': format_columns.ListColumn, } ) for s in data)) diff --git a/openstackclient/compute/v2/server_image.py b/openstackclient/compute/v2/server_image.py index c66e0674..1055b778 100644 --- a/openstackclient/compute/v2/server_image.py +++ b/openstackclient/compute/v2/server_image.py @@ -18,6 +18,7 @@ import logging import sys +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -101,7 +102,9 @@ class CreateServerImage(command.ShowOne): if self.app.client_manager._api_version['image'] == '1': info = {} info.update(image._info) - info['properties'] = utils.format_dict(info.get('properties', {})) + info['properties'] = format_columns.DictColumn( + info.get('properties', {}) + ) else: # Get the right image module to format the output image_module = importutils.import_module( diff --git a/openstackclient/tests/functional/compute/v2/test_aggregate.py b/openstackclient/tests/functional/compute/v2/test_aggregate.py index 1eba3ffe..4e57dbce 100644 --- a/openstackclient/tests/functional/compute/v2/test_aggregate.py +++ b/openstackclient/tests/functional/compute/v2/test_aggregate.py @@ -136,14 +136,7 @@ class AggregateTests(base.TestCase): 'internal', cmd_output['availability_zone'] ) - self.assertIn( - "c='d'", - cmd_output['properties'] - ) - self.assertNotIn( - "a='b'", - cmd_output['properties'] - ) + self.assertEqual({'c': 'd'}, cmd_output['properties']) # Test unset raw_output = self.openstack( @@ -157,10 +150,7 @@ class AggregateTests(base.TestCase): 'aggregate show -f json ' + name2 )) - self.assertNotIn( - "c='d'", - cmd_output['properties'] - ) + self.assertEqual({}, cmd_output['properties']) def test_aggregate_add_and_remove_host(self): """Test aggregate add and remove host""" diff --git a/openstackclient/tests/functional/compute/v2/test_flavor.py b/openstackclient/tests/functional/compute/v2/test_flavor.py index eefd3fab..8415a397 100644 --- a/openstackclient/tests/functional/compute/v2/test_flavor.py +++ b/openstackclient/tests/functional/compute/v2/test_flavor.py @@ -91,7 +91,7 @@ class FlavorTests(base.TestCase): "--ram 123 " + "--private " + "--property a=b2 " + - "--property b=d2 " + + "--property c=d2 " + name2 )) self.addCleanup(self.openstack, "flavor delete " + name2) @@ -116,10 +116,7 @@ class FlavorTests(base.TestCase): False, cmd_output["os-flavor-access:is_public"], ) - self.assertEqual( - "a='b2', b='d2'", - cmd_output["properties"], - ) + self.assertEqual({'a': 'b2', 'c': 'd2'}, cmd_output["properties"]) # Test list cmd_output = json.loads(self.openstack( @@ -135,11 +132,11 @@ class FlavorTests(base.TestCase): "--long" )) col_name = [x["Name"] for x in cmd_output] - col_properties = [x['Properties'] for x in cmd_output] self.assertIn(name1, col_name) - self.assertIn("a='b', c='d'", col_properties) self.assertNotIn(name2, col_name) - self.assertNotIn("b2', b='d2'", col_properties) + + props = [x['Properties'] for x in cmd_output] + self.assertIn({'a': 'b', 'c': 'd'}, props) # Test list --public cmd_output = json.loads(self.openstack( @@ -203,10 +200,8 @@ class FlavorTests(base.TestCase): False, cmd_output["os-flavor-access:is_public"], ) - self.assertEqual( - "a='first', b='second'", - cmd_output["properties"], - ) + self.assertEqual({'a': 'first', 'b': 'second'}, + cmd_output['properties']) raw_output = self.openstack( "flavor set " + @@ -224,10 +219,8 @@ class FlavorTests(base.TestCase): "qaz", cmd_output["id"], ) - self.assertEqual( - "a='third and 10', b='second', g='fourth'", - cmd_output['properties'], - ) + self.assertEqual({'a': 'third and 10', 'b': 'second', 'g': 'fourth'}, + cmd_output['properties']) raw_output = self.openstack( "flavor unset " + @@ -240,7 +233,5 @@ class FlavorTests(base.TestCase): "flavor show -f json " + name1 )) - self.assertEqual( - "a='third and 10', g='fourth'", - cmd_output["properties"], - ) + self.assertEqual({'a': 'third and 10', 'g': 'fourth'}, + cmd_output['properties']) diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py index b7a25996..75cef255 100644 --- a/openstackclient/tests/functional/compute/v2/test_server.py +++ b/openstackclient/tests/functional/compute/v2/test_server.py @@ -107,25 +107,19 @@ class ServerTests(common.ComputeTestCase): 'server show -f json ' + name )) - # Really, shouldn't this be a list? - self.assertEqual( - "a='b', c='d'", - cmd_output['properties'], - ) + self.assertEqual({'a': 'b', 'c': 'd'}, cmd_output['properties']) raw_output = self.openstack( 'server unset ' + '--property a ' + name ) + self.assertOutput('', raw_output) cmd_output = json.loads(self.openstack( 'server show -f json ' + name )) - self.assertEqual( - "c='d'", - cmd_output['properties'], - ) + self.assertEqual({'c': 'd'}, cmd_output['properties']) # Test set --name new_name = uuid.uuid4().hex @@ -248,10 +242,8 @@ class ServerTests(common.ComputeTestCase): 'server show -f json ' + name )) - self.assertIn( - floating_ip, - cmd_output['addresses'], - ) + self.assertIsInstance(cmd_output['addresses'], dict) + self.assertIn(floating_ip, cmd_output['addresses']['private']) # detach ip raw_output = self.openstack( @@ -265,10 +257,8 @@ class ServerTests(common.ComputeTestCase): 'server show -f json ' + name )) - self.assertNotIn( - floating_ip, - cmd_output['addresses'], - ) + self.assertIsInstance(cmd_output['addresses'], dict) + self.assertNotIn(floating_ip, cmd_output['addresses']['private']) def test_server_reboot(self): """Test server reboot""" @@ -456,8 +446,10 @@ class ServerTests(common.ComputeTestCase): server_name )) volumes_attached = cmd_output['volumes_attached'] - self.assertTrue(volumes_attached.startswith('id=')) - attached_volume_id = volumes_attached.replace('id=', '') + self.assertIsInstance(volumes_attached, list) + self.assertEqual(1, len(volumes_attached)) + self.assertIn('id', volumes_attached[0]) + attached_volume_id = volumes_attached[0]['id'] # check the volume that attached on server cmd_output = json.loads(self.openstack( @@ -514,7 +506,7 @@ class ServerTests(common.ComputeTestCase): 'server show -f json ' + server_name )) self.assertIsNotNone(server['addresses']) - self.assertEqual('', server['addresses']) + self.assertEqual({}, server['addresses']) def test_server_create_with_security_group(self): """Test server create with security group ID and name""" @@ -553,14 +545,27 @@ class ServerTests(common.ComputeTestCase): self.assertIsNotNone(server['id']) self.assertEqual(server_name, server['name']) - self.assertIn(str(security_group1['id']), server['security_groups']) - self.assertIn(str(security_group2['id']), server['security_groups']) + self.assertIsInstance(server['security_groups'], list) + self.assertEqual(2, len(server['security_groups'])) + # NOTE(RuiChen): Nova return security group id in response of server + # create API, but return security group name in server + # show API for the same server, so we assert id and name + # for different create and show commands in the + # following code. + sg_ids = [each_sg['name'] for each_sg in server['security_groups']] + # Security group id is integer in nova-network, convert to string + self.assertIn(str(security_group1['id']), sg_ids) + self.assertIn(str(security_group2['id']), sg_ids) + self.wait_for_status(server_name, 'ACTIVE') server = json.loads(self.openstack( 'server show -f json ' + server_name )) - self.assertIn(sg_name1, server['security_groups']) - self.assertIn(sg_name2, server['security_groups']) + self.assertIsInstance(server['security_groups'], list) + self.assertEqual(2, len(server['security_groups'])) + sg_names = [each_sg['name'] for each_sg in server['security_groups']] + self.assertIn(sg_name1, sg_names) + self.assertIn(sg_name2, sg_names) def test_server_create_with_empty_network_option_latest(self): """Test server create with empty network option in nova 2.latest.""" diff --git a/openstackclient/tests/functional/compute/v2/test_server_group.py b/openstackclient/tests/functional/compute/v2/test_server_group.py index 44ecda1d..2d703ff7 100644 --- a/openstackclient/tests/functional/compute/v2/test_server_group.py +++ b/openstackclient/tests/functional/compute/v2/test_server_group.py @@ -32,10 +32,7 @@ class ServerGroupTests(base.TestCase): name1, cmd_output['name'] ) - self.assertEqual( - 'affinity', - cmd_output['policies'] - ) + self.assertEqual(['affinity'], cmd_output['policies']) cmd_output = json.loads(self.openstack( 'server group create -f json ' + @@ -46,10 +43,7 @@ class ServerGroupTests(base.TestCase): name2, cmd_output['name'] ) - self.assertEqual( - 'anti-affinity', - cmd_output['policies'] - ) + self.assertEqual(['anti-affinity'], cmd_output['policies']) del_output = self.openstack( 'server group delete ' + name1 + ' ' + name2) @@ -73,10 +67,7 @@ class ServerGroupTests(base.TestCase): name1, cmd_output['name'] ) - self.assertEqual( - 'affinity', - cmd_output['policies'] - ) + self.assertEqual(['affinity'], cmd_output['policies']) cmd_output = json.loads(self.openstack( 'server group create -f json ' + @@ -90,10 +81,7 @@ class ServerGroupTests(base.TestCase): name2, cmd_output['name'] ) - self.assertEqual( - 'anti-affinity', - cmd_output['policies'] - ) + self.assertEqual(['anti-affinity'], cmd_output['policies']) # test server group list cmd_output = json.loads(self.openstack( @@ -102,5 +90,5 @@ class ServerGroupTests(base.TestCase): self.assertIn(name1, names) self.assertIn(name2, names) policies = [x["Policies"] for x in cmd_output] - self.assertIn('affinity', policies) - self.assertIn('anti-affinity', policies) + self.assertIn(['affinity'], policies) + self.assertIn(['anti-affinity'], policies) diff --git a/openstackclient/tests/unit/compute/v2/test_aggregate.py b/openstackclient/tests/unit/compute/v2/test_aggregate.py index 3efe0dbd..6cdabad1 100644 --- a/openstackclient/tests/unit/compute/v2/test_aggregate.py +++ b/openstackclient/tests/unit/compute/v2/test_aggregate.py @@ -16,6 +16,7 @@ import mock from mock import call +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib import utils @@ -443,7 +444,7 @@ class TestAggregateShow(TestAggregate): TestAggregate.fake_ag.hosts, TestAggregate.fake_ag.id, TestAggregate.fake_ag.name, - utils.format_dict( + format_columns.DictColumn( {key: value for key, value in TestAggregate.fake_ag.metadata.items() if key != 'availability_zone'}), @@ -467,7 +468,7 @@ class TestAggregateShow(TestAggregate): self.aggregate_mock.get.assert_called_once_with(parsed_args.aggregate) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) class TestAggregateUnset(TestAggregate): diff --git a/openstackclient/tests/unit/compute/v2/test_flavor.py b/openstackclient/tests/unit/compute/v2/test_flavor.py index 4cdbb25b..6d329ffa 100644 --- a/openstackclient/tests/unit/compute/v2/test_flavor.py +++ b/openstackclient/tests/unit/compute/v2/test_flavor.py @@ -16,8 +16,8 @@ import mock from mock import call +from osc_lib.cli import format_columns from osc_lib import exceptions -from osc_lib import utils from openstackclient.compute.v2 import flavor from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes @@ -67,7 +67,7 @@ class TestFlavorCreate(TestFlavor): flavor.id, flavor.name, flavor.is_public, - utils.format_dict(flavor.properties), + format_columns.DictColumn(flavor.properties), flavor.ram, flavor.rxtx_factor, flavor.swap, @@ -107,7 +107,7 @@ class TestFlavorCreate(TestFlavor): self.flavors_mock.create.assert_called_once_with(*default_args) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_flavor_create_all_options(self): @@ -154,7 +154,7 @@ class TestFlavorCreate(TestFlavor): self.flavor.get_keys.assert_called_once_with() self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_flavor_create_other_options(self): @@ -208,7 +208,7 @@ class TestFlavorCreate(TestFlavor): {'key1': 'value1', 'key2': 'value2'}) self.flavor.get_keys.assert_called_with() self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_public_flavor_create_with_project(self): arglist = [ @@ -338,7 +338,7 @@ class TestFlavorList(TestFlavor): data_long = (data[0] + ( flavors[0].swap, flavors[0].rxtx_factor, - u'property=\'value\'' + format_columns.DictColumn(flavors[0].properties), ), ) def setUp(self): @@ -376,7 +376,7 @@ class TestFlavorList(TestFlavor): ) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_flavor_list_all_flavors(self): arglist = [ @@ -405,7 +405,7 @@ class TestFlavorList(TestFlavor): ) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_flavor_list_private_flavors(self): arglist = [ @@ -434,7 +434,7 @@ class TestFlavorList(TestFlavor): ) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_flavor_list_public_flavors(self): arglist = [ @@ -463,7 +463,7 @@ class TestFlavorList(TestFlavor): ) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_flavor_list_long(self): arglist = [ @@ -492,7 +492,7 @@ class TestFlavorList(TestFlavor): ) self.assertEqual(self.columns_long, columns) - self.assertEqual(tuple(self.data_long), tuple(data)) + self.assertListItemEqual(self.data_long, list(data)) class TestFlavorSet(TestFlavor): @@ -652,7 +652,7 @@ class TestFlavorShow(TestFlavor): flavor.id, flavor.name, flavor.is_public, - utils.format_dict(flavor.get_keys()), + format_columns.DictColumn(flavor.get_keys()), flavor.ram, flavor.rxtx_factor, flavor.swap, @@ -689,7 +689,7 @@ class TestFlavorShow(TestFlavor): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_private_flavor_show(self): private_flavor = compute_fakes.FakeFlavor.create_one_flavor( @@ -709,12 +709,12 @@ class TestFlavorShow(TestFlavor): data_with_project = ( private_flavor.disabled, private_flavor.ephemeral, - self.flavor_access.tenant_id, + format_columns.ListColumn([self.flavor_access.tenant_id]), private_flavor.disk, private_flavor.id, private_flavor.name, private_flavor.is_public, - utils.format_dict(private_flavor.get_keys()), + format_columns.DictColumn(private_flavor.get_keys()), private_flavor.ram, private_flavor.rxtx_factor, private_flavor.swap, @@ -728,7 +728,7 @@ class TestFlavorShow(TestFlavor): self.flavor_access_mock.list.assert_called_with( flavor=private_flavor.id) self.assertEqual(self.columns, columns) - self.assertEqual(data_with_project, data) + self.assertItemEqual(data_with_project, data) class TestFlavorUnset(TestFlavor): diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index a1225c30..80dc5de8 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -18,6 +18,7 @@ import getpass import mock from mock import call +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib import utils as common_utils from oslo_utils import timeutils @@ -298,14 +299,15 @@ class TestServerCreate(TestServer): def datalist(self): datalist = ( server._format_servers_list_power_state( - getattr(self.new_server, 'OS-EXT-STS:power_state')), - '', + getattr(self.new_server, 'OS-EXT-STS:power_state') + ), + format_columns.DictListColumn(self.new_server.networks), self.flavor.name + ' (' + self.new_server.flavor.get('id') + ')', self.new_server.id, self.image.name + ' (' + self.new_server.image.get('id') + ')', self.new_server.name, self.new_server.networks, - '', + format_columns.DictColumn(''), ) return datalist @@ -313,7 +315,10 @@ class TestServerCreate(TestServer): super(TestServerCreate, self).setUp() attrs = { - 'networks': {}, + 'networks': { + 'private': ['fdb4:4f0f:960b:0:f816:3eff:fed9:af5e', + '10.0.0.8'] + }, } self.new_server = compute_fakes.FakeServer.create_one_server( attrs=attrs) @@ -394,7 +399,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) self.assertFalse(self.images_mock.called) self.assertFalse(self.flavors_mock.called) @@ -459,7 +464,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_not_exist_security_group(self): arglist = [ @@ -545,7 +550,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_network(self): arglist = [ @@ -650,7 +655,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_auto_network(self): arglist = [ @@ -695,7 +700,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_none_network(self): arglist = [ @@ -740,7 +745,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_conflict_network_options(self): arglist = [ @@ -903,7 +908,7 @@ class TestServerCreate(TestServer): **kwargs ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) @mock.patch.object(common_utils, 'wait_for_status', return_value=False) def test_server_create_with_wait_fails(self, mock_wait_for_status): @@ -1010,7 +1015,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping(self): arglist = [ @@ -1062,7 +1067,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_min_input(self): arglist = [ @@ -1113,7 +1118,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_default_input(self): arglist = [ @@ -1164,7 +1169,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_full_input(self): arglist = [ @@ -1219,7 +1224,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_snapshot(self): arglist = [ @@ -1274,7 +1279,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_multiple(self): arglist = [ @@ -1337,7 +1342,7 @@ class TestServerCreate(TestServer): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist(), data) + self.assertItemEqual(self.datalist(), data) def test_server_create_with_block_device_mapping_invalid_format(self): # 1. block device mapping don't contain equal sign "=" @@ -1597,7 +1602,7 @@ class TestServerList(TestServer): s.id, s.name, s.status, - server._format_servers_list_networks(s.networks), + format_columns.DictListColumn(s.networks), self.image.name, self.flavor.name, )) @@ -1609,20 +1614,20 @@ class TestServerList(TestServer): server._format_servers_list_power_state( getattr(s, 'OS-EXT-STS:power_state') ), - server._format_servers_list_networks(s.networks), + format_columns.DictListColumn(s.networks), self.image.name, s.image['id'], self.flavor.name, s.flavor['id'], getattr(s, 'OS-EXT-AZ:availability_zone'), getattr(s, 'OS-EXT-SRV-ATTR:host'), - s.Metadata, + format_columns.DictColumn(s.Metadata), )) self.data_no_name_lookup.append(( s.id, s.name, s.status, - server._format_servers_list_networks(s.networks), + format_columns.DictListColumn(s.networks), s.image['id'], s.flavor['id'] )) @@ -1640,7 +1645,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_server_list_long_option(self): arglist = [ @@ -1656,7 +1661,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns_long, columns) - self.assertEqual(tuple(self.data_long), tuple(data)) + self.assertListItemEqual(self.data_long, list(data)) def test_server_list_no_name_lookup_option(self): arglist = [ @@ -1672,7 +1677,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data_no_name_lookup), tuple(data)) + self.assertListItemEqual(self.data_no_name_lookup, list(data)) def test_server_list_n_option(self): arglist = [ @@ -1688,7 +1693,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data_no_name_lookup), tuple(data)) + self.assertListItemEqual(self.data_no_name_lookup, list(data)) def test_server_list_with_image(self): @@ -1708,7 +1713,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_server_list_with_flavor(self): @@ -1728,7 +1733,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) def test_server_list_with_changes_since(self): @@ -1749,7 +1754,7 @@ class TestServerList(TestServer): self.servers_mock.list.assert_called_with(**self.kwargs) self.assertEqual(self.columns, columns) - self.assertEqual(tuple(self.data), tuple(data)) + self.assertListItemEqual(self.data, list(data)) @mock.patch.object(timeutils, 'parse_isotime', side_effect=ValueError) def test_server_list_with_invalid_changes_since(self, mock_parse_isotime): @@ -2700,14 +2705,16 @@ class TestServerShow(TestServer): self.data = ( 'Running', - 'public=10.20.30.40, 2001:db8::f', + format_columns.DictListColumn( + {'public': ['10.20.30.40', '2001:db8::f']} + ), self.flavor.name + " (" + self.flavor.id + ")", self.server.id, self.image.name + " (" + self.image.id + ")", self.server.name, {'public': ['10.20.30.40', '2001:db8::f']}, 'tenant-id-xxx', - '', + format_columns.DictColumn(''), ) def test_show_no_options(self): @@ -2730,7 +2737,7 @@ class TestServerShow(TestServer): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) def test_show_diagnostics(self): arglist = [ @@ -2989,13 +2996,13 @@ class TestServerGeneral(TestServer): # Prepare expected data. # Since networks is a dict, whose items are in random order, there # could be two results after formatted. - data_1 = (u'private=2001:db8::f, 10.20.30.40; ' + data_1 = (u'private=10.20.30.40, 2001:db8::f; ' u'public=10.20.30.40, 2001:db8::f') data_2 = (u'public=10.20.30.40, 2001:db8::f; ' - u'private=2001:db8::f, 10.20.30.40') + u'private=10.20.30.40, 2001:db8::f') - # Call _format_servers_list_networks(). - networks_format = server._format_servers_list_networks(networks) + format_col = format_columns.DictListColumn(networks) + networks_format = format_col.human_readable() msg = ('Network string is not formatted correctly.\n' 'reference = %s or %s\n' @@ -3044,5 +3051,17 @@ class TestServerGeneral(TestServer): # 'networks' is used to create _server. Remove it. server_detail.pop('networks') + # Special handle for 'properties', it's DictColumn type + prop = server_detail.pop('properties') + expected_prop = info.pop('properties') + self.assertIsInstance(prop, format_columns.DictColumn) + self.assertEqual(expected_prop, prop.human_readable()) + + # Special handle for 'addresses', it's DictListColumn type + prop = server_detail.pop('addresses') + expected_prop = info.pop('addresses') + self.assertIsInstance(prop, format_columns.DictListColumn) + self.assertEqual(expected_prop, prop.human_readable()) + # Check the results. self.assertEqual(info, server_detail) diff --git a/openstackclient/tests/unit/compute/v2/test_server_group.py b/openstackclient/tests/unit/compute/v2/test_server_group.py index 088497da..d77767de 100644 --- a/openstackclient/tests/unit/compute/v2/test_server_group.py +++ b/openstackclient/tests/unit/compute/v2/test_server_group.py @@ -15,6 +15,7 @@ import mock +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib import utils @@ -38,9 +39,9 @@ class TestServerGroup(compute_fakes.TestComputev2): data = ( fake_server_group.id, - utils.format_list(fake_server_group.members), + format_columns.ListColumn(fake_server_group.members), fake_server_group.name, - utils.format_list(fake_server_group.policies), + format_columns.ListColumn(fake_server_group.policies), fake_server_group.project_id, fake_server_group.user_id, ) @@ -78,7 +79,7 @@ class TestServerGroupCreate(TestServerGroup): ) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) class TestServerGroupDelete(TestServerGroup): @@ -182,14 +183,14 @@ class TestServerGroupList(TestServerGroup): list_data = (( TestServerGroup.fake_server_group.id, TestServerGroup.fake_server_group.name, - utils.format_list(TestServerGroup.fake_server_group.policies), + format_columns.ListColumn(TestServerGroup.fake_server_group.policies), ),) list_data_long = (( TestServerGroup.fake_server_group.id, TestServerGroup.fake_server_group.name, - utils.format_list(TestServerGroup.fake_server_group.policies), - utils.format_list(TestServerGroup.fake_server_group.members), + format_columns.ListColumn(TestServerGroup.fake_server_group.policies), + format_columns.ListColumn(TestServerGroup.fake_server_group.members), TestServerGroup.fake_server_group.project_id, TestServerGroup.fake_server_group.user_id, ),) @@ -211,7 +212,7 @@ class TestServerGroupList(TestServerGroup): self.server_groups_mock.list.assert_called_once_with(False) self.assertEqual(self.list_columns, columns) - self.assertEqual(self.list_data, tuple(data)) + self.assertListItemEqual(self.list_data, list(data)) def test_server_group_list_with_all_projects_and_long(self): arglist = [ @@ -227,7 +228,7 @@ class TestServerGroupList(TestServerGroup): self.server_groups_mock.list.assert_called_once_with(True) self.assertEqual(self.list_columns_long, columns) - self.assertEqual(self.list_data_long, tuple(data)) + self.assertListItemEqual(self.list_data_long, list(data)) class TestServerGroupShow(TestServerGroup): @@ -250,4 +251,4 @@ class TestServerGroupShow(TestServerGroup): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertItemEqual(self.data, data) |
