Skip to content

Commit

Permalink
[dpapp] add data plane app target (#607)
Browse files Browse the repository at this point in the history
Following dpapp HLD - #606, this is the 1st part implementation to add dpapp target in Makefile, which is implemented as a vpp plugin.
  • Loading branch information
jimmyzhai authored Aug 29, 2024
1 parent 932720b commit a638ad3
Show file tree
Hide file tree
Showing 4 changed files with 209 additions and 2 deletions.
106 changes: 104 additions & 2 deletions dash-pipeline/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
SHELL = /bin/bash

HAVE_DPAPP ?=
ifeq ($(HAVE_DPAPP),y)
DPAPP_LINK = veth4
DPAPP_LINK_PEER = veth5
SWITCH_PORT_DPAPP = --interface 2@$(DPAPP_LINK)
endif

mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
mkfile_dir := $(dir $(mkfile_path))

Expand Down Expand Up @@ -64,6 +71,10 @@ include dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env
# SAIChallenger Client image built locally with saithrift client libs + PTF & Pytest frameworks
DOCKER_SAI_CHALLENGER_CLIENT_IMG ?= local/dash-saichallenger-client:latest

# Run/compile dpapp
# include file defines DOCKER_DPAPP_IMG
include dockerfiles/DOCKER_DPAPP_IMG.env

# Set differently in CI scripts as needed, e.g. run switch container in -d mode
DOCKER_FLAGS ?=-it

Expand Down Expand Up @@ -251,6 +262,53 @@ run-saithrift-bldr-bash:
$(DOCKER_RUN_SAITHRIFT_BLDR) \
/bin/bash

######################################
# bmv2 date-plane app TARGETS
######################################
DOCKER_RUN_DPAPP = docker run\
$(DOCKER_FLAGS) \
-v $(PWD)/bmv2:/bmv2 \
-v $(PWD)/$(P4_OUTDIR)/dash_pipeline.json:/etc/dash/dash_pipeline.json \
-v $(PWD)/$(P4_OUTDIR)/dash_pipeline_p4rt.txt:/etc/dash/dash_pipeline_p4rt.txt \
-v $(PWD)/SAI:/SAI \
-v $(PWD)/tests:/tests \
-v $(PWD)/../:/dash \
--network=host \
-u $(HOST_USER):$(HOST_GROUP) \
--rm \

.PHONY:dpapp dpapp-clean
dpapp-clean:
$(DOCKER_RUN_DPAPP) \
--name dash-dpapp-$(USER) \
-w /dash/dash-pipeline/dpapp $(DOCKER_DPAPP_IMG) \
make clean

dpapp:
@echo "Compile dpapp for date-plane app ..."
$(DOCKER_RUN_DPAPP) \
--name dash-dpapp-$(USER) \
-w /dash/dash-pipeline/dpapp $(DOCKER_DPAPP_IMG) \
make

run-dpapp-bash:
$(DOCKER_RUN_DPAPP) \
--privileged \
--name dash-dpapp-$(USER) \
-w /dash/dash-pipeline/dpapp $(DOCKER_DPAPP_IMG) \
/bin/bash

run-dpapp: $(DPAPP_LINK)
$(DOCKER_RUN_DPAPP) \
--privileged \
-u root \
--name dash-dpapp-$(USER) \
-w /dash/dash-pipeline/dpapp $(DOCKER_DPAPP_IMG) \
env HOST_INTERFACE=$(DPAPP_LINK_PEER) ./dpapp.sh startup.conf

kill-dpapp:
-docker kill dash-dpapp-$(USER)

######################################
# P4 Behavioral-model (switch) TARGETS
######################################
Expand All @@ -267,6 +325,7 @@ run-switch: network
simple_switch_grpc \
--interface 0@veth0 \
--interface 1@veth2 \
$(SWITCH_PORT_DPAPP) \
--log-console \
--no-p4

Expand Down Expand Up @@ -621,11 +680,40 @@ docker-publish-dash-grpc:
docker push $(DOCKER_GRPC_IMG)
[ -n $(DOCKER_GRPC_IMG_CTAG) ] && docker push $(DOCKER_GRPC_IMG_NAME):$(DOCKER_GRPC_IMG_CTAG)

###############################

DOCKER_DPAPP_IMG_TAG = $(shell cat dockerfiles/Dockerfile.dpapp | $(SHA1SUM))
DOCKER_DPAPP_IMG = $(DOCKER_DPAPP_IMG_NAME):$(DOCKER_DPAPP_IMG_TAG)

docker-dash-dpapp:
{ [ x$(ENABLE_DOCKER_PULL) == xy ] && docker pull $(DOCKER_DPAPP_IMG); } || \
docker build \
-f dockerfiles/Dockerfile.dpapp \
-t $(DOCKER_DPAPP_IMG) \
--build-arg user=$(DASH_USER) \
--build-arg group=$(DASH_GROUP) \
--build-arg uid=$(DASH_UID) \
--build-arg guid=$(DASH_GUID) \
--build-arg hostname=$(DASH_HOST) \
--build-arg available_processors=$(shell nproc) \
dockerfiles
[ -n $(DOCKER_DPAPP_IMG_CTAG) ] && \
docker tag $(DOCKER_DPAPP_IMG) $(DOCKER_DPAPP_IMG_NAME):$(DOCKER_DPAPP_IMG_CTAG)

docker-pull-dash-dpapp:
docker pull $(DOCKER_DPAPP_IMG)

docker-publish-dash-dpapp:
@echo "Publish $(DOCKER_DPAPP_IMG) - requires credentials, can only do from DASH repo, not a fork"
docker push $(DOCKER_DPAPP_IMG)
[ -n $(DOCKER_DPAPP_IMG_CTAG) ] && \
docker push $(DOCKER_DPAPP_IMG_NAME):$(DOCKER_DPAPP_IMG_CTAG)

###############################
# BMV2-PKTGEN NETWORKING TARGETS
###############################

network:veth0 veth2 disable-ipv6
network:veth0 veth2 $(DPAPP_LINK) disable-ipv6

veth0: /sys/class/net/veth0
/sys/class/net/veth0:
Expand All @@ -644,13 +732,27 @@ veth2: /sys/class/net/veth2
sudo ip link set veth2 mtu 9500
sudo ip link set veth3 mtu 9500

ifeq ($(HAVE_DPAPP),y)
$(DPAPP_LINK): /sys/class/net/$(DPAPP_LINK)
/sys/class/net/$(DPAPP_LINK):
sudo ip link add name $(DPAPP_LINK) type veth peer name $(DPAPP_LINK_PEER)
sudo ip link set dev $(DPAPP_LINK) up
sudo ip link set dev $(DPAPP_LINK_PEER) up
sudo ip link set $(DPAPP_LINK) mtu 9500
sudo ip link set $(DPAPP_LINK_PEER) mtu 9500
endif

disable-ipv6:
./disable_veth_ipv6.sh
DPAPP_LINK=$(DPAPP_LINK) DPAPP_LINK_PEER=$(DPAPP_LINK_PEER) ./disable_veth_ipv6.sh

# Delete veth's, test existence to avoid needless use of sudo
network-clean:
@-([ -e /sys/class/net/veth0 ] && sudo ip link delete dev veth0 && echo "Deleted veth0/1") || echo "No veth0, not deleting"
@-([ -e /sys/class/net/veth2 ] && sudo ip link delete dev veth2 && echo "Deleted veth2/3") || echo "No veth2, not deleting"
ifeq ($(HAVE_DPAPP),y)
@-([ -e /sys/class/net/$(DPAPP_LINK) ] && sudo ip link delete dev $(DPAPP_LINK) \
&& echo "Deleted $(DPAPP_LINK)") || echo "No $(DPAPP_LINK), not deleting"
endif

###############################
# IXIA-C TARGETS
Expand Down
14 changes: 14 additions & 0 deletions dash-pipeline/disable_veth_ipv6.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,17 @@ sudo sysctl net.ipv6.conf.veth3.autoconf=0
sudo sysctl net.ipv6.conf.veth3.accept_ra=0
sudo sysctl net.ipv6.conf.veth3.accept_ra_pinfo=0
sudo sysctl net.ipv6.conf.veth3.router_solicitations=0

if [ $DPAPP_LINK ]; then
sudo sysctl net.ipv6.conf.$DPAPP_LINK.autoconf=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK.accept_ra=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK.accept_ra_pinfo=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK.router_solicitations=0
fi
if [ $DPAPP_LINK_PEER ]; then
sudo sysctl net.ipv6.conf.$DPAPP_LINK_PEER.disable_ipv6=1
sudo sysctl net.ipv6.conf.$DPAPP_LINK_PEER.autoconf=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK_PEER.accept_ra=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK_PEER.accept_ra_pinfo=0
sudo sysctl net.ipv6.conf.$DPAPP_LINK_PEER.router_solicitations=0
fi
5 changes: 5 additions & 0 deletions dash-pipeline/dockerfiles/DOCKER_DPAPP_IMG.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Define docker image repo/name:tag
# Changing this will cause build/publish to occur in CI actions
export DASH_ACR_REGISTRY=sonicdash.azurecr.io
export DOCKER_DPAPP_IMG_NAME?=${DASH_ACR_REGISTRY}/dash-dpapp-bldr
export DOCKER_DPAPP_IMG_CTAG?=240827
86 changes: 86 additions & 0 deletions dash-pipeline/dockerfiles/Dockerfile.dpapp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# This Dockerfile builds an image used to compile/run dash date-plane app.
FROM sonicdash.azurecr.io/dash-grpc:1.43.2 as grpc
FROM p4lang/behavioral-model@sha256:ce45720e28a96a50f275c1b511cd84c2558b62f2cf7a7e506765183bc3fb2e32
LABEL maintainer="SONIC-DASH Community"
LABEL description="DASH date-plane app using vpp"

# Configure make to run as many parallel jobs as cores available
ARG available_processors
ARG MAKEFLAGS=-j$available_processors

ARG sswitch_grpc=yes
ARG CC=gcc
ARG CXX=g++
# Set TZ to avoid interactive installer
ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV GIT_SSL_NO_VERIFY=true

RUN apt-get update && \
apt-get install -y --no-install-recommends \
git \
build-essential \
autoconf \
libtool \
libtool-bin \
pkg-config \
patchelf \
sudo \
iproute2 net-tools iputils-ping \
make

## Install vpp
RUN apt-get install -y curl
RUN curl -s https://packagecloud.io/install/repositories/fdio/release/script.deb.sh | bash -x
RUN apt-get update && \
apt-get install -y --no-install-recommends \
vpp vpp-plugin-core vpp-plugin-dpdk vpp-dbg vpp-dev

# vpp development environment
RUN echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections
WORKDIR /var
RUN (git clone https://gerrit.fd.io/r/vpp && \
cd vpp && UNATTENDED=y make install-dep)


WORKDIR /usr/local/lib/

# Copy libabsl .a files from p4pi, make shared lib for our use and delete .a's
COPY --from=grpc /usr/local/lib/lib*grpc*.so* \
/usr/local/lib/libabsl*.so* \
/usr/local/lib/libgpr*.so* \
/usr/local/lib/libupb*.so* \
/usr/local/lib/libre2*.so* \
/usr/local/lib/libaddress_sorting*.so* \
/usr/local/lib/libssl*.so* \
/usr/local/lib/libcrypto*.so* \
./

# Specify dash sai libs dependency on vpp
RUN patchelf --set-rpath /SAI/lib /usr/bin/vpp
RUN patchelf --add-needed libsai.so \
--add-needed libprotobuf.so \
--add-needed libpiprotobuf.so \
--add-needed libpiprotogrpc.so \
--add-needed libgrpc++.so.1.43 \
/usr/bin/vpp
RUN ldconfig

WORKDIR /

ARG user
ARG uid
ARG group
ARG guid
ARG hostname

ENV BUILD_HOSTNAME $hostname
ENV USER $user

RUN groupadd -f -r -g $guid $group
RUN useradd $user -l -u $uid -g $guid -d /var/$user -m -s /bin/bash
RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers

USER $user

CMD /bin/bash

0 comments on commit a638ad3

Please sign in to comment.