Routes management

Simple routes

Ordinary routes management is really simple:

# create a route
ndb.routes.create(
    dst='10.0.0.0/24',
    gateway='192.168.122.1'
).commit()

# retrieve a route and change it
with ndb.routes['10.0.0.0/24'] as route:
    route.set(gateway='192.168.122.10')

# remove a route
with ndb.routes['10.0.0.0/24'] as route:
    route.remove()

Multiple routing tables

But Linux systems have more than one routing table:

>>> set((x.table for x in ndb.routes.summary()))
{101, 5001, 5002, 254, 255}

The main routing table is 254. All the routes people mostly work with are in that table. To address routes in other routing tables, you can use dict specs:

ndb.routes.create(
    dst='10.0.0.0/24',
    gateway='192.168.122.1',
    table=101
).commit()

with ndb.routes[{'table': 101, 'dst': '10.0.0.0/24'}] as route:
    route.set('gateway', '192.168.122.10')
    route.set('priority', 500)

with ndb.routes[{'table': 101, 'dst': '10.0.0.0/24'}] as route:
    route.remove()

Route metrics

route['metrics'] attribute provides a dictionary-like object that reflects route metrics like hop limit, mtu etc:

# set up all metrics from a dictionary
with ndb.routes['10.0.0.0/24'] as route:
    route.set('metrics', {'mtu': 1500, 'hoplimit': 20})

# fix individual metrics
with ndb.routes['10.0.0.0/24']['metrics'] as metrics:
    metrics.set('mtu', 1500)
    metrics.set('hoplimit', 20)

MPLS routes

See here: MPLS howto