Commit ff231506 authored by Maciej Wawryk's avatar Maciej Wawryk Committed by Tomasz Zawadzki
Browse files

scripts/vagrant: Add more NVMe emulation options



Current scripts/vagrant allow us to create only a single file for
emulating NVMe with single namespace.
This patch allow to create multiple emulated drives with multiple namespaces.
This patch also allows to emulate OCSSD disks which are used in OCF tests.

Change-Id: Ia7a4667bd405ba18235e72bcdf608270002b5242
Signed-off-by: default avatarMaciej Wawryk <maciejx.wawryk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/466555


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarSeth Howell <seth.howell@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 8cad9cc1
Loading
Loading
Loading
Loading
+37 −12
Original line number Diff line number Diff line
@@ -98,6 +98,9 @@ Vagrant.configure(2) do |config|
  vhost_host_dir=(ENV['VHOST_HOST_DIR'] || "none")
  vhost_vm_dir=(ENV['VHOST_VM_DIR'] || "none")
  vmemulator=(ENV['SPDK_QEMU_EMULATOR'] || "")
  emulated_nvme_types=(ENV['NVME_DISKS_TYPE'] || "nvme").split(',')
  nvme_namespaces=(ENV['NVME_DISKS_NAMESPACES'] || "").split(',')
  nvme_file=(ENV['NVME_FILE'] || "").split(',')

  config.ssh.forward_agent = true
  config.ssh.forward_x11 = true
@@ -131,8 +134,12 @@ Vagrant.configure(2) do |config|

    # we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems
    # and to be able to run vagrant from user $HOME directory

    # Loop to create all emulated disks set
    emulated_nvme_types.each_with_index { |disk, index|
      if ENV['NVME_FILE']
      nvme_disk="/var/lib/libvirt/images/" + ENV['NVME_FILE']
        nvme_disk_id="#{disk}" + "-#{index}"
        nvme_disk="#{nvme_file["#{index}".to_i]}"
      else
        nvme_disk="/var/lib/libvirt/images/nvme_disk.img"
      end
@@ -141,10 +148,28 @@ Vagrant.configure(2) do |config|
        puts "If run with libvirt provider please execute create_nvme_img.sh"
      end

      if disk == "nvme"
        libvirt.qemuargs :value => "-drive"
    libvirt.qemuargs :value => "file=#{nvme_disk},if=none,id=D22"
        libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}"
        libvirt.qemuargs :value => "-device"
    libvirt.qemuargs :value => "nvme,drive=D22,serial=1234"
        if nvme_namespaces["#{index}".to_i].nil?
          libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=1234#{index}"
        else
          libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=1234#{index},namespaces=#{nvme_namespaces["#{index}".to_i]}"
        end
      elsif disk == "ocssd"
        libvirt.qemuargs :value => "-drive"
        libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}"
        libvirt.qemuargs :value => "-device"
        # create ocssd drive with special parameters
        # lba_index=4 it is LBA namespace format, 4 means that block size is 4K and have 64B metadata
        # lnum_lun, lnum_pln, lpgs_per_blk, lsecs_per_pg, lblks_per_pln this are parameters describing the device geometry
        # we need to multiply these parameters by ourselves to have backend file minimal size:
        # in our case: 4K * 8 * 2 * 1536 * 2 * 45 = 8640 MB
        libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=deadbeef,oacs=0,namespaces=1,lver=2,lba_index=4,mdts=10,lnum_lun=8,lnum_pln=2,lpgs_per_blk=1536,lsecs_per_pg=2,lblks_per_pln=45,metadata=/var/lib/libvirt/images/ocssd_md,nsdatafile=/var/lib/libvirt/images/ocssd_blknvme.ns,laer_thread_sleep=3000,stride=4"
      end
    }

    libvirt.driver = "kvm"
    libvirt.graphics_type = "vnc"
    libvirt.memory = "#{vmram}"
+19 −3
Original line number Diff line number Diff line
@@ -2,14 +2,16 @@
SYSTEM=$(uname -s)
size="1024M"
name="nvme_disk.img"
type="nvme"

function usage() {
	echo "Usage: ${0##*/} [-s <disk_size>] [-n <backing file name>]"
	echo "-s <disk_size> with postfix e.g. 2G        default: 1024M"
	echo "-n <backing file name>             default: nvme_disk.img"
	echo "-t <type>                  default: nvme available: ocssd"
}

while getopts "s:n:h-:" opt; do
while getopts "s:n:t:h-:" opt; do
	case "${opt}" in
		-)
			echo "  Invalid argument: $OPTARG"
@@ -22,6 +24,9 @@ while getopts "s:n:h-:" opt; do
		n)
			name=$OPTARG
		;;
		t)
			type=$OPTARG
		;;
		h)
			usage
			exit 0
@@ -37,8 +42,19 @@ done
if [ ! "${SYSTEM}" = "FreeBSD" ]; then
	WHICH_OS=$(lsb_release -i | awk '{print $3}')
	nvme_disk="/var/lib/libvirt/images/$name"

	case $type in
		"nvme")
			qemu-img create -f raw $nvme_disk ${size}
		;;
		"ocssd")
			fallocate -l ${size} $nvme_disk
			touch /var/lib/libvirt/images/ocssd_md
		;;
		*)
			echo "We support only nvme and ocssd disks types"
			exit 1
		;;
	esac
	#Change SE Policy on Fedora
	if [ $WHICH_OS == "Fedora" ]; then
		sudo chcon -t svirt_image_t $nvme_disk
+41 −4
Original line number Diff line number Diff line
@@ -19,7 +19,11 @@ display_help() {
	echo
	echo "  distro = <centos7 | ubuntu16 | ubuntu18 | fedora28 | fedora29 | fedora 30 | freebsd11> "
	echo
	echo "  -b <nvme-backing-file>          default: ${NVME_FILE}"
	echo "  -b <nvme-backing-file>          nvme file path with name"
	echo "                                  type of emulated nvme disk"
	echo "                                  usage: type <number_of_namespaces> types available: ocssd, nvme"
	echo "                                  If no -b option is specified then this option defaults to emulating single"
	echo "                                  NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img"
	echo "  -s <ram-size> in kb             default: ${SPDK_VAGRANT_VMRAM}"
	echo "  -n <num-cpus> 1 to 4            default: ${SPDK_VAGRANT_VMCPU}"
	echo "  -x <http-proxy>                 default: \"${SPDK_VAGRANT_HTTP_PROXY}\""
@@ -40,6 +44,9 @@ display_help() {
	echo "  $0 -s 2048 -n 2 ubuntu16"
	echo "  $0 -rv freebsd"
	echo "  $0 fedora28"
	echo "  $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora30"
	echo "  $0 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30"
	echo "  $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30"
	echo
}

@@ -58,7 +65,9 @@ SPDK_VAGRANT_VMRAM=4096
SPDK_VAGRANT_PROVIDER="virtualbox"
SPDK_QEMU_EMULATOR=""
OPTIND=1
NVME_FILE="nvme_disk.img"
NVME_DISKS_TYPE=""
NVME_DISKS_NAMESPACES=""
NVME_FILE=""

while getopts ":b:n:s:x:p:vrldh-:" opt; do
	case "${opt}" in
@@ -101,7 +110,7 @@ while getopts ":b:n:s:x:p:vrldh-:" opt; do
			DEPLOY_TEST_VM=1
		;;
		b)
			NVME_FILE=$OPTARG
			NVME_FILE+="${OPTARG#*=} "
		;;
		*)
			echo "  Invalid argument: -$OPTARG" >&2
@@ -151,6 +160,27 @@ if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ];
	echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build"
	DEPLOY_TEST_VM=0
fi
if [ -z "$NVME_FILE" ]; then
	TMP="/var/lib/libvirt/images/nvme_disk.img"
	NVME_DISKS_TYPE="nvme"
	NVME_DISKS_NAMESPACES="1"
else
	TMP=""
	for args in $NVME_FILE; do
		while IFS=, read -r path type namespace; do
			TMP+="$path,";
			if [ -z "$type" ]; then
				type="nvme"
			fi
			NVME_DISKS_TYPE+="$type,";
			if [ -z "$namespace" ]; then
				namespace="1"
			fi
			NVME_DISKS_NAMESPACES+="$namespace,";
		done <<< $args
	done
fi
NVME_FILE=$TMP

if [ ${VERBOSE} = 1 ]; then
	echo
@@ -160,6 +190,8 @@ if [ ${VERBOSE} = 1 ]; then
	echo HELP=$HELP
	echo DRY_RUN=$DRY_RUN
	echo NVME_FILE=$NVME_FILE
	echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE
	echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES
	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
@@ -177,6 +209,8 @@ export SPDK_VAGRANT_VMRAM
export SPDK_DIR
export COPY_SPDK_DIR
export DEPLOY_TEST_VM
export NVME_DISKS_TYPE
export NVME_DISKS_NAMESPACES
export NVME_FILE

if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
@@ -207,6 +241,9 @@ if [ ${DRY_RUN} = 1 ]; then
	printenv SPDK_VAGRANT_PROVIDER
	printenv SPDK_VAGRANT_HTTP_PROXY
	printenv SPDK_QEMU_EMULATOR
	printenv NVME_DISKS_TYPE
	printenv NVME_DISKS_NAMESPACES
	printenv NVME_FILE
	printenv SPDK_DIR
fi