Class: Pec::Network::Port

Inherits:
Object
  • Object
show all
Extended by:
Query
Defined in:
lib/pec/network/port.rb

Constant Summary collapse

@@use_ip_list =
[]

Class Method Summary collapse

Methods included from Query

fetch, get_ref, list

Class Method Details

.assign(name, ip, subnet, security_group_ids) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/pec/network/port.rb', line 9

def assign(name, ip, subnet, security_group_ids)
  ip = get_free_port_ip(ip, subnet) if request_any_address?(ip, subnet)
  port_state = Pec::Network::PortState.new(name, fetch_by_ip(ip.to_addr))

  assign_port = case
    when port_state.exists? &&  !port_state.used?
      recreate(ip, subnet, security_group_ids)
    when !port_state.exists?
      create(ip, subnet, security_group_ids)
    when port_state.used?
      raise(Pec::Errors::Port, "ip:#{ip.to_addr} is used!")
  end
  Pec::Network::PortState.new(name, assign_port)
end

.create(ip, subnet, security_group_ids) ⇒ Object

Raises:



29
30
31
32
33
34
35
36
37
38
# File 'lib/pec/network/port.rb', line 29

def create(ip, subnet, security_group_ids)
  options = set_security_group(security_group_ids)
  options = set_fixed_ip(options, subnet, ip)
  response = Pec::Resource.get.create_port(subnet["network_id"], options)

  raise(Pec::Errors::Port, "ip:#{ip.to_addr} is not created!") unless response

  @@use_ip_list << response.data[:body]["port"]["fixed_ips"][0]["ip_address"]
  response.data[:body]["port"]
end

.delete(ip) ⇒ Object



48
49
50
51
# File 'lib/pec/network/port.rb', line 48

def delete(ip)
  target_port = fetch_by_ip(ip.to_addr)
  response = Pec::Resource.get.delete_port(target_port["id"]) if target_port
end

.fetch_by_ip(ip_addr) ⇒ Object



61
62
63
# File 'lib/pec/network/port.rb', line 61

def fetch_by_ip(ip_addr)
  list.find {|p| p["fixed_ips"][0]["ip_address"] == ip_addr }
end

.fetch_free_port(subnet) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/pec/network/port.rb', line 65

def fetch_free_port(subnet)
  list.find do |p|
    p["fixed_ips"][0]["subnet_id"] == subnet["id"] &&
    p["device_owner"].empty? &&
    p["admin_state_up"] &&
    !@@use_ip_list.include?(p["fixed_ips"][0]["ip_address"])
  end
end

.get_free_port_ip(ip, subnet) ⇒ Object



24
25
26
27
# File 'lib/pec/network/port.rb', line 24

def get_free_port_ip(ip, subnet)
  port = fetch_free_port(subnet)
  port ? IP.new("#{port["fixed_ips"][0]["ip_address"]}/#{ip.pfxlen}") : ip
end

.recreate(ip, subnet, security_group_ids) ⇒ Object



53
54
55
# File 'lib/pec/network/port.rb', line 53

def recreate(ip, subnet, security_group_ids)
  create(ip, subnet, security_group_ids) if delete(ip)
end

.request_any_address?(ip, subnet) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/pec/network/port.rb', line 57

def request_any_address?(ip, subnet)
  ip.to_s == subnet["cidr"]
end

.set_fixed_ip(options, subnet, ip) ⇒ Object



44
45
46
# File 'lib/pec/network/port.rb', line 44

def set_fixed_ip(options, subnet, ip)
  ip.to_s != subnet["cidr"] ? options.merge({ fixed_ips: [{ subnet_id: subnet["id"], ip_address: ip.to_addr}]}) : options
end

.set_security_group(security_group_ids) ⇒ Object



40
41
42
# File 'lib/pec/network/port.rb', line 40

def set_security_group(security_group_ids)
  { security_groups: security_group_ids }
end