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)
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)
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)
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)
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)
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 )
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)