xref: /spdk/scripts/vagrant/create_vbox.sh (revision ffaec5f91c22d9dc7ea2424a1304d7270ae06c3b)
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>] [-hvrldcu] <distro>"
21	echo
22	echo "  distro = <centos7 | centos8| ubuntu1604 | ubuntu1804 | ubuntu2004 |"
23	echo "            fedora32 | fedora33 | fedora34 | freebsd11 | freebsd12 | arch | clearlinux>"
24	echo
25	echo "  -s <ram-size> in MB             Default: ${SPDK_VAGRANT_VMRAM}"
26	echo "  -n <num-cpus> 1 to 4            Default: ${SPDK_VAGRANT_VMCPU}"
27	echo "  -x <http-proxy>                 Default: \"${SPDK_VAGRANT_HTTP_PROXY}\""
28	echo "  -p <provider>                   \"libvirt\" or \"virtualbox\". Default: ${SPDK_VAGRANT_PROVIDER}"
29	echo "  -b <nvme-backing-file>          Emulated NVMe options."
30	echo "                                  If no -b option is specified then this option defaults to emulating single"
31	echo "                                  NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img"
32	echo "                                  -b option can be used multiple times for attaching multiple files to the VM"
33	echo "                                  Parameters for -b option: <path>,<type>,<namespaces>,<cmb>,<pmr_file[:pmr_size]>"
34	echo "                                  Available types: nvme"
35	echo "                                  Default pmr size: 16M"
36	echo "                                  Default cmb: false"
37	echo "  -c                              Create all above disk, default 0"
38	echo "  -H                              Use hugepages for allocating VM memory. Only for libvirt provider. Default: false."
39	echo "  -u                              Use password authentication to the VM instead of SSH keys."
40	echo "  -l                              Use a local copy of spdk, don't try to rsync from the host."
41	echo "  -a                              Copy spdk/autorun.sh artifacts from VM to host system."
42	echo "  -d                              Deploy a test vm by provisioning all prerequisites for spdk autotest"
43	echo "  -o                              Add network interface for openstack tests"
44	echo "  --qemu-emulator=<path>          Path to custom QEMU binary. Only works with libvirt provider"
45	echo "  --vagrantfiles-dir=<path>       Destination directory to put Vagrantfile into."
46	echo "  --package-box                   Install all dependencies for SPDK and create a local vagrant box version."
47	echo " --vagrantfile=<path>             Path to a custom Vagrantfile"
48	echo "  -r dry-run"
49	echo "  -h help"
50	echo "  -v verbose"
51	echo
52	echo " Examples:"
53	echo
54	echo "  $0 -x http://user:password@host:port fedora33"
55	echo "  $0 -s 2048 -n 2 ubuntu16"
56	echo "  $0 -rv freebsd"
57	echo "  $0 fedora33"
58	echo "  $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora33"
59	echo "  $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 fedora33"
60	echo
61}
62
63# Set up vagrant proxy. Assumes git-bash on Windows
64# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment
65SPDK_VAGRANT_HTTP_PROXY=""
66
67VERBOSE=0
68HELP=0
69COPY_SPDK_DIR=1
70COPY_SPDK_ARTIFACTS=0
71DRY_RUN=0
72DEPLOY_TEST_VM=0
73SPDK_VAGRANT_DISTRO="distro"
74SPDK_VAGRANT_VMCPU=4
75SPDK_VAGRANT_VMRAM=4096
76SPDK_VAGRANT_PROVIDER="virtualbox"
77SPDK_QEMU_EMULATOR=""
78SPDK_OPENSTACK_NETWORK=0
79OPTIND=1
80NVME_DISKS_TYPE=""
81NVME_DISKS_NAMESPACES=""
82NVME_FILE=""
83NVME_AUTO_CREATE=0
84VAGRANTFILE_DIR=""
85VAGRANT_PASSWORD_AUTH=0
86VAGRANT_PACKAGE_BOX=0
87VAGRANT_HUGE_MEM=0
88VAGRANTFILE=$DIR/Vagrantfile
89
90while getopts ":b:n:s:x:p:uvcraldoHh-:" opt; do
91	case "${opt}" in
92		-)
93			case "${OPTARG}" in
94				package-box) VAGRANT_PACKAGE_BOX=1 ;;
95				qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;;
96				vagrantfiles-dir=*) VAGRANTFILE_DIR="${OPTARG#*=}" ;;
97				vagrantfile=*) [[ -n ${OPTARG#*=} ]] && VAGRANTFILE="${OPTARG#*=}" ;;
98				*) echo "Invalid argument '$OPTARG'" ;;
99			esac
100			;;
101		x)
102			http_proxy=$OPTARG
103			https_proxy=$http_proxy
104			SPDK_VAGRANT_HTTP_PROXY="${http_proxy}"
105			;;
106		n)
107			SPDK_VAGRANT_VMCPU=$OPTARG
108			;;
109		s)
110			SPDK_VAGRANT_VMRAM=$OPTARG
111			;;
112		p)
113			SPDK_VAGRANT_PROVIDER=$OPTARG
114			;;
115		v)
116			VERBOSE=1
117			;;
118		c)
119			NVME_AUTO_CREATE=1
120			;;
121		r)
122			DRY_RUN=1
123			;;
124		h)
125			display_help >&2
126			exit 0
127			;;
128		a)
129			COPY_SPDK_ARTIFACTS=1
130			;;
131		l)
132			COPY_SPDK_DIR=0
133			;;
134		d)
135			DEPLOY_TEST_VM=1
136			;;
137		o)
138			SPDK_OPENSTACK_NETWORK=1
139			;;
140		b)
141			NVME_FILE+="${OPTARG#*=} "
142			;;
143		u)
144			VAGRANT_PASSWORD_AUTH=1
145			;;
146		H)
147			VAGRANT_HUGE_MEM=1
148			;;
149		*)
150			echo "  Invalid argument: -$OPTARG" >&2
151			echo "  Try: \"$0 -h\"" >&2
152			exit 1
153			;;
154	esac
155done
156
157shift "$((OPTIND - 1))" # Discard the options and sentinel --
158
159SPDK_VAGRANT_DISTRO="$*"
160
161case "${SPDK_VAGRANT_DISTRO}" in
162	centos[78]) ;&
163	ubuntu1[68]04 | ubuntu2004) ;&
164	fedora3[2-4]) ;&
165	freebsd1[12]) ;&
166	arch | clearlinux)
167		export SPDK_VAGRANT_DISTRO
168		;;
169	*)
170		echo "  Invalid argument \"${SPDK_VAGRANT_DISTRO}\"" >&2
171		echo "  Try: \"$0 -h\"" >&2
172		exit 1
173		;;
174esac
175
176if [ -z "$NVME_FILE" ]; then
177	TMP="/var/lib/libvirt/images/nvme_disk.img"
178	NVME_DISKS_TYPE="nvme"
179else
180	TMP=""
181	for args in $NVME_FILE; do
182		while IFS=, read -r path type namespace cmb pmr; do
183			TMP+="$path,"
184			if [ -z "$type" ]; then
185				type="nvme"
186			fi
187			if [[ -n $cmb ]]; then
188				NVME_CMB=${NVME_CMB:+$NVME_CMB,}$cmb
189			fi
190			if [[ -n $pmr ]]; then
191				NVME_PMR=${NVME_PMR:+$NVME_PMR,}$pmr
192			fi
193			NVME_DISKS_TYPE+="$type,"
194			if [ -z "$namespace" ] && [ -n "$SPDK_QEMU_EMULATOR" ]; then
195				namespace="1"
196			fi
197			NVME_DISKS_NAMESPACES+="$namespace,"
198			if [ ${NVME_AUTO_CREATE} = 1 ]; then
199				$SPDK_DIR/scripts/vagrant/create_nvme_img.sh -t $type -n $path
200			fi
201		done <<< $args
202	done
203fi
204NVME_FILE=$TMP
205
206if [ ${VERBOSE} = 1 ]; then
207	echo
208	echo DIR=${DIR}
209	echo SPDK_DIR=${SPDK_DIR}
210	echo VAGRANT_TARGET=${VAGRANT_TARGET}
211	echo HELP=$HELP
212	echo DRY_RUN=$DRY_RUN
213	echo NVME_FILE=$NVME_FILE
214	echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE
215	echo NVME_AUTO_CREATE=$NVME_AUTO_CREATE
216	echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES
217	echo NVME_CMB=$NVME_CMB
218	echo NVME_PMR=$NVME_PMR
219	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
220	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
221	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
222	echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER
223	echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY
224	echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR
225	echo SPDK_OPENSTACK_NETWORK=$SPDK_OPENSTACK_NETWORK
226	echo VAGRANT_PACKAGE_BOX=$VAGRANT_PACKAGE_BOX
227	echo VAGRANTFILE=$VAGRANTFILE
228	echo
229fi
230
231export SPDK_VAGRANT_HTTP_PROXY
232export SPDK_VAGRANT_VMCPU
233export SPDK_VAGRANT_VMRAM
234export SPDK_DIR
235export SPDK_OPENSTACK_NETWORK
236export COPY_SPDK_DIR
237export COPY_SPDK_ARTIFACTS
238export DEPLOY_TEST_VM
239export NVME_CMB
240export NVME_PMR
241export NVME_DISKS_TYPE
242export NVME_DISKS_NAMESPACES
243export NVME_FILE
244export VAGRANT_PASSWORD_AUTH
245export VAGRANT_HUGE_MEM
246
247if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
248	provider="--provider=${SPDK_VAGRANT_PROVIDER}"
249fi
250
251if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
252	export SPDK_VAGRANT_PROVIDER
253fi
254
255if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt" ]; then
256	export SPDK_QEMU_EMULATOR
257fi
258
259if [ ${DRY_RUN} = 1 ]; then
260	echo "Environemnt Variables"
261	printenv SPDK_VAGRANT_DISTRO
262	printenv SPDK_VAGRANT_VMRAM
263	printenv SPDK_VAGRANT_VMCPU
264	printenv SPDK_VAGRANT_PROVIDER
265	printenv SPDK_VAGRANT_HTTP_PROXY
266	printenv SPDK_QEMU_EMULATOR
267	printenv NVME_DISKS_TYPE
268	printenv NVME_AUTO_CREATE
269	printenv NVME_DISKS_NAMESPACES
270	printenv NVME_FILE
271	printenv SPDK_DIR
272	printenv VAGRANT_HUGE_MEM
273	printenv VAGRANTFILE
274fi
275if [ -z "$VAGRANTFILE_DIR" ]; then
276	VAGRANTFILE_DIR="${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}"
277	export VAGRANTFILE_DIR
278fi
279
280if [ -d "${VAGRANTFILE_DIR}" ]; then
281	echo "Error: ${VAGRANTFILE_DIR} already exists!"
282	exit 1
283fi
284
285if [[ ! -f $VAGRANTFILE ]]; then
286	echo "$VAGRANTFILE is not a regular file!"
287	exit 1
288fi
289
290if [ ${DRY_RUN} != 1 ]; then
291	mkdir -vp "${VAGRANTFILE_DIR}"
292	ln -s "$VAGRANTFILE" "${VAGRANTFILE_DIR}/Vagrantfile"
293	pushd "${VAGRANTFILE_DIR}"
294	if [ -n "${http_proxy}" ]; then
295		export http_proxy
296		export https_proxy
297		if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then
298			cat > ~/vagrant_pkg.conf << EOF
299pkg_env: {
300http_proxy: ${http_proxy}
301}
302EOF
303		fi
304	fi
305	mkdir -p "${VAGRANTFILE_DIR}/output"
306	vagrant up $provider
307	if [ ${VAGRANT_PACKAGE_BOX} == 1 ]; then
308		vagrant ssh -c 'sudo spdk_repo/spdk/scripts/vagrant/update.sh'
309		vagrant halt
310		vagrant package --output spdk_${SPDK_VAGRANT_DISTRO}.box
311		vagrant box add spdk/${SPDK_VAGRANT_DISTRO} spdk_${SPDK_VAGRANT_DISTRO}.box \
312			&& rm spdk_${SPDK_VAGRANT_DISTRO}.box
313		vagrant destroy
314	fi
315	echo ""
316	echo "  SUCCESS!"
317	echo ""
318	echo "  cd to ${VAGRANTFILE_DIR} and type \"vagrant ssh\" to use."
319	echo "  Use vagrant \"suspend\" and vagrant \"resume\" to stop and start."
320	echo "  Use vagrant \"destroy\" followed by \"rm -rf ${VAGRANTFILE_DIR}\" to destroy all trace of vm."
321	echo ""
322fi
323