class Bosh::Director::DeploymentPlan::InMemoryIpRepo
Public Class Methods
new(logger)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 5 def initialize(logger) @logger = Bosh::Director::TaggedLogger.new(logger, 'network-configuration') @mutex = Mutex.new @ips = [] @recently_released_ips = [] end
Public Instance Methods
add(reservation)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 23 def add(reservation) ip = ip_to_netaddr(reservation.ip) network_name = reservation.network.name @mutex.synchronize do add_ip(ip, network_name) end end
allocate_dynamic_ip(reservation, subnet)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 31 def allocate_dynamic_ip(reservation, subnet) @mutex.synchronize do item = (0...subnet.range.size).find { |i| available_for_dynamic?(subnet.range[i], subnet) } if item.nil? entry = @recently_released_ips.find do |entry| entry[:network_name] == subnet.network_name && subnet.range.contains?(entry[:ip]) end ip = ip_to_netaddr(entry[:ip]) unless entry.nil? else ip = subnet.range[item] end add_ip(ip, subnet.network_name) unless ip.nil? ip end end
contains_ip?(ip, network_name)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 51 def contains_ip?(ip, network_name) @ips.include?({ip: ip.to_i, network_name: network_name}) end
delete(ip, network_name)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 12 def delete(ip, network_name) ip = ip_to_netaddr(ip) entry_to_delete = {ip: ip.to_i, network_name: network_name} @logger.debug("Deleting ip '#{ip.ip}' for #{network_name}") @mutex.synchronize do @ips.delete(entry_to_delete) @recently_released_ips << (entry_to_delete) end end
Private Instance Methods
add_ip(ip, network_name)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 57 def add_ip(ip, network_name) if contains_ip?(ip, network_name) message = "Failed to reserve IP '#{ip.ip}' for '#{network_name}': already reserved" @logger.error(message) raise Bosh::Director::NetworkReservationAlreadyInUse, message end @logger.debug("Reserving ip '#{ip.ip}' for #{network_name}") entry_to_add = {ip: ip.to_i, network_name: network_name} @ips << entry_to_add @recently_released_ips.delete(entry_to_add) end
available_for_dynamic?(ip, subnet)
click to toggle source
# File lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb, line 71 def available_for_dynamic?(ip, subnet) return false unless subnet.range.contains?(ip) return false if subnet.static_ips.include?(ip.to_i) return false if subnet.restricted_ips.include?(ip.to_i) return false if @recently_released_ips.include?({ip: ip.to_i, network_name: subnet.network_name}) return false if @ips.include?({ip: ip.to_i, network_name: subnet.network_name}) true end