Esempio n. 1
0
def test_simple_deps(context):

    ifname = context.new_ifname
    ipaddr = context.new_ipaddr
    router = context.new_ipaddr
    dst = str(context.ipnets[1].network)

    #
    # simple dummy interface with one address and
    # one dependent route
    #
    (context.ndb.interfaces.create(ifname=ifname, kind='dummy').set(
        'state', 'up').add_ip(address=ipaddr, prefixlen=24).commit())

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

    # check everything is in place
    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr)
    assert route_exists(context.netns, gateway=router, dst=dst, dst_len=24)

    # remove the interface
    iface = context.ndb.interfaces[ifname].remove().commit()

    # check there is no interface, no route
    assert not interface_exists(context.netns, ifname=ifname)
    assert not address_exists(context.netns, ifname=ifname, address=ipaddr)
    assert not route_exists(context.netns, gateway=router, dst=dst, dst_len=24)

    # revert the changes using the implicit last_save
    iface.rollback()

    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr)
    assert route_exists(context.netns, gateway=router, dst=dst, dst_len=24)
Esempio n. 2
0
def test_add_del_ip_dict(context):
    ifname = context.new_ifname
    ifaddr1 = context.new_ipaddr
    ifaddr2 = context.new_ipaddr

    (context.ndb.interfaces.create(ifname=ifname, kind='dummy',
                                   state='down').add_ip({
                                       'address': ifaddr1,
                                       'prefixlen': 24
                                   }).add_ip({
                                       'address': ifaddr2,
                                       'prefixlen': 24
                                   }).commit())

    assert address_exists(context.netns, ifname=ifname, address=ifaddr1)
    assert address_exists(context.netns, ifname=ifname, address=ifaddr2)

    (context.ndb.interfaces[{
        'ifname': ifname
    }].del_ip({
        'address': ifaddr2,
        'prefixlen': 24
    }).del_ip({
        'address': ifaddr1,
        'prefixlen': 24
    }).commit())

    assert not address_exists(context.netns, ifname=ifname, address=ifaddr1)
    assert not address_exists(context.netns, ifname=ifname, address=ifaddr2)
Esempio n. 3
0
def test_default(context):

    ifaddr = context.new_ipaddr
    router = context.new_ipaddr
    ifname = context.new_ifname
    random.seed()
    tnum = random.randint(500, 600)

    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .add_ip('%s/24' % ifaddr)
     .commit())

    spec = {'dst': 'default',
            'gateway': router}

    if context.table:
        table = context.table
    else:
        table = tnum
    spec['table'] = table

    (context
     .ndb
     .routes
     .create(**spec)
     .commit())

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, gateway=router, table=table)
Esempio n. 4
0
def test_basic(context):

    ifaddr = context.new_ipaddr
    router = context.new_ipaddr
    ifname = context.new_ifname
    ipnet = str(context.ipnets[1].network)
    table = context.table

    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .ipaddr
     .create(address=ifaddr, prefixlen=24)
     .commit())

    spec = {'dst_len': 24,
            'dst': ipnet,
            'gateway': router}

    if table:
        spec['table'] = table

    (context
     .ndb
     .routes
     .create(**spec)
     .commit())

    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, dst=ipnet, table=table or 254)
Esempio n. 5
0
def test_update_replace(context):
    ifaddr = context.new_ipaddr
    router = context.new_ipaddr
    ifname = context.new_ifname
    network = str(context.ipnets[1].network)

    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .ipaddr
     .create(address=ifaddr, prefixlen=24)
     .commit())

    spec = {'dst_len': 24,
            'dst': network,
            'priority': 10,
            'gateway': router}

    if context.table:
        spec['table'] = context.table

    (context
     .ndb
     .routes
     .create(**spec)
     .commit())

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, dst=network, priority=10)
Esempio n. 6
0
def test_add_del_ip_dict(context):
    ifname = context.new_ifname
    ifaddr1 = context.new_ipaddr
    ifaddr2 = context.new_ipaddr
    log_spec = (
        context.spec.log_spec[0] + '.chaotic',
        context.spec.log_spec[1],
    )

    with NDB(
        log=log_spec,
        sources=[
            {
                'target': 'localhost',
                'kind': 'ChaoticIPRoute',
                'success_rate': 0.98,
            }
        ],
    ) as test_ndb:

        (
            test_ndb.interfaces.create(
                ifname=ifname, kind='dummy', state='down'
            )
            .add_ip({'address': ifaddr1, 'prefixlen': 24})
            .add_ip({'address': ifaddr2, 'prefixlen': 24})
            .commit()
        )

        assert address_exists(context.netns, ifname=ifname, address=ifaddr1)
        assert address_exists(context.netns, ifname=ifname, address=ifaddr2)

        (
            test_ndb.interfaces[{'ifname': ifname}]
            .del_ip({'address': ifaddr2, 'prefixlen': 24})
            .del_ip({'address': ifaddr1, 'prefixlen': 24})
            .commit()
        )

        assert not address_exists(
            context.netns, ifname=ifname, address=ifaddr1
        )
        assert not address_exists(
            context.netns, ifname=ifname, address=ifaddr2
        )
Esempio n. 7
0
def test_add_del_ip_string(context):
    ifname = context.new_ifname
    ifaddr1 = '%s/24' % context.new_ipaddr
    ifaddr2 = '%s/24' % context.new_ipaddr

    (context.ndb.interfaces.create(
        ifname=ifname, kind='dummy',
        state='down').add_ip(ifaddr1).add_ip(ifaddr2).commit())

    assert address_exists(context.netns, ifname=ifname, address=ifaddr1)
    assert address_exists(context.netns, ifname=ifname, address=ifaddr2)

    (context.ndb.interfaces[{
        'ifname': ifname
    }].del_ip(ifaddr2).del_ip(ifaddr1).commit())

    assert not address_exists(context.netns, ifname=ifname, address=ifaddr1)
    assert not address_exists(context.netns, ifname=ifname, address=ifaddr2)
Esempio n. 8
0
def test_del_ip_fail(context):
    ifname = context.new_ifname
    ipaddr = '%s/24' % context.new_ipaddr
    ipaddr_fail = '%s/24' % context.new_ipaddr

    (context.ndb.interfaces.create(ifname=ifname, kind='dummy',
                                   state='up').add_ip(ipaddr).commit())

    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr)

    try:
        (context.ndb.interfaces[ifname].del_ip(ipaddr_fail).commit())
        raise Exception('shall not pass')
    except KeyError:
        pass

    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr)
Esempio n. 9
0
def test_cm_address_create(context):
    '''
    Create an address using context manager syntax
    '''
    ifname = test_cm_interface_create(context)
    ipaddr = context.new_ipaddr
    with context.ndb.addresses.create(
            index=context.ndb.interfaces[ifname]['index'],
            address=ipaddr,
            prefixlen=24):
        pass
    assert address_exists(context.netns, ifname=ifname, address=ipaddr)
Esempio n. 10
0
def test_basic_address(context):

    ifaddr = context.new_ipaddr
    ifname = context.new_ifname
    spec_if = {'ifname': ifname, 'kind': 'dummy', 'state': 'up'}
    i = (context.ndb.interfaces.create(**spec_if))
    i.commit()

    spec_ad = {'index': i['index'], 'address': ifaddr, 'prefixlen': 24}
    a = (context.ndb.addresses.create(**spec_ad))
    a.commit()
    assert interface_exists(context.netns, ifname=ifname)
    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
Esempio n. 11
0
def _test_metrics_update(context, method):

    ifaddr = context.new_ipaddr
    gateway1 = context.new_ipaddr
    ifname = context.new_ifname
    ipnet = str(context.ipnets[1].network)
    target = 1300
    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .ipaddr
     .create(address=ifaddr, prefixlen=24)
     .commit())

    spec = {'dst_len': 24,
            'dst': ipnet,
            'gateway': gateway1,
            'metrics': {'mtu': target}}

    if context.table:
        spec['table'] = context.table

    (context
     .ndb
     .routes
     .create(**spec)
     .commit())

    def match_metrics(msg):
        if msg.get_attr('RTA_GATEWAY') != gateway1:
            return False
        mtu = (msg
               .get_attr('RTA_METRICS', rtmsg())
               .get_attr('RTAX_MTU', 0))
        return mtu == target

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, match=match_metrics)

    target = 1500
    #
    # referencing the route via full spec instead of a
    # local variable is important here for the test
    # purposes: thus we check if the cache is working
    # properly and by the spec we hit the same object
    # every time
    context.ndb.routes[spec]['metrics']['mtu'] = target
    getattr(context.ndb.routes[spec], method)()

    assert route_exists(context.netns, match=match_metrics)
Esempio n. 12
0
def test_multiple_interfaces(context):

    ifname1 = context.new_ifname
    ifname2 = context.new_ifname
    ipaddr1 = context.new_ipaddr
    ipaddr2 = context.new_ipaddr

    (context.ndb.begin().push(
        context.ndb.interfaces.create(ifname=ifname1, kind='dummy').set(
            state='up').set(address='00:11:22:aa:aa:aa').add_ip(
                address=ipaddr1, prefixlen=24),
        context.ndb.interfaces.create(ifname=ifname2, kind='dummy').set(
            state='up').set(address='00:11:22:bb:bb:bb').add_ip(
                address=ipaddr2, prefixlen=24)).commit())

    assert interface_exists(context.netns,
                            ifname=ifname1,
                            address='00:11:22:aa:aa:aa')
    assert interface_exists(context.netns,
                            ifname=ifname2,
                            address='00:11:22:bb:bb:bb')
    assert address_exists(context.netns, ifname=ifname1, address=ipaddr1)
    assert address_exists(context.netns, ifname=ifname2, address=ipaddr2)
Esempio n. 13
0
def test_localhost_implicit(context):
    ifname = context.new_ifname
    ipaddr = context.new_ipaddr
    nsname = context.new_nsname

    context.ndb.sources.add(netns=nsname)
    context.ndb.localhost = nsname

    (context.ndb.interfaces.create(ifname=ifname,
                                   kind='dummy').add_ip(address=ipaddr,
                                                        prefixlen=24).commit())

    assert interface_exists(nsname, ifname=ifname)
    assert address_exists(nsname, ifname=ifname, address=ipaddr)
Esempio n. 14
0
def test_same_metrics(context):
    ifaddr = context.new_ipaddr
    gateway1 = context.new_ipaddr
    gateway2 = context.new_ipaddr
    ifname = context.new_ifname
    ipnet1 = str(context.ipnets[1].network)
    ipnet2 = str(context.ipnets[2].network)
    target = 1300

    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .add_ip({'address': ifaddr, 'prefixlen': 24})
     .commit())

    # first route with these metrics
    (context
     .ndb
     .routes
     .create(dst=ipnet1,
             dst_len=24,
             gateway=gateway1,
             metrics={'mtu': target})
     .commit())

    # second route with these metrics
    (context
     .ndb
     .routes
     .create(dst=ipnet2,
             dst_len=24,
             gateway=gateway2,
             metrics={'mtu': target})
     .commit())

    # at this point it's already ok - otherwise the test
    # would explode on the second routes.create()
    # but lets double check

    def match_metrics(msg):
        if msg.get_attr('RTA_GATEWAY') != gateway2:
            return False
        mtu = (msg
               .get_attr('RTA_METRICS', rtmsg())
               .get_attr('RTAX_MTU', 0))
        return mtu == target

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, match=match_metrics)
Esempio n. 15
0
def test_vlan_deps(context):

    if_host = context.new_ifname
    if_vlan = context.new_ifname
    ifaddr1 = context.new_ipaddr
    ifaddr2 = context.new_ipaddr
    router = context.new_ipaddr
    dst = str(context.ipnets[1].network)

    (context
     .ndb
     .interfaces
     .create(ifname=if_host, kind='dummy', state='up')
     .commit())

    (context
     .ndb
     .interfaces
     .create(ifname=if_vlan,
             kind='vlan',
             state='up',
             vlan_id=1001,
             link=if_host)
     .add_ip(address=ifaddr1, prefixlen=24)
     .add_ip(address=ifaddr2, prefixlen=24)
     .commit())

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

    # check everything is in place
    assert interface_exists(context.netns, ifname=if_host)
    assert interface_exists(context.netns, ifname=if_vlan)
    assert address_exists(context.netns, ifname=if_vlan, address=ifaddr1)
    assert address_exists(context.netns, ifname=if_vlan, address=ifaddr2)
    assert route_exists(context.netns, dst=dst, gateway=router)

    # remove the interface
    iface = context.ndb.interfaces[if_host].remove().commit()

    # check there is no interface, no route
    assert not interface_exists(context.netns, ifname=if_host)
    assert not interface_exists(context.netns, ifname=if_vlan)
    assert not address_exists(context.netns, ifname=if_vlan, address=ifaddr1)
    assert not address_exists(context.netns, ifname=if_vlan, address=ifaddr2)
    assert not route_exists(context.netns, dst=dst, gateway=router)

    # revert the changes using the implicit last_save
    iface.rollback()
    assert interface_exists(context.netns, ifname=if_host)
    assert interface_exists(context.netns, ifname=if_vlan)
    assert address_exists(context.netns, ifname=if_vlan, address=ifaddr1)
    assert address_exists(context.netns, ifname=if_vlan, address=ifaddr2)
    assert route_exists(context.netns, dst=dst, gateway=router)
Esempio n. 16
0
def test_same_multipath(context):
    ifaddr = context.new_ipaddr
    gateway1 = context.new_ipaddr
    gateway2 = context.new_ipaddr
    ifname = context.new_ifname
    ipnet1 = str(context.ipnets[1].network)
    ipnet2 = str(context.ipnets[2].network)

    (context.ndb.interfaces.create(ifname=ifname, kind='dummy',
                                   state='up').add_ip({
                                       'address': ifaddr,
                                       'prefixlen': 24
                                   }).commit())

    # first route with these gateways
    (context.ndb.routes.create(
        dst=ipnet1,
        dst_len=24,
        multipath=[{
            'gateway': gateway1
        }, {
            'gateway': gateway2
        }],
    ).commit())

    # second route with these gateways
    (context.ndb.routes.create(
        dst=ipnet2,
        dst_len=24,
        multipath=[{
            'gateway': gateway1
        }, {
            'gateway': gateway2
        }],
    ).commit())

    def match_multipath(msg):
        if msg.get_attr('RTA_DST') != ipnet2:
            return False
        gws_match = set((gateway1, gateway2))
        mp = msg.get_attr('RTA_MULTIPATH')
        if mp is None:
            return False
        gws_msg = set([x.get_attr('RTA_GATEWAY') for x in mp])
        return gws_match == gws_msg

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, match=match_multipath)
Esempio n. 17
0
def test_multipath_ipv4(context):

    ifname = context.new_ifname
    ifaddr = context.new_ipaddr
    hop1 = context.new_ipaddr
    hop2 = context.new_ipaddr
    ipnet = str(context.ipnets[1].network)

    (context
     .ndb
     .interfaces
     .create(ifname=ifname, kind='dummy', state='up')
     .ipaddr
     .create(address=ifaddr, prefixlen=24)
     .commit())

    spec = {'dst_len': 24,
            'dst': ipnet,
            'multipath': [{'gateway': hop1},
                          {'gateway': hop2}]}

    if context.table:
        spec['table'] = context.table

    (context
     .ndb
     .routes
     .create(**spec)
     .commit())

    def match_multipath(msg):
        if msg.get_attr('RTA_DST') != ipnet:
            return False
        gws_match = set((hop1, hop2))
        mp = msg.get_attr('RTA_MULTIPATH')
        if mp is None:
            return False
        gws_msg = set([x.get_attr('RTA_GATEWAY') for x in mp])
        return gws_match == gws_msg

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, match=match_multipath)
Esempio n. 18
0
def test_bridge_deps(context):

    if_br0 = context.new_ifname
    if_br0p0 = context.new_ifname
    if_br0p1 = context.new_ifname
    ifaddr1 = context.new_ipaddr
    ifaddr2 = context.new_ipaddr
    router = context.new_ipaddr
    dst = str(context.ipnets[1].network)

    with context.ndb.interfaces as i:
        i.create(ifname=if_br0p0, kind='dummy', state='up').commit()
        i.create(ifname=if_br0p1, kind='dummy', state='up').commit()
        (i.create(ifname=if_br0, kind='bridge', state='up')
         .add_port(if_br0p0)
         .add_port(if_br0p1)
         .add_ip(address=ifaddr1, prefixlen=24)
         .add_ip(address=ifaddr2, prefixlen=24)
         .commit())

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

    assert interface_exists(context.netns, ifname=if_br0)
    assert interface_exists(context.netns, ifname=if_br0p0)
    assert interface_exists(context.netns, ifname=if_br0p1)
    assert address_exists(context.netns, ifname=if_br0, address=ifaddr1)
    assert address_exists(context.netns, ifname=if_br0, address=ifaddr2)
    assert route_exists(context.netns, gateway=router, dst=dst, dst_len=24)

    # remove the interface
    iface = context.ndb.interfaces[if_br0].remove().commit()

    assert not interface_exists(context.netns, ifname=if_br0)
    assert not address_exists(context.netns, ifname=if_br0, address=ifaddr1)
    assert not address_exists(context.netns, ifname=if_br0, address=ifaddr2)
    assert not route_exists(context.netns, gateway=router, dst=dst, dst_len=24)

    # revert the changes using the implicit last_save
    iface.rollback()
    assert interface_exists(context.netns, ifname=if_br0)
    assert interface_exists(context.netns, ifname=if_br0p0)
    assert interface_exists(context.netns, ifname=if_br0p1)
    assert address_exists(context.netns, ifname=if_br0, address=ifaddr1)
    assert address_exists(context.netns, ifname=if_br0, address=ifaddr2)
    assert route_exists(context.netns, gateway=router, dst=dst, dst_len=24)
Esempio n. 19
0
def test_del_ip_match(context):
    ifname = context.new_ifname
    ipaddr1 = context.new_ipaddr
    ipaddr2 = context.new_ipaddr
    ipaddr3 = context.new_ipaddr

    (context.ndb.interfaces.create(
        ifname=ifname, kind='dummy',
        state='up').add_ip(address=ipaddr1, prefixlen=24).add_ip(
            address=ipaddr2, prefixlen=24).add_ip(address=ipaddr3,
                                                  prefixlen=24).commit())

    assert address_exists(context.netns, ifname=ifname, address=ipaddr1)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr2)
    assert address_exists(context.netns, ifname=ifname, address=ipaddr3)

    (context.ndb.interfaces[ifname].del_ip(family=AF_INET).commit())

    assert not address_exists(context.netns, ifname=ifname, address=ipaddr1)
    assert not address_exists(context.netns, ifname=ifname, address=ipaddr2)
    assert not address_exists(context.netns, ifname=ifname, address=ipaddr3)