Commit e3a71385 authored by John Meneghini's avatar John Meneghini Committed by Ben Walker
Browse files

test: add support for multiple oses with vagrant



 - Add vagrant create_vbox.sh script
   . This script replace env.sh
 - Refactor Vagrantfile
   . Add support for fedora28, Ubuntu18, and FreeBSD 11
   . Changes to provisioning rules
   . Removed build.sh
   . Changes to support vm_setup.sh on vagrant with Fedora 26
 - Add vagrant README.md
   . Instructions for provisioning different VMs
   . Post VM Initialization done with update.sh
 - Add vagrant run-autorun.sh script
   . Changes to run autotest.sh on vagrant with Fedora 26

Change-Id: I8a34273361dd4233241326b0cd31189cf511f503
Signed-off-by: default avatarJohn Meneghini <johnm@netapp.com>
Signed-off-by: default avatarEd Rodriguez <ed.rodriguez@netapp.com>
Reviewed-on: https://review.gerrithub.io/414861


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarSeth Howell <seth.howell5141@gmail.com>
parent b1da5cec
Loading
Loading
Loading
Loading
+214 −0
Original line number Diff line number Diff line
# SPDK Vagrant and VirtualBox

The following guide explains how to use the scripts in the `spdk/scripts/vagrant`. Both Mac and Windows platforms are supported.

1. Install and configure [Git](https://git-scm.com/) on your platform.
2. Install [VirtualBox 5.1](https://www.virtualbox.org/wiki/Downloads) or newer
3. Install [VirtualBox Extension Pack](https://www.virtualbox.org/wiki/Downloads)
4. Install and configure [Vagrant 1.9.4](https://www.vagrantup.com) or newer

## Mac OSX Setup (High Sierra)

OSX platforms already have Git installed, however, installing the [Apple xCode](https://developer.apple.com/xcode/) developer kit and [xCode Command Line tools](https://developer.apple.com/xcode/features/) will provide UNIX command line tools such as make, awk, sed, ssh, tar, and zip. xCode can be installed through the App Store on you Mac.

Quick start instructions for OSX:

1. Install Homebrew
2. Install Virtual Box Cask
3. Install Virtual Box Extentions
4. Install Vagrant Cask

```
   /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
   brew doctor
   brew update
   brew cask install virtualbox
   brew cask install virtualbox-extension-pack
   brew cask install vagrant
```

## Windows 10 Setup

1. Windows platforms should install [Git](https://git-scm.com/download/win) from git-scm.com.
   - This provides everything needed to use git on Windows, including a `git-bash` command line environment.
2. Install [VirtualBox 5.1](https://www.virtualbox.org/wiki/Downloads) or newer
3. Install [VirtualBox Extension Pack](https://www.virtualbox.org/wiki/Downloads)
4. Install and configure [Vagrant 1.9.4](https://www.vagrantup.com) or newer

- Note: VirtualBox requires virtualization to be enabled in the BIOS.
- Note: You should disable Hyper-V in Windows RS 3 laptop. Search `windows features` uncheck Hyper-V, restart laptop

## Configure Vagrant

If you are behind a corporate firewall, configure the following proxy settings.

1. Set the http_proxy and https_proxy
2. Install the proxyconf plugin

```
  $ export http_proxy=....
  $ export https_proxy=....
  $ vagrant plugin install vagrant-proxyconf
```

## Download SPDK from GitHub

Use git to clone a new spdk repository. GerritHub can also be used. See the instructions at [spdk.io](http://www.spdk.io/development/#gerrithub) to setup your GerritHub account. Note that this spdk repository will be rsync'd into your VM, so you can use this repository to continue development within the VM.

## Create a Virtual Box

Use the `spdk/scripts/vagrant/create_vbox.sh` script to create a VM of your choice.  Supported VM platforms are:

- centos7
- ubuntu16
- ubuntu18
- fedora26
- fedora27
- freebsd11

```
$ spdk/scripts/vagrant/create_vbox.sh -h
 Usage: create_vbox.sh [-n <num-cpus>] [-s <ram-size>] [-x <http-proxy>] [-hvr] <distro>

  distro = <centos7 | ubuntu16 | ubuntu18 | fedora26 | fedora27 | freebsd11>

  -s <ram-size> in kb       default: 4096
  -n <num-cpus> 1 to 4      default: 4
  -x <http-proxy>           default: ""
  -r dry-run
  -h help
  -v verbose

 Examples:

  spdk/scripts/vagrant/create_vbox.sh -x http://user:password@host:port fedora27
  spdk/scripts/vagrant/create_vbox.sh -s 2048 -n 2 ubuntu16
  spdk/scripts/vagrant/create_vbox.sh -rv freebsd
  spdk/scripts/vagrant/create_vbox.sh fedora26
```

It is recommended that you call the `create_vbox.sh` script from outside of the spdk repository. Call this script from a parent directory. This will allow the creation of multiple VMs in separate <distro> directories, all using the same spdk repository.  For example:

```
   $ spdk/scripts/vagrant/create_vbox.sh -s 2048 -n 2 fedora26
```

This script will:

1. create a subdirectory named <distro> in your $PWD
2. copy the needed files from `spdk/scripts/vagrant/` into the <distro> directory
3. create a working virtual box in the <distro> directory
4. rsycn the `~/.gitconfig` file to `/home/vagrant/` in the newly provisioned virtual box
5. rsync a copy of the source `spdk` repository to `/home/vagrant/spdk_repo/spdk`
6. rsync a copy of the `~/vagrant_tools` directory to `/home/vagrant/tools` (optional)

This arrangement allows the provisioning of multiple, different VMs within that same directory hiearchy using the same spdk repository. Following the creation of the vm you'll need to ssh into your virtual box and finish the VM initializaton.

```
  $ cd <distro>
  $ vagrant ssh
```

## Finish VM Initializtion

A copy of the `spdk` repository you cloned will exist in the `spdk_repo` directory of the `/home/vagrant` user account. After using `vagrant ssh` to enter your VM you must complete the initialization of your VM by running the `scripts/vagrant/update.sh` script. For example:

```
   $ script -c 'sudo spdk_repo/spdk/scripts/vagrant/update.sh' update.log
```

The `update.sh` script completes initialization of the VM by automating the following steps.

1. Runs yum/apt-get update (Linux)
2. Runs the scripts/pdkdep.sh script
3. Installs the FreeBSD source in /usr/sys (FreeBSD only)

This only needs to be done once.

## Post VM Initializtion

Following VM initializtion you must:

1. Verify you have an emulated NVMe device
2. Compile your spdk source tree
3. Run the hello_world example to validate the environment is set up correctly

### Verify you have an emulated NVMe device

```
  $ lspci | grep "Non-Volatile"
  00:0e.0 Non-Volatile memory controller: InnoTek Systemberatung GmbH Device 4e56
```

### Compile SPDK

```
  $ cd spdk_repo/spdk
  $ git submodule update --init
  $ ./configure --enable-debug
  $ make
```

### Run the hello_world example script

```
  $ sudo scripts/setup.sh
  $ sudo examples/bdev/hello_world/hello_bdev
```

## Additional Setup for Fedora 26

As of this writing the `vm_setup.sh` script only supports Fedora 26.  To complete the full installation of all packages needed to run autotest.sh on your fedora26 VM, run the `spdk/test/common/config/vm_setup.sh` script.  Note: this will take some time. It is recommended that the output of vm_setup.sh is captured in a script log.

```
   $ script -c 'spdk_repo/spdk/test/common/config/vm_setup.sh -i -t librxe,iscsi,rocksdb,fio,flamegraph,libiscsi' vm_setup.log
```

### Running autorun.sh with vagrant

After running vm_setup.sh the `run-autorun.sh` can be used to run `spdk/autorun.sh` on a Fedora 26 vagrant machine. Note that the `spdk/scripts/vagrant/autorun-spdk.conf` should be copied to `~/autorun-spdk.conf` before starting your tests.

```
   $ cp spdk/scripts/vagrant/autorun-spdk.conf ~/
   $ spdk/scripts/vagrant/run-autorun.sh -h
     Usage: scripts/vagrant/run-autorun.sh -d <path_to_spdk_tree> [-h] | [-q] | [-n]
       -d : Specify a path to an SPDK source tree
       -q : No output to screen
       -n : Noop - dry-run
       -h : This help

     Examples:
         run-spdk-autotest.sh -d . -q
         run-spdk-autotest.sh -d /home/vagrant/spdk_repo/spdk
```

## FreeBSD Appendix

---
**NOTE:** As of this writing the FreeBSD Virtualbox instance does not correctly support the vagrant-proxyconf feature.
---

The following steps are done by the `update.sh` script. It is recommened that you capture the output of `update.sh` with a typescript. E.g.:

```
  $ script update.log sudo spdk_repo/spdk/scripts/vagrant/update.sh
```

1. Updates the pkg catalog
1. Installs the needed FreeBSD packages on the system by calling pkgdep.sh
2. Installs the FreeBSD source in /usr/src

```
   $ sudo pkg upgrade -f
   $ sudo spdk_repo/spdk/scripts/pkgdep.sh
   $ sudo git clone --depth 10 -b releases/11.1.0 https://github.com/freebsd/freebsd.git /usr/src
```

To build spdk on FreeBSD use `gmake MAKE=gmake`.  E.g.:

```
    $ cd spdk_repo/spdk
    $ git submodule update --init
    $ ./configure --enable-debug
    $ gmake MAKE=gmake
```
+73 −49
Original line number Diff line number Diff line
@@ -4,23 +4,38 @@
Vagrant.configure(2) do |config|

  # Pick the right distro and bootstrap, default is ubuntu1604
  distro = ( ENV['SPDK_VAGRANT_DISTRO'] || "ubuntu1604")
  if distro == 'centos7'
  distro = ( ENV['SPDK_VAGRANT_DISTRO'] || "fedora26")
  case distro
  when "centos7"
    config.vm.box = "puppetlabs/centos-7.2-64-nocm"
    config.ssh.insert_key = false
    # Puppetlabs does not provide libvirt Box so we will use official one
    config.vm.provider :libvirt do |libvirt|
      config.vm.box = "centos/7"
    end if Vagrant.has_plugin?('vagrant-libvirt')
  else
  when "ubuntu16"
    # See: https://app.vagrantup.com/puppetlabs/boxes/ubuntu-16.04-64-nocm
    config.vm.box = "puppetlabs/ubuntu-16.04-64-nocm"
    config.vm.box_version = "1.0.0"
  when "ubuntu18"
    # See: https://app.vagrantup.com/bento/boxes/ubuntu-18.04
    config.vm.box = "bento/ubuntu-18.04"
    config.vm.box_version = "201803.24.0"
  when "fedora26"
    #See: https://app.vagrantup.com/generic/boxes/fedora2
    config.vm.box = "generic/fedora26"
  when "fedora27"
    #See: https://app.vagrantup.com/generic/boxes/fedora27
    config.vm.box = "generic/fedora27"
  when "freebsd11"
    #See: https://app.vagrantup.com/generic/boxes/freebsd11
    config.vm.box = "generic/freebsd11"
  else
    "Invalid argument #{distro}"
    abort("Invalid argument!")
  end
  config.vm.box_check_update = false

  config.vm.provision :shell, :path => File.join(File.dirname(__FILE__),"update.sh")
  config.vm.provision :shell, :path => File.join(File.dirname(__FILE__),"build.sh")
  config.vm.provision :shell, inline: "/spdk/scripts/setup.sh", run: "always"

  # Copy in the .gitconfig if it exists
  if File.file?(File.expand_path("~/.gitconfig"))
    config.vm.provision  "file", source: "~/.gitconfig", destination: ".gitconfig"
@@ -46,6 +61,7 @@ Vagrant.configure(2) do |config|

  vmcpu=(ENV['SPDK_VAGRANT_VMCPU'] || 2)
  vmram=(ENV['SPDK_VAGRANT_VMRAM'] || 4096)
  spdk_dir=(ENV['SPDK_DIR'] || "none")

  config.ssh.forward_agent = true
  config.ssh.forward_x11 = true
@@ -55,9 +71,16 @@ Vagrant.configure(2) do |config|
    vb.memory = "#{vmram}"
    vb.cpus = "#{vmcpu}"

      # rsync the vpp directory if provision hasn't happened yet
    # rsync the spdk directory if provision hasn't happened yet
    unless File.exist? (".vagrant/machines/default/virtualbox/action_provision")
        config.vm.synced_folder "../../", "/spdk", type: "rsync", rsync__auto: false
      if spdk_dir != "none"
        config.vm.synced_folder "#{spdk_dir}", "/home/vagrant/spdk_repo/spdk", type: "rsync", rsync__auto: false
      end

      # Copy in the user's tools if they exists
      if File.directory?(File.expand_path("~/vagrant_tools"))
        config.vm.synced_folder "~/vagrant_tools", "/home/vagrant/tools", type: "rsync", rsync__auto: false
      end
    end

    nvme_disk = 'nvme.vdi'
@@ -93,14 +116,15 @@ Vagrant.configure(2) do |config|
    libvirt.memory = "#{vmram}"
    libvirt.cpus = "#{vmcpu}"
    libvirt.video_type = "qxl"

    # Optional field if we want use other storage pools than default
    # libvirt.storage_pool_name = "vm"

      # rsync the vpp directory if provision hasn't happened yet
      unless File.exist? (".vagrant/machines/default/libvirt/action_provision")
        config.vm.synced_folder "../../", "/spdk", type: "rsync"
    # rsync the spdk directory if provision hasn't happened yet
    unless File.exist? (".vagrant/machines/default/virtualbox/action_provision")
      if spdk_dir != "none"
        config.vm.synced_folder "#{spdk_dir}", "/home/vagrant/spdk_repo/spdk", type: "rsync"
      end
    end

  end

end
+28 −0
Original line number Diff line number Diff line
# assign a value of 1 to all of the pertinent tests
SPDK_BUILD_DOC=1
SPDK_RUN_CHECK_FORMAT=1
SPDK_RUN_SCANBUILD=1
SPDK_RUN_VALGRIND=1
SPDK_TEST_UNITTEST=1
SPDK_TEST_ISCSI=0
SPDK_TEST_ISCSI_INITIATOR=0
SPDK_TEST_NVME=0
SPDK_TEST_NVME_CLI=0
SPDK_TEST_NVMF=1
SPDK_TEST_RBD=0
# requires some extra configuration. see TEST_ENV_SETUP_README
SPDK_TEST_VHOST=0
SPDK_TEST_VHOST_INIT=0
SPDK_TEST_BLOCKDEV=1
# doesn't work on vm
SPDK_TEST_IOAT=0
SPDK_TEST_EVENT=1
SPDK_TEST_BLOBFS=0
SPDK_TEST_PMDK=0
SPDK_TEST_LVOL=0
SPDK_RUN_ASAN=1
SPDK_RUN_UBSAN=1
# Reduce the size of the hugepages
HUGEMEM=1024
# Set up the DEPENDENCY_DIR
DEPENDENCY_DIR=/home/vagrant

scripts/vagrant/build.sh

deleted100755 → 0
+0 −39
Original line number Diff line number Diff line
#!/bin/bash

SPDK_DIR=/spdk

SUDOCMD="sudo -H -u vagrant"
echo 0:$0
echo 1:$1
echo 2:$2
echo SUDOCMD: $SUDOCMD

# Figure out what system we are running on
if [ -f /etc/lsb-release ];then
    . /etc/lsb-release
elif [ -f /etc/redhat-release ];then
    sudo yum install -y redhat-lsb
    DISTRIB_ID=`lsb_release -si`
    DISTRIB_RELEASE=`lsb_release -sr`
    DISTRIB_CODENAME=`lsb_release -sc`
    DISTRIB_DESCRIPTION=`lsb_release -sd`
fi
KERNEL_OS=`uname -o`
KERNEL_MACHINE=`uname -m`
KERNEL_RELEASE=`uname -r`
KERNEL_VERSION=`uname -v`

echo KERNEL_OS: $KERNEL_OS
echo KERNEL_MACHINE: $KERNEL_MACHINE
echo KERNEL_RELEASE: $KERNEL_RELEASE
echo KERNEL_VERSION: $KERNEL_VERSION
echo DISTRIB_ID: $DISTRIB_ID
echo DISTRIB_RELEASE: $DISTRIB_RELEASE
echo DISTRIB_CODENAME: $DISTRIB_CODENAME
echo DISTRIB_DESCRIPTION: $DISTRIB_DESCRIPTION

cd $SPDK_DIR
./scripts/pkgdep.sh
$SUDOCMD ./configure --enable-debug
$SUDOCMD make clean
$SUDOCMD make -j2
+13 −9
Original line number Diff line number Diff line
#!/usr/bin/env bash
SYSTEM=`uname -s`

if [ ! "${SYSTEM}" = "FreeBSD" ]; then
	WHICH_OS=`lsb_release -i | awk '{print $3}'`
	nvme_disk='/var/lib/libvirt/images/nvme_disk.img'

@@ -10,3 +13,4 @@ fi

	chmod 777 $nvme_disk
	chown qemu:qemu $nvme_disk
fi
Loading