Class: Bosh::Director::DeploymentPlan::InMemoryIpRepo

Inherits:
Object
  • Object
show all
Includes:
IpUtil
Defined in:
lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb

Instance Method Summary collapse

Methods included from IpUtil

#each_ip, #format_ip, #ip_to_i, #ip_to_netaddr

Constructor Details

#initialize(logger) ⇒ InMemoryIpRepo

Returns a new instance of InMemoryIpRepo.



5
6
7
8
9
10
# 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

Instance Method Details

#add(reservation) ⇒ Object



23
24
25
26
27
28
29
# 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) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 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) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# 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) ⇒ Object



12
13
14
15
16
17
18
19
20
21
# 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