rudy 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/CHANGES.txt +54 -30
  2. data/README.rdoc +100 -12
  3. data/Rakefile +103 -8
  4. data/Rudyfile +119 -0
  5. data/bin/ird +175 -0
  6. data/bin/rudy +259 -156
  7. data/bin/rudy-ec2 +228 -95
  8. data/bin/rudy-s3 +76 -0
  9. data/bin/rudy-sdb +67 -0
  10. data/lib/annoy.rb +270 -0
  11. data/lib/console.rb +30 -9
  12. data/lib/escape.rb +305 -0
  13. data/lib/rudy.rb +151 -182
  14. data/lib/rudy/aws.rb +56 -49
  15. data/lib/rudy/aws/ec2.rb +47 -292
  16. data/lib/rudy/aws/ec2/address.rb +157 -0
  17. data/lib/rudy/aws/ec2/group.rb +301 -0
  18. data/lib/rudy/aws/ec2/image.rb +168 -0
  19. data/lib/rudy/aws/ec2/instance.rb +434 -0
  20. data/lib/rudy/aws/ec2/keypair.rb +104 -0
  21. data/lib/rudy/aws/ec2/snapshot.rb +98 -0
  22. data/lib/rudy/aws/ec2/volume.rb +230 -0
  23. data/lib/rudy/aws/ec2/zone.rb +77 -0
  24. data/lib/rudy/aws/s3.rb +54 -0
  25. data/lib/rudy/aws/sdb.rb +298 -0
  26. data/lib/rudy/aws/sdb/error.rb +46 -0
  27. data/lib/rudy/{metadata/backup.rb → backup.rb} +26 -51
  28. data/lib/rudy/cli.rb +157 -0
  29. data/lib/rudy/cli/aws/ec2/addresses.rb +105 -0
  30. data/lib/rudy/cli/aws/ec2/candy.rb +208 -0
  31. data/lib/rudy/cli/aws/ec2/groups.rb +121 -0
  32. data/lib/rudy/cli/aws/ec2/images.rb +196 -0
  33. data/lib/rudy/cli/aws/ec2/instances.rb +194 -0
  34. data/lib/rudy/cli/aws/ec2/keypairs.rb +53 -0
  35. data/lib/rudy/cli/aws/ec2/snapshots.rb +49 -0
  36. data/lib/rudy/cli/aws/ec2/volumes.rb +104 -0
  37. data/lib/rudy/cli/aws/ec2/zones.rb +22 -0
  38. data/lib/rudy/cli/aws/s3/buckets.rb +50 -0
  39. data/lib/rudy/cli/aws/s3/store.rb +22 -0
  40. data/lib/rudy/cli/aws/sdb/domains.rb +41 -0
  41. data/lib/rudy/cli/candy.rb +8 -0
  42. data/lib/rudy/{command → cli}/config.rb +34 -24
  43. data/lib/rudy/cli/disks.rb +35 -0
  44. data/lib/rudy/cli/machines.rb +94 -0
  45. data/lib/rudy/cli/routines.rb +57 -0
  46. data/lib/rudy/config.rb +77 -72
  47. data/lib/rudy/config/objects.rb +29 -0
  48. data/lib/rudy/disks.rb +248 -0
  49. data/lib/rudy/global.rb +121 -0
  50. data/lib/rudy/huxtable.rb +340 -0
  51. data/lib/rudy/machines.rb +245 -0
  52. data/lib/rudy/metadata.rb +123 -13
  53. data/lib/rudy/routines.rb +47 -0
  54. data/lib/rudy/routines/helpers/diskhelper.rb +101 -0
  55. data/lib/rudy/routines/helpers/scripthelper.rb +91 -0
  56. data/lib/rudy/routines/release.rb +34 -0
  57. data/lib/rudy/routines/shutdown.rb +57 -0
  58. data/lib/rudy/routines/startup.rb +58 -0
  59. data/lib/rudy/scm/svn.rb +1 -1
  60. data/lib/rudy/utils.rb +322 -4
  61. data/lib/storable.rb +26 -17
  62. data/lib/sysinfo.rb +274 -0
  63. data/lib/tryouts.rb +6 -13
  64. data/rudy.gemspec +128 -42
  65. data/support/randomize-root-password +45 -0
  66. data/support/rudy-ec2-startup +9 -9
  67. data/support/update-ec2-ami-tools +20 -0
  68. data/test/05_config/00_setup_test.rb +20 -0
  69. data/test/05_config/30_machines_test.rb +69 -0
  70. data/test/20_sdb/00_setup_test.rb +16 -0
  71. data/test/20_sdb/10_domains_test.rb +115 -0
  72. data/test/25_ec2/00_setup_test.rb +29 -0
  73. data/test/25_ec2/10_keypairs_test.rb +41 -0
  74. data/test/25_ec2/20_groups_test.rb +131 -0
  75. data/test/25_ec2/30_addresses_test.rb +38 -0
  76. data/test/25_ec2/40_volumes_test.rb +49 -0
  77. data/test/25_ec2/50_snapshots_test.rb +74 -0
  78. data/test/26_ec2_instances/00_setup_test.rb +28 -0
  79. data/test/26_ec2_instances/10_instances_test.rb +83 -0
  80. data/test/26_ec2_instances/50_images_test.rb +13 -0
  81. data/test/30_sdb_metadata/00_setup_test.rb +21 -0
  82. data/test/30_sdb_metadata/10_disks_test.rb +109 -0
  83. data/test/30_sdb_metadata/20_backups_test.rb +102 -0
  84. data/test/coverage.txt +51 -0
  85. data/test/helper.rb +36 -0
  86. data/vendor/highline-1.5.1/CHANGELOG +222 -0
  87. data/vendor/highline-1.5.1/INSTALL +35 -0
  88. data/vendor/highline-1.5.1/LICENSE +7 -0
  89. data/vendor/highline-1.5.1/README +63 -0
  90. data/vendor/highline-1.5.1/Rakefile +82 -0
  91. data/vendor/highline-1.5.1/TODO +6 -0
  92. data/vendor/highline-1.5.1/examples/ansi_colors.rb +38 -0
  93. data/vendor/highline-1.5.1/examples/asking_for_arrays.rb +18 -0
  94. data/vendor/highline-1.5.1/examples/basic_usage.rb +75 -0
  95. data/vendor/highline-1.5.1/examples/color_scheme.rb +32 -0
  96. data/vendor/highline-1.5.1/examples/limit.rb +12 -0
  97. data/vendor/highline-1.5.1/examples/menus.rb +65 -0
  98. data/vendor/highline-1.5.1/examples/overwrite.rb +19 -0
  99. data/vendor/highline-1.5.1/examples/page_and_wrap.rb +322 -0
  100. data/vendor/highline-1.5.1/examples/password.rb +7 -0
  101. data/vendor/highline-1.5.1/examples/trapping_eof.rb +22 -0
  102. data/vendor/highline-1.5.1/examples/using_readline.rb +17 -0
  103. data/vendor/highline-1.5.1/lib/highline.rb +758 -0
  104. data/vendor/highline-1.5.1/lib/highline/color_scheme.rb +120 -0
  105. data/vendor/highline-1.5.1/lib/highline/compatibility.rb +17 -0
  106. data/vendor/highline-1.5.1/lib/highline/import.rb +43 -0
  107. data/vendor/highline-1.5.1/lib/highline/menu.rb +395 -0
  108. data/vendor/highline-1.5.1/lib/highline/question.rb +463 -0
  109. data/vendor/highline-1.5.1/lib/highline/system_extensions.rb +193 -0
  110. data/vendor/highline-1.5.1/setup.rb +1360 -0
  111. data/vendor/highline-1.5.1/test/tc_color_scheme.rb +56 -0
  112. data/vendor/highline-1.5.1/test/tc_highline.rb +823 -0
  113. data/vendor/highline-1.5.1/test/tc_import.rb +54 -0
  114. data/vendor/highline-1.5.1/test/tc_menu.rb +429 -0
  115. data/vendor/highline-1.5.1/test/ts_all.rb +15 -0
  116. metadata +141 -38
  117. data/lib/aws_sdb.rb +0 -3
  118. data/lib/aws_sdb/error.rb +0 -42
  119. data/lib/aws_sdb/service.rb +0 -215
  120. data/lib/rudy/aws/simpledb.rb +0 -53
  121. data/lib/rudy/command/addresses.rb +0 -46
  122. data/lib/rudy/command/backups.rb +0 -175
  123. data/lib/rudy/command/base.rb +0 -841
  124. data/lib/rudy/command/deploy.rb +0 -12
  125. data/lib/rudy/command/disks.rb +0 -213
  126. data/lib/rudy/command/environment.rb +0 -73
  127. data/lib/rudy/command/groups.rb +0 -61
  128. data/lib/rudy/command/images.rb +0 -91
  129. data/lib/rudy/command/instances.rb +0 -85
  130. data/lib/rudy/command/machines.rb +0 -161
  131. data/lib/rudy/command/metadata.rb +0 -41
  132. data/lib/rudy/command/release.rb +0 -174
  133. data/lib/rudy/command/volumes.rb +0 -66
  134. data/lib/rudy/metadata/disk.rb +0 -138
  135. data/tryouts/console_tryout.rb +0 -91
@@ -0,0 +1,121 @@
1
+
2
+
3
+ module Rudy
4
+
5
+ # = Rudy::Global
6
+ #
7
+ # This global class is used by all Huxtable objects.
8
+ # When a new CLI global is added, the appropriate field must
9
+ # be added to this class (optional: a default value in initialize).
10
+ class Global < Storable
11
+
12
+ field :region
13
+ field :zone
14
+ field :environment
15
+ field :role
16
+ field :position
17
+ field :user
18
+ field :pkey
19
+
20
+ field :nocolor
21
+ field :quiet
22
+ field :verbose
23
+ field :format
24
+ field :print_header
25
+ field :yes
26
+
27
+ field :accesskey
28
+ field :secretkey
29
+ field :accountnum
30
+ field :accountname # TODO: use this. And accounttype (aws)
31
+ field :cert
32
+ field :privatekey
33
+
34
+ field :local_user
35
+ field :local_hostname
36
+
37
+ field :config => String
38
+
39
+ attr_accessor :print_header
40
+
41
+ def initialize
42
+ postprocess
43
+ # These attributes MUST have values.
44
+ @verbose ||= 0
45
+ @nocolor ||= false
46
+ @quiet ||= false
47
+ @format ||= 'string' # as in, to_s
48
+ @print_header = true if @print_header == nil
49
+ @yes = false if @yes.nil?
50
+ end
51
+
52
+ def apply_config(config)
53
+ return unless config.is_a?(Rudy::Config)
54
+ if config.defaults?
55
+ %w[region zone environment role position user nocolor quiet].each do |name|
56
+ val = config.defaults.send(name)
57
+ self.send("#{name}=", val) if val
58
+ end
59
+ end
60
+
61
+ if config.accounts? && config.accounts.aws
62
+ %w[accesskey secretkey accountnum cert privatekey].each do |name|
63
+ val = config.accounts.aws.send(name)
64
+ self.send("#{name}=", val) if val
65
+ end
66
+ end
67
+
68
+ postprocess
69
+ end
70
+
71
+
72
+ def update(ghash={})
73
+ ghash = ghash.marshal_dump if ghash.is_a?(OpenStruct)
74
+
75
+ if ghash.is_a?(Hash)
76
+ ghash.each_pair { |n,v| self.send("#{n}=", v) }
77
+ else
78
+ raise "Unexpected #{ghash.class.to_s}"
79
+ end
80
+
81
+ postprocess
82
+ end
83
+
84
+
85
+ private
86
+
87
+
88
+ def postprocess
89
+ apply_environment_variables
90
+ apply_system_defaults
91
+
92
+ @cert &&= File.expand_path(@cert)
93
+ @privatekey &&= File.expand_path(@privatekey)
94
+ @position &&= @position.to_s.rjust(2, '0')
95
+
96
+ String.disable_color if @nocolor
97
+ Rudy.enable_quiet if @quiet
98
+ Annoy.enable_skip if @yes
99
+ end
100
+
101
+ def apply_environment_variables
102
+ @accesskey ||= ENV['AWS_ACCESS_KEY']
103
+ @secretkey ||= ENV['AWS_SECRET_KEY'] || ENV['AWS_SECRET_ACCESS_KEY']
104
+ @accountnum ||= ENV['AWS_ACCOUNT_NUMBER']
105
+ @cert ||= ENV['EC2_CERT']
106
+ @privatekey ||= ENV['EC2_PRIVATE_KEY']
107
+ @local_user = ENV['USER'] || :rudy
108
+ @local_hostname = Socket.gethostname || :localhost
109
+ end
110
+
111
+ def apply_system_defaults
112
+ @region ||= Rudy::DEFAULT_REGION
113
+ @zone ||= Rudy::DEFAULT_ZONE
114
+ @environment ||= Rudy::DEFAULT_ENVIRONMENT
115
+ @role ||= Rudy::DEFAULT_ROLE
116
+ @position ||= Rudy::DEFAULT_POSITION
117
+ @user ||= Rudy::DEFAULT_USER
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,340 @@
1
+
2
+
3
+
4
+ module Rudy
5
+
6
+ # = Rudy::Huxtable
7
+ #
8
+ # Huxtable gives access to instances for config, global, and logger to any
9
+ # class that includes it.
10
+ #
11
+ # class Rudy::Hello
12
+ # include Rudy::Huxtable
13
+ #
14
+ # def print_config
15
+ # p self.config.defaults
16
+ # end
17
+ #
18
+ # end
19
+ #
20
+ module Huxtable
21
+
22
+ # TODO: investigate @@debug bug. When this is true, Caesars.debug? returns true
23
+ # too. It's possible this is intentional but probably not.
24
+ @@debug = false
25
+
26
+ @@config = Rudy::Config.new
27
+ @@global = Rudy::Global.new
28
+ @@logger = StringIO.new # BUG: memory-leak for long-running apps
29
+
30
+ @@sacred_params = [:accesskey, :secretkey, :cert, :privatekey]
31
+
32
+ # NOTE: These methods conflict with Drydock::Command classes. It's
33
+ # probably a good idea to not expose these anyway since it can be
34
+ # done via Rudy::Huxtable.update_global etc...
35
+ #def config; @@config; end
36
+ #def global; @@global; end
37
+ #def logger; @@logger; end
38
+
39
+ def self.update_config(path=nil)
40
+ # nil or otherwise bad paths send to look_and_load are ignored
41
+ @@config.look_and_load(path || nil)
42
+ @@global.apply_config(@@config)
43
+ end
44
+
45
+ update_config
46
+
47
+ def self.update_global(ghash={})
48
+ @@global.update(ghash)
49
+ end
50
+
51
+ def self.update_logger(logger)
52
+ @@logger = logger
53
+ end
54
+
55
+ def self.create_domain
56
+ @sdb = Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
57
+ @sdb.create_domain Rudy::DOMAIN
58
+ end
59
+
60
+ def self.domain_exists?
61
+ @sdb = Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
62
+ (@sdb.list_domains || []).member? Rudy::DOMAIN
63
+ end
64
+
65
+ def self.domain
66
+ Rudy::DOMAIN
67
+ end
68
+
69
+ def self.change_zone(v); @@global.zone = v; end
70
+ def self.change_role(v); @@global.role = v; end
71
+ def self.change_region(v); @@global.region = v; end
72
+ def self.change_environment(v); @@global.environment = v; end
73
+ def self.change_position(v); @@global.position = v; end
74
+
75
+ def debug?; @@debug == true; end
76
+
77
+ def check_keys
78
+ raise "No EC2 .pem keys provided" unless has_pem_keys?
79
+ raise "No SSH key provided for #{current_user}!" unless has_keypair?
80
+ raise "No SSH key provided for root!" unless has_keypair?(:root)
81
+ end
82
+
83
+ def has_pem_keys?
84
+ (@@global.cert && File.exists?(@@global.cert) &&
85
+ @@global.privatekey && File.exists?(@@global.privatekey))
86
+ end
87
+
88
+ def has_keys?
89
+ (@@global.accesskey && !@@global.accesskey.empty? && @@global.secretkey && !@@global.secretkey.empty?)
90
+ end
91
+
92
+ def config_dirname
93
+ raise "No config paths defined" unless @@config.is_a?(Rudy::Config) && @@config.paths.is_a?(Array)
94
+ base_dir = File.dirname @@config.paths.first
95
+ raise "Config directory doesn't exist #{base_dir}" unless File.exists?(base_dir)
96
+ base_dir
97
+ end
98
+
99
+ def has_keypair?(name=nil)
100
+ kp = user_keypairpath(name)
101
+ (!kp.nil? && File.exists?(kp))
102
+ end
103
+
104
+ # Returns the name of the current keypair for the given user.
105
+ # If there's a private key path in the config this will return
106
+ # the basename (it's assumed the Amazon KeyPair has the same
107
+ # name as the file). Otherwise this returns the Rudy style
108
+ # name: <tt>key-ENV-ROLE-USER</tt>. Or if this the user is
109
+ # root: <tt>key-ENV-ROLE</tt>
110
+ def user_keypairname(user)
111
+ kp = user_keypairpath(user)
112
+ if kp
113
+ kp = Huxtable.keypair_path_to_name(kp)
114
+ else
115
+ n = (user.to_s == 'root') ? '' : "-#{user}"
116
+ "key-%s%s" % [current_machine_group, n]
117
+ end
118
+ end
119
+ def root_keypairname
120
+ user_keypairname :root
121
+ end
122
+
123
+
124
+ def user_keypairpath(name)
125
+ raise "No user provided" unless name
126
+ raise "No configuration" unless @@config
127
+ raise "No machines configuration" unless @@config.machines
128
+ zon, env, rol = @@global.zone, @@global.environment, @@global.role
129
+ #Caesars.enable_debug
130
+ path = @@config.machines.find_deferred(zon, env, rol, [:users, name, :keypair])
131
+ path ||= @@config.machines.find_deferred(env, rol, [:users, name, :keypair])
132
+ path ||= @@config.machines.find_deferred(rol, [:users, name, :keypair])
133
+
134
+ # EC2 Keypairs that were created are intended for starting the machine instances.
135
+ # These are used as the root SSH keys. If we can find a user defined key, we'll
136
+ # check the config path for a generated one.
137
+ if !path && name.to_s == 'root'
138
+ path = File.join(self.config_dirname, "key-#{current_machine_group}")
139
+ end
140
+ path = File.expand_path(path) if path && File.exists?(path)
141
+ path
142
+ end
143
+ def root_keypairpath
144
+ user_keypairpath :root
145
+ end
146
+
147
+ def has_root_keypair?
148
+ path = user_keypairpath(:root)
149
+ (!path.nil? && !path.empty?)
150
+ end
151
+
152
+ def current_user
153
+ @@global.user
154
+ end
155
+ def current_user_keypairpath
156
+ user_keypairpath(current_user)
157
+ end
158
+ def current_machine_hostname(group=nil)
159
+ group ||= machine_group
160
+ find_machine(group)[:dns_name]
161
+ end
162
+
163
+ def current_machine_group
164
+ [@@global.environment, @@global.role].join(Rudy::DELIM)
165
+ end
166
+
167
+ def current_group_name
168
+ "g-#{current_machine_group}"
169
+ end
170
+
171
+ def current_machine_count
172
+ fetch_machine_param(:positions) || 1
173
+ end
174
+
175
+ def current_machine_image
176
+ fetch_machine_param(:ami)
177
+ #zon, env, rol = @@global.zone, @@global.environment, @@global.role
178
+ #ami = @@config.machines.find_deferred([zon, env, rol]) || {}
179
+ #ami.merge!(@@config.machines.find_deferred(env, rol, :ami))
180
+ #ami.merge!(@@config.machines.find_deferred(rol, :ami))
181
+ ## I commented this out while cleaning (start of 0.6 branch) . It
182
+ ## seems like a bad idea. I don't want Huxtables throwing exceptions.
183
+ ##raise Rudy::NoMachineImage, current_machine_group unless ami
184
+ #ami
185
+ end
186
+
187
+ def current_machine_size
188
+ fetch_machine_param(:size) || 'm1.small'
189
+ end
190
+
191
+ def current_machine_address
192
+ raise "No configuration" unless @@config
193
+ raise "No machines configuration" unless @@config.machines
194
+ @@config.machines.find_deferred(@@global.environment, @@global.role, :address)
195
+ end
196
+
197
+ # TODO: fix machine_group to include zone
198
+ def current_machine_name
199
+ [@@global.zone, current_machine_group, @@global.position].join(Rudy::DELIM)
200
+ end
201
+
202
+ # +name+ the name of the remote user to use for the remainder of the command
203
+ # (or until switched again). If no name is provided, the user will be revert
204
+ # to whatever it was before the previous switch.
205
+ # TODO: deprecate
206
+ def switch_user(name=nil)
207
+ if name == nil && @switch_user_previous
208
+ @@global.user = @switch_user_previous
209
+ elsif @@global.user != name
210
+ raise "No root keypair defined for #{name}!" unless has_keypair?(name)
211
+ @@logger.puts "Remote commands will be run as #{name} user"
212
+ @switch_user_previous = @@global.user
213
+ @@global.user = name
214
+ end
215
+ end
216
+
217
+ def group_metadata(env=@@global.environment, role=@@global.role)
218
+ query = "['environment' = '#{env}'] intersection ['role' = '#{role}']"
219
+ @sdb.query_with_attributes(Rudy::DOMAIN, query)
220
+ end
221
+
222
+ def self.keypair_path_to_name(kp)
223
+ return nil unless kp
224
+ name = File.basename kp
225
+ #name.gsub(/key-/, '') # We keep the key- now
226
+ end
227
+
228
+ private
229
+
230
+
231
+ # We grab the appropriate routines config and check the paths
232
+ # against those defined for the matching machine group.
233
+ # Disks that appear in a routine but not in a machine will be
234
+ # removed and a warning printed. Otherwise, the routines config
235
+ # is merged on top of the machine config and that's what we return.
236
+ #
237
+ # This means that all the disk info is returned so we know what
238
+ # size they are and stuff.
239
+ # Return a hash:
240
+ #
241
+ # :after:
242
+ # - :root: pwd
243
+ # - :rudy: pwd
244
+ # :disks:
245
+ # :create:
246
+ # /rudy/example1:
247
+ # :device: /dev/sdr
248
+ # :size: 2
249
+ # /rudy/example2:
250
+ # :device: /dev/sdm
251
+ # :size: 1
252
+ #
253
+ def fetch_routine_config(action)
254
+ raise "No configuration" unless @@config
255
+ raise "No routines configuration" unless @@config.routines
256
+ raise "No globals" unless @@global
257
+
258
+ zon, env, rol = @@global.zone, @@global.environment, @@global.role
259
+
260
+ disk_defs = fetch_machine_param(:disks)
261
+
262
+ routine = @@config.routines.find(@@global.environment, @@global.role, action)
263
+ return nil unless routine
264
+
265
+ routine.disks.each_pair do |raction,disks|
266
+
267
+ disks.each_pair do |path, props|
268
+ unless disk_defs.has_key?(path)
269
+ @logger.puts "#{path} is not defined. Check your #{action} routines config.".color(:red)
270
+ routine.disks[raction].delete(path)
271
+ next
272
+ end
273
+
274
+ routine.disks[raction][path] = disk_defs[path].merge(props)
275
+
276
+ end
277
+ end
278
+
279
+ routine
280
+ end
281
+
282
+ # Looks for ENV-ROLE configuration in machines. There must be
283
+ # at least one definition in the config for this to return true
284
+ # That's how Rudy knows the current group is defined.
285
+ def known_machine_group?
286
+ return false if !@@config && !@@global
287
+ zon, env, rol = @@global.zone, @@global.environment, @@global.role
288
+ conf = @@config.machines.find_deferred(@@global.region, zon, [env, rol])
289
+ conf ||= @@config.machines.find_deferred(zon, [env, rol])
290
+ !conf.nil?
291
+ end
292
+
293
+ def fetch_machine_param(parameter)
294
+ raise "No configuration" unless @@config
295
+ raise "No machines configuration" unless @@config.machines
296
+ raise "No globals" unless @@global
297
+ top_level = @@config.machines.find(parameter)
298
+ mc = fetch_machine_config
299
+ mc[parameter] || top_level || nil
300
+ end
301
+
302
+ def fetch_machine_config
303
+ raise "No configuration" unless @@config
304
+ raise "No machines configuration" unless @@config.machines
305
+ raise "No globals" unless @@global
306
+ zon, env, rol = @@global.zone, @@global.environment, @@global.role
307
+ hashes = []
308
+ hashes << @@config.machines.find(env, rol)
309
+ hashes << @@config.machines.find(zon, env, rol)
310
+ hashes << @@config.machines.find(zon, [env, rol])
311
+ hashes << @@config.machines.find(zon, env)
312
+ hashes << @@config.machines.find(env)
313
+ hashes << @@config.machines.find(zon)
314
+ compilation = {}
315
+ hashes.reverse.each do |conf|
316
+ compilation.merge! conf if conf
317
+ end
318
+ compilation = nil if compilation.empty?
319
+ compilation
320
+ end
321
+
322
+ # Returns the appropriate config block from the machines config.
323
+ # Also adds the following unless otherwise specified:
324
+ # :region, :zone, :environment, :role, :position
325
+ def fetch_script_config
326
+ sconf = fetch_machine_param :config
327
+ extras = {
328
+ :region => @@global.region,
329
+ :zone => @@global.zone,
330
+ :environment => @@global.environment,
331
+ :role => @@global.role,
332
+ :position => @@global.position
333
+ }
334
+ sconf.merge! extras
335
+ sconf
336
+ end
337
+
338
+
339
+ end
340
+ end