Skip to content

Commit e767b1e

Browse files
committed
Fix AddressesColumn sorting in server list output
Made AddressesColumn comparable by its human-readable value so that 'openstack server list --sort-column Networks' no longer raises a TypeError or 'Could not sort on field 'Networks'; unsortable types' when comparing two AddressesColumn instances wrapping address dicts. Added a regression tests covering ordering and equality of AddressesColumn instances. Change-Id: I730a0ec670d6b19a45ea2cc4ca9e1c0254c9ced1 Signed-off-by: Udayendu Kar <udayendu.kar@gmail.com>
1 parent 05249ce commit e767b1e

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,19 @@ def machine_readable(self) -> Any:
8989
for k, v in (self._value.items() if self._value else [])
9090
}
9191

92+
def __lt__(self, other: Any) -> bool:
93+
# cliff only ever compares two values from the same column,
94+
# so `other` is expected to also be an AddressesColumn
95+
return self.human_readable() < other.human_readable()
96+
97+
def __eq__(self, other: object) -> bool:
98+
if not isinstance(other, AddressesColumn):
99+
return NotImplemented
100+
return self.human_readable() == other.human_readable()
101+
102+
def __hash__(self) -> int:
103+
return hash(self.human_readable())
104+
92105

93106
class HostColumn(cliff_columns.FormattableColumn[str | None]):
94107
"""Generate a formatted string of a hostname."""

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,41 @@ def setup_sdk_servers_mock(self, count):
8484
return servers
8585

8686

87+
class TestAddressesColumn(test_utils.TestCommand):
88+
def setUp(self):
89+
super().setUp()
90+
91+
self.addr_a = server.AddressesColumn(
92+
{'demo-net': [{'addr': '10.0.0.144', 'version': 4}]}
93+
)
94+
self.addr_b = server.AddressesColumn(
95+
{'network1': [{'addr': '192.168.1.254', 'version': 4}]}
96+
)
97+
98+
def test_sorting(self):
99+
"""Verify AddressesColumn objects can be sorted."""
100+
addresses = [
101+
self.addr_b,
102+
self.addr_a,
103+
]
104+
105+
self.assertEqual(
106+
[self.addr_a, self.addr_b],
107+
sorted(addresses),
108+
)
109+
110+
def test_comparison(self):
111+
"""Verify AddressesColumn comparison uses human-readable values."""
112+
addr_a_dup = server.AddressesColumn(
113+
{'demo-net': [{'addr': '10.0.0.144', 'version': 4}]}
114+
)
115+
116+
self.assertLess(self.addr_a, self.addr_b)
117+
self.assertGreater(self.addr_b, self.addr_a)
118+
self.assertEqual(self.addr_a, addr_a_dup)
119+
self.assertNotEqual(self.addr_a, self.addr_b)
120+
121+
87122
class TestServerAddFixedIP(TestServer):
88123
def setUp(self):
89124
super().setUp()

0 commit comments

Comments
 (0)