diff options
| -rw-r--r-- | python/vyos/ifconfig/tunnel.py | 13 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_interfaces_tunnel.py | 263 | 
2 files changed, 54 insertions, 222 deletions
| diff --git a/python/vyos/ifconfig/tunnel.py b/python/vyos/ifconfig/tunnel.py index 00dc36420..1af4f8e72 100644 --- a/python/vyos/ifconfig/tunnel.py +++ b/python/vyos/ifconfig/tunnel.py @@ -63,21 +63,21 @@ class _Tunnel(Interface):          },      }} +    _create_cmd = 'ip tunnel add {ifname} mode {type}' +      def __init__(self, ifname, **config):          self.config = deepcopy(config) if config else {}          super().__init__(ifname, **config)      def _create(self): -        create = 'ip tunnel add {ifname} mode {type}' -          # add " option-name option-name-value ..." for all options set          options = " ".join(["{} {}".format(k, self.config[k])                              for k in self.options if k in self.config and self.config[k]]) -        self._cmd('{} {}'.format(create.format(**self.config), options)) +        self._cmd('{} {}'.format(self._create_cmd.format(**self.config), options))          self.set_admin_state('down')      def change_options(self): -        change = 'ip tunnel cha {ifname} mode {type}' +        change = 'ip tunnel change {ifname} mode {type}'          # add " option-name option-name-value ..." for all options set          options = " ".join(["{} {}".format(k, self.config[k]) @@ -164,6 +164,11 @@ class GRETapIf(_Tunnel):      default = {'type': 'gretap'}      options = ['local', 'remote', 'ttl',] +    _create_cmd = 'ip link add name {ifname} type {type}' + +    def change_options(self): +        pass +  class IP6GREIf(_Tunnel):      """      IP6Gre: IPv6 Support for Generic Routing Encapsulation (GRE) diff --git a/smoketest/scripts/cli/test_interfaces_tunnel.py b/smoketest/scripts/cli/test_interfaces_tunnel.py index ca68cb8ba..6115f0a07 100755 --- a/smoketest/scripts/cli/test_interfaces_tunnel.py +++ b/smoketest/scripts/cli/test_interfaces_tunnel.py @@ -62,6 +62,7 @@ def tunnel_conf(interface):  class TunnelInterfaceTest(BasicInterfaceTest.BaseTest):      def setUp(self): +        self._test_ip = True          self._test_mtu = True          self._base_path = ['interfaces', 'tunnel']          self.local_v4 = '192.0.2.1' @@ -82,85 +83,14 @@ class TunnelInterfaceTest(BasicInterfaceTest.BaseTest):          self.session.delete(['interfaces', 'dummy', source_if])          super().tearDown() -    def test_ipip(self): -        interface = 'tun100' -        encapsulation = 'ipip' -        local_if_addr = '10.10.10.1/24' -        self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -        # Must provide an "encapsulation" for tunnel  tun10 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -        # Must configure either local-ip or dhcp-interface for tunnel ipip tun100 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'local-ip', self.local_v4]) - -        # missing required option remote for ipip -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'remote-ip', remote_ip4]) - -        # Configure Tunnel Source interface -        self.session.set(self._base_path + [interface, 'source-interface', source_if]) - -        self.session.commit() - -        conf = tunnel_conf(interface) -        self.assertEqual(interface, conf['ifname']) -        self.assertEqual(encapsulation, conf['link_type']) -        self.assertEqual(mtu, conf['mtu']) -        self.assertEqual(source_if, conf['link']) - -        self.assertEqual(self.local_v4, conf['linkinfo']['info_data']['local']) -        self.assertEqual(remote_ip4,     conf['linkinfo']['info_data']['remote']) - -    def test_ipip6(self): -        interface = 'tun110' -        encapsulation = 'ipip6' -        local_if_addr = '10.10.10.1/24' - -        self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -        # Must provide an "encapsulation" for tunnel  tun10 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -        # Must configure either local-ip or dhcp-interface for tunnel ipip tun100 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'local-ip', self.local_v6]) - -        # missing required option remote for ipip -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'remote-ip', remote_ip6]) - -        # Configure Tunnel Source interface -        self.session.set(self._base_path + [interface, 'source-interface', source_if]) - -        self.session.commit() - -        conf = tunnel_conf(interface) -        self.assertEqual(interface, conf['ifname']) -        self.assertEqual('tunnel6', conf['link_type']) -        self.assertEqual(mtu, conf['mtu']) -        self.assertEqual(source_if, conf['link']) - -        self.assertEqual(self.local_v6, conf['linkinfo']['info_data']['local']) -        self.assertEqual(remote_ip6,     conf['linkinfo']['info_data']['remote']) - -    def test_tunnel_verify_ipv4_local_remote_addr(self): +    def test_ipv4_encapsulations(self):          # When running tests ensure that for certain encapsulation types the          # local and remote IP address is actually an IPv4 address          interface = f'tun1000'          local_if_addr = f'10.10.200.1/24' -        for encapsulation in ['ipip', 'sit', 'gre']: +        for encapsulation in ['ipip', 'sit', 'gre', 'gre-bridge']:              self.session.set(self._base_path + [interface, 'address', local_if_addr])              self.session.set(self._base_path + [interface, 'encapsulation', encapsulation])              self.session.set(self._base_path + [interface, 'local-ip', self.local_v6]) @@ -176,14 +106,35 @@ class TunnelInterfaceTest(BasicInterfaceTest.BaseTest):                  self.session.commit()              self.session.set(self._base_path + [interface, 'remote-ip', remote_ip4]) +            self.session.set(self._base_path + [interface, 'source-interface', source_if]) + +            # Source interface can not be used with sit and gre-bridge +            if encapsulation in ['sit', 'gre-bridge']: +                with self.assertRaises(ConfigSessionError): +                    self.session.commit() +                self.session.delete(self._base_path + [interface, 'source-interface']) +              # Check if commit is ok              self.session.commit() +            conf = tunnel_conf(interface) +            self.assertEqual(interface, conf['ifname']) +            self.assertEqual(mtu, conf['mtu']) + +            if encapsulation not in ['sit', 'gre-bridge']: +                self.assertEqual(source_if, conf['link']) +                self.assertEqual(encapsulation, conf['link_type']) +            elif encapsulation in ['gre-bridge']: +                self.assertEqual('ether', conf['link_type']) + +            self.assertEqual(self.local_v4, conf['linkinfo']['info_data']['local']) +            self.assertEqual(remote_ip4,     conf['linkinfo']['info_data']['remote']) +              # cleanup this instance              self.session.delete(self._base_path + [interface])              self.session.commit() -    def test_tunnel_verify_ipv6_local_remote_addr(self): +    def test_ipv6_encapsulations(self):          # When running tests ensure that for certain encapsulation types the          # local and remote IP address is actually an IPv6 address @@ -205,9 +156,28 @@ class TunnelInterfaceTest(BasicInterfaceTest.BaseTest):                  self.session.commit()              self.session.set(self._base_path + [interface, 'remote-ip', remote_ip6]) +            # Configure Tunnel Source interface +            self.session.set(self._base_path + [interface, 'source-interface', source_if]) +              # Check if commit is ok              self.session.commit() +            conf = tunnel_conf(interface) +            self.assertEqual(interface, conf['ifname']) +            self.assertEqual(mtu, conf['mtu']) +            self.assertEqual(source_if, conf['link']) + +            # remap encapsulation protocol(s) +            if encapsulation in ['ipip6', 'ip6ip6']: +                encapsulation = 'tunnel6' +            elif encapsulation in ['ip6gre']: +                encapsulation = 'gre6' + +            self.assertEqual(encapsulation, conf['link_type']) + +            self.assertEqual(self.local_v6, conf['linkinfo']['info_data']['local']) +            self.assertEqual(remote_ip6,     conf['linkinfo']['info_data']['remote']) +              # cleanup this instance              self.session.delete(self._base_path + [interface])              self.session.commit() @@ -232,148 +202,5 @@ class TunnelInterfaceTest(BasicInterfaceTest.BaseTest):          # Check if commit is ok          self.session.commit() -    def test_tunnel_ip6ip6(self): -        interface = 'tun120' -        encapsulation = 'ip6ip6' -        local_if_addr = '2001:db8:f00::1/24' - -        self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -        # Must provide an "encapsulation" for tunnel  tun10 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -        # Must configure either local-ip or dhcp-interface for tunnel ipip tun100 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'local-ip', self.local_v6]) - -        # missing required option remote for ipip -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'remote-ip', remote_ip6]) - -        # Configure Tunnel Source interface -        self.session.set(self._base_path + [interface, 'source-interface', source_if]) - -        self.session.commit() - -        conf = tunnel_conf(interface) -        self.assertEqual(interface, conf['ifname']) -        self.assertEqual('tunnel6', conf['link_type']) -        self.assertEqual(mtu, conf['mtu']) -        self.assertEqual(source_if, conf['link']) - -        self.assertEqual(self.local_v6, conf['linkinfo']['info_data']['local']) -        self.assertEqual(remote_ip6,     conf['linkinfo']['info_data']['remote']) - -    def test_tunnel_gre_ipv4(self): -        interface = 'tun200' -        encapsulation = 'gre' -        local_if_addr = '172.16.1.1/24' - -        self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -        # Must provide an "encapsulation" for tunnel  tun10 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -        # Must configure either local-ip or dhcp-interface -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'local-ip', self.local_v4]) - -        # No assertion is raised for GRE remote-ip when missing -        self.session.set(self._base_path + [interface, 'remote-ip', remote_ip4]) - -        # Configure Tunnel Source interface -        self.session.set(self._base_path + [interface, 'source-interface', source_if]) - -        self.session.commit() - -        conf = tunnel_conf(interface) -        self.assertEqual(interface, conf['ifname']) -        self.assertEqual(encapsulation, conf['link_type']) -        self.assertEqual(mtu, conf['mtu']) -        self.assertEqual(source_if, conf['link']) - -        self.assertEqual(self.local_v4, conf['linkinfo']['info_data']['local']) -        self.assertEqual(remote_ip4,     conf['linkinfo']['info_data']['remote']) - - -        def test_gre_ipv6(self): -            interface = 'tun210' -            encapsulation = 'ip6gre' -            local_if_addr = '2001:db8:f01::1/24' - -            self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -            # Must provide an "encapsulation" for tunnel  tun10 -            with self.assertRaises(ConfigSessionError): -                self.session.commit() -            self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -            # Must configure either local-ip or dhcp-interface -            with self.assertRaises(ConfigSessionError): -                self.session.commit() -            self.session.set(self._base_path + [interface, 'local-ip', self.local_v6]) - -            # No assertion is raised for GRE remote-ip when missing -            self.session.set(self._base_path + [interface, 'remote-ip', remote_ip6]) - -            # Configure Tunnel Source interface -            self.session.set(self._base_path + [interface, 'source-interface', source_if]) - -            self.session.commit() - -            conf = tunnel_conf(interface) -            self.assertEqual(interface, conf['ifname']) -            self.assertEqual(encapsulation, conf['link_type']) -            self.assertEqual(mtu, conf['mtu']) -            self.assertEqual(source_if, conf['link']) - -            self.assertEqual(self.local_v6, conf['linkinfo']['info_data']['local']) -            self.assertEqual(remote_ip6,     conf['linkinfo']['info_data']['remote']) - - -    def test_tunnel_sit(self): -        interface = 'tun300' -        encapsulation = 'sit' -        local_if_addr = '172.16.2.1/24' - -        self.session.set(self._base_path + [interface, 'address', local_if_addr]) - -        # Must provide an "encapsulation" for tunnel  tun10 -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'encapsulation', encapsulation]) - -        # Must configure either local-ip or dhcp-interface -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.set(self._base_path + [interface, 'local-ip', self.local_v4]) - -        # No assertion is raised for GRE remote-ip when missing -        self.session.set(self._base_path + [interface, 'remote-ip', remote_ip4]) - -        # Source interface can not be used with sit -        self.session.set(self._base_path + [interface, 'source-interface', source_if]) -        with self.assertRaises(ConfigSessionError): -            self.session.commit() -        self.session.delete(self._base_path + [interface, 'source-interface']) - -        self.session.commit() - -        conf = tunnel_conf(interface) -        self.assertEqual(interface, conf['ifname']) -        self.assertEqual(encapsulation, conf['link_type']) -        self.assertEqual(mtu, conf['mtu']) - -        self.assertEqual(self.local_v4, conf['linkinfo']['info_data']['local']) -        self.assertEqual(remote_ip4,     conf['linkinfo']['info_data']['remote']) - -  if __name__ == '__main__': -    unittest.main(verbosity=2) +    unittest.main(verbosity=2, failfast=True) | 
