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>] [-hvrld] <distro>" 21 echo 22 echo " distro = <centos7 | centos8| ubuntu16 | ubuntu18 |" 23 echo " fedora29 | fedora 30 | fedora 31 | freebsd11 | freebsd12>" 24 echo 25 echo " -b <nvme-backing-file> nvme file path with name" 26 echo " type of emulated nvme disk" 27 echo " usage: type <number_of_namespaces> types available: ocssd, nvme" 28 echo " If no -b option is specified then this option defaults to emulating single" 29 echo " NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img" 30 echo " -c create all above disk, default 0" 31 echo " -s <ram-size> in kb default: ${SPDK_VAGRANT_VMRAM}" 32 echo " -n <num-cpus> 1 to 4 default: ${SPDK_VAGRANT_VMCPU}" 33 echo " -x <http-proxy> default: \"${SPDK_VAGRANT_HTTP_PROXY}\"" 34 echo " -p <provider> libvirt or virtualbox" 35 echo " --vhost-host-dir=<path> directory path with vhost test dependencies" 36 echo " (test VM qcow image, fio binary, ssh keys)" 37 echo " --vhost-vm-dir=<path> directory where to put vhost dependencies in VM" 38 echo " --qemu-emulator=<path> directory path with emulator, default: ${SPDK_QEMU_EMULATOR}" 39 echo " --vagrantfiles-dir=<path> directory to put vagrantfile" 40 echo " -r dry-run" 41 echo " -l use a local copy of spdk, don't try to rsync from the host." 42 echo " -d deploy a test vm by provisioning all prerequisites for spdk autotest" 43 echo " -h help" 44 echo " -v verbose" 45 echo 46 echo " Examples:" 47 echo 48 echo " $0 -x http://user:password@host:port fedora30" 49 echo " $0 -s 2048 -n 2 ubuntu16" 50 echo " $0 -rv freebsd" 51 echo " $0 fedora30" 52 echo " $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora30" 53 echo " $0 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30" 54 echo " $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30" 55 echo 56} 57 58# Set up vagrant proxy. Assumes git-bash on Windows 59# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment 60SPDK_VAGRANT_HTTP_PROXY="" 61 62VERBOSE=0 63HELP=0 64COPY_SPDK_DIR=1 65DRY_RUN=0 66DEPLOY_TEST_VM=0 67SPDK_VAGRANT_DISTRO="distro" 68SPDK_VAGRANT_VMCPU=4 69SPDK_VAGRANT_VMRAM=4096 70SPDK_VAGRANT_PROVIDER="virtualbox" 71SPDK_QEMU_EMULATOR="" 72OPTIND=1 73NVME_DISKS_TYPE="" 74NVME_DISKS_NAMESPACES="" 75NVME_FILE="" 76NVME_AUTO_CREATE=0 77VAGRANTFILE_DIR="" 78 79while getopts ":b:n:s:x:p:vcrldh-:" opt; do 80 case "${opt}" in 81 -) 82 case "${OPTARG}" in 83 vhost-host-dir=*) VHOST_HOST_DIR="${OPTARG#*=}" ;; 84 vhost-vm-dir=*) VHOST_VM_DIR="${OPTARG#*=}" ;; 85 qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;; 86 vagrantfiles-dir=*) VAGRANTFILE_DIR="${OPTARG#*=}" ;; 87 *) echo "Invalid argument '$OPTARG'" ;; 88 esac 89 ;; 90 x) 91 http_proxy=$OPTARG 92 https_proxy=$http_proxy 93 SPDK_VAGRANT_HTTP_PROXY="${http_proxy}" 94 ;; 95 n) 96 SPDK_VAGRANT_VMCPU=$OPTARG 97 ;; 98 s) 99 SPDK_VAGRANT_VMRAM=$OPTARG 100 ;; 101 p) 102 SPDK_VAGRANT_PROVIDER=$OPTARG 103 ;; 104 v) 105 VERBOSE=1 106 ;; 107 c) 108 NVME_AUTO_CREATE=1 109 ;; 110 r) 111 DRY_RUN=1 112 ;; 113 h) 114 display_help >&2 115 exit 0 116 ;; 117 l) 118 COPY_SPDK_DIR=0 119 ;; 120 d) 121 DEPLOY_TEST_VM=1 122 ;; 123 b) 124 NVME_FILE+="${OPTARG#*=} " 125 ;; 126 *) 127 echo " Invalid argument: -$OPTARG" >&2 128 echo " Try: \"$0 -h\"" >&2 129 exit 1 130 ;; 131 esac 132done 133 134shift "$((OPTIND-1))" # Discard the options and sentinel -- 135 136SPDK_VAGRANT_DISTRO="$*" 137 138case "${SPDK_VAGRANT_DISTRO}" in 139 centos7) 140 export SPDK_VAGRANT_DISTRO 141 ;; 142 centos8) 143 export SPDK_VAGRANT_DISTRO 144 ;; 145 ubuntu16) 146 export SPDK_VAGRANT_DISTRO 147 ;; 148 ubuntu18) 149 export SPDK_VAGRANT_DISTRO 150 ;; 151 fedora29) 152 export SPDK_VAGRANT_DISTRO 153 ;; 154 fedora30) 155 export SPDK_VAGRANT_DISTRO 156 ;; 157 fedora31) 158 export SPDK_VAGRANT_DISTRO 159 ;; 160 freebsd11) 161 export SPDK_VAGRANT_DISTRO 162 ;; 163 freebsd12) 164 export SPDK_VAGRANT_DISTRO 165 ;; 166 arch-linux) 167 export SPDK_VAGRANT_DISTRO 168 ;; 169 *) 170 echo " Invalid argument \"${SPDK_VAGRANT_DISTRO}\"" 171 echo " Try: \"$0 -h\"" >&2 172 exit 1 173 ;; 174esac 175 176if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ]; then 177 echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build" 178 DEPLOY_TEST_VM=0 179fi 180if [ -z "$NVME_FILE" ]; then 181 TMP="/var/lib/libvirt/images/nvme_disk.img" 182 NVME_DISKS_TYPE="nvme" 183else 184 TMP="" 185 for args in $NVME_FILE; do 186 while IFS=, read -r path type namespace; do 187 TMP+="$path,"; 188 if [ -z "$type" ]; then 189 type="nvme" 190 fi 191 NVME_DISKS_TYPE+="$type,"; 192 if [ -z "$namespace" ] && [ -n "$SPDK_QEMU_EMULATOR" ]; then 193 namespace="1" 194 fi 195 NVME_DISKS_NAMESPACES+="$namespace,"; 196 if [ ${NVME_AUTO_CREATE} = 1 ]; then 197 $SPDK_DIR/scripts/vagrant/create_nvme_img.sh -t $type -n $path 198 fi 199 done <<< $args 200 done 201fi 202NVME_FILE=$TMP 203 204if [ ${VERBOSE} = 1 ]; then 205 echo 206 echo DIR=${DIR} 207 echo SPDK_DIR=${SPDK_DIR} 208 echo VAGRANT_TARGET=${VAGRANT_TARGET} 209 echo HELP=$HELP 210 echo DRY_RUN=$DRY_RUN 211 echo NVME_FILE=$NVME_FILE 212 echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE 213 echo NVME_AUTO_CREATE=$NVME_AUTO_CREATE 214 echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES 215 echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO 216 echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU 217 echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM 218 echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER 219 echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY 220 echo VHOST_HOST_DIR=$VHOST_HOST_DIR 221 echo VHOST_VM_DIR=$VHOST_VM_DIR 222 echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR 223 echo 224fi 225 226export SPDK_VAGRANT_HTTP_PROXY 227export SPDK_VAGRANT_VMCPU 228export SPDK_VAGRANT_VMRAM 229export SPDK_DIR 230export COPY_SPDK_DIR 231export DEPLOY_TEST_VM 232export NVME_DISKS_TYPE 233export NVME_DISKS_NAMESPACES 234export NVME_FILE 235 236if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 237 provider="--provider=${SPDK_VAGRANT_PROVIDER}" 238fi 239 240if [ -n "$VHOST_HOST_DIR" ]; then 241 export VHOST_HOST_DIR 242fi 243 244if [ -n "$VHOST_VM_DIR" ]; then 245 export VHOST_VM_DIR 246fi 247 248if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 249 export SPDK_VAGRANT_PROVIDER 250fi 251 252if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt" ]; then 253 export SPDK_QEMU_EMULATOR 254fi 255 256if [ ${DRY_RUN} = 1 ]; then 257 echo "Environemnt Variables" 258 printenv SPDK_VAGRANT_DISTRO 259 printenv SPDK_VAGRANT_VMRAM 260 printenv SPDK_VAGRANT_VMCPU 261 printenv SPDK_VAGRANT_PROVIDER 262 printenv SPDK_VAGRANT_HTTP_PROXY 263 printenv SPDK_QEMU_EMULATOR 264 printenv NVME_DISKS_TYPE 265 printenv NVME_AUTO_CREATE 266 printenv NVME_DISKS_NAMESPACES 267 printenv NVME_FILE 268 printenv SPDK_DIR 269fi 270if [ -z "$VAGRANTFILE_DIR" ]; then 271 VAGRANTFILE_DIR="${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" 272fi 273 274if [ -d "${VAGRANTFILE_DIR}" ]; then 275 echo "Error: ${VAGRANTFILE_DIR} already exists!" 276 exit 1 277fi 278 279if [ ${DRY_RUN} != 1 ]; then 280 mkdir -vp "${VAGRANTFILE_DIR}" 281 cp ${DIR}/Vagrantfile ${VAGRANTFILE_DIR} 282 pushd "${VAGRANTFILE_DIR}" 283 if [ -n "${http_proxy}" ]; then 284 export http_proxy 285 export https_proxy 286 if vagrant plugin list | grep -q vagrant-proxyconf; then 287 echo "vagrant-proxyconf already installed... skipping" 288 else 289 vagrant plugin install vagrant-proxyconf 290 fi 291 if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then 292 cat >~/vagrant_pkg.conf <<EOF 293pkg_env: { 294http_proxy: ${http_proxy} 295} 296EOF 297 fi 298 fi 299 vagrant up $provider 300 echo "" 301 echo " SUCCESS!" 302 echo "" 303 echo " cd to ${VAGRANTFILE_DIR} and type \"vagrant ssh\" to use." 304 echo " Use vagrant \"suspend\" and vagrant \"resume\" to stop and start." 305 echo " Use vagrant \"destroy\" followed by \"rm -rf ${VAGRANTFILE_DIR}\" to destroy all trace of vm." 306 echo "" 307fi 308