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:
Sergey Vasilenko 2015-06-02 15:41:25 +03:00
parent 5bd0333f51
commit 713840a532
3 changed files with 67 additions and 24 deletions

View File

@ -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 :

View File

@ -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

View File

@ -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