Ejemplo 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)
Ejemplo n.º 2
0
def test_scopes(context):

    ipaddr = context.new_ipaddr
    ifname = context.new_ifname
    table = context.table
    dst = '172.24.200.142'

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

    spec = {
        'dst': dst,
        'oif': context.ndb.interfaces[ifname]['index'],
        'dst_len': 32,
        'scope': 253
    }

    if table:
        spec['table'] = table

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

    assert interface_exists(context.netns, ifname=ifname)
    assert route_exists(context.netns, **spec)

    (context.ndb.routes[spec].remove().commit())

    assert not route_exists(context.netns, **spec)
Ejemplo n.º 3
0
def test_update_set(context):
    ifaddr = context.new_ipaddr
    router1 = context.new_ipaddr
    router2 = 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,
            'gateway': router1}

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

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

    assert address_exists(context.netns, ifname=ifname, address=ifaddr)
    assert route_exists(context.netns, dst=network, gateway=router1)

    r.set('gateway', router2).commit()

    assert route_exists(context.netns, dst=network, gateway=router2)
Ejemplo n.º 4
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)
Ejemplo n.º 5
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)
Ejemplo n.º 6
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)
Ejemplo n.º 7
0
def test_routes_spec_dst_len(context):

    ipaddr = context.new_ipaddr
    gateway = context.new_ipaddr
    ifname = context.new_ifname
    ipnet = str(context.ipnets[1].network)
    table = 24000

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

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

    assert route_exists(context.netns, dst=ipnet, table=table)
    r1 = context.ndb.routes.get('%s/24' % ipnet)
    r2 = context.ndb.routes.get({'dst': '%s/24' % ipnet})
    r3 = context.ndb.routes.get({'dst': ipnet, 'dst_len': 24})
    r4 = context.ndb.routes['%s/24' % ipnet]
    r5 = context.ndb.routes[{'dst': '%s/24' % ipnet}]
    r6 = context.ndb.routes[{'dst': ipnet, 'dst_len': 24}]
    assert r1 == r2 == r3 == r4 == r5 == r6
Ejemplo n.º 8
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)
Ejemplo n.º 9
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)
Ejemplo n.º 10
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)
Ejemplo n.º 11
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)
Ejemplo n.º 12
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)
Ejemplo n.º 13
0
def test_spec(context):

    ipaddr = context.new_ipaddr
    router = context.new_ipaddr
    ifname = context.new_ifname
    net = str(context.ipnets[1].network)
    table = context.table or 24000

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

    (context.ndb.routes.create(table=table, dst='default',
                               gateway=router).commit())

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

    assert route_exists(context.netns, gateway=router, table=table)
    assert context.ndb.routes['default']  # !!! the system must have this
    assert context.ndb.routes[{'dst': 'default', 'table': table}]
    assert context.ndb.routes['%s/24' % net]
    assert context.ndb.routes[{'dst': net, 'dst_len': 24}]