beaker 2.13.0 → 2.14.0

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 (62) hide show
  1. checksums.yaml +8 -8
  2. data/Gemfile +19 -0
  3. data/HISTORY.md +335 -2
  4. data/acceptance/pre_suite/puppet_git/install.rb +2 -2
  5. data/lib/beaker/answers.rb +45 -2
  6. data/lib/beaker/answers/version20.rb +9 -9
  7. data/lib/beaker/answers/version28.rb +9 -9
  8. data/lib/beaker/answers/version30.rb +19 -19
  9. data/lib/beaker/answers/version32.rb +1 -1
  10. data/lib/beaker/answers/version34.rb +4 -4
  11. data/lib/beaker/answers/version40.rb +1 -1
  12. data/lib/beaker/cli.rb +11 -4
  13. data/lib/beaker/command.rb +4 -2
  14. data/lib/beaker/command_factory.rb +5 -1
  15. data/lib/beaker/dsl/helpers/host_helpers.rb +17 -5
  16. data/lib/beaker/dsl/install_utils.rb +3 -2
  17. data/lib/beaker/dsl/install_utils/aio_defaults.rb +86 -0
  18. data/lib/beaker/dsl/install_utils/foss_defaults.rb +163 -0
  19. data/lib/beaker/dsl/install_utils/foss_utils.rb +988 -0
  20. data/lib/beaker/dsl/install_utils/pe_defaults.rb +139 -0
  21. data/lib/beaker/dsl/install_utils/pe_utils.rb +140 -38
  22. data/lib/beaker/dsl/install_utils/puppet_utils.rb +26 -751
  23. data/lib/beaker/dsl/structure.rb +7 -1
  24. data/lib/beaker/host.rb +35 -58
  25. data/lib/beaker/host/freebsd.rb +4 -16
  26. data/lib/beaker/host/mac.rb +3 -39
  27. data/lib/beaker/host/mac/pkg.rb +2 -1
  28. data/lib/beaker/host/pswindows.rb +2 -28
  29. data/lib/beaker/host/unix.rb +3 -51
  30. data/lib/beaker/host/unix/pkg.rb +34 -33
  31. data/lib/beaker/host/windows.rb +1 -45
  32. data/lib/beaker/host_prebuilt_steps.rb +11 -24
  33. data/lib/beaker/hypervisor/aixer.rb +1 -1
  34. data/lib/beaker/hypervisor/docker.rb +43 -4
  35. data/lib/beaker/hypervisor/openstack.rb +1 -0
  36. data/lib/beaker/hypervisor/solaris.rb +1 -1
  37. data/lib/beaker/hypervisor/vmpooler.rb +19 -8
  38. data/lib/beaker/network_manager.rb +5 -4
  39. data/lib/beaker/options/command_line_parser.rb +9 -9
  40. data/lib/beaker/options/parser.rb +21 -17
  41. data/lib/beaker/options/presets.rb +0 -33
  42. data/lib/beaker/platform.rb +7 -3
  43. data/lib/beaker/ssh_connection.rb +1 -1
  44. data/lib/beaker/version.rb +1 -1
  45. data/spec/beaker/answers_spec.rb +13 -8
  46. data/spec/beaker/cli_spec.rb +6 -6
  47. data/spec/beaker/command_spec.rb +18 -0
  48. data/spec/beaker/dsl/helpers/puppet_helpers_spec.rb +2 -0
  49. data/spec/beaker/dsl/install_utils/{puppet_utils_spec.rb → foss_utils_spec.rb} +34 -21
  50. data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +2 -0
  51. data/spec/beaker/dsl/structure_spec.rb +8 -0
  52. data/spec/beaker/host/unix/pkg_spec.rb +15 -10
  53. data/spec/beaker/host_prebuilt_steps_spec.rb +1 -1
  54. data/spec/beaker/host_spec.rb +3 -54
  55. data/spec/beaker/hypervisor/docker_spec.rb +2 -0
  56. data/spec/beaker/hypervisor/vmpooler_spec.rb +67 -10
  57. data/spec/beaker/options/command_line_parser_spec.rb +2 -2
  58. data/spec/beaker/options/parser_spec.rb +35 -24
  59. data/spec/beaker/options/presets_spec.rb +0 -26
  60. data/spec/helpers.rb +5 -5
  61. data/spec/mocks.rb +1 -2
  62. metadata +7 -3
@@ -15,58 +15,14 @@ module Windows
15
15
  include Windows::Exec
16
16
  include Windows::Pkg
17
17
 
18
- def self.pe_defaults
18
+ def platform_defaults
19
19
  h = Beaker::Options::OptionsHash.new
20
20
  h.merge({
21
21
  'user' => 'Administrator',
22
22
  'group' => 'Administrators',
23
- 'puppetservice' => 'pe-httpd',
24
- 'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
25
- 'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
26
- 'puppetcodedir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
27
- 'hieraconf' => '`cygpath -smF 35`/Puppetlabs/puppet/etc/hiera.yaml',
28
- 'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/var',
29
- 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc/modules',
30
- 'sitemoduledir' => 'C:/usr/share/puppet/modules',
31
- #let's just add both potential bin dirs to the path
32
- 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet Enterprise/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet Enterprise/bin',
33
- 'privatebindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet Enterprise/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet Enterprise/sys/ruby/bin',
34
23
  'pathseparator' => ';',
35
24
  })
36
25
  end
37
26
 
38
- def self.foss_defaults
39
- h = Beaker::Options::OptionsHash.new
40
- h.merge({
41
- 'user' => 'Administrator',
42
- 'group' => 'Administrators',
43
- 'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
44
- 'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
45
- 'puppetcodedir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
46
- 'hieraconf' => '`cygpath -smF 35`/Puppetlabs/puppet/etc/hiera.yaml',
47
- 'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/var',
48
- 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc/modules',
49
- 'sitemoduledir' => 'C:/usr/share/puppet/modules',
50
- 'hieralibdir' => '`cygpath -w /opt/puppet-git-repos/hiera/lib`',
51
- 'hierapuppetlibdir' => '`cygpath -w /opt/puppet-git-repos/hiera-puppet/lib`',
52
- #let's just add both potential bin dirs to the path
53
- 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin',
54
- 'privatebindir' => '/usr/bin',
55
- 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
56
- 'pathseparator' => ';',
57
- })
58
- end
59
-
60
- def self.aio_defaults
61
- h = Beaker::Options::OptionsHash.new
62
- h.merge({
63
- 'user' => 'Administrator',
64
- 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin',
65
- 'privatebindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/sys/ruby/bin',
66
- 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/code/modules',
67
- # sitemoduledir not included (check PUP-4049 for more info)
68
- 'pathseparator' => ';',
69
- })
70
- end
71
27
  end
72
28
  end
@@ -1,6 +1,6 @@
1
1
  require 'pathname'
2
2
 
3
- [ 'command', "dsl/patterns" ].each do |lib|
3
+ [ 'command', "dsl" ].each do |lib|
4
4
  require "beaker/#{lib}"
5
5
  end
6
6
 
@@ -456,18 +456,6 @@ module Beaker
456
456
  merged_hash
457
457
  end
458
458
 
459
- # 'echo' the provided value on the given host
460
- # @param [Host] host The host to execute the 'echo' on
461
- # @param [String] val The string to 'echo' on the host
462
- def echo_on_host host, val
463
- #val = val.gsub(/"/, "\"").gsub(/\(/, "\(")
464
- if host.is_powershell?
465
- host.exec(Command.new("echo #{val}")).stdout.chomp
466
- else
467
- host.exec(Command.new("echo \"#{val}\"")).stdout.chomp
468
- end
469
- end
470
-
471
459
  # Create the hash of default environment from host (:host_env), global options hash (:host_env) and default PE/Foss puppet variables
472
460
  # @param [Host] host The host to construct the environment hash for, host specific environment should be in :host_env in a hash
473
461
  # @param [Hash] opts Hash of options, including optional global host_env to be applied to each provided host
@@ -475,17 +463,6 @@ module Beaker
475
463
  def construct_env host, opts
476
464
  env = additive_hash_merge(host[:host_env], opts[:host_env])
477
465
 
478
- #Add PATH
479
-
480
- #prepend any PATH already set for this host
481
-
482
- env['PATH'] = (%w(puppetbindir facterbindir hierabindir) << env['PATH']).compact.reject(&:empty?)
483
- #get the PATH defaults
484
- env['PATH'].map! { |val| host[val] }
485
- env['PATH'] = env['PATH'].compact.reject(&:empty?)
486
- #run the paths through echo to see if they have any subcommands that need processing
487
- env['PATH'].map! { |val| echo_on_host(host, val) }
488
-
489
466
  env.each_key do |key|
490
467
  separator = host['pathseparator']
491
468
  if key == 'PATH' && (not host.is_powershell?)
@@ -560,6 +537,16 @@ module Beaker
560
537
  env.each_pair do |var, value|
561
538
  host.add_env_var(var, value)
562
539
  end
540
+ # REMOVE POST BEAKER 3: backwards compatability, do some setup based upon the global type
541
+ # this is the worst and i hate it
542
+ if host[:type]
543
+ case host[:type]
544
+ when /git|foss|aio/
545
+ Class.new.extend(Beaker::DSL).configure_foss_defaults_on(host)
546
+ when /pe/
547
+ Class.new.extend(Beaker::DSL).configure_pe_defaults_on(host)
548
+ end
549
+ end
563
550
 
564
551
  #close the host to re-establish the connection with the new sshd settings
565
552
  host.close
@@ -23,7 +23,7 @@ module Beaker
23
23
  }
24
24
 
25
25
  @logger.notify "Connecting to hypervisor at #{hypername}"
26
- hypervisor = Beaker::Host.create( hypername, hyperopts )
26
+ hypervisor = Beaker::Host.create( hypername, hyperopts, @options )
27
27
  hypervisor[:user] = @fog_file[:default][:aix_hypervisor_username] || hypervisor[:user]
28
28
  hypervisor[:ssh][:keys] = [@fog_file[:default][:aix_hypervisor_keyfile]] || hypervisor[:ssh][:keys]
29
29
 
@@ -1,6 +1,13 @@
1
1
  module Beaker
2
2
  class Docker < Beaker::Hypervisor
3
3
 
4
+ # Docker hypvervisor initializtion
5
+ # Env variables supported:
6
+ # DOCKER_REGISTRY: Docker registry URL
7
+ # DOCKER_HOST: Remote docker host
8
+ # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
9
+ # or a role (String or Symbol) that identifies one or more hosts.
10
+ # @param [Hash{Symbol=>String}] options Options to pass on to the hypervisor
4
11
  def initialize(hosts, options)
5
12
  require 'docker'
6
13
  @options = options
@@ -21,6 +28,19 @@ module Beaker
21
28
 
22
29
  # Pass on all the logging from docker-api to the beaker logger instance
23
30
  ::Docker.logger = @logger
31
+
32
+ # Find out what kind of remote instance we are talking against
33
+ if ::Docker.version['Version'] =~ /swarm/
34
+ @docker_type = 'swarm'
35
+ unless ENV['DOCKER_REGISTRY']
36
+ raise "Using Swarm with beaker requires a private registry. Please setup the private registry and set the 'DOCKER_REGISTRY' env var"
37
+ else
38
+ @registry = ENV['DOCKER_REGISTRY']
39
+ end
40
+ else
41
+ @docker_type = 'docker'
42
+ end
43
+
24
44
  end
25
45
 
26
46
  def provision
@@ -32,9 +52,21 @@ module Beaker
32
52
  @logger.debug("Creating image")
33
53
  image = ::Docker::Image.build(dockerfile_for(host), { :rm => true })
34
54
 
35
- @logger.debug("Creating container from image #{image.id}")
55
+ if @docker_type == 'swarm'
56
+ image_name = "#{@registry}/beaker/#{image.id}"
57
+ ret = ::Docker::Image.search(:term => image_name)
58
+ if ret.first.nil?
59
+ @logger.debug("Image does not exist on registry. Pushing.")
60
+ image.tag({:repo => image_name, :force => true})
61
+ image.push
62
+ end
63
+ else
64
+ image_name = image.id
65
+ end
66
+
67
+ @logger.debug("Creating container from image #{image_name}")
36
68
  container = ::Docker::Container.create({
37
- 'Image' => image.id,
69
+ 'Image' => image_name,
38
70
  'Hostname' => host.name,
39
71
  })
40
72
 
@@ -42,12 +74,19 @@ module Beaker
42
74
  container.start({"PublishAllPorts" => true, "Privileged" => true})
43
75
 
44
76
  # Find out where the ssh port is from the container
45
- if ENV['DOCKER_HOST']
77
+ # When running on swarm DOCKER_HOST points to the swarm manager so we have to get the
78
+ # IP of the swarm slave via the container data
79
+ # When we are talking to a normal docker instance DOCKER_HOST can point to a remote docker instance.
80
+
81
+ # Talking against a remote docker host which is a normal docker host
82
+ if @docker_type == 'docker' && ENV['DOCKER_HOST']
46
83
  ip = URI.parse(ENV['DOCKER_HOST']).host
47
- @logger.info("Using docker server at #{ip}")
48
84
  else
85
+ # Swarm or local docker host
49
86
  ip = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostIp"]
50
87
  end
88
+
89
+ @logger.info("Using docker server at #{ip}")
51
90
  port = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostPort"]
52
91
 
53
92
  forward_ssh_agent = @options[:forward_ssh_agent] || false
@@ -100,6 +100,7 @@ module Beaker
100
100
  :image_ref => image(host[:image]).id,
101
101
  :nics => [ {'net_id' => network(@options[:openstack_network]).id } ],
102
102
  :name => host[:vmhostname],
103
+ :user_data => "#cloud-config\nmanage_etc_hosts: true\n",
103
104
  }
104
105
  options[:key_name] = key_name(host)
105
106
  vm = @compute_client.servers.create(options)
@@ -24,7 +24,7 @@ module Beaker
24
24
  }
25
25
 
26
26
  @logger.notify "Connecting to hypervisor at #{hypername}"
27
- hypervisor = Beaker::Host.create( hypername, hyperopts )
27
+ hypervisor = Beaker::Host.create( hypername, hyperopts, @options )
28
28
  hypervisor[:user] = @fog_file[:default][:solaris_hypervisor_username] || hypervisor[:user]
29
29
  hypervisor[:ssh][:keys] = [@fog_file[:default][:solaris_hypervisor_keyfile]] || hypervisor[:ssh][:keys]
30
30
 
@@ -15,6 +15,8 @@ module Beaker
15
15
  Errno::ENETUNREACH,
16
16
  ]
17
17
 
18
+ attr_reader :options, :logger, :hosts, :credentials
19
+
18
20
  def initialize(vmpooler_hosts, options)
19
21
  @options = options
20
22
  @logger = options[:logger]
@@ -25,16 +27,25 @@ module Beaker
25
27
  def load_credentials(dot_fog = '.fog')
26
28
  creds = {}
27
29
 
28
- begin
29
- fog = YAML.load_file(dot_fog)
30
- default = fog[:default]
31
-
32
- creds[:vmpooler_token] = default[:vmpooler_token]
33
- rescue Errno::ENOENT
34
- @logger.warn "Credentials file (#{@options[:dot_fog]}) not found; proceeding without authentication"
30
+ if fog = read_fog_file(dot_fog)
31
+ if fog[:default] && fog[:default][:vmpooler_token]
32
+ creds[:vmpooler_token] = fog[:default][:vmpooler_token]
33
+ else
34
+ @logger.warn "Credentials file (#{dot_fog}) is missing a :default section with a :vmpooler_token value; proceeding without authentication"
35
+ end
36
+ else
37
+ @logger.warn "Credentials file (#{dot_fog}) is empty; proceeding without authentication"
35
38
  end
36
39
 
37
40
  creds
41
+
42
+ rescue Errno::ENOENT
43
+ @logger.warn "Credentials file (#{dot_fog}) not found; proceeding without authentication"
44
+ creds
45
+ end
46
+
47
+ def read_fog_file(dot_fog = '.fog')
48
+ YAML.load_file(dot_fog)
38
49
  end
39
50
 
40
51
  def check_url url
@@ -149,7 +160,7 @@ module Beaker
149
160
  request.body = { 'tags' => tags }.to_json
150
161
 
151
162
  response = http.request(request)
152
- rescue RuntimeError, Error::EINVAL, Errno::ECONNRESET, EOFError,
163
+ rescue RuntimeError, Errno::EINVAL, Errno::ECONNRESET, EOFError,
153
164
  Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, *SSH_EXCEPTIONS => e
154
165
  @logger.notify "Failed to connect to vmpooler for tagging!"
155
166
  end
@@ -50,13 +50,14 @@ module Beaker
50
50
  end
51
51
  @hypervisors = {}
52
52
  #sort hosts by their hypervisor, use hypervisor 'none' if no hypervisor is specified
53
+ hostless_options = Beaker::Options::OptionsHash.new.merge(@options.select{ |k,v| k.to_s !~ /HOSTS/})
53
54
  @options['HOSTS'].each_key do |name|
54
- host = @options['HOSTS'][name]
55
- hypervisor = host['hypervisor']
56
- hypervisor = provision?(@options, host) ? host['hypervisor'] : 'none'
55
+ host_hash = @options['HOSTS'][name]
56
+ hypervisor = host_hash['hypervisor']
57
+ hypervisor = provision?(@options, host_hash) ? host_hash['hypervisor'] : 'none'
57
58
  @logger.debug "Hypervisor for #{name} is #{hypervisor}"
58
59
  @machines[hypervisor] = [] unless @machines[hypervisor]
59
- @machines[hypervisor] << Beaker::Host.create(name, @options)
60
+ @machines[hypervisor] << Beaker::Host.create(name, host_hash, hostless_options)
60
61
  end
61
62
 
62
63
  @machines.each_key do |type|
@@ -27,13 +27,6 @@ module Beaker
27
27
  @cmd_options[:options_file] = file
28
28
  end
29
29
 
30
- opts.on '--type TYPE',
31
- 'one of git, foss, or pe',
32
- 'used to determine underlying path structure of puppet install',
33
- '(default pe)' do |type|
34
- @cmd_options[:type] = type
35
- end
36
-
37
30
  opts.on '--helper PATH/TO/SCRIPT',
38
31
  'Ruby file evaluated prior to tests',
39
32
  '(a la spec_helper)' do |script|
@@ -193,6 +186,10 @@ module Beaker
193
186
  @cmd_options[:validate] = bool
194
187
  end
195
188
 
189
+ opts.on '--collect-perf-data', 'Use sysstat on linux hosts to collect performance and load data' do
190
+ @cmd_options[:collect_perf_data] = true
191
+ end
192
+
196
193
  opts.on('--version', 'Report currently running version of beaker' ) do
197
194
  @cmd_options[:version] = true
198
195
  end
@@ -220,9 +217,12 @@ module Beaker
220
217
  #noop
221
218
  end
222
219
 
223
- opts.on '--collect-perf-data', 'Use sysstat on linux hosts to collect performance and load data' do
224
- @cmd_options[:collect_perf_data] = true
220
+ opts.on '--type TYPE',
221
+ 'DEPRECATED - pe/foss/aio determined during runtime' do |type|
222
+ #backwards compatability, oh how i hate you
223
+ @cmd_options[:type] = type
225
224
  end
225
+
226
226
  end
227
227
 
228
228
  end
@@ -169,9 +169,9 @@ module Beaker
169
169
  #
170
170
  # Order of priority is as follows:
171
171
  # 1. environment variables are given top priority
172
- # 2. host file options
173
- # 3. the 'CONFIG' section of the hosts file
174
- # 4. ARGV or provided arguments array
172
+ # 2. ARGV or provided arguments array
173
+ # 3. host file options
174
+ # 4. the 'CONFIG' section of the hosts file
175
175
  # 5. options file values
176
176
  # 6. default or preset values are given the lowest priority
177
177
  #
@@ -184,6 +184,7 @@ module Beaker
184
184
 
185
185
  @options = @presets.presets
186
186
  cmd_line_options = @command_line_parser.parse(args)
187
+ cmd_line_options[:command_line] = ([$0] + args).join(' ')
187
188
  file_options = Beaker::Options::OptionsFileParser.parse_options_file(cmd_line_options[:options_file])
188
189
 
189
190
  # merge together command line and file_options
@@ -193,16 +194,19 @@ module Beaker
193
194
  # merge command line and file options with defaults
194
195
  # overwrite defaults with command line and file options
195
196
  @options = @options.merge(cmd_line_and_file_options)
196
- @options[:command_line] = ([$0] + args).join(' ')
197
197
 
198
198
  if not @options[:help] and not @options[:version]
199
199
  #read the hosts file that contains the node configuration and hypervisor info
200
200
  hosts_options = Beaker::Options::HostsFileParser.parse_hosts_file(@options[:hosts_file])
201
201
 
202
202
  # merge in host file vars
203
- # overwrite options (default, file options, command line, env) with host file options
203
+ # overwrite options (default, file options, command line) with host file options
204
204
  @options = @options.merge(hosts_options)
205
205
 
206
+ # re-merge the command line options
207
+ # overwrite options (default, file options, hosts file ) with command line arguments
208
+ @options = @options.merge(cmd_line_options)
209
+
206
210
  # merge in env vars
207
211
  # overwrite options (default, file options, command line, hosts file) with env
208
212
  env_vars = @presets.env_vars
@@ -236,14 +240,13 @@ module Beaker
236
240
  # - each host has a valid platform
237
241
  # - if a keyfile is provided then use it
238
242
  # - paths provided to --test, --pre-suite, --post-suite provided lists of .rb files for testing
239
- # - --type is one of 'pe' or 'git'
240
243
  # - --fail-mode is one of 'fast', 'stop' or nil
241
244
  # - if using blimpy hypervisor an EC2 YAML file exists
242
245
  # - if using the aix, solaris, or vcloud hypervisors a .fog file exists
243
246
  # - that one and only one master is defined per set of hosts
244
247
  # - that solaris/windows/aix hosts are agent only for PE tests OR
245
- # - that windows/aix host are agent only if type is not 'pe'
246
248
  # - sets the default host based upon machine definitions
249
+ # - if an ssh user has been defined make it the host user
247
250
  #
248
251
  #@raise [ArgumentError] Raise if argument/options values are invalid
249
252
  def normalize_args
@@ -266,7 +269,7 @@ module Beaker
266
269
  LONG_OPTS.each do |opt|
267
270
  if @options.has_key?(opt)
268
271
  @options[opt] = split_arg(@options[opt])
269
- if RB_FILE_OPTS.include?(opt)
272
+ if RB_FILE_OPTS.include?(opt) && (not @options[opt] == [])
270
273
  @options[opt] = file_list(@options[opt])
271
274
  end
272
275
  if opt == :install
@@ -277,11 +280,6 @@ module Beaker
277
280
  end
278
281
  end
279
282
 
280
- #check for valid type
281
- if @options[:type] !~ /pe|git|foss|aio/
282
- parser_error "--type must be one of pe, git, foss, or aio not '#{@options[:type]}'"
283
- end
284
-
285
283
  #check for valid fail mode
286
284
  if @options[:fail_mode] !~ /stop|fast|slow/
287
285
  parser_error "--fail-mode must be one of fast or slow, not '#{@options[:fail_mode]}'"
@@ -326,12 +324,10 @@ module Beaker
326
324
  parser_error "Only one host/node may have the role 'master', fix #{@options[:hosts_file]}"
327
325
  end
328
326
 
329
- #check that solaris/windows/el-4 boxes are only agents
327
+ #check that windows/el-4 boxes are only agents (solaris can be a master in foss cases)
330
328
  @options[:HOSTS].each_key do |name|
331
329
  host = @options[:HOSTS][name]
332
- if (host[:platform] =~ /windows|el-4/) ||
333
- (@options.is_pe? && host[:platform] =~ /solaris/)
334
-
330
+ if host[:platform] =~ /windows|el-4/
335
331
  test_host_roles(name, host)
336
332
  end
337
333
  end
@@ -339,6 +335,14 @@ module Beaker
339
335
  #set the default role
340
336
  set_default_host!(@options[:HOSTS])
341
337
 
338
+ #check to see if a custom user account has been provided, if so use it
339
+ @options[:HOSTS].each_key do |name|
340
+ host = @options[:HOSTS][name]
341
+ if host[:ssh] && host[:ssh][:user]
342
+ host[:user] = host[:ssh][:user]
343
+ end
344
+ end
345
+
342
346
  end
343
347
 
344
348
  private
@@ -165,39 +165,6 @@ module Beaker
165
165
  :host_env => {},
166
166
  :ssh_env_file => '~/.ssh/environment',
167
167
  :profile_d_env_file => '/etc/profile.d/beaker_env.sh',
168
- :answers => {
169
- :q_puppet_enterpriseconsole_auth_user_email => 'admin@example.com',
170
- :q_puppet_enterpriseconsole_auth_password => '~!@#$%^*-/ aZ',
171
- :q_puppet_enterpriseconsole_smtp_port => 25,
172
- :q_puppet_enterpriseconsole_smtp_use_tls => 'n',
173
- :q_verify_packages => 'y',
174
- :q_puppetdb_password => '~!@#$%^*-/ aZ',
175
- :q_puppetmaster_enterpriseconsole_port => 443,
176
- :q_puppet_enterpriseconsole_auth_database_name => 'console_auth',
177
- :q_puppet_enterpriseconsole_auth_database_user => 'mYu7hu3r',
178
- :q_puppet_enterpriseconsole_database_name => 'console',
179
- :q_puppet_enterpriseconsole_database_user => 'mYc0nS03u3r',
180
- :q_database_root_password => '=ZYdjiP3jCwV5eo9s1MBd',
181
- :q_database_root_user => 'pe-postgres',
182
- :q_database_export_dir => '/tmp',
183
- :q_puppetdb_database_name => 'pe-puppetdb',
184
- :q_puppetdb_database_user => 'mYpdBu3r',
185
- :q_database_port => 5432,
186
- :q_puppetdb_port => 8081,
187
- :q_classifier_database_user => 'DFGhjlkj',
188
- :q_database_name => 'pe-classifier',
189
- :q_classifier_database_password => '~!@#$%^*-/ aZ',
190
- :q_activity_database_user => 'adsfglkj',
191
- :q_activity_database_name => 'pe-activity',
192
- :q_activity_database_password => '~!@#$%^*-/ aZ',
193
- :q_rbac_database_user => 'RbhNBklm',
194
- :q_rbac_database_name => 'pe-rbac',
195
- :q_rbac_database_password => '~!@#$%^*-/ aZ',
196
- :q_install_update_server => 'y',
197
- :q_exit_for_nc_migrate => 'n',
198
- :q_enable_future_parser => 'n',
199
- :q_pe_check_for_updates => 'n',
200
- },
201
168
  :dot_fog => File.join(ENV['HOME'], '.fog'),
202
169
  :ec2_yaml => 'config/image_templates/ec2.yaml',
203
170
  :help => false,