summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2017-10-10 12:58:19 -0600
committerChad Smith <chad.smith@canonical.com>2017-10-10 12:58:19 -0600
commitd4f70470b7c3af89d4bf97123f4d61ad8a58805b (patch)
tree380ae0d12c9aec39f0ea05d600d6031ae58ceb46
parent45d361cb0b7f5e4e7d79522bd285871898358623 (diff)
downloadvyos-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.py2
-rw-r--r--cloudinit/simpletable.py2
-rw-r--r--cloudinit/tests/test_netinfo.py106
-rw-r--r--cloudinit/tests/test_simpletable.py8
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))