Compare commits
5 Commits
b5e04e427f
...
ef79717ebe
Author | SHA1 | Date | |
---|---|---|---|
ef79717ebe | |||
1667677f72 | |||
f4f38646fd | |||
47eed50e30 | |||
e0f336df88 |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
clab-*
|
||||||
|
**/*.bak
|
18
README.md
18
README.md
@ -2,24 +2,24 @@
|
|||||||
|
|
||||||
This docker container creates a VPP instance based on the latest VPP release. It starts up as per
|
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
|
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
|
containers). Once started, it'll execute `/etc/vpp/bootstrap.vpp` within the dataplane. There are
|
||||||
three relevant files:
|
two relevant files:
|
||||||
|
|
||||||
1. `manual-pre.vpp` -- can be supplied by the user, to run any configuration statements before
|
1. `clab.vpp` -- generated by `files/init-container.sh`. Its purpose is to bind the `veth`
|
||||||
containerlab takes control.
|
|
||||||
|
|
||||||
1. `clab.vpp` -- generated by `files/container-init.sh`. Its purpose is to bind the `veth`
|
|
||||||
interfaces that containerlab has added to the container into the VPP dataplane (see below).
|
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.
|
||||||
|
|
||||||
1. `manual-post.vpp` -- can be supplied by the user, to run any configuration statements after
|
For Containerlab users who wish to have more control over their VPP bootstrap, it's possible to
|
||||||
containerlab is finished with its per-lab statements.
|
bind-mount `/etc/vpp/bootstrap.vpp`.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
IMG=git.ipng.ch/ipng/vpp-containerlab
|
IMG=git.ipng.ch/ipng/vpp-containerlab
|
||||||
TAG=latest
|
TAG=latest
|
||||||
docker build --no-cache -f Dockerfile.bookworm -t $IMG .
|
docker build --no-cache -f docker/Dockerfile.bookworm -t $IMG docker/
|
||||||
docker image tag $IMG $IMG:$TAG
|
docker image tag $IMG $IMG:$TAG
|
||||||
docker push $IMG
|
docker push $IMG
|
||||||
docker push $IMG:$TAG
|
docker push $IMG:$TAG
|
||||||
|
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; };
|
||||||
|
};
|
||||||
|
}
|
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: 9000
|
||||||
|
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; };
|
||||||
|
};
|
||||||
|
}
|
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: 9000
|
||||||
|
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 ]
|
@ -4,7 +4,8 @@ ARG VPP_INSTALL_SKIP_SYSCTL=true
|
|||||||
ARG REPO=release
|
ARG REPO=release
|
||||||
EXPOSE 22/tcp
|
EXPOSE 22/tcp
|
||||||
RUN apt-get update && apt-get -y install curl procps tcpdump iproute2 iptables \
|
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 && apt-get clean
|
iputils-ping net-tools git python3 python3-pip vim-tiny openssh-server bird2 \
|
||||||
|
mtr-tiny traceroute && apt-get clean
|
||||||
|
|
||||||
# Install VPP
|
# Install VPP
|
||||||
RUN mkdir -p /var/log/vpp /root/.ssh/
|
RUN mkdir -p /var/log/vpp /root/.ssh/
|
||||||
@ -17,7 +18,8 @@ RUN git clone https://github.com/pimvanpelt/vppcfg.git && cd vppcfg && python3 -
|
|||||||
pip install --break-system-packages dist/vppcfg-*-py3-none-any.whl
|
pip install --break-system-packages dist/vppcfg-*-py3-none-any.whl
|
||||||
|
|
||||||
# Config files
|
# Config files
|
||||||
COPY files/startup.conf files/*.vpp /etc/vpp/
|
COPY files/etc/vpp/* /etc/vpp/
|
||||||
|
COPY files/etc/bird/* /etc/bird/
|
||||||
COPY files/init-container.sh /sbin/
|
COPY files/init-container.sh /sbin/
|
||||||
RUN chmod 755 /sbin/init-container.sh
|
RUN chmod 755 /sbin/init-container.sh
|
||||||
CMD ["/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";
|
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 {
|
unix {
|
||||||
interactive
|
interactive
|
||||||
log /var/log/vpp/vpp.log
|
log /var/log/vpp/vpp.log
|
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
STARTUP_CONFIG=${STARTUP_CONFIG:="/etc/vpp/startup.conf"}
|
STARTUP_CONFIG=${STARTUP_CONFIG:="/etc/vpp/startup.conf"}
|
||||||
CLAB_VPP_FILE=${CLAB_VPP_FILE:=/etc/vpp/clab.vpp}
|
CLAB_VPP_FILE=${CLAB_VPP_FILE:=/etc/vpp/clab.vpp}
|
||||||
|
VPPCFG_VPP_FILE=${VPPCFG_VPP_FILE:=/etc/vpp/vppcfg.vpp}
|
||||||
NETNS=${NETNS:="dataplane"}
|
NETNS=${NETNS:="dataplane"}
|
||||||
|
BIRD_ENABLED=${BIRD_ENABLED:="true"}
|
||||||
|
|
||||||
echo "Creating dataplane namespace"
|
echo "Creating dataplane namespace"
|
||||||
/usr/bin/mkdir -p /etc/netns/$NETNS
|
/usr/bin/mkdir -p /etc/netns/$NETNS
|
||||||
@ -14,6 +16,15 @@ sed -i -e 's,^#PermitRootLogin prohibit-password,PermitRootLogin yes,' /etc/ssh/
|
|||||||
sed -i -e 's,^root:.*,root:$y$j9T$kG8pyZEVmwLXEtXekQCRK.$9iJxq/bEx5buni1hrC8VmvkDHRy7ZMsw9wYvwrzexID:20211::::::,' /etc/shadow
|
sed -i -e 's,^root:.*,root:$y$j9T$kG8pyZEVmwLXEtXekQCRK.$9iJxq/bEx5buni1hrC8VmvkDHRy7ZMsw9wYvwrzexID:20211::::::,' /etc/shadow
|
||||||
/etc/init.d/ssh start
|
/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
|
||||||
|
|
||||||
echo "Generating $CLAB_VPP_FILE"
|
echo "Generating $CLAB_VPP_FILE"
|
||||||
: > $CLAB_VPP_FILE
|
: > $CLAB_VPP_FILE
|
||||||
MTU=9216
|
MTU=9216
|
||||||
@ -30,5 +41,11 @@ set interface state $IFNAME up
|
|||||||
EOF
|
EOF
|
||||||
done
|
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"
|
echo "Starting VPP"
|
||||||
exec /usr/bin/vpp -c $STARTUP_CONFIG
|
exec /usr/bin/vpp -c $STARTUP_CONFIG
|
@ -1,3 +0,0 @@
|
|||||||
exec /etc/vpp/manual-pre.vpp
|
|
||||||
exec /etc/vpp/clab.vpp
|
|
||||||
exec /etc/vpp/manual-post.vpp
|
|
@ -1 +0,0 @@
|
|||||||
comment { These commands are executed after Containerlab stuff }
|
|
@ -1 +0,0 @@
|
|||||||
comment { These commands are executed before Containerlab stuff }
|
|
42
vpp.clab.yml
Normal file
42
vpp.clab.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
name: learn-vpp
|
||||||
|
prefix: ""
|
||||||
|
|
||||||
|
topology:
|
||||||
|
kinds:
|
||||||
|
fdio_vpp:
|
||||||
|
image: git.ipng.ch/ipng/vpp-containerlab:latest
|
||||||
|
linux:
|
||||||
|
image: alpine:latest
|
||||||
|
|
||||||
|
nodes:
|
||||||
|
vpp1:
|
||||||
|
kind: fdio_vpp
|
||||||
|
binds:
|
||||||
|
- config/vpp1/vppcfg.yaml:/etc/vpp/vppcfg.yaml:ro
|
||||||
|
- config/vpp1/bird-local.conf:/etc/bird/bird-local.conf:ro
|
||||||
|
vpp2:
|
||||||
|
kind: fdio_vpp
|
||||||
|
binds:
|
||||||
|
- config/vpp2/vppcfg.yaml:/etc/vpp/vppcfg.yaml:ro
|
||||||
|
- config/vpp2/bird-local.conf:/etc/bird/bird-local.conf:ro
|
||||||
|
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"]
|
Reference in New Issue
Block a user