diff options
author | Chad Smith <chad.smith@canonical.com> | 2017-10-10 12:58:19 -0600 |
---|---|---|
committer | Chad Smith <chad.smith@canonical.com> | 2017-10-10 12:58:19 -0600 |
commit | d4f70470b7c3af89d4bf97123f4d61ad8a58805b (patch) | |
tree | 380ae0d12c9aec39f0ea05d600d6031ae58ceb46 | |
parent | 45d361cb0b7f5e4e7d79522bd285871898358623 (diff) | |
download | vyos-cloud-init-d4f70470b7c3af89d4bf97123f4d61ad8a58805b.tar.gz vyos-cloud-init-d4f70470b7c3af89d4bf97123f4d61ad8a58805b.zip |
simpletable: Fix get_string method to return table-formatted string
Output in cloud-init-output.log contained only the string representation
of a SimpleTable object instead of the table formatted content. This bug
also affected ssh_authkey_fingerprints.
LP: #1722566
-rw-r--r-- | cloudinit/netinfo.py | 2 | ||||
-rw-r--r-- | cloudinit/simpletable.py | 2 | ||||
-rw-r--r-- | cloudinit/tests/test_netinfo.py | 106 | ||||
-rw-r--r-- | cloudinit/tests/test_simpletable.py | 8 |
4 files changed, 115 insertions, 3 deletions
diff --git a/cloudinit/netinfo.py b/cloudinit/netinfo.py index 8f99d99c..993b26cf 100644 --- a/cloudinit/netinfo.py +++ b/cloudinit/netinfo.py @@ -171,7 +171,7 @@ def netdev_pformat(): else: fields = ['Device', 'Up', 'Address', 'Mask', 'Scope', 'Hw-Address'] tbl = SimpleTable(fields) - for (dev, d) in netdev.items(): + for (dev, d) in sorted(netdev.items()): tbl.add_row([dev, d["up"], d["addr"], d["mask"], ".", d["hwaddr"]]) if d.get('addr6'): tbl.add_row([dev, d["up"], diff --git a/cloudinit/simpletable.py b/cloudinit/simpletable.py index 90603228..ca663cce 100644 --- a/cloudinit/simpletable.py +++ b/cloudinit/simpletable.py @@ -59,4 +59,4 @@ class SimpleTable(object): return '\n'.join(lines) def get_string(self): - return repr(self) + return self.__str__() diff --git a/cloudinit/tests/test_netinfo.py b/cloudinit/tests/test_netinfo.py new file mode 100644 index 00000000..7dea2e41 --- /dev/null +++ b/cloudinit/tests/test_netinfo.py @@ -0,0 +1,106 @@ +# This file is part of cloud-init. See LICENSE file for license information. + +"""Tests netinfo module functions and classes.""" + +from cloudinit.netinfo import netdev_pformat, route_pformat +from cloudinit.tests.helpers import CiTestCase, mock + + +# Example ifconfig and route output +SAMPLE_IFCONFIG_OUT = """\ +enp0s25 Link encap:Ethernet HWaddr 50:7b:9d:2c:af:91 + inet addr:192.168.2.18 Bcast:192.168.2.255 Mask:255.255.255.0 + inet6 addr: fe80::8107:2b92:867e:f8a6/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:8106427 errors:55 dropped:0 overruns:0 frame:37 + TX packets:9339739 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:4953721719 (4.9 GB) TX bytes:7731890194 (7.7 GB) + Interrupt:20 Memory:e1200000-e1220000 + +lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:65536 Metric:1 + RX packets:579230851 errors:0 dropped:0 overruns:0 frame:0 + TX packets:579230851 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1 +""" + +SAMPLE_ROUTE_OUT = '\n'.join([ + '0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0' + ' enp0s25', + '0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0' + ' wlp3s0', + '192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0' + ' enp0s25']) + + +NETDEV_FORMATTED_OUT = '\n'.join([ + '+++++++++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++' + '++++++++++++++++++++', + '+---------+------+------------------------------+---------------+-------+' + '-------------------+', + '| Device | Up | Address | Mask | Scope |' + ' Hw-Address |', + '+---------+------+------------------------------+---------------+-------+' + '-------------------+', + '| enp0s25 | True | 192.168.2.18 | 255.255.255.0 | . |' + ' 50:7b:9d:2c:af:91 |', + '| enp0s25 | True | fe80::8107:2b92:867e:f8a6/64 | . | link |' + ' 50:7b:9d:2c:af:91 |', + '| lo | True | 127.0.0.1 | 255.0.0.0 | . |' + ' . |', + '| lo | True | ::1/128 | . | host |' + ' . |', + '+---------+------+------------------------------+---------------+-------+' + '-------------------+']) + +ROUTE_FORMATTED_OUT = '\n'.join([ + '+++++++++++++++++++++++++++++Route IPv4 info++++++++++++++++++++++++++' + '+++', + '+-------+-------------+-------------+---------------+-----------+-----' + '--+', + '| Route | Destination | Gateway | Genmask | Interface | Flags' + ' |', + '+-------+-------------+-------------+---------------+-----------+' + '-------+', + '| 0 | 0.0.0.0 | 192.168.2.1 | 0.0.0.0 | wlp3s0 |' + ' UG |', + '| 1 | 192.168.2.0 | 0.0.0.0 | 255.255.255.0 | enp0s25 |' + ' U |', + '+-------+-------------+-------------+---------------+-----------+' + '-------+', + '++++++++++++++++++++++++++++++++++++++++Route IPv6 info++++++++++' + '++++++++++++++++++++++++++++++', + '+-------+-------------+-------------+---------------+---------------+' + '-----------------+-------+', + '| Route | Proto | Recv-Q | Send-Q | Local Address |' + ' Foreign Address | State |', + '+-------+-------------+-------------+---------------+---------------+' + '-----------------+-------+', + '| 0 | 0.0.0.0 | 192.168.2.1 | 0.0.0.0 | UG |' + ' 0 | 0 |', + '| 1 | 192.168.2.0 | 0.0.0.0 | 255.255.255.0 | U |' + ' 0 | 0 |', + '+-------+-------------+-------------+---------------+---------------+' + '-----------------+-------+']) + + +class TestNetInfo(CiTestCase): + + maxDiff = None + + @mock.patch('cloudinit.netinfo.util.subp') + def test_netdev_pformat(self, m_subp): + """netdev_pformat properly rendering network device information.""" + m_subp.return_value = (SAMPLE_IFCONFIG_OUT, '') + content = netdev_pformat() + self.assertEqual(NETDEV_FORMATTED_OUT, content) + + @mock.patch('cloudinit.netinfo.util.subp') + def test_route_pformat(self, m_subp): + """netdev_pformat properly rendering network device information.""" + m_subp.return_value = (SAMPLE_ROUTE_OUT, '') + content = route_pformat() + self.assertEqual(ROUTE_FORMATTED_OUT, content) diff --git a/cloudinit/tests/test_simpletable.py b/cloudinit/tests/test_simpletable.py index 96bc24cf..a12a62a0 100644 --- a/cloudinit/tests/test_simpletable.py +++ b/cloudinit/tests/test_simpletable.py @@ -97,4 +97,10 @@ class TestSimpleTable(CiTestCase): table = SimpleTable(AUTHORIZED_KEYS_FIELDS) for row in AUTHORIZED_KEYS_ROWS: table.add_row(row) - self.assertEqual(str(table), AUTHORIZED_KEYS_TABLE) + + def test_get_string(self): + """get_string() method returns the same content as str().""" + table = SimpleTable(AUTHORIZED_KEYS_FIELDS) + for row in AUTHORIZED_KEYS_ROWS: + table.add_row(row) + self.assertEqual(table.get_string(), str(table)) |