summaryrefslogtreecommitdiffstats
path: root/src/spdk/scripts/vagrant/Vagrantfile
blob: 40e012b2801bb5b928131d277a6a09c85e8d418f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  # Pick the right distro and bootstrap, default is fedora26
  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')
  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 "fedora28"
    #See: https://app.vagrantup.com/generic/boxes/fedora28
    config.vm.box = "generic/fedora28"
  when "freebsd11"
    #See: https://app.vagrantup.com/generic/boxes/freebsd11
    config.vm.box = "generic/freebsd11"
    if File.file?(File.expand_path("~/vagrant_pkg.conf"))
      config.vm.provision  "file", source: "~/vagrant_pkg.conf", destination: "pkg.conf"
      config.vm.provision "shell", inline: "sudo mv pkg.conf /usr/local/etc/pkg.conf"
      config.vm.provision "shell", inline: "sudo chown root:wheel /usr/local/etc/pkg.conf"
      config.vm.provision "shell", inline: "sudo chmod 644 /usr/local/etc/pkg.conf"
    end
  else
    "Invalid argument #{distro}"
    abort("Invalid argument!")
  end
  config.vm.box_check_update = false

  # Copy in the .gitconfig if it exists
  if File.file?(File.expand_path("~/.gitconfig"))
    config.vm.provision  "file", source: "~/.gitconfig", destination: ".gitconfig"
  end

  # Copy the tsocks configuration file for use when installing some spdk test pool dependencies
  if File.file?("/etc/tsocks.conf")
    config.vm.provision  "file", source: "/etc/tsocks.conf", destination: "tsocks.conf"
    config.vm.provision "shell", inline: "sudo mv tsocks.conf /etc/tsocks.conf"
    config.vm.provision "shell", inline: "sudo chown root:wheel /etc/tsocks.conf"
    config.vm.provision "shell", inline: "sudo chmod 644 /etc/tsocks.conf"
  end

  # vagrant-cachier caches apt/yum etc to speed subsequent
  # vagrant up
  # to enable, run
  # vagrant plugin install vagrant-cachier
  #
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end

  config.vm.network "private_network", type: "dhcp"

  # use http proxy if avaiable
  if ENV['http_proxy'] && Vagrant.has_plugin?("vagrant-proxyconf")
   config.proxy.http     = ENV['http_proxy']
   config.proxy.https    = ENV['https_proxy']
   config.proxy.no_proxy = "localhost,127.0.0.1"
  end

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

  config.ssh.forward_agent = true
  config.ssh.forward_x11 = true

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--ioapic", "on"]
    vb.memory = "#{vmram}"
    vb.cpus = "#{vmcpu}"

    nvme_disk = 'nvme.vdi'
    unless File.exist? (nvme_disk)
      vb.customize ["createhd", "--filename", nvme_disk, "--variant", "Fixed", "--size", "1024"]
      vb.customize ["storagectl", :id, "--name", "nvme", "--add", "pcie", "--controller", "NVMe", "--portcount", "1", "--bootable", "off"]
      vb.customize ["storageattach", :id, "--storagectl", "nvme", "--type", "hdd", "--medium", nvme_disk, "--port", "0"]
    end

    #support for the SSE4.x instruction is required in some versions of VB.
    vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.1", "1"]
    vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.2", "1"]
  end

  # This setup was Tested on Fedora 27
  # libvirt configuration need modern Qemu(tested on 2.10) & vagrant-libvirt in version 0.0.39+
  # There are few limitation for SElinux - The file added outside libvirt must have proper SE ACL policy or setenforce 0
  config.vm.provider "libvirt" do |libvirt, override|
    libvirt.random_hostname = "1"
    libvirt.disk_bus = "virtio"

    # we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems
    # and to be able to run vagrant from user $HOME directory
    nvme_disk = '/var/lib/libvirt/images/nvme_disk.img'
    unless File.exist? (nvme_disk)
      puts "If run with libvirt provider please execute create_nvme_img.sh"
    end

    libvirt.qemuargs :value => "-drive"
    libvirt.qemuargs :value => "file=#{nvme_disk},if=none,id=D22"
    libvirt.qemuargs :value => "-device"
    libvirt.qemuargs :value => "nvme,drive=D22,serial=1234"
    libvirt.driver = "kvm"
    libvirt.graphics_type = "spice"
    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"
  end

  # rsync the spdk directory if provision hasn't happened yet
  if ENV['COPY_SPDK_DIR'] == "1" && spdk_dir != "none"
    config.vm.synced_folder "#{spdk_dir}", "/home/vagrant/spdk_repo/spdk", type: "rsync", rsync__auto: false
  end

  # provision the vm with all of the necessary spdk dependencies for running the autorun.sh tests
  if ENV['DEPLOY_TEST_VM'] == "1" && spdk_dir != "none"
    config.vm.provision "shell" do |setup|
      setup.path = "#{spdk_dir}/test/common/config/vm_setup.sh"
      setup.privileged = false
      setup.args = ["-u", "-i"]
    end
  end

  if vhost_host_dir != "none"
      config.vm.synced_folder "#{vhost_host_dir}", "#{vhost_vm_dir}", type: "rsync", rsync__auto: false
      config.vm.provision "shell", inline: "sudo mkdir -p /root/.ssh"
      config.vm.provision "shell", inline: "sudo cp #{vhost_vm_dir}/spdk_vhost_id_rsa* /root/.ssh"
      config.vm.provision "shell", inline: "sudo chmod 600 /root/.ssh/spdk_vhost_id_rsa"
  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