From b6ad4c9908b03cc9cbb5d1173476984b08b68222 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sat, 25 Jan 2020 11:45:10 +0100 Subject: interface: provide common test class for networking Currently only bonding and bridge interfaces are supported --- scripts/cli/test_interfaces.py | 95 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 scripts/cli/test_interfaces.py (limited to 'scripts/cli/test_interfaces.py') diff --git a/scripts/cli/test_interfaces.py b/scripts/cli/test_interfaces.py new file mode 100755 index 000000000..1f96bdfc6 --- /dev/null +++ b/scripts/cli/test_interfaces.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2019-2020 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import unittest +import vyos.config +import vyos.configsession + +from netifaces import ifaddresses, AF_INET, AF_INET6 +from vyos.validate import is_intf_addr_assigned, is_ipv6_link_local +from vyos.interfaces import list_interfaces_of_type + +class BasicInterfaceTest: + class BaseTest(unittest.TestCase): + def setUp(self): + self.session = vyos.configsession.ConfigSession(os.getpid()) + env = self.session.get_session_env() + self.config = vyos.config.Config(session_env=env) + self._test_addr = ['192.0.2.1/25', '2001:db8:1::ffff/64'] + + def tearDown(self): + self.session.delete(self._base_path) + self.session.commit() + + def test_add_address(self): + """ Check if address can be added to interface """ + + # Add address + for intf in self._interfaces: + for addr in self._test_addr: + self.session.set(self._base_path + [intf, 'address', addr]) + self.session.commit() + + # Validate address + for intf in self._interfaces: + for af in AF_INET, AF_INET6: + for addr in ifaddresses(intf)[af]: + # checking link local addresses makes no sense + if is_ipv6_link_local(addr['addr']): + continue + + self.assertTrue(is_intf_addr_assigned(intf, addr['addr'])) + + +class BondInterfaceTest(BasicInterfaceTest.BaseTest): + def setUp(self): + super().setUp() + self._base_path = ['interfaces', 'bonding'] + self._interfaces = ['bond0'] + + def test_add_remove_member(self): + members = [] + # we need to filter out VLAN interfaces identified by a dot (.) + # in their name - just in case! + for tmp in list_interfaces_of_type("ethernet"): + if not '.' in tmp: + members.append(tmp) + + for intf in self._interfaces: + for member in members: + # We can not enslave an interface when there is an address + # assigned - thus we do not allow it in case someone + # runs vyos-smoketest on his production device + self.session.set(self._base_path + [intf, 'member', 'interface', member]) + + self.session.commit() + + for intf in self._interfaces: + self.session.delete(self._base_path + [intf, 'member']) + + self.session.commit() + + +class BridgeInterfaceTest(BasicInterfaceTest.BaseTest): + def setUp(self): + super().setUp() + self._base_path = ['interfaces', 'bridge'] + self._interfaces = ['br0'] + + +if __name__ == '__main__': + unittest.main() -- cgit v1.2.3