예제 #1
0
        def test_8021ad_qinq_vlan(self):
            """ Testcase for 802.1ad Q-in-Q VLAN interfaces """
            if not self._test_qinq:
                return None

            for interface in self._interfaces:
                base = self._base_path + [interface]
                for option in self._options.get(interface, []):
                    self.session.set(base + option.split())

                for vif_s in self._qinq_range:
                    for vif_c in self._vlan_range:
                        base = self._base_path + [
                            interface, 'vif-s', vif_s, 'vif-c', vif_c
                        ]
                        self.session.set(base + ['mtu', self._mtu])
                        for address in self._test_addr:
                            self.session.set(base + ['address', address])

            self.session.commit()
            for interface in self._interfaces:
                for vif_s in self._qinq_range:
                    for vif_c in self._vlan_range:
                        vif = f'{interface}.{vif_s}.{vif_c}'
                        for address in self._test_addr:
                            self.assertTrue(is_intf_addr_assigned(
                                vif, address))
                        self._mtu_test(vif)
예제 #2
0
        def test_add_address_multi(self):
            """
            Check if IPv4/IPv6 addresses 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])
                    for option in self._options.get(intf, []):
                        self.session.set(self._base_path + [intf] +
                                         option.split())

            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']))
예제 #3
0
    def del_addr(self, addr):
        """
        Delete IP(v6) address to interface. Address is only added if it is
        assigned to that interface.

        addr: can be an IPv4 address, IPv6 address, dhcp or dhcpv6!
              IPv4: delete IPv4 address from interface
              IPv6: delete IPv6 address from interface
              dhcp: stop dhclient (IPv4) on interface
              dhcpv6: stop dhclient (IPv6) on interface

        Example:
        >>> from vyos.ifconfig import Interface
        >>> j = Interface('eth0')
        >>> j.add_addr('2001:db8::ffff/64')
        >>> j.add_addr('192.0.2.1/24')
        >>> j.get_addr()
        ['192.0.2.1/24', '2001:db8::ffff/64']
        >>> j.del_addr('192.0.2.1/24')
        >>> j.get_addr()
        ['2001:db8::ffff/64']
        """
        if addr == 'dhcp':
            self.dhcp.v4.delete()
        elif addr == 'dhcpv6':
            self.dhcp.v6.delete()
        else:
            if is_intf_addr_assigned(self.config['ifname'], addr):
                cmd = 'ip addr del "{}" dev "{}"'.format(
                    addr, self.config['ifname'])
                return self._cmd(cmd)
예제 #4
0
        def test_add_address_single(self):
            """
            Check if a single address can be added to interface.
            """
            addr = '192.0.2.0/31'
            for intf in self._interfaces:
                self.session.set(self._base_path + [intf, 'address', addr])
                for option in self._options.get(intf, []):
                    self.session.set(self._base_path + [intf] + option.split())

            self.session.commit()

            for intf in self._interfaces:
                self.assertTrue(is_intf_addr_assigned(intf, addr))
예제 #5
0
    def add_addr(self, addr):
        """
        Add IP(v6) address to interface. Address is only added if it is not
        already assigned to that interface. Address format must be validated
        and compressed/normalized before calling this function.

        addr: can be an IPv4 address, IPv6 address, dhcp or dhcpv6!
              IPv4: add IPv4 address to interface
              IPv6: add IPv6 address to interface
              dhcp: start dhclient (IPv4) on interface
              dhcpv6: start WIDE DHCPv6 (IPv6) on interface

        Returns False if address is already assigned and wasn't re-added.
        Example:
        >>> from vyos.ifconfig import Interface
        >>> j = Interface('eth0')
        >>> j.add_addr('192.0.2.1/24')
        >>> j.add_addr('2001:db8::ffff/64')
        >>> j.get_addr()
        ['192.0.2.1/24', '2001:db8::ffff/64']
        """
        # XXX: normalize/compress with ipaddress if calling functions don't?
        # is subnet mask always passed, and in the same way?

        # do not add same address twice
        if addr in self._addr:
            return False

        # we can't have both DHCP and static IPv4 addresses assigned
        for a in self._addr:
            if ((addr == 'dhcp' and a != 'dhcpv6' and is_ipv4(a))
                    or (a == 'dhcp' and addr != 'dhcpv6' and is_ipv4(addr))):
                raise ConfigError(
                    ("Can't configure both static IPv4 and DHCP address "
                     "on the same interface"))

        # add to interface
        if addr == 'dhcp':
            self.dhcp.v4.set()
        elif addr == 'dhcpv6':
            self.dhcp.v6.set()
        elif not is_intf_addr_assigned(self.ifname, addr):
            self._cmd(f'ip addr add "{addr}" dev "{self.ifname}"')
        else:
            return False

        # add to cache
        self._addr.append(addr)

        return True
예제 #6
0
    def add_addr(self, addr):
        """
        Add IP(v6) address to interface. Address is only added if it is not
        already assigned to that interface.

        addr: can be an IPv4 address, IPv6 address, dhcp or dhcpv6!
              IPv4: add IPv4 address to interface
              IPv6: add IPv6 address to interface
              dhcp: start dhclient (IPv4) on interface
              dhcpv6: start dhclient (IPv6) on interface

        Example:
        >>> from vyos.ifconfig import Interface
        >>> j = Interface('eth0')
        >>> j.add_addr('192.0.2.1/24')
        >>> j.add_addr('2001:db8::ffff/64')
        >>> j.get_addr()
        ['192.0.2.1/24', '2001:db8::ffff/64']
        """

        # cache new IP address which is assigned to interface
        self._addr.append(addr)

        # we can not have both DHCP and static IPv4 addresses assigned to an interface
        if 'dhcp' in self._addr:
            for addr in self._addr:
                # do not change below 'if' ordering esle you will get an exception as:
                #   ValueError: 'dhcp' does not appear to be an IPv4 or IPv6 address
                if addr != 'dhcp' and is_ipv4(addr):
                    raise ConfigError(
                        "Can't configure both static IPv4 and DHCP address on the same interface"
                    )

        if addr == 'dhcp':
            self.dhcp.v4.set()
        elif addr == 'dhcpv6':
            self.dhcp.v6.set()
        else:
            if not is_intf_addr_assigned(self.config['ifname'], addr):
                cmd = 'ip addr add "{}" dev "{}"'.format(
                    addr, self.config['ifname'])
                return self._cmd(cmd)
예제 #7
0
    def del_addr(self, addr):
        """
        Delete IP(v6) address from interface. Address is only deleted if it is
        assigned to that interface. Address format must be exactly the same as
        was used when adding the address.

        addr: can be an IPv4 address, IPv6 address, dhcp or dhcpv6!
              IPv4: delete IPv4 address from interface
              IPv6: delete IPv6 address from interface
              dhcp: stop dhclient (IPv4) on interface
              dhcpv6: stop dhclient (IPv6) on interface

        Returns False if address isn't already assigned and wasn't deleted.
        Example:
        >>> from vyos.ifconfig import Interface
        >>> j = Interface('eth0')
        >>> j.add_addr('2001:db8::ffff/64')
        >>> j.add_addr('192.0.2.1/24')
        >>> j.get_addr()
        ['192.0.2.1/24', '2001:db8::ffff/64']
        >>> j.del_addr('192.0.2.1/24')
        >>> j.get_addr()
        ['2001:db8::ffff/64']
        """

        # remove from interface
        if addr == 'dhcp':
            self.dhcp.v4.delete()
        elif addr == 'dhcpv6':
            self.dhcp.v6.delete()
        elif is_intf_addr_assigned(self.ifname, addr):
            self._cmd(f'ip addr del "{addr}" dev "{self.ifname}"')
        else:
            return False

        # remove from cache
        if addr in self._addr:
            self._addr.remove(addr)

        return True
예제 #8
0
        def test_8021q_vlan(self):
            """ Testcase for 802.1q VLAN interfaces """
            if not self._test_vlan:
                return None

            for interface in self._interfaces:
                base = self._base_path + [interface]
                for option in self._options.get(interface, []):
                    self.session.set(base + option.split())

                for vlan in self._vlan_range:
                    base = self._base_path + [interface, 'vif', vlan]
                    self.session.set(base + ['mtu', self._mtu])
                    for address in self._test_addr:
                        self.session.set(base + ['address', address])

            self.session.commit()
            for intf in self._interfaces:
                for vlan in self._vlan_range:
                    vif = f'{intf}.{vlan}'
                    for address in self._test_addr:
                        self.assertTrue(is_intf_addr_assigned(vif, address))
                    self._mtu_test(vif)
예제 #9
0
 def test_add_address_multi(self):
     super().test_add_address_multi()
     for addr in self._loopback_addresses:
         self.assertTrue(is_intf_addr_assigned('lo', addr))