aboutsummaryrefslogtreecommitdiffstats
path: root/extras/vagrant/Vagrantfile
blob: a97a3dc38fc0979e30cac1271a954b6d43a05fdd (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
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  # Pick the right distro and bootstrap, default is ubuntu1604
  distro = ( ENV['VPP_VAGRANT_DISTRO'] || "ubuntu1604")
  if distro == 'centos7'
    config.vm.box = "centos/7"
    config.vm.box_version = "1708.01"
    config.ssh.insert_key = false
  elsif distro == 'opensuse'
    config.vm.box = "opensuse/openSUSE-42.3-x86_64"
    config.vm.box_version = "1.0.4.20170726"
  elsif distro == 'ubuntu1804'
    config.vm.box = "bento/ubuntu-18.04"
  else
    config.vm.box = "puppetlabs/ubuntu-16.04-64-nocm"
  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"), :args => "/vpp vagrant"

  post_build = ( ENV['VPP_VAGRANT_POST_BUILD'] )
  if post_build == "test"
    config.vm.provision "shell", inline: "echo Testing VPP; cd /vpp; make test"
  elsif post_build == "install"
    config.vm.provision :shell, :path => File.join(File.dirname(__FILE__),"install.sh"), :args => "/vpp"
    config.vm.provision :shell, :path => File.join(File.dirname(__FILE__),"clearinterfaces.sh")
    config.vm.provision :shell, :path => File.join(File.dirname(__FILE__),"run.sh")
  end

  # Add .gnupg dir in so folks can sign patches
  # Note, as gnupg puts socket files in that dir, we have
  # to be cautious and make sure we are dealing with a plain file
  homedir = File.expand_path("~/")
  Dir["#{homedir}/.gnupg/**/*"].each do |fname|
    if File.file?(fname)
      destname = fname.sub(Regexp.escape("#{homedir}/"),'')
      config.vm.provision "file", source: fname, destination: destname
    end
  end

  # Copy in the .gitconfig if it exists
  if File.file?(File.expand_path("~/.gitconfig"))
    config.vm.provision  "file", source: "~/.gitconfig", destination: ".gitconfig"
  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

  # Define some physical ports for your VMs to be used by DPDK
  nics = (ENV['VPP_VAGRANT_NICS'] || "2").to_i(10)
  for i in 1..nics
    config.vm.network "private_network", type: "dhcp"
  end

  # 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['VPP_VAGRANT_VMCPU'] || 2)
  vmram=(ENV['VPP_VAGRANT_VMRAM'] || 4096)

  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}"

      # rsync the vpp directory if provision hasn't happened yet
      unless File.exist? (".vagrant/machines/default/virtualbox/action_provision")
        config.vm.synced_folder "../../", "/vpp", type: "rsync",
         rsync__auto: false,
         rsync__exclude: [
          "build-root/build*/",
          "build-root/install*/",
          "build-root/images*/",
          "build-root/*.deb",
          "build-root/*.rpm",
          "build-root/*.changes",
          "build-root/python",
          "build-root/deb/debian/*.dkms",
          "build-root/deb/debian/*.install",
          "build-root/deb/debian/changes",
          "build-root/tools"]
      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
  config.vm.provider "vmware_fusion" do |fusion,override|
    fusion.vmx["memsize"] = "#{vmram}"
    fusion.vmx["numvcpus"] = "#{vmcpu}"
  end
  config.vm.provider "libvirt" do |lv|
    lv.memory = "#{vmram}"
    lv.cpus = "#{vmcpu}"
  end
  config.vm.provider "vmware_workstation" do |vws,override|
    vws.vmx["memsize"] = "#{vmram}"
    vws.vmx["numvcpus"] = "#{vmcpu}"
  end
end
span>.bridge_domain_dump(bd_id) for bd in bds: for p in bd.sw_if_details: if p.sw_if_index == sw_if_index: return True return False def find_bridge_domain_arp_entry(test, bd_id, mac, ip): vmac = MACAddress(mac) vip = VppIpAddress(ip) if vip.version == 4: n = 4 else: n = 16 arps = test.vapi.bd_ip_mac_dump(bd_id) for arp in arps: # do IP addr comparison too once .api is fixed... if vmac.packed == arp.mac_address and \ vip.bytes == arp.ip_address[:n]: return True return False def find_l2_fib_entry(test, bd_id, mac, sw_if_index): vmac = MACAddress(mac) lfs = test.vapi.l2_fib_table_dump(bd_id) for lf in lfs: if vmac.packed == lf.mac and sw_if_index == lf.sw_if_index: return True return False class VppBridgeDomain(VppObject): def __init__(self, test, bd_id, flood=1, uu_flood=1, forward=1, learn=1, arp_term=1): self._test = test self.bd_id = bd_id self.flood = flood self.uu_flood = uu_flood self.forward = forward self.learn = learn self.arp_term = arp_term def add_vpp_config(self): self._test.vapi.bridge_domain_add_del( self.bd_id, is_add=1, flood=self.flood, uu_flood=self.uu_flood, forward=self.forward, learn=self.learn, arp_term=self.arp_term) self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): self._test.vapi.bridge_domain_add_del(self.bd_id, is_add=0) def query_vpp_config(self): return find_bridge_domain(self._test, self.bd_id) def __str__(self): return self.object_id() def object_id(self): return "bridge-domain-%d" % (self.bd_id) class VppBridgeDomainPort(VppObject): def __init__(self, test, bd, itf, port_type=L2_PORT_TYPE.NORMAL): self._test = test self.bd = bd self.itf = itf self.port_type = port_type def add_vpp_config(self): self._test.vapi.sw_interface_set_l2_bridge( self.itf.sw_if_index, self.bd.bd_id, port_type=self.port_type, enable=1) self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): self._test.vapi.sw_interface_set_l2_bridge( self.itf.sw_if_index, self.bd.bd_id, port_type=self.port_type, enable=0) def query_vpp_config(self): return find_bridge_domain_port(self._test, self.bd.bd_id, self.itf.sw_if_index) def __str__(self): return self.object_id() def object_id(self): return "BD-Port-%s-%s" % (self.bd, self.itf) class VppBridgeDomainArpEntry(VppObject): def __init__(self, test, bd, mac, ip): self._test = test self.bd = bd self.mac = MACAddress(mac) self.ip = VppIpAddress(ip) def add_vpp_config(self): self._test.vapi.bd_ip_mac_add_del( self.bd.bd_id, self.mac.packed, self.ip.encode(), is_add=1) self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): self._test.vapi.bd_ip_mac_add_del( self.bd.bd_id, self.mac.packed, self.ip.encode(), is_add=0) def query_vpp_config(self): return find_bridge_domain_arp_entry(self._test, self.bd.bd_id, self.mac.packed, self.ip.address) def __str__(self): return self.object_id() def object_id(self): return "BD-Arp-Entry-%s-%s-%s" % (self.bd, self.mac, self.ip.address) class VppL2FibEntry(VppObject): def __init__(self, test, bd, mac, itf, static_mac=0, filter_mac=0, bvi_mac=-1): self._test = test self.bd = bd self.mac = MACAddress(mac) self.itf = itf self.static_mac = static_mac self.filter_mac = filter_mac if bvi_mac == -1: self.bvi_mac = isinstance(self.itf, VppLoInterface) else: self.bvi_mac = bvi_mac def add_vpp_config(self): self._test.vapi.l2fib_add_del( self.mac.packed, self.bd.bd_id, self.itf.sw_if_index, is_add=1, static_mac=self.static_mac, filter_mac=self.filter_mac, bvi_mac=self.bvi_mac) self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): self._test.vapi.l2fib_add_del( self.mac.packed, self.bd.bd_id, self.itf.sw_if_index, is_add=0) def query_vpp_config(self): return find_l2_fib_entry(self._test, self.bd.bd_id, self.mac.packed, self.itf.sw_if_index) def __str__(self): return self.object_id() def object_id(self): return "L2-Fib-Entry-%s-%s-%s" % (self.bd, self.mac, self.itf)