xref: /spdk/scripts/vagrant/Vagrantfile (revision 245c82b2ab100b6236e705f3d854f181417b182d)
111fa5403SJim Harris# -*- mode: ruby -*-
211fa5403SJim Harris# vi: set ft=ruby :
311fa5403SJim Harris
4f7d520e8SMaciej Wawrykrequire 'open3'
5264e0a0aSMichal Bergerdef get_box_type(distro, force_distro)
69620760bSPawel Piatek  spdk_distro = 'spdk/' + distro
7344c3184SMaciej Wawryk  localboxes, stderr, status = Open3.capture3("vagrant box list")
89620760bSPawel Piatek  return spdk_distro if localboxes.include?(spdk_distro)
99620760bSPawel Piatek
109620760bSPawel Piatek  distro_to_type = {
119620760bSPawel Piatek    'centos7'    => 'centos/7',
1255de68f1SMaciej Wawryk    'ubuntu2004' => 'peru/ubuntu-20.04-server-amd64',
13400aadf8SJaroslaw Chachulski    'ubuntu2204' => 'generic/ubuntu2204',
1446e00b54SKamil Godzwon    'fedora37'   => 'generic/fedora37',
1546e00b54SKamil Godzwon    'fedora38'   => 'generic/fedora38',
169620760bSPawel Piatek    'arch'       => 'generic/arch',
179620760bSPawel Piatek    'freebsd12'  => 'generic/freebsd12',
18d21dc150SPawel Piatek    'freebsd13'  => 'generic/freebsd13',
19401d3c53SPawel Piatek    'rocky8'     => 'rockylinux/8',
20401d3c53SPawel Piatek    'rocky9'     => 'rockylinux/9'
219620760bSPawel Piatek  }
22264e0a0aSMichal Berger  abort("Invalid argument! #{distro}") unless distro_to_type.key?(distro) || force_distro
239620760bSPawel Piatek
24264e0a0aSMichal Berger  return distro_to_type[distro] ? distro_to_type[distro] : distro
25344c3184SMaciej Wawrykend
26344c3184SMaciej Wawryk
27e08eae22SPawel Piatekdef setup_proxy(config,distro)
28e08eae22SPawel Piatek  return unless ENV['http_proxy']
29e08eae22SPawel Piatek
30e08eae22SPawel Piatek  if Vagrant.has_plugin?("vagrant-proxyconf")
31e08eae22SPawel Piatek    config.proxy.http     = ENV['http_proxy']
32e08eae22SPawel Piatek    config.proxy.https    = ENV['https_proxy']
33e08eae22SPawel Piatek    config.proxy.no_proxy = "localhost,127.0.0.1"
34e08eae22SPawel Piatek  end
35e08eae22SPawel Piatek
36e08eae22SPawel Piatek  # Proxyconf does not seem to support FreeBSD boxes or at least it's
37e08eae22SPawel Piatek  # docs do not mention that. Set up proxy configuration manually.
38e08eae22SPawel Piatek  if distro.include?("freebsd")
39e08eae22SPawel Piatek    $freebsd_proxy = <<-SCRIPT
40e08eae22SPawel Piatek    sudo -s
41e08eae22SPawel Piatek    echo "export http_proxy=#{ENV['http_proxy']}" >> /etc/profile
42e08eae22SPawel Piatek    echo "export https_proxy=#{ENV['http_proxy']}" >> /etc/profile
43e08eae22SPawel Piatek    echo "pkg_env: {http_proxy: #{ENV['http_proxy']}}" > /usr/local/etc/pkg.conf
44e08eae22SPawel Piatek    chown root:wheel /usr/local/etc/pkg.conf
45e08eae22SPawel Piatek    chmod 644 /usr/local/etc/pkg.conf
46e08eae22SPawel Piatek    SCRIPT
47e08eae22SPawel Piatek    config.vm.provision "shell", inline: $freebsd_proxy
48e08eae22SPawel Piatek  end
49e08eae22SPawel Piatekend
50e08eae22SPawel Piatek
51b5fea131SPawel Piatekdef copy_gitconfig(config)
52b5fea131SPawel Piatek  src_path = '~/.gitconfig'
53b5fea131SPawel Piatek  return unless File.file?(File.expand_path(src_path))
54b5fea131SPawel Piatek
55b5fea131SPawel Piatek  config.vm.provision  "file", source: src_path, destination: ".gitconfig"
56b5fea131SPawel Piatekend
57b5fea131SPawel Piatek
58b5fea131SPawel Piatekdef copy_tsocks(config)
59b5fea131SPawel Piatek  tsocks_file = 'tsocks.conf'
60b5fea131SPawel Piatek  tsocks_file_path = '/etc/' + tsocks_file
61b5fea131SPawel Piatek
62b5fea131SPawel Piatek  return unless File.file?(tsocks_file_path)
63b5fea131SPawel Piatek
64b5fea131SPawel Piatek  $tsocks_copy_cmd = <<-SCRIPT
65b5fea131SPawel Piatek  sudo -s
66b5fea131SPawel Piatek  mv -f "#{tsocks_file}" "#{tsocks_file_path}"
67b5fea131SPawel Piatek  chown root "#{tsocks_file_path}"
68b5fea131SPawel Piatek  chmod 644 "#{tsocks_file_path}"
69b5fea131SPawel Piatek  SCRIPT
70b5fea131SPawel Piatek
71b5fea131SPawel Piatek  config.vm.provision  "file", source: tsocks_file_path, destination: tsocks_file
72b5fea131SPawel Piatek  config.vm.provision "shell", inline: $tsocks_copy_cmd
73b5fea131SPawel Piatekend
74b5fea131SPawel Piatek
75b5fea131SPawel Piatekdef copy_vagrant_tools(config,files_sync_backend)
76b5fea131SPawel Piatek  src_path = '~/vagrant_tools'
77b5fea131SPawel Piatek  return unless File.directory?(File.expand_path(src_path))
78b5fea131SPawel Piatek
79b5fea131SPawel Piatek  config.vm.synced_folder src_path, "/home/vagrant/tools", files_sync_backend
80b5fea131SPawel Piatekend
81b5fea131SPawel Piatek
8264c27c8dSPawel Piatekdef copy_sources_dirs(config, files_sync_backend)
83b5fea131SPawel Piatek  return unless ENV['COPY_SPDK_DIR'] == "1"
84b5fea131SPawel Piatek  return unless ENV['SPDK_DIR']
85b5fea131SPawel Piatek
8664c27c8dSPawel Piatek  repo_prefix = '/home/vagrant/spdk_repo'
8764c27c8dSPawel Piatek  config.vm.synced_folder ENV['SPDK_DIR'], "#{repo_prefix}/spdk", files_sync_backend
8864c27c8dSPawel Piatek
8964c27c8dSPawel Piatek  # Optional directories
9064c27c8dSPawel Piatek  for dir in ['spdk-abi', 'dpdk']
9164c27c8dSPawel Piatek    src_path = "#{ENV['SPDK_DIR']}/../#{dir}"
9264c27c8dSPawel Piatek    next unless File.directory?(File.expand_path(src_path))
9364c27c8dSPawel Piatek
9464c27c8dSPawel Piatek    config.vm.synced_folder src_path, "#{repo_prefix}/#{dir}", files_sync_backend
9564c27c8dSPawel Piatek  end
96b5fea131SPawel Piatekend
97b5fea131SPawel Piatek
98b5fea131SPawel Piatekdef copy_spdk_artifacts(config, plugins_sync_backend)
99b5fea131SPawel Piatek  return unless ENV['COPY_SPDK_ARTIFACTS'] == "1"
100b5fea131SPawel Piatek
101b5fea131SPawel Piatek  vagrantfile_dir=(ENV['VAGRANTFILE_DIR'] || "none")
102b5fea131SPawel Piatek  config.vm.synced_folder "#{vagrantfile_dir}/output", "/home/vagrant/spdk_repo/output", plugins_sync_backend
103b5fea131SPawel Piatekend
104b5fea131SPawel Piatek
105d0426c87SPawel Piatekdef make_spdk_local_copy_of_nfs(config,distro)
106d0426c87SPawel Piatek  user_group = 'vagrant:vagrant'
107d0426c87SPawel Piatek
108d0426c87SPawel Piatek  spdk_path = '/home/vagrant/spdk_repo/spdk'
109d0426c87SPawel Piatek  spdk_tmp_path = '/tmp/spdk'
110d0426c87SPawel Piatek  $spdk_repo_cmd = <<-SCRIPT
111d0426c87SPawel Piatek  sudo -s
112d0426c87SPawel Piatek  cp -R '#{spdk_path}' '#{spdk_tmp_path}'
113d0426c87SPawel Piatek  umount '#{spdk_path}' && rm -rf '#{spdk_path}'
114d0426c87SPawel Piatek  mv '#{spdk_tmp_path}' '#{spdk_path}'
115d0426c87SPawel Piatek  chown -R #{user_group} '#{spdk_path}'
116d0426c87SPawel Piatek  SCRIPT
117d0426c87SPawel Piatek
118d0426c87SPawel Piatek  config.vm.provision "shell", inline: $spdk_repo_cmd
119d0426c87SPawel Piatekend
120b5fea131SPawel Piatek
121221c5b5eSPawel Piatekdef get_nvme_disk(disk, index)
122221c5b5eSPawel Piatek  if ENV['NVME_FILE']
123221c5b5eSPawel Piatek    nvme_file = ENV['NVME_FILE'].split(',')
124221c5b5eSPawel Piatek    nvme_disk = nvme_file[index]
125221c5b5eSPawel Piatek  else
126221c5b5eSPawel Piatek    nvme_disk = '/var/lib/libvirt/images/nvme_disk.img'
127221c5b5eSPawel Piatek  end
128221c5b5eSPawel Piatek
129ea71df4fSMichal Berger  unless nvme_disk == "none" || File.exist?(nvme_disk)
130221c5b5eSPawel Piatek    puts 'If run with libvirt provider please execute create_nvme_img.sh'
131221c5b5eSPawel Piatek  end
132221c5b5eSPawel Piatek
133221c5b5eSPawel Piatek  return nvme_disk
134221c5b5eSPawel Piatekend
135221c5b5eSPawel Piatek
136221c5b5eSPawel Piatekdef setup_nvme_disk(libvirt, disk, index)
137221c5b5eSPawel Piatek  nvme_disk_id = disk + '-' + index.to_s
138221c5b5eSPawel Piatek  nvme_disk = get_nvme_disk(disk, index)
139221c5b5eSPawel Piatek
140221c5b5eSPawel Piatek  nvme_namespaces=(ENV['NVME_DISKS_NAMESPACES'] || "").split(',')
141221c5b5eSPawel Piatek  nvme_cmbs=(ENV['NVME_CMB'] || "").split(',')
14245fc211eSMichal Berger  nvme_pmrs=(ENV['NVME_PMR'] || "").split(',')
143ea71df4fSMichal Berger  nvme_zns=(ENV['NVME_ZNS'] || "").split(',')
144c4acef02SMichal Berger  nvme_ms=(ENV['NVME_MS'] || "").split(',')
14529ba5b1bSMichal Berger  nvme_fdp=(ENV['NVME_FDP'] || "").split(',')
146221c5b5eSPawel Piatek
147ea71df4fSMichal Berger  namespace_disks = []
148ea71df4fSMichal Berger  pmr_cmdline = ""
149ea71df4fSMichal Berger  nvme_controller = ""
15029ba5b1bSMichal Berger  fdp_subsys = ""
15129ba5b1bSMichal Berger  fdp_subsys_id = ""
1524b481146SMichal Berger  ms = ""
153ea71df4fSMichal Berger
154*245c82b2SMichal Berger  addr = 0x10 + index
155*245c82b2SMichal Berger
156ea71df4fSMichal Berger  # Define controller
157*245c82b2SMichal Berger  nvme_controller = "nvme,id=#{nvme_disk_id},serial=1234#{index},addr=0x#{addr.to_s(16)}"
158ea71df4fSMichal Berger
15929ba5b1bSMichal Berger  # For the FDP, we need to hook our nvme into a dedicated subsystem
16029ba5b1bSMichal Berger  if !nvme_fdp[index].nil? && nvme_fdp[index] != ""
16129ba5b1bSMichal Berger    fdp_subsys_id = "fdp-subsys#{index}"
16229ba5b1bSMichal Berger    fdp = nvme_fdp[index].split(':')[0..3]
16329ba5b1bSMichal Berger    fdp_ruhs = (nvme_fdp[index].split(':')[4..]) # fdp.ruhs per ns
16429ba5b1bSMichal Berger
16529ba5b1bSMichal Berger    # Put some defaults in place if needed
16629ba5b1bSMichal Berger    fdp_enable = "#{fdp[0] != nil && fdp[0] != '' ? fdp[0] : 'off'}"
16729ba5b1bSMichal Berger    fdp_runs = "#{fdp[1]   != nil && fdp[1] != '' ? fdp[1] : '96M'}"
16829ba5b1bSMichal Berger    fdp_nrg = "#{fdp[2]    != nil && fdp[2] != '' ? fdp[2] : 2}"
16929ba5b1bSMichal Berger    fdp_nruh = "#{fdp[3]   != nil && fdp[3] != '' ? fdp[3] : 8}"
17029ba5b1bSMichal Berger
17129ba5b1bSMichal Berger    fdp_subsys = "nvme-subsys,id=#{fdp_subsys_id},fdp=#{fdp_enable}"
17229ba5b1bSMichal Berger    fdp_subsys << ",fdp.runs=#{fdp_runs},fdp.nrg=#{fdp_nrg},fdp.nruh=#{fdp_nruh}"
17329ba5b1bSMichal Berger
17429ba5b1bSMichal Berger    nvme_controller << ",subsys=#{fdp_subsys_id}"
17529ba5b1bSMichal Berger
17629ba5b1bSMichal Berger    libvirt.qemuargs :value => "-device"
17729ba5b1bSMichal Berger    libvirt.qemuargs :value => fdp_subsys
17829ba5b1bSMichal Berger  end
179ea71df4fSMichal Berger  # Gather all drives - each namespace requires separate drive
180ea71df4fSMichal Berger  if nvme_namespaces[index].nil?
181ea71df4fSMichal Berger    namespace_disks = namespace_disks + nvme_disk.split()
182ea71df4fSMichal Berger  elsif !nvme_namespaces[index].nil? && !nvme_namespaces[index].match(/^[0-9]+$/)
183ea71df4fSMichal Berger    namespace_disks = namespace_disks + nvme_disk.split() + nvme_namespaces[index].split(':')
184e9d44aa3SMichal Berger  elsif !nvme_namespaces[index].nil? && nvme_namespaces[index] == "1"
185221c5b5eSPawel Piatek    libvirt.qemuargs :value => "-drive"
186221c5b5eSPawel Piatek    libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}"
187ea71df4fSMichal Berger      nvme_controller <<",drive=#{nvme_disk_id}"
188221c5b5eSPawel Piatek  end
189221c5b5eSPawel Piatek
190ea71df4fSMichal Berger  if !nvme_cmbs[index].nil? && nvme_cmbs[index] != ""
191221c5b5eSPawel Piatek    # Fix the size of the buffer to 128M
192ea71df4fSMichal Berger    nvme_controller << ",cmb_size_mb=128"
19345fc211eSMichal Berger  end
194ea71df4fSMichal Berger
195ea71df4fSMichal Berger  if !nvme_pmrs[index].nil? && nvme_pmrs[index] != ""
19645fc211eSMichal Berger    pmr_path, pmr_size = nvme_pmrs[index].split(':')
19745fc211eSMichal Berger    if pmr_size.nil?
19845fc211eSMichal Berger      pmr_size = "16M"
19945fc211eSMichal Berger    end
200ea71df4fSMichal Berger    nvme_controller << ",pmrdev=pmr#{index}"
20145fc211eSMichal Berger    pmr_cmdline = "memory-backend-file,id=pmr#{index},share=on,mem-path=#{pmr_path},size=#{pmr_size}"
202221c5b5eSPawel Piatek  end
203ea71df4fSMichal Berger
204ea71df4fSMichal Berger  libvirt.qemuargs :value => "-device"
205ea71df4fSMichal Berger  libvirt.qemuargs :value => nvme_controller
206ea71df4fSMichal Berger
207a5c3f72aSMichal Berger  if pmr_cmdline != ""
20845fc211eSMichal Berger    libvirt.qemuargs :value => "-object"
20945fc211eSMichal Berger    libvirt.qemuargs :value => pmr_cmdline
21045fc211eSMichal Berger  end
211ea71df4fSMichal Berger
212ea71df4fSMichal Berger  # Define all namespaces
213ea71df4fSMichal Berger  namespace_disks.each_with_index { |disk, nsid|
214ea71df4fSMichal Berger    if disk == "none"
215ea71df4fSMichal Berger      next
216ea71df4fSMichal Berger    end
217ea71df4fSMichal Berger    zoned = nvme_zns[index].nil? ? "false" : "true"
2184b481146SMichal Berger    if ! nvme_ms[index].nil? && nvme_ms[index] == "true"
2194b481146SMichal Berger        ms = ",ms=64"
2204b481146SMichal Berger    end
22129ba5b1bSMichal Berger    ns = "nvme-ns,drive=#{nvme_disk_id}-drive#{nsid},bus=#{nvme_disk_id},nsid=#{nsid + 1},zoned=#{zoned},logical_block_size=4096,physical_block_size=4096#{ms}"
22229ba5b1bSMichal Berger    if !fdp_ruhs.nil? && !fdp_ruhs[nsid].nil? && fdp_ruhs[nsid] != ""
22329ba5b1bSMichal Berger        ns << ",fdp.ruhs=#{fdp_ruhs[nsid]}"
22429ba5b1bSMichal Berger    end
225ea71df4fSMichal Berger    libvirt.qemuargs :value => "-drive"
226ea71df4fSMichal Berger    libvirt.qemuargs :value => "format=raw,file=#{disk},if=none,id=#{nvme_disk_id}-drive#{nsid}"
227ea71df4fSMichal Berger    libvirt.qemuargs :value => "-device"
22829ba5b1bSMichal Berger    libvirt.qemuargs :value => ns
229ea71df4fSMichal Berger  }
230ea71df4fSMichal Berger
231221c5b5eSPawel Piatekend
232221c5b5eSPawel Piatek
233211be739SPawel Piatekdef setup_ssh(config)
234211be739SPawel Piatek  config.ssh.forward_agent = true
235211be739SPawel Piatek  config.ssh.forward_x11 = true
236211be739SPawel Piatek  if ENV['VAGRANT_PASSWORD_AUTH'] == "1"
237211be739SPawel Piatek    config.ssh.username = "vagrant"
238211be739SPawel Piatek    config.ssh.password = "vagrant"
2393c98c8f7SMichal Berger    config.ssh.private_key_path = nil
240211be739SPawel Piatek  end
241211be739SPawel Piatekend
242211be739SPawel Piatek
2439433190fSMichal Bergerdef deploy_test_vm(config, distro, plugins_sync_backend)
244b9e3b917SPawel Piatek  return unless ENV['DEPLOY_TEST_VM'] == "1"
245ca31f3c5SMichal Berger  return unless ENV['COPY_SPDK_DIR'] == "1"
246b9e3b917SPawel Piatek  return unless ENV['SPDK_DIR']
247b9e3b917SPawel Piatek
2481ff3715dSJosh Soref  # use http proxy if available
2499433190fSMichal Berger  setup_proxy(config, distro)
2509433190fSMichal Berger
2519433190fSMichal Berger  # Copy the tsocks configuration file for use when installing some spdk test pool dependencies
2529433190fSMichal Berger  copy_tsocks(config)
2539433190fSMichal Berger
2549433190fSMichal Berger  # freebsd boxes in order to have spdk sources synced from
2559433190fSMichal Berger  # host properly will use NFS with "ro" option enabled to prevent changes
2569433190fSMichal Berger  # on host filesystem.
2579433190fSMichal Berger  # To make sources usable in the guest VM we need to unmount them and use
2589433190fSMichal Berger  # local copy.
2599433190fSMichal Berger  make_spdk_local_copy_of_nfs(config,distro) if plugins_sync_backend[:type] == :nfs
2609433190fSMichal Berger
261b9e3b917SPawel Piatek  config.vm.provision "shell" do |setup|
262be07560dSMichal Berger    setup.inline = "/home/vagrant/spdk_repo/spdk/test/common/config/autotest_setup.sh"
263b9e3b917SPawel Piatek    setup.privileged = false
264b9e3b917SPawel Piatek    setup.args = ["-u", "-i"]
265b9e3b917SPawel Piatek  end
266b9e3b917SPawel Piatekend
267b9e3b917SPawel Piatek
2682e617732SPawel Piatekdef setup_virtualbox(config, vmcpu, vmram)
2692e617732SPawel Piatek  config.vm.provider "virtualbox" do |vb|
2702e617732SPawel Piatek    vb.customize ["modifyvm", :id, "--ioapic", "on"]
2712e617732SPawel Piatek    vb.memory = vmram
2722e617732SPawel Piatek    vb.cpus = vmcpu
2732e617732SPawel Piatek
2742e617732SPawel Piatek    nvme_disk=(ENV['NVME_FILE'] || "nvme_disk.img")
2752e617732SPawel Piatek    unless File.exist? (nvme_disk)
2762e617732SPawel Piatek      vb.customize ["createhd", "--filename", nvme_disk, "--variant", "Fixed", "--size", "1024"]
2772e617732SPawel Piatek      vb.customize ["storagectl", :id, "--name", "nvme", "--add", "pcie", "--controller", "NVMe", "--portcount", "1", "--bootable", "off"]
2782e617732SPawel Piatek      vb.customize ["storageattach", :id, "--storagectl", "nvme", "--type", "hdd", "--medium", nvme_disk, "--port", "0"]
2792e617732SPawel Piatek    end
2802e617732SPawel Piatek
2812e617732SPawel Piatek    #support for the SSE4.x instruction is required in some versions of VB.
2822e617732SPawel Piatek    vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.1", "1"]
2832e617732SPawel Piatek    vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.2", "1"]
2842e617732SPawel Piatek  end
2852e617732SPawel Piatekend
2862e617732SPawel Piatek
287282b1945SPawel Piatekdef setup_libvirt(config, vmcpu, vmram, distro)
288282b1945SPawel Piatek  emulated_nvme_types=(ENV['NVME_DISKS_TYPE'] || "nvme").split(',')
289282b1945SPawel Piatek
290282b1945SPawel Piatek  config.vm.provider "libvirt" do |libvirt, override|
291282b1945SPawel Piatek    libvirt.random_hostname = "1"
292282b1945SPawel Piatek    libvirt.driver = "kvm"
293282b1945SPawel Piatek    libvirt.graphics_type = "vnc"
294282b1945SPawel Piatek    libvirt.memory = vmram
295282b1945SPawel Piatek    libvirt.cpus = vmcpu
296282b1945SPawel Piatek    libvirt.video_type = "cirrus"
29702e00efcSMichal Berger    libvirt.nic_model_type = (ENV['NIC_MODEL'] || "virtio")
298282b1945SPawel Piatek
299282b1945SPawel Piatek    if (distro.include?("freebsd"))
300282b1945SPawel Piatek      # generic/freebsd boxes need to be explicitly run with SCSI bus,
301282b1945SPawel Piatek      # otherwise boot process fails on mounting the disk
302282b1945SPawel Piatek      libvirt.disk_bus = "scsi"
303282b1945SPawel Piatek    elsif (distro.include?("arch"))
304282b1945SPawel Piatek      # Run generic/arch boxes explicitly with IDE bus,
305282b1945SPawel Piatek      # otherwise boot process fails on mounting the disk
306282b1945SPawel Piatek      libvirt.disk_bus = "ide"
307282b1945SPawel Piatek    else
308282b1945SPawel Piatek      libvirt.disk_bus = "virtio"
309282b1945SPawel Piatek    end
310282b1945SPawel Piatek
311282b1945SPawel Piatek    if ENV['SPDK_QEMU_EMULATOR']
312282b1945SPawel Piatek      libvirt.emulator_path = ENV['SPDK_QEMU_EMULATOR']
313282b1945SPawel Piatek      libvirt.machine_type = "pc"
314282b1945SPawel Piatek    end
315282b1945SPawel Piatek
316282b1945SPawel Piatek    # we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems
317282b1945SPawel Piatek    # and to be able to run vagrant from user $HOME directory
318282b1945SPawel Piatek
319282b1945SPawel Piatek    # Loop to create all emulated disks set
320282b1945SPawel Piatek    emulated_nvme_types.each_with_index { |disk, index|
321282b1945SPawel Piatek      setup_nvme_disk(libvirt, disk, index)
322282b1945SPawel Piatek    }
323282b1945SPawel Piatek
3247bea0a07SMichal Berger    # Add network interface for openstack tests
3257bea0a07SMichal Berger    if ENV['SPDK_OPENSTACK_NETWORK'] == "1"
3267bea0a07SMichal Berger      libvirt.qemuargs :value => "-device"
3277bea0a07SMichal Berger      libvirt.qemuargs :value => "virtio-net,netdev=openstack.0"
3287bea0a07SMichal Berger      libvirt.qemuargs :value => "-netdev"
3297bea0a07SMichal Berger      libvirt.qemuargs :value => "user,id=openstack.0"
3307bea0a07SMichal Berger    end
3317bea0a07SMichal Berger
332282b1945SPawel Piatek    if ENV['VAGRANT_HUGE_MEM'] == "1"
333282b1945SPawel Piatek      libvirt.memorybacking :hugepages
334282b1945SPawel Piatek    end
335282b1945SPawel Piatek
336282b1945SPawel Piatek    # Optional field if we want use other storage pools than default
337282b1945SPawel Piatek    # libvirt.storage_pool_name = "vm"
338282b1945SPawel Piatek  end
339282b1945SPawel Piatekend
340282b1945SPawel Piatek
341dca3fdc4SPawel Piatek#################################################################################################
34246e00b54SKamil Godzwon# Pick the right distro and bootstrap, default is fedora37
34346e00b54SKamil Godzwondistro = (ENV['SPDK_VAGRANT_DISTRO'] || "fedora37")
3441cbd14caSLavar Askewprovider = (ENV['SPDK_VAGRANT_PROVIDER'] || "virtualbox")
3457fe1b36aSKarol Latecki
3466fac35a3SMaciej Wawryk# Get all variables for creating vm
3476fac35a3SMaciej Wawrykvmcpu = (ENV['SPDK_VAGRANT_VMCPU'] || 2)
3486fac35a3SMaciej Wawrykvmram = (ENV['SPDK_VAGRANT_VMRAM'] || 4096)
3496fac35a3SMaciej Wawryk
350264e0a0aSMichal Bergerforce_distro = ENV['FORCE_DISTRO'] == "true" ? true : false
351264e0a0aSMichal Berger
352264e0a0aSMichal Bergerdistro_to_use = get_box_type(distro, force_distro)
353e1287f7fSMichal Berger# Remove --copy-links from default rsync cmdline since we do want to sync
354e1287f7fSMichal Berger# actual symlinks as well. Also, since copy is made between host and its
355e1287f7fSMichal Berger# local VM we don't need to worry about saturating the local link so skip
356e1287f7fSMichal Berger# the compression to speed up the whole transfer.
357e1287f7fSMichal Bergerfiles_sync_backend = {type: "rsync", rsync__auto: false, rsync__args: ["--archive", "--verbose", "--delete"]}
358680ed635SPawel Piatek
359680ed635SPawel Piatekif ENV['NFS4_BACKEND'] or not Vagrant.has_plugin?("vagrant-sshfs")
360edc93a24SPawel Piatek  plugins_sync_backend = {type: :nfs, nfs_udp: false, nfs_version: 4}
361680ed635SPawel Piatekelse
362680ed635SPawel Piatek  plugins_sync_backend = {type: :sshfs}
363680ed635SPawel Piatekend
364dca3fdc4SPawel Piatek
365dca3fdc4SPawel PiatekVagrant.configure(2) do |config|
366264e0a0aSMichal Berger  config.vm.box = distro_to_use
36711fa5403SJim Harris  config.vm.box_check_update = false
368485d615dSKarol Latecki  config.vm.synced_folder '.', '/vagrant', disabled: true
369182adb70SMichal Berger  if ENV['VAGRANT_BOX_VERSION']
370182adb70SMichal Berger    config.vm.box_version = ENV['VAGRANT_BOX_VERSION']
371182adb70SMichal Berger  end
37211fa5403SJim Harris
37311fa5403SJim Harris  # Copy in the .gitconfig if it exists
374b5fea131SPawel Piatek  copy_gitconfig(config)
37511fa5403SJim Harris
376b5fea131SPawel Piatek  # Copy in the user's tools if they exists
377b5fea131SPawel Piatek  copy_vagrant_tools(config,files_sync_backend)
378b5fea131SPawel Piatek
37964c27c8dSPawel Piatek  copy_sources_dirs(config, files_sync_backend)
380b5fea131SPawel Piatek
381b5fea131SPawel Piatek  # rsync artifacts from build
382b5fea131SPawel Piatek  copy_spdk_artifacts(config, plugins_sync_backend)
3836695ac27SSeth Howell
384211be739SPawel Piatek  # Setup SSH
385211be739SPawel Piatek  setup_ssh(config)
38611fa5403SJim Harris
3872e617732SPawel Piatek  # Virtualbox configuration
3882e617732SPawel Piatek  setup_virtualbox(config,vmcpu,vmram)
38930dfc6d5SDaniel Mrzyglod
390282b1945SPawel Piatek  setup_libvirt(config,vmcpu,vmram,distro)
39130dfc6d5SDaniel Mrzyglod
3926695ac27SSeth Howell  # provision the vm with all of the necessary spdk dependencies for running the autorun.sh tests
3939433190fSMichal Berger  deploy_test_vm(config, distro, plugins_sync_backend)
39411fa5403SJim Harrisend
3958aee39f9SMichal Berger
3968aee39f9SMichal Bergerif ENV['EXTRA_VAGRANTFILES']
3978aee39f9SMichal Berger  loaders = (ENV['EXTRA_VAGRANTFILES'].split(','))
3988aee39f9SMichal Berger  loaders.each { |loader|
3998aee39f9SMichal Berger    load loader if File.exists?(loader)
4008aee39f9SMichal Berger  }
4018aee39f9SMichal Bergerend
402