Merge "Refactor 'get' method for fetch ovs and lnx bridges list" into stable/mitaka
This commit is contained in:
commit
ddd7719151
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
#-----------------------------------------------------------------
|
||||
|
||||
|
||||
|
|
|
@ -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=",")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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!!!
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue