Workaround Ubuntu bug: ifup is not executed for OVS interfaces
Interfaces are created in both modes simultaneously: * OVS port (with additional OVS-aware directives) * ethernet port (for executing at boot time) Change-Id: Id17dd4b0f875643d21fdfd62cb0fc872078e0d95 Closes-bug: #1460972
This commit is contained in:
parent
5bd0333f51
commit
713840a532
|
@ -13,7 +13,7 @@ Puppet::Type.type(:l23_stored_config).provide(:lnx_ubuntu, :parent => Puppet::Pr
|
||||||
self.unlink_empty_files = true
|
self.unlink_empty_files = true
|
||||||
|
|
||||||
def self.check_if_provider(if_data)
|
def self.check_if_provider(if_data)
|
||||||
if if_data[:if_provider] == 'auto'
|
if if_data[:if_provider] =~ /lnx/
|
||||||
if_data[:if_provider] = :lnx
|
if_data[:if_provider] = :lnx
|
||||||
true
|
true
|
||||||
else
|
else
|
||||||
|
@ -22,5 +22,19 @@ Puppet::Type.type(:l23_stored_config).provide(:lnx_ubuntu, :parent => Puppet::Pr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.iface_file_header(provider)
|
||||||
|
rv = []
|
||||||
|
|
||||||
|
# Add onboot interfaces
|
||||||
|
if provider.onboot
|
||||||
|
rv << "auto #{provider.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Add iface header
|
||||||
|
rv << "iface #{provider.name} inet #{provider.method}"
|
||||||
|
|
||||||
|
return rv, {}
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
# vim: set ts=2 sw=2 et :
|
# vim: set ts=2 sw=2 et :
|
|
@ -12,14 +12,14 @@ Puppet::Type.type(:l23_stored_config).provide(:ovs_ubuntu, :parent => Puppet::Pr
|
||||||
def self.property_mappings
|
def self.property_mappings
|
||||||
rv = super
|
rv = super
|
||||||
rv.merge!({
|
rv.merge!({
|
||||||
:onboot => 'allow-ovs'
|
:ovs_type => 'ovs_type',
|
||||||
|
:ovs_bridge => 'ovs_bridge',
|
||||||
})
|
})
|
||||||
return rv
|
return rv
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.check_if_provider(if_data)
|
def self.check_if_provider(if_data)
|
||||||
#((if_data[:if_provider] == 'allow-ovs') ? true : false)
|
if if_data[:if_provider].to_s =~ /ovs/
|
||||||
if if_data[:if_provider] == 'allow-ovs'
|
|
||||||
if_data[:if_provider] = :ovs
|
if_data[:if_provider] = :ovs
|
||||||
true
|
true
|
||||||
else
|
else
|
||||||
|
@ -28,6 +28,38 @@ Puppet::Type.type(:l23_stored_config).provide(:ovs_ubuntu, :parent => Puppet::Pr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.iface_file_header(provider)
|
||||||
|
header = []
|
||||||
|
props = {}
|
||||||
|
|
||||||
|
|
||||||
|
# Add onboot interfaces
|
||||||
|
if provider.onboot
|
||||||
|
header << "auto #{provider.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
bridge = provider.bridge[0]
|
||||||
|
if provider.if_type.to_s == 'bridge'
|
||||||
|
header << "allow-ovs #{provider.name}"
|
||||||
|
props[:bridge_ports] = nil
|
||||||
|
props[:ovs_type] = 'OVSBridge'
|
||||||
|
props[:ovs_bridge] = nil
|
||||||
|
elsif provider.if_type.to_s == 'bond'
|
||||||
|
props[:ovs_type] = 'OVSBond'
|
||||||
|
props[:ovs_bridge] = bridge
|
||||||
|
else
|
||||||
|
header << "allow-#{bridge} #{provider.name}"
|
||||||
|
props[:ovs_type] = 'OVSIntPort'
|
||||||
|
props[:ovs_bridge] = bridge
|
||||||
|
end
|
||||||
|
# Add iface header
|
||||||
|
header << "iface #{provider.name} inet #{provider.method}"
|
||||||
|
|
||||||
|
return header, props
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def self.mangle__type(val)
|
def self.mangle__type(val)
|
||||||
:ethernet
|
:ethernet
|
||||||
end
|
end
|
||||||
|
|
|
@ -65,8 +65,8 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
# In the interface config files those fields should be written as boolean
|
# In the interface config files those fields should be written as boolean
|
||||||
def self.boolean_properties
|
def self.boolean_properties
|
||||||
[
|
[
|
||||||
:hotplug,
|
|
||||||
:onboot,
|
:onboot,
|
||||||
|
:hotplug,
|
||||||
:bridge_stp
|
:bridge_stp
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
@ -80,7 +80,6 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
:name,
|
:name,
|
||||||
:family,
|
:family,
|
||||||
:method,
|
:method,
|
||||||
:if_type,
|
|
||||||
:if_provider
|
:if_provider
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
@ -120,7 +119,7 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
# initialize hash as predictible values
|
# initialize hash as predictible values
|
||||||
hash = {}
|
hash = {}
|
||||||
hash['auto'] = false
|
hash['auto'] = false
|
||||||
hash['if_provider'] = 'none'
|
hash['if_provider'] = 'lnx'
|
||||||
hash['if_type'] = :ethernet
|
hash['if_type'] = :ethernet
|
||||||
dirty_iface_name = nil
|
dirty_iface_name = nil
|
||||||
if (m = filename.match(%r/ifcfg-(\S+)$/))
|
if (m = filename.match(%r/ifcfg-(\S+)$/))
|
||||||
|
@ -136,14 +135,19 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
val = m[2].strip
|
val = m[2].strip
|
||||||
case key
|
case key
|
||||||
# Ubuntu has non-linear config format. Some options should be calculated evristically
|
# Ubuntu has non-linear config format. Some options should be calculated evristically
|
||||||
when /(auto|allow-ovs)/
|
when /(auto|allow-\S)/
|
||||||
hash[$1] = true
|
ooper = $1
|
||||||
hash['if_provider'] = $1 # temporary store additional data for self.check_if_provider
|
|
||||||
if ! hash.has_key?('iface')
|
if ! hash.has_key?('iface')
|
||||||
# setup iface name if it not given in iface directive
|
# setup iface name if it not given in iface directive
|
||||||
mm = val.split(/\s+/)
|
mm = val.split(/\s+/)
|
||||||
hash['iface'] = mm[0]
|
hash['iface'] = mm[0]
|
||||||
end
|
end
|
||||||
|
if ooper =~ /allow-(\S)/
|
||||||
|
hash['if_provider'] = "ovs:#{$1}:#{val}"
|
||||||
|
else
|
||||||
|
hash['auto'] = true
|
||||||
|
hash['if_provider'] ||= "lnx"
|
||||||
|
end
|
||||||
when /iface/
|
when /iface/
|
||||||
mm = val.split(/\s+/)
|
mm = val.split(/\s+/)
|
||||||
hash['iface'] = mm[0]
|
hash['iface'] = mm[0]
|
||||||
|
@ -237,7 +241,7 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
|
|
||||||
boolean_properties.each do |bool_property|
|
boolean_properties.each do |bool_property|
|
||||||
if props[bool_property]
|
if props[bool_property]
|
||||||
props[bool_property] = ! (props[bool_property] =~ /^\s*(yes|on)\s*$/i).nil?
|
props[bool_property] = ! (props[bool_property].to_s =~ /^\s*(yes|on|true)\s*$/i).nil?
|
||||||
else
|
else
|
||||||
props[bool_property] = :absent
|
props[bool_property] = :absent
|
||||||
end
|
end
|
||||||
|
@ -319,6 +323,10 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
###
|
###
|
||||||
# Hash to file
|
# Hash to file
|
||||||
|
|
||||||
|
def self.iface_file_header(provider)
|
||||||
|
raise Puppet::Error, "self.iface_file_header(provider) Should be implemented in more specific class."
|
||||||
|
end
|
||||||
|
|
||||||
def self.format_file(filename, providers)
|
def self.format_file(filename, providers)
|
||||||
if providers.length == 0
|
if providers.length == 0
|
||||||
return ""
|
return ""
|
||||||
|
@ -326,22 +334,11 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||||
raise Puppet::DevError, "Unable to support multiple interfaces [#{providers.map(&:name).join(',')}] in a single file #{filename}"
|
raise Puppet::DevError, "Unable to support multiple interfaces [#{providers.map(&:name).join(',')}] in a single file #{filename}"
|
||||||
end
|
end
|
||||||
|
|
||||||
content = []
|
|
||||||
provider = providers[0]
|
provider = providers[0]
|
||||||
|
content, props = iface_file_header(provider)
|
||||||
# Add onboot interfaces
|
|
||||||
if provider.onboot
|
|
||||||
content << "#{property_mappings[:onboot]} #{provider.name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Add iface header
|
|
||||||
content << "iface #{provider.name} inet #{provider.method}"
|
|
||||||
|
|
||||||
# Map everything to a flat hash
|
|
||||||
#props = (provider.options || {})
|
|
||||||
props = {}
|
|
||||||
|
|
||||||
property_mappings.keys.select{|v| ! properties_fake.include?(v)}.each do |type_name|
|
property_mappings.keys.select{|v| ! properties_fake.include?(v)}.each do |type_name|
|
||||||
|
next if props.has_key? type_name
|
||||||
val = provider.send(type_name)
|
val = provider.send(type_name)
|
||||||
if val and val.to_s != 'absent'
|
if val and val.to_s != 'absent'
|
||||||
props[type_name] = val
|
props[type_name] = val
|
||||||
|
|
Loading…
Reference in New Issue