ironfan 4.8.2 → 4.8.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/VERSION +1 -1
- data/ironfan.gemspec +2 -2
- data/lib/chef/knife/cluster_bootstrap.rb +0 -1
- data/lib/chef/knife/cluster_start.rb +1 -1
- data/lib/chef/knife/cluster_stop.rb +1 -1
- data/lib/chef/knife/ironfan_knife_common.rb +5 -6
- data/lib/ironfan/broker/computer.rb +31 -41
- data/lib/ironfan/broker.rb +6 -2
- data/lib/ironfan/provider/ec2/security_group.rb +2 -1
- data/notes/Home.md +5 -0
- data/notes/ec2-pricing_and_capacity.md +25 -19
- data/notes/ec2-pricing_and_capacity.numbers +0 -0
- metadata +3 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# v4.8.3
|
2
|
+
* Bogus servers should not be killable (fixes #250)
|
3
|
+
* Style guide corrections ('&&', not 'and'; don't use single-letter variable names)
|
4
|
+
* Also fixed a thing where security groups enumeration would die if a bogus server existed that's bit me before
|
5
|
+
* Reviewed other knife cluster commands and made them not tolerate bogosity either
|
6
|
+
|
1
7
|
# v4.8.2
|
2
8
|
* Launch EBS-optimized boxen on EC2
|
3
9
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.8.
|
1
|
+
4.8.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.8.
|
8
|
+
s.version = "4.8.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-02-
|
12
|
+
s.date = "2013-02-26"
|
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 = [
|
@@ -62,7 +62,6 @@ class Chef
|
|
62
62
|
ensure_common_environment(target)
|
63
63
|
# Execute across all servers in parallel
|
64
64
|
Ironfan.parallel(target.values) {|computer| run_bootstrap(computer)}
|
65
|
-
# threads = target.servers.map{ |server| Thread.new(server) { |svr| run_bootstrap(svr, svr.public_hostname) } }
|
66
65
|
end
|
67
66
|
|
68
67
|
def confirm_execution(target)
|
@@ -84,19 +84,18 @@ module Ironfan
|
|
84
84
|
#
|
85
85
|
def get_relevant_slice( *predicate )
|
86
86
|
full_target = get_slice( *predicate )
|
87
|
-
display(full_target) do |
|
88
|
-
rel = relevant?(
|
89
|
-
{ :relevant? => (rel ? "[
|
87
|
+
display(full_target) do |mach|
|
88
|
+
rel = relevant?(mach)
|
89
|
+
{ :relevant? => (rel ? "[green]#{rel}[reset]" : '-' ) }
|
90
90
|
end
|
91
|
-
full_target.select{|
|
91
|
+
full_target.select{|mach| relevant?(mach) }
|
92
92
|
end
|
93
93
|
|
94
94
|
# passes target to Broker::Conductor#display, will show headings in server slice
|
95
95
|
# tables based on the --verbose flag
|
96
96
|
def display(target, display_style=nil, &block)
|
97
97
|
display_style ||= (config[:verbosity] == 0 ? :default : :expanded)
|
98
|
-
|
99
|
-
broker.display(target, display_style)
|
98
|
+
broker.display(target, display_style, &block)
|
100
99
|
end
|
101
100
|
|
102
101
|
#
|
@@ -17,11 +17,11 @@ module Ironfan
|
|
17
17
|
super
|
18
18
|
providers[:chef] ||= Ironfan::Provider::ChefServer
|
19
19
|
return unless server
|
20
|
-
providers[:iaas]
|
21
|
-
volumes
|
22
|
-
volumes
|
23
|
-
volumes.each
|
24
|
-
rescue StandardError => err ; err.polish("#{self.class} on #{args}'") rescue nil ; raise
|
20
|
+
providers[:iaas] = server.selected_cloud.provider
|
21
|
+
volumes = server.volumes.values
|
22
|
+
volumes += server.implied_volumes
|
23
|
+
volumes.each{|vol| self.drive vol.name, :volume => vol }
|
24
|
+
rescue StandardError => err ; err.polish("#{self.class} on '#{args.inspect}'") rescue nil ; raise
|
25
25
|
end
|
26
26
|
|
27
27
|
def name
|
@@ -38,11 +38,11 @@ module Ironfan
|
|
38
38
|
res.expected_ids(self).each do |id|
|
39
39
|
next unless res.recall? id
|
40
40
|
|
41
|
-
recalled =
|
42
|
-
recalled.users <<
|
41
|
+
recalled = res.recall id
|
42
|
+
recalled.users << self
|
43
43
|
|
44
|
-
target
|
45
|
-
target +=
|
44
|
+
target = res.resource_type.to_s
|
45
|
+
target += "__#{id}" if res.multiple?
|
46
46
|
self[target.to_sym] = recalled
|
47
47
|
|
48
48
|
recalled.on_correlate(self)
|
@@ -130,14 +130,6 @@ module Ironfan
|
|
130
130
|
@chef_client_script_content = Ironfan.safely{ File.read(script_filename) }
|
131
131
|
end
|
132
132
|
|
133
|
-
# def ensure_resource(type)
|
134
|
-
# if type.multiple?
|
135
|
-
# existing = resources[type.resource_id]
|
136
|
-
# else
|
137
|
-
#
|
138
|
-
# end
|
139
|
-
# end
|
140
|
-
|
141
133
|
#
|
142
134
|
# Display
|
143
135
|
#
|
@@ -200,7 +192,7 @@ module Ironfan
|
|
200
192
|
self[:machine] = value
|
201
193
|
end
|
202
194
|
def dns_name ; machine? ? machine.dns_name : nil ; end
|
203
|
-
def bootstrap_distro ; (server && server.selected_cloud) ? server.selected_cloud.bootstrap_distro
|
195
|
+
def bootstrap_distro ; (server && server.selected_cloud) ? server.selected_cloud.bootstrap_distro : nil ; end
|
204
196
|
|
205
197
|
def keypair
|
206
198
|
resources[:keypair]
|
@@ -225,16 +217,16 @@ module Ironfan
|
|
225
217
|
not client.nil?
|
226
218
|
end
|
227
219
|
def created?
|
228
|
-
machine?
|
220
|
+
machine? && machine.created?
|
229
221
|
end
|
230
222
|
def machine?
|
231
223
|
not machine.nil?
|
232
224
|
end
|
233
225
|
def killable?
|
234
|
-
not permanent?
|
226
|
+
(not bogus?) && (not permanent?) && (node? || client? || created?)
|
235
227
|
end
|
236
228
|
def launchable?
|
237
|
-
not bogus?
|
229
|
+
(not bogus?) && (not created?)
|
238
230
|
end
|
239
231
|
def node?
|
240
232
|
not node.nil?
|
@@ -245,13 +237,13 @@ module Ironfan
|
|
245
237
|
[true, :true, 'true'].include? server.selected_cloud.permanent
|
246
238
|
end
|
247
239
|
def running?
|
248
|
-
machine?
|
240
|
+
machine? && machine.running?
|
249
241
|
end
|
250
242
|
def server?
|
251
243
|
not server.nil?
|
252
244
|
end
|
253
245
|
def stopped?
|
254
|
-
machine?
|
246
|
+
machine? && machine.stopped?
|
255
247
|
end
|
256
248
|
|
257
249
|
# @return [Boolean] true if machine is likely to be reachable by ssh
|
@@ -295,15 +287,15 @@ module Ironfan
|
|
295
287
|
|
296
288
|
def validate
|
297
289
|
computers = self
|
298
|
-
values.each{|c|
|
290
|
+
values.each{|c| c.validate }
|
299
291
|
values.map {|c| c.providers.values}.flatten.uniq.each {|p| p.validate computers }
|
300
292
|
end
|
301
293
|
|
302
294
|
def group_action(verb)
|
303
295
|
computers = self
|
304
|
-
provider_keys = values.map
|
305
|
-
providers = provider_keys.map
|
306
|
-
providers.each
|
296
|
+
provider_keys = values.map{|c| c.chosen_providers({ :providers => :iaas })}.flatten.uniq
|
297
|
+
providers = provider_keys.map{|pk| values.map{|c| c.providers[pk] } }.flatten.compact.uniq
|
298
|
+
providers.each{|p| p.send(verb, computers) }
|
307
299
|
end
|
308
300
|
|
309
301
|
def prepare
|
@@ -318,19 +310,19 @@ module Ironfan
|
|
318
310
|
# Manipulation
|
319
311
|
#
|
320
312
|
def kill(options={})
|
321
|
-
Ironfan.parallel(values)
|
313
|
+
Ironfan.parallel(values){|cc| cc.kill(options) }
|
322
314
|
end
|
323
315
|
def launch
|
324
|
-
Ironfan.parallel(values)
|
316
|
+
Ironfan.parallel(values){|cc| cc.launch }
|
325
317
|
end
|
326
318
|
def save(options={})
|
327
|
-
Ironfan.parallel(values)
|
319
|
+
Ironfan.parallel(values){|cc| cc.save(options) }
|
328
320
|
end
|
329
321
|
def start
|
330
|
-
Ironfan.parallel(values)
|
322
|
+
Ironfan.parallel(values){|cc| cc.start }
|
331
323
|
end
|
332
324
|
def stop
|
333
|
-
Ironfan.parallel(values)
|
325
|
+
Ironfan.parallel(values){|cc| cc.stop }
|
334
326
|
end
|
335
327
|
|
336
328
|
def environments
|
@@ -351,7 +343,7 @@ module Ironfan
|
|
351
343
|
# Return the selection inside another Computers collection
|
352
344
|
def select(&block)
|
353
345
|
result = empty_copy
|
354
|
-
values.select(&block).each{|
|
346
|
+
values.select(&block).each{|mach| result << mach}
|
355
347
|
result
|
356
348
|
end
|
357
349
|
|
@@ -363,16 +355,14 @@ module Ironfan
|
|
363
355
|
|
364
356
|
# Find all selected computers, as well as any bogus computers from discovery
|
365
357
|
def slice(facet_name=nil, slice_indexes=nil)
|
366
|
-
return self if (facet_name.nil?
|
367
|
-
result = empty_copy
|
358
|
+
return self if (facet_name.nil? && slice_indexes.nil?)
|
368
359
|
slice_array = build_slice_array(slice_indexes)
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
360
|
+
select do |mach|
|
361
|
+
mach.bogus? or (
|
362
|
+
# facet match, and index match (or no indexes specified)
|
363
|
+
(mach.server.facet_name == facet_name) &&
|
364
|
+
(slice_array.include?(mach.server.index) || slice_indexes.nil?))
|
374
365
|
end
|
375
|
-
result
|
376
366
|
end
|
377
367
|
|
378
368
|
def build_slice_array(slice_indexes)
|
data/lib/ironfan/broker.rb
CHANGED
@@ -31,11 +31,15 @@ module Ironfan
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def display(computers,style)
|
34
|
-
defined_data = computers.map
|
34
|
+
defined_data = computers.map do |mach|
|
35
|
+
hsh = mach.to_display(style)
|
36
|
+
hsh.merge!(yield(mach)) if block_given?
|
37
|
+
hsh
|
38
|
+
end
|
35
39
|
if defined_data.empty?
|
36
40
|
ui.info "Nothing to report"
|
37
41
|
else
|
38
|
-
headings = defined_data.map{|
|
42
|
+
headings = defined_data.map{|hsh| hsh.keys }.flatten.uniq
|
39
43
|
Formatador.display_compact_table(defined_data, headings.to_a)
|
40
44
|
end
|
41
45
|
end
|
@@ -19,6 +19,7 @@ module Ironfan
|
|
19
19
|
def self.multiple?() true; end
|
20
20
|
def self.resource_type() :security_group; end
|
21
21
|
def self.expected_ids(computer)
|
22
|
+
return unless computer.server
|
22
23
|
ec2 = computer.server.cloud(:ec2)
|
23
24
|
ec2.security_groups.keys.map { |name| group_name_with_vpc(name,ec2.vpc) }.uniq
|
24
25
|
end
|
@@ -73,7 +74,7 @@ module Ironfan
|
|
73
74
|
# First, deduce the list of all groups to which at least one instance belongs
|
74
75
|
# We'll use this later to decide whether to create groups, or authorize access,
|
75
76
|
# using a VPC security group or an EC2 security group.
|
76
|
-
groups_that_should_exist = computers.map
|
77
|
+
groups_that_should_exist = computers.map{|comp| expected_ids(comp) }.flatten.compact.sort.uniq
|
77
78
|
groups_to_create << groups_that_should_exist
|
78
79
|
|
79
80
|
computers.select { |computer| Ec2.applicable computer }.each do |computer|
|
data/notes/Home.md
CHANGED
@@ -44,6 +44,11 @@ Ironfan consists of the following toolset:
|
|
44
44
|
* [ironfan issues](https://github.com/infochimps-labs/ironfan/issues): bugs, questions and feature requests for *any* part of the Ironfan toolset.
|
45
45
|
* [ironfan gem docs](http://rdoc.info/gems/ironfan): rdoc docs for Ironfan
|
46
46
|
|
47
|
+
|
48
|
+
<a name="documentation"></a>
|
49
|
+
### Documentation
|
50
|
+
* [EC2 Instance Pricing and Capacity Reference](https://github.com/infochimps-labs/ironfan/wiki/ec2-pricing_and_capacity) * [EC2 Pricing and Capacity Spreadsheet](https://github.com/infochimps-labs/ironfan/wiki/ec2-pricing_and_capacity.numbers) -- source data, and calculations for Hadoop tunables
|
51
|
+
|
47
52
|
__________________________________________________________________________
|
48
53
|
__________________________________________________________________________
|
49
54
|
__________________________________________________________________________
|
@@ -1,25 +1,31 @@
|
|
1
1
|
## Compute Costs
|
2
2
|
|
3
3
|
|
4
|
-
code $/mo $/day $/hr Mem/$ CPU/$ mem cpu cores cpcore storage disks
|
5
|
-
t1.micro
|
6
|
-
m1.small
|
7
|
-
m1.medium
|
8
|
-
c1.medium
|
9
|
-
m1.large
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
4
|
+
code $/mo $/day $/hr Mem/$ CPU/$ mem cpu cores cpcore storage disks ebs-opt IO
|
5
|
+
t1.micro 15 0.48 .02 31 13 .61 0.25 1 0.25 - 0 Lo
|
6
|
+
m1.small 44 1.44 .06 28 17 1.7 1 1 1 160 1 Med
|
7
|
+
m1.medium 88 2.88 .12 31 17 3.75 2 2 1 410 1 Med
|
8
|
+
c1.medium 106 3.48 .15 12 34 1.7 5 2 2.5 350 1 Med
|
9
|
+
m1.large 175 5.76 .24 31 17 7.5 4 2 2 850 2 Hi
|
10
|
+
m1.lg+ebs 194 6.36 .27 28 15 7.5 4 2 2 850 2 500 Hi+EBS
|
11
|
+
m2.xlarge 300 9.84 .41 42 16 17.1 6.5 2 3.25 420 1 Med
|
12
|
+
m1.xlarge 351 11.52 .48 31 17 15. 8 4 2 1690 4 Hi
|
13
|
+
m3.xlarge 365 12.00 .50 30 26 15. 13 4 3.25 - 0 Med
|
14
|
+
m1.xl+ebs 387 12.72 .53 28 15 15. 8 4 2 1690 4 1000 Hi+EBS
|
15
|
+
c1.xlarge 424 13.92 .58 12 34 7. 20 8 2.5 1690 4 Hi
|
16
|
+
m2.2xlarge 599 19.68 .82 42 16 34.2 13 4 3.25 850 2 Hi
|
17
|
+
m3.2xlarge 731 24.00 1.00 30 26 30. 26 8 3.25 - 0 Hi
|
18
|
+
cc1.4xlarge 950 31.20 1.30 18 26 23. 33.5 8 4.2 1690 4 10gb
|
19
|
+
m2.4xlarge 1198 39.36 1.64 42 16 68.4 26 8 3.25 1690 2 Hi
|
20
|
+
m2.4xl+ebs 1235 40.56 1.69 40 15 68.4 26 8 3.25 1690 2 1000 Hi+EBS
|
21
|
+
cg1.4xlarge 1534 50.40 2.10 10 16 22. 33.5 8 4.2 1690 4 10gb
|
22
|
+
cc2.8xlarge 1753 57.60 2.40 25 37 60.5 88 16 5.5 3370 2 10gb
|
23
|
+
hi1.4xlarge 2265 74.40 3.10 20 11 60.5 35.2 16 2.2 2048 ssd 2 10gb
|
24
|
+
cr1.8xlarge 2557 84.00 3.50 70 25 244. 88 16 5.5 240 ssd 2 10gb
|
25
|
+
hs1.8xlarge 3361 110.40 4.60 25 8 117. 35 16 2.2 49152 24 10gb
|
26
|
+
|
27
|
+
Prices are for standard (non-reserved) instances. EBS-optimized instances are listed on their own line.
|
28
|
+
|
23
29
|
|
24
30
|
## Storage Costs
|
25
31
|
|
Binary file
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ironfan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 4.8.
|
5
|
+
version: 4.8.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-02-
|
13
|
+
date: 2013-02-26 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: chef
|
@@ -284,7 +284,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
284
284
|
requirements:
|
285
285
|
- - ">="
|
286
286
|
- !ruby/object:Gem::Version
|
287
|
-
hash:
|
287
|
+
hash: 4061434417282222505
|
288
288
|
segments:
|
289
289
|
- 0
|
290
290
|
version: "0"
|