Skip to content

Abstraction layer to simplify programatic non-persistant network configuration for linux

License

Notifications You must be signed in to change notification settings

jinjamator/simplenetlink

Repository files navigation

Introduction

Simplenetlink is an abstraction layer to simplify programatic non-persistent network configuration for linux on top of pyroute2. It was written to have a simple interface for network test setups.

Features

Simplenetlink has following features:
  • create and manage linux namespaces
  • move interfaces between namespaces
  • create tagged vlan interfaces
  • create ipvlan interfaces
  • configure ipv4 addresses
  • idempotent

Installation

Install simplenetlink by running:

pip3 install simplenetlink

Examples

Create Tagged VLAN interface in namespace and set IPv4 configuration

from simplenetlink import SimpleNetlink
from pprint import pprint

ip = SimpleNetlink()

#create vlan interface in new or existing namespace test with ipv4 address and implicitly switch to namespace test
ip.ensure_interface_exists("vlan2", namespace='test', link_state='up', parent_interface='eth0', type='tagged', vlan_id='2', ipv4=['100.64.0.10/24'])

#show interfaces of namespace test
pprint(ip.get_network_interfaces_info())

#move tagged interface from namespace test to namespace test2 and implicitly switch to namespace test2
ip.ensure_interface_exists("vlan2", namespace='test2', link_state='up', parent_interface='eth0', type='tagged', vlan_id='2', ipv4=['100.64.0.10/24'])

#show interfaces of namespace test2
pprint(ip.get_network_interfaces_info())

# remove namespace test
ip.delete_namespace('test')

# remove namespace test2
ip.delete_namespace('test2')

Create IPVLAN interface in namespace and set IPv4 configuration

from simplenetlink import SimpleNetlink
from pprint import pprint

ip = SimpleNetlink()

#create ipvlan interface in new or existing namespace test with ipv4 address and implicitly switch to namespace test
ip.ensure_interface_exists("ipvlan_test", namespace='test', link_state='up', parent_interface='eth0', type='ipvlan',  ipv4=['100.64.0.11/24'])

#show interfaces of namespace test
pprint(ip.get_network_interfaces_info())

#move ipvlan interface from namespace test to namespace test2 and implicitly switch to namespace test2
ip.ensure_interface_exists("ipvlan_test", namespace='test2', link_state='up', parent_interface='eth0', type='ipvlan', ipv4=['100.64.0.11/24'])


#show interfaces of namespace test2
pprint(ip.get_network_interfaces_info())


# remove namespace test
ip.delete_namespace('test')

# remove namespace test2
ip.delete_namespace('test2')

Add route to namespace

from simplenetlink import SimpleNetlink

# switch to namespace test (will be created if not exists)
ip.set_current_namespace('test')


#create ipvlan interface in new or existing namespace test with ipv4 address and implicitly switch to namespace test
ip.ensure_interface_exists("ipvlan_test", namespace='test', link_state='up', parent_interface='eth0', type='ipvlan',  ipv4=['100.64.0.11/24'])

#add default route to current namespace which is test at the moment
ip.add_route('0.0.0.0/0','100.64.0.1')

#add route to current namespace which is test at the moment
ip.add_route('10.100.0.0/24','100.64.0.2')

# delete namespace test
ip.delete_namespace('test')

Configure multiple interfaces in multiple namespaces from a YAML description

from simplenetlink import SimpleNetlink
import yaml
from pprint import pprint

ip = SimpleNetlink()

yml="""
vl1_1:
    namespace: test
    link_state: up
    parent_interface: eth0
    type: ipvlan
    ipv4:
        - 100.64.0.11/24
vl1_2:
    namespace: test2
    link_state: up
    parent_interface: eth0
    type: ipvlan
    ipv4:
        - 100.64.0.12/24
vl2:
    namespace: test3
    link_state: up
    parent_interface: eth0
    type: tagged
    vlan_id: 2
    ipv4:
        - 100.64.1.11/24
vl2_2:
    namespace: test4
    link_state: up
    parent_interface: vl2
    type: ipvlan
    ipv4:
        - 100.64.1.12/24

"""

config=yaml.safe_load(yml)

# for k,v in config.items():
#     if v.get('namespace'):
#         ip.delete_namespace(v.get('namespace'))

for k,v in config.items():
    ip.ensure_interface_exists(k,**v)

ip.set_current_namespace('test')
ip.add_route('0.0.0.0/0','100.64.0.1')
ip.set_current_namespace('test2')
ip.add_route('0.0.0.0/0','100.64.0.1')
ip.set_current_namespace('test3')
ip.add_route('0.0.0.0/0','100.64.1.1')
ip.set_current_namespace('test4')
ip.add_route('0.0.0.0/0','100.64.1.1')

from pprint import pprint
for namespace in ip.get_namespaces():
    ip.set_current_namespace(namespace)
    pprint(ip.get_network_interfaces_info())

Contribute

Roadmap

Selected Roadmap items:
  • add support for more virtual interface types e.g.: macvlan, vxlan, bridges
  • add support for ipv6
  • add class documentation

For documentation please refer to https://simplenetlink.readthedocs.io/en/latest/

License

This project is licensed under the Apache License Version 2.0

About

Abstraction layer to simplify programatic non-persistant network configuration for linux

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages