diff options
Diffstat (limited to 'examples/docker/SRv6_5-node/start_demo.sh')
-rwxr-xr-x | examples/docker/SRv6_5-node/start_demo.sh | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/examples/docker/SRv6_5-node/start_demo.sh b/examples/docker/SRv6_5-node/start_demo.sh new file mode 100755 index 000000000..83bb66bc7 --- /dev/null +++ b/examples/docker/SRv6_5-node/start_demo.sh @@ -0,0 +1,222 @@ +#! /bin/bash + +source ../utils.sh + +if [[ $UID != 0 ]]; then + echo "Please run this script with sudo:" + echo "sudo $0 $*" + exit 1 +fi + +if [ -z "$1" ]; then + echo "Demo type argument missing!" + echo "Usage:" + echo -e "\n'$0 <demo_type>' to run this command!\n" + echo "<demo_type> - vpp or hc" + exit 2 +fi + +demo_type=$1 + +if [[ "$demo_type" != "vpp" && "$demo_type" != "hc" ]]; then + echo "Demo type argument is wrong!" + echo "<demo_type> - vpp or hc" + exit 3 +fi + +echo "Creating docker containers..." +create_container vppA hc2vpp:latest 0.75 +create_container vppB hc2vpp:latest 0.75 +create_container vppC hc2vpp:latest 0.75 +create_container vppD hc2vpp:latest 0.75 +create_container vppE hc2vpp:latest 0.75 + +echo "Starting docker containers..." +start_container vppA & +start_container vppB & +start_container vppC & +start_container vppD & +start_container vppE & +wait + +# Connect containers using veth interfaces +echo "Creating SRv6 5 node demo topology." +create_link vppA vethAB vethBA vppB +create_link vppA vethAC vethCA vppC +create_link vppB vethBD vethDB vppD +create_link vppB vethBE vethEB vppE +create_link vppC vethCD vethDC vppD +create_link vppD vethDE vethED vppE + +echo "Creating hostA and hostE namespaces." +sudo ip netns add VNET_A +sudo ip netns add VNET_E +create_link VNET_A vethA veth0 vppA +create_link VNET_E vethE veth0 vppE + +sudo ip netns exec VNET_A ip addr add A::1/64 dev vethA +sudo ip netns exec VNET_A ip route add E::/64 via A::A +sudo ip netns exec VNET_E ip addr add E::1/64 dev vethE +sudo ip netns exec VNET_E ip route add A::/64 via E::E + +echo "Starting VPPs in containers:" +start_vpp_in_container vppA & +start_vpp_in_container vppB & +start_vpp_in_container vppC & +start_vpp_in_container vppD & +start_vpp_in_container vppE & +wait + +echo "Configuring VPP interfaces and SRv6 routing:" +echo "vppA:" +#interface setup for A:: +sudo docker exec vppA vppctl create host-interface name veth0 +sudo docker exec vppA vppctl set interface state host-veth0 up +sudo docker exec vppA vppctl set interface ip address host-veth0 A::A/64 +sudo docker exec vppA vppctl create host-interface name vethAB hw-addr 00:00:00:00:ab:0a +sudo docker exec vppA vppctl set interface state host-vethAB up +sudo docker exec vppA vppctl set interface ip address host-vethAB AB::A/64 +sudo docker exec vppA vppctl create host-interface name vethAC hw-addr 00:00:00:00:ac:0a +sudo docker exec vppA vppctl set interface state host-vethAC up +sudo docker exec vppA vppctl set interface ip address host-vethAC AC::A/64 +#setup neighbors +sudo docker exec vppA vppctl set ip6 neighbor host-vethAC C::100 00:00:00:00:ac:0c +sudo docker exec vppA vppctl set ip6 neighbor host-vethAB B::100 00:00:00:00:ab:0b +sudo docker exec vppA vppctl ip route add C::100/128 via host-vethAC +sudo docker exec vppA vppctl ip route add B::100/128 via host-vethAB +#SR setup for A:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPA - Configuring SRv6 via VPP:" + sudo docker exec vppA vppctl sr localsid address A::201 behavior end.dx6 host-veth0 A::1 + sudo docker exec vppA vppctl set sr encaps source addr A::1 + sudo docker exec vppA vppctl sr policy add bsid A::E next C::100 next D::100 next E::201 encap + sudo docker exec vppA vppctl sr steer l3 E::/64 via bsid A::E +fi + +echo "vppB:" +#interface setup for B:: +sudo docker exec vppB vppctl create host-interface name vethBA hw-addr 00:00:00:00:ab:0b +sudo docker exec vppB vppctl set interface state host-vethBA up +sudo docker exec vppB vppctl set interface ip address host-vethBA AB::B/64 +sudo docker exec vppB vppctl create host-interface name vethBD hw-addr 00:00:00:00:bd:0b +sudo docker exec vppB vppctl set interface state host-vethBD up +sudo docker exec vppB vppctl set interface ip address host-vethBD BD::B/64 +sudo docker exec vppB vppctl create host-interface name vethBE hw-addr 00:00:00:00:be:0b +sudo docker exec vppB vppctl set interface state host-vethBE up +sudo docker exec vppB vppctl set interface ip address host-vethBE BE::E/64 +#setup neighbors +sudo docker exec vppB vppctl set ip6 neighbor host-vethBA A::201 00:00:00:00:ab:0a +sudo docker exec vppB vppctl set ip6 neighbor host-vethBD D::100 00:00:00:00:bd:0d +sudo docker exec vppB vppctl ip route add A::201/128 via host-vethBA +sudo docker exec vppB vppctl ip route add D::100/128 via host-vethBD +#SR setup for B:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPB - Configuring SRv6 via VPP:" + sudo docker exec vppB vppctl sr localsid address B::100 behavior end +fi + +echo "vppC:" +#interface setup for C:: +sudo docker exec vppC vppctl create host-interface name vethCA hw-addr 00:00:00:00:ac:0c +sudo docker exec vppC vppctl set interface state host-vethCA up +sudo docker exec vppC vppctl set interface ip address host-vethCA AC::C/64 +sudo docker exec vppC vppctl create host-interface name vethCD hw-addr 00:00:00:00:cd:0c +sudo docker exec vppC vppctl set interface state host-vethCD up +sudo docker exec vppC vppctl set interface ip address host-vethCD CD::C/64 +#setup neighbors +sudo docker exec vppC vppctl set ip6 neighbor host-vethCD D::100 00:00:00:00:cd:0d +sudo docker exec vppC vppctl set ip6 neighbor host-vethCA A::201 00:00:00:00:ac:0a +sudo docker exec vppC vppctl ip route add D::100/128 via host-vethCD +sudo docker exec vppC vppctl ip route add A::201/128 via host-vethCA +#SR setup for C:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPC - Configuring SRv6 via VPP:" + sudo docker exec vppC vppctl sr localsid address C::100 behavior end +fi + +echo "vppD:" +#interface setup for D:: +sudo docker exec vppD vppctl create host-interface name vethDB hw-addr 00:00:00:00:bd:0d +sudo docker exec vppD vppctl set interface state host-vethDB up +sudo docker exec vppD vppctl set interface ip address host-vethDB BD::D/64 +sudo docker exec vppD vppctl create host-interface name vethDC hw-addr 00:00:00:00:cd:0d +sudo docker exec vppD vppctl set interface state host-vethDC up +sudo docker exec vppD vppctl set interface ip address host-vethDC CD::D/64 +sudo docker exec vppD vppctl create host-interface name vethDE hw-addr 00:00:00:00:de:0d +sudo docker exec vppD vppctl set interface state host-vethDE up +sudo docker exec vppD vppctl set interface ip address host-vethDE DE::D/64 +#setup neighbors +sudo docker exec vppD vppctl set ip6 neighbor host-vethDE E::201 00:00:00:00:de:0e +sudo docker exec vppD vppctl set ip6 neighbor host-vethDB B::100 00:00:00:00:bd:0b +sudo docker exec vppD vppctl set ip6 neighbor host-vethDC C::100 00:00:00:00:cd:0c +sudo docker exec vppD vppctl ip route add E::201/128 via host-vethDE +sudo docker exec vppD vppctl ip route add B::100/128 via host-vethDB +sudo docker exec vppD vppctl ip route add C::100/128 via host-vethDC +#SR setup for D:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPD - Configuring SRv6 via VPP:" + sudo docker exec vppD vppctl sr localsid address D::100 behavior end +fi + +echo "vppE:" +#interface setup for E:: +sudo docker exec vppE vppctl create host-interface name veth0 +sudo docker exec vppE vppctl set interface state host-veth0 up +sudo docker exec vppE vppctl set interface ip address host-veth0 E::E/64 +sudo docker exec vppE vppctl create host-interface name vethEB hw-addr 00:00:00:00:be:0e +sudo docker exec vppE vppctl set interface state host-vethEB up +sudo docker exec vppE vppctl set interface ip address host-vethEB BE::E/64 +sudo docker exec vppE vppctl create host-interface name vethED hw-addr 00:00:00:00:de:0e +sudo docker exec vppE vppctl set interface state host-vethED up +sudo docker exec vppE vppctl set interface ip address host-vethED DE::E/64 +#setup neighbors +sudo docker exec vppE vppctl set ip6 neighbor host-vethEB B::100 00:00:00:00:be:0b +sudo docker exec vppE vppctl set ip6 neighbor host-vethED D::100 00:00:00:00:de:0d +sudo docker exec vppE vppctl ip route add D::100/128 via host-vethED +sudo docker exec vppE vppctl ip route add B::100/128 via host-vethEB +#SR setup for E:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPE - Configuring SRv6 via VPP:" + sudo docker exec vppE vppctl sr localsid address E::201 behavior end.dx6 host-veth0 E::1 + sudo docker exec vppE vppctl set sr encaps source addr E::1 + sudo docker exec vppE vppctl sr policy add bsid E::A next D::100 next B::100 next A::201 encap + sudo docker exec vppE vppctl sr steer l3 A::/64 via bsid E::A +fi + +if [[ "$demo_type" = "hc" ]]; then + hc_plugins=`sudo docker exec vppA dpkg -L honeycomb |grep "io/fd/hc2vpp/srv6"`; + + if [ -z "$hc_plugins" ]; then + echo "NO SRv6 plugins detected for Honeycomb in docker containers!!!" + echo "Ensure that you provided valid honeycomb version" + echo "Then recreate the docker image and restart demo." + exit 4 + fi + + echo "Configuring SRv6 via HC:" + echo "Starting Honeycomb in containers:" + start_hc_in_container vppA & + start_hc_in_container vppB & + start_hc_in_container vppC & + start_hc_in_container vppD & + start_hc_in_container vppE & + wait + + echo "Configuring Honeycomb in containers:" + hc_configurations/hc_vpp_a_rest_config.sh & + hc_configurations/hc_vpp_b_rest_config.sh & + hc_configurations/hc_vpp_c_rest_config.sh & + hc_configurations/hc_vpp_d_rest_config.sh & + hc_configurations/hc_vpp_e_rest_config.sh & + wait +fi + +echo "Demo started." + +echo "Ping hostA -> hostE, desired path: (A::201)->(C::100)->(D::100)->(E::201)" +echo "ip netns exec VNET_A ping6 e::1 -c 10 -i 0.25" +sudo ip netns exec VNET_A ping6 e::1 -c 10 -i 0.25 + +echo "Ping hostE -> hostA, desired path: (E::201)->(D::100)->(B::100)->(A::201)" +echo "ip netns exec VNET_E ping6 a::1 -c 10 -i 0.25" +sudo ip netns exec VNET_E ping6 a::1 -c 10 -i 0.25 |