ironfan 4.2.3 → 4.3.0

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 CHANGED
@@ -1,3 +1,7 @@
1
+ # v4.3.0: VPC support
2
+ * Launch instances in pre-existing VPC and subnet, with group support
3
+ * Refactored security_group to handle VPC groups (which must use ID, not name)
4
+
1
5
  # v4.2.3
2
6
  * Making aws_account_id unnecessary for security groups (its not needed by newer Fog)
3
7
  * Removed redundant cloud_provider.rb (thanks @nickmarden)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.2.3
1
+ 4.3.0
data/ironfan.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ironfan"
8
- s.version = "4.2.3"
8
+ s.version = "4.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Infochimps"]
@@ -62,7 +62,7 @@ module Ironfan
62
62
  target_resources = chosen_resources(options)
63
63
  resources.each do |res|
64
64
  next unless target_resources.include? res.class
65
- descriptor = "#{res.class} named #{res.name}"
65
+ descriptor = "#{res.class.resource_type} named #{res.name}"
66
66
  if res.shared?
67
67
  Chef::Log.debug("Not killing shared resource #{descriptor}")
68
68
  else
@@ -221,6 +221,7 @@ module Ironfan
221
221
  :client_key => computer.private_key
222
222
  }
223
223
 
224
+
224
225
  # Fog does not actually create tags when it creates a server;
225
226
  # they and permanence are applied during sync
226
227
  description = {
@@ -228,7 +229,6 @@ module Ironfan
228
229
  :flavor_id => cloud.flavor,
229
230
  :vpc_id => cloud.vpc,
230
231
  :subnet_id => cloud.subnet,
231
- :groups => cloud.security_groups.keys,
232
232
  :key_name => cloud.ssh_key_name(computer),
233
233
  :user_data => JSON.pretty_generate(user_data_hsh),
234
234
  :block_device_mapping => block_device_mapping(computer),
@@ -236,6 +236,12 @@ module Ironfan
236
236
  :monitoring => cloud.monitoring,
237
237
  }
238
238
 
239
+ # VPC security_groups can only be addressed by id (not name)
240
+ description[:security_group_ids] = cloud.security_groups.keys.map do |g|
241
+ group_name = cloud.vpc.nil? ? g.to_s : "#{cloud.vpc}:#{g}"
242
+ SecurityGroup.recall(group_name).group_id
243
+ end
244
+
239
245
  if cloud.flavor_info[:placement_groupable]
240
246
  ui.warn "1.3.1 and earlier versions of Fog don't correctly support placement groups, so your nodes will land willy-nilly. We're working on a fix"
241
247
  description[:placement] = { 'groupName' => cloud.placement_group.to_s }
@@ -17,7 +17,15 @@ module Ironfan
17
17
  def self.multiple?() true; end
18
18
  def self.resource_type() :security_group; end
19
19
  def self.expected_ids(computer)
20
- computer.server.cloud(:ec2).security_groups.keys.map{|k| k.to_s}.uniq
20
+ ec2 = computer.server.cloud(:ec2)
21
+ ec2.security_groups.keys.map do |name|
22
+ ec2.vpc ? "#{ec2.vpc}:#{name.to_s}" : name.to_s
23
+ end.uniq
24
+ end
25
+
26
+ def name()
27
+ return adaptee.name if adaptee.vpc_id.nil?
28
+ "#{adaptee.vpc_id}:#{adaptee.name}"
21
29
  end
22
30
 
23
31
  #
@@ -28,7 +36,7 @@ module Ironfan
28
36
  next if raw.blank?
29
37
  sg = SecurityGroup.new(:adaptee => raw)
30
38
  remember(sg)
31
- Chef::Log.debug("Loaded #{sg}")
39
+ Chef::Log.debug("Loaded #{sg}: #{sg.inspect}")
32
40
  end
33
41
  end
34
42
 
@@ -69,7 +77,10 @@ module Ironfan
69
77
  groups.each do |group|
70
78
  Ironfan.step(group, " creating #{group} security group", :blue)
71
79
  begin
72
- Ec2.connection.create_security_group(group.to_s,"Ironfan created group #{group}")
80
+ tokens = group.to_s.split(':')
81
+ group_id = tokens.pop
82
+ vpc_id = tokens.pop
83
+ Ec2.connection.create_security_group(group_id,"Ironfan created group #{group_id}",vpc_id)
73
84
  rescue Fog::Compute::AWS::Error => e # InvalidPermission.Duplicate
74
85
  Chef::Log.info("ignoring security group error: #{e}")
75
86
  sleep 0.5 # quit racing so hard
@@ -78,11 +89,17 @@ module Ironfan
78
89
  load! # Get the native groups via reload
79
90
  end
80
91
 
92
+ def self.recall_with_vpc(name,vpc_id=nil)
93
+ group_name = vpc_id.nil? ? name : "#{vpc_id}:#{name}"
94
+ recall(group_name)
95
+ end
96
+
81
97
  def self.save!(computer)
82
98
  return unless Ec2.applicable computer
99
+ cloud = computer.server.cloud(:ec2)
83
100
 
84
101
  create!(computer) # Make sure the security groups exist
85
- security_groups = computer.server.cloud(:ec2).security_groups.values
102
+ security_groups = cloud.security_groups.values
86
103
  dsl_groups = security_groups.select do |dsl_group|
87
104
  not (recall? dsl_group or recall(dsl_group.name).ensured) and \
88
105
  not (dsl_group.range_authorizations +
@@ -93,14 +110,19 @@ module Ironfan
93
110
 
94
111
  Ironfan.step(computer.server.cluster_name, "ensuring security group permissions", :blue)
95
112
  dsl_groups.each do |dsl_group|
113
+ dsl_group_fog = recall_with_vpc(dsl_group.name,cloud.vpc)
96
114
  dsl_group.group_authorized.each do |other_group|
115
+ other_group_fog = recall_with_vpc(other_group,cloud.vpc)
97
116
  Ironfan.step(dsl_group.name, " ensuring access from #{other_group}", :blue)
98
- safely_authorize(dsl_group.name, 1..65535, :group => other_group)
117
+ options = {:group => other_group_fog.group_id}
118
+ safely_authorize(dsl_group_fog, 1..65535, options)
99
119
  end
100
120
 
101
121
  dsl_group.group_authorized_by.each do |other_group|
122
+ other_group_fog = recall_with_vpc(other_group,cloud.vpc)
102
123
  Ironfan.step(dsl_group.name, " ensuring access to #{other_group}", :blue)
103
- safely_authorize(other_group, 1..65535, :group => dsl_group.name)
124
+ options = {:group => dsl_group_fog.group_id}
125
+ safely_authorize(other_group_fog, 1..65535, options)
104
126
  end
105
127
 
106
128
  dsl_group.range_authorizations.each do |range_auth|
@@ -108,7 +130,7 @@ module Ironfan
108
130
  step_message = " ensuring #{protocol} access from #{cidr} to #{range}"
109
131
  Ironfan.step(dsl_group.name, step_message, :blue)
110
132
  options = {:cidr_ip => cidr, :ip_protocol => protocol}
111
- safely_authorize(dsl_group.name,range,options)
133
+ safely_authorize(dsl_group_fog, range, options)
112
134
  end
113
135
  end
114
136
  end
@@ -131,14 +153,13 @@ module Ironfan
131
153
 
132
154
  # Try an authorization, ignoring duplicates (this is easier than correlating).
133
155
  # Do so for both TCP and UDP, unless only one is specified
134
- def self.safely_authorize(group_name,range,options)
156
+ def self.safely_authorize(fog_group,range,options)
135
157
  unless options[:ip_protocol]
136
- safely_authorize(group_name,range,options.merge(:ip_protocol => 'tcp'))
137
- safely_authorize(group_name,range,options.merge(:ip_protocol => 'udp'))
158
+ safely_authorize(fog_group,range,options.merge(:ip_protocol => 'tcp'))
159
+ safely_authorize(fog_group,range,options.merge(:ip_protocol => 'udp'))
138
160
  return
139
161
  end
140
162
 
141
- fog_group = recall(group_name) or raise "unrecognized group: #{group_name}"
142
163
  begin
143
164
  fog_group.authorize_port_range(range,options)
144
165
  rescue Fog::Compute::AWS::Error => e # InvalidPermission.Duplicate
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ironfan
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 4.2.3
5
+ version: 4.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Infochimps
@@ -233,7 +233,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
- hash: 4307969691364696392
236
+ hash: -131746219185203248
237
237
  segments:
238
238
  - 0
239
239
  version: "0"