Change vagrant to provision template VM and create clones for all VMs

refs #2436

Change-Id: Ia4326d2129356d3711c0a9ba006cce7890eab7b0
diff --git a/Vagrantfile b/Vagrantfile
index 0177d66..a95f369 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -6,7 +6,6 @@
 
 $setup = <<SCRIPT
 sudo apt-get update -qq
-sudo apt-get install -y python
 SCRIPT
 
 $setup_integ = <<SCRIPT
@@ -52,42 +51,44 @@
   config.vm.box = "ubuntu/trusty64"
 
   config.vm.provider "virtualbox" do |vb|
-    vb.memory = "4096"
-    vb.cpus = "4"
+    vb.memory = "2048"
+    vb.cpus = "1"
     vb.customize ["storagectl", :id, "--name", "SATAController", "--hostiocache", "off"]
   end
 
+  config.vm.define "template" do |t|
+    t.vm.provision "shell", inline: $setup, privileged: false
+    t.vm.provision "shell", inline: $setup_ssh, privileged: false
+    t.vm.provision "shell", inline: $setup_integ, privileged: false
+  end
+
   config.vm.define "A" do |a|
+    a.vm.box = "nfd-integ"
     a.vm.network "private_network", ip: "192.168.1.3", virtualbox__intnet: "ABC-switch"
     a.vm.network "private_network", ip: "192.168.2.2", virtualbox__intnet: "AtoRouter"
     a.vm.provision "shell", inline: $setup, privileged: false
     a.vm.provision "shell", inline: $setup_a, privileged: false
-    a.vm.provision "shell", inline: $setup_ssh, privileged: false
-    a.vm.provision "shell", inline: $setup_integ, privileged: false
   end
 
   config.vm.define "B" do |b|
+    b.vm.box = "nfd-integ"
     b.vm.network "private_network", ip: "192.168.1.2", virtualbox__intnet: "ABC-switch"
     b.vm.provision "shell", inline: $setup, privileged: false
     b.vm.provision "shell", inline: "ip -6 addr add fd01::2/64 dev eth1"
-    b.vm.provision "shell", inline: $setup_ssh, privileged: false
-    b.vm.provision "shell", inline: $setup_integ, privileged: false
   end
 
   config.vm.define "C" do |c|
+    c.vm.box = "nfd-integ"
     c.vm.network "private_network", ip: "192.168.1.4", virtualbox__intnet: "ABC-switch"
     c.vm.provision "shell", inline: $setup, privileged: false
     c.vm.provision "shell", inline: "ip -6 addr add fd01::4/64 dev eth1"
-    c.vm.provision "shell", inline: $setup_ssh, privileged: false
-    c.vm.provision "shell", inline: $setup_integ, privileged: false
   end
 
   config.vm.define "D" do |d|
+    d.vm.box = "nfd-integ"
     d.vm.network "private_network", ip: "192.168.3.3", virtualbox__intnet: "DtoRouter"
     d.vm.provision "shell", inline: $setup, privileged: false
     d.vm.provision "shell", inline: $setup_d
-    d.vm.provision "shell", inline: $setup_ssh, privileged: false
-    d.vm.provision "shell", inline: $setup_integ, privileged: false
   end
 
   config.vm.define "router" do |router|
diff --git a/run-vagrant-tests.sh b/run-vagrant-tests.sh
index 7a03e1e..934360a 100755
--- a/run-vagrant-tests.sh
+++ b/run-vagrant-tests.sh
@@ -31,9 +31,20 @@
 
 mkdir -p logs/A logs/B logs/C logs/D
 mkdir -p temp
-ssh-keygen -b 2048 -t rsa -f temp/sshkey -q -N ""
+ssh-keygen -t ecdsa -f temp/sshkey -q -N ""
 
-vagrant up
+vagrant up router
+
+vagrant up template
+vagrant ssh template -c "sudo apt-get clean"
+vagrant package --output nfd-integ.box template
+vagrant box remove nfd-integ
+vagrant box add --name nfd-integ nfd-integ.box
+
+vagrant up A
+vagrant up B
+vagrant up C
+vagrant up D
 
 vagrant ssh A -c "cd integration-tests && ./run_tests.py test_all 2>&1 | tee run.log"
 vagrant ssh A -c "integration-tests/collect-logs.sh A"
@@ -43,4 +54,6 @@
 
 vagrant destroy -f
 
+vagrant box remove nfd-integ
 rm -Rf temp
+rm -f nfd-integ.box