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