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 10VAGRANT_TARGET="$PWD" 11 12DIR="$( cd "$( dirname $0 )" && pwd )" 13SPDK_DIR="$( cd "${DIR}/../../" && pwd )" 14 15# The command line help 16display_help() { 17 echo 18 echo " Usage: ${0##*/} [-b nvme-backing-file] [-n <num-cpus>] [-s <ram-size>] [-x <http-proxy>] [-hvrld] <distro>" 19 echo 20 echo " distro = <centos7 | ubuntu16 | ubuntu18 | fedora28 | fedora29 | fedora 30 | freebsd11> " 21 echo 22 echo " -b <nvme-backing-file> default: ${NVME_FILE}" 23 echo " -s <ram-size> in kb default: ${SPDK_VAGRANT_VMRAM}" 24 echo " -n <num-cpus> 1 to 4 default: ${SPDK_VAGRANT_VMCPU}" 25 echo " -x <http-proxy> default: \"${SPDK_VAGRANT_HTTP_PROXY}\"" 26 echo " -p <provider> libvirt or virtualbox" 27 echo " --vhost-host-dir=<path> directory path with vhost test dependencies" 28 echo " (test VM qcow image, fio binary, ssh keys)" 29 echo " --vhost-vm-dir=<path> directory where to put vhost dependencies in VM" 30 echo " --qemu-emulator=<path> directory path with emulator, default: ${SPDK_QEMU_EMULATOR}" 31 echo " -r dry-run" 32 echo " -l use a local copy of spdk, don't try to rsync from the host." 33 echo " -d deploy a test vm by provisioning all prerequisites for spdk autotest" 34 echo " -h help" 35 echo " -v verbose" 36 echo 37 echo " Examples:" 38 echo 39 echo " $0 -x http://user:password@host:port fedora28" 40 echo " $0 -s 2048 -n 2 ubuntu16" 41 echo " $0 -rv freebsd" 42 echo " $0 fedora28 " 43 echo 44} 45 46# Set up vagrant proxy. Assumes git-bash on Windows 47# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment 48SPDK_VAGRANT_HTTP_PROXY="" 49 50VERBOSE=0 51HELP=0 52COPY_SPDK_DIR=1 53DRY_RUN=0 54DEPLOY_TEST_VM=0 55SPDK_VAGRANT_DISTRO="distro" 56SPDK_VAGRANT_VMCPU=4 57SPDK_VAGRANT_VMRAM=4096 58SPDK_VAGRANT_PROVIDER="virtualbox" 59SPDK_QEMU_EMULATOR="" 60OPTIND=1 61NVME_FILE="nvme_disk.img" 62 63while getopts ":b:n:s:x:p:vrldh-:" opt; do 64 case "${opt}" in 65 -) 66 case "${OPTARG}" in 67 vhost-host-dir=*) VHOST_HOST_DIR="${OPTARG#*=}" ;; 68 vhost-vm-dir=*) VHOST_VM_DIR="${OPTARG#*=}" ;; 69 qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;; 70 *) echo "Invalid argument '$OPTARG'" ;; 71 esac 72 ;; 73 x) 74 http_proxy=$OPTARG 75 https_proxy=$http_proxy 76 SPDK_VAGRANT_HTTP_PROXY="${http_proxy}" 77 ;; 78 n) 79 SPDK_VAGRANT_VMCPU=$OPTARG 80 ;; 81 s) 82 SPDK_VAGRANT_VMRAM=$OPTARG 83 ;; 84 p) 85 SPDK_VAGRANT_PROVIDER=$OPTARG 86 ;; 87 v) 88 VERBOSE=1 89 ;; 90 r) 91 DRY_RUN=1 92 ;; 93 h) 94 display_help >&2 95 exit 0 96 ;; 97 l) 98 COPY_SPDK_DIR=0 99 ;; 100 d) 101 DEPLOY_TEST_VM=1 102 ;; 103 b) 104 NVME_FILE=$OPTARG 105 ;; 106 *) 107 echo " Invalid argument: -$OPTARG" >&2 108 echo " Try: \"$0 -h\"" >&2 109 exit 1 110 ;; 111 esac 112done 113 114shift "$((OPTIND-1))" # Discard the options and sentinel -- 115 116SPDK_VAGRANT_DISTRO="$@" 117 118case "$SPDK_VAGRANT_DISTRO" in 119 centos7) 120 export SPDK_VAGRANT_DISTRO 121 ;; 122 ubuntu16) 123 export SPDK_VAGRANT_DISTRO 124 ;; 125 ubuntu18) 126 export SPDK_VAGRANT_DISTRO 127 ;; 128 fedora28) 129 export SPDK_VAGRANT_DISTRO 130 ;; 131 fedora29) 132 export SPDK_VAGRANT_DISTRO 133 ;; 134 fedora30) 135 export SPDK_VAGRANT_DISTRO 136 ;; 137 freebsd11) 138 export SPDK_VAGRANT_DISTRO 139 ;; 140 arch-linux) 141 export SPDK_VAGRANT_DISTRO 142 ;; 143 *) 144 echo " Invalid argument \"${SPDK_VAGRANT_DISTRO}\"" 145 echo " Try: \"$0 -h\"" >&2 146 exit 1 147 ;; 148esac 149 150if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ]; then 151 echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build" 152 DEPLOY_TEST_VM=0 153fi 154 155if [ ${VERBOSE} = 1 ]; then 156 echo 157 echo DIR=${DIR} 158 echo SPDK_DIR=${SPDK_DIR} 159 echo VAGRANT_TARGET=${VAGRANT_TARGET} 160 echo HELP=$HELP 161 echo DRY_RUN=$DRY_RUN 162 echo NVME_FILE=$NVME_FILE 163 echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO 164 echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU 165 echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM 166 echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER 167 echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY 168 echo VHOST_HOST_DIR=$VHOST_HOST_DIR 169 echo VHOST_VM_DIR=$VHOST_VM_DIR 170 echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR 171 echo 172fi 173 174export SPDK_VAGRANT_HTTP_PROXY 175export SPDK_VAGRANT_VMCPU 176export SPDK_VAGRANT_VMRAM 177export SPDK_DIR 178export COPY_SPDK_DIR 179export DEPLOY_TEST_VM 180export NVME_FILE 181 182if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 183 provider="--provider=${SPDK_VAGRANT_PROVIDER}" 184fi 185 186if [ -n "$VHOST_HOST_DIR" ]; then 187 export VHOST_HOST_DIR 188fi 189 190if [ -n "$VHOST_VM_DIR" ]; then 191 export VHOST_VM_DIR 192fi 193 194if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 195 export SPDK_VAGRANT_PROVIDER 196fi 197 198if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt" ]; then 199 export SPDK_QEMU_EMULATOR 200fi 201 202if [ ${DRY_RUN} = 1 ]; then 203 echo "Environemnt Variables" 204 printenv SPDK_VAGRANT_DISTRO 205 printenv SPDK_VAGRANT_VMRAM 206 printenv SPDK_VAGRANT_VMCPU 207 printenv SPDK_VAGRANT_PROVIDER 208 printenv SPDK_VAGRANT_HTTP_PROXY 209 printenv SPDK_QEMU_EMULATOR 210 printenv SPDK_DIR 211fi 212 213if [ -d "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" ]; then 214 echo "Error: ${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER} already exists!" 215 exit 1 216fi 217 218if [ ${DRY_RUN} != 1 ]; then 219 mkdir -vp "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" 220 cp ${DIR}/Vagrantfile ${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER} 221 pushd "${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" 222 if [ -n "${http_proxy}" ]; then 223 export http_proxy 224 export https_proxy 225 if vagrant plugin list | grep -q vagrant-proxyconf; then 226 echo "vagrant-proxyconf already installed... skipping" 227 else 228 vagrant plugin install vagrant-proxyconf 229 fi 230 if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then 231 cat >~/vagrant_pkg.conf <<EOF 232pkg_env: { 233http_proxy: ${http_proxy} 234} 235EOF 236 fi 237 fi 238 vagrant up $provider 239 echo "" 240 echo " SUCCESS!" 241 echo "" 242 echo " cd to ${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER} and type \"vagrant ssh\" to use." 243 echo " Use vagrant \"suspend\" and vagrant \"resume\" to stop and start." 244 echo " Use vagrant \"destroy\" followed by \"rm -rf ${SPDK_VAGRANT_DISTRO}\" to destroy all trace of vm." 245 echo "" 246fi 247