ironfan 3.1.7 → 3.2.2

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.
Files changed (63) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/Gemfile +15 -12
  3. data/Rakefile +1 -1
  4. data/VERSION +1 -1
  5. data/config/ubuntu10.04-ironfan.erb +10 -0
  6. data/config/ubuntu11.10-ironfan.erb +10 -0
  7. data/ironfan.gemspec +29 -54
  8. data/lib/chef/knife/bootstrap/centos6.2-ironfan.erb +10 -0
  9. data/lib/chef/knife/bootstrap/ubuntu10.04-ironfan.erb +10 -0
  10. data/lib/chef/knife/bootstrap/ubuntu11.10-ironfan.erb +10 -0
  11. data/lib/chef/knife/cluster_kick.rb +7 -2
  12. data/lib/chef/knife/cluster_launch.rb +3 -0
  13. data/lib/chef/knife/cluster_ssh.rb +3 -3
  14. data/lib/chef/knife/ironfan_knife_common.rb +21 -0
  15. data/lib/chef/knife/ironfan_script.rb +2 -0
  16. data/lib/ironfan/chef_layer.rb +9 -9
  17. data/lib/ironfan/cloud.rb +232 -360
  18. data/lib/ironfan/cluster.rb +3 -3
  19. data/lib/ironfan/compute.rb +26 -40
  20. data/lib/ironfan/deprecated.rb +45 -10
  21. data/lib/ironfan/discovery.rb +1 -1
  22. data/lib/ironfan/dsl_builder.rb +99 -0
  23. data/lib/ironfan/facet.rb +2 -3
  24. data/lib/ironfan/fog_layer.rb +14 -10
  25. data/lib/ironfan/private_key.rb +1 -1
  26. data/lib/ironfan/security_group.rb +46 -44
  27. data/lib/ironfan/server.rb +26 -52
  28. data/lib/ironfan/server_slice.rb +13 -19
  29. data/lib/ironfan/volume.rb +47 -59
  30. data/lib/ironfan.rb +5 -4
  31. metadata +116 -122
  32. data/lib/ironfan/dsl_object.rb +0 -124
  33. data/notes/Backup of ec2-pricing_and_capacity.numbers +0 -0
  34. data/notes/Home.md +0 -45
  35. data/notes/INSTALL-cloud_setup.md +0 -103
  36. data/notes/INSTALL.md +0 -134
  37. data/notes/Ironfan-Roadmap.md +0 -70
  38. data/notes/advanced-superpowers.md +0 -16
  39. data/notes/aws_servers.jpg +0 -0
  40. data/notes/aws_user_key.png +0 -0
  41. data/notes/cookbook-versioning.md +0 -11
  42. data/notes/core_concepts.md +0 -200
  43. data/notes/declaring_volumes.md +0 -3
  44. data/notes/design_notes-aspect_oriented_devops.md +0 -36
  45. data/notes/design_notes-ci_testing.md +0 -169
  46. data/notes/design_notes-cookbook_event_ordering.md +0 -249
  47. data/notes/design_notes-meta_discovery.md +0 -59
  48. data/notes/ec2-pricing_and_capacity.md +0 -69
  49. data/notes/ec2-pricing_and_capacity.numbers +0 -0
  50. data/notes/homebase-layout.txt +0 -102
  51. data/notes/knife-cluster-commands.md +0 -18
  52. data/notes/named-cloud-objects.md +0 -11
  53. data/notes/opscode_org_key.png +0 -0
  54. data/notes/opscode_user_key.png +0 -0
  55. data/notes/philosophy.md +0 -13
  56. data/notes/rake_tasks.md +0 -24
  57. data/notes/renamed-recipes.txt +0 -142
  58. data/notes/silverware.md +0 -85
  59. data/notes/style_guide.md +0 -300
  60. data/notes/tips_and_troubleshooting.md +0 -92
  61. data/notes/version-3_2.md +0 -273
  62. data/notes/walkthrough-hadoop.md +0 -168
  63. data/notes/walkthrough-web.md +0 -166
@@ -5,32 +5,26 @@ module Ironfan
5
5
  # The idea is we want to be able to smoothly roll up settings
6
6
  #
7
7
  #
8
- class ServerSlice < Ironfan::DslObject
9
- attr_reader :name, :servers, :cluster
8
+ class ServerSlice < Ironfan::DslBuilderCollection
9
+ attr_accessor :name
10
+ attr_accessor :cluster
10
11
 
11
12
  def initialize cluster, servers
13
+ @item_type = Ironfan::Server
14
+ @key_method = :name
12
15
  super()
13
- @name = "#{cluster.name} slice"
14
- @cluster = cluster
15
- @servers = servers
16
+ self.name = "#{cluster.name} slice"
17
+ self.cluster = cluster
18
+ receive!(servers)
16
19
  end
17
20
 
18
- #
19
- # Enumerable
20
- #
21
- include Enumerable
22
- def each(&block)
23
- @servers.each(&block)
24
- end
25
- def length
26
- @servers.length
27
- end
28
- def empty?
29
- length == 0
21
+ def servers
22
+ @clxn.values
30
23
  end
24
+
31
25
  [:select, :find_all, :reject, :detect, :find, :drop_while].each do |method|
32
26
  define_method(method) do |*args, &block|
33
- ServerSlice.new cluster, @servers.send(method, *args, &block)
27
+ ServerSlice.new cluster, servers.send(method, *args, &block)
34
28
  end
35
29
  end
36
30
  # true if slice contains a server with the given fullname (if arg is a
@@ -197,7 +191,7 @@ module Ironfan
197
191
  hsh["State"] = "not running"
198
192
  end
199
193
  hsh['Volumes'] = []
200
- svr.composite_volumes.each do |name, vol|
194
+ svr.volumes.each_pair do |name, vol|
201
195
  if vol.ephemeral_device? then next
202
196
  elsif vol.volume_id then hsh['Volumes'] << vol.volume_id
203
197
  elsif vol.create_at_launch? then hsh['Volumes'] << vol.snapshot_id
@@ -2,33 +2,31 @@ module Ironfan
2
2
  #
3
3
  # Internal or external storage
4
4
  #
5
- class Volume < Ironfan::DslObject
6
- attr_reader :parent
5
+ class Volume < Ironfan::DslBuilder
6
+ field :parent, String
7
7
  attr_accessor :fog_volume
8
- has_keys(
9
- :name,
10
- # mountable volume attributes
11
- :device, :mount_point, :mount_options, :fstype, :mount_dump, :mount_pass,
12
- :mountable, :formattable, :resizable, :in_raid,
13
- # cloud volume attributes
14
- :attachable, :create_at_launch, :volume_id, :snapshot_id, :size, :keep, :availability_zone,
15
- # arbitrary tags
16
- :tags
17
- )
18
-
19
- VOLUME_DEFAULTS = {
20
- :fstype => 'xfs',
21
- :mount_options => 'defaults,nouuid,noatime',
22
- :keep => true,
23
- :attachable => :ebs,
24
- :create_at_launch => false,
25
- #
26
- :mountable => true,
27
- :resizable => false,
28
- :formattable => false,
29
- :in_raid => false,
30
- }
31
- def self.defaults(hsh) VOLUME_DEFAULTS.merge(hsh) ; end
8
+
9
+ # mountable volume attributes
10
+ magic :device, String
11
+ magic :mount_point, String
12
+ magic :mount_options, String, :default => 'defaults,nouuid,noatime'
13
+ magic :fstype, String, :default => 'xfs'
14
+ magic :mount_dump, String
15
+ magic :mount_pass, String
16
+ magic :mountable, Whatever, :default => true
17
+ magic :formattable, Whatever, :default => false
18
+ magic :resizable, Whatever, :default => false
19
+ magic :in_raid, Whatever, :default => false
20
+ # cloud volume attributes
21
+ magic :attachable, Whatever, :default => :ebs
22
+ magic :create_at_launch, Whatever, :default => false
23
+ magic :volume_id, String
24
+ magic :snapshot_id, String
25
+ magic :size, String
26
+ magic :keep, Whatever, :default => true
27
+ magic :availability_zone, String
28
+ # arbitrary tags
29
+ magic :tags, Hash, :default => {}
32
30
 
33
31
  # Snapshot for snapshot_name method.
34
32
  # Set your own by adding
@@ -52,18 +50,14 @@ module Ironfan
52
50
  # :tags => {}, :keep => true )
53
51
  #
54
52
  def initialize attrs={}
55
- @parent = attrs.delete(:parent)
53
+ parent = attrs.delete(:owner)
56
54
  super(attrs)
57
- @settings[:tags] ||= {}
58
55
  end
59
56
 
60
57
  # human-readable description for logging messages and such
61
58
  def desc
62
- "#{name} on #{parent.fullname} (#{volume_id} @ #{device})"
63
- end
64
-
65
- def defaults
66
- self.configure(VOLUME_DEFAULTS)
59
+ container = parent.name rescue nil
60
+ "#{name} on #{container} (#{volume_id} @ #{device})"
67
61
  end
68
62
 
69
63
  def ephemeral_device?
@@ -94,11 +88,11 @@ module Ironfan
94
88
  in_cloud? && fog_volume.server_id.present?
95
89
  end
96
90
 
97
- def reverse_merge!(other_hsh)
98
- super(other_hsh)
99
- self.tags.reverse_merge!(other_hsh.tags) if other_hsh.respond_to?(:tags) && other_hsh.tags.present?
100
- self
101
- end
91
+ # def reverse_merge!(other_hsh)
92
+ # super(other_hsh)
93
+ # self.tags.reverse_merge!(other_hsh.tags) if other_hsh.respond_to?(:tags) && other_hsh.tags.present?
94
+ # self
95
+ # end
102
96
 
103
97
  # An array of hashes with dorky-looking keys, just like Fog wants it.
104
98
  def block_device_mapping
@@ -128,31 +122,25 @@ module Ironfan
128
122
  # * http://stu.mp/2009/12/disk-io-and-throughput-benchmarks-on-amazons-ec2.html
129
123
  #
130
124
  class RaidGroup < Volume
131
- has_keys(
132
- :sub_volumes, # volumes that comprise this raid group
133
- :level, # RAID level (http://en.wikipedia.org/wiki/RAID#Standard_levels)
134
- :chunk, # Raid chunk size (https://raid.wiki.kernel.org/articles/r/a/i/RAID_setup_cbb2.html)
135
- :read_ahead, # read-ahead buffer
136
- )
125
+ # volumes that comprise this raid group
126
+ magic :sub_volumes, Array, :default => []
127
+ # RAID level (http://en.wikipedia.org/wiki/RAID#Standard_levels)
128
+ magic :level, String
129
+ # Raid chunk size (https://raid.wiki.kernel.org/articles/r/a/i/RAID_setup_cbb2.html)
130
+ magic :chunk, String
131
+ # read-ahead buffer
132
+ magic :read_ahead, String
133
+
134
+ # Overrides of Volume field defaults
135
+ magic :attachable, Whatever, :default => false
136
+ magic :formattable, Whatever, :default => true
137
+ magic :mount_options, String, :default => 'defaults,nobootwait,noatime,nouuid,comment=ironfan'
137
138
 
138
139
  def desc
139
140
  "#{name} on #{parent.fullname} (#{volume_id} @ #{device} from #{sub_volumes.join(',')})"
140
141
  end
141
142
 
142
- def defaults()
143
- super
144
- fstype 'xfs'
145
- mount_options "defaults,nobootwait,noatime,nouuid,comment=ironfan"
146
- attachable false
147
- create_at_launch false
148
- #
149
- mountable true
150
- resizable false
151
- formattable true
152
- #
153
- in_raid false
154
- #
155
- sub_volumes []
156
- end
143
+ # attr_reader :parent
144
+ attr_accessor :fog_volume
157
145
  end
158
146
  end
data/lib/ironfan.rb CHANGED
@@ -5,11 +5,12 @@ require 'gorillib/metaprogramming/class_attribute'
5
5
  require 'gorillib/hash/reverse_merge'
6
6
  require 'gorillib/object/blank'
7
7
  require 'gorillib/hash/compact'
8
+ require 'gorillib/builder'
8
9
  require 'set'
9
10
 
10
- require 'ironfan/dsl_object'
11
- require 'ironfan/cloud'
11
+ require 'ironfan/dsl_builder'
12
12
  require 'ironfan/security_group'
13
+ require 'ironfan/cloud'
13
14
  require 'ironfan/compute' # base class for machine attributes
14
15
  require 'ironfan/facet' # similar machines within a cluster
15
16
  require 'ironfan/cluster' # group of machines with a common mission
@@ -70,8 +71,8 @@ module Ironfan
70
71
  #
71
72
  def self.cluster(name, attrs={}, &block)
72
73
  name = name.to_sym
73
- cl = ( self.clusters[name] ||= Ironfan::Cluster.new(name, attrs) )
74
- cl.configure(&block)
74
+ cl = ( self.clusters[name] ||= Ironfan::Cluster.new(name) )
75
+ cl.receive!(attrs, &block)
75
76
  cl
76
77
  end
77
78
 
metadata CHANGED
@@ -1,124 +1,148 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ironfan
3
- version: !ruby/object:Gem::Version
4
- version: 3.1.7
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 3.2.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Infochimps
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-24 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-09-10 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: chef
16
- requirement: &70201801398780 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
17
18
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
21
22
  version: 0.10.4
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *70201801398780
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: fog
27
- requirement: &70201801398300 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
28
29
  none: false
29
- requirements:
30
+ requirements:
30
31
  - - ~>
31
- - !ruby/object:Gem::Version
32
- version: '1.2'
32
+ - !ruby/object:Gem::Version
33
+ version: "1.2"
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70201801398300
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: formatador
38
- requirement: &70201801397280 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
39
40
  none: false
40
- requirements:
41
+ requirements:
41
42
  - - ~>
42
- - !ruby/object:Gem::Version
43
- version: '0.2'
43
+ - !ruby/object:Gem::Version
44
+ version: "0.2"
44
45
  type: :runtime
45
46
  prerelease: false
46
- version_requirements: *70201801397280
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: gorillib
49
- requirement: &70201801396800 !ruby/object:Gem::Requirement
50
+ requirement: &id004 !ruby/object:Gem::Requirement
50
51
  none: false
51
- requirements:
52
+ requirements:
52
53
  - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '0.1'
54
+ - !ruby/object:Gem::Version
55
+ version: 0.4.2
55
56
  type: :runtime
56
57
  prerelease: false
57
- version_requirements: *70201801396800
58
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
59
60
  name: bundler
60
- requirement: &70201801396320 !ruby/object:Gem::Requirement
61
+ requirement: &id005 !ruby/object:Gem::Requirement
61
62
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '1.1'
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: "1.1"
66
67
  type: :development
67
68
  prerelease: false
68
- version_requirements: *70201801396320
69
- - !ruby/object:Gem::Dependency
70
- name: jeweler
71
- requirement: &70201801395840 !ruby/object:Gem::Requirement
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: &id006 !ruby/object:Gem::Requirement
72
73
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '1.6'
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
77
78
  type: :development
78
79
  prerelease: false
79
- version_requirements: *70201801395840
80
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
81
82
  name: rspec
82
- requirement: &70201801395360 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
83
84
  none: false
84
- requirements:
85
+ requirements:
85
86
  - - ~>
86
- - !ruby/object:Gem::Version
87
- version: '2.5'
87
+ - !ruby/object:Gem::Version
88
+ version: "2.8"
88
89
  type: :development
89
90
  prerelease: false
90
- version_requirements: *70201801395360
91
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
92
93
  name: yard
93
- requirement: &70201801394880 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
94
95
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0.6'
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0.7"
99
100
  type: :development
100
101
  prerelease: false
101
- version_requirements: *70201801394880
102
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
103
104
  name: redcarpet
104
- requirement: &70201801394400 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
105
106
  none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: '2'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "2.1"
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: oj
116
+ requirement: &id010 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "1.2"
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *id010
125
+ - !ruby/object:Gem::Dependency
126
+ name: json
127
+ requirement: &id011 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
110
133
  type: :development
111
134
  prerelease: false
112
- version_requirements: *70201801394400
113
- description: Ironfan allows you to orchestrate not just systems but clusters of machines.
114
- It includes a powerful layer on top of knife and a collection of cloud cookbooks.
135
+ version_requirements: *id011
136
+ 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.
115
137
  email: coders@infochimps.com
116
138
  executables: []
139
+
117
140
  extensions: []
118
- extra_rdoc_files:
141
+
142
+ extra_rdoc_files:
119
143
  - LICENSE.md
120
144
  - README.md
121
- files:
145
+ files:
122
146
  - .gitignore
123
147
  - .rspec
124
148
  - .yardopts
@@ -164,7 +188,7 @@ files:
164
188
  - lib/ironfan/compute.rb
165
189
  - lib/ironfan/deprecated.rb
166
190
  - lib/ironfan/discovery.rb
167
- - lib/ironfan/dsl_object.rb
191
+ - lib/ironfan/dsl_builder.rb
168
192
  - lib/ironfan/facet.rb
169
193
  - lib/ironfan/fog_layer.rb
170
194
  - lib/ironfan/private_key.rb
@@ -173,37 +197,6 @@ files:
173
197
  - lib/ironfan/server.rb
174
198
  - lib/ironfan/server_slice.rb
175
199
  - lib/ironfan/volume.rb
176
- - notes/Backup of ec2-pricing_and_capacity.numbers
177
- - notes/Home.md
178
- - notes/INSTALL-cloud_setup.md
179
- - notes/INSTALL.md
180
- - notes/Ironfan-Roadmap.md
181
- - notes/advanced-superpowers.md
182
- - notes/aws_servers.jpg
183
- - notes/aws_user_key.png
184
- - notes/cookbook-versioning.md
185
- - notes/core_concepts.md
186
- - notes/declaring_volumes.md
187
- - notes/design_notes-aspect_oriented_devops.md
188
- - notes/design_notes-ci_testing.md
189
- - notes/design_notes-cookbook_event_ordering.md
190
- - notes/design_notes-meta_discovery.md
191
- - notes/ec2-pricing_and_capacity.md
192
- - notes/ec2-pricing_and_capacity.numbers
193
- - notes/homebase-layout.txt
194
- - notes/knife-cluster-commands.md
195
- - notes/named-cloud-objects.md
196
- - notes/opscode_org_key.png
197
- - notes/opscode_user_key.png
198
- - notes/philosophy.md
199
- - notes/rake_tasks.md
200
- - notes/renamed-recipes.txt
201
- - notes/silverware.md
202
- - notes/style_guide.md
203
- - notes/tips_and_troubleshooting.md
204
- - notes/version-3_2.md
205
- - notes/walkthrough-hadoop.md
206
- - notes/walkthrough-web.md
207
200
  - spec/ironfan/cluster_spec.rb
208
201
  - spec/ironfan/facet_spec.rb
209
202
  - spec/ironfan/server_slice_spec.rb
@@ -214,40 +207,41 @@ files:
214
207
  - spec/test_config.rb
215
208
  - tasks/chef_config.rake
216
209
  homepage: http://infochimps.com/labs
217
- licenses:
210
+ licenses:
218
211
  - apachev2
219
212
  post_install_message:
220
213
  rdoc_options: []
221
- require_paths:
214
+
215
+ require_paths:
222
216
  - lib
223
- required_ruby_version: !ruby/object:Gem::Requirement
217
+ required_ruby_version: !ruby/object:Gem::Requirement
224
218
  none: false
225
- requirements:
226
- - - ! '>='
227
- - !ruby/object:Gem::Version
228
- version: '0'
229
- segments:
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ hash: 1629322618717092090
223
+ segments:
230
224
  - 0
231
- hash: 2550767254429275141
232
- required_rubygems_version: !ruby/object:Gem::Requirement
225
+ version: "0"
226
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
227
  none: false
234
- requirements:
235
- - - ! '>='
236
- - !ruby/object:Gem::Version
237
- version: '0'
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: "0"
238
232
  requirements: []
233
+
239
234
  rubyforge_project:
240
- rubygems_version: 1.8.11
235
+ rubygems_version: 1.8.24
241
236
  signing_key:
242
237
  specification_version: 3
243
- summary: Ironfan allows you to orchestrate not just systems but clusters of machines.
244
- It includes a powerful layer on top of knife and a collection of cloud cookbooks.
245
- test_files:
238
+ summary: 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.
239
+ test_files:
240
+ - spec/ironfan_spec.rb
241
+ - spec/spec_helper/dummy_chef.rb
246
242
  - spec/ironfan/cluster_spec.rb
247
- - spec/ironfan/facet_spec.rb
248
243
  - spec/ironfan/server_slice_spec.rb
249
244
  - spec/ironfan/server_spec.rb
250
- - spec/ironfan_spec.rb
251
- - spec/spec_helper/dummy_chef.rb
245
+ - spec/ironfan/facet_spec.rb
252
246
  - spec/spec_helper.rb
253
247
  - spec/test_config.rb
@@ -1,124 +0,0 @@
1
- Mash.class_eval do
2
- def reverse_merge!(other_hash)
3
- # stupid mash doesn't take a block arg, which breaks the implementation of
4
- # reverse_merge!
5
- other_hash.each_pair do |key, value|
6
- key = convert_key(key)
7
- regular_writer(key, convert_value(value)) unless has_key?(key)
8
- end
9
- self
10
- end
11
- def to_mash
12
- self.dup
13
- end unless method_defined?(:to_mash)
14
- end
15
-
16
- Hash.class_eval do
17
- def to_mash
18
- Mash.new(self)
19
- end unless method_defined?(:to_mash)
20
- end
21
-
22
- module Ironfan
23
- #
24
- # Provides magic methods, defined with has_keys
25
- #
26
- # @example
27
- # class Mom < Ironfan::DslObject
28
- # has_keys(:college, :combat_boots, :fat, :so_fat)
29
- # end
30
- #
31
- # class Person
32
- # def momma &block
33
- # @momma ||= Mom.new
34
- # @momma.configure(&block) if block
35
- # end
36
- # end
37
- #
38
- # yo = Person.new
39
- # yo.mamma.combat_boots :wears
40
- # yo.momma do
41
- # fat true
42
- # so_fat 'When she sits around the house, she sits *AROUND* the house'
43
- # end
44
- #
45
- class DslObject
46
- class_attribute :keys
47
- self.keys = []
48
-
49
- def initialize(attrs={}, &block)
50
- @settings = Mash.new
51
- configure(attrs, &block)
52
- end
53
-
54
- #
55
- # Defines DSL attributes
56
- #
57
- # @param [Array(String)] key_names DSL attribute names
58
- #
59
- # @example
60
- # class Mom < Ironfan::DslObject
61
- # has_keys(:fat, :so_fat)
62
- # end
63
- # yer_mom = Mom.new
64
- # yer_mom.fat :quite
65
- #
66
- def self.has_keys(*key_names)
67
- key_names.map!(&:to_sym)
68
- self.keys += key_names
69
- self.keys.uniq!
70
- key_names.each do |key|
71
- next if method_defined?(key)
72
- define_method(key){|*args| set(key, *args) }
73
- end
74
- end
75
-
76
- #
77
- # Sets the DSL attribute, unless the given value is nil.
78
- #
79
- def set(key, val=nil)
80
- @settings[key.to_s] = val unless val.nil?
81
- @settings[key.to_s]
82
- end
83
-
84
- def to_hash
85
- @settings.to_hash
86
- end
87
-
88
- def to_mash
89
- @settings.dup
90
- end
91
-
92
- def to_s
93
- "<#{self.class} #{to_hash.inspect}>"
94
- end
95
-
96
- def reverse_merge!(hsh)
97
- @settings.reverse_merge!(hsh.to_hash)
98
- end
99
-
100
- def configure(hsh={}, &block)
101
- @settings.merge!(hsh.to_hash)
102
- instance_eval(&block) if block
103
- self
104
- end
105
-
106
- # delegate to the knife ui presenter
107
- def ui() Ironfan.ui ; end
108
- # delegate to the knife ui presenter
109
- def self.ui() Ironfan.ui ; end
110
-
111
- def step(desc, *style)
112
- ui.info(" #{"%-15s" % (name.to_s+":")}\t#{ui.color(desc.to_s, *style)}")
113
- end
114
-
115
- # helper method for bombing out of a script
116
- def die(*args) Ironfan.die(*args) ; end
117
-
118
- # helper method for turning exceptions into warnings
119
- def safely(*args, &block) Ironfan.safely(*args, &block) ; end
120
-
121
- # helper method for debugging only
122
- def dump(*args) args.each{|arg| Chef::Log.debug( arg.inspect ) } end
123
- end
124
- end