xref: /spdk/scripts/vagrant/create_vbox.sh (revision cc6920a4763d4b9a43aa40583c8397d8f14fa100)
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>] [-hvrldcuf] <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 "  -f                             Force use of given distro, regardless if it's supported by the script or not."
52	echo "  --box-version                  Version of the vagrant box to select for given distro."
53	echo " Examples:"
54	echo
55	echo "  $0 -x http://user:password@host:port fedora33"
56	echo "  $0 -s 2048 -n 2 ubuntu16"
57	echo "  $0 -rv freebsd"
58	echo "  $0 fedora33"
59	echo "  $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora33"
60	echo "  $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 fedora33"
61	echo
62}
63
64# Set up vagrant proxy. Assumes git-bash on Windows
65# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment
66SPDK_VAGRANT_HTTP_PROXY=""
67
68VERBOSE=0
69HELP=0
70COPY_SPDK_DIR=1
71COPY_SPDK_ARTIFACTS=0
72DRY_RUN=0
73DEPLOY_TEST_VM=0
74SPDK_VAGRANT_DISTRO="distro"
75SPDK_VAGRANT_VMCPU=4
76SPDK_VAGRANT_VMRAM=4096
77SPDK_VAGRANT_PROVIDER="virtualbox"
78SPDK_QEMU_EMULATOR=""
79SPDK_OPENSTACK_NETWORK=0
80OPTIND=1
81NVME_DISKS_TYPE=""
82NVME_DISKS_NAMESPACES=""
83NVME_FILE=""
84NVME_AUTO_CREATE=0
85VAGRANTFILE_DIR=""
86VAGRANT_PASSWORD_AUTH=0
87VAGRANT_PACKAGE_BOX=0
88VAGRANT_HUGE_MEM=0
89VAGRANTFILE=$DIR/Vagrantfile
90FORCE_DISTRO=false
91VAGRANT_BOX_VERSION=""
92
93while getopts ":b:n:s:x:p:uvcraldoHhf-:" opt; do
94	case "${opt}" in
95		-)
96			case "${OPTARG}" in
97				package-box) VAGRANT_PACKAGE_BOX=1 ;;
98				qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;;
99				vagrantfiles-dir=*) VAGRANTFILE_DIR="${OPTARG#*=}" ;;
100				vagrantfile=*) [[ -n ${OPTARG#*=} ]] && VAGRANTFILE="${OPTARG#*=}" ;;
101				box-version=*) [[ -n ${OPTARG#*=} ]] && VAGRANT_BOX_VERSION="${OPTARG#*=}" ;;
102				*) echo "Invalid argument '$OPTARG'" ;;
103			esac
104			;;
105		x)
106			http_proxy=$OPTARG
107			https_proxy=$http_proxy
108			SPDK_VAGRANT_HTTP_PROXY="${http_proxy}"
109			;;
110		n)
111			SPDK_VAGRANT_VMCPU=$OPTARG
112			;;
113		s)
114			SPDK_VAGRANT_VMRAM=$OPTARG
115			;;
116		p)
117			SPDK_VAGRANT_PROVIDER=$OPTARG
118			;;
119		v)
120			VERBOSE=1
121			;;
122		c)
123			NVME_AUTO_CREATE=1
124			;;
125		r)
126			DRY_RUN=1
127			;;
128		h)
129			display_help >&2
130			exit 0
131			;;
132		a)
133			COPY_SPDK_ARTIFACTS=1
134			;;
135		l)
136			COPY_SPDK_DIR=0
137			;;
138		d)
139			DEPLOY_TEST_VM=1
140			;;
141		o)
142			SPDK_OPENSTACK_NETWORK=1
143			;;
144		b)
145			NVME_FILE+="${OPTARG#*=} "
146			;;
147		u)
148			VAGRANT_PASSWORD_AUTH=1
149			;;
150		H)
151			VAGRANT_HUGE_MEM=1
152			;;
153		f)
154			FORCE_DISTRO=true
155			;;
156		*)
157			echo "  Invalid argument: -$OPTARG" >&2
158			echo "  Try: \"$0 -h\"" >&2
159			exit 1
160			;;
161	esac
162done
163
164shift "$((OPTIND - 1))" # Discard the options and sentinel --
165
166SPDK_VAGRANT_DISTRO="$*"
167
168case "${SPDK_VAGRANT_DISTRO}" in
169	centos[78]) ;&
170	ubuntu1[68]04 | ubuntu2004) ;&
171	fedora3[2-4]) ;&
172	freebsd1[12]) ;&
173	arch | clearlinux) ;;
174	*)
175		if [[ $FORCE_DISTRO == false ]]; then
176			echo "  Invalid argument \"${SPDK_VAGRANT_DISTRO}\"" >&2
177			echo "  Try: \"$0 -h\"" >&2
178			exit 1
179		fi
180		;;
181esac
182export SPDK_VAGRANT_DISTRO
183
184if [ -z "$NVME_FILE" ]; then
185	TMP="/var/lib/libvirt/images/nvme_disk.img"
186	NVME_DISKS_TYPE="nvme"
187else
188	TMP=""
189	for args in $NVME_FILE; do
190		while IFS=, read -r path type namespace cmb pmr; do
191			TMP+="$path,"
192			if [ -z "$type" ]; then
193				type="nvme"
194			fi
195			if [[ -n $cmb ]]; then
196				NVME_CMB=${NVME_CMB:+$NVME_CMB,}$cmb
197			fi
198			if [[ -n $pmr ]]; then
199				NVME_PMR=${NVME_PMR:+$NVME_PMR,}$pmr
200			fi
201			NVME_DISKS_TYPE+="$type,"
202			if [ -z "$namespace" ] && [ -n "$SPDK_QEMU_EMULATOR" ]; then
203				namespace="1"
204			fi
205			NVME_DISKS_NAMESPACES+="$namespace,"
206			if [ ${NVME_AUTO_CREATE} = 1 ]; then
207				$SPDK_DIR/scripts/vagrant/create_nvme_img.sh -t $type -n $path
208			fi
209		done <<< $args
210	done
211fi
212NVME_FILE=$TMP
213
214if [ ${VERBOSE} = 1 ]; then
215	echo
216	echo DIR=${DIR}
217	echo SPDK_DIR=${SPDK_DIR}
218	echo VAGRANT_TARGET=${VAGRANT_TARGET}
219	echo HELP=$HELP
220	echo DRY_RUN=$DRY_RUN
221	echo NVME_FILE=$NVME_FILE
222	echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE
223	echo NVME_AUTO_CREATE=$NVME_AUTO_CREATE
224	echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES
225	echo NVME_CMB=$NVME_CMB
226	echo NVME_PMR=$NVME_PMR
227	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
228	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
229	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
230	echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER
231	echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY
232	echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR
233	echo SPDK_OPENSTACK_NETWORK=$SPDK_OPENSTACK_NETWORK
234	echo VAGRANT_PACKAGE_BOX=$VAGRANT_PACKAGE_BOX
235	echo VAGRANTFILE=$VAGRANTFILE
236	echo FORCE_DISTRO=$FORCE_DISTRO
237	echo VAGRANT_BOX_VERSION=$VAGRANT_BOX_VERSION
238	echo
239fi
240
241export SPDK_VAGRANT_HTTP_PROXY
242export SPDK_VAGRANT_VMCPU
243export SPDK_VAGRANT_VMRAM
244export SPDK_DIR
245export SPDK_OPENSTACK_NETWORK
246export COPY_SPDK_DIR
247export COPY_SPDK_ARTIFACTS
248export DEPLOY_TEST_VM
249export NVME_CMB
250export NVME_PMR
251export NVME_DISKS_TYPE
252export NVME_DISKS_NAMESPACES
253export NVME_FILE
254export VAGRANT_PASSWORD_AUTH
255export VAGRANT_HUGE_MEM
256export FORCE_DISTRO
257export VAGRANT_BOX_VERSION
258
259if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
260	provider="--provider=${SPDK_VAGRANT_PROVIDER}"
261fi
262
263if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
264	export SPDK_VAGRANT_PROVIDER
265fi
266
267if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt" ]; then
268	export SPDK_QEMU_EMULATOR
269fi
270
271if [ ${DRY_RUN} = 1 ]; then
272	echo "Environemnt Variables"
273	printenv SPDK_VAGRANT_DISTRO
274	printenv SPDK_VAGRANT_VMRAM
275	printenv SPDK_VAGRANT_VMCPU
276	printenv SPDK_VAGRANT_PROVIDER
277	printenv SPDK_VAGRANT_HTTP_PROXY
278	printenv SPDK_QEMU_EMULATOR
279	printenv NVME_DISKS_TYPE
280	printenv NVME_AUTO_CREATE
281	printenv NVME_DISKS_NAMESPACES
282	printenv NVME_FILE
283	printenv SPDK_DIR
284	printenv VAGRANT_HUGE_MEM
285	printenv VAGRANTFILE
286	printenv FORCE_DISTRO
287	printenv VAGRANT_BOX_VERSION
288fi
289if [ -z "$VAGRANTFILE_DIR" ]; then
290	VAGRANTFILE_DIR="${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}"
291	export VAGRANTFILE_DIR
292fi
293
294if [ -d "${VAGRANTFILE_DIR}" ]; then
295	echo "Error: ${VAGRANTFILE_DIR} already exists!"
296	exit 1
297fi
298
299if [[ ! -f $VAGRANTFILE ]]; then
300	echo "$VAGRANTFILE is not a regular file!"
301	exit 1
302fi
303
304if [ ${DRY_RUN} != 1 ]; then
305	mkdir -vp "${VAGRANTFILE_DIR}"
306	ln -s "$VAGRANTFILE" "${VAGRANTFILE_DIR}/Vagrantfile"
307	pushd "${VAGRANTFILE_DIR}"
308	if [ -n "${http_proxy}" ]; then
309		export http_proxy
310		export https_proxy
311		if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then
312			cat > ~/vagrant_pkg.conf << EOF
313pkg_env: {
314http_proxy: ${http_proxy}
315}
316EOF
317		fi
318	fi
319	mkdir -p "${VAGRANTFILE_DIR}/output"
320	vagrant up $provider
321	if [ ${VAGRANT_PACKAGE_BOX} == 1 ]; then
322		vagrant ssh -c 'sudo spdk_repo/spdk/scripts/vagrant/update.sh'
323		vagrant halt
324		vagrant package --output spdk_${SPDK_VAGRANT_DISTRO}.box
325		vagrant box add spdk/${SPDK_VAGRANT_DISTRO} spdk_${SPDK_VAGRANT_DISTRO}.box \
326			&& rm spdk_${SPDK_VAGRANT_DISTRO}.box
327		vagrant destroy
328	fi
329	echo ""
330	echo "  SUCCESS!"
331	echo ""
332	echo "  cd to ${VAGRANTFILE_DIR} and type \"vagrant ssh\" to use."
333	echo "  Use vagrant \"suspend\" and vagrant \"resume\" to stop and start."
334	echo "  Use vagrant \"destroy\" followed by \"rm -rf ${VAGRANTFILE_DIR}\" to destroy all trace of vm."
335	echo ""
336fi
337