1 require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'puppetx', 'redhat', 'ifcfg.rb'))
3 BASE = '/etc/sysconfig/network-scripts/ifcfg-'
5 # When not seedling from interface file
10 'NM_CONTROLLED' => 'no',
11 'NOZEROCONF' => 'yes' }
13 Puppet::Type.type(:vs_port).provide(:ovs_redhat, :parent => :ovs) do
14 desc 'Openvswitch port manipulation for RedHat OSes family'
16 confine :osfamily => :redhat
17 defaultfor :osfamily => :redhat
20 commands :ifdown => 'ifdown'
21 commands :ifup => 'ifup'
22 commands :vsctl => 'ovs-vsctl'
25 unless vsctl('list-ports',
26 @resource[:bridge]).include? @resource[:interface]
30 if interface_physical?
35 extras = dynamic_default if dynamic?
36 if File.exist?(BASE + @resource[:interface])
37 template = cleared(from_str(File.read(BASE + @resource[:interface])))
41 port = IFCFG::Port.new(@resource[:interface], @resource[:bridge])
43 port.set('VLAN' => 'yes')
47 port.set('BONDING_MASTER' => 'yes')
48 config = from_str(File.read(BASE + @resource[:interface]))
49 port.set('BONDING_OPTS' => config['BONDING_OPTS']) if config.has_key?('BONDING_OPTS')
52 port.save(BASE + @resource[:interface])
54 bridge = IFCFG::Bridge.new(@resource[:bridge], template)
55 bridge.set(extras) if extras
56 bridge.save(BASE + @resource[:bridge])
58 ifdown(@resource[:bridge])
59 ifdown(@resource[:interface])
60 ifup(@resource[:interface])
61 ifup(@resource[:bridge])
66 if interface_physical?
68 IFCFG::OVS.exists?(@resource[:interface]) &&
69 IFCFG::OVS.exists?(@resource[:bridge])
76 if interface_physical?
77 ifdown(@resource[:bridge])
78 ifdown(@resource[:interface])
79 IFCFG::OVS.remove(@resource[:interface])
80 IFCFG::OVS.remove(@resource[:bridge])
88 # To do: replace with iproute2 commands
89 if File.exists?("/proc/net/bonding/#{@resource[:interface]}")
100 device = ip('addr', 'show', @resource[:interface])
101 return device =~ /dynamic/ ? true : false
105 if File.read("/sys/class/net/#{@resource[:interface]}/operstate") =~ /up/
115 list = { 'OVSDHCPINTERFACES' => @resource[:interface] }
116 # Persistent MAC address taken from interface
117 bridge_mac_address = File.read("/sys/class/net/#{@resource[:interface]}/address").chomp
118 if bridge_mac_address != ''
119 list.merge!({ 'OVS_EXTRA' =>
120 "\"set bridge #{@resource[:bridge]} other-config:hwaddr=#{bridge_mac_address}\"" })
125 def interface_physical?
126 # OVS ports don't have entries in /sys/class/net
127 # Alias interfaces (ethX:Y) must use ethX entries
128 interface = @resource[:interface].sub(/:\d/, '')
129 ! Dir["/sys/class/net/#{interface}"].empty?
134 data.each_line do |line|
135 if m = line.match(/^([A-Za-z_]*)=(.*)$/)
136 items.merge!(m[1] => m[2])
143 data.each do |key, value|
154 if File.read('/proc/net/vlan/config') =~ /#{@resource[:interface]}/