Compare commits
27 Commits
f80bcaa570
...
main
Author | SHA1 | Date | |
---|---|---|---|
2b03aad9bc | |||
17c3977873 | |||
e5889b22e2 | |||
49b8df9709 | |||
dc1840a6ec | |||
7114b24331 | |||
4c640d7f10 | |||
b16599d267 | |||
88ee8a2ae8 | |||
647030927a | |||
659ae59a3b | |||
ef79717ebe | |||
1667677f72 | |||
f4f38646fd | |||
47eed50e30 | |||
e0f336df88 | |||
b5e04e427f | |||
3c64e1392e | |||
a52354d5b2 | |||
1b6e2c4726 | |||
49b5d58bd6 | |||
1c603ab583 | |||
07fc441234 | |||
e71451f1c5 | |||
234ff1d1d3 | |||
e8331cd3af | |||
ff50a5c29b |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
clab-*
|
||||
**/*.bak
|
@ -1,20 +0,0 @@
|
||||
FROM debian:bookworm
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG VPP_INSTALL_SKIP_SYSCTL=true
|
||||
ARG REPO=release
|
||||
RUN apt-get update
|
||||
RUN apt-get -y install curl procps tcpdump iproute2 iptables binutils \
|
||||
bridge-utils iputils-ping netcat-traditional net-tools nmap \
|
||||
python3 python3-dev python3-pip
|
||||
RUN mkdir -p /var/log/vpp
|
||||
RUN curl -s https://packagecloud.io/install/repositories/fdio/${REPO}/script.deb.sh | bash
|
||||
RUN apt-get update
|
||||
RUN apt-get -y install vpp vpp-plugin-core
|
||||
RUN apt-get -y clean
|
||||
COPY startup.conf /etc/vpp/startup.conf
|
||||
COPY bootstrap.vpp /etc/vpp/bootstrap.vpp
|
||||
COPY manual-pre.vpp /etc/vpp/manual-pre.vpp
|
||||
COPY clab.vpp /etc/vpp/clab.vpp
|
||||
COPY manual-post.vpp /etc/vpp/manual-post.vpp
|
||||
CMD ["/usr/bin/vpp","-c","/etc/vpp/startup.conf"]
|
||||
|
172
README.md
172
README.md
@ -1,50 +1,174 @@
|
||||
# VPP Containerlab Docker image
|
||||
|
||||
This docker container creates a VPP instance based on the latest release. It starts up as per
|
||||
normal, using /etc/vpp/startup.conf (which Containerlab will replace), and once started, it'll
|
||||
execute /etc/vpp/bootstrap.vpp within the dataplane. There are three relevant files:
|
||||
## User Documentation
|
||||
|
||||
1. `manual-pre.vpp` -- can be supplied by the user, to run any configuration statements before
|
||||
containerlab takes control.
|
||||
The file `vpp.clab.yml` contains an example topology existing of two VPP instances connected each to
|
||||
one Alpine linux container, in the following topology:
|
||||
|
||||
1. `clab.vpp` -- generated by containerlab. Its purpose is to bind the `vethpair` interfaces
|
||||
into theo dataplane (see below).
|
||||

|
||||
|
||||
1. `manual-post.vpp` -- can be supplied by the user, to run any configuration statements after
|
||||
containerlab is finished with its per-lab statements.
|
||||
This container ships with both Bird2 and FRRouting as controlplane agents.
|
||||
|
||||
## Building
|
||||
You can deploy:
|
||||
* Bird2: `containerlab deploy --topo vpp-bird.clab.yml`.
|
||||
* FRR: `containerlab deploy --topo vpp-frr.clab.yml`.
|
||||
|
||||
three relevant files for VPP are included in this repository:
|
||||
1. `config/vpp*/vppcfg.yaml` configures the dataplane interfaces, including a loopback address.
|
||||
1. `config/vpp*/bird-local.conf` configures the controlplane to enable BFD and OSPF.
|
||||
1. `config/vpp*/frr.conf` configures the controlplane to enable BFD and OSPF.
|
||||
|
||||
Once the lab comes up, you can SSH to the VPP containers (`vpp1` and `vpp2`) which will have your
|
||||
SSH keys installed (if available). Otherwise, you can log in as user `root` using password `vpp`.
|
||||
|
||||
VPP runs its own network namespace called `dataplane`, which is very similar to SR Linux default
|
||||
`network-instance`. You can join it to take a look:
|
||||
|
||||
```bash
|
||||
docker build -f Dockerfile.bookworm . -t pimvanpelt/vpp-containerlab
|
||||
pim@summer:~/src/vpp-containerlab$ ssh root@vpp1
|
||||
root@vpp1:~# nsenter --net=/var/run/netns/dataplane
|
||||
root@vpp1:~# ip -br a
|
||||
lo DOWN
|
||||
loop0 UP 10.82.98.0/32 2001:db8:8298::/128 fe80::dcad:ff:fe00:0/64
|
||||
eth1 UNKNOWN 10.82.98.65/28 2001:db8:8298:101::1/64 fe80::a8c1:abff:fe77:acb9/64
|
||||
eth2 UNKNOWN 10.82.98.16/31 2001:db8:8298:1::1/64 fe80::a8c1:abff:fef0:7125/64
|
||||
|
||||
root@vpp1:~# ping 10.82.98.1 ## The vpp2 IPv4 loopback address
|
||||
PING 10.82.98.1 (10.82.98.1) 56(84) bytes of data.
|
||||
64 bytes from 10.82.98.1: icmp_seq=1 ttl=64 time=9.53 ms
|
||||
64 bytes from 10.82.98.1: icmp_seq=2 ttl=64 time=15.9 ms
|
||||
^C
|
||||
--- 10.82.98.1 ping statistics ---
|
||||
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
|
||||
rtt min/avg/max/mdev = 9.530/12.735/15.941/3.205 ms
|
||||
```
|
||||
|
||||
## Starting the container
|
||||
The two clients are running a minimalistic Alpine Linux container, which doesn't ship with SSH by
|
||||
default. You can enter the containers as following:
|
||||
|
||||
```bash
|
||||
pim@summer:~/src/vpp-containerlab$ docker exec -it client1 sh
|
||||
/ # ip addr show dev eth1
|
||||
531235: eth1@if531234: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 9500 qdisc noqueue state UP
|
||||
link/ether 00:c1:ab:00:00:01 brd ff:ff:ff:ff:ff:ff
|
||||
inet 10.82.98.66/28 scope global eth1
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 2001:db8:8298:101::2/64 scope global
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::2c1:abff:fe00:1/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
/ # traceroute 10.82.98.82
|
||||
traceroute to 10.82.98.82 (10.82.98.82), 30 hops max, 46 byte packets
|
||||
1 10.82.98.65 (10.82.98.65) 5.906 ms 7.086 ms 7.868 ms
|
||||
2 10.82.98.17 (10.82.98.17) 24.007 ms 23.349 ms 15.933 ms
|
||||
3 10.82.98.82 (10.82.98.82) 39.978 ms 31.127 ms 31.854 ms
|
||||
|
||||
/ # traceroute 2001:db8:8298:102::2
|
||||
traceroute to 2001:db8:8298:102::2 (2001:db8:8298:102::2), 30 hops max, 72 byte packets
|
||||
1 2001:db8:8298:101::1 (2001:db8:8298:101::1) 0.701 ms 7.144 ms 7.900 ms
|
||||
2 2001:db8:8298:1::2 (2001:db8:8298:1::2) 23.909 ms 22.943 ms 23.893 ms
|
||||
3 2001:db8:8298:102::2 (2001:db8:8298:102::2) 31.964 ms 30.814 ms 32.000 ms
|
||||
```
|
||||
docker network create --driver=bridge network2 --subnet=172.19.1.0/24
|
||||
|
||||
From the vantage point of `client1`, the first hop represents the `vpp1` node, which forwards to
|
||||
`vpp2`, which finally forwards to `client2`.
|
||||
|
||||
## Developer Documentation
|
||||
|
||||
This docker container creates a VPP instance based on the latest VPP release. It starts up as per
|
||||
normal, using /etc/vpp/startup.conf (which Containerlab might replace when it starts its
|
||||
containers). Once started, it'll execute `/etc/vpp/bootstrap.vpp` within the dataplane. There are
|
||||
two relevant files:
|
||||
|
||||
1. `clab.vpp` -- generated by `files/init-container.sh`. Its purpose is to bind the `veth`
|
||||
interfaces that containerlab has added to the container into the VPP dataplane (see below).
|
||||
1. `vppcfg.vpp` -- generated by `files/init-container.sh`. Its purpose is to read the user
|
||||
specified `vppcfg.yaml` file and convert it into VPP CLI commands. If no YAML file is
|
||||
specified, or if it is not syntactically valid, an empty file is generated instead.
|
||||
|
||||
For Containerlab users who wish to have more control over their VPP bootstrap, it's possible to
|
||||
bind-mount `/etc/vpp/bootstrap.vpp`.
|
||||
|
||||
### Building
|
||||
|
||||
```bash
|
||||
IMG=git.ipng.ch/ipng/vpp-containerlab
|
||||
TAG=latest
|
||||
docker build --no-cache --build-arg REPO=release -f docker/Dockerfile -t $IMG docker/
|
||||
docker image tag $IMG $IMG:$TAG
|
||||
docker push $IMG
|
||||
docker push $IMG:$TAG
|
||||
```
|
||||
|
||||
### Testing standalone container
|
||||
|
||||
```bash
|
||||
docker network create --driver=bridge clab-network --subnet=192.0.2.0/24 \
|
||||
--ipv6 --subnet=2001:db8::/64
|
||||
docker rm clab-pim
|
||||
docker run --cap-add=NET_ADMIN --cap-add=SYS_NICE --cap-add=SYS_PTRACE \
|
||||
--device=/dev/net/tun:/dev/net/tun --device=/dev/vfio/vfio:/dev/vfio/vfio \
|
||||
--device=/dev/net/tun:/dev/net/tun \
|
||||
--device=/dev/vhost-net:/dev/vhost-net \
|
||||
--privileged=True --name clab-pim \
|
||||
docker.io/pimvanpelt/vpp-containerlab
|
||||
docker network connect network2 clab-pim
|
||||
--privileged --name clab-pim \
|
||||
git.ipng.ch/ipng/vpp-containerlab:latest
|
||||
docker network connect clab-network clab-pim
|
||||
```
|
||||
|
||||
## Configuring VPP
|
||||
#### A note on DPDK
|
||||
|
||||
DPDK will be disabled by default as it requires hugepages and VFIO and/or UIO to use physical
|
||||
network cards. If DPDK at some future point is desired, mapping VFIO can be done by adding this:
|
||||
```
|
||||
--device=/dev/vfio/vfio:/dev/vfio/vfio
|
||||
```
|
||||
|
||||
or in Containerlab, using the `devices` feature:
|
||||
|
||||
```yaml
|
||||
my-node:
|
||||
image: git.ipng.ch/ipng/vpp-containerlab:latest
|
||||
kind: fdio_vpp
|
||||
devices:
|
||||
- /dev/vfio/vfio
|
||||
- /dev/net/tun
|
||||
- /dev/vhost-net
|
||||
```
|
||||
|
||||
If using DPDK in a container, one of the userspace IO kernel drivers must be loaded in the host
|
||||
kernel. Options are `igb_uio`, `vfio_pci`, or `uio_pci_generic`:
|
||||
|
||||
```bash
|
||||
$ sudo modprobe igb_uio
|
||||
$ sudo modprobe vfio_pci
|
||||
$ sudo modprobe uio_pci_generic
|
||||
```
|
||||
|
||||
Particularly the VFIO driver needs to be present before one can attempt to bindmount
|
||||
`/dev/vfio/vfio` into the container!
|
||||
|
||||
### Configuring VPP
|
||||
|
||||
When Containerlab starts the docker containers, it'll offer one or more `veth` point to point
|
||||
network links, which will show up as `eth1` and further. `eth0` is the default NIC that belongs to
|
||||
the management plane in Containerlab (the one which you'll see with `containerlab inspect`). Before
|
||||
VPP can use these `veth` interfaces, it needs to bind them, like so:
|
||||
|
||||
```bash
|
||||
docker exec -it clab-pim vppctl
|
||||
```
|
||||
|
||||
and then within the VPP control shell:
|
||||
|
||||
```
|
||||
vpp-clab# create host-interface v2 name eth1
|
||||
vpp-clab# set interface name host-eth1 eth1
|
||||
vpp-clab# set interface mtu 1500 eth1
|
||||
vpp-clab# set interface ip address eth1 172.19.1.2/24
|
||||
vpp-clab# set interface ip address eth1 fec0::2/64
|
||||
vpp-clab# set interface state eth1 up
|
||||
create host-interface v2 name eth1
|
||||
set interface name host-eth1 eth1
|
||||
set interface mtu 1500 eth1
|
||||
set interface ip address eth1 192.0.2.2/24
|
||||
set interface ip address eth1 2001:db8::2/64
|
||||
set interface state eth1 up
|
||||
```
|
||||
|
||||
Containerlab will attach these `veth` pairs to the container, and replace our Docker CMD with one
|
||||
that waits for all of these interfaces to be added (typically called `if-wait.sh`). In our own CMD,
|
||||
we then generate a config file called `/etc/vpp/clab.vpp` which contains the necessary VPP commands
|
||||
to take control over these `veth` pairs.
|
||||
|
@ -1,3 +0,0 @@
|
||||
exec /etc/vpp/manual-pre.vpp
|
||||
exec /etc/vpp/clab.vpp
|
||||
exec /etc/vpp/manual-post.vpp
|
2
config/lab-frr.env
Normal file
2
config/lab-frr.env
Normal file
@ -0,0 +1,2 @@
|
||||
BIRD_ENABLED=false
|
||||
FRR_ENABLED=true
|
19
config/vpp1/bird-local.conf
Normal file
19
config/vpp1/bird-local.conf
Normal file
@ -0,0 +1,19 @@
|
||||
protocol bfd bfd1 {
|
||||
interface "eth2" { interval 100 ms; multiplier 30; };
|
||||
}
|
||||
|
||||
protocol ospf v2 ospf4 {
|
||||
ipv4 { import all; export all; };
|
||||
area 0 {
|
||||
interface "loop0" { stub yes; };
|
||||
interface "eth2" { type pointopoint; cost 10; bfd on; };
|
||||
};
|
||||
}
|
||||
|
||||
protocol ospf v3 ospf6 {
|
||||
ipv6 { import all; export all; };
|
||||
area 0 {
|
||||
interface "loop0" { stub yes; };
|
||||
interface "eth2" { type pointopoint; cost 10; bfd on; };
|
||||
};
|
||||
}
|
34
config/vpp1/frr.conf
Normal file
34
config/vpp1/frr.conf
Normal file
@ -0,0 +1,34 @@
|
||||
frr version 10.3
|
||||
frr defaults traditional
|
||||
hostname vpp1
|
||||
log syslog informational
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
ip router-id 10.82.98.0
|
||||
!
|
||||
interface eth2
|
||||
ip ospf bfd
|
||||
ip ospf cost 10
|
||||
ip ospf network point-to-point
|
||||
ipv6 ospf6 area 0
|
||||
ipv6 ospf6 bfd
|
||||
ipv6 ospf6 cost 10
|
||||
ipv6 ospf6 network point-to-point
|
||||
exit
|
||||
!
|
||||
interface loop0
|
||||
ip ospf passive
|
||||
exit
|
||||
!
|
||||
router ospf
|
||||
redistribute connected
|
||||
network 10.82.98.0/24 area 0
|
||||
exit
|
||||
!
|
||||
router ospf6
|
||||
redistribute connected
|
||||
exit
|
||||
!
|
||||
bfd
|
||||
exit
|
||||
!
|
16
config/vpp1/vppcfg.yaml
Normal file
16
config/vpp1/vppcfg.yaml
Normal file
@ -0,0 +1,16 @@
|
||||
interfaces:
|
||||
eth1:
|
||||
description: 'To client1'
|
||||
mtu: 1500
|
||||
lcp: eth1
|
||||
addresses: [ 10.82.98.65/28, 2001:db8:8298:101::1/64 ]
|
||||
eth2:
|
||||
description: 'To vpp2'
|
||||
mtu: 9216
|
||||
lcp: eth2
|
||||
addresses: [ 10.82.98.16/31, 2001:db8:8298:1::1/64 ]
|
||||
loopbacks:
|
||||
loop0:
|
||||
description: 'vpp1'
|
||||
lcp: loop0
|
||||
addresses: [ 10.82.98.0/32, 2001:db8:8298::/128 ]
|
19
config/vpp2/bird-local.conf
Normal file
19
config/vpp2/bird-local.conf
Normal file
@ -0,0 +1,19 @@
|
||||
protocol bfd bfd1 {
|
||||
interface "eth2" { interval 100 ms; multiplier 30; };
|
||||
}
|
||||
|
||||
protocol ospf v2 ospf4 {
|
||||
ipv4 { import all; export all; };
|
||||
area 0 {
|
||||
interface "loop0" { stub yes; };
|
||||
interface "eth2" { type pointopoint; cost 10; bfd on; };
|
||||
};
|
||||
}
|
||||
|
||||
protocol ospf v3 ospf6 {
|
||||
ipv6 { import all; export all; };
|
||||
area 0 {
|
||||
interface "loop0" { stub yes; };
|
||||
interface "eth2" { type pointopoint; cost 10; bfd on; };
|
||||
};
|
||||
}
|
31
config/vpp2/frr.conf
Normal file
31
config/vpp2/frr.conf
Normal file
@ -0,0 +1,31 @@
|
||||
frr version 10.3
|
||||
frr defaults traditional
|
||||
hostname vpp2
|
||||
log syslog informational
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
ip router-id 10.82.98.1
|
||||
!
|
||||
interface eth2
|
||||
ip ospf bfd
|
||||
ip ospf cost 10
|
||||
ip ospf network point-to-point
|
||||
ipv6 ospf6 area 0
|
||||
ipv6 ospf6 bfd
|
||||
ipv6 ospf6 cost 10
|
||||
ipv6 ospf6 network point-to-point
|
||||
exit
|
||||
!
|
||||
interface loop0
|
||||
ip ospf passive
|
||||
exit
|
||||
!
|
||||
router ospf
|
||||
redistribute connected
|
||||
network 10.82.98.0/24 area 0
|
||||
exit
|
||||
!
|
||||
router ospf6
|
||||
redistribute connected
|
||||
exit
|
||||
!
|
16
config/vpp2/vppcfg.yaml
Normal file
16
config/vpp2/vppcfg.yaml
Normal file
@ -0,0 +1,16 @@
|
||||
interfaces:
|
||||
eth1:
|
||||
description: 'To client2'
|
||||
mtu: 1500
|
||||
lcp: eth1
|
||||
addresses: [ 10.82.98.81/28, 2001:db8:8298:102::1/64 ]
|
||||
eth2:
|
||||
description: 'To vpp1'
|
||||
mtu: 9216
|
||||
lcp: eth2
|
||||
addresses: [ 10.82.98.17/31, 2001:db8:8298:1::2/64 ]
|
||||
loopbacks:
|
||||
loop0:
|
||||
description: 'vpp2'
|
||||
lcp: loop0
|
||||
addresses: [ 10.82.98.1/32, 2001:db8:8298::1/128 ]
|
30
docker/Dockerfile
Normal file
30
docker/Dockerfile
Normal file
@ -0,0 +1,30 @@
|
||||
FROM ubuntu:noble
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG VPP_INSTALL_SKIP_SYSCTL=true
|
||||
ARG REPO=release
|
||||
EXPOSE 22/tcp
|
||||
RUN apt-get update && apt-get -y install curl procps tcpdump iproute2 iptables \
|
||||
iputils-ping net-tools git python3 python3-pip vim-tiny openssh-server bird2 \
|
||||
mtr-tiny traceroute && apt-get clean
|
||||
|
||||
# Install VPP
|
||||
RUN mkdir -p /var/log/vpp /root/.ssh/ && \
|
||||
curl -s https://packagecloud.io/install/repositories/fdio/${REPO}/script.deb.sh | bash && \
|
||||
apt-get -y install vpp vpp-plugin-core && apt-get clean
|
||||
|
||||
# Build vppcfg
|
||||
RUN pip install --break-system-packages build netaddr yamale argparse pyyaml ipaddress && \
|
||||
git clone https://git.ipng.ch/ipng/vppcfg.git && cd vppcfg && python3 -m build && \
|
||||
pip install --break-system-packages dist/vppcfg-*-py3-none-any.whl
|
||||
|
||||
# Install FRR
|
||||
RUN curl -s -o /usr/share/keyrings/frrouting.gpg https://deb.frrouting.org/frr/keys.gpg && \
|
||||
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr bookworm frr-stable \
|
||||
> /etc/apt/sources.list.d/frr.list && \
|
||||
apt -y update && apt -y install frr frr-pythontools && apt clean
|
||||
|
||||
# Config files
|
||||
COPY files/etc/ /etc/
|
||||
COPY files/init-container.sh /sbin/
|
||||
RUN chmod 755 /sbin/init-container.sh
|
||||
CMD ["/sbin/init-container.sh"]
|
1
docker/files/etc/bird/bird-local.conf
Normal file
1
docker/files/etc/bird/bird-local.conf
Normal file
@ -0,0 +1 @@
|
||||
# Containerlab user overrides go in this file.
|
26
docker/files/etc/bird/bird.conf
Normal file
26
docker/files/etc/bird/bird.conf
Normal file
@ -0,0 +1,26 @@
|
||||
# Bird2 configuration for VPP Containerlab
|
||||
|
||||
# router id 192.0.2.0;
|
||||
|
||||
timeformat base iso long;
|
||||
timeformat log iso long;
|
||||
timeformat protocol iso long;
|
||||
timeformat route iso long;
|
||||
|
||||
log "/var/log/bird/bird.log" { debug, trace, info, remote, warning, error, auth, fatal, bug };
|
||||
|
||||
protocol device { scan time 30; }
|
||||
|
||||
protocol direct { ipv4; ipv6; check link yes; }
|
||||
|
||||
protocol kernel kernel4 {
|
||||
ipv4 { import none; export where source != RTS_DEVICE; };
|
||||
learn off; scan time 300;
|
||||
}
|
||||
|
||||
protocol kernel kernel6 {
|
||||
ipv6 { import none; export where source != RTS_DEVICE; };
|
||||
learn off; scan time 300;
|
||||
}
|
||||
|
||||
include "bird-local.conf";
|
17
docker/files/etc/frr/daemons
Normal file
17
docker/files/etc/frr/daemons
Normal file
@ -0,0 +1,17 @@
|
||||
# These are the daemons that FRR will use for VPP Containerlab
|
||||
# NOTE: we need to run in the 'dataplane' network namespace, and use the `dplane_fpm_nl` plugin
|
||||
bgpd=yes
|
||||
ospfd=yes
|
||||
ospf6d=yes
|
||||
bfdd=yes
|
||||
ldpd=yes
|
||||
|
||||
vtysh_enable=yes
|
||||
watchfrr_options="--netns=dataplane"
|
||||
zebra_options=" -A 127.0.0.1 -s 67108864 -M dplane_fpm_nl"
|
||||
bgpd_options=" -A 127.0.0.1"
|
||||
ospfd_options=" -A 127.0.0.1"
|
||||
ospf6d_options=" -A ::1"
|
||||
staticd_options="-A 127.0.0.1"
|
||||
bfdd_options=" -A 127.0.0.1"
|
||||
ldpd_options=" -A 127.0.0.1"
|
10
docker/files/etc/frr/frr.conf
Normal file
10
docker/files/etc/frr/frr.conf
Normal file
@ -0,0 +1,10 @@
|
||||
# This is the VPP Containerlab default FRR configuration.
|
||||
|
||||
frr defaults traditional
|
||||
log syslog informational
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
ip router-id 192.0.2.1
|
||||
!
|
2
docker/files/etc/vpp/bootstrap.vpp
Normal file
2
docker/files/etc/vpp/bootstrap.vpp
Normal file
@ -0,0 +1,2 @@
|
||||
exec /etc/vpp/clab.vpp
|
||||
exec /etc/vpp/vppcfg.vpp
|
@ -1,3 +1,6 @@
|
||||
# This is the vpp-containerlab default startup.conf, which is meant to be
|
||||
# overridden by Containerlab's node/fdio_vpp/vpp_startup_config.go.tpl
|
||||
|
||||
unix {
|
||||
interactive
|
||||
log /var/log/vpp/vpp.log
|
||||
@ -37,3 +40,11 @@ plugins {
|
||||
plugin linux_nl_plugin.so { enable }
|
||||
plugin sflow_plugin.so { enable }
|
||||
}
|
||||
|
||||
linux-cp {
|
||||
default netns dataplane
|
||||
lcp-sync
|
||||
lcp-auto-subint
|
||||
del-static-on-link-down
|
||||
del-dynamic-on-link-down
|
||||
}
|
59
docker/files/init-container.sh
Executable file
59
docker/files/init-container.sh
Executable file
@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
STARTUP_CONFIG=${STARTUP_CONFIG:="/etc/vpp/startup.conf"}
|
||||
CLAB_VPP_FILE=${CLAB_VPP_FILE:=/etc/vpp/clab.vpp}
|
||||
VPPCFG_VPP_FILE=${VPPCFG_VPP_FILE:=/etc/vpp/vppcfg.vpp}
|
||||
NETNS=${NETNS:="dataplane"}
|
||||
BIRD_ENABLED=${BIRD_ENABLED:="true"}
|
||||
FRR_ENABLED=${FRR_ENABLED:="false"}
|
||||
|
||||
echo "Creating dataplane namespace"
|
||||
/usr/bin/mkdir -p /etc/netns/$NETNS
|
||||
/usr/bin/touch /etc/netns/$NETNS/resolv.conf
|
||||
/usr/sbin/ip netns add $NETNS
|
||||
|
||||
echo "Starting SSH, with credentials root:vpp"
|
||||
sed -i -e 's,^#PermitRootLogin prohibit-password,PermitRootLogin yes,' /etc/ssh/sshd_config
|
||||
sed -i -e 's,^root:.*,root:$y$j9T$kG8pyZEVmwLXEtXekQCRK.$9iJxq/bEx5buni1hrC8VmvkDHRy7ZMsw9wYvwrzexID:20211::::::,' /etc/shadow
|
||||
/etc/init.d/ssh start
|
||||
|
||||
if [ "$BIRD_ENABLED" == "true" ]; then
|
||||
echo "Starting Bird in $NETNS"
|
||||
mkdir -p /run/bird /var/log/bird
|
||||
chown bird:bird /var/log/bird
|
||||
ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/)
|
||||
sed -i -e "s,.*router id .*,router id $ROUTERID; # Set by container-init.sh," /etc/bird/bird.conf
|
||||
/usr/bin/nsenter --net=/var/run/netns/$NETNS /usr/sbin/bird -u bird -g bird
|
||||
fi
|
||||
|
||||
if [ "$FRR_ENABLED" == "true" ]; then
|
||||
echo "Starting FRRouting in $NETNS"
|
||||
ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/)
|
||||
sed -i -e "s,^ip router-id .*,ip router-id $ROUTERID," /etc/frr/frr.conf
|
||||
/etc/init.d/frr start
|
||||
fi
|
||||
|
||||
echo "Generating $CLAB_VPP_FILE"
|
||||
: > $CLAB_VPP_FILE
|
||||
MTU=9216
|
||||
for IFNAME in $(ip -br link show type veth | cut -f1 -d@ | grep -v '^eth0$' | sort); do
|
||||
MAC=$(ip -br link show dev $IFNAME | awk '{ print $3 }')
|
||||
echo " * $IFNAME hw-addr $MAC mtu $MTU"
|
||||
ip link set $IFNAME up mtu $MTU
|
||||
cat << EOF >> $CLAB_VPP_FILE
|
||||
create host-interface name $IFNAME hw-addr $MAC
|
||||
set interface name host-$IFNAME $IFNAME
|
||||
set interface mtu $MTU $IFNAME
|
||||
set interface state $IFNAME up
|
||||
|
||||
EOF
|
||||
done
|
||||
|
||||
echo "Generating $VPPCFG_VPP_FILE"
|
||||
: > $VPPCFG_VPP_FILE
|
||||
if [ -r /etc/vpp/vppcfg.yaml ]; then
|
||||
vppcfg plan --novpp -c /etc/vpp/vppcfg.yaml -o $VPPCFG_VPP_FILE
|
||||
fi
|
||||
|
||||
echo "Starting VPP"
|
||||
exec /usr/bin/vpp -c $STARTUP_CONFIG
|
BIN
learn-vpp.png
Normal file
BIN
learn-vpp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
@ -1 +0,0 @@
|
||||
comment { These commands are executed after Containerlab stuff }
|
@ -1 +0,0 @@
|
||||
comment { These commands are executed before Containerlab stuff }
|
39
vpp-bird.clab.yml
Normal file
39
vpp-bird.clab.yml
Normal file
@ -0,0 +1,39 @@
|
||||
name: learn-vpp
|
||||
prefix: ""
|
||||
|
||||
topology:
|
||||
kinds:
|
||||
fdio_vpp:
|
||||
image: git.ipng.ch/ipng/vpp-containerlab:latest
|
||||
startup-config: config/__clabNodeName__/vppcfg.yaml
|
||||
binds:
|
||||
- config/__clabNodeName__/bird-local.conf:/etc/bird/bird-local.conf:ro
|
||||
linux:
|
||||
image: alpine:latest
|
||||
|
||||
nodes:
|
||||
vpp1:
|
||||
kind: fdio_vpp
|
||||
vpp2:
|
||||
kind: fdio_vpp
|
||||
client1:
|
||||
kind: linux
|
||||
exec:
|
||||
- ip link set address 00:c1:ab:00:00:01 dev eth1
|
||||
- ip addr add 10.82.98.66/28 dev eth1
|
||||
- ip route add 10.82.98.0/24 via 10.82.98.65
|
||||
- ip addr add 2001:db8:8298:101::2/64 dev eth1
|
||||
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:101::1
|
||||
client2:
|
||||
kind: linux
|
||||
exec:
|
||||
- ip link set address 00:c1:ab:00:00:02 dev eth1
|
||||
- ip addr add 10.82.98.82/28 dev eth1
|
||||
- ip route add 10.82.98.0/24 via 10.82.98.81
|
||||
- ip addr add 2001:db8:8298:102::2/64 dev eth1
|
||||
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:102::1
|
||||
|
||||
links:
|
||||
- endpoints: ["vpp1:eth2", "vpp2:eth2"]
|
||||
- endpoints: ["client1:eth1", "vpp1:eth1"]
|
||||
- endpoints: ["client2:eth1", "vpp2:eth1"]
|
41
vpp-frr.clab.yml
Normal file
41
vpp-frr.clab.yml
Normal file
@ -0,0 +1,41 @@
|
||||
name: learn-vpp
|
||||
prefix: ""
|
||||
|
||||
topology:
|
||||
kinds:
|
||||
fdio_vpp:
|
||||
image: git.ipng.ch/ipng/vpp-containerlab:latest
|
||||
startup-config: config/__clabNodeName__/vppcfg.yaml
|
||||
binds:
|
||||
- config/__clabNodeName__/frr.conf:/etc/frr/frr.conf
|
||||
env-files:
|
||||
- config/lab-frr.env
|
||||
linux:
|
||||
image: alpine:latest
|
||||
|
||||
nodes:
|
||||
vpp1:
|
||||
kind: fdio_vpp
|
||||
vpp2:
|
||||
kind: fdio_vpp
|
||||
client1:
|
||||
kind: linux
|
||||
exec:
|
||||
- ip link set address 00:c1:ab:00:00:01 dev eth1
|
||||
- ip addr add 10.82.98.66/28 dev eth1
|
||||
- ip route add 10.82.98.0/24 via 10.82.98.65
|
||||
- ip addr add 2001:db8:8298:101::2/64 dev eth1
|
||||
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:101::1
|
||||
client2:
|
||||
kind: linux
|
||||
exec:
|
||||
- ip link set address 00:c1:ab:00:00:02 dev eth1
|
||||
- ip addr add 10.82.98.82/28 dev eth1
|
||||
- ip route add 10.82.98.0/24 via 10.82.98.81
|
||||
- ip addr add 2001:db8:8298:102::2/64 dev eth1
|
||||
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:102::1
|
||||
|
||||
links:
|
||||
- endpoints: ["vpp1:eth2", "vpp2:eth2"]
|
||||
- endpoints: ["client1:eth1", "vpp1:eth1"]
|
||||
- endpoints: ["client2:eth1", "vpp2:eth1"]
|
1
vpp.clab.yml
Symbolic link
1
vpp.clab.yml
Symbolic link
@ -0,0 +1 @@
|
||||
vpp-bird.clab.yml
|
Reference in New Issue
Block a user