ironfan 4.7.2 → 4.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/ironfan.gemspec +2 -2
- data/lib/chef/knife/cluster_launch.rb +8 -4
- data/lib/chef/knife/cluster_ssh.rb +1 -3
- data/lib/ironfan/dsl/ec2.rb +2 -0
- data/lib/ironfan/provider/ec2/elastic_ip.rb +37 -6
- metadata +3 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# v4.7.3
|
2
|
+
* cluster ssh was broken for VPC instances, this will fix a few bugs (fixes #236, thanks @gwilton)
|
3
|
+
* cluster_ssh & cluster_launch: cleaning up SSH usage to handle VPC
|
4
|
+
* Enhanced IP enhanced: adds auto_elastic_ip DSL and detection, mutually exclusive with regular elastic_ip (thanks @schade)
|
5
|
+
|
1
6
|
# v4.7.2
|
2
7
|
* elastic_ip: ensuring that elastic IPs work with VPC instances (thanks @schade)
|
3
8
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.7.
|
1
|
+
4.7.3
|
data/ironfan.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ironfan"
|
8
|
-
s.version = "4.7.
|
8
|
+
s.version = "4.7.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Infochimps"]
|
12
|
-
s.date = "2013-01-
|
12
|
+
s.date = "2013-01-14"
|
13
13
|
s.description = "Ironfan allows you to orchestrate not just systems but clusters of machines. It includes a powerful layer on top of knife and a collection of cloud cookbooks."
|
14
14
|
s.email = "coders@infochimps.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -115,7 +115,8 @@ class Chef
|
|
115
115
|
# Try SSH
|
116
116
|
unless config[:dry_run]
|
117
117
|
Ironfan.step(computer.name, 'trying ssh', :white)
|
118
|
-
|
118
|
+
address = computer.machine.vpc_id.nil? ? computer.machine.public_target : computer.machine.public_ip_address
|
119
|
+
nil until tcp_test_ssh(address){ sleep @initial_sleep_delay ||= 10 }
|
119
120
|
end
|
120
121
|
|
121
122
|
Ironfan.step(computer.name, 'final provisioning', :white)
|
@@ -128,22 +129,25 @@ class Chef
|
|
128
129
|
end
|
129
130
|
end
|
130
131
|
|
131
|
-
def tcp_test_ssh(
|
132
|
-
tcp_socket = TCPSocket.new(
|
132
|
+
def tcp_test_ssh(target)
|
133
|
+
tcp_socket = TCPSocket.new(target, 22)
|
133
134
|
readable = IO.select([tcp_socket], nil, nil, 5)
|
134
135
|
if readable
|
135
|
-
Chef::Log.debug("sshd accepting connections on #{
|
136
|
+
Chef::Log.debug("sshd accepting connections on #{target}, banner is #{tcp_socket.gets}")
|
136
137
|
yield
|
137
138
|
true
|
138
139
|
else
|
139
140
|
false
|
140
141
|
end
|
141
142
|
rescue Errno::ETIMEDOUT
|
143
|
+
Chef::Log.debug("ssh to #{target} timed out")
|
142
144
|
false
|
143
145
|
rescue Errno::ECONNREFUSED
|
146
|
+
Chef::Log.debug("ssh connection to #{target} refused")
|
144
147
|
sleep 2
|
145
148
|
false
|
146
149
|
rescue Errno::EHOSTUNREACH
|
150
|
+
Chef::Log.debug("ssh host #{target} unreachable")
|
147
151
|
sleep 2
|
148
152
|
false
|
149
153
|
ensure
|
@@ -47,11 +47,9 @@ class Chef
|
|
47
47
|
|
48
48
|
config[:attribute] ||= Chef::Config[:knife][:ssh_address_attribute] || "fqdn"
|
49
49
|
config[:ssh_user] ||= Chef::Config[:knife][:ssh_user]
|
50
|
-
# config[:identity_file] ||= target.ssh_identity_file
|
51
50
|
|
52
|
-
# @action_nodes = target.chef_nodes
|
53
51
|
target = target.select {|t| not t.bogus? }
|
54
|
-
addresses = target.map {|c| c.machine.public_hostname }.compact
|
52
|
+
addresses = target.map {|c| c.machine.vpc_id.nil? ? c.machine.public_hostname : c.machine.public_ip_address }.compact
|
55
53
|
|
56
54
|
(ui.fatal("No nodes returned from search!"); exit 10) if addresses.nil? || addresses.length == 0
|
57
55
|
|
data/lib/ironfan/dsl/ec2.rb
CHANGED
@@ -26,6 +26,8 @@ module Ironfan
|
|
26
26
|
magic :placement_group, String
|
27
27
|
magic :provider, Whatever, :default => Ironfan::Provider::Ec2
|
28
28
|
magic :elastic_ip, String
|
29
|
+
magic :auto_elastic_ip, String
|
30
|
+
magic :allocation_id, String
|
29
31
|
magic :region, String, :default => ->{ default_region }
|
30
32
|
collection :security_groups, Ironfan::Dsl::Ec2::SecurityGroup, :key_method => :name
|
31
33
|
magic :ssh_user, String, :default => ->{ image_info[:ssh_user] }
|
@@ -4,11 +4,11 @@ module Ironfan
|
|
4
4
|
|
5
5
|
class ElasticIp < Ironfan::Provider::Resource
|
6
6
|
delegate :addresses, :associate_address, :allocation_id,
|
7
|
-
:allocation_id=, :
|
8
|
-
:
|
9
|
-
:network_interface_id, :network_interface_id=,
|
10
|
-
:public_ip=, :public_ip_address, :save, :server=,
|
11
|
-
:server_id=,
|
7
|
+
:allocation_id=, :allocate_address, :auto_elastic_ip, :destroy,
|
8
|
+
:domain, :domain=, :describe_addresses, :disassociate_address,
|
9
|
+
:domain, :id, :network_interface_id, :network_interface_id=,
|
10
|
+
:public_ip, :public_ip=, :public_ip_address, :save, :server=,
|
11
|
+
:server, :server_id, :server_id=,
|
12
12
|
:to => :adaptee
|
13
13
|
|
14
14
|
def self.shared?() true; end
|
@@ -30,7 +30,12 @@ module Ironfan
|
|
30
30
|
# is passed to knife and aids in troubleshooting any refusal to
|
31
31
|
# attach Elastic IPs
|
32
32
|
Chef::Log.debug( "AWS domain: #{eip.domain}" )
|
33
|
-
|
33
|
+
if eip.public_ip.nil?
|
34
|
+
Chef::Log.debug( "no Elastic IPs currently allocated" )
|
35
|
+
else
|
36
|
+
Chef::Log.debug( "available ip match: #{eip.public_ip}" )
|
37
|
+
Chef::Log.debug( "available allocation_id match: #{eip.allocation_id}" )
|
38
|
+
end
|
34
39
|
Chef::Log.debug( "----------------------" )
|
35
40
|
end
|
36
41
|
|
@@ -53,6 +58,32 @@ module Ironfan
|
|
53
58
|
return unless computer.created?
|
54
59
|
return unless elastic_ip = computer.server.ec2.elastic_ip
|
55
60
|
return unless recall? elastic_ip
|
61
|
+
# also, in the case of VPC Elastic IPs, can discover and use allocation_id to attach a VPC Elastic IP.
|
62
|
+
return unless computer.server.ec2.include?(:elastic_ip)
|
63
|
+
if ( computer.server.ec2.elastic_ip.nil? and cloud.vpc.nil? )
|
64
|
+
# First, :elastic_ip is set, no address is currently allocated for this connection's owner
|
65
|
+
# NOTE: We cannot specify an address to create, but after a reload we can then load the first available.
|
66
|
+
if computer.server.addresses.nil?
|
67
|
+
Ec2.connection.allocate_address
|
68
|
+
load!
|
69
|
+
elastic_ip = computer.server.addresses.first.public_ip
|
70
|
+
Chef::Log.debug( "allocating new Elastic IP address" )
|
71
|
+
else
|
72
|
+
# Second, :elastic_ip is set, has an address available to use but has no set value available in facet definition.
|
73
|
+
elastic_ip = computer.server.addresses.first.public_ip
|
74
|
+
Chef::Log.debug( "using first available Elastic IP address" )
|
75
|
+
end
|
76
|
+
elsif ( !computer.server.ec2.elastic_ip.nil? or cloud.vpc.nil? )
|
77
|
+
# Third, :elastic_ip is set, has an address available to use, has a set value in facet definition and is not VPC.
|
78
|
+
elastic_ip = computer.server.ec2.elastic_ip
|
79
|
+
Chef::Log.debug( "using requested Elastic IP address" )
|
80
|
+
elsif ( computer.server.ec2.elastic_ip.nil? and !cloud.vpc.nil? )
|
81
|
+
# Fourth, is exactly like Third but on a VPC domain. (this is functionaility for attaching VPC Elastic IPS)
|
82
|
+
allocation_id = computer.server.ec2.allocation_id
|
83
|
+
Chef::Log.debug( "using Elastic IP address matched to given Allocation ID" )
|
84
|
+
else
|
85
|
+
ui.fatal("You have set both :elastic_ip and :auto_elastic_ip in your facet definition; which are mutually exclusive.")
|
86
|
+
end
|
56
87
|
Ironfan.step(computer.name, "associating Elastic IP #{elastic_ip}", :blue)
|
57
88
|
Ironfan.unless_dry_run do
|
58
89
|
Ironfan.safely do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ironfan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 4.7.
|
5
|
+
version: 4.7.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Infochimps
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2013-01-
|
13
|
+
date: 2013-01-14 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: chef
|
@@ -282,7 +282,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
282
282
|
requirements:
|
283
283
|
- - ">="
|
284
284
|
- !ruby/object:Gem::Version
|
285
|
-
hash:
|
285
|
+
hash: 240697130002937334
|
286
286
|
segments:
|
287
287
|
- 0
|
288
288
|
version: "0"
|