How to use the p4lang/p4app Docker image
本文参考 孙勇峰博客 和 p4app README 以及 p4app Dockerfile 结合自己的理解做一些记录,有错误或不足之处欢迎批评指正。
简介p4app是一个可以构建、运行、调试和测试P4程序的工具,p4app背后蕴含的哲学是“简单的事情应尽可能简单”,旨在使小而简单的P4程序易于编写、易于与他人分享。
p4lang/p4app的镜像结构Docker 镜像是分层结构以Ubuntu 16.04为base镜像依次构建,p4app为最顶层.
对于如何构建这些镜像,有兴趣的可以看p4app的Dockerfile.
p4app
p4c
pi
bmv2
third-party
Ubuntu 16.04
安装p4app
下载github的p4app源码
$ git clone https://github.com/p4lang/p4app
为了方便可将p4app脚本拷贝到PATH路径
$ sudo cp p4app /usr/local/bin安装docker
以下两种均可
docker安装教程
一键安装
$ wget -qO- https://get.docker.com/ | sh 如何使用p4app运行p4app程序包. p4app程序包是一个以.p4app为后缀的目录,例如你用P4写了一个路由器程序,将其放在router.p4app目录文件夹下. 该目录应当包括你的P4程序、其他与你的程序相关联的文件和一个p4app.json文件. p4app.json指定如何执行你的p4程序(自定义执行动作).
在p4app/examples中包含多个样例,具体如下:
broadcast.p4app
compile_only.p4app
customtopo.p4app
multi_iface.p4app
multiswitch.p4app
paxos_acceptor.p4app
simple_counter.p4app
simple_router.p4app
source_routing.p4app
例如,你要执行simple_router.p4app程序包
$ p4app run p4app/examples/simple_router.p4app当你执行这条命令,最终会进入mininet命令行界面.
那么执行这条命令后具体发生了什么?我们先来看看p4app这个可执行脚本在做什么
Ps:对于脚本感兴趣的可以查看p4app脚本源码
p4app可执行脚本详解 p4app命令参数p4app run
运行p4app程序包
p4app run
运行p4app程序包并指定target
p4app build
构建p4app程序包并输出json文件
p4app pack
将p4app程序包压缩为单个文件,替换当前目录下的p4app程序包,使用gzip压缩
p4app unpack
解压上述压缩包
p4app update
更新到最新版本的p4app的docker镜像
p4app exec
在最新运行的p4app容器实例中执行一条命令
p4app run 内部具体执行流程以simple_router.p4app为例
执行run-comman函数
传入参数为目录
//如simple_router.p4app $ run-p4app /tem/p4app.tar.gz.XXXXXX
传入参数为文件
$ run-p4app 文件的绝对路径 简单理解,如果是文件夹就压缩打包后传入其路径,是文件就传入绝对路径.
执行run-p4app函数
重点来了,运行p4app容器实例
$ docker run --privileged --interactive --tty --rm \ --name "p4app_$RANDOM" \ -v $1:/tmp/app.tar.gz \ -v "P4APP_LOGDIR":/tmp/p4app_logs \ $P4APP_IMAGE /tmp/p4app.tar.gz "${@:2}" #docker run # --tty 分配tty设备 可支持终端登录 # --interactive 打开STDIN 用于控制台交互 # 上面两个是-it # --name 随机取了一个名字 # -v 将主机上/tmp/p4app.tar.gz.XXXXXX 挂载到容器的 /tmp/app.tar.gz 中 # 如果只是文件 将文件绝对路径挂载到容器的 /tem/app.tar.gz中 # -v 将主机的log目录挂载到容器的/tmp/p4app_logs 中 # $P4APP_IMAGE $APP_TO_RUN "${@:2}" # 指定 镜像 文件 其他参数(指定target)
进入容器实例
p4app容器实例启动后执行的是p4apprunner.py脚本
p4apprunner.py参数
必要参数
app
p4app程序包路径
target
compile-bmv2 编译成bmv2目标
mininet 单P4交换机测试
multiswitch 多P4交换机测试
stf 进行stf测试
custom
可选参数
--buid-dir
构建目录,默认为/tmp
--quiet
不显示log消息
--build-only
仅编译不运行
--json
Use this compiled JSON file instead of compiling
--manifest
manifest 清单文件路径,默认为./p4app.json
p4apprunner.py解析流程
解压提取p4app程序包
根据p4app程序包中的p4app.json解析
根据其中的target执行相应函数
p4app build 具体执行流程
执行build-command函数
$ run-command --build-only "${@:3}"执行run-command函数(同上)
执行run-p4app函数(同上)
进入容器实例(同上)
copy容器中$P4APP_LOGDIR/program.json到host本地目录下
总结,添加--build-only选项,仅编译p4app程序输出json文件
p4app运行流程小结第一次运行p4app时会自动下载docker镜像p4lang/p4app:latest
该镜像中包括P4编译器、mininet、抓包工具tshark、发包工具scapy、net-tools和nmap套件等工具
启动一个p4app容器实例,并在容器中执行p4apprunner.py脚本
根据传入的p4app.json执行相应操作
p4app.json解析 p4app程序包最终如何运行,由manifest指定的p4app.json文件配置.