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