xref: /spdk/scripts/vagrant/create_vbox.sh (revision 9889ab2dc80e40dae92dcef361d53dcba722043d)
1#!/usr/bin/env bash
2
3# create_vbox.sh
4#
5# Creates a virtual box with vagrant in the $PWD.
6#
7# This script creates a subdirectory called $PWD/<distro> and copies the Vagrantfile
8# into that directory before running 'vagrant up'
9
10VAGRANT_TARGET="$PWD"
11
12DIR="$( cd "$( dirname $0 )" && pwd )"
13SPDK_DIR="$( cd "${DIR}/../../" && pwd )"
14
15# The command line help
16display_help() {
17	echo
18	echo " Usage: ${0##*/} [-b nvme-backing-file] [-n <num-cpus>] [-s <ram-size>] [-x <http-proxy>] [-hvrld] <distro>"
19	echo
20	echo "  distro = <centos7 | ubuntu16 | ubuntu18 | fedora28 | fedora29 | fedora 30 | freebsd11> "
21	echo
22	echo "  -b <nvme-backing-file>          default: ${NVME_FILE}"
23	echo "  -s <ram-size> in kb             default: ${SPDK_VAGRANT_VMRAM}"
24	echo "  -n <num-cpus> 1 to 4            default: ${SPDK_VAGRANT_VMCPU}"
25	echo "  -x <http-proxy>                 default: \"${SPDK_VAGRANT_HTTP_PROXY}\""
26	echo "  -p <provider>                   libvirt or virtualbox"
27	echo "  --vhost-host-dir=<path>         directory path with vhost test dependencies"
28	echo "                                  (test VM qcow image, fio binary, ssh keys)"
29	echo "  --vhost-vm-dir=<path>           directory where to put vhost dependencies in VM"
30	echo "  --qemu-emulator=<path>          directory path with emulator, default: ${SPDK_QEMU_EMULATOR}"
31	echo "  -r dry-run"
32	echo "  -l use a local copy of spdk, don't try to rsync from the host."
33	echo "  -d deploy a test vm by provisioning all prerequisites for spdk autotest"
34	echo "  -h help"
35	echo "  -v verbose"
36	echo
37	echo " Examples:"
38	echo
39	echo "  $0 -x http://user:password@host:port fedora28"
40	echo "  $0 -s 2048 -n 2 ubuntu16"
41	echo "  $0 -rv freebsd"
42	echo "  $0 fedora28 "
43	echo
44}
45
46# Set up vagrant proxy. Assumes git-bash on Windows
47# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment
48SPDK_VAGRANT_HTTP_PROXY=""
49
50VERBOSE=0
51HELP=0
52COPY_SPDK_DIR=1
53DRY_RUN=0
54DEPLOY_TEST_VM=0
55SPDK_VAGRANT_DISTRO="distro"
56SPDK_VAGRANT_VMCPU=4
57SPDK_VAGRANT_VMRAM=4096
58SPDK_VAGRANT_PROVIDER="virtualbox"
59SPDK_QEMU_EMULATOR=""
60OPTIND=1
61NVME_FILE="nvme_disk.img"
62
63while getopts ":b:n:s:x:p:vrldh-:" opt; do
64	case "${opt}" in
65		-)
66		case "${OPTARG}" in
67			vhost-host-dir=*) VHOST_HOST_DIR="${OPTARG#*=}" ;;
68			vhost-vm-dir=*) VHOST_VM_DIR="${OPTARG#*=}" ;;
69			qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;;
70			*) echo "Invalid argument '$OPTARG'" ;;
71		esac
72		;;
73		x)
74			http_proxy=$OPTARG
75			https_proxy=$http_proxy
76			SPDK_VAGRANT_HTTP_PROXY="${http_proxy}"
77		;;
78		n)
79			SPDK_VAGRANT_VMCPU=$OPTARG
80		;;
81		s)
82			SPDK_VAGRANT_VMRAM=$OPTARG
83		;;
84		p)
85			SPDK_VAGRANT_PROVIDER=$OPTARG
86		;;
87		v)
88			VERBOSE=1
89		;;
90		r)
91			DRY_RUN=1
92		;;
93		h)
94			display_help >&2
95			exit 0
96		;;
97		l)
98			COPY_SPDK_DIR=0
99		;;
100		d)
101			DEPLOY_TEST_VM=1
102		;;
103		b)
104			NVME_FILE=$OPTARG
105		;;
106		*)
107			echo "  Invalid argument: -$OPTARG" >&2
108			echo "  Try: \"$0 -h\"" >&2
109			exit 1
110		;;
111	esac
112done
113
114shift "$((OPTIND-1))"   # Discard the options and sentinel --
115
116SPDK_VAGRANT_DISTRO="$@"
117
118case "$SPDK_VAGRANT_DISTRO" in
119	centos7)
120		export SPDK_VAGRANT_DISTRO
121	;;
122	ubuntu16)
123		export SPDK_VAGRANT_DISTRO
124	;;
125	ubuntu18)
126		export SPDK_VAGRANT_DISTRO
127	;;
128	fedora28)
129		export SPDK_VAGRANT_DISTRO
130	;;
131	fedora29)
132		export SPDK_VAGRANT_DISTRO
133	;;
134	fedora30)
135		export SPDK_VAGRANT_DISTRO
136	;;
137	freebsd11)
138		export SPDK_VAGRANT_DISTRO
139	;;
140	arch-linux)
141		export SPDK_VAGRANT_DISTRO
142	;;
143	*)
144		echo "  Invalid argument \"${SPDK_VAGRANT_DISTRO}\""
145		echo "  Try: \"$0 -h\"" >&2
146		exit 1
147	;;
148esac
149
150if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ]; then
151	echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build"
152	DEPLOY_TEST_VM=0
153fi
154
155if [ ${VERBOSE} = 1 ]; then
156	echo
157	echo DIR=${DIR}
158	echo SPDK_DIR=${SPDK_DIR}
159	echo VAGRANT_TARGET=${VAGRANT_TARGET}
160	echo HELP=$HELP
161	echo DRY_RUN=$DRY_RUN
162	echo NVME_FILE=$NVME_FILE
163	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
164	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
165	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
166	echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER
167	echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY
168	echo VHOST_HOST_DIR=$VHOST_HOST_DIR
169	echo VHOST_VM_DIR=$VHOST_VM_DIR
170	echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR
171	echo
172fi
173
174export SPDK_VAGRANT_HTTP_PROXY
175export SPDK_VAGRANT_VMCPU
176export SPDK_VAGRANT_VMRAM
177export SPDK_DIR
178export COPY_SPDK_DIR
179export DEPLOY_TEST_VM
180export NVME_FILE
181
182if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
183    provider="--provider=${SPDK_VAGRANT_PROVIDER}"
184fi
185
186if [ -n "$VHOST_HOST_DIR" ]; then
187    export VHOST_HOST_DIR
188fi
189
190if [ -n "$VHOST_VM_DIR" ]; then
191    export VHOST_VM_DIR
192fi
193
194if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
195    export SPDK_VAGRANT_PROVIDER
196fi
197
198if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt"  ]; then
199    export SPDK_QEMU_EMULATOR
200fi
201
202if [ ${DRY_RUN} = 1 ]; then
203	echo "Environemnt Variables"
204	printenv SPDK_VAGRANT_DISTRO
205	printenv SPDK_VAGRANT_VMRAM
206	printenv SPDK_VAGRANT_VMCPU
207	printenv SPDK_VAGRANT_PROVIDER
208	printenv SPDK_VAGRANT_HTTP_PROXY
209	printenv SPDK_QEMU_EMULATOR
210	printenv SPDK_DIR
211fi
212
213if [ -d "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" ]; then
214	echo "Error: ${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER} already exists!"
215	exit 1
216fi
217
218if [ ${DRY_RUN} != 1 ]; then
219	mkdir -vp "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}"
220	cp ${DIR}/Vagrantfile ${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}
221	pushd "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}"
222	if [ -n "${http_proxy}" ]; then
223		export http_proxy
224		export https_proxy
225		if vagrant plugin list | grep -q vagrant-proxyconf; then
226			echo "vagrant-proxyconf already installed... skipping"
227		else
228			vagrant plugin install vagrant-proxyconf
229		fi
230		if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then
231			cat >~/vagrant_pkg.conf <<EOF
232pkg_env: {
233http_proxy: ${http_proxy}
234}
235EOF
236		fi
237	fi
238	vagrant up $provider
239	echo ""
240	echo "  SUCCESS!"
241	echo ""
242	echo "  cd to ${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER} and type \"vagrant ssh\" to use."
243	echo "  Use vagrant \"suspend\" and vagrant \"resume\" to stop and start."
244	echo "  Use vagrant \"destroy\" followed by \"rm -rf ${SPDK_VAGRANT_DISTRO}\" to destroy all trace of vm."
245	echo ""
246fi
247