Various improvements to p4vm scripts

- Allow running up to a given step of install-p4-tools.sh
(e.g. helpful to install only PI)
- Install fabric-p4test deps (ONOS-7656)
- Fix python protobuf libraries not installed

Change-Id: I443edb08f455703ae682e485a89d793a584c30ff
diff --git a/tools/dev/bin/onos-setup-p4-dev b/tools/dev/bin/onos-setup-p4-dev
index f0e94c9..4ec48f3 100755
--- a/tools/dev/bin/onos-setup-p4-dev
+++ b/tools/dev/bin/onos-setup-p4-dev
@@ -2,4 +2,4 @@
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
-bash ${DIR}/../p4vm/install-p4-tools.sh
+bash ${DIR}/../p4vm/install-p4-tools.sh "$@"
diff --git a/tools/dev/p4vm/install-p4-tools.sh b/tools/dev/p4vm/install-p4-tools.sh
index e6c7269..cdd863c 100755
--- a/tools/dev/p4vm/install-p4-tools.sh
+++ b/tools/dev/p4vm/install-p4-tools.sh
@@ -9,6 +9,10 @@
 # 4 GB of RAM
 # 2 cores
 # 8 GB free hard drive space (~4 GB to build everything)
+#
+# To execute up to a given step, pass the step name as the first argument. For
+# example, to install PI, but not BMv2, p4c, etc:
+#   ./install-p4-tools.sh PI
 # -----------------------------------------------------------------------------
 
 # Exit on errors.
@@ -24,7 +28,6 @@
 GRPC_COMMIT="tags/v1.3.2"
 LIBYANG_COMMIT="v0.14-r1"
 SYSREPO_COMMIT="v0.7.2"
-P4RT_TEST_COMMIT="master"
 
 NUM_CORES=`grep -c ^processor /proc/cpuinfo`
 
@@ -32,6 +35,9 @@
 # reduce CPU/memory footprint.
 DEBUG_FLAGS=${DEBUG_FLAGS:-true}
 
+# Execute up to the given step (first argument), or all if not defined.
+LAST_STEP=${1:-all}
+
 function do_requirements {
     sudo apt update
     sudo apt-get install -y --no-install-recommends \
@@ -83,7 +89,7 @@
         wget \
         unzip
 
-    sudo -H pip install setuptools cffi grpcio scapy ipaddr
+    sudo -H pip install setuptools cffi ipaddr pypcap
 }
 
 function do_requirements_1404 {
@@ -245,7 +251,7 @@
 function do_pi_bmv2_deps {
     checkout_bmv2
     # From bmv2's install_deps.sh.
-    # Nanomsg is required also by p4runtime.
+    # Nanomsg is required also by PI.
     tmpdir=`mktemp -d -p .`
     cd ${tmpdir}
     bash ../travis/install-thrift.sh
@@ -256,12 +262,12 @@
     sudo rm -rf $tmpdir
 }
 
-function do_p4runtime {
+function do_PI {
     cd ${BUILD_DIR}
-    if [ ! -d p4runtime ]; then
-        git clone https://github.com/p4lang/PI.git p4runtime
+    if [ ! -d PI ]; then
+        git clone https://github.com/p4lang/PI.git
     fi
-    cd p4runtime
+    cd PI
     git fetch
     git checkout ${PI_COMMIT}
     git submodule update --init --recursive
@@ -329,16 +335,27 @@
     sudo ldconfig
 }
 
-function do_p4rt_test {
+function do_scapy-vxlan {
     cd ${BUILD_DIR}
-    if [ ! -d p4rt-test ]; then
-        git clone https://github.com/TakeshiTseng/P4-runtime-test-tool.git p4rt-test
+    if [ ! -d scapy-vxlan ]; then
+        git clone https://github.com/p4lang/scapy-vxlan.git
     fi
-    cd p4rt-test
+    cd scapy-vxlan
+
     git pull origin master
 
-    sudo rm -f /usr/local/bin/p4rt-test
-    sudo ln -s ${BUILD_DIR}/p4rt-test/main.py /usr/local/bin/p4rt-test
+    sudo python setup.py install
+}
+
+function do_ptf {
+    cd ${BUILD_DIR}
+    if [ ! -d ptf ]; then
+        git clone https://github.com/p4lang/ptf.git
+    fi
+    cd ptf
+    git pull origin master
+
+    sudo python setup.py install
 }
 
 function check_commit {
@@ -367,12 +384,12 @@
     commit_id="$1"
     proj_dir="$2"
     func_name="$3"
-    simple_name="$4"
+    step_name="$4"
+    commit_file=${BUILD_DIR}/${proj_dir}/.last_built_commit_${step_name}
     if [ ${MUST_DO_ALL} = true ] \
-        || [ ${commit_id} = "master" ] \
-        || check_commit ${commit_id} ${proj_dir}/.last_built_commit; then
+        || check_commit ${commit_id} ${commit_file}; then
         echo "#"
-        echo "# Building ${simple_name} (${commit_id})"
+        echo "# Building ${step_name} (${commit_id})"
         echo "#"
         # Print commands used to install to aid debugging
         set -x
@@ -392,13 +409,17 @@
             DID_REQUIREMENTS=true
         fi
         eval ${func_name}
-        echo ${commit_id} > ${BUILD_DIR}/${proj_dir}/.last_built_commit
+        echo ${commit_id} > ${commit_file}
         # Build all next projects as they might depend on this one.
         MUST_DO_ALL=true
         # Disable printing to reduce output
         set +x
     else
-        echo "${proj_dir} is up to date (commit ${commit_id})"
+        echo "${step_name} is up to date (commit ${commit_id})"
+    fi
+    # Exit if last step.
+    if [ ${step_name} = ${LAST_STEP} ]; then
+        exit
     fi
 }
 
@@ -411,9 +432,10 @@
 # check_and_do ${LIBYANG_COMMIT} libyang do_libyang libyang
 # check_and_do ${SYSREPO_COMMIT} sysrepo do_sysrepo sysrepo
 check_and_do ${BMV2_COMMIT} bmv2 do_pi_bmv2_deps bmv2-deps
-check_and_do ${PI_COMMIT} p4runtime do_p4runtime p4runtime
+check_and_do ${PI_COMMIT} PI do_PI PI
 check_and_do ${BMV2_COMMIT} bmv2 do_bmv2 bmv2
 check_and_do ${P4C_COMMIT} p4c do_p4c p4c
-check_and_do ${P4RT_TEST_COMMIT} p4rt-test do_p4rt_test p4rt-test
+check_and_do master scapy-vxlan do_scapy-vxlan scapy-vxlan
+check_and_do master ptf do_ptf ptf
 
 echo "Done!"
diff --git a/tools/dev/p4vm/pre-ova-cleanup.sh b/tools/dev/p4vm/pre-ova-cleanup.sh
index d4e28fb..0718dd8 100755
--- a/tools/dev/p4vm/pre-ova-cleanup.sh
+++ b/tools/dev/p4vm/pre-ova-cleanup.sh
@@ -6,17 +6,19 @@
 sudo userdel -r -f vagrant
 
 # Free space on disk
-rm -rf ~/p4tools/protobuf
-rm -rf ~/p4tools/grpc
-rm -rf ~/p4tools/bmv2
-rm -rf ~/p4tools/p4runtime
-rm -rf ~/p4tools/p4c
-rm -rf ~/p4tools/libyang
-rm -rf ~/p4tools/sysrepo
+sudo rm -rf ~/p4tools/protobuf
+sudo rm -rf ~/p4tools/grpc
+sudo rm -rf ~/p4tools/bmv2
+sudo rm -rf ~/p4tools/PI
+sudo rm -rf ~/p4tools/p4c
+sudo rm -rf ~/p4tools/libyang
+sudo rm -rf ~/p4tools/sysrepo
+sudo rm -rf ~/p4tools/scapy-vxlan
+sudo rm -rf ~/p4tools/ptf
 
 sudo apt-get clean
 sudo apt-get -y autoremove
-sudo rm -rf /tmp/*
+sudo sudo rm -rf /tmp/*
 
 # Zerofill virtual hd to save space when exporting
 time sudo dd if=/dev/zero of=/tmp/zero bs=1M || true
diff --git a/tools/dev/p4vm/root-bootstrap.sh b/tools/dev/p4vm/root-bootstrap.sh
index f413cc6..7b28487 100755
--- a/tools/dev/p4vm/root-bootstrap.sh
+++ b/tools/dev/p4vm/root-bootstrap.sh
@@ -24,8 +24,10 @@
 apt-get install software-properties-common -y
 add-apt-repository ppa:webupd8team/java -y
 apt-get update
-echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
 
+DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
+
+echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
 apt-get -y --no-install-recommends install \
     avahi-daemon \
     bridge-utils \
diff --git a/tools/dev/p4vm/user-bootstrap.sh b/tools/dev/p4vm/user-bootstrap.sh
index e1696a5..8e7cee3 100755
--- a/tools/dev/p4vm/user-bootstrap.sh
+++ b/tools/dev/p4vm/user-bootstrap.sh
@@ -17,13 +17,23 @@
 
 # Build and install P4 tools
 bash /vagrant/install-p4-tools.sh
+# We'll delete bmv2 sources later...
+cp ~/p4tools/bmv2/tools/veth_setup.sh ~/veth_setup.sh
+cp ~/p4tools/bmv2/tools/veth_teardown.sh ~/veth_teardown.sh
 
 # Mininet
-git clone git://github.com/mininet/mininet ~/mininet
+git clone git://github.com/mininet/mininet
 sudo ~/mininet/util/install.sh -nv
 
 # Trellis routing repo
 git clone https://github.com/opennetworkinglab/routing.git
 
+# fabric-p4test
+git clone https://github.com/opennetworkinglab/fabric-p4test.git
+
 # Set Python path for bmv2 in fabric.p4
 echo 'export PYTHONPATH=$PYTHONPATH:~/onos/tools/dev/mininet/bmv2.py' >> ~/.bashrc
+
+# FIXME: for some reason protobuf python bindings are not properly installed
+cd ~/p4tools/protobuf/python
+sudo pip install .