Generate leaner P4 VM

Dev: 1.5 GB instead of 3.5 GB
Tutorial: 2.3 GB instead of 5.5 GB

Change-Id: Ib63d47578a2c9e16a97827bfba463f90cfe1187d
diff --git a/tools/dev/p4vm/export-ova.sh b/tools/dev/p4vm/export-ova.sh
index 32e1694..6507849 100755
--- a/tools/dev/p4vm/export-ova.sh
+++ b/tools/dev/p4vm/export-ova.sh
@@ -4,27 +4,48 @@
 
 VM_TYPE=${P4_VM_TYPE:-dev}
 
+function wait_vm_shutdown {
+    set +x
+    while vboxmanage showvminfo $1 | grep -c "running (since"
+    do
+    echo "Waiting for VM to shutdown..."
+    sleep 1
+    done
+    sleep 2
+    set -x
+}
+
 # Remove references to the existing vagrant-built VM (if any).
 # We want to build a new one from scratch, not start an existing one.
 rm -rf .vagrant/
-
 vagrant up
 
 SSH_PORT=`vagrant port --guest 22`
 VB_UUID=`cat .vagrant/machines/default/virtualbox/id`
+VMDK_PATH=`VBoxManage showvminfo ${VB_UUID} --machinereadable | grep vmdk | cut -d'=' -f2`
 
+# Take snapshot before cleanup for local use
+# e.g. to avoid re-building P4 tools from scratch
+vboxmanage controlvm ${VB_UUID} acpipowerbutton
+wait_vm_shutdown ${VB_UUID}
+VBoxManage snapshot ${VB_UUID} take "pre-cleanup"
+
+# Cleanup
+vagrant up
 sshpass -p 'rocks' \
     ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
     -p ${SSH_PORT} sdn@127.0.0.1 "bash /vagrant/pre-ova-cleanup.sh"
-
 sleep 5
 vboxmanage controlvm ${VB_UUID} acpipowerbutton
-
-# Wait for VM to power off
-sleep 30
+wait_vm_shutdown ${VB_UUID}
 
 # Remove vagrant shared folder
 vboxmanage sharedfolder remove ${VB_UUID} -name "vagrant"
 
-rm -rf onos-p4-${VM_TYPE}.ova
+rm -f onos-p4-${VM_TYPE}.ova
 vboxmanage export ${VB_UUID} -o onos-p4-${VM_TYPE}.ova
+
+sleep 1
+vboxmanage snapshot ${VB_UUID} restore pre-cleanup
+sleep 1
+vboxmanage snapshot ${VB_UUID} delete pre-cleanup