vs_bridge: Fix missing external_ids after initial creation

It turned out the external_ids property is not reflected on the ovs
bridge after initial creation. This change fixes it and ensures that
the property is applied to the bridge.

Closes-Bug: #1958905
Change-Id: I7c1c2384b8d70b568caffe8d3cc82002cf2502f6
This commit is contained in:
Takashi Kajinami 2022-01-25 02:42:40 +09:00
parent 4924354d51
commit 8fcd7596e4
2 changed files with 36 additions and 9 deletions

View File

@ -13,7 +13,9 @@ Puppet::Type.type(:vs_bridge).provide(:ovs) do
def create
vsctl('add-br', @resource[:name])
ip('link', 'set', 'dev', @resource[:name], 'up')
external_ids = @resource[:external_ids] if @resource[:external_ids]
if @resource[:external_ids]
self.class.set_external_ids(@resource[:name], @resource[:external_ids])
end
end
def destroy
@ -21,22 +23,30 @@ Puppet::Type.type(:vs_bridge).provide(:ovs) do
vsctl('del-br', @resource[:name])
end
def _split(string, splitter=',')
def self._split(string, splitter=',')
return Hash[string.split(splitter).map{|i| i.split('=')}]
end
def external_ids
result = vsctl('br-get-external-id', @resource[:name])
return result.split("\n").join(',')
self.class.get_external_ids(@resource[:name])
end
def external_ids=(value)
old_ids = _split(external_ids)
self.class.set_external_ids(@resource[:name], value)
end
def self.get_external_ids(br)
result = vsctl('br-get-external-id', br)
return result.split("\n").join(',')
end
def self.set_external_ids(br, value)
old_ids = _split(get_external_ids(br))
new_ids = _split(value)
new_ids.each_pair do |k,v|
unless old_ids.has_key?(k)
vsctl('br-set-external-id', @resource[:name], k, v)
vsctl('br-set-external-id', br, k, v)
end
end
end

View File

@ -11,10 +11,15 @@ describe 'basic vswitch' do
include vswitch::ovs
vs_bridge { 'br-ci':
vs_bridge { 'br-ci1':
ensure => present,
}
vs_bridge { 'br-ci2':
ensure => present,
external_ids => 'bridge-id=br-ci2'
}
vs_config { 'external_ids:ovn-remote':
ensure => present,
value => 'tcp:127.0.0.1:2300',
@ -27,9 +32,21 @@ describe 'basic vswitch' do
apply_manifest(pp, :catch_changes => true)
end
it 'should have br-ci bridge' do
it 'should have br-ci1 bridge' do
command('ovs-vsctl show') do |r|
expect(r.stdout).to match(/br-ci/)
expect(r.stdout).to match(/br-ci1/)
end
end
it 'should have br-ci2 bridge' do
command('ovs-vsctl show') do |r|
expect(r.stdout).to match(/br-ci2/)
end
end
it 'should have external_ids on br-ci2 bridge' do
command('ovs-vsctl br-get-external-id br-ci2') do |r|
expect(r.stdout).to match(/bridge-id=br-ci2/)
end
end