add Docker platform for integration tests
refs #5108
Change-Id: I2855a5d87e4dbca6af02049e0cf423b7c893b2d0
diff --git a/run.sh b/run.sh
new file mode 100755
index 0000000..1fb9466
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+#
+# Automated integration testing for the Named Data Networking Forwarding Daemon.
+# Part of the Named Data Networking project <https://named-data.net>
+#
+# --
+#
+# Copyright (c) 2014-2020, Regents of the University of California,
+# Arizona Board of Regents,
+# Colorado State University,
+# University Pierre & Marie Curie, Sorbonne University,
+# Washington University in St. Louis,
+# Beijing Institute of Technology,
+# The University of Memphis.
+#
+# This file is part of NFD (Named Data Networking Forwarding Daemon).
+# See AUTHORS.md for complete list of NFD authors and contributors.
+#
+# NFD is free software: you can redistribute it and/or modify it under the terms
+# of the GNU General Public License as published by the Free Software Foundation,
+# either version 3 of the License, or (at your option) any later version.
+#
+# NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Eric Newberry <enewberry@cs.ucla.edu>
+
+run_docker() {
+ # Pull docker image if not available
+ echo "Updating docker image..."
+ docker pull ubuntu:18.04
+
+ # Clean up any existing containers, networks, or folders
+ echo "Cleaning any prior runs..."
+ for host in A B C D router template; do
+ docker stop nfd-integ-${host}
+ docker rm nfd-integ-${host}
+ done
+ docker image rm nfd-integ
+ docker network rm nfd-integ-ABC-switch
+ docker network rm nfd-integ-AtoRouter
+ docker network rm nfd-integ-DtoRouter
+
+ # Create and export template
+ echo "Creating template container..."
+ docker run -itd --name nfd-integ-template --mount type=bind,source="$(pwd)",target="/integ" ubuntu:18.04 bash
+ docker exec -it nfd-integ-template /integ/docker_helpers/prepare_template.sh
+ docker commit nfd-integ-template nfd-integ:latest
+ docker stop nfd-integ-template
+ docker rm nfd-integ-template
+
+ # Set up network bridges
+ echo "Setting up networks..."
+ docker network create --ipv6 --subnet 192.168.1.0/24 --subnet fd01::/64 nfd-integ-ABC-switch
+ docker network create --ipv6 --subnet 192.168.2.0/24 --subnet fd02::/64 nfd-integ-AtoRouter
+ docker network create --ipv6 --subnet 192.168.3.0/24 --subnet fd03::/64 nfd-integ-DtoRouter
+
+ # Start containers
+ echo "Starting containers..."
+ for host in A B C D; do
+ docker run -itd --privileged --name nfd-integ-${host} --mount type=bind,source="$(pwd)",target="/integ" nfd-integ bash
+ done
+ docker run -itd --privileged --name nfd-integ-router --mount type=bind,source="$(pwd)",target="/integ" ubuntu:18.04 bash
+
+ # Connect containers to networks
+ echo "Connecting containers to networks..."
+ docker network connect nfd-integ-ABC-switch nfd-integ-A --ip 192.168.1.3 --ip6 fd01::3
+ docker network connect nfd-integ-AtoRouter nfd-integ-A --ip 192.168.2.2 --ip6 fd02::2
+ docker network connect nfd-integ-ABC-switch nfd-integ-B --ip 192.168.1.2 --ip6 fd01::2
+ docker network connect nfd-integ-ABC-switch nfd-integ-C --ip 192.168.1.4 --ip6 fd01::4
+ docker network connect nfd-integ-DtoRouter nfd-integ-D --ip 192.168.3.3 --ip6 fd03::3
+ docker network connect nfd-integ-AtoRouter nfd-integ-router --ip 192.168.2.3 --ip6 fd02::3
+ docker network connect nfd-integ-DtoRouter nfd-integ-router --ip 192.168.3.2 --ip6 fd03::2
+
+ # Start SSH
+ echo "Starting SSH..."
+ for host in A B C D; do
+ docker exec -it nfd-integ-${host} service ssh start
+ done
+
+ # Set up specific nodes
+ echo "Performing container-specific configuration steps..."
+ docker exec -it nfd-integ-A /integ/docker_helpers/setup_A.sh
+ docker exec -it nfd-integ-D /integ/docker_helpers/setup_D.sh
+ docker exec -it nfd-integ-router /integ/docker_helpers/setup_router.sh
+
+ # Run tests
+ echo "Running tests..."
+ docker exec -it nfd-integ-A sudo -i -u integ /integ/docker_helpers/run_tests.sh
+
+ # Collect logs
+ echo "Collecting logs..."
+ for host in A B C D; do
+ docker exec -it nfd-integ-${host} sudo -i -u integ /integ/collect-logs.sh docker ${host}
+ done
+
+ # Stop and remove containers
+ echo "Stopping containers..."
+ for host in A B C D router; do
+ docker stop nfd-integ-${host}
+ docker rm nfd-integ-${host}
+ done
+
+ # Clean up
+ echo "Cleaning up..."
+ docker image rm nfd-integ
+ docker network rm nfd-integ-ABC-switch
+ docker network rm nfd-integ-AtoRouter
+ docker network rm nfd-integ-DtoRouter
+}
+
+run_vbox() {
+ 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 router A B C D
+
+ vagrant ssh A -c "cd integration-tests && ./run_tests.py test_all 2>&1 | tee run.log"
+ for host in A B C D; do
+ vagrant ssh ${host} -c "integration-tests/collect-logs.sh vbox ${host}"
+ done
+
+ vagrant destroy -f
+
+ vagrant box remove nfd-integ
+ rm -f nfd-integ.box
+}
+
+case ${1} in
+ docker|vbox)
+ ;;
+ *)
+ echo "Usage: ${0} docker|vbox"
+ exit 1
+ ;;
+esac
+
+# Perform steps common to both environments
+rm -rf logs prepare temp
+mkdir -p logs/{A,B,C,D} temp
+ssh-keygen -t ecdsa -f temp/sshkey -q -N ""
+
+# Setup and run using environment-specific steps
+run_${1}
+
+# Clean up
+rm -rf prepare temp