#!/usr/bin/python3 # Tunnel integration tests. NM and networkd are started on the generated # configuration, using emulated ethernets (veth). # # These need to be run in a VM and do change the system # configuration. # # Copyright (C) 2018 Canonical, Ltd. # Author: Mathieu Trudel-Lapierre # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 3. # # 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 sys import subprocess import unittest from base import IntegrationTestsBase, test_backends class _CommonTests(): def test_tunnel_sit(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'sit-tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: sit-tun0: mode: sit local: 192.168.5.1 remote: 99.99.99.99 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('sit-tun0', ['sit-tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99']) def test_tunnel_ipip(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: ipip local: 192.168.5.1 remote: 99.99.99.99 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99']) @unittest.skipIf("networkd" not in test_backends, "skipping as networkd backend tests are disabled") class TestNetworkd(IntegrationTestsBase, _CommonTests): backend = 'networkd' def test_tunnel_gre(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: gre local: 192.168.5.1 remote: 99.99.99.99 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99']) def test_tunnel_gre6(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: ip6gre local: fe80::1 remote: 2001:dead:beef::2 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* fe80::1 brd 2001:dead:beef::2']) def test_tunnel_vti(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: vti keys: 1234 local: 192.168.5.1 remote: 99.99.99.99 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99']) def test_tunnel_vti6(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: vti6 keys: 1234 local: fe80::1 remote: 2001:dead:beef::2 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* fe80::1 brd 2001:dead:beef::2']) @unittest.skipIf("NetworkManager" not in test_backends, "skipping as NetworkManager backend tests are disabled") class TestNetworkManager(IntegrationTestsBase, _CommonTests): backend = 'NetworkManager' def test_tunnel_gre(self): self.setup_eth(None) self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'tun0'], stderr=subprocess.DEVNULL) with open(self.config, 'w') as f: f.write('''network: renderer: %(r)s version: 2 ethernets: ethbn: match: {name: %(ec)s} ethb2: match: {name: %(e2c)s} tunnels: tun0: mode: gre keys: 1234 local: 192.168.5.1 remote: 99.99.99.99 ''' % {'r': self.backend, 'ec': self.dev_e_client, 'e2c': self.dev_e2_client}) self.generate_and_settle() self.assert_iface('tun0', ['tun0@NONE', 'link.* 192.168.5.1 peer 99.99.99.99']) unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))