Fix swift_ring_builder output parsing.

Updates the swift_ring_builder so that it parses ring builder output
from the most recent Swift releases correctly (1.7.6 or greated).

Backward compat for the previous parsing is still supported.

Change-Id: I4263b349310e16f6825960805eb27e4bfe3ff002
This commit is contained in:
Dan Prince
2013-04-05 07:50:04 -04:00
parent 78b1bf9af4
commit bee081b5b6
3 changed files with 38 additions and 2 deletions

View File

@@ -14,7 +14,11 @@ class Puppet::Provider::SwiftRingBuilder < Puppet::Provider
if File.exists?(builder_file_path) if File.exists?(builder_file_path)
if rows = swift_ring_builder(builder_file_path).split("\n")[4..-1] if rows = swift_ring_builder(builder_file_path).split("\n")[4..-1]
rows.each do |row| rows.each do |row|
if row =~ /^\s+(\d+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+\.\d+)\s+(\d+)\s+(-?\d+\.\d+)\s+(\S*)$/ # Swift 1.7+ output example:
# Devices: id region zone ip address port name weight partitions balance meta
# 0 1 2 127.0.0.1 6022 2 1.00 262144 0.00
if row =~ /^\s*(\d+)\s+\d+\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+\.\d+)\s+(\d+)\s+(-?\d+\.\d+)\s*(\S*)/
object_hash["#{$3}:#{$4}/#{$5}"] = { object_hash["#{$3}:#{$4}/#{$5}"] = {
:id => $1, :id => $1,
:zone => $2, :zone => $2,
@@ -23,6 +27,18 @@ class Puppet::Provider::SwiftRingBuilder < Puppet::Provider
:balance => $8, :balance => $8,
:meta => $9 :meta => $9
} }
# This regex is for older swift versions
elsif row =~ /^\s+(\d+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+\.\d+)\s+(\d+)\s+(-?\d+\.\d+)\s+(\S*)$/
object_hash["#{$3}:#{$4}/#{$5}"] = {
:id => $1,
:zone => $2,
:weight => $6,
:partitions => $7,
:balance => $8,
:meta => $9
}
else else
Puppet.warning("Unexpected line: #{row}") Puppet.warning("Unexpected line: #{row}")
end end

View File

View File

@@ -12,6 +12,26 @@ describe provider_class do
end end
it 'should be able to lookup the local ring and build an object' do it 'should be able to lookup the local ring and build an object' do
File.expects(:exists?).with(builder_file_path).returns(true)
provider_class.expects(:builder_file_path).twice.returns(builder_file_path)
# Swift 1.7 output
provider_class.expects(:swift_ring_builder).returns(
'/etc/swift/account.builder, build version 3
262144 partitions, 3 replicas, 3 zones, 3 devices, 0.00 balance
The minimum number of hours before a partition can be reassigned is 1
Devices: id region zone ip address port name weight partitions balance meta
2 1 2 192.168.101.14 6002 1 1.00 262144 0.00
0 1 3 192.168.101.15 6002 1 1.00 262144 0.00
1 1 1 192.168.101.13 6002 1 1.00 262144 0.00
'
)
resources = provider_class.lookup_ring.inspect
resources['192.168.101.15:6002/1'].should_not be_nil
resources['192.168.101.13:6002/1'].should_not be_nil
resources['192.168.101.14:6002/1'].should_not be_nil
end
it 'should be able to lookup the local ring and build an object legacy' do
File.expects(:exists?).with(builder_file_path).returns(true) File.expects(:exists?).with(builder_file_path).returns(true)
provider_class.expects(:builder_file_path).twice.returns(builder_file_path) provider_class.expects(:builder_file_path).twice.returns(builder_file_path)
provider_class.expects(:swift_ring_builder).returns( provider_class.expects(:swift_ring_builder).returns(
@@ -22,7 +42,6 @@ Devices: id zone ip address port name weight partitions balance m
2 2 192.168.101.14 6002 1 1.00 262144 0.00 2 2 192.168.101.14 6002 1 1.00 262144 0.00
0 3 192.168.101.15 6002 1 1.00 262144 0.00 0 3 192.168.101.15 6002 1 1.00 262144 0.00
1 1 192.168.101.13 6002 1 1.00 262144 0.00 1 1 192.168.101.13 6002 1 1.00 262144 0.00
' '
) )
resources = provider_class.lookup_ring.inspect resources = provider_class.lookup_ring.inspect
@@ -30,4 +49,5 @@ Devices: id zone ip address port name weight partitions balance m
resources['192.168.101.13:6002/1'].should_not be_nil resources['192.168.101.13:6002/1'].should_not be_nil
resources['192.168.101.14:6002/1'].should_not be_nil resources['192.168.101.14:6002/1'].should_not be_nil
end end
end end