class QemuToolkit::Vnic

Attributes

interface[R]
macaddr[R]
number[R]
over[R]
prefix[R]
vlan[R]

Public Class Methods

create(prefix, over, backend, macaddr=nil) click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 34
def create(prefix, over, backend, macaddr=nil)
  # Retrieve links that exist for this prefix and this over interface
  vnics = for_prefix(prefix, backend)
  next_vnic_number = (vnics.map(&:number).max || 0) + 1

  new(prefix, next_vnic_number, over, macaddr).tap { |o|
    o.create(backend) }
end
for_prefix(prefix, background) click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 9
def for_prefix(prefix, background)
  vnics = VnicCollection.new
  links = background.dladm 'show-vnic', '-po link,over,vid,macaddress'

  re_separator = /(?<!\\):/
  
  links.each_line do |line|
    next unless line.start_with?(prefix)
    link, over, vid, macaddr = line.chomp.split(re_separator)

    # macaddr being the only place escaping takes place, unescape it
    # by replacing \: -> :
    macaddr.gsub!(/\\:/, ':')
    
    # Assumes that vid 0 is always the 'no vlan' VLAN
    over = "#{over}:#{vid}" if vid.to_i > 0
    
    if md=link.match(/^(?<vm>.*)_(?<link_no>\d+)$/)
      vnics << Vnic.new(md[:vm], Integer(md[:link_no]), over, macaddr)
    end
  end
  
  vnics
end
new(prefix, number, over, macaddr=nil) click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 45
def initialize(prefix, number, over, macaddr=nil)
  @prefix, @number, @over = prefix, number, over
  @macaddr = macaddr && Network::MacAddress.new(macaddr)

  if vlan_tagged?
    @interface, @vlan = @over.split(':')
  else
    @interface = @over
    @vlan = nil
  end
end

Public Instance Methods

==(other) click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 65
def ==(other)
  self.prefix == other.prefix && 
    self.number == other.number && 
    self.over == other.over && 
    self.macaddr == other.macaddr
end
create(backend) click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 83
def create backend
  opts = ["-l #{interface}"]

  opts << "-v #{vlan}" if vlan_tagged?
  opts << "--mac-address #{macaddr}" if mac_address?

  backend.dladm 'create-vnic', *opts, vnic_name
end
mac_address?() click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 79
def mac_address?
  @macaddr
end
to_s() click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 72
def to_s
  "#{vnic_name} (#{vlan || 'g'}/#{macaddr})"
end
vlan_tagged?() click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 76
def vlan_tagged?
  @over.index(':')
end
vnic_name() click to toggle source
# File lib/qemu-toolkit/vnic.rb, line 92
def vnic_name
  "#{prefix}_#{number}"
end