beaker 3.17.0 → 3.18.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTlmZTY1M2UyMzhmMzVjOWYzZWM0M2MxMmYzZWU3YzBmZmQ3MmE3MA==
4
+ ZWRlZjc1Y2Y2YTk4YjdmZjBjMWE4OGYxNWQ0YzFjNjllYjRmNGI2NQ==
5
5
  data.tar.gz: !binary |-
6
- Y2NhNzU3MmUwMmM3NWEyYjlkN2ZiMzFjN2YxMzM3NWMyZTY1NTEyZA==
6
+ ZjQ4ZjYxNTFkZGU4NjVhMzBjOGRhYzc1NTM1NWNhYzE2YTA2NzkxZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Nzk5NTRhYjBjMDIxNWI5OGRkMGMzMzY3MDZkODJjMDNjODVkZjJhNTQzZjY5
10
- MmUwOTE1NGYxNjEzYWU2YTgwN2IxNjJjYzczNWNmOWNmYTA3Y2JjZjBiNDZi
11
- ODIzNmM3YjQyNjJlM2ZjNGJkYmY4MjI1NjZlYTQ0YTEyY2M0YTk=
9
+ MDVjMzVlYjg2MjYyYjM5NjUwYzQ4ZmVhYjk1NDY4MDJlZWQ5YTYzOTZlM2Ey
10
+ MTM0NDFmNDRjODhkN2RkOTBlMGFmNGJkMGIzY2RmYmZhZDY1NDVjZGVkNjg0
11
+ YmI5ODIzOTRmMTE1MmRlYjNhZmM1MGRkMjZkNzIzZTYyMTRjMDM=
12
12
  data.tar.gz: !binary |-
13
- MTRmODZkMTQxOGYwYTIzMjRiYjgzMmUyNThkNGExMDBiYjNlMzg0NmY1YWEy
14
- NDMwYmQ5MWVlNzQyNjI5NzU4NDYyNzMwY2U2NjhjNmFkNzA3YzYyYzFhNGJh
15
- NGU0NmYyZmM1NWU5NjU5NzUzMzJhNDBiNzJjNjk5ZjRiZGI1MmI=
13
+ YTc4ZDBkYjYzM2E1NGYzZWVjMWQ4ZjRiMWVhMzhjZDlhYjYwNzY2ODhiMjli
14
+ MzA3MGYxNjVlOTk5NDllMWM3ZjI3YzVhMTFhODM1ODAxYzAwYjUxMzI0YTcx
15
+ OTU4Y2U3NTFlNWIyZWE2M2EzNDJhZmZiODg1NjZiNTY4MjZjYzg=
data/README.md CHANGED
@@ -32,7 +32,7 @@ works and how to use it but assume that you have a basic understanding of key co
32
32
  involved in addressing key problems and use-cases. They are more advanced than
33
33
  tutorials and assume some knowledge of how Beaker works.
34
34
 
35
- #Beaker Libraries
35
+ # Beaker Libraries
36
36
 
37
37
  Beaker functionality has been extended through the use of libraries available as
38
38
  gems. See the [complete list](docs/concepts/beaker_libraries.md) for available
@@ -5,18 +5,25 @@ test_name 'use the init subcommand' do
5
5
  on default, 'rm -rf /root/* /root/.beaker'
6
6
  end
7
7
 
8
+ step 'ensure beaker init requires hosts flag' do
9
+ result = on(default, 'beaker init')
10
+ assert_match(/No value(.+)--hosts/, result.raw_output)
11
+ end
12
+
8
13
  step 'ensure beaker init writes YAML configuration files to disk' do
9
14
  delete_root_folder_contents
10
- on(default, 'beaker init')
15
+ on(default, 'beaker init --hosts centos6-64')
11
16
  subcommand_options = on(default, "cat #{SubcommandUtil::SUBCOMMAND_OPTIONS}").stdout
12
17
  subcommand_state = on(default, "cat #{SubcommandUtil::SUBCOMMAND_STATE}").stdout
13
- assert(YAML.parse(subcommand_options).to_ruby.class == Hash)
18
+ parsed_options = YAML.parse(subcommand_options).to_ruby
19
+ assert(parsed_options["HOSTS"].count == 1)
20
+ assert(parsed_options.class == Hash)
14
21
  assert(YAML.parse(subcommand_state).to_ruby.class == Hash)
15
22
  end
16
23
 
17
24
  step 'ensure beaker init saves beaker-run arguments to the subcommand_options.yaml' do
18
25
  delete_root_folder_contents
19
- on(default, 'beaker init --log-level verbose')
26
+ on(default, 'beaker init --log-level verbose --hosts centos6-64')
20
27
  subcommand_options = on(default, "cat #{SubcommandUtil::SUBCOMMAND_OPTIONS}").stdout
21
28
  hash = YAML.parse(subcommand_options).to_ruby
22
29
  assert_equal('verbose', hash['log_level'])
@@ -8,10 +8,11 @@ test_name 'use the provision subcommand' do
8
8
 
9
9
  step 'run beaker init and provision' do
10
10
  delete_root_folder_contents
11
- on(default, 'beaker init')
12
11
  result = on(default, 'beaker provision --hosts centos6-64')
12
+ assert_match(/ERROR(.+)--hosts/, result.raw_output)
13
+ on(default, 'beaker init --hosts centos6-64')
14
+ result = on(default, 'beaker provision')
13
15
  assert_match(/Using available host/, result.stdout)
14
-
15
16
  subcommand_state = on(default, "cat #{SubcommandUtil::SUBCOMMAND_STATE}").stdout
16
17
  subcommand_state = YAML.parse(subcommand_state).to_ruby
17
18
  assert_equal(true, subcommand_state['provisioned'])
@@ -42,7 +42,7 @@ def some_method_call
42
42
  return "some_method_call"
43
43
  end
44
44
 
45
- def some_method_call
45
+ def some_other_method_call
46
46
  return "some_other_method_call"
47
47
  end
48
48
 
@@ -1,74 +1,82 @@
1
1
  ## The Task
2
2
 
3
- Consider if mcollectived incorrectly spawned a new process with every puppet agent run on Ubuntu 10.04. We need an acceptance test to check that a new process is not spawned and to ensure that this issue does not regress in new builds.
3
+ We will write a test to check if a package (specifically HTTPD) is installed and running. To do this we will write two files:
4
+ 1. `install.rb` - This file will install the package and start the service
5
+ 2. `mytest.rb` - This file will have our core tests that checks if the package is installed and running
4
6
 
5
- ## Figure Out Test Steps
7
+ Note: We will exclude Windows OS from our testing due to variation of package name.
8
+
9
+ ## Figure out steps
6
10
 
7
11
  What needs to happen in this test:
8
12
 
9
- * Install PE
10
- * Restart mcollective twice
11
- * Check to see if more than one mcollective process is running
13
+ * Install and run HTTPD
14
+ * Install HTTPD if its not available on our SUT
15
+ * Start HTTPD service
16
+ * Testing
17
+ * Test HTTPD is installed
18
+ * Test HTTPD service is running
12
19
 
13
20
  ## Create a host configuration file
14
- $ beaker-hostgenerator redhat7-64ma > redhat7-64ma.yaml
15
-
16
- ## Install PE
17
-
18
- We prefer to install PE once and then run a set of tests, so PE installation should not be part of the actual acceptance test.
21
+ $ beaker-hostgenerator redhat7-64 > redhat7-64.yaml
19
22
 
20
- $ mkdir setup
21
- $ cd setup
22
- $ cat > install.rb << RUBY
23
- test_name "Installing Puppet Enterprise" do
24
- install_pe
25
- RUBY
26
- $ cd ..
23
+ This command will generate a host file for our system under test (SUT). It will use vmpooler as hypervisor for the host. Please check out [this](https://github.com/puppetlabs/beaker/tree/master/docs/how_to/hypervisors) doc to learn more about hypervisors for beaker.
27
24
 
28
- This places our install steps in a ruby script (install.rb) which will run on localhost, but the #install_pe method knows where to install puppet enterprise based on the host configuration in use.
29
- The install.rb script is used in our commandline to beaker, below.
30
-
31
- ## Create a test file
25
+ ## Install and run HTTPD
32
26
 
33
- We need to create a test file to run.
27
+ Make a file named `install.rb` and put the following code into it:
34
28
 
35
- ### Define some test commands to run
36
- #### Restart mcollective twice
29
+ ```ruby
30
+ test_name "Installing and runnning HTTPD" do
37
31
 
38
- Here's our magic command that restarts mcollective:
32
+ # Don't run the install script on the following platform
33
+ confine :except, :platform => 'windows'
39
34
 
40
- restart_command = "bash -c '[[ -x /etc/init.d/pe-mcollective ]] && /etc/init.d/pe-mcollective restart'"
35
+ step "Install HTTPD" do
36
+ hosts.each do |host|
37
+ # Install HTTPD if it is not available on our SUT
38
+ install_package(host, 'httpd') unless check_for_package(host, 'httpd')
39
+ end
40
+ end
41
41
 
42
- #### Check to see if more than one mcollective process is running
42
+ step "Start HTTPD" do
43
+ hosts.each do |host|
44
+ # Start HTTPD service
45
+ on(host, "service httpd start")
46
+ end
47
+ end
43
48
 
44
- Here's our magic command that throws an error if more than one mcollective process is running:
49
+ end
50
+ ```
45
51
 
46
- process_count_check = "bash -c '[[ $(ps auxww | grep [m]collectived | wc -l) -eq 1 ]]'"
52
+ This places our install steps in a ruby script (`install.rb`) which will run on your SUT. The install.rb script is used in our commandline to beaker, below.
47
53
 
48
- ### Put it all together
54
+ ## Create a test file
49
55
 
50
- Here's the finished acceptance test.
56
+ Lets create test file that tests if HTTPD is installed and running on our hosts. Make a file called `mytest.rb` and add the following code to it:
51
57
 
52
58
  ```ruby
53
- test_name "/etc/init.d/pe-mcollective restart check"
54
-
55
- # Don't run these tests on the following platforms
56
- confine :except, :platform => 'solaris'
57
- confine :except, :platform => 'windows'
58
- confine :except, :platform => 'aix'
59
-
60
- step "Make sure the service restarts properly"
61
- hosts.each do |host|
62
- # Commands to execute on the target system.
63
- restart_command = "bash -c '[[ -x /etc/init.d/pe-mcollective ]] && /etc/init.d/pe-mcollective restart'"
64
- process_count_check = "bash -c '[[ $(ps auxww | grep [m]collectived | wc -l) -eq 1 ]]'"
65
-
66
- # Restart once
67
- on(host, restart_command) { assert_equal(0, exit_code) }
68
- # Restart again
69
- on(host, restart_command) { assert_equal(0, exit_code) }
70
- # Check to make sure only one process is running
71
- on(host, process_count_check) { assert_equal(0, exit_code) }
59
+ test_name "Check if HTTPD is installed and running" do
60
+
61
+ # Don't run these tests on the following platform
62
+ confine :except, :platform => 'windows'
63
+
64
+ step "Make sure HTTPD is installed" do
65
+ hosts.each do |host|
66
+ # Check if HTTPD is installed
67
+ assert check_for_package(host, 'httpd')
68
+ end
69
+ end
70
+
71
+ step "Make sure HTTPD is running" do
72
+ hosts.each do |host|
73
+ on(host, "systemctl is-active httpd") do |result|
74
+ # Check if HTTPD is running
75
+ assert_equal(0, result.exit_code)
76
+ end
77
+ end
78
+ end
79
+
72
80
  end
73
81
  ```
74
82
 
@@ -164,11 +164,33 @@ module PSWindows::Exec
164
164
 
165
165
  environment_string = ''
166
166
  env_array.each_with_index do |env|
167
- environment_string += "set #{env} && "
167
+ environment_string += "set \"#{env}\" && "
168
168
  end
169
169
  environment_string
170
170
  end
171
171
 
172
+ def environment_variable_string_pair_array env
173
+ env_array = []
174
+ env.each_key do |key|
175
+ val = env[key]
176
+ if val.is_a?(Array)
177
+ val = val.join(':')
178
+ else
179
+ val = val.to_s
180
+ end
181
+ # doing this for the key itself & the upcase'd version allows us to remain
182
+ # backwards compatible
183
+ # TODO: (Next Major Version) get rid of upcase'd version
184
+ key_str = key.to_s
185
+ keys = [key_str]
186
+ keys << key_str.upcase if key_str.upcase != key_str
187
+ keys.each do |env_key|
188
+ env_array << "#{env_key}=\"#{val}\""
189
+ end
190
+ end
191
+ env_array
192
+ end
193
+
172
194
  # Overrides the {Windows::Exec#ssh_permit_user_environment} method,
173
195
  # since no steps are needed in this setup to allow user ssh environments
174
196
  # to work.
@@ -145,7 +145,7 @@ module Beaker
145
145
  if container = host['docker_container']
146
146
  @logger.debug("stop container #{container.id}")
147
147
  begin
148
- container.stop
148
+ container.kill
149
149
  sleep 2 # avoid a race condition where the root FS can't unmount
150
150
  rescue Excon::Errors::ClientError => e
151
151
  @logger.warn("stop of container #{container.id} failed: #{e.response.body}")
@@ -20,7 +20,6 @@ module Beaker
20
20
  # a Beaker::CLI object executes, it can pick up these options. Notably excluded from this
21
21
  # group are `help` and `version`. Please note that whenever the command_line_parser.rb is
22
22
  # updated, this list should also be updated as well.
23
- class_option :hosts, :aliases => '-h', :type => :string, :group => 'Beaker run'
24
23
  class_option :'options-file', :aliases => '-o', :type => :string, :group => 'Beaker run'
25
24
  class_option :helper, :type => :string, :group => 'Beaker run'
26
25
  class_option :'load-path', :type => :string, :group => 'Beaker run'
@@ -62,6 +61,7 @@ module Beaker
62
61
  as necessary.
63
62
  LONGDESC
64
63
  option :help, :type => :boolean, :hide => true
64
+ method_option :hosts, :aliases => '-h', :type => :string, :required => true
65
65
  def init()
66
66
  if options[:help]
67
67
  invoke :help, [], ["init"]
@@ -116,22 +116,22 @@ module Beaker
116
116
 
117
117
  summary_logger.notify "Failed Tests Cases:"
118
118
  (grouped_summary[:fail] || []).each do |test_case|
119
- print_test_result(test_case)
119
+ summary_logger.notify print_test_result(test_case)
120
120
  end
121
121
 
122
122
  summary_logger.notify "Errored Tests Cases:"
123
123
  (grouped_summary[:error] || []).each do |test_case|
124
- print_test_result(test_case)
124
+ summary_logger.notify print_test_result(test_case)
125
125
  end
126
126
 
127
127
  summary_logger.notify "Skipped Tests Cases:"
128
128
  (grouped_summary[:skip] || []).each do |test_case|
129
- print_test_result(test_case)
129
+ summary_logger.notify print_test_result(test_case)
130
130
  end
131
131
 
132
132
  summary_logger.notify "Pending Tests Cases:"
133
133
  (grouped_summary[:pending] || []).each do |test_case|
134
- print_test_result(test_case)
134
+ summary_logger.notify print_test_result(test_case)
135
135
  end
136
136
 
137
137
  summary_logger.notify("\n\n")
@@ -152,7 +152,7 @@ module Beaker
152
152
  else
153
153
  test_case.test_status
154
154
  end
155
- @logger.notify " Test Case #{test_case.path} #{test_reported}"
155
+ " Test Case #{test_case.path} #{test_reported}"
156
156
  end
157
157
 
158
158
  # Writes Junit XML of this {TestSuiteResult}
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '3.17.0'
3
+ STRING = '3.18.0'
4
4
  end
5
5
  end
@@ -50,5 +50,22 @@ module Beaker
50
50
  expect( instance.mv(origin, destination, false) ).to be === 0
51
51
  end
52
52
  end
53
+ describe '#environment_string' do
54
+ let(:host) { {'pathseparator' => ':'} }
55
+
56
+ it 'returns a blank string if theres no env' do
57
+ expect( instance.environment_string( {} ) ).to be == ''
58
+ end
59
+
60
+ it 'takes an env hash with var_name/value pairs' do
61
+ expect( instance.environment_string( {:HOME => '/', :http_proxy => 'http://foo'} ) ).
62
+ to be == 'set "HOME="/"" && set "http_proxy="http://foo"" && set "HTTP_PROXY="http://foo"" && '
63
+ end
64
+
65
+ it 'takes an env hash with var_name/value[Array] pairs' do
66
+ expect( instance.environment_string( {:LD_PATH => ['/', '/tmp']}) ).
67
+ to be == "set \"LD_PATH=\"/:/tmp\"\" && "
68
+ end
69
+ end
53
70
  end
54
71
  end
@@ -65,7 +65,7 @@ module Beaker
65
65
  },
66
66
  },
67
67
  })
68
- allow( container ).to receive(:stop)
68
+ allow( container ).to receive(:kill)
69
69
  allow( container ).to receive(:delete)
70
70
  allow( container ).to receive(:exec)
71
71
  container
@@ -338,7 +338,7 @@ module Beaker
338
338
 
339
339
  it 'should stop the containers' do
340
340
  allow( docker ).to receive( :sleep ).and_return(true)
341
- expect( container ).to receive(:stop)
341
+ expect( container ).to receive(:kill)
342
342
  docker.cleanup
343
343
  end
344
344
 
@@ -47,6 +47,9 @@ module Beaker
47
47
  subcommand.init
48
48
  expect(mock_options).not_to have_key(:timestamp)
49
49
  end
50
+ it 'requires hosts flag' do
51
+ expect{subcommand.init}.to raise_error(NotImplementedError)
52
+ end
50
53
  end
51
54
 
52
55
  context '#provision' do
@@ -84,6 +87,10 @@ module Beaker
84
87
  expect(yaml_store_mock).to receive(:[]=).with('provisioned', true)
85
88
  subcommand.provision
86
89
  end
90
+ it 'does not allow hosts to be passed' do
91
+ subcommand.options = {:hosts => "myhost"}
92
+ expect{subcommand.provision()}.to raise_error(NotImplementedError)
93
+ end
87
94
  end
88
95
 
89
96
 
@@ -233,7 +233,7 @@ module Beaker
233
233
  allow(ex).to receive(:backtrace).and_return(['path_to_test_file.rb line 1 - blah'])
234
234
  tc.instance_variable_set(:@exception, ex)
235
235
  test_suite_result.add_test_case( tc )
236
- expect(options[:logger]).to_not receive(:notify).with(/Test line:/)
236
+ expect(test_suite_result.print_test_result(tc)).not_to match(/Test line:/)
237
237
  expect{ test_suite_result.print_test_result(tc) }.to_not raise_error
238
238
  end
239
239
 
@@ -243,8 +243,7 @@ module Beaker
243
243
  allow(ex).to receive(:backtrace).and_return(['path_to_test_file.rb line 1 - blah'])
244
244
  tc.instance_variable_set(:@exception, ex)
245
245
  test_suite_result.add_test_case( tc )
246
-
247
- expect(options[:logger]).to receive(:notify).with(/Test line:/)
246
+ expect(test_suite_result.print_test_result(tc)).to match(/Test line:/)
248
247
  expect{ test_suite_result.print_test_result(tc) }.to_not raise_error
249
248
  end
250
249
  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: 3.17.0
4
+ version: 3.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-31 00:00:00.000000000 Z
11
+ date: 2017-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -678,6 +678,7 @@ files:
678
678
  - lib/beaker/network_manager.rb
679
679
  - lib/beaker/options.rb
680
680
  - lib/beaker/options/command_line_parser.rb
681
+ - lib/beaker/options/homedir_options_file_parser.rb
681
682
  - lib/beaker/options/hosts_file_parser.rb
682
683
  - lib/beaker/options/options_file_parser.rb
683
684
  - lib/beaker/options/options_hash.rb