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
|
||||
|
||||
def self.check_if_provider(if_data)
|
||||
if if_data[:if_provider] == 'auto'
|
||||
if if_data[:if_provider] =~ /lnx/
|
||||
if_data[:if_provider] = :lnx
|
||||
true
|
||||
else
|
||||
@ -22,5 +22,19 @@ Puppet::Type.type(:l23_stored_config).provide(:lnx_ubuntu, :parent => Puppet::Pr
|
||||
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
|
||||
# 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
|
||||
rv = super
|
||||
rv.merge!({
|
||||
:onboot => 'allow-ovs'
|
||||
:ovs_type => 'ovs_type',
|
||||
:ovs_bridge => 'ovs_bridge',
|
||||
})
|
||||
return rv
|
||||
end
|
||||
|
||||
def self.check_if_provider(if_data)
|
||||
#((if_data[:if_provider] == 'allow-ovs') ? true : false)
|
||||
if if_data[:if_provider] == 'allow-ovs'
|
||||
if if_data[:if_provider].to_s =~ /ovs/
|
||||
if_data[:if_provider] = :ovs
|
||||
true
|
||||
else
|
||||
@ -28,6 +28,38 @@ Puppet::Type.type(:l23_stored_config).provide(:ovs_ubuntu, :parent => Puppet::Pr
|
||||
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)
|
||||
:ethernet
|
||||
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
|
||||
def self.boolean_properties
|
||||
[
|
||||
:hotplug,
|
||||
:onboot,
|
||||
:hotplug,
|
||||
:bridge_stp
|
||||
]
|
||||
end
|
||||
@ -80,7 +80,6 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||
:name,
|
||||
:family,
|
||||
:method,
|
||||
:if_type,
|
||||
:if_provider
|
||||
]
|
||||
end
|
||||
@ -120,7 +119,7 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||
# initialize hash as predictible values
|
||||
hash = {}
|
||||
hash['auto'] = false
|
||||
hash['if_provider'] = 'none'
|
||||
hash['if_provider'] = 'lnx'
|
||||
hash['if_type'] = :ethernet
|
||||
dirty_iface_name = nil
|
||||
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
|
||||
case key
|
||||
# Ubuntu has non-linear config format. Some options should be calculated evristically
|
||||
when /(auto|allow-ovs)/
|
||||
hash[$1] = true
|
||||
hash['if_provider'] = $1 # temporary store additional data for self.check_if_provider
|
||||
when /(auto|allow-\S)/
|
||||
ooper = $1
|
||||
if ! hash.has_key?('iface')
|
||||
# setup iface name if it not given in iface directive
|
||||
mm = val.split(/\s+/)
|
||||
hash['iface'] = mm[0]
|
||||
end
|
||||
if ooper =~ /allow-(\S)/
|
||||
hash['if_provider'] = "ovs:#{$1}:#{val}"
|
||||
else
|
||||
hash['auto'] = true
|
||||
hash['if_provider'] ||= "lnx"
|
||||
end
|
||||
when /iface/
|
||||
mm = val.split(/\s+/)
|
||||
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|
|
||||
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
|
||||
props[bool_property] = :absent
|
||||
end
|
||||
@ -319,6 +323,10 @@ class Puppet::Provider::L23_stored_config_ubuntu < Puppet::Provider::L23_stored_
|
||||
###
|
||||
# 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)
|
||||
if providers.length == 0
|
||||
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}"
|
||||
end
|
||||
|
||||
content = []
|
||||
provider = providers[0]
|
||||
|
||||
# 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 = {}
|
||||
content, props = iface_file_header(provider)
|
||||
|
||||
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)
|
||||
if val and val.to_s != 'absent'
|
||||
props[type_name] = val
|
||||
|
Loading…
Reference in New Issue
Block a user