Class: QemuToolkit::Vnic

Inherits:
Object
  • Object
show all
Defined in:
lib/qemu-toolkit/vnic.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(prefix, number, over, macaddr = nil) ⇒ Vnic

Returns a new instance of Vnic.



45
46
47
48
49
50
51
52
53
54
55
# 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

Instance Attribute Details

#interfaceObject (readonly)

Returns the value of attribute interface.



62
63
64
# File 'lib/qemu-toolkit/vnic.rb', line 62

def interface
  @interface
end

#macaddrObject (readonly)

Returns the value of attribute macaddr.



60
61
62
# File 'lib/qemu-toolkit/vnic.rb', line 60

def macaddr
  @macaddr
end

#numberObject (readonly)

Returns the value of attribute number.



58
59
60
# File 'lib/qemu-toolkit/vnic.rb', line 58

def number
  @number
end

#overObject (readonly)

Returns the value of attribute over.



59
60
61
# File 'lib/qemu-toolkit/vnic.rb', line 59

def over
  @over
end

#prefixObject (readonly)

Returns the value of attribute prefix.



57
58
59
# File 'lib/qemu-toolkit/vnic.rb', line 57

def prefix
  @prefix
end

#vlanObject (readonly)

Returns the value of attribute vlan.



63
64
65
# File 'lib/qemu-toolkit/vnic.rb', line 63

def vlan
  @vlan
end

Class Method Details

.create(prefix, over, backend, macaddr = nil) ⇒ Object



34
35
36
37
38
39
40
41
# 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) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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

Instance Method Details

#==(other) ⇒ Object



65
66
67
68
69
70
# 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) ⇒ Object



83
84
85
86
87
88
89
90
# 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?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/qemu-toolkit/vnic.rb', line 79

def mac_address?
  @macaddr
end

#to_sObject



72
73
74
# File 'lib/qemu-toolkit/vnic.rb', line 72

def to_s
  "#{vnic_name} (#{vlan || 'g'}/#{macaddr})"
end

#vlan_tagged?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/qemu-toolkit/vnic.rb', line 76

def vlan_tagged?
  @over.index(':')
end

#vnic_nameObject



92
93
94
# File 'lib/qemu-toolkit/vnic.rb', line 92

def vnic_name
  "#{prefix}_#{number}"
end