summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/aggregate.py5
-rw-r--r--openstackclient/compute/v2/flavor.py33
-rw-r--r--openstackclient/compute/v2/server.py35
-rw-r--r--openstackclient/compute/v2/server_backup.py5
-rw-r--r--openstackclient/compute/v2/server_group.py9
-rw-r--r--openstackclient/compute/v2/server_image.py5
-rw-r--r--openstackclient/tests/functional/compute/v2/test_aggregate.py14
-rw-r--r--openstackclient/tests/functional/compute/v2/test_flavor.py31
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py53
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server_group.py24
-rw-r--r--openstackclient/tests/unit/compute/v2/test_aggregate.py5
-rw-r--r--openstackclient/tests/unit/compute/v2/test_flavor.py32
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py91
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server_group.py19
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)