Class: Puppet::Provider::SwiftRingBuilder
- Inherits:
-
Puppet::Provider
- Object
- Puppet::Provider
- Puppet::Provider::SwiftRingBuilder
- Defined in:
- lib/puppet/provider/swift_ring_builder.rb
Class Method Summary collapse
Instance Method Summary collapse
- #address_string(address) ⇒ Object
- #balance ⇒ Object
- #balance=(balance) ⇒ Object
- #builder_file_path(policy_index) ⇒ Object
- #create ⇒ Object
- #device_path ⇒ Object
- #exists? ⇒ Boolean
- #id ⇒ Object
- #id=(id) ⇒ Object
- #lookup_ring ⇒ Object
- #meta ⇒ Object
- #meta=(meta) ⇒ Object
- #partitions ⇒ Object
- #partitions=(part) ⇒ Object
- #policy_index ⇒ Object
- #region ⇒ Object
- #region=(region) ⇒ Object
- #weight ⇒ Object
- #weight=(weight) ⇒ Object
- #zone ⇒ Object
- #zone=(zone) ⇒ Object
Class Method Details
.instances ⇒ Object
3 4 5 6 7 8 9 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 3 def self.instances # TODO iterate through the databases # and add the database that we used a property ring.keys.collect do |name| new(:name => name) end end |
Instance Method Details
#address_string(address) ⇒ Object
11 12 13 14 15 16 17 18 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 11 def address_string(address) ip = IPAddr.new(address) if ip.ipv6? '[' + ip.to_s + ']' else ip.to_s end end |
#balance ⇒ Object
160 161 162 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 160 def balance ring[resource[:name]][:balance] end |
#balance=(balance) ⇒ Object
164 165 166 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 164 def balance=(balance) raise(Puppet::Error, "Cannot set balance, it is set by rebalancing") end |
#builder_file_path(policy_index) ⇒ Object
64 65 66 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 64 def builder_file_path(policy_index) self.class.builder_file_path(policy_index) end |
#create ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 72 def create [:zone, :weight].each do |param| raise(Puppet::Error, "#{param} is required") unless resource[param] end if :region == 'none' # Prior to Swift 1.8.0, regions did not exist. swift_ring_builder( builder_file_path(policy_index), 'add', "z#{resource[:zone]}-#{device_path}_#{resource[:meta]}", resource[:weight] ) else # Swift 1.8+ # Region defaults to 1 if unspecified resource[:region] ||= 1 swift_ring_builder( builder_file_path(policy_index), 'add', "r#{resource[:region]}z#{resource[:zone]}-#{device_path}_#{resource[:meta]}", resource[:weight] ) end end |
#device_path ⇒ Object
97 98 99 100 101 102 103 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 97 def device_path if resource[:name].split(/^\d+:/)[1].nil? return resource[:name] else return resource[:name].split(/^\d+:/)[1] end end |
#exists? ⇒ Boolean
68 69 70 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 68 def exists? ring[resource[:name]] end |
#id ⇒ Object
113 114 115 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 113 def id ring[resource[:name]][:id] end |
#id=(id) ⇒ Object
117 118 119 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 117 def id=(id) raise(Puppet::Error, "Cannot assign id, it is immutable") end |
#lookup_ring ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 20 def lookup_ring object_hash = {} if File.exists?(builder_file_path(policy_index)) if rows = swift_ring_builder(builder_file_path(policy_index)).split("\n") while row = rows.shift do if row.start_with?('Devices:') break end end rows.each do |row| # Swift 2.9.1+ output example: # /etc/swift/object.builder, build version 1 # 262144 partitions, 1.000000 replicas, 1 regions, 1 zones, 1 devices, 0.00 balance, 0.00 dispersion # The minimum number of hours before a partition can be reassigned is 1 # The overload factor is 0.00% (0.000000) # Ring file /etc/swift/object.ring.gz is up-to-date # Devices: id region zone ip address:port replication ip:replication port name weight partitions balance meta # 0 1 2 127.0.0.1:6021 127.0.0.1:6021 2 1.00 262144 0.00 if row =~ /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+):(\d+)\s+\S+:\d+\s+(\S+)\s+(\d+\.\d+)\s+(\d+)\s*((-|\s-?)?\d+\.\d+)\s*(\S*)/ address = address_string("#{$4}") if !policy_index.nil? policy = "#{policy_index}:" else policy = '' end object_hash["#{policy}#{address}:#{$5}/#{$6}"] = { :id => $1, :region => $2, :zone => $3, :weight => $7, :partitions => $8, :balance => $9, :meta => $11, :policy_index => "#{policy_index}" } else Puppet.warning("Unexpected line: #{row}") end end end end object_hash end |
#meta ⇒ Object
168 169 170 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 168 def ring[resource[:name]][:meta] end |
#meta=(meta) ⇒ Object
172 173 174 175 176 177 178 179 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 172 def () swift_ring_builder( builder_file_path(policy_index), 'set_info', "d#{ring[device_path][:id]}", "_#{resource[:meta]}" ) end |
#partitions ⇒ Object
152 153 154 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 152 def partitions ring[resource[:name]][:partitions] end |
#partitions=(part) ⇒ Object
156 157 158 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 156 def partitions=(part) raise(Puppet::Error, "Cannot set partitions, it is set by rebalancing") end |
#policy_index ⇒ Object
105 106 107 108 109 110 111 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 105 def policy_index if resource[:name].split(/^\d+:/)[1].nil? return nil else Integer("#{resource[:name].match(/^\d+/)}") end end |
#region ⇒ Object
121 122 123 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 121 def region ring[resource[:name]][:region] end |
#region=(region) ⇒ Object
125 126 127 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 125 def region=(region) raise(Puppet::Error, "Changing the region of a device is not yet supported.") end |
#weight ⇒ Object
137 138 139 140 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 137 def weight ring[resource[:name]][:weight] # get the weight end |
#weight=(weight) ⇒ Object
142 143 144 145 146 147 148 149 150 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 142 def weight=(weight) swift_ring_builder( builder_file_path(policy_index), 'set_weight', "d#{ring[device_path][:id]}", resource[:weight] ) # requires a rebalance end |
#zone ⇒ Object
129 130 131 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 129 def zone ring[resource[:name]][:zone] end |
#zone=(zone) ⇒ Object
133 134 135 |
# File 'lib/puppet/provider/swift_ring_builder.rb', line 133 def zone=(zone) raise(Puppet::Error, "Changing the zone of a device is not yet supported.") end |