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