xref: /spdk/scripts/vagrant/create_vbox.sh (revision 7961de43413e7f818f7499bf8518909beb59c82f)
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
10set -e
11
12VAGRANT_TARGET="$PWD"
13
14DIR="$( cd "$( dirname $0 )" && pwd )"
15SPDK_DIR="$( cd "${DIR}/../../" && pwd )"
16
17# The command line help
18display_help() {
19	echo
20	echo " Usage: ${0##*/} [-b nvme-backing-file] [-n <num-cpus>] [-s <ram-size>] [-x <http-proxy>] [-hvrld] <distro>"
21	echo
22	echo "  distro = <centos7 | centos8| ubuntu16 | ubuntu18 |"
23	echo "            fedora29 | fedora 30 | fedora 31 | freebsd11 | freebsd12>"
24	echo
25	echo "  -b <nvme-backing-file>          nvme file path with name"
26	echo "                                  type of emulated nvme disk"
27	echo "                                  usage: type <number_of_namespaces> types available: ocssd, nvme"
28	echo "                                  If no -b option is specified then this option defaults to emulating single"
29	echo "                                  NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img"
30	echo "  -c                              create all above disk, default 0"
31	echo "  -s <ram-size> in kb             default: ${SPDK_VAGRANT_VMRAM}"
32	echo "  -n <num-cpus> 1 to 4            default: ${SPDK_VAGRANT_VMCPU}"
33	echo "  -x <http-proxy>                 default: \"${SPDK_VAGRANT_HTTP_PROXY}\""
34	echo "  -p <provider>                   libvirt or virtualbox"
35	echo "  --vhost-host-dir=<path>         directory path with vhost test dependencies"
36	echo "                                  (test VM qcow image, fio binary, ssh keys)"
37	echo "  --vhost-vm-dir=<path>           directory where to put vhost dependencies in VM"
38	echo "  --qemu-emulator=<path>          directory path with emulator, default: ${SPDK_QEMU_EMULATOR}"
39	echo "  --vagrantfiles-dir=<path>       directory to put vagrantfile"
40	echo "  -r dry-run"
41	echo "  -l use a local copy of spdk, don't try to rsync from the host."
42	echo "  -d deploy a test vm by provisioning all prerequisites for spdk autotest"
43	echo "  -h help"
44	echo "  -v verbose"
45	echo
46	echo " Examples:"
47	echo
48	echo "  $0 -x http://user:password@host:port fedora30"
49	echo "  $0 -s 2048 -n 2 ubuntu16"
50	echo "  $0 -rv freebsd"
51	echo "  $0 fedora30"
52	echo "  $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora30"
53	echo "  $0 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30"
54	echo "  $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30"
55	echo
56}
57
58# Set up vagrant proxy. Assumes git-bash on Windows
59# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment
60SPDK_VAGRANT_HTTP_PROXY=""
61
62VERBOSE=0
63HELP=0
64COPY_SPDK_DIR=1
65DRY_RUN=0
66DEPLOY_TEST_VM=0
67SPDK_VAGRANT_DISTRO="distro"
68SPDK_VAGRANT_VMCPU=4
69SPDK_VAGRANT_VMRAM=4096
70SPDK_VAGRANT_PROVIDER="virtualbox"
71SPDK_QEMU_EMULATOR=""
72OPTIND=1
73NVME_DISKS_TYPE=""
74NVME_DISKS_NAMESPACES=""
75NVME_FILE=""
76NVME_AUTO_CREATE=0
77VAGRANTFILE_DIR=""
78
79while getopts ":b:n:s:x:p:vcrldh-:" opt; do
80	case "${opt}" in
81		-)
82		case "${OPTARG}" in
83			vhost-host-dir=*) VHOST_HOST_DIR="${OPTARG#*=}" ;;
84			vhost-vm-dir=*) VHOST_VM_DIR="${OPTARG#*=}" ;;
85			qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;;
86			vagrantfiles-dir=*) VAGRANTFILE_DIR="${OPTARG#*=}" ;;
87			*) echo "Invalid argument '$OPTARG'" ;;
88		esac
89		;;
90		x)
91			http_proxy=$OPTARG
92			https_proxy=$http_proxy
93			SPDK_VAGRANT_HTTP_PROXY="${http_proxy}"
94		;;
95		n)
96			SPDK_VAGRANT_VMCPU=$OPTARG
97		;;
98		s)
99			SPDK_VAGRANT_VMRAM=$OPTARG
100		;;
101		p)
102			SPDK_VAGRANT_PROVIDER=$OPTARG
103		;;
104		v)
105			VERBOSE=1
106		;;
107		c)
108			NVME_AUTO_CREATE=1
109		;;
110		r)
111			DRY_RUN=1
112		;;
113		h)
114			display_help >&2
115			exit 0
116		;;
117		l)
118			COPY_SPDK_DIR=0
119		;;
120		d)
121			DEPLOY_TEST_VM=1
122		;;
123		b)
124			NVME_FILE+="${OPTARG#*=} "
125		;;
126		*)
127			echo "  Invalid argument: -$OPTARG" >&2
128			echo "  Try: \"$0 -h\"" >&2
129			exit 1
130		;;
131	esac
132done
133
134shift "$((OPTIND-1))"   # Discard the options and sentinel --
135
136SPDK_VAGRANT_DISTRO="$*"
137
138case "${SPDK_VAGRANT_DISTRO}" in
139	centos7)
140		export SPDK_VAGRANT_DISTRO
141	;;
142	centos8)
143		export SPDK_VAGRANT_DISTRO
144	;;
145	ubuntu16)
146		export SPDK_VAGRANT_DISTRO
147	;;
148	ubuntu18)
149		export SPDK_VAGRANT_DISTRO
150	;;
151	fedora29)
152		export SPDK_VAGRANT_DISTRO
153	;;
154	fedora30)
155		export SPDK_VAGRANT_DISTRO
156	;;
157	fedora31)
158		export SPDK_VAGRANT_DISTRO
159	;;
160	freebsd11)
161		export SPDK_VAGRANT_DISTRO
162	;;
163	freebsd12)
164		export SPDK_VAGRANT_DISTRO
165	;;
166	arch-linux)
167		export SPDK_VAGRANT_DISTRO
168	;;
169	*)
170		echo "  Invalid argument \"${SPDK_VAGRANT_DISTRO}\""
171		echo "  Try: \"$0 -h\"" >&2
172		exit 1
173	;;
174esac
175
176if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ]; then
177	echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build"
178	DEPLOY_TEST_VM=0
179fi
180if [ -z "$NVME_FILE" ]; then
181	TMP="/var/lib/libvirt/images/nvme_disk.img"
182	NVME_DISKS_TYPE="nvme"
183else
184	TMP=""
185	for args in $NVME_FILE; do
186		while IFS=, read -r path type namespace; do
187			TMP+="$path,";
188			if [ -z "$type" ]; then
189				type="nvme"
190			fi
191			NVME_DISKS_TYPE+="$type,";
192			if [ -z "$namespace" ] && [ -n "$SPDK_QEMU_EMULATOR" ]; then
193				namespace="1"
194			fi
195			NVME_DISKS_NAMESPACES+="$namespace,";
196			if [ ${NVME_AUTO_CREATE} = 1 ]; then
197				$SPDK_DIR/scripts/vagrant/create_nvme_img.sh -t $type -n $path
198			fi
199		done <<< $args
200	done
201fi
202NVME_FILE=$TMP
203
204if [ ${VERBOSE} = 1 ]; then
205	echo
206	echo DIR=${DIR}
207	echo SPDK_DIR=${SPDK_DIR}
208	echo VAGRANT_TARGET=${VAGRANT_TARGET}
209	echo HELP=$HELP
210	echo DRY_RUN=$DRY_RUN
211	echo NVME_FILE=$NVME_FILE
212	echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE
213	echo NVME_AUTO_CREATE=$NVME_AUTO_CREATE
214	echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES
215	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
216	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
217	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
218	echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER
219	echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY
220	echo VHOST_HOST_DIR=$VHOST_HOST_DIR
221	echo VHOST_VM_DIR=$VHOST_VM_DIR
222	echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR
223	echo
224fi
225
226export SPDK_VAGRANT_HTTP_PROXY
227export SPDK_VAGRANT_VMCPU
228export SPDK_VAGRANT_VMRAM
229export SPDK_DIR
230export COPY_SPDK_DIR
231export DEPLOY_TEST_VM
232export NVME_DISKS_TYPE
233export NVME_DISKS_NAMESPACES
234export NVME_FILE
235
236if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
237    provider="--provider=${SPDK_VAGRANT_PROVIDER}"
238fi
239
240if [ -n "$VHOST_HOST_DIR" ]; then
241    export VHOST_HOST_DIR
242fi
243
244if [ -n "$VHOST_VM_DIR" ]; then
245    export VHOST_VM_DIR
246fi
247
248if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
249    export SPDK_VAGRANT_PROVIDER
250fi
251
252if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt"  ]; then
253    export SPDK_QEMU_EMULATOR
254fi
255
256if [ ${DRY_RUN} = 1 ]; then
257	echo "Environemnt Variables"
258	printenv SPDK_VAGRANT_DISTRO
259	printenv SPDK_VAGRANT_VMRAM
260	printenv SPDK_VAGRANT_VMCPU
261	printenv SPDK_VAGRANT_PROVIDER
262	printenv SPDK_VAGRANT_HTTP_PROXY
263	printenv SPDK_QEMU_EMULATOR
264	printenv NVME_DISKS_TYPE
265	printenv NVME_AUTO_CREATE
266	printenv NVME_DISKS_NAMESPACES
267	printenv NVME_FILE
268	printenv SPDK_DIR
269fi
270if [ -z "$VAGRANTFILE_DIR" ]; then
271	VAGRANTFILE_DIR="${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}"
272fi
273
274if [ -d "${VAGRANTFILE_DIR}" ]; then
275	echo "Error: ${VAGRANTFILE_DIR} already exists!"
276	exit 1
277fi
278
279if [ ${DRY_RUN} != 1 ]; then
280	mkdir -vp "${VAGRANTFILE_DIR}"
281	cp ${DIR}/Vagrantfile ${VAGRANTFILE_DIR}
282	pushd "${VAGRANTFILE_DIR}"
283	if [ -n "${http_proxy}" ]; then
284		export http_proxy
285		export https_proxy
286		if vagrant plugin list | grep -q vagrant-proxyconf; then
287			echo "vagrant-proxyconf already installed... skipping"
288		else
289			vagrant plugin install vagrant-proxyconf
290		fi
291		if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then
292			cat >~/vagrant_pkg.conf <<EOF
293pkg_env: {
294http_proxy: ${http_proxy}
295}
296EOF
297		fi
298	fi
299	vagrant up $provider
300	echo ""
301	echo "  SUCCESS!"
302	echo ""
303	echo "  cd to ${VAGRANTFILE_DIR} and type \"vagrant ssh\" to use."
304	echo "  Use vagrant \"suspend\" and vagrant \"resume\" to stop and start."
305	echo "  Use vagrant \"destroy\" followed by \"rm -rf ${VAGRANTFILE_DIR}\" to destroy all trace of vm."
306	echo ""
307fi
308