To avoid the painful installation of the P4 compiler (p4c), since P4.org already builds a docker with the p4c inside, the p4capi is a wrapper that implements a simple REST API so any system can utilize the compiler in an easy manner, all a user need to do is make a POST request with the P4 source file and a JSON with the parameter one normally would use with p4c in the terminal, and the response will be a zip file with the set of files resulting from the compilation.
Spin up the container with the following command. The REST API is built using Flask so the docker inside port will always be 5000.
docker run -d -p 5000:5000 --name p4capi davidjosearaujo/p4capi:latest
This is an example of how to compile a P4 source file and recover the resulting compiled files into a directory /response. (Take into account basic.p4 is a file in the same directory)
import requests
import json
import os
from zipfile import ZipFile
url = 'http://localhost:5000/compile'
p4_file = "basic.p4"
# Set of parameters accepted by the p4 compiler
params = {
'help': False, # Standalone option
'target-help': False, # Standalone option
'target': 'bmv2', # Obligatory parameter
'arch': 'v1model', # Obligatory parameter
'p4runtime-files': 'basic.p4info.txt', # Optional parameter
'std': False, # Optional parameter
}
files = {
'params': (None, json.dumps(params), 'application/json'),
'file': (os.path.basename(p4_file), open(p4_file, 'rb'), 'application/octet-stream')
}
# Posting request to compiler
r = requests.post(url, files=files)
if r.content != b"Error":
# Write .zip file received
filename = 'response.zip'
open(filename, 'wb').write(r.content)
# Extract files inside .zip file to /response directory
with ZipFile(filename, 'r') as zip:
zip.extractall(path="./response")
# Erase .zip file
os.system(f"rm {filename}")
Content type
Image
Digest
sha256:3334adf6a…
Size
444.8 MB
Last updated
over 3 years ago
docker pull davidjosearaujo/p4capi