ironfan 3.2.2 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/ironfan.gemspec +33 -20
- data/lib/chef/knife/cluster_kick.rb +17 -17
- data/lib/chef/knife/cluster_kill.rb +13 -7
- data/lib/chef/knife/cluster_launch.rb +60 -66
- data/lib/chef/knife/cluster_pry.rb +2 -2
- data/lib/chef/knife/cluster_show.rb +3 -6
- data/lib/chef/knife/cluster_ssh.rb +5 -11
- data/lib/chef/knife/cluster_start.rb +2 -4
- data/lib/chef/knife/cluster_stop.rb +1 -3
- data/lib/chef/knife/cluster_sync.rb +13 -21
- data/lib/chef/knife/ironfan_knife_common.rb +11 -9
- data/lib/chef/knife/ironfan_script.rb +2 -1
- data/lib/gorillib/resolution.rb +119 -0
- data/lib/ironfan/broker/computer.rb +316 -0
- data/lib/ironfan/broker/drive.rb +21 -0
- data/lib/ironfan/broker.rb +37 -0
- data/lib/ironfan/builder.rb +14 -0
- data/lib/ironfan/deprecated.rb +16 -58
- data/lib/ironfan/dsl/cloud.rb +21 -0
- data/lib/ironfan/dsl/cluster.rb +27 -0
- data/lib/ironfan/dsl/compute.rb +84 -0
- data/lib/ironfan/dsl/ec2.rb +260 -0
- data/lib/ironfan/dsl/facet.rb +25 -0
- data/lib/ironfan/dsl/role.rb +19 -0
- data/lib/ironfan/dsl/server.rb +31 -0
- data/lib/ironfan/dsl/virtualbox.rb +8 -0
- data/lib/ironfan/dsl/volume.rb +45 -0
- data/lib/ironfan/dsl.rb +7 -0
- data/lib/ironfan/headers.rb +58 -0
- data/lib/ironfan/provider/chef/client.rb +77 -0
- data/lib/ironfan/provider/chef/node.rb +133 -0
- data/lib/ironfan/provider/chef/role.rb +69 -0
- data/lib/ironfan/provider/chef.rb +28 -0
- data/lib/ironfan/provider/ec2/ebs_volume.rb +137 -0
- data/lib/ironfan/provider/ec2/elastic_ip.rb +10 -0
- data/lib/ironfan/provider/ec2/key_pair.rb +65 -0
- data/lib/ironfan/provider/ec2/machine.rb +258 -0
- data/lib/ironfan/provider/ec2/placement_group.rb +24 -0
- data/lib/ironfan/provider/ec2/security_group.rb +118 -0
- data/lib/ironfan/provider/ec2.rb +47 -0
- data/lib/ironfan/provider/virtualbox/machine.rb +10 -0
- data/lib/ironfan/provider/virtualbox.rb +8 -0
- data/lib/ironfan/provider.rb +139 -0
- data/lib/ironfan/requirements.rb +52 -0
- data/lib/ironfan.rb +44 -33
- metadata +34 -21
- data/lib/chef/knife/cluster_vagrant.rb +0 -144
- data/lib/chef/knife/vagrant/ironfan_environment.rb +0 -18
- data/lib/chef/knife/vagrant/ironfan_provisioners.rb +0 -27
- data/lib/chef/knife/vagrant/skeleton_vagrantfile.rb +0 -119
- data/lib/ironfan/chef_layer.rb +0 -300
- data/lib/ironfan/cloud.rb +0 -323
- data/lib/ironfan/cluster.rb +0 -118
- data/lib/ironfan/compute.rb +0 -139
- data/lib/ironfan/discovery.rb +0 -190
- data/lib/ironfan/dsl_builder.rb +0 -99
- data/lib/ironfan/facet.rb +0 -143
- data/lib/ironfan/fog_layer.rb +0 -196
- data/lib/ironfan/private_key.rb +0 -130
- data/lib/ironfan/role_implications.rb +0 -58
- data/lib/ironfan/security_group.rb +0 -133
- data/lib/ironfan/server.rb +0 -291
- data/lib/ironfan/server_slice.rb +0 -265
- data/lib/ironfan/volume.rb +0 -146
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'gorillib/model/serialization'
|
2
|
+
require 'gorillib/serialization/to_wire'
|
3
|
+
require 'gorillib/hash/deep_merge'
|
4
|
+
|
5
|
+
module Gorillib
|
6
|
+
|
7
|
+
# Make a clean deep-copy of the value, via gorillib semantics if
|
8
|
+
# possible, otherwise via marshalling
|
9
|
+
def self.deep_copy(value)
|
10
|
+
case
|
11
|
+
when ( value.respond_to? :to_wire and value.respond_to? :receive )
|
12
|
+
return value.class.receive(value.to_wire)
|
13
|
+
else
|
14
|
+
return Marshal.load(Marshal.dump(value))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Model
|
19
|
+
Field.class_eval do
|
20
|
+
field :resolver, Symbol, :default => :read_set_or_underlay_attribute
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# The attribute :underlay provides an object (preferably another
|
25
|
+
# Gorillib::Model or the like) that will resolve stacked
|
26
|
+
# defaults. If fields are declared with a :resolver, it will
|
27
|
+
# apply that call in preference the default rules (self.field
|
28
|
+
# -> underlay.field -> self.field.default )
|
29
|
+
#
|
30
|
+
# To provide resolve cleanly without read-write loops destroying
|
31
|
+
# the separation of concerns, the resolve mechanism has been
|
32
|
+
# broken from the regular read-write accessors.
|
33
|
+
#
|
34
|
+
module Resolution
|
35
|
+
extend Gorillib::Concern
|
36
|
+
include Gorillib::FancyBuilder
|
37
|
+
attr_accessor :underlay
|
38
|
+
|
39
|
+
# Return a fully-resolved copy of this object. All objects
|
40
|
+
# referenced will be clean deep_copies, and will lack the
|
41
|
+
# :underlay accessor. This is by design, to prevent self-
|
42
|
+
# referential loops (parent->collection->child->owner)
|
43
|
+
# when deep_coping.
|
44
|
+
def resolve
|
45
|
+
result = self.class.new
|
46
|
+
self.class.fields.each do |field_name, field|
|
47
|
+
value = read_resolved_attribute(field_name)
|
48
|
+
result.write_attribute(field_name, value) unless value.nil?
|
49
|
+
end
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
def deep_resolve(field_name)
|
54
|
+
temp = read_set_or_underlay_attribute(field_name)
|
55
|
+
return if temp.nil?
|
56
|
+
if temp.is_a? Gorillib::Collection
|
57
|
+
result = temp.class.new
|
58
|
+
temp.each_pair {|k,v| result[k] = resolve_value(v) }
|
59
|
+
else
|
60
|
+
result = resolve_value(v)
|
61
|
+
end
|
62
|
+
result
|
63
|
+
end
|
64
|
+
|
65
|
+
def resolve_value(value)
|
66
|
+
return if value.nil?
|
67
|
+
return value.resolve if value.respond_to? :resolve
|
68
|
+
deep_copy(value)
|
69
|
+
end
|
70
|
+
|
71
|
+
def merge_resolve(field_name)
|
72
|
+
field = self.class.fields[field_name] or return
|
73
|
+
result = field.type.new
|
74
|
+
merge_values(result,read_underlay_attribute(field_name))
|
75
|
+
merge_values(result,read_set_attribute(field_name))
|
76
|
+
result
|
77
|
+
end
|
78
|
+
|
79
|
+
def merge_values(target, value=nil)
|
80
|
+
value ||= {}
|
81
|
+
if target.is_a? Gorillib::Collection
|
82
|
+
value.each_pair do |k,v|
|
83
|
+
existing = target[k]
|
84
|
+
if existing && existing.respond_to?(:receive!)
|
85
|
+
target[k].receive! v
|
86
|
+
elsif existing && existing.respond_to?(:merge!)
|
87
|
+
target[k].merge! v
|
88
|
+
else
|
89
|
+
target[k] = v
|
90
|
+
end
|
91
|
+
end
|
92
|
+
else
|
93
|
+
target.receive! value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def read_resolved_attribute(field_name)
|
98
|
+
field = self.class.fields[field_name] or return
|
99
|
+
self.send(field.resolver, field_name)
|
100
|
+
end
|
101
|
+
|
102
|
+
def read_set_attribute(field_name)
|
103
|
+
attr_name = "@#{field_name}"
|
104
|
+
instance_variable_get(attr_name) if instance_variable_defined?(attr_name)
|
105
|
+
end
|
106
|
+
|
107
|
+
def read_underlay_attribute(field_name)
|
108
|
+
return if underlay.nil?
|
109
|
+
underlay.read_resolved_attribute(field_name)
|
110
|
+
end
|
111
|
+
|
112
|
+
def read_set_or_underlay_attribute(field_name)
|
113
|
+
result = read_set_attribute(field_name)
|
114
|
+
return result unless result.nil?
|
115
|
+
read_underlay_attribute(field_name)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,316 @@
|
|
1
|
+
module Ironfan
|
2
|
+
class Broker
|
3
|
+
|
4
|
+
class Computer < Builder
|
5
|
+
collection :resources, Whatever
|
6
|
+
collection :drives, Ironfan::Broker::Drive
|
7
|
+
collection :providers, Ironfan::Provider
|
8
|
+
field :server, Ironfan::Dsl::Server
|
9
|
+
delegate :[],:[]=,:include?,:delete,
|
10
|
+
:to => :resources
|
11
|
+
|
12
|
+
# Only used for bogus servers
|
13
|
+
field :name, String
|
14
|
+
field :bogus, Array, :default => []
|
15
|
+
|
16
|
+
def initialize(*args)
|
17
|
+
super
|
18
|
+
providers[:chef] ||= Ironfan::Provider::ChefServer
|
19
|
+
return unless server
|
20
|
+
providers[:iaas] = server.selected_cloud.provider
|
21
|
+
volumes = server.volumes.values
|
22
|
+
volumes += server.implied_volumes
|
23
|
+
volumes.each { |v| self.drive v.name, :volume => v }
|
24
|
+
end
|
25
|
+
|
26
|
+
def name
|
27
|
+
return server.fullname if server?
|
28
|
+
return @name if @name
|
29
|
+
"unnamed:#{object_id}"
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Discovery
|
34
|
+
#
|
35
|
+
def correlate
|
36
|
+
chosen_resources.each do |res|
|
37
|
+
unless res.respond_to? :expected_ids
|
38
|
+
Chef::Log.warn("FIXME: Using correlate! instead of on_correlate in #{res}")
|
39
|
+
res.correlate! self
|
40
|
+
return
|
41
|
+
end
|
42
|
+
|
43
|
+
res.expected_ids(self).each do |id|
|
44
|
+
next unless res.recall? id
|
45
|
+
|
46
|
+
recalled = res.recall id
|
47
|
+
recalled.users << self
|
48
|
+
|
49
|
+
target = res.resource_type.to_s
|
50
|
+
target += "__#{id}" if res.multiple?
|
51
|
+
self[target.to_sym] = recalled
|
52
|
+
|
53
|
+
recalled.on_correlate(self)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def correlate_with(res)
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate
|
62
|
+
computer = self
|
63
|
+
Ironfan.delegate_to(chosen_resources) { validate_computer! computer }
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Manipulation
|
68
|
+
#
|
69
|
+
def kill(options={})
|
70
|
+
target_resources = chosen_resources(options)
|
71
|
+
resources.each do |res|
|
72
|
+
next unless target_resources.include? res.class
|
73
|
+
res.destroy unless res.shared?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def launch
|
78
|
+
ensure_dependencies
|
79
|
+
providers[:iaas].machine_class.create! self
|
80
|
+
save
|
81
|
+
end
|
82
|
+
|
83
|
+
def stop
|
84
|
+
machine.stop
|
85
|
+
node.announce_state :stopped
|
86
|
+
end
|
87
|
+
|
88
|
+
def start
|
89
|
+
ensure_dependencies
|
90
|
+
machine.start
|
91
|
+
node.announce_state :started
|
92
|
+
save
|
93
|
+
end
|
94
|
+
|
95
|
+
def save(options={})
|
96
|
+
chosen_resources(options).each {|res| res.save! self}
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# Utility
|
101
|
+
#
|
102
|
+
def chosen_providers(options={})
|
103
|
+
case options[:providers]
|
104
|
+
when :all,nil then [:chef,:iaas]
|
105
|
+
else [ (options[:providers]) ]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def chosen_resources(options={})
|
110
|
+
chosen_providers(options).map do |name|
|
111
|
+
providers[name].resources
|
112
|
+
end.flatten
|
113
|
+
end
|
114
|
+
|
115
|
+
def ensure_dependencies
|
116
|
+
chosen_resources.each do |res|
|
117
|
+
# ensure_resource res unless res < Ironfan::IaasProvider::Machine
|
118
|
+
res.create! self unless res < Ironfan::IaasProvider::Machine
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# def ensure_resource(type)
|
123
|
+
# if type.multiple?
|
124
|
+
# existing = resources[type.resource_id]
|
125
|
+
# else
|
126
|
+
#
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
|
130
|
+
#
|
131
|
+
# Display
|
132
|
+
#
|
133
|
+
def to_display(style,values={})
|
134
|
+
unless [:minimal,:default,:expanded].include? style
|
135
|
+
raise "Bad display style #{style}"
|
136
|
+
end
|
137
|
+
|
138
|
+
values["Name"] = name
|
139
|
+
# We expect these to be over-ridden by the contained classes
|
140
|
+
values["Chef?"] = "no"
|
141
|
+
values["State"] = "not running"
|
142
|
+
|
143
|
+
delegate_to([ server, node, machine ].compact) do
|
144
|
+
to_display style, values
|
145
|
+
end
|
146
|
+
|
147
|
+
if style == :expanded
|
148
|
+
values["Startable"] = display_boolean(stopped?)
|
149
|
+
values["Launchable"] = display_boolean(launchable?)
|
150
|
+
end
|
151
|
+
values["Bogus"] = bogus.join(',')
|
152
|
+
|
153
|
+
# Only show values that actually have something to show
|
154
|
+
values.delete_if {|k,v| v.to_s.empty?}
|
155
|
+
values
|
156
|
+
end
|
157
|
+
def display_boolean(value) value ? "yes" : "no"; end
|
158
|
+
|
159
|
+
#
|
160
|
+
# Accessors
|
161
|
+
#
|
162
|
+
def bogus
|
163
|
+
resources.values.map(&:bogus).flatten
|
164
|
+
end
|
165
|
+
def client
|
166
|
+
self[:client]
|
167
|
+
end
|
168
|
+
def machine
|
169
|
+
self[:machine]
|
170
|
+
end
|
171
|
+
def machine=(value)
|
172
|
+
self[:machine] = value
|
173
|
+
end
|
174
|
+
def node
|
175
|
+
self[:node]
|
176
|
+
end
|
177
|
+
def node=(value)
|
178
|
+
self[:node]= value
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
# Status flags
|
183
|
+
#
|
184
|
+
def bogus?
|
185
|
+
resources.values.any?(&:bogus?)
|
186
|
+
end
|
187
|
+
def client?
|
188
|
+
not client.nil?
|
189
|
+
end
|
190
|
+
def created?
|
191
|
+
machine? and machine.created?
|
192
|
+
end
|
193
|
+
def machine?
|
194
|
+
not machine.nil?
|
195
|
+
end
|
196
|
+
def killable?
|
197
|
+
not permanent? and (node? or created?)
|
198
|
+
end
|
199
|
+
def launchable?
|
200
|
+
not bogus? and not created?
|
201
|
+
end
|
202
|
+
def node?
|
203
|
+
not node.nil?
|
204
|
+
end
|
205
|
+
def permanent?
|
206
|
+
return false unless server?
|
207
|
+
return false unless server.selected_cloud.respond_to? :permanent
|
208
|
+
[true, :true, 'true'].include? server.selected_cloud.permanent
|
209
|
+
end
|
210
|
+
def running?
|
211
|
+
machine? and machine.running?
|
212
|
+
end
|
213
|
+
def server?
|
214
|
+
not server.nil?
|
215
|
+
end
|
216
|
+
def stopped?
|
217
|
+
machine? and machine.stopped?
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
class Computers < Gorillib::ModelCollection
|
223
|
+
self.item_type = Computer
|
224
|
+
self.key_method = :object_id
|
225
|
+
delegate :first, :map, :any?,
|
226
|
+
:to => :values
|
227
|
+
attr_accessor :cluster
|
228
|
+
|
229
|
+
def initialize(*args)
|
230
|
+
super
|
231
|
+
options = args.pop or return
|
232
|
+
self.cluster = options[:cluster]
|
233
|
+
create_expected!
|
234
|
+
end
|
235
|
+
|
236
|
+
#
|
237
|
+
# Discovery
|
238
|
+
#
|
239
|
+
def correlate
|
240
|
+
values.each {|computer| computer.correlate }
|
241
|
+
end
|
242
|
+
|
243
|
+
def validate
|
244
|
+
providers = values.map {|c| c.providers.values}.flatten
|
245
|
+
computers = self
|
246
|
+
|
247
|
+
Ironfan.delegate_to(values) { validate }
|
248
|
+
Ironfan.delegate_to(providers) { validate computers }
|
249
|
+
end
|
250
|
+
|
251
|
+
#
|
252
|
+
# Manipulation
|
253
|
+
#
|
254
|
+
def kill(options={})
|
255
|
+
Ironfan.delegate_to(values) { kill(options) }
|
256
|
+
end
|
257
|
+
def launch
|
258
|
+
Ironfan.delegate_to(values) { launch }
|
259
|
+
end
|
260
|
+
def save(options={})
|
261
|
+
Ironfan.delegate_to(values) { save(options) }
|
262
|
+
end
|
263
|
+
def start
|
264
|
+
Ironfan.delegate_to(values) { start }
|
265
|
+
end
|
266
|
+
def stop
|
267
|
+
Ironfan.delegate_to(values) { stop }
|
268
|
+
end
|
269
|
+
|
270
|
+
# set up new computers for each server in the cluster definition
|
271
|
+
def create_expected!
|
272
|
+
self.cluster.servers.each do |server|
|
273
|
+
self << Computer.new(:server => server)
|
274
|
+
end unless self.cluster.nil?
|
275
|
+
end
|
276
|
+
|
277
|
+
# Return the selection inside another Computers collection
|
278
|
+
def select(&block)
|
279
|
+
result = empty_copy
|
280
|
+
values.select(&block).each{|m| result << m}
|
281
|
+
result
|
282
|
+
end
|
283
|
+
|
284
|
+
def empty_copy
|
285
|
+
result = self.class.new
|
286
|
+
result.cluster = self.cluster unless self.cluster.nil?
|
287
|
+
result
|
288
|
+
end
|
289
|
+
|
290
|
+
# Find all selected computers, as well as any bogus computers from discovery
|
291
|
+
def slice(facet_name=nil, slice_indexes=nil)
|
292
|
+
return self if (facet_name.nil? and slice_indexes.nil?)
|
293
|
+
result = empty_copy
|
294
|
+
slice_array = build_slice_array(slice_indexes)
|
295
|
+
each do |m|
|
296
|
+
result << m if (m.bogus? or ( # bogus computer or
|
297
|
+
( m.server.facet_name == facet_name ) and # facet match and
|
298
|
+
( slice_array.include? m.server.index or # index match or
|
299
|
+
slice_indexes.nil? ) ) ) # no indexes specified
|
300
|
+
end
|
301
|
+
result
|
302
|
+
end
|
303
|
+
def build_slice_array(slice_indexes)
|
304
|
+
return [] if slice_indexes.nil?
|
305
|
+
raise "Bad slice_indexes: #{slice_indexes}" if slice_indexes =~ /[^0-9\.,]/
|
306
|
+
eval("[#{slice_indexes}]").map {|idx| idx.class == Range ? idx.to_a : idx}.flatten
|
307
|
+
end
|
308
|
+
|
309
|
+
# Utility function to provide a human-readable list of names
|
310
|
+
def joined_names
|
311
|
+
values.map(&:name).join(", ").gsub(/, ([^,]*)$/, ' and \1')
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
end
|
316
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ironfan
|
2
|
+
class Broker
|
3
|
+
|
4
|
+
class Drive < Builder
|
5
|
+
field :node, Hash, :default => {}
|
6
|
+
field :disk, Ironfan::Provider::Resource
|
7
|
+
field :volume, Ironfan::Dsl::Volume
|
8
|
+
|
9
|
+
field :name, String
|
10
|
+
|
11
|
+
def volume=(value)
|
12
|
+
super
|
13
|
+
return unless value
|
14
|
+
# inscribe the cluster DSL values into chef attributes
|
15
|
+
volume.attributes.each_pair {|k,v| node[k.to_s] = v }
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This module is intended to read in a cluster DSL description, and broker
|
2
|
+
# out to the various cloud providers, to control instance life-cycle and
|
3
|
+
# handle provider-specific amenities (SecurityGroup, Volume, etc.) for
|
4
|
+
# them.
|
5
|
+
module Ironfan
|
6
|
+
def self.broker
|
7
|
+
@@broker ||= Ironfan::Broker.new
|
8
|
+
end
|
9
|
+
|
10
|
+
class Broker < Builder
|
11
|
+
# Take in a Dsl::Cluster, return Computers populated with
|
12
|
+
# all discovered resources that correlate, plus bogus computers
|
13
|
+
# corresponding to
|
14
|
+
def discover!(cluster)
|
15
|
+
# Get fully resolved servers, and build Computers using them
|
16
|
+
computers = Computers.new(:cluster => cluster.resolve)
|
17
|
+
providers = computers.map{|c| c.providers.values}.flatten.uniq
|
18
|
+
|
19
|
+
delegate_to(providers) { load cluster }
|
20
|
+
computers.correlate
|
21
|
+
computers.validate
|
22
|
+
computers
|
23
|
+
end
|
24
|
+
|
25
|
+
def display(computers,style)
|
26
|
+
defined_data = computers.map {|m| m.to_display(style) }
|
27
|
+
if defined_data.empty?
|
28
|
+
ui.info "Nothing to report"
|
29
|
+
else
|
30
|
+
headings = defined_data.map{|r| r.keys}.flatten.uniq
|
31
|
+
Formatador.display_compact_table(defined_data, headings.to_a)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/ironfan/deprecated.rb
CHANGED
@@ -1,68 +1,26 @@
|
|
1
1
|
module Ironfan
|
2
2
|
def self.deprecated call, replacement=nil
|
3
|
-
correction = ",
|
4
|
-
ui.
|
3
|
+
correction = ", " if replacement
|
4
|
+
ui.error "The '#{call}' statement is deprecated#{correction} (in #{caller(2).first.inspect}). It looks like you are using an outdated DSL definition: please see https://github.com/infochimps-labs/ironfan/wiki/Upgrading-to-v4 for all the necessary upgrade steps."
|
5
|
+
exit(1)
|
5
6
|
end
|
6
7
|
|
7
|
-
class
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
def to_mash
|
13
|
-
Ironfan.deprecated 'to_mash', 'attributes'
|
14
|
-
attributes
|
15
|
-
end
|
16
|
-
def reverse_merge!(attrs={})
|
17
|
-
Ironfan.deprecated 'reverse_merge!', 'receive!'
|
18
|
-
receive!(attrs)
|
19
|
-
end
|
20
|
-
def configure(attrs={},&block)
|
21
|
-
Ironfan.deprecated 'configure', 'receive!'
|
22
|
-
receive!(attrs, &block)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class ComputeBuilder
|
27
|
-
def root_volume(attrs={}, &block)
|
28
|
-
Ironfan.deprecated 'root_volume', 'volume(:root)'
|
29
|
-
volume(:root, attrs, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class Cluster
|
34
|
-
def use(*clusters)
|
35
|
-
Ironfan.deprecated 'use', 'underlay'
|
36
|
-
clusters.each do |c|
|
37
|
-
other_cluster = Ironfan.load_cluster(c)
|
38
|
-
cluster.underlay other_cluster
|
8
|
+
class Dsl
|
9
|
+
class Cloud
|
10
|
+
def defaults
|
11
|
+
Ironfan.deprecated 'defaults'
|
39
12
|
end
|
40
|
-
self
|
41
13
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
Ironfan.deprecated 'composite_volumes', 'volumes'
|
52
|
-
volumes
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class CloudDsl::Ec2
|
57
|
-
def elastic_ip(*args, &block)
|
58
|
-
Ironfan.deprecated 'elastic_ip', 'public_ip'
|
59
|
-
public_ip(*args, &block)
|
14
|
+
|
15
|
+
class Compute
|
16
|
+
def cloud(provider=nil)
|
17
|
+
if provider.nil?
|
18
|
+
Ironfan.deprecated 'cloud(nil)','use cloud(:ec2) instead'
|
19
|
+
provider = :ec2
|
20
|
+
end
|
21
|
+
super(provider)
|
22
|
+
end
|
60
23
|
end
|
61
|
-
end
|
62
24
|
|
63
|
-
class Volume
|
64
|
-
def defaults
|
65
|
-
Ironfan.deprecated 'defaults'
|
66
|
-
end
|
67
25
|
end
|
68
26
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ironfan
|
2
|
+
class Dsl
|
3
|
+
|
4
|
+
class Cloud < Ironfan::Dsl
|
5
|
+
magic :default_cloud, :boolean, :default => false
|
6
|
+
|
7
|
+
# Factory out to subclasses
|
8
|
+
def self.receive(obj,&block)
|
9
|
+
obj[:_type] = case obj[:name]
|
10
|
+
when :ec2; Ec2
|
11
|
+
when :virtualbox; VirtualBox
|
12
|
+
else; raise "Unsupported cloud #{obj[:name]}"
|
13
|
+
end unless native?(obj)
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def implied_volumes() Ironfan.noop(self,__method__,*p); end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ironfan
|
2
|
+
class Dsl
|
3
|
+
|
4
|
+
class Cluster < Ironfan::Dsl::Compute
|
5
|
+
collection :facets, Ironfan::Dsl::Facet, :resolver => :deep_resolve
|
6
|
+
|
7
|
+
def initialize(attrs={},&block)
|
8
|
+
super
|
9
|
+
self.cluster_role Ironfan::Dsl::Role.new(:name => "#{attrs[:name]}_cluster")
|
10
|
+
self.expand_servers!
|
11
|
+
end
|
12
|
+
|
13
|
+
def expand_servers!
|
14
|
+
facets.each {|facet| facet.expand_servers! }
|
15
|
+
servers
|
16
|
+
end
|
17
|
+
|
18
|
+
# Utility method to reference all servers from constituent facets
|
19
|
+
def servers
|
20
|
+
result = Gorillib::ModelCollection.new(:item_type => Ironfan::Dsl::Server, :key_method => :fullname)
|
21
|
+
facets.each {|f| f.servers.each {|s| result << s} }
|
22
|
+
result
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|