Exemplo n.º 1
0
    def setup(self):
        require_user('root')
        require_executable('busybox')
        self.ip = IPDB()
        # create internal network
        self.if1 = uifname()
        self.if2 = uifname()
        self.ip.create(kind='veth', ifname=self.if1, peer=self.if2).commit()
        # set interfaces up
        with self.ip.interfaces[self.if1] as i:
            i.add_ip('172.16.101.1/24')
            i.up()

        with self.ip.interfaces[self.if2] as i:
            i.up()
        # prepare configuration for udhcpd
        with open('udhcpd.conf.in', 'r') as conf_in:
            with open('udhcpd.conf', 'w') as conf_out:
                conf_out.write('interface %s\n' % self.if1)
                conf_out.write(conf_in.read())
        # run busybox dhcp server on $if1
        with open(os.devnull, 'w') as fnull:
            subprocess.check_call(['busybox', 'udhcpd', 'udhcpd.conf'],
                                  stdout=fnull,
                                  stderr=fnull)
Exemplo n.º 2
0
    def test_move_ns_fd(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        ifB = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=ifA, kind='veth', peer=ifB).commit()
            assert ifA in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            with ip.interfaces[ifB] as intf:
                intf.net_ns_fd = bar
            assert ifA in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(bar)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            ip.interfaces[ifB].remove().commit()
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(foo)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        netnsmod.remove(foo)
        netnsmod.remove(bar)
Exemplo n.º 3
0
    def test_create_peer_attrs(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        ifB = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=ifA,
                      kind='veth',
                      peer={'ifname': ifB,
                            'net_ns_fd': bar}).commit()
            assert ifA in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(bar)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            ip.interfaces[ifB].remove().commit()
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(foo)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        netnsmod.remove(foo)
        netnsmod.remove(bar)
Exemplo n.º 4
0
    def test_move_ns_fd(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        ifB = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=ifA, kind='veth', peer=ifB).commit()
            assert ifA in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            with ip.interfaces[ifB] as intf:
                intf.net_ns_fd = bar
            assert ifA in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(bar)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            ip.interfaces[ifB].remove().commit()
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(foo)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        netnsmod.remove(foo)
        netnsmod.remove(bar)
Exemplo n.º 5
0
    def setup(self):
        require_user('root')
        require_executable('busybox')
        self.ip = IPDB()
        # create internal network
        self.if1 = uifname()
        self.if2 = uifname()
        self.ip.create(kind='veth', ifname=self.if1, peer=self.if2).commit()
        # set interfaces up
        with self.ip.interfaces[self.if1] as i:
            i.add_ip('172.16.101.1/24')
            i.up()

        with self.ip.interfaces[self.if2] as i:
            i.up()
        # prepare configuration for udhcpd
        with open('udhcpd.conf.in', 'r') as conf_in:
            with open('udhcpd.conf', 'w') as conf_out:
                conf_out.write('interface %s\n' % self.if1)
                conf_out.write(conf_in.read())
        # run busybox dhcp server on $if1
        with open(os.devnull, 'w') as fnull:
            subprocess.check_call(['busybox', 'udhcpd', 'udhcpd.conf'],
                                  stdout=fnull,
                                  stderr=fnull)
Exemplo n.º 6
0
    def test_veth_simple(self):
        ifname = uifname()
        peername = uifname()

        (self
         .ndb
         .interfaces
         .create(ifname=ifname, peer=peername, kind='veth')
         .commit())

        iflink = self.ndb.interfaces[ifname]['link']
        plink = self.ndb.interfaces[peername]['link']

        assert iflink == self.ndb.interfaces[peername]['index']
        assert plink == self.ndb.interfaces[ifname]['index']
        assert grep('%s ip link show' % self.ssh, pattern=ifname)
        assert grep('%s ip link show' % self.ssh, pattern=peername)

        (self
         .ndb
         .interfaces[ifname]
         .remove()
         .commit())

        assert not grep('%s ip link show' % self.ssh, pattern=ifname)
        assert not grep('%s ip link show' % self.ssh, pattern=peername)
Exemplo n.º 7
0
    def test_create_peer_attrs(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        ifB = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=ifA,
                      kind='veth',
                      peer={
                          'ifname': ifB,
                          'net_ns_fd': bar
                      }).commit()
            assert ifA in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(bar)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB in ip.interfaces.keys()
            ip.interfaces[ifB].remove().commit()
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        with IPDB(nl=NetNS(foo)) as ip:
            assert ifA not in ip.interfaces.keys()
            assert ifB not in ip.interfaces.keys()

        netnsmod.remove(foo)
        netnsmod.remove(bar)
Exemplo n.º 8
0
    def test_veth_simple(self):
        ifname = uifname()
        peername = uifname()
        spec = self.getspec(ifname=ifname,
                            peer=peername,
                            kind='veth')

        (self
         .ndb
         .interfaces
         .create(**spec)
         .commit())

        spec_ifl = self.getspec(ifname=ifname)
        spec_pl = self.getspec(ifname=peername)

        iflink = self.ndb.interfaces[spec_ifl]['link']
        plink = self.ndb.interfaces[spec_pl]['link']

        assert iflink == self.ndb.interfaces[spec_pl]['index']
        assert plink == self.ndb.interfaces[spec_ifl]['index']
        assert grep('%s ip link show' % self.ssh, pattern=ifname)
        assert grep('%s ip link show' % self.ssh, pattern=peername)

        (self
         .ndb
         .interfaces[spec_ifl]
         .remove()
         .commit())

        assert not grep('%s ip link show' % self.ssh, pattern=ifname)
        assert not grep('%s ip link show' % self.ssh, pattern=peername)
Exemplo n.º 9
0
 def test_view_cache(self):
     require_user('root')
     log_id = str(uuid.uuid4())
     ifname1 = uifname()
     ifname2 = uifname()
     with NDB(log='../ndb-%s-%s.log' % (os.getpid(), log_id),
              rtnl_debug=True) as ndb:
         # the cache is empty from the beginning
         assert len(list(ndb.interfaces.cache)) == 0
         # create test interfaces
         ndb.interfaces.create(ifname=ifname1, kind='dummy').commit()
         ndb.interfaces.create(ifname=ifname2, kind='dummy').commit()
         # the interfaces must not be cached
         assert len(list(ndb.interfaces.cache)) == 0
         # setup the cache expiration time
         ce = config.cache_expire
         config.cache_expire = 1
         # access the interfaces via __getitem__()
         assert ndb.interfaces[ifname1] is not None
         assert ndb.interfaces[ifname2] is not None
         # both must be in the cache
         assert len(list(ndb.interfaces.cache)) == 2
         # expire the cache
         time.sleep(1)
         # access the second interface to trigger the cache invalidation
         assert ndb.interfaces[ifname2] is not None
         # only ifname2 must remain in the cache
         assert len(list(ndb.interfaces.cache)) == 1
         # restore the environment
         config.cache_expire = ce
         ndb.interfaces[ifname1].remove().commit()
         ndb.interfaces[ifname2].remove().commit()
Exemplo n.º 10
0
    def test_veth_spec(self):
        ifname = uifname()
        peername = uifname()
        nsname = str(uuid.uuid4())

        (self
         .ndb
         .sources
         .add(netns=nsname))

        spec = self.getspec(**{'ifname': ifname,
                               'kind': 'veth',
                               'peer': {'ifname': peername,
                                        'address': '00:11:22:33:44:55',
                                        'net_ns_fd': nsname}})
        (self
         .ndb
         .interfaces
         .create(**spec)
         .commit())

        (self
         .ndb
         .interfaces
         .wait(target=nsname, ifname=peername))

        iflink = (self
                  .ndb
                  .interfaces[self.getspec(ifname=ifname)]['link'])
        plink = (self
                 .ndb
                 .interfaces[{'target': nsname,
                              'ifname': peername}]['link'])

        assert iflink == (self
                          .ndb
                          .interfaces[{'target': nsname,
                                       'ifname': peername}]['index'])
        assert plink == (self
                         .ndb
                         .interfaces[self.getspec(ifname=ifname)]['index'])
        assert grep('%s ip link show' % self.ssh, pattern=ifname)
        assert not grep('%s ip link show' % self.ssh, pattern=peername)

        (self
         .ndb
         .interfaces[self.getspec(ifname=ifname)]
         .remove()
         .commit())

        assert not grep('%s ip link show' % self.ssh, pattern=ifname)
        assert not grep('%s ip link show' % self.ssh, pattern=peername)

        (self
         .ndb
         .sources
         .remove(nsname))

        netns.remove(nsname)
Exemplo n.º 11
0
    def create_interfaces(self):
        # dummy interface
        if_dummy = uifname()
        if_vlan_stag = uifname()
        if_vlan_ctag = uifname()
        if_bridge = uifname()
        if_port = uifname()
        if_addr1 = self.ifaddr()
        if_addr2 = self.ifaddr()
        ret = []

        ret.append(
            self.ndb.interfaces.create(ifname=if_dummy,
                                       kind='dummy').commit()['index'])

        ret.append(
            self.ndb.interfaces.create(
                ifname=if_vlan_stag,
                link=self.ndb.interfaces[if_dummy]['index'],
                vlan_id=101,
                vlan_protocol=0x88a8,
                kind='vlan').commit()['index'])

        ret.append(
            self.ndb.interfaces.create(
                ifname=if_vlan_ctag,
                link=self.ndb.interfaces[if_vlan_stag]['index'],
                vlan_id=1001,
                vlan_protocol=0x8100,
                kind='vlan').commit()['index'])

        ret.append(
            self.ndb.interfaces.create(ifname=if_bridge,
                                       kind='bridge').commit()['index'])

        ret.append(
            self.ndb.interfaces.create(
                ifname=if_port,
                master=self.ndb.interfaces[if_bridge]['index'],
                kind='dummy').commit()['index'])

        (self.ndb.interfaces[if_bridge].ipaddr.create(address=if_addr1,
                                                      prefixlen=24).commit())

        (self.ndb.interfaces[if_bridge].ipaddr.create(address=if_addr2,
                                                      prefixlen=24).commit())

        self.if_bridge = if_bridge

        return ret
Exemplo n.º 12
0
    def test_create(self):
        require_user('root')

        nsid = str(uuid4())
        ipdb_main = IPDB()
        ipdb_test = IPDB(nl=NetNS(nsid))
        if1 = uifname()
        if2 = uifname()

        # create VETH pair
        ipdb_main.create(ifname=if1, kind='veth', peer=if2).commit()

        # move the peer to netns
        with ipdb_main.interfaces[if2] as veth:
            veth.net_ns_fd = nsid

        # assign addresses
        with ipdb_main.interfaces[if1] as veth:
            veth.add_ip('172.16.200.1/24')
            veth.up()

        with ipdb_test.interfaces[if2] as veth:
            veth.add_ip('172.16.200.2/24')
            veth.up()

        # ping peer
        try:
            with open('/dev/null', 'w') as fnull:
                subprocess.check_call(['ping', '-c', '1', '172.16.200.2'],
                                      stdout=fnull,
                                      stderr=fnull)
            ret_ping = True
        except Exception:
            ret_ping = False

        # check ARP
        time.sleep(0.5)
        ret_arp = '172.16.200.1' in list(ipdb_test.interfaces[if2].neighbours)
        # ret_arp = list(ipdb_test.interfaces.v0p1.neighbours)

        # cleanup
        ipdb_main.interfaces[if1].remove().commit()
        ipdb_main.release()
        ipdb_test.release()
        netnsmod.remove(nsid)

        assert ret_ping
        assert ret_arp
        assert nsid not in netnsmod.listnetns()
Exemplo n.º 13
0
    def _ports_mtu_race(self, kind):
        port1 = (self.ip.create(ifname=uifname(), kind='dummy',
                                mtu=1280).commit())
        port2 = (self.ip.create(ifname=uifname(), kind='dummy').commit())
        master = (self.ip.create(ifname=uifname(), kind=kind).commit())

        try:
            master.add_port(port1).commit()
            master.add_port(port2).commit()
        except:
            raise
        finally:
            port1.remove().commit()
            port2.remove().commit()
            master.remove().commit()
Exemplo n.º 14
0
    def test_create(self):
        require_user('root')

        nsid = str(uuid4())
        ipdb_main = IPDB()
        ipdb_test = IPDB(nl=NetNS(nsid))
        if1 = uifname()
        if2 = uifname()

        # create VETH pair
        ipdb_main.create(ifname=if1, kind='veth', peer=if2).commit()

        # move the peer to netns
        with ipdb_main.interfaces[if2] as veth:
            veth.net_ns_fd = nsid

        # assign addresses
        with ipdb_main.interfaces[if1] as veth:
            veth.add_ip('172.16.200.1/24')
            veth.up()

        with ipdb_test.interfaces[if2] as veth:
            veth.add_ip('172.16.200.2/24')
            veth.up()

        # ping peer
        try:
            with open('/dev/null', 'w') as fnull:
                subprocess.check_call(['ping', '-c', '1', '172.16.200.2'],
                                      stdout=fnull, stderr=fnull)
            ret_ping = True
        except Exception:
            ret_ping = False

        # check ARP
        time.sleep(0.5)
        ret_arp = '172.16.200.1' in list(ipdb_test.interfaces[if2].neighbours)
        # ret_arp = list(ipdb_test.interfaces.v0p1.neighbours)

        # cleanup
        ipdb_main.interfaces[if1].remove().commit()
        ipdb_main.release()
        ipdb_test.release()
        netnsmod.remove(nsid)

        assert ret_ping
        assert ret_arp
        assert nsid not in netnsmod.listnetns()
Exemplo n.º 15
0
    def test_basic(self):
        ifname = uifname()
        ifaddr1 = self.ifaddr()
        ifaddr2 = self.ifaddr()
        ifaddr3 = self.ifaddr()

        (self
         .ndb
         .interfaces
         .create(target=self.netns, ifname=ifname, kind='dummy')
         .ipaddr
         .create(address=ifaddr1, prefixlen=24)
         .create(address=ifaddr2, prefixlen=24)
         .create(address=ifaddr3, prefixlen=24)
         .commit())

        with NDB(sources=[{'target': 'localhost',
                           'netns': self.netns,
                           'kind': 'netns'}]) as ndb:
            if_idx = ndb.interfaces[ifname]['index']
            addr1_idx = ndb.addresses['%s/24' % ifaddr1]['index']
            addr2_idx = ndb.addresses['%s/24' % ifaddr2]['index']
            addr3_idx = ndb.addresses['%s/24' % ifaddr3]['index']

        assert if_idx == addr1_idx == addr2_idx == addr3_idx
Exemplo n.º 16
0
 def setup(self):
     self.ifname = uifname()
     self.ip = IPDB(mode='direct')
     try:
         self.ip.create(ifname=self.ifname, kind='dummy')
     except:
         pass
Exemplo n.º 17
0
 def _create(self, kind, **kwarg):
     name = uifname()
     self.ip.link('add', ifname=name, kind=kind, **kwarg)
     devs = self.ip.link_lookup(ifname=name)
     assert devs
     self.ifaces.extend(devs)
     return (name, devs[0])
Exemplo n.º 18
0
def interface_event():
    with open(os.devnull, 'w') as fnull:
        p0 = uifname()
        add_command = 'ip link add dev %s type dummy' % p0
        del_command = 'ip link del dev %s' % p0
        subprocess.call(add_command.split(), stdout=fnull, stderr=fnull)
        subprocess.call(del_command.split(), stdout=fnull, stderr=fnull)
Exemplo n.º 19
0
    def test_move_ns_pid(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        ns_foo = IPDB(nl=NetNS(foo))
        ns_bar = IPDB(nl=NetNS(bar))

        try:
            ns_foo.create(ifname=ifA, kind='dummy').commit()
            with ns_foo.interfaces[ifA] as iface:
                iface.net_ns_pid = ns_bar.nl.server.pid

            assert ifA in ns_bar.interfaces.keys()
            assert ifA not in ns_foo.interfaces.keys()

            with ns_bar.interfaces[ifA] as iface:
                iface.net_ns_pid = ns_foo.nl.server.pid

            assert ifA not in ns_bar.interfaces.keys()
            assert ifA in ns_foo.interfaces.keys()

        finally:
            ns_foo.release()
            ns_bar.release()
            netnsmod.remove(foo)
            netnsmod.remove(bar)
Exemplo n.º 20
0
    def test_basic(self):
        ifname = uifname()
        ifaddr1 = self.ifaddr()
        ifaddr2 = self.ifaddr()
        ifaddr3 = self.ifaddr()

        (self
         .ndb
         .interfaces
         .create(target=self.netns, ifname=ifname, kind='dummy')
         .ipaddr
         .create(address=ifaddr1, prefixlen=24)
         .create(address=ifaddr2, prefixlen=24)
         .create(address=ifaddr3, prefixlen=24)
         .commit())

        with NDB(sources=[{'target': 'localhost',
                           'netns': self.netns,
                           'kind': 'netns'}]) as ndb:
            if_idx = ndb.interfaces[ifname]['index']
            addr1_idx = ndb.addresses['%s/24' % ifaddr1]['index']
            addr2_idx = ndb.addresses['%s/24' % ifaddr2]['index']
            addr3_idx = ndb.addresses['%s/24' % ifaddr3]['index']

        assert if_idx == addr1_idx == addr2_idx == addr3_idx
Exemplo n.º 21
0
 def test_move(self):
     ifname = uifname()
     ifaddr = self.ifaddr()
     # create the interfaces
     (self
      .ndb
      .interfaces
      .create(ifname=ifname, kind='dummy')
      .commit())
     # move it to a netns
     (self
      .ndb
      .interfaces[ifname]
      .set('net_ns_fd', self.netns)
      .commit())
     # setup the interface only when it is moved
     (self
      .ndb
      .interfaces
      .wait(target=self.netns, ifname=ifname)
      .set('state', 'up')
      .set('address', '00:11:22:33:44:55')
      .ipaddr
      .create(address=ifaddr, prefixlen=24)
      .commit())
     self._assert_test_view(ifname, ifaddr)
Exemplo n.º 22
0
 def setup(self):
     self.ifname = uifname()
     self.ip = IPDB(mode='direct')
     try:
         self.ip.create(ifname=self.ifname, kind='dummy')
     except:
         pass
Exemplo n.º 23
0
 def _create(self, kind, **kwarg):
     name = uifname()
     self.ip.link('add', ifname=name, kind=kind, **kwarg)
     devs = self.ip.link_lookup(ifname=name)
     assert devs
     self.ifaces.extend(devs)
     return (name, devs[0])
Exemplo n.º 24
0
 def test_move(self):
     ifname = uifname()
     ifaddr = self.ifaddr()
     # create the interfaces
     (self
      .ndb
      .interfaces
      .create(ifname=ifname, kind='dummy')
      .commit())
     # move it to a netns
     (self
      .ndb
      .interfaces[ifname]
      .set('net_ns_fd', self.netns)
      .commit())
     # setup the interface only when it is moved
     (self
      .ndb
      .interfaces
      .wait(target=self.netns, ifname=ifname)
      .set('state', 'up')
      .set('address', '00:11:22:33:44:55')
      .ipaddr
      .create(address=ifaddr, prefixlen=24)
      .commit())
     self._assert_test_view(ifname, ifaddr)
Exemplo n.º 25
0
    def test_context_manager(self):

        ifname = uifname()
        address = '00:11:22:36:47:58'
        spec = self.getspec(ifname=ifname, kind='dummy')
        ifobj = (self
                 .ndb
                 .interfaces
                 .create(**spec))

        with ifobj:
            pass

        assert grep('%s ip link show' % self.ssh, pattern=ifname)

        with ifobj:
            ifobj['state'] = 'up'
            ifobj['address'] = address

        spec = self.getspec(ifname=ifname)
        assert grep('%s ip link show' % self.ssh, pattern=address)
        assert self.ndb.interfaces[spec]['state'] == 'up'

        with ifobj:
            ifobj.remove()
Exemplo n.º 26
0
    def test_move_ns_pid(self):
        foo = str(uuid4())
        bar = str(uuid4())
        ifA = uifname()
        netnsmod.create(foo)
        netnsmod.create(bar)

        ns_foo = IPDB(nl=NetNS(foo))
        ns_bar = IPDB(nl=NetNS(bar))

        try:
            ns_foo.create(ifname=ifA, kind='dummy').commit()
            with ns_foo.interfaces[ifA] as iface:
                iface.net_ns_pid = ns_bar.nl.server.pid

            assert ifA in ns_bar.interfaces.keys()
            assert ifA not in ns_foo.interfaces.keys()

            with ns_bar.interfaces[ifA] as iface:
                iface.net_ns_pid = ns_foo.nl.server.pid

            assert ifA not in ns_bar.interfaces.keys()
            assert ifA in ns_foo.interfaces.keys()

        finally:
            ns_foo.release()
            ns_bar.release()
            netnsmod.remove(foo)
            netnsmod.remove(bar)
Exemplo n.º 27
0
    def test_commit_barrier(self):
        require_user("root")

        ifname = uifname()

        # barrier 0
        try:
            ip = IPDB()
            config.commit_barrier = 0
            ts1 = time.time()
            ip.create(ifname=ifname, kind="dummy").commit()
            ts2 = time.time()
            assert 0 < (ts2 - ts1) < 1
        except:
            raise
        finally:
            config.commit_barrier = 0.2
            ip.interfaces[ifname].remove().commit()
            ip.release()

        # barrier 5
        try:
            ip = IPDB()
            config.commit_barrier = 5
            ts1 = time.time()
            ip.create(ifname=ifname, kind="dummy").commit()
            ts2 = time.time()
            assert 5 < (ts2 - ts1) < 6
        except:
            raise
        finally:
            config.commit_barrier = 0.2
            ip.interfaces[ifname].remove().commit()
            ip.release()
Exemplo n.º 28
0
 def setup(self):
     self.ifname = uifname()
     self.ip = IPDB(mode="direct")
     try:
         self.ip.create(ifname=self.ifname, kind="dummy")
     except:
         pass
Exemplo n.º 29
0
    def test_commit_barrier(self):
        require_user('root')

        ifname = uifname()

        # barrier 0
        try:
            ip = IPDB()
            config.commit_barrier = 0
            ts1 = time.time()
            ip.create(ifname=ifname, kind='dummy').commit()
            ts2 = time.time()
            assert 0 < (ts2 - ts1) < 1
        except:
            raise
        finally:
            config.commit_barrier = 0.2
            ip.interfaces[ifname].remove().commit()
            ip.release()

        # barrier 5
        try:
            ip = IPDB()
            config.commit_barrier = 5
            ts1 = time.time()
            ip.create(ifname=ifname, kind='dummy').commit()
            ts2 = time.time()
            assert 5 < (ts2 - ts1) < 6
        except:
            raise
        finally:
            config.commit_barrier = 0.2
            ip.interfaces[ifname].remove().commit()
            ip.release()
Exemplo n.º 30
0
    def test_fail(self):

        ifname = uifname()
        kind = uifname()

        ifobj = (self.ndb.interfaces.create(ifname=ifname, kind=kind))

        save = dict(ifobj)

        try:
            ifobj.commit()
        except NetlinkError as e:
            assert e.code == 95  # Operation not supported

        assert save == dict(ifobj)
        assert ifobj.state == 'invalid'
Exemplo n.º 31
0
 def test_create(self):
     require_user("root")
     ifname = uifname()
     assert ifname not in self.ip.interfaces
     self.ip.create(ifname=ifname, kind="dummy")
     assert ifname in self.ip.interfaces
     self.ip.interfaces[ifname].remove()
     assert ifname not in self.ip.interfaces
Exemplo n.º 32
0
 def test_create(self):
     require_user('root')
     ifname = uifname()
     assert ifname not in self.ip.interfaces
     self.ip.create(ifname=ifname, kind='dummy')
     assert ifname in self.ip.interfaces
     self.ip.interfaces[ifname].remove()
     assert ifname not in self.ip.interfaces
Exemplo n.º 33
0
 def setup(self):
     require_user("root")
     self.l2tp = L2tp()
     self.log_id = str(uuid.uuid4())
     self.ndb = NDB(
         log="../ndb-%s-%s.log" % (os.getpid(), self.log_id),
         rtnl_debug=True,
     )
     self.netif = uifname()
     self.l2tpeth0 = uifname()
     self.localnet = allocate_network()
     self.remotenet = allocate_network()
     self.localrange = [str(x) for x in self.localnet]
     self.remoterange = [str(x) for x in self.remotenet]
     # create the "network" interface
     (self.ndb.interfaces.create(ifname=self.netif, kind="dummy").set(
         "state", "up").add_ip("%s/24" % (self.localrange[1])).commit())
Exemplo n.º 34
0
    def test_simple_deps(self):

        # register NDB handler to wait for the interface
        self.if_simple = uifname()

        ifaddr = self.ifaddr()
        router = self.ifaddr()
        dst = str(self.ipnets[1].network)

        #
        # simple dummy interface with one address and
        # one dependent route
        #
        (self
         .interfaces
         .append(self
                 .ndb
                 .interfaces
                 .create(ifname=self.if_simple, kind='dummy')
                 .set('state', 'up')
                 .commit()['index']))
        (self
         .ndb
         .addresses
         .create(address=ifaddr,
                 prefixlen=24,
                 index=self.interfaces[-1])
         .commit())

        (self
         .ndb
         .routes
         .create(dst=dst, dst_len=24, gateway=router)
         .commit())

        iface = self.ndb.interfaces[self.if_simple]
        # check everything is in place
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='%s.*%s' % (dst, router))

        # remove the interface
        iface.remove()
        iface.commit()

        # check there is no interface, no route
        assert not grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh,
                        pattern='%s.*%s' % (dst, router))

        # revert the changes using the implicit last_save
        iface.rollback()
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='%s.*%s' % (dst, router))
Exemplo n.º 35
0
    def test_simple_deps(self):

        # register NDB handler to wait for the interface
        self.if_simple = uifname()

        ifaddr = self.ifaddr()
        router = self.ifaddr()
        dst = str(self.ipnets[1].network)

        #
        # simple dummy interface with one address and
        # one dependent route
        #
        (self
         .interfaces
         .append(self
                 .ndb
                 .interfaces
                 .create(ifname=self.if_simple, kind='dummy')
                 .set('state', 'up')
                 .commit()['index']))
        (self
         .ndb
         .addresses
         .create(address=ifaddr,
                 prefixlen=24,
                 index=self.interfaces[-1])
         .commit())

        (self
         .ndb
         .routes
         .create(dst=dst, dst_len=24, gateway=router)
         .commit())

        iface = self.ndb.interfaces[self.if_simple]
        # check everything is in place
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='%s.*%s' % (dst, router))

        # remove the interface
        iface.remove()
        iface.commit()

        # check there is no interface, no route
        assert not grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh,
                        pattern='%s.*%s' % (dst, router))

        # revert the changes using the implicit last_save
        iface.rollback()
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='%s.*%s' % (dst, router))
Exemplo n.º 36
0
    def test_create_tuntap(self):
        # actually this test checks the nlsocket plugin feedback
        # in a pair of remote client/server
        foo = str(uuid4())
        tun = uifname()
        tap = uifname()

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=tun, kind='tuntap', mode='tun').commit()
            ip.create(ifname=tap, kind='tuntap', mode='tap').commit()
            assert tun in ip.interfaces.keys()
            assert tap in ip.interfaces.keys()
            ip.interfaces[tun].remove().commit()
            ip.interfaces[tap].remove().commit()
            assert tun not in ip.interfaces.keys()
            assert tap not in ip.interfaces.keys()

        netnsmod.remove(foo)
Exemplo n.º 37
0
 def _create_ipvlan(self, smode):
     master = uifname()
     ipvlan = uifname()
     # create the master link
     self.ip.link_create(ifname=master, kind='dummy')
     midx = self.ip.link_lookup(ifname=master)[0]
     # check modes
     # maybe move modes dict somewhere else?
     cmode = ifinfmsg.ifinfo.ipvlan_data.modes[smode]
     assert ifinfmsg.ifinfo.ipvlan_data.modes[cmode] == smode
     # create ipvlan
     self.ip.link_create(ifname=ipvlan,
                         kind='ipvlan',
                         link=midx,
                         mode=cmode)
     devs = self.ip.link_lookup(ifname=ipvlan)
     assert devs
     self.ifaces.extend(devs)
Exemplo n.º 38
0
 def _create_ipvlan(self, smode):
     master = uifname()
     ipvlan = uifname()
     # create the master link
     self.ip.link_create(ifname=master, kind='dummy')
     midx = self.ip.link_lookup(ifname=master)[0]
     # check modes
     # maybe move modes dict somewhere else?
     cmode = ifinfmsg.ifinfo.ipvlan_data.modes[smode]
     assert ifinfmsg.ifinfo.ipvlan_data.modes[cmode] == smode
     # create ipvlan
     self.ip.link_create(ifname=ipvlan,
                         kind='ipvlan',
                         link=midx,
                         mode=cmode)
     devs = self.ip.link_lookup(ifname=ipvlan)
     assert devs
     self.ifaces.extend(devs)
Exemplo n.º 39
0
 def test_view_constraints_pipeline(self):
     ifname = uifname()
     ifaddr = self.ifaddr()
     (self.ndb.interfaces.constraint('target', self.netns).create(
         ifname=ifname,
         kind='dummy').set('address', '00:11:22:33:44:55').set(
             'state', 'up').ipaddr.create(address=ifaddr,
                                          prefixlen=24).commit())
     self._assert_test_view(ifname, ifaddr)
Exemplo n.º 40
0
    def test_rename_plus_ipv6(self):
        require_user('root')

        mtu = 1280  # mtu must be >= 1280 if you plan to use IPv6
        txqlen = 2000
        nsid = str(uuid4())
        ipdb_main = IPDB()
        ipdb_test = IPDB(nl=NetNS(nsid))
        if1 = uifname()
        if2 = uifname()
        if3 = uifname()

        # create
        ipdb_main.create(kind='veth',
                         ifname=if1,
                         peer=if2,
                         mtu=mtu,
                         txqlen=txqlen).commit()

        # move
        with ipdb_main.interfaces[if2] as veth:
            veth.net_ns_fd = nsid

        # set it up
        with ipdb_test.interfaces[if2] as veth:
            veth.add_ip('fdb3:84e5:4ff4:55e4::1/64')
            veth.add_ip('fdff:ffff:ffff:ffc0::1/64')
            veth.mtu = mtu
            veth.txqlen = txqlen
            veth.up()
            veth.ifname = if3

        veth = ipdb_test.interfaces.get(if3, None)
        ipdb_main.release()
        ipdb_test.release()
        netnsmod.remove(nsid)

        # check everything
        assert ('fdb3:84e5:4ff4:55e4::1', 64) in veth.ipaddr
        assert ('fdff:ffff:ffff:ffc0::1', 64) in veth.ipaddr
        assert veth.flags & 1
        assert veth.mtu == mtu
        assert veth.txqlen == txqlen
Exemplo n.º 41
0
    def create_interfaces(self):
        # dummy interface
        if_dummy = uifname()
        if_vlan_stag = uifname()
        if_vlan_ctag = uifname()
        if_bridge = uifname()
        if_port = uifname()
        ret = []

        with self.nl_class(**self.nl_kwarg) as ipr:

            ipr.link('add',
                     ifname=if_dummy,
                     kind='dummy')
            ret.append(self.link_wait(if_dummy))

            ipr.link('add',
                     ifname=if_vlan_stag,
                     link=ret[-1],
                     vlan_id=101,
                     vlan_protocol=0x88a8,
                     kind='vlan')
            ret.append(self.link_wait(if_vlan_stag))

            ipr.link('add',
                     ifname=if_vlan_ctag,
                     link=ret[-1],
                     vlan_id=1001,
                     vlan_protocol=0x8100,
                     kind='vlan')
            ret.append(self.link_wait(if_vlan_ctag))

            ipr.link('add',
                     ifname=if_port,
                     kind='dummy')
            ret.append(self.link_wait(if_port))

            ipr.link('add',
                     ifname=if_bridge,
                     kind='bridge')
            ret.append(self.link_wait(if_bridge))
            ipr.link('set', index=ret[-2], master=ret[-1])
            return ret
Exemplo n.º 42
0
    def test_veth_simple(self):
        ifname = uifname()
        peername = uifname()

        (self.ndb.interfaces.create(ifname=ifname, peer=peername,
                                    kind='veth').commit())

        iflink = self.ndb.interfaces[ifname]['link']
        plink = self.ndb.interfaces[peername]['link']

        assert iflink == self.ndb.interfaces[peername]['index']
        assert plink == self.ndb.interfaces[ifname]['index']
        assert grep('%s ip link show' % self.ssh, pattern=ifname)
        assert grep('%s ip link show' % self.ssh, pattern=peername)

        (self.ndb.interfaces[ifname].remove().commit())

        assert not grep('%s ip link show' % self.ssh, pattern=ifname)
        assert not grep('%s ip link show' % self.ssh, pattern=peername)
Exemplo n.º 43
0
    def test_fail(self):

        ifname = uifname()
        kind = uifname()

        ifobj = (self
                 .ndb
                 .interfaces
                 .add(ifname=ifname, kind=kind))

        save = dict(ifobj)

        try:
            ifobj.commit()
        except NetlinkError as e:
            assert e.code == 95  # Operation not supported

        assert save == dict(ifobj)
        assert ifobj.scope == 'invalid'
Exemplo n.º 44
0
 def create(self, kind='dummy'):
     require_user('root')
     name = uifname()
     self.ip.link('add', ifname=name, kind=kind)
     idx = None
     while not idx:
         idx = self.ip.link_lookup(ifname=name)
     idx = idx[0]
     self.ifaces.append(idx)
     return (name, idx)
Exemplo n.º 45
0
 def create(self, kind='dummy'):
     require_user('root')
     name = uifname()
     self.ip.link('add', ifname=name, kind=kind)
     idx = None
     while not idx:
         idx = self.ip.link_lookup(ifname=name)
     idx = idx[0]
     self.ifaces.append(idx)
     return (name, idx)
Exemplo n.º 46
0
    def test_rename_plus_ipv6(self):
        require_user('root')

        mtu = 1280  # mtu must be >= 1280 if you plan to use IPv6
        txqlen = 2000
        nsid = str(uuid4())
        ipdb_main = IPDB()
        ipdb_test = IPDB(nl=NetNS(nsid))
        if1 = uifname()
        if2 = uifname()
        if3 = uifname()

        # create
        ipdb_main.create(kind='veth',
                         ifname=if1,
                         peer=if2,
                         mtu=mtu,
                         txqlen=txqlen).commit()

        # move
        with ipdb_main.interfaces[if2] as veth:
            veth.net_ns_fd = nsid

        # set it up
        with ipdb_test.interfaces[if2] as veth:
            veth.add_ip('fdb3:84e5:4ff4:55e4::1/64')
            veth.add_ip('fdff:ffff:ffff:ffc0::1/64')
            veth.mtu = mtu
            veth.txqlen = txqlen
            veth.up()
            veth.ifname = if3

        veth = ipdb_test.interfaces.get(if3, None)
        ipdb_main.release()
        ipdb_test.release()
        netnsmod.remove(nsid)

        # check everything
        assert ('fdb3:84e5:4ff4:55e4::1', 64) in veth.ipaddr
        assert ('fdff:ffff:ffff:ffc0::1', 64) in veth.ipaddr
        assert veth.flags & 1
        assert veth.mtu == mtu
        assert veth.txqlen == txqlen
Exemplo n.º 47
0
    def test_create_tuntap(self):
        require_user('root')
        # actually this test checks the nlsocket plugin feedback
        # in a pair of remote client/server
        foo = str(uuid4())
        tun = uifname()
        tap = uifname()

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=tun, kind='tuntap', mode='tun').commit()
            ip.create(ifname=tap, kind='tuntap', mode='tap').commit()
            assert tun in ip.interfaces.keys()
            assert tap in ip.interfaces.keys()
            ip.interfaces[tun].remove().commit()
            ip.interfaces[tap].remove().commit()
            assert tun not in ip.interfaces.keys()
            assert tap not in ip.interfaces.keys()

        netnsmod.remove(foo)
Exemplo n.º 48
0
 def ifname(self):
     '''
     Register and return a new unique interface name to
     be used in a test.
     '''
     ifname = uifname()
     self.ifnames.append(ifname)
     self.rtm_events[ifname] = threading.Event()
     self.rtm_newlink[ifname] = []
     self.rtm_dellink[ifname] = []
     return ifname
Exemplo n.º 49
0
def interface_event():
    with open(os.devnull, 'w') as fnull:
        p0 = uifname()
        add_command = 'ip link add dev %s type dummy' % p0
        del_command = 'ip link del dev %s' % p0
        subprocess.call(add_command.split(),
                        stdout=fnull,
                        stderr=fnull)
        subprocess.call(del_command.split(),
                        stdout=fnull,
                        stderr=fnull)
Exemplo n.º 50
0
    def _ports_mtu_race(self, kind):
        port1 = (self.ip
                 .create(ifname=uifname(), kind='dummy', mtu=1280)
                 .commit())
        port2 = (self.ip
                 .create(ifname=uifname(), kind='dummy')
                 .commit())
        master = (self.ip
                  .create(ifname=uifname(), kind=kind)
                  .commit())

        try:
            master.add_port(port1).commit()
            master.add_port(port2).commit()
        except:
            raise
        finally:
            port1.remove().commit()
            port2.remove().commit()
            master.remove().commit()
Exemplo n.º 51
0
 def ifname(self):
     '''
     Register and return a new unique interface name to
     be used in a test.
     '''
     ifname = uifname()
     self.ifnames.append(ifname)
     self.rtm_events[ifname] = threading.Event()
     self.rtm_newlink[ifname] = []
     self.rtm_dellink[ifname] = []
     return ifname
Exemplo n.º 52
0
    def register(self, ifname=None, netns=None):
        '''
        Register an interface in `self.interfaces`. If no interface
        name specified, create a random one.

        All the saved interfaces will be removed on `teardown()`
        '''
        if ifname is None:
            ifname = uifname()
        self.interfaces[ifname] = netns
        return ifname
Exemplo n.º 53
0
 def test_view_constraints_cmanager(self):
     ifname = uifname()
     ifaddr = self.ifaddr()
     with self.ndb.interfaces as view:
         view.constraints['target'] = self.netns
         with view.create(ifname=ifname, kind='dummy') as interface:
             interface['address'] = '00:11:22:33:44:55'
             interface['state'] = 'up'
             with interface.ipaddr as aview:
                 with aview.create(address=ifaddr, prefixlen=24):
                     pass
     self._assert_test_view(ifname, ifaddr)
Exemplo n.º 54
0
    def test_create_tuntap(self):
        # on CentOS 6.5 this test causes kernel panic
        if platform.linux_distribution()[:2] == ('CentOS', '6.5'):
            raise SkipTest('to avoid possible kernel panic')
        # actually this test checks the nlsocket plugin feedback
        # in a pair of remote client/server
        foo = str(uuid4())
        tun = uifname()
        tap = uifname()

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=tun, kind='tuntap', mode='tun').commit()
            ip.create(ifname=tap, kind='tuntap', mode='tap').commit()
            assert tun in ip.interfaces.keys()
            assert tap in ip.interfaces.keys()
            ip.interfaces[tun].remove().commit()
            ip.interfaces[tap].remove().commit()
            assert tun not in ip.interfaces.keys()
            assert tap not in ip.interfaces.keys()

        netnsmod.remove(foo)
Exemplo n.º 55
0
    def test_create_tuntap(self):
        # on CentOS 6.5 this test causes kernel panic
        if platform.linux_distribution()[:2] == ('CentOS', '6.5'):
            raise SkipTest('to avoid possible kernel panic')
        # actually this test checks the nlsocket plugin feedback
        # in a pair of remote client/server
        foo = str(uuid4())
        tun = uifname()
        tap = uifname()

        with IPDB(nl=NetNS(foo)) as ip:
            ip.create(ifname=tun, kind='tuntap', mode='tun').commit()
            ip.create(ifname=tap, kind='tuntap', mode='tap').commit()
            assert tun in ip.interfaces.keys()
            assert tap in ip.interfaces.keys()
            ip.interfaces[tun].remove().commit()
            ip.interfaces[tap].remove().commit()
            assert tun not in ip.interfaces.keys()
            assert tap not in ip.interfaces.keys()

        netnsmod.remove(foo)
Exemplo n.º 56
0
    def test_bridge_fd_leaks(self):
        ifs = []

        for _ in range(RESPAWNS):
            ifs.append(uifname())

        with IPDB() as ipdb:
            for name in ifs:
                ipdb.create(ifname=name, kind="bridge").commit()

        with IPDB() as ipdb:
            for name in ifs:
                ipdb.interfaces[name].remove().commit()
Exemplo n.º 57
0
 def test_view_constraints_pipeline(self):
     ifname = uifname()
     ifaddr = self.ifaddr()
     (self
      .ndb
      .interfaces
      .constraint('target', self.netns)
      .create(ifname=ifname, kind='dummy')
      .set('address', '00:11:22:33:44:55')
      .set('state', 'up')
      .ipaddr
      .create(address=ifaddr, prefixlen=24)
      .commit())
     self._assert_test_view(ifname, ifaddr)
Exemplo n.º 58
0
    def test_tuntap_fd_leaks(self):
        require_user('root')
        ifs = []

        for _ in range(RESPAWNS):
            ifs.append(uifname())

        with IPRoute() as ipr:
            for name in ifs:
                ipr.link("add", ifname=name, kind="tuntap", mode="tun")

        with IPDB() as ipdb:
            for name in ifs:
                ipdb.interfaces[name].remove().commit()
Exemplo n.º 59
0
 def test_dummy0_loaded(object):
     require_user("root")
     # assert the module is loaded
     ifA = uifname()
     ip = IPDB()
     ip.create(ifname=ifA, kind="dummy").commit()
     try:
         # try to create and fail in create()
         ip.create(ifname="dummy0", kind="dummy")
     except CreateException:
         pass
     except Exception:
         raise
     finally:
         ip.interfaces[ifA].remove().commit()
         ip.release()
Exemplo n.º 60
0
    def test_simple_deps(self):
        with self.nl_class(**self.nl_kwarg) as ipr:
            self.interfaces = []
            #
            # simple dummy interface with one address and
            # one dependent route
            #
            self.if_simple = uifname()
            ipr.link('add',
                     ifname=self.if_simple,
                     kind='dummy')
            self.interfaces.append(self.link_wait(self.if_simple))
            ipr.link('set',
                     index=self.interfaces[-1],
                     state='up')
            ipr.addr('add',
                     index=self.interfaces[-1],
                     address='172.16.172.16',
                     prefixlen=24)
            ipr.route('add',
                      dst='172.16.127.0',
                      dst_len=24,
                      gateway='172.16.172.17')

        iface = self.ndb.interfaces[self.if_simple]
        # check everything is in place
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='172.16.127.*172.16.172.17')

        # remove the interface
        iface.remove()
        iface.commit()

        # check there is no interface, no route
        assert not grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert not grep('%s ip route show' % self.ssh,
                        pattern='172.16.127.*172.16.172.17')

        # revert the changes using the implicit last_save
        iface.rollback()
        assert grep('%s ip link show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh, pattern=self.if_simple)
        assert grep('%s ip route show' % self.ssh,
                    pattern='172.16.127.*172.16.172.17')