Merge "Refactor 'get' method for fetch ovs and lnx bridges list" into stable/mitaka

This commit is contained in:
Jenkins 2016-07-25 15:02:10 +00:00 committed by Gerrit Code Review
commit ddd7719151
6 changed files with 137 additions and 50 deletions

View File

@ -353,10 +353,7 @@ class Puppet::Provider::L2_base < Puppet::Provider::InterfaceToolset
end
# ---------------------------------------------------------------------------
def self.get_bridge_list
# search all (LXN and OVS) bridges on the host, and return hash with mapping
# bridge_name => { bridge options }
#
def self.get_ovs_bridge_list
bridges = {}
# obtain OVS bridges list
re_c = /^\s*([\w\-]+)/
@ -367,26 +364,41 @@ class Puppet::Provider::L2_base < Puppet::Provider::InterfaceToolset
listbr.select{|l| l.match(re_c)}.collect{|a| $1 if a.match(re_c)}.each do |br_name|
br_name.strip!
bridges[br_name] = {
:members => [],
:br_type => :ovs
}
end
end
# obtain LNX bridges list
re_c = /([\w\-]+)\s+\d+/
begin
# todo(sv): using port_list instead fork subprocess
self.brctl(['show']).select{|l| l.match(re_c)}.collect{|a| $1 if a.match(re_c)}.each do |br_name|
br_name.strip!
#debug("OVS bridges: #{bridges.to_yaml.gsub('!ruby/sym ',':')}")
return bridges
end
def self.get_lnx_bridge_list
bridges = {}
interfaces = Dir.glob('/sys/class/net/*').select{ |f| File.symlink? f}
interfaces.each do |if_dir|
next if ! (File.directory?("#{if_dir}/bridge") and File.directory?("#{if_dir}/brif"))
# this interface is a bridge, get bridge properties
br_name = if_dir.split('/')[-1]
bridges[br_name] = {
:stp => (File.open("/sys/class/net/#{br_name}/bridge/stp_state").read.strip.to_i == 1),
:members => Dir.glob("/sys/class/net/#{br_name}/brif/*").map{|f| f.split('/')[-1]}.sort,
:stp => (File.open("/sys/class/net/#{br_name}/bridge/stp_state").read.strip.to_i == 1),
:external_ids => :absent,
:vendor_specific => {},
:br_type => :lnx
:br_type => :lnx
}
end
rescue
debug("No LNX bridges found, because error while 'brctl show' execution")
end
#debug("LNX bridges: #{bridges.to_yaml.gsub('!ruby/sym ',':')}")
return bridges
end
def self.get_bridge_list
# search all (LXN and OVS) bridges on the host, and return hash with mapping
# bridge_name => { bridge options }
#
bridges = {}
bridges.merge! self.get_ovs_bridge_list
bridges.merge! self.get_lnx_bridge_list
return bridges
end
@ -427,37 +439,19 @@ class Puppet::Provider::L2_base < Puppet::Provider::InterfaceToolset
# i.e {
# 'eth0' => { :bridge => 'br0', :br_type => :lnx },
# }
# This function returns all visible in default namespace ports
# This method returns all visible in default namespace ports
# (lnx and ovs (with type internal)) included to the lnx bridge
#
begin
brctl_show = self.brctl(['show']).split(/\n+/).select{|l| l.match(/^[\w\-]+\s+\d+/) or l.match(/^\s+[\w\.\-]+/)}
rescue
debug("No LNX bridges found, because error while 'brctl show' execution")
return {}
end
port_mappings = {}
br_name = nil
brctl_show.each do |line|
line.rstrip!
case line
when /^([\w\-]+)\s+[\d\.abcdef]+\s+(yes|no)\s+([\w\-\.]+$)/i
br_name = $1
port_name = $3
when /^\s+([\w\.\-]+)$/
#br_name using from previous turn
port_name = $1
else
next
end
if br_name
port_mappings[port_name] = {
self.get_lnx_bridge_list.each do |br_name, br_props|
br_props[:members].each do |member_name|
port_mappings[member_name] = {
:bridge => br_name,
:br_type => :lnx
}
end
end
debug("LNX ports to bridges mapping: #{port_mappings.to_yaml.gsub('!ruby/sym ',':')}")
#debug("LNX ports to bridges mapping: #{port_mappings.to_yaml.gsub('!ruby/sym ',':')}")
return port_mappings
end

View File

@ -12,21 +12,14 @@ Puppet::Type.type(:l2_bridge).provide(:lnx, :parent => Puppet::Provider::Lnx_bas
def self.instances
rv = []
get_bridge_list().each_pair do |bridge, props|
debug("prefetching '#{bridge}'")
get_lnx_bridge_list.each_pair do |bridge, props|
br_props = {
:ensure => :present,
:name => bridge,
}
br_props.merge! props
if props[:br_type] == :lnx
#br_props[:provider] = 'lnx'
#props[:port_type] = props[:port_type].insert(0, 'ovs').join(':')
rv << new(br_props)
debug("PREFETCH properties for '#{bridge}': #{br_props}")
else
debug("SKIP properties for '#{bridge}': #{br_props}")
end
rv << new(br_props)
debug("PREFETCH properties for '#{bridge}': #{br_props}")
end
rv
end
@ -87,6 +80,13 @@ Puppet::Type.type(:l2_bridge).provide(:lnx, :parent => Puppet::Provider::Lnx_bas
@property_flush[:stp] = (val.to_s.downcase.to_sym==:true)
end
def members
@property_hash[:members] || :absent
end
def members=(val)
@property_flush[:members] # do nothing
end
#-----------------------------------------------------------------

View File

@ -96,6 +96,13 @@ Puppet::Type.type(:l2_bridge).provide(:ovs, :parent => Puppet::Provider::Ovs_bas
@property_flush[:stp] = (val.to_s.downcase.to_sym==:true)
end
def members
@property_hash[:members] || :absent
end
def members=(val)
@property_flush[:members] # do nothing
end
#-----------------------------------------------------------------
def _split(string, splitter=",")

View File

@ -67,7 +67,7 @@ Puppet::Type.type(:l2_port).provide(:lnx, :parent => Puppet::Provider::Lnx_base)
begin
pkill('-KILL', '-f', "dhclient.*#{@resource[:interface]}$")
rescue
notice("'#{@resource[:interface]}' does not have any running dhclient processes")
debug("'#{@resource[:interface]}' does not have any running dhclient processes")
end
#
# FLUSH changed properties

View File

@ -87,6 +87,17 @@ Puppet::Type.newtype(:l2_bridge) do
defaultto :false
end
newproperty(:members, :array_matching => :all) do
desc "Internal read-only property"
validate do |value|
raise ArgumentError, "You shouldn't change 'members' -- it's a internal RO property! Use 'bridge' for ports, bond, etc... resources."
end
def insync?(value)
true
end
end
newproperty(:vendor_specific) do
desc "Hash of vendor specific properties"
#defaultto {} # no default value should be!!!

View File

@ -0,0 +1,75 @@
require 'spec_helper'
type_class = Puppet::Type.type(:l2_bridge)
provider_class = type_class.provider(:lnx)
describe provider_class do
let(:resource) do
type_class.new(
:ensure => 'present',
:use_ovs => true,
:external_ids => {
'bridge-id' => 'br-floating',
},
:provider => :lnx,
:name => 'br-floating',
)
end
let(:provider) { resource.provider }
let(:get_lnx_bridge_list) {{
'br1' => {
:ensure => :present,
:name => "br1",
:members => ["enp2s1"],
:stp => true,
:br_type => 'lnx'
},
'br2' => {
:ensure => :present,
:name => "br2",
:members => ["enp2s2"],
:stp => false,
:br_type => 'lnx',
}
}}
before(:each) do
puppet_debug_override()
end
it 'should exists' do
expect(provider).not_to be_nil
end
it 'should generate the array on provider instances' do
provider_class.stubs(:get_ovs_bridge_list).returns {}
provider_class.stubs(:get_lnx_bridge_list).returns get_lnx_bridge_list
instances = provider_class.instances
expect(instances).to be_a Array
expect(instances.length).to eq 2
instances.each do |provider|
expect(provider).to be_a Puppet::Type::L2_bridge::ProviderLnx
class << provider
def property_hash
@property_hash
end
end
end
expect(instances.map { |p| p.property_hash }).to eq([{
:ensure => :present,
:name => "br1",
:members => ['enp2s1'],
:stp => true,
:br_type => "lnx",
},{
:ensure => :present,
:members => ['enp2s2'],
:name => "br2",
:br_type => "lnx",
:stp => false,
}])
end
end