ironfan 3.1.7 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
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