beaker 4.1.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2607aad1f0cfd6109c43fedd0299d4b63e4bdaf4
4
- data.tar.gz: 98b8eba8588799c8390c3795ffc8c119435cee7e
3
+ metadata.gz: 700b4229c8f566623b2a3a3caf5ae26308c4bb82
4
+ data.tar.gz: 27a0432eaba2fd5cb77080b86faac0c1b337062f
5
5
  SHA512:
6
- metadata.gz: 023baf9c93434352d5d14a9529a484608f089112cac04356ac5bae33f0df69c7cdeee7168d7c2c5f61624fda1e427a726d3d0d75d343f3aa26eb3cf39b8c0cd4
7
- data.tar.gz: 2947ce85bb0fbbfbcbe673b721c7d6809df62dba9dadfb4d70bf618f6bf264492d3f58b45eee47c7d54d45baf963fbca9977ab2b84a8af67d8c0f8e015837126
6
+ metadata.gz: 906361a2f47a868f2062684db26eac305079df40c11aefbc081316d01722a82ed18f94f808aba9167bbe52a656a4c6d3f07c9a27ec1cc2dd341d1b0bd90a5171
7
+ data.tar.gz: b763ee73c7882b8280da83dbab6fcbc7817c1d2b19ff5ea7aa43b7fedcf90e0bf5c3c44d8a397b519d437b7f0c36f81051b94377b275e3511481bfadadb2bad8
@@ -11,7 +11,24 @@ Tracking in this Changelog began for this project in version 3.25.0.
11
11
  If you're looking for changes from before this, refer to the project's
12
12
  git logs & PR history.
13
13
 
14
- # [Unreleased](https://github.com/puppetlabs/beaker/compare/4.1.0...master)
14
+ # [Unreleased](https://github.com/puppetlabs/beaker/compare/4.2.0...master)
15
+
16
+ # [4.2.0](https://github.com/puppetlabs/beaker/compare/4.1.0...4.2.0) - 2018.11.28
17
+
18
+ ### Added
19
+
20
+ - `BEAKER_HYPERVISOR` environment variable to choose the beaker-hostgenerator hypervisor
21
+
22
+ ### Changed
23
+
24
+ - Handling of vsh appended commands for cisco_nexus (BKR-1556)
25
+ - Acceptance tests: Add backoffs to other create_remote_file test
26
+
27
+ ### Fixed
28
+
29
+ - Don't always start a new container with docker (can be reused between invocations of the provision and exec beaker subcommands) (BKR-1547)
30
+ - Recursively remove unpersisted subcommand options (BKR-1549)
31
+
15
32
 
16
33
  # [4.1.0](https://github.com/puppetlabs/beaker/compare/4.0.0...4.1.0) - 2018.10.25
17
34
 
@@ -2,6 +2,32 @@ require "helpers/test_helper"
2
2
 
3
3
  test_name "dsl::helpers::host_helpers #create_remote_file" do
4
4
 
5
+ def create_remote_file_with_backups host, remote_filename, contents, opts={}
6
+ result = nil
7
+ repeat_fibonacci_style_for(10) do
8
+ begin
9
+ result = create_remote_file(
10
+ host, remote_filename, contents, opts
11
+ ) # return of block is whether or not we're done repeating
12
+ if result.is_a?(Rsync::Result) || result.is_a?(Beaker::Result)
13
+ return result.success?
14
+ end
15
+
16
+ result.each do |individual_result|
17
+ next if individual_result.success?
18
+ return false
19
+ end
20
+ true
21
+ rescue Beaker::Host::CommandFailure => err
22
+ logger.info("create_remote_file threw command failure, details: ")
23
+ logger.info(" #{err}")
24
+ logger.info("continuing back-off execution")
25
+ false
26
+ end
27
+ end
28
+ result
29
+ end
30
+
5
31
  if test_scp_error_on_close?
6
32
  step "#create_remote_file fails when the remote path does not exist" do
7
33
  assert_raises Beaker::Host::CommandFailure do
@@ -21,7 +47,7 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
21
47
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
22
48
  contents = fixture_contents("simple_text_file")
23
49
 
24
- create_remote_file default, remote_filename, contents
50
+ create_remote_file_with_backups default, remote_filename, contents
25
51
 
26
52
  remote_contents = on(default, "cat #{remote_filename}").stdout
27
53
  assert_equal contents, remote_contents
@@ -32,7 +58,7 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
32
58
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
33
59
  contents = fixture_contents("simple_text_file")
34
60
 
35
- create_remote_file default, remote_filename, contents, { :protocol => "scp" }
61
+ create_remote_file_with_backups default, remote_filename, contents, { :protocol => "scp" }
36
62
 
37
63
  remote_contents = on(default, "cat #{remote_filename}").stdout
38
64
  assert_equal contents, remote_contents
@@ -49,7 +75,7 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
49
75
  remote_filename = File.join(remote_dir, "testfile.txt")
50
76
  contents = fixture_contents("simple_text_file")
51
77
 
52
- create_remote_file hosts, remote_filename, contents
78
+ create_remote_file_with_backups hosts, remote_filename, contents
53
79
 
54
80
  hosts.each do |host|
55
81
  remote_contents = on(host, "cat #{remote_filename}").stdout
@@ -68,7 +94,7 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
68
94
  remote_filename = File.join(remote_dir, "testfile.txt")
69
95
  contents = fixture_contents("simple_text_file")
70
96
 
71
- create_remote_file hosts, remote_filename, contents, { :protocol => 'scp' }
97
+ create_remote_file_with_backups hosts, remote_filename, contents, { :protocol => 'scp' }
72
98
 
73
99
  hosts.each do |host|
74
100
  remote_contents = on(host, "cat #{remote_filename}").stdout
@@ -112,19 +138,9 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
112
138
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
113
139
  contents = fixture_contents("simple_text_file")
114
140
 
115
- repeat_fibonacci_style_for(10) do
116
- begin
117
- result = create_remote_file(
118
- default, remote_filename, contents, { :protocol => "rsync" }
119
- ) # return of block is whether or not we're done repeating
120
- result.success?
121
- rescue Beaker::Host::CommandFailure => err
122
- logger.info("Rsync threw command failure, details: ")
123
- logger.info(" #{err}")
124
- logger.info("continuing back-off execution")
125
- false
126
- end
127
- end
141
+ create_remote_file_with_backups(
142
+ default, remote_filename, contents, { :protocol => "rsync" }
143
+ )
128
144
 
129
145
  fails_intermittently("https://tickets.puppetlabs.com/browse/BKR-612",
130
146
  "default" => default,
@@ -149,7 +165,9 @@ test_name "dsl::helpers::host_helpers #create_remote_file" do
149
165
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
150
166
  contents = fixture_contents("simple_text_file")
151
167
 
152
- result = create_remote_file hosts, remote_filename, contents, { :protocol => 'rsync' }
168
+ result = create_remote_file_with_backups(
169
+ hosts, remote_filename, contents, { :protocol => 'rsync' }
170
+ )
153
171
 
154
172
  hosts.each do |host|
155
173
  fails_intermittently("https://tickets.puppetlabs.com/browse/BKR-612",
@@ -3,6 +3,30 @@ require "rsync"
3
3
 
4
4
  test_name "dsl::helpers::host_helpers #rsync_to" do
5
5
 
6
+ def rsync_to_with_backups hosts, local_filename, remote_dir
7
+ result = nil
8
+ repeat_fibonacci_style_for(10) do
9
+ begin
10
+ result = rsync_to(
11
+ hosts, local_filename, remote_dir
12
+ ) # return of block is whether or not we're done repeating
13
+ return result.success? if result.is_a? Rsync::Result
14
+
15
+ result.each do |individual_result|
16
+ next if individual_result.success?
17
+ return false
18
+ end
19
+ true
20
+ rescue Beaker::Host::CommandFailure => err
21
+ logger.info("create_remote_file threw command failure, details: ")
22
+ logger.info(" #{err}")
23
+ logger.info("continuing back-off execution")
24
+ false
25
+ end
26
+ end
27
+ result
28
+ end
29
+
6
30
  # NOTE: there does not seem to be a reliable way to confine to cygwin hosts.
7
31
  confine_block :to, :platform => /windows/ do
8
32
 
@@ -99,7 +123,7 @@ test_name "dsl::helpers::host_helpers #rsync_to" do
99
123
  remote_tmpdir = default.tmpdir()
100
124
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
101
125
 
102
- result = rsync_to default, local_filename, remote_tmpdir
126
+ result = rsync_to_with_backups default, local_filename, remote_tmpdir
103
127
 
104
128
  fails_intermittently("https://tickets.puppetlabs.com/browse/QENG-3053",
105
129
  "result" => result,
@@ -124,23 +148,7 @@ test_name "dsl::helpers::host_helpers #rsync_to" do
124
148
  on hosts, "mkdir -p #{remote_tmpdir}"
125
149
  remote_filename = File.join(remote_tmpdir, "testfile.txt")
126
150
 
127
- repeat_fibonacci_style_for(10) do
128
- begin
129
- result = rsync_to hosts, local_filename, remote_tmpdir
130
- return result.success? if result.is_a? Rsync::Result
131
-
132
- result.each do |individual_result|
133
- next if individual_result.success?
134
- return false
135
- end
136
- true
137
- rescue Beaker::Host::CommandFailure => err
138
- logger.info("Rsync threw command failure, details: ")
139
- logger.info(" #{err}")
140
- logger.info("continuing back-off execution")
141
- false
142
- end
143
- end
151
+ result = rsync_to_with_backups(hosts, local_filename, remote_tmpdir)
144
152
 
145
153
  hosts.each do |host|
146
154
  fails_intermittently("https://tickets.puppetlabs.com/browse/QENG-3053",
@@ -89,7 +89,27 @@ end
89
89
  You can now run this with
90
90
 
91
91
  ```console
92
- $ beaker --host redhat7-64ma.yaml --pre-suite install.rb --tests mytest.rb
92
+ $ beaker --host redhat7-64ma.yaml --pre-suite install.rb --tests mytest.rb
93
+ ```
94
+
95
+ ## Creating the host configuration on at runtime
96
+
97
+ When you don't want to store a static file, you can also let [beaker-hostgenerator](https://github.com/puppetlabs/beaker-hostgenerator) generate it on the fly. The filename is used as a host specification. A simple example is:
98
+
99
+ ```console
100
+ $ beaker --host centos7-64 --pre-suite install.rb --tests mytest.rb
101
+ ```
102
+
103
+ It's also possible to set the hypervisor and hostname:
104
+
105
+ ```console
106
+ $ beaker --host 'centos7-64{hypervisor=docker,hostname=centos7-64.example.com}' --pre-suite install.rb --tests mytest.rb
107
+ ```
108
+
109
+ An alternative way to set the hypervisor is `BEAKER_HYPERVISOR`:
110
+
111
+ ```console
112
+ $ BEAKER_HYPERVISOR=docker beaker --host centos7-64 --pre-suite install.rb --tests mytest.rb
93
113
  ```
94
114
 
95
115
  Next up you may want to look at the [Beaker test for a module](../how_to/write_a_beaker_test_for_a_module.md) page.
@@ -51,6 +51,7 @@ module Beaker
51
51
  @environment = {}
52
52
  @cmdexe = @options.delete(:cmdexe) || false
53
53
  @prepend_cmds = @options.delete(:prepend_cmds) || nil
54
+ @append_cmds = @options.delete(:append_cmds) || nil
54
55
 
55
56
  # this is deprecated and will not allow you to use a command line
56
57
  # option of `--environment`, please use ENV instead.
@@ -69,21 +70,17 @@ module Beaker
69
70
  # @param [String] pc An optional list of commands to prepend
70
71
  #
71
72
  # @return [String] This returns the fully formed command line invocation.
72
- def cmd_line host, cmd = @command, env = @environment, pc = @prepend_cmds
73
+ def cmd_line host, cmd = @command, env = @environment, pc = @prepend_cmds, ac = @append_cmds
73
74
  env_string = host.environment_string( env )
74
75
  prepend_commands = host.prepend_commands( cmd, pc, :cmd_exe => @cmdexe )
75
- if host[:platform] =~ /cisco/ && host[:user] != 'root'
76
- append_command = '"'
77
- cmd = cmd.gsub('"') { '\\"' }
78
- end
76
+ append_commands = host.append_commands( cmd, ac, :cmd_exe => @cmdexe )
79
77
 
80
78
  # This will cause things like `puppet -t -v agent` which is maybe bad.
81
79
  if host[:platform] =~ /cisco_ios_xr/
82
- cmd_line_array = [prepend_commands, env_string, cmd, options_string, args_string]
80
+ cmd_line_array = [prepend_commands, env_string, cmd, options_string, args_string, append_commands]
83
81
  else
84
- cmd_line_array = [env_string, prepend_commands, cmd, options_string, args_string]
82
+ cmd_line_array = [env_string, prepend_commands, cmd, options_string, args_string, append_commands]
85
83
  end
86
- cmd_line_array << append_command unless (cmd =~ /ntpdate/ && host[:platform] =~ /cisco_nexus/)
87
84
  cmd_line_array.compact.reject( &:empty? ).join( ' ' )
88
85
  end
89
86
 
@@ -85,6 +85,19 @@ module Cisco
85
85
  prepend_cmds.strip
86
86
  end
87
87
 
88
+ # Gets the specific append commands as needed for this host
89
+ #
90
+ # @param [String] command Command to be executed
91
+ # @param [String] user_ac List of user-specified commands to append
92
+ # @param [Hash] opts optional parameters
93
+ #
94
+ # @return [String] Command string as needed for this host
95
+ def append_commands(command = '', user_ac = '', opts = {})
96
+ command.gsub('"') {'\\"'}
97
+ # vsh commands and ntpdate commands do not require an appended `"`
98
+ return '"' unless command =~ /ntpdate|\/isan\/bin\/vsh/
99
+ end
100
+
88
101
  # Construct the environment string for this command
89
102
  #
90
103
  # @param [Hash{String=>String}] env An optional Hash containing
@@ -270,6 +270,17 @@ module Unix::Exec
270
270
  user_pc
271
271
  end
272
272
 
273
+ # Gets the specific append commands as needed for this host
274
+ #
275
+ # @param [String] command Command to be executed
276
+ # @param [String] user_ac List of user-specified commands to append
277
+ # @param [Hash] opts optional parameters
278
+ #
279
+ # @return [String] Command string as needed for this host
280
+ def append_commands(command = '', user_ac = '', opts = {})
281
+ user_ac
282
+ end
283
+
273
284
  # Fills the user SSH environment file.
274
285
  #
275
286
  # @param [Hash{String=>String}] env Environment variables to set on the system,
@@ -100,6 +100,17 @@ module Windows::Exec
100
100
  "#{cygwin_prefix}#{spacing}#{user_pc}"
101
101
  end
102
102
 
103
+ # Gets the specific append commands as needed for this host
104
+ #
105
+ # @param [String] command Command to be executed
106
+ # @param [String] user_ac List of user-specified commands to append
107
+ # @param [Hash] opts optional parameters
108
+ #
109
+ # @return [String] Command string as needed for this host
110
+ def append_commands(command = '', user_ac = '', opts = {})
111
+ user_ac
112
+ end
113
+
103
114
  # Checks if selinux is enabled
104
115
  # selinux is not available on Windows
105
116
  #
@@ -12,13 +12,12 @@ module Beaker
12
12
  # - only if we are running with ---provision
13
13
  # - only if we have a hypervisor
14
14
  # - only if either the specific hosts has no specification or has 'provision' in its config
15
- # - always if it is a vagrant or docker box (vagrant boxes are always provisioned
16
- # as they always need ssh key hacking. docker boxes need to have docker_container_name
17
- # specified)
15
+ # - always if it is a vagrant box (vagrant boxes are always provisioned as
16
+ # they always need ssh key hacking.)
18
17
  def provision? options, host
19
18
  command_line_says = options[:provision]
20
19
  host_says = host['hypervisor'] && (host.has_key?('provision') ? host['provision'] : true)
21
- (command_line_says && host_says) or (host['hypervisor'] =~/(vagrant|docker)/)
20
+ (command_line_says && host_says) or (host['hypervisor'] =~/(vagrant)/)
22
21
  end
23
22
 
24
23
  attr_accessor :hosts, :hypervisors
@@ -291,8 +291,11 @@ module Beaker
291
291
  $stdout.puts dne_message
292
292
  require 'beaker-hostgenerator'
293
293
 
294
+ host_generator_options = [ @options[:hosts_file] ]
295
+ host_generator_options += [ '--hypervisor', ENV['BEAKER_HYPERVISOR'] ] if ENV['BEAKER_HYPERVISOR']
296
+
294
297
  hosts_file_content = begin
295
- bhg_cli = BeakerHostGenerator::CLI.new( [ @options[:hosts_file] ] )
298
+ bhg_cli = BeakerHostGenerator::CLI.new(host_generator_options)
296
299
  bhg_cli.execute
297
300
  rescue BeakerHostGenerator::Exceptions::Error,
298
301
  BeakerHostGenerator::Exceptions::InvalidNodeSpecError => error
@@ -83,14 +83,7 @@ module Beaker
83
83
 
84
84
  @cli.parse_options
85
85
 
86
- # delete unnecessary keys for saving the options
87
- options_to_write = @cli.configured_options
88
- # Remove keys we don't want to save
89
- [:timestamp, :logger, :command_line, :beaker_version, :hosts_file].each do |key|
90
- options_to_write.delete(key)
91
- end
92
-
93
- options_to_write = SubcommandUtil.sanitize_options_for_save(options_to_write)
86
+ options_to_write = SubcommandUtil.sanitize_options_for_save(@cli.configured_options)
94
87
 
95
88
  @cli.logger.notify 'Writing configured options to disk'
96
89
  File.open(SubcommandUtil::SUBCOMMAND_OPTIONS, 'w') do |f|
@@ -16,18 +16,33 @@ module Beaker
16
16
  SUBCOMMAND_STATE = Pathname("#{CONFIG_DIR}/.subcommand_state.yaml")
17
17
  PERSISTED_HOSTS = Pathname("#{CONFIG_DIR}/.hosts.yaml")
18
18
  PERSISTED_HYPERVISORS = Pathname("#{CONFIG_DIR}/.hypervisors.yaml")
19
+ # These options should not be part of persisted subcommand state
20
+ UNPERSISTED_OPTIONS = [:beaker_version, :command_line, :hosts_file, :logger, :password_prompt, :timestamp]
19
21
 
20
22
  def self.execute_subcommand?(arg0)
21
23
  return false if arg0.nil?
22
24
  (Beaker::Subcommand.instance_methods(false) << :help).include? arg0.to_sym
23
25
  end
24
26
 
27
+ def self.prune_unpersisted(options)
28
+ UNPERSISTED_OPTIONS.each do |unpersisted_key|
29
+ options.each do |key, value|
30
+ if key == unpersisted_key
31
+ options.delete(key)
32
+ elsif value.is_a?(Hash)
33
+ options[key] = self.prune_unpersisted(value) unless value.empty?
34
+ end
35
+ end
36
+ end
37
+ options
38
+ end
39
+
25
40
  def self.sanitize_options_for_save(options)
26
41
  # God help us, the YAML library won't stop adding tags to objects, so this
27
42
  # hack is a way to force the options into the basic object types so that
28
43
  # an eventual YAML.dump or .to_yaml call doesn't add tags.
29
44
  # Relevant stackoverflow: http://stackoverflow.com/questions/18178098/how-do-i-have-ruby-yaml-dump-a-hash-subclass-as-a-simple-hash
30
- JSON.parse(options.to_json)
45
+ JSON.parse(prune_unpersisted(options).to_json)
31
46
  end
32
47
 
33
48
  # Print a message to the console and exit with specified exit code, defaults to 1
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '4.1.0'
3
+ STRING = '4.2.0'
4
4
  end
5
5
  end
@@ -32,6 +32,7 @@ module Beaker
32
32
  @args = [ 'to', 'the', 'baz' ]
33
33
  @options = { :foo => 'bar' }
34
34
  allow( host ).to receive( :prepend_commands ).and_return( 'aloha!' )
35
+ allow( host ).to receive( :append_commands ).and_return( '' )
35
36
 
36
37
  expect( cmd.cmd_line( host ) ).to be == "aloha! /usr/bin/blah --foo=bar to the baz"
37
38
  end
@@ -41,6 +42,29 @@ module Beaker
41
42
  @args = [ 'to', 'the', 'baz' ]
42
43
  @options = { :foo => 'bar' }
43
44
  allow( host ).to receive( :prepend_commands ).and_return( '' )
45
+ allow( host ).to receive( :append_commands ).and_return( '' )
46
+
47
+ expect( cmd.cmd_line( host ) ).to be == "/usr/bin/blah --foo=bar to the baz"
48
+ end
49
+ end
50
+
51
+ describe '#:append_commands' do
52
+ it 'can append commands' do
53
+ @command = '/usr/bin/blah'
54
+ @args = [ 'to', 'the', 'baz' ]
55
+ @options = { :foo => 'bar' }
56
+ allow( host ).to receive( :prepend_commands ).and_return( 'aloha!' )
57
+ allow( host ).to receive( :append_commands ).and_return( 'moo cow' )
58
+
59
+ expect( cmd.cmd_line( host ) ).to be == "aloha! /usr/bin/blah --foo=bar to the baz moo cow"
60
+ end
61
+
62
+ it 'can handle no append_cmds' do
63
+ @command = '/usr/bin/blah'
64
+ @args = [ 'to', 'the', 'baz' ]
65
+ @options = { :foo => 'bar' }
66
+ allow( host ).to receive( :prepend_commands ).and_return( '' )
67
+ allow( host ).to receive( :append_commands ).and_return( '' )
44
68
 
45
69
  expect( cmd.cmd_line( host ) ).to be == "/usr/bin/blah --foo=bar to the baz"
46
70
  end
@@ -91,6 +115,7 @@ module Beaker
91
115
  h = Hash.new
92
116
  allow( h ).to receive( :environment_string ).and_return( '' )
93
117
  allow( h ).to receive( :prepend_commands ).and_return( '' )
118
+ allow( h ).to receive( :append_commands ).and_return( '' )
94
119
  h
95
120
  }
96
121
  let(:platform) { @platform || 'unix' }
@@ -101,6 +101,71 @@ module Cisco
101
101
  end
102
102
  end
103
103
 
104
+ describe '#append_commands' do
105
+
106
+ context 'for cisco_nexus-7' do
107
+
108
+ before :each do
109
+ @platform = 'cisco_nexus-7-x86_64'
110
+ end
111
+
112
+ it 'appends `"` for commands' do
113
+ answer_correct = '"'
114
+ answer_test = host.append_commands( 'fake_command' )
115
+ expect( answer_test ).to be === answer_correct
116
+ end
117
+
118
+ it 'returns nil when vsh command' do
119
+ answer_correct = nil
120
+ answer_test = host.append_commands( '/isan/bin/vsh -c foo' )
121
+ expect( answer_test ).to be === answer_correct
122
+ end
123
+
124
+ it 'returns `"` when command contains vsh' do
125
+ answer_correct = '"'
126
+ answer_test = host.append_commands( 'fake_command -c foo vsh' )
127
+ expect( answer_test ).to be === answer_correct
128
+ end
129
+
130
+ it 'returns nil when ntpdate command' do
131
+ answer_correct = nil
132
+ answer_test = host.append_commands( 'fake/ntpdate/command foo' )
133
+ expect( answer_test ).to be === answer_correct
134
+ end
135
+ end
136
+
137
+ context 'for cisco_ios_xr-6' do
138
+
139
+ before :each do
140
+ @platform = 'cisco_ios_xr-6-x86_64'
141
+ end
142
+
143
+ it 'appends `"` for commands' do
144
+ answer_correct = '"'
145
+ answer_test = host.append_commands( 'fake_command' )
146
+ expect( answer_test ).to be === answer_correct
147
+ end
148
+
149
+ it 'returns nil when vsh command' do
150
+ answer_correct = nil
151
+ answer_test = host.append_commands( '/isan/bin/vsh -c foo' )
152
+ expect( answer_test ).to be === answer_correct
153
+ end
154
+
155
+ it 'returns `"` when command contains vsh' do
156
+ answer_correct = '"'
157
+ answer_test = host.append_commands( 'fake_command -c foo vsh' )
158
+ expect( answer_test ).to be === answer_correct
159
+ end
160
+
161
+ it 'returns nil when ntpdate command' do
162
+ answer_correct = nil
163
+ answer_test = host.append_commands( 'fake/ntpdate/command foo' )
164
+ expect( answer_test ).to be === answer_correct
165
+ end
166
+ end
167
+ end
168
+
104
169
  describe '#environment_string' do
105
170
 
106
171
  context 'for cisco_nexus-7' do
@@ -376,6 +376,8 @@ module Beaker
376
376
  ).and_return( cli_execute_return )
377
377
  expect( BeakerHostGenerator::CLI ).to receive(
378
378
  :new
379
+ ).with(
380
+ [ 'notafile.yml' ]
379
381
  ).and_return( mock_beaker_hostgenerator_cli )
380
382
  allow( Beaker::Options::HostsFileParser ).to receive(
381
383
  :parse_hosts_string
@@ -383,6 +385,37 @@ module Beaker
383
385
  parser.parse_hosts_options
384
386
  end
385
387
 
388
+ it 'calls beaker-hostgenerator to get hosts information with a default hypervisor' do
389
+ old_beaker_hypervisor = ENV['BEAKER_HYPERVISOR']
390
+ begin
391
+ ENV['BEAKER_HYPERVISOR'] = 'docker'
392
+
393
+ parser.instance_variable_set( :@options, {
394
+ :hosts_file => 'notafile.yml'
395
+ } )
396
+ allow( Beaker::Options::HostsFileParser ).to receive(
397
+ :parse_hosts_file
398
+ ).and_raise( Errno::ENOENT )
399
+
400
+ mock_beaker_hostgenerator_cli = Object.new
401
+ cli_execute_return = 'job150865'
402
+ expect( mock_beaker_hostgenerator_cli ).to receive(
403
+ :execute
404
+ ).and_return( cli_execute_return )
405
+ expect( BeakerHostGenerator::CLI ).to receive(
406
+ :new
407
+ ).with(
408
+ [ 'notafile.yml', '--hypervisor', 'docker' ]
409
+ ).and_return( mock_beaker_hostgenerator_cli )
410
+ allow( Beaker::Options::HostsFileParser ).to receive(
411
+ :parse_hosts_string
412
+ ).with( cli_execute_return )
413
+ parser.parse_hosts_options
414
+ ensure
415
+ ENV['BEAKER_HYPERVISOR'] = old_beaker_hypervisor
416
+ end
417
+ end
418
+
386
419
  it 'sets the :hosts_file_generated flag to signal others when needed' do
387
420
  options_test = {
388
421
  :hosts_file => 'not_a_file.yml'
@@ -104,6 +104,42 @@ module Beaker
104
104
  end
105
105
  end
106
106
 
107
+ describe 'prune_unpersisted' do
108
+ let(:good_options) do
109
+ { user: 'root', roles: ['agent'] }
110
+ end
111
+
112
+ let(:bad_options) do
113
+ { logger: Beaker::Logger.new, timestamp: Time.now }
114
+ end
115
+
116
+ let(:initial_options) do
117
+ Beaker::Options::OptionsHash.new.merge(good_options.merge(bad_options))
118
+ end
119
+
120
+ it 'removes unwanted keys from an options hash' do
121
+ result = subject.prune_unpersisted(initial_options)
122
+ good_options.keys.each { |key| expect(result).to have_key(key) }
123
+ bad_options.keys.each { |key| expect(result).not_to have_key(key) }
124
+ end
125
+
126
+ it 'recurses to remove any nested unwanted keys' do
127
+ opts = initial_options.merge(child: initial_options.merge(child: initial_options))
128
+ result = subject.prune_unpersisted(opts)
129
+
130
+ good_options.keys.each do |key|
131
+ expect(result).to have_key(key)
132
+ expect(result[:child]).to have_key(key)
133
+ expect(result[:child][:child]).to have_key(key)
134
+ end
135
+
136
+ bad_options.keys.each do |key|
137
+ expect(result).not_to have_key(key)
138
+ expect(result[:child]).not_to have_key(key)
139
+ expect(result[:child][:child]).not_to have_key(key)
140
+ end
141
+ end
142
+ end
107
143
  end
108
144
  end
109
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-25 00:00:00.000000000 Z
11
+ date: 2018-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec