diff options
author | Chad Smith <chad.smith@canonical.com> | 2017-10-02 13:17:39 -0600 |
---|---|---|
committer | Chad Smith <chad.smith@canonical.com> | 2017-10-02 13:17:39 -0600 |
commit | b3acdff390329c8091b880b490e1f27441a7a486 (patch) | |
tree | d2797646aff98a76887dcc80cc26c1479af71f8c | |
parent | f010594beb75e146091db47b7d72d1fc1d763e98 (diff) | |
download | vyos-cloud-init-b3acdff390329c8091b880b490e1f27441a7a486.tar.gz vyos-cloud-init-b3acdff390329c8091b880b490e1f27441a7a486.zip |
Add missing simpletable and simpletable tests for failed merge
-rw-r--r-- | cloudinit/simpletable.py | 62 | ||||
-rw-r--r-- | cloudinit/tests/test_simpletable.py | 100 |
2 files changed, 162 insertions, 0 deletions
diff --git a/cloudinit/simpletable.py b/cloudinit/simpletable.py new file mode 100644 index 00000000..90603228 --- /dev/null +++ b/cloudinit/simpletable.py @@ -0,0 +1,62 @@ +# Copyright (C) 2017 Amazon.com, Inc. or its affiliates +# +# Author: Ethan Faust <efaust@amazon.com> +# Author: Andrew Jorgensen <ajorgens@amazon.com> +# +# This file is part of cloud-init. See LICENSE file for license information. + + +class SimpleTable(object): + """A minimal implementation of PrettyTable + for distribution with cloud-init. + """ + + def __init__(self, fields): + self.fields = fields + self.rows = [] + + # initialize list of 0s the same length + # as the number of fields + self.column_widths = [0] * len(self.fields) + self.update_column_widths(fields) + + def update_column_widths(self, values): + for i, value in enumerate(values): + self.column_widths[i] = max( + len(value), + self.column_widths[i]) + + def add_row(self, values): + if len(values) > len(self.fields): + raise TypeError('too many values') + values = [str(value) for value in values] + self.rows.append(values) + self.update_column_widths(values) + + def _hdiv(self): + """Returns a horizontal divider for the table.""" + return '+' + '+'.join( + ['-' * (w + 2) for w in self.column_widths]) + '+' + + def _row(self, row): + """Returns a formatted row.""" + return '|' + '|'.join( + [col.center(self.column_widths[i] + 2) + for i, col in enumerate(row)]) + '|' + + def __str__(self): + """Returns a string representation of the table with lines around. + + +-----+-----+ + | one | two | + +-----+-----+ + | 1 | 2 | + | 01 | 10 | + +-----+-----+ + """ + lines = [self._hdiv(), self._row(self.fields), self._hdiv()] + lines += [self._row(r) for r in self.rows] + [self._hdiv()] + return '\n'.join(lines) + + def get_string(self): + return repr(self) diff --git a/cloudinit/tests/test_simpletable.py b/cloudinit/tests/test_simpletable.py new file mode 100644 index 00000000..96bc24cf --- /dev/null +++ b/cloudinit/tests/test_simpletable.py @@ -0,0 +1,100 @@ +# Copyright (C) 2017 Amazon.com, Inc. or its affiliates +# +# Author: Andrew Jorgensen <ajorgens@amazon.com> +# +# This file is part of cloud-init. See LICENSE file for license information. +"""Tests that SimpleTable works just like PrettyTable for cloud-init. + +Not all possible PrettyTable cases are tested because we're not trying to +reimplement the entire library, only the minimal parts we actually use. +""" + +from cloudinit.simpletable import SimpleTable +from cloudinit.tests.helpers import CiTestCase + +# Examples rendered by cloud-init using PrettyTable +NET_DEVICE_FIELDS = ( + 'Device', 'Up', 'Address', 'Mask', 'Scope', 'Hw-Address') +NET_DEVICE_ROWS = ( + ('ens3', True, '172.31.4.203', '255.255.240.0', '.', '0a:1f:07:15:98:70'), + ('ens3', True, 'fe80::81f:7ff:fe15:9870/64', '.', 'link', + '0a:1f:07:15:98:70'), + ('lo', True, '127.0.0.1', '255.0.0.0', '.', '.'), + ('lo', True, '::1/128', '.', 'host', '.'), +) +NET_DEVICE_TABLE = """\ ++--------+------+----------------------------+---------------+-------+-------------------+ +| Device | Up | Address | Mask | Scope | Hw-Address | ++--------+------+----------------------------+---------------+-------+-------------------+ +| ens3 | True | 172.31.4.203 | 255.255.240.0 | . | 0a:1f:07:15:98:70 | +| ens3 | True | fe80::81f:7ff:fe15:9870/64 | . | link | 0a:1f:07:15:98:70 | +| lo | True | 127.0.0.1 | 255.0.0.0 | . | . | +| lo | True | ::1/128 | . | host | . | ++--------+------+----------------------------+---------------+-------+-------------------+""" # noqa: E501 +ROUTE_IPV4_FIELDS = ( + 'Route', 'Destination', 'Gateway', 'Genmask', 'Interface', 'Flags') +ROUTE_IPV4_ROWS = ( + ('0', '0.0.0.0', '172.31.0.1', '0.0.0.0', 'ens3', 'UG'), + ('1', '169.254.0.0', '0.0.0.0', '255.255.0.0', 'ens3', 'U'), + ('2', '172.31.0.0', '0.0.0.0', '255.255.240.0', 'ens3', 'U'), +) +ROUTE_IPV4_TABLE = """\ ++-------+-------------+------------+---------------+-----------+-------+ +| Route | Destination | Gateway | Genmask | Interface | Flags | ++-------+-------------+------------+---------------+-----------+-------+ +| 0 | 0.0.0.0 | 172.31.0.1 | 0.0.0.0 | ens3 | UG | +| 1 | 169.254.0.0 | 0.0.0.0 | 255.255.0.0 | ens3 | U | +| 2 | 172.31.0.0 | 0.0.0.0 | 255.255.240.0 | ens3 | U | ++-------+-------------+------------+---------------+-----------+-------+""" + +AUTHORIZED_KEYS_FIELDS = ( + 'Keytype', 'Fingerprint (md5)', 'Options', 'Comment') +AUTHORIZED_KEYS_ROWS = ( + ('ssh-rsa', '24:c7:41:49:47:12:31:a0:de:6f:62:79:9b:13:06:36', '-', + 'ajorgens'), +) +AUTHORIZED_KEYS_TABLE = """\ ++---------+-------------------------------------------------+---------+----------+ +| Keytype | Fingerprint (md5) | Options | Comment | ++---------+-------------------------------------------------+---------+----------+ +| ssh-rsa | 24:c7:41:49:47:12:31:a0:de:6f:62:79:9b:13:06:36 | - | ajorgens | ++---------+-------------------------------------------------+---------+----------+""" # noqa: E501 + +# from prettytable import PrettyTable +# pt = PrettyTable(('HEADER',)) +# print(pt) +NO_ROWS_FIELDS = ('HEADER',) +NO_ROWS_TABLE = """\ ++--------+ +| HEADER | ++--------+ ++--------+""" + + +class TestSimpleTable(CiTestCase): + + def test_no_rows(self): + """An empty table is rendered as PrettyTable would have done it.""" + table = SimpleTable(NO_ROWS_FIELDS) + self.assertEqual(str(table), NO_ROWS_TABLE) + + def test_net_dev(self): + """Net device info is rendered as it was with PrettyTable.""" + table = SimpleTable(NET_DEVICE_FIELDS) + for row in NET_DEVICE_ROWS: + table.add_row(row) + self.assertEqual(str(table), NET_DEVICE_TABLE) + + def test_route_ipv4(self): + """Route IPv4 info is rendered as it was with PrettyTable.""" + table = SimpleTable(ROUTE_IPV4_FIELDS) + for row in ROUTE_IPV4_ROWS: + table.add_row(row) + self.assertEqual(str(table), ROUTE_IPV4_TABLE) + + def test_authorized_keys(self): + """SSH authorized keys are rendered as they were with PrettyTable.""" + table = SimpleTable(AUTHORIZED_KEYS_FIELDS) + for row in AUTHORIZED_KEYS_ROWS: + table.add_row(row) + self.assertEqual(str(table), AUTHORIZED_KEYS_TABLE) |