beaker 1.8.2 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MmRhZWZiYzAyYjBlYWU1NjQ4ZTJiY2Q2YjY2MjIzZDQ3OTU2ODhjMQ==
4
+ NTkxODUzNWEzMjEwNjgxNjFhZWU2MDU5MGM4N2MzY2NhZjQ3ZjIzNg==
5
5
  data.tar.gz: !binary |-
6
- MzY2M2M5M2UxM2U2NmQ3MmI0Y2UwNDk3ZmM0MDYxMjAzZWY2ZjM1Mg==
6
+ N2YxYzI4MzNiMzI1MDQwZWU5YWQ2Y2ZmZWY1NWE4NjBjZjJlZjBiOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OWZhMmJiMTE1NzJiOGQ0YWNhNTAwMDI2NzM2Njc0YTc4MDdhOWNkM2Y2MDRm
10
- MjFjYmY3Y2NhZDU5YmZiODAxOWZhMzE2ZDJjMDVkZTAyZjc3YTdhMjZhYjNl
11
- ZjcyMDJiNDE2NzBmYzUwYjM3OTY3YjFkODg4ZjM5MjVmNGNkOTk=
9
+ YTIwNGFkOTQyYmFmMTE4NzMyYzlmN2FiMGMxOTg2NGY5NWUwZmJjZDU3YmI4
10
+ OGZiYzhhYWI5OTBlMzkzMjg0MjkzMDhiMmRkYWZhNmE0M2I1NzNmNjcyNjYw
11
+ YTg1OWVhNmJmMjY5NDU5OTZmODk4MTIwMDM0OGJjZTk4MmU1YmM=
12
12
  data.tar.gz: !binary |-
13
- M2Y3MWYwYTBkNWJkMmQ0ZjJiMGUwYWIzNmZiODVlYTFiYTliOTU1MDY5NzRl
14
- NmNlMDZjMzNlNjQ1NzM2N2U1NGYxZGFlYTNjY2NkNjA1ODE3YmY3OTMxMWI0
15
- NWZjNTBlZjE2ZWRiMGYxODkyNjUyZTUyODA5ZWJlMmZlYTZkNzc=
13
+ NjEzOGMzZmYwN2U1OGFjMDIwZDNjYThiNmE2N2M3YjBlZWVlMTIxNmRhN2U4
14
+ NTVmZDQ3MGU0MzYxNzAxYjc2ZTBhNTllN2Y4Mzc3NzUxZWJhYTZhZDBkNTI1
15
+ ZDA1MGJlZThiOTRhOTUwN2Y3YzU4MzdkZmUxZjFhNGE4ZTc3NDc=
data/README.md CHANGED
@@ -19,6 +19,3 @@ See [LICENSE](LICENSE) file.
19
19
 
20
20
  Please log tickets and issues at our [Beaker Issue Tracker](https://github.com/puppetlabs/beaker/issues). In addition there is an active #puppet-dev channel on Freenode.
21
21
 
22
- We use semantic version numbers for our releases, and recommend that users stay
23
- as up-to-date as possible by upgrading to patch releases and minor releases as
24
- they become available.
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  # Testing dependencies
21
21
  s.add_development_dependency 'rspec', '~> 2.14.0'
22
22
  s.add_development_dependency 'fakefs', '0.4'
23
- s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rake', '~> 10.1.0'
24
24
  s.add_development_dependency 'simplecov' unless RUBY_VERSION < '1.9'
25
25
 
26
26
  # Documentation dependencies
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
38
38
  s.add_runtime_dependency 'rbvmomi', '1.8.1'
39
39
  s.add_runtime_dependency 'blimpy', '~> 0.6'
40
40
  s.add_runtime_dependency 'fission', '~> 0.4'
41
+ s.add_runtime_dependency 'google-api-client', '~> 0.6.4'
41
42
 
42
43
  # These are transitive dependencies that we include or pin to because...
43
44
  # Ruby 1.8 compatibility
@@ -1,6 +1,5 @@
1
1
  module Beaker
2
2
  class CLI
3
- GEMSPEC = File.join(File.expand_path(File.dirname(__FILE__)), "../../beaker.gemspec")
4
3
  VERSION_STRING =
5
4
  " wWWWw
6
5
  |o o|
@@ -983,6 +983,23 @@ module Beaker
983
983
  fact_on(default, name, opts)
984
984
  end
985
985
 
986
+ #Run a curl command on the provided host(s)
987
+ #
988
+ # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
989
+ # or a role (String or Symbol) that identifies one or more hosts.
990
+ # @param [String, Command] cmd The curl command to execute on *host*.
991
+ # @param [Proc] block Additional actions or assertions.
992
+ # @!macro common_opts
993
+ #
994
+ def curl_on(host, cmd, opts = {}, &block)
995
+ if options.is_pe? #check global options hash
996
+ on host, "curl --sslv3 %s" % cmd, opts, &block
997
+ else
998
+ on host, "curl %s" % cmd, opts, &block
999
+ end
1000
+ end
1001
+
1002
+
986
1003
  end
987
1004
  end
988
1005
  end
@@ -154,7 +154,7 @@ module Beaker
154
154
  end
155
155
  end
156
156
 
157
- #Determine is a given URL is accessible
157
+ #Determine is a given URL is accessible
158
158
  #@param [String] link The URL to examine
159
159
  #@return [Boolean] true if the URL has a '200' HTTP response code, false otherwise
160
160
  #@example
@@ -172,11 +172,77 @@ module Beaker
172
172
  end
173
173
  end
174
174
 
175
- #Determine the PE package to download/upload per-host, download/upload that package onto the host
175
+ #Determine the PE package to download/upload on a windows host, download/upload that package onto the host.
176
+ # @param [Host] host The windows host to download/upload and unpack PE onto
177
+ # @param [Hash{Symbol=>Symbol, String}] options The options
178
+ # @option options [String] :pe_dir Default directory or URL to pull PE package from
179
+ # (Otherwise uses individual hosts pe_dir)
180
+ # @option options [String] :pe_ver Default PE version to install or upgrade to
181
+ # (Otherwise uses individual hosts pe_ver)
182
+ # @option options [String] :pe_ver_win Default PE version to install or upgrade to on Windows hosts
183
+ # (Otherwise uses individual Windows hosts pe_ver)
184
+ # @api private
185
+ def fetch_puppet_on_windows(host, options)
186
+ path = options[:pe_dir] || host['pe_dir']
187
+ local = File.directory?(path)
188
+ version = options[:pe_ver_win] || host['pe_ver']
189
+ filename = "puppet-enterprise-#{version}"
190
+ extension = ".msi"
191
+ if local
192
+ if not File.exists?("#{path}/#{filename}#{extension}")
193
+ raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
194
+ end
195
+ scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}"
196
+ else
197
+ if not link_exists?("#{path}/#{filename}#{extension}")
198
+ raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
199
+ end
200
+ on host, "cd #{host['working_dir']}; curl -O #{path}/#{filename}#{extension}"
201
+ end
202
+ end
203
+
204
+ #Determine the PE package to download/upload on a unix style host, download/upload that package onto the host
205
+ #and unpack it.
206
+ # @param [Host] host The unix style host to download/upload and unpack PE onto
207
+ # @param [Hash{Symbol=>Symbol, String}] options The options
208
+ # @option options [String] :pe_dir Default directory or URL to pull PE package from
209
+ # (Otherwise uses individual hosts pe_dir)
210
+ # @option options [String] :pe_ver Default PE version to install or upgrade to
211
+ # (Otherwise uses individual hosts pe_ver)
212
+ # @api private
213
+ def fetch_puppet_on_unix(host, options)
214
+ path = options[:pe_dir] || host['pe_dir']
215
+ local = File.directory?(path)
216
+ filename = "#{host['dist']}"
217
+ if local
218
+ extension = File.exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar"
219
+ if not File.exists?("#{path}/#{filename}#{extension}")
220
+ raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
221
+ end
222
+ scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}"
223
+ if extension =~ /gz/
224
+ on host, "cd #{host['working_dir']}; gunzip #{filename}#{extension}"
225
+ end
226
+ if extension =~ /tar/
227
+ on host, "cd #{host['working_dir']}; tar -xvf #{filename}.tar"
228
+ end
229
+ else
230
+ extension = link_exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar"
231
+ if not link_exists?("#{path}/#{filename}#{extension}")
232
+ raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
233
+ end
234
+ unpack = 'tar -xvf -'
235
+ unpack = extension =~ /gz/ ? 'gunzip | ' + unpack : unpack
236
+
237
+ on host, "cd #{host['working_dir']}; curl #{path}/#{filename}#{extension} | #{unpack}"
238
+ end
239
+ end
240
+
241
+ #Determine the PE package to download/upload per-host, download/upload that package onto the host
176
242
  #and unpack it.
177
- # @param [Array<Host>] hosts The hosts to download/upload and unpack PE onto
243
+ # @param [Array<Host>] hosts The hosts to download/upload and unpack PE onto
178
244
  # @param [Hash{Symbol=>Symbol, String}] options The options
179
- # @option options [String] :pe_dir Default directory or URL to pull PE package from
245
+ # @option options [String] :pe_dir Default directory or URL to pull PE package from
180
246
  # (Otherwise uses individual hosts pe_dir)
181
247
  # @option options [String] :pe_ver Default PE version to install or upgrade to
182
248
  # (Otherwise uses individual hosts pe_ver)
@@ -189,51 +255,10 @@ module Beaker
189
255
  next if host['roles'].include? 'frictionless' and ! version_is_less(options[:pe_ver] || host['pe_ver'], '3.2.0')
190
256
 
191
257
  windows = host['platform'] =~ /windows/
192
- path = options[:pe_dir] || host['pe_dir']
193
- local = File.directory?(path)
194
- filename = ""
195
- extension = ""
196
258
  if windows
197
- version = options[:pe_ver_win] || host['pe_ver']
198
- filename = "puppet-enterprise-#{version}"
199
- extension = ".msi"
259
+ fetch_puppet_on_windows(host, options)
200
260
  else
201
- filename = "#{host['dist']}"
202
- extension = ""
203
- if local
204
- extension = File.exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar"
205
- else
206
- extension = link_exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar"
207
- end
208
- end
209
- if local
210
- if not File.exists?("#{path}/#{filename}#{extension}")
211
- raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
212
- end
213
- scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}"
214
- if extension =~ /gz/
215
- on host, "cd #{host['working_dir']}; gunzip #{filename}#{extension}"
216
- end
217
- if extension =~ /tar/
218
- on host, "cd #{host['working_dir']}; tar -xvf #{filename}.tar"
219
- end
220
- else
221
- if not link_exists?("#{path}/#{filename}#{extension}")
222
- raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist"
223
- end
224
- gunzip = ""
225
- untar = ""
226
- save_locally = ""
227
- if extension =~ /gz/
228
- gunzip = "| gunzip"
229
- end
230
- if extension =~ /tar/
231
- untar = "| tar -xvf -"
232
- end
233
- if extension =~ /msi/
234
- save_locally = "-O"
235
- end
236
- on host, "cd #{host['working_dir']}; curl #{save_locally} #{path}/#{filename}#{extension} #{gunzip} #{untar}"
261
+ fetch_puppet_on_unix(host, options)
237
262
  end
238
263
  end
239
264
  end
@@ -250,9 +275,9 @@ module Beaker
250
275
  end
251
276
 
252
277
  #Perform a Puppet Enterprise upgrade or install
253
- # @param [Array<Host>] hosts The hosts to install or upgrade PE on
278
+ # @param [Array<Host>] hosts The hosts to install or upgrade PE on
254
279
  # @param [Hash{Symbol=>Symbol, String}] options The options
255
- # @option options [String] :pe_dir Default directory or URL to pull PE package from
280
+ # @option options [String] :pe_dir Default directory or URL to pull PE package from
256
281
  # (Otherwise uses individual hosts pe_dir)
257
282
  # @option options [String] :pe_ver Default PE version to install or upgrade to
258
283
  # (Otherwise uses individual hosts pe_ver)
@@ -260,14 +285,13 @@ module Beaker
260
285
  # (Otherwise uses individual Windows hosts pe_ver)
261
286
  # @option options [Symbol] :type (:install) One of :upgrade or :install
262
287
  #
263
- #
264
- # @example
288
+ # @example
265
289
  # do_install(hosts, {:type => :upgrade, :pe_dir => path, :pe_ver => version, :pe_ver_win => version_win})
266
290
  #
267
291
  # @api private
268
292
  #
269
293
  def do_install hosts, options = {}
270
- options[:type] = options[:type] || :install
294
+ options[:type] = options[:type] || :install
271
295
  hostcert='uname | grep -i sunos > /dev/null && hostname || hostname -s'
272
296
  master_certname = on(master, hostcert).stdout.strip
273
297
  pre30database = version_is_less(options[:pe_ver] || database['pe_ver'], '3.0')
@@ -335,7 +359,7 @@ module Beaker
335
359
  if host['pe_ver'] == '3.0.0' and host == database
336
360
  sleep_until_puppetdb_started(database)
337
361
  end
338
- end
362
+ end
339
363
 
340
364
  install_hosts.each do |host|
341
365
  wait_for_host_in_dashboard(host)
@@ -365,7 +389,7 @@ module Beaker
365
389
  b_nums = b.split('-')[0].split('.')
366
390
  (0...a_nums.length).each do |i|
367
391
  if i < b_nums.length
368
- if a_nums[i] < b_nums[i]
392
+ if a_nums[i] < b_nums[i]
369
393
  return true
370
394
  elsif a_nums[i] > b_nums[i]
371
395
  return false
@@ -377,7 +401,7 @@ module Beaker
377
401
  #checks all dots, they are equal so examine the rest
378
402
  a_rest = a.split('-', 2)[1]
379
403
  b_rest = b.split('-', 2)[1]
380
- if a_rest and b_rest and a_rest < b_rest
404
+ if a_rest and b_rest and a_rest < b_rest
381
405
  return false
382
406
  elsif a_rest and not b_rest
383
407
  return false
@@ -388,7 +412,7 @@ module Beaker
388
412
  end
389
413
 
390
414
  #Sort array of hosts so that it has the correct order for PE installation based upon each host's role
391
- # @example
415
+ # @example
392
416
  # h = sorted_hosts
393
417
  #
394
418
  # @note Order for installation should be
@@ -440,7 +464,7 @@ module Beaker
440
464
  end
441
465
 
442
466
  #Install PE based upon host configuration and options
443
- # @example
467
+ # @example
444
468
  # install_pe
445
469
  #
446
470
  # @note Either pe_ver and pe_dir should be set in the ENV or each host should have pe_ver and pe_dir set individually.
@@ -448,23 +472,23 @@ module Beaker
448
472
  # for Unix like systems and puppet-enterprise-VERSION.msi for Windows systems.
449
473
  #
450
474
  # @api dsl
451
- def install_pe
475
+ def install_pe
452
476
  #process the version files if necessary
453
477
  hosts.each do |host|
454
478
  host['pe_dir'] ||= options[:pe_dir]
455
479
  if host['platform'] =~ /windows/
456
480
  host['pe_ver'] = host['pe_ver'] || options['pe_ver'] ||
457
- Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir], options[:pe_version_file_win])
481
+ Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir] || options[:pe_dir], options[:pe_version_file_win])
458
482
  else
459
483
  host['pe_ver'] = host['pe_ver'] || options['pe_ver'] ||
460
- Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir], options[:pe_version_file])
484
+ Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir] || options[:pe_dir], options[:pe_version_file])
461
485
  end
462
486
  end
463
487
  do_install sorted_hosts
464
488
  end
465
489
 
466
490
  #Upgrade PE based upon host configuration and options
467
- # @param [String] path A path (either local directory or a URL to a listing of PE builds).
491
+ # @param [String] path A path (either local directory or a URL to a listing of PE builds).
468
492
  # Will contain a LATEST file indicating the latest build to install.
469
493
  # This is ignored if a pe_upgrade_ver and pe_upgrade_dir are specified
470
494
  # in the host configuration file.
@@ -71,8 +71,9 @@ module Beaker
71
71
  end
72
72
 
73
73
  #Validate that hosts are prepared to be used as SUTs, if packages are missing attempt to
74
- #install them. Verifies the presence of {HostPrebuiltSteps::PACKAGES} on all hosts and
75
- #{HostPrebuiltSteps::UNIX_PACKAGES} on unix platform hosts.
74
+ #install them. Verifies the presence of {HostPrebuiltSteps::PACKAGES} on all hosts,
75
+ #{HostPrebuiltSteps::UNIX_PACKAGES} on unix platform hosts and {HostPrebuiltSteps::SLES_PACKAGES}
76
+ #on sles (SUSE, Enterprise Linux) hosts.
76
77
  # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon
77
78
  # @param [Hash{Symbol=>String}] opts Options to alter execution.
78
79
  # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
@@ -93,7 +94,6 @@ module Beaker
93
94
  host.install_package pkg
94
95
  end
95
96
  end
96
-
97
97
  when host['platform'] !~ /(windows)|(aix)|(solaris)/
98
98
  UNIX_PACKAGES.each do |pkg|
99
99
  if not host.check_for_package pkg
@@ -326,7 +326,81 @@ module Beaker
326
326
  if host['platform'] =~ /windows/
327
327
  host.exec(Command.new('sudo su -c "cp -r .ssh /home/Administrator/."'))
328
328
  else
329
- host.exec(Command.new('sudo su -c "cp -r .ssh /root/."'))
329
+ host.exec(Command.new('sudo su -c "cp -r .ssh /root/."'), {:pty => true})
330
+ end
331
+ end
332
+ end
333
+
334
+ #Update /etc/hosts to make it possible for each provided host to reach each other host by name.
335
+ #Assumes that each provided host has host[:ip] set.
336
+ # @param [Host, Array<Host>, String, Symbol] hosts An array of hosts to act upon
337
+ # @param [Hash{Symbol=>String}] opts Options to alter execution.
338
+ # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
339
+ def hack_etc_hosts hosts, opts
340
+ etc_hosts = "127.0.0.1\tlocalhost localhost.localdomain\n"
341
+ hosts.each do |host|
342
+ etc_hosts += "#{host['ip'].to_s}\t#{host[:vmhostname] || host.name}\n"
343
+ end
344
+ hosts.each do |host|
345
+ set_etc_hosts(host, etc_hosts)
346
+ end
347
+ end
348
+
349
+ #Update sshd_config on debian, ubuntu, centos, el, redhat and fedora boxes to allow for root login, does nothing on other platfoms
350
+ # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon
351
+ # @param [Hash{Symbol=>String}] opts Options to alter execution.
352
+ # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
353
+ def enable_root_login host, opts
354
+ logger = opts[:logger]
355
+ if host.is_a? Array
356
+ host.map { |h| copy_ssh_to_root(h, opts) }
357
+ else
358
+ logger.debug "Update /etc/ssh/sshd_config to allow root login"
359
+ host.exec(Command.new("sudo su -c \"sed -i 's/PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config\""), {:pty => true}
360
+ )
361
+ #restart sshd
362
+ if host['platform'] =~ /debian|ubuntu/
363
+ host.exec(Command.new("sudo su -c \"service ssh restart\""), {:pty => true})
364
+ elsif host['platform'] =~ /centos|el-|redhat|fedora/
365
+ host.exec(Command.new("sudo su -c \"service sshd restart\""), {:pty => true})
366
+ else
367
+ @logger.warn("Attempting to update ssh on non-supported platform: #{host.name}: #{host['platform']}")
368
+ end
369
+ end
370
+ end
371
+
372
+ #Disable SELinux on centos, does nothing on other platforms
373
+ # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon
374
+ # @param [Hash{Symbol=>String}] opts Options to alter execution.
375
+ # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
376
+ def disable_se_linux host, opts
377
+ logger = opts[:logger]
378
+ if host.is_a? Array
379
+ host.map { |h| copy_ssh_to_root(h, opts) }
380
+ else
381
+ if host['platform'] =~ /centos/
382
+ @logger.debug("Disabling se_linux on #{host.name}")
383
+ host.exec(Command.new("sudo su -c \"setenforce 0\""), {:pty => true})
384
+ else
385
+ @logger.warn("Attempting to disable SELinux on non-centos platform: #{host.name}: #{host['platform']}")
386
+ end
387
+ end
388
+ end
389
+
390
+ #Disable iptables on centos, does nothing on other platforms
391
+ # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon
392
+ # @param [Hash{Symbol=>String}] opts Options to alter execution.
393
+ # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
394
+ def disable_iptables host, opts
395
+ logger = opts[:logger]
396
+ if host.is_a? Array
397
+ host.map { |h| copy_ssh_to_root(h, opts) }
398
+ else
399
+ if host['platform'] =~ /centos/
400
+ logger.debug("Disabling iptables on #{host.name}")
401
+ host.exec(Command.new("sudo su -c \"/etc/init.d/iptables stop\""), {:pty => true})
402
+ else
403
+ logger.warn("Attempting to disable iptables on non-centos platform: #{host.name}: #{host['platform']}")
330
404
  end
331
405
  end
332
406
  end
@@ -11,6 +11,9 @@ module Beaker
11
11
  class Hypervisor
12
12
  include HostPrebuiltSteps
13
13
 
14
+ #Generates an array with all letters a thru z and numbers 0 thru 9
15
+ CHARMAP = ('a'..'z').to_a + ('0'..'9').to_a
16
+
14
17
  #Hypervisor creator method. Creates the appropriate hypervisor class object based upon
15
18
  #the provided hypervisor type selected, then provisions hosts with hypervisor.
16
19
  #@param [String] type The type of hypervisor to create - one of aix, solaris, vsphere, fusion,
@@ -39,6 +42,8 @@ module Beaker
39
42
  end
40
43
  when /vagrant/
41
44
  Beaker::Vagrant
45
+ when /google/
46
+ Beaker::GoogleCompute
42
47
  when /none/
43
48
  Beaker::Hypervisor
44
49
  else
@@ -80,17 +85,22 @@ module Beaker
80
85
  if @options[:add_master_entry]
81
86
  add_master_entry(@hosts, @options)
82
87
  end
83
- end
88
+ end
84
89
 
85
- #Default validation steps to be run for a given hypervisor
86
- def validate
87
- validate_host(@hosts, @options)
88
- end
90
+ #Default validation steps to be run for a given hypervisor
91
+ def validate
92
+ validate_host(@hosts, @options)
93
+ end
94
+
95
+ #Generate a random straing composted of letter and numbers
96
+ def generate_host_name
97
+ CHARMAP[rand(25)] + (0...14).map{CHARMAP[rand(CHARMAP.length)]}.join
98
+ end
89
99
 
90
100
  end
91
101
  end
92
102
 
93
- %w( vsphere_helper vagrant fusion blimper vsphere vcloud vcloud_pooled aixer solaris).each do |lib|
103
+ %w( vsphere_helper vagrant fusion blimper vsphere vcloud vcloud_pooled aixer solaris google_compute_helper google_compute).each do |lib|
94
104
  begin
95
105
  require "hypervisor/#{lib}"
96
106
  rescue LoadError