-
Notifications
You must be signed in to change notification settings - Fork 7
/
elastic_ip.rb
83 lines (73 loc) · 2.29 KB
/
elastic_ip.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
include Opscode::Aws::Ec2
action :associate do
addr = address(new_resource.ip)
if addr.nil?
raise "Elastic IP #{new_resource.ip} does not exist"
elsif addr[:instance_id] == instance_id
Chef::Log.debug("Elastic IP #{new_resource.ip} is already attached to the instance")
else
attach(new_resource.ip, new_resource.timeout)
new_resource.updated_by_last_action(true)
Chef::Log.info("Attaching Elastic IP #{new_resource.ip} to the instance")
end
end
action :disassociate do
addr = address(new_resource.ip)
if addr.nil?
Chef::Log.debug("Elastic IP #{new_resource.ip} does not exist, so there is nothing to detach")
elsif addr[:instance_id] != instance_id
Chef::Log.debug("Elastic IP #{new_resource.ip} is already detached from the instance")
else
Chef::Log.info("Detaching Elastic IP #{new_resource.ip} from the instance")
detach(new_resource.ip, new_resource.timeout)
new_resource.updated_by_last_action(true)
end
end
private
def address(ip)
ec2.describe_addresses.find{|a| a[:public_ip] == ip}
end
def attach(ip, timeout)
ec2.associate_address(instance_id, ip)
# block until attached
begin
Timeout::timeout(timeout) do
while true
addr = address(ip)
if addr.nil?
raise "Elastic IP has been deleted while waiting for attachment"
elsif addr[:instance_id] == instance_id
Chef::Log.debug("Elastic IP is attached to this instance")
break
else
Chef::Log.debug("Elastic IP is currently attached to #{addr[:instance_id]}")
end
sleep 3
end
end
rescue Timeout::Error
raise "Timed out waiting for attachment after #{timeout} seconds"
end
end
def detach(ip, timeout)
ec2.disassociate_address(ip)
# block until detached
begin
Timeout::timeout(timeout) do
while true
addr = address(ip)
if addr.nil?
Chef::Log.debug("Elastic IP has been deleted while waiting for detachment")
elsif addr[:instance_id] != instance_id
Chef::Log.debug("Elastic IP is detached from this instance")
break
else
Chef::Log.debug("Elastic IP is still attached")
end
sleep 3
end
end
rescue Timeout::Error
raise "Timed out waiting for detachment after #{timeout} seconds"
end
end