beaker 1.16.0 → 1.17.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 (51) hide show
  1. checksums.yaml +8 -8
  2. data/CONTRIBUTING.md +90 -0
  3. data/HISTORY.md +654 -2
  4. data/beaker.gemspec +1 -0
  5. data/lib/beaker/answers/version34.rb +4 -0
  6. data/lib/beaker/cli.rb +49 -2
  7. data/lib/beaker/dsl/helpers.rb +356 -196
  8. data/lib/beaker/dsl/install_utils.rb +135 -16
  9. data/lib/beaker/dsl/patterns.rb +37 -0
  10. data/lib/beaker/dsl/roles.rb +29 -0
  11. data/lib/beaker/dsl.rb +2 -1
  12. data/lib/beaker/host/unix.rb +14 -10
  13. data/lib/beaker/host/windows.rb +2 -0
  14. data/lib/beaker/host.rb +96 -1
  15. data/lib/beaker/host_prebuilt_steps.rb +41 -51
  16. data/lib/beaker/hypervisor/aws_sdk.rb +80 -16
  17. data/lib/beaker/hypervisor/ec2_helper.rb +1 -1
  18. data/lib/beaker/logger.rb +17 -0
  19. data/lib/beaker/options/command_line_parser.rb +3 -0
  20. data/lib/beaker/options/hosts_file_parser.rb +7 -4
  21. data/lib/beaker/options/options_hash.rb +2 -2
  22. data/lib/beaker/options/parser.rb +1 -1
  23. data/lib/beaker/options/presets.rb +128 -83
  24. data/lib/beaker/perf.rb +58 -0
  25. data/lib/beaker/shared/host_manager.rb +81 -0
  26. data/lib/beaker/shared.rb +2 -2
  27. data/lib/beaker/ssh_connection.rb +14 -7
  28. data/lib/beaker/test_case.rb +13 -0
  29. data/lib/beaker/test_suite.rb +23 -5
  30. data/lib/beaker/version.rb +1 -1
  31. data/lib/beaker.rb +1 -1
  32. data/spec/beaker/answers_spec.rb +13 -8
  33. data/spec/beaker/dsl/ezbake_utils_spec.rb +8 -9
  34. data/spec/beaker/dsl/helpers_spec.rb +299 -51
  35. data/spec/beaker/dsl/install_utils_spec.rb +75 -10
  36. data/spec/beaker/dsl/roles_spec.rb +36 -1
  37. data/spec/beaker/host_prebuilt_steps_spec.rb +21 -5
  38. data/spec/beaker/host_spec.rb +187 -23
  39. data/spec/beaker/hypervisor/ec2_helper_spec.rb +4 -4
  40. data/spec/beaker/hypervisor/vagrant_spec.rb +1 -1
  41. data/spec/beaker/options/hosts_file_parser_spec.rb +5 -0
  42. data/spec/beaker/options/options_hash_spec.rb +2 -2
  43. data/spec/beaker/options/parser_spec.rb +6 -0
  44. data/spec/beaker/options/presets_spec.rb +18 -2
  45. data/spec/beaker/perf_spec.rb +87 -0
  46. data/spec/beaker/shared/{host_role_parser_spec.rb → host_manager_spec.rb} +36 -5
  47. data/spec/beaker/test_suite_spec.rb +4 -3
  48. data/spec/matchers.rb +31 -3
  49. data/spec/mocks.rb +31 -25
  50. metadata +24 -5
  51. data/lib/beaker/shared/host_role_parser.rb +0 -36
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ describe Perf do
5
+
6
+ context "When a Perf object is created" do
7
+ it 'creates a new Perf object' do
8
+ hosts = Array.new
9
+ options = Hash.new
10
+ options[:log_level] = :debug
11
+ my_logger = Beaker::Logger.new(options)
12
+ options[:logger] = my_logger
13
+ perf = Perf.new( hosts, options )
14
+ expect( perf ).to be_a_kind_of Perf
15
+ end
16
+
17
+ before(:each) do
18
+ @options = make_opts
19
+ @options[:collect_perf_data] = true
20
+ @options[:log_level] = :debug
21
+ @options[:color] = false
22
+ @my_io = StringIO.new
23
+ @my_logger = Beaker::Logger.new(@options)
24
+ @my_logger.add_destination(@my_io)
25
+ @options[:logger] = @my_logger
26
+ end
27
+
28
+ it 'creates a new Perf object with a single host, :collect_perf_data = true' do
29
+ hosts = [ make_host("myHost", @options) ]
30
+ @my_logger.remove_destination(STDOUT)
31
+ perf = Perf.new( hosts, @options )
32
+ expect( perf ).to be_a_kind_of Perf
33
+ expect(@my_io.string).to match(/Setup perf on host: myHost/)
34
+ end
35
+
36
+ it 'creates a new Perf object with multiple hosts, :collect_perf_data = true' do
37
+ hosts = [ make_host("myHost", @options), make_host("myOtherHost", @options) ]
38
+ @my_logger.remove_destination(STDOUT)
39
+ perf = Perf.new( hosts, @options )
40
+ expect( perf ).to be_a_kind_of Perf
41
+ expect(@my_io.string).to match(/Setup perf on host: myHost*Setup perf on host: myOtherHost/)
42
+ end
43
+
44
+ it 'creates a new Perf object with multiple hosts, :collect_perf_data = true, SLES' do
45
+ hosts = [ make_host("myHost", @options), make_host("myOtherHost", @options) ]
46
+ hosts[0]['platform'] = "SLES"
47
+ @my_logger.remove_destination(STDOUT)
48
+ perf = Perf.new( hosts, @options )
49
+ expect( perf ).to be_a_kind_of Perf
50
+ expect(@my_io.string).to match(/Setup perf on host: myHostSetup perf on host: myOtherHost/)
51
+ end
52
+ end
53
+
54
+ context "When testing is finished, :collect_perf_data = true" do
55
+ before(:each) do
56
+ @options = make_opts
57
+ @options[:collect_perf_data] = true
58
+ @options[:log_level] = :debug
59
+ @options[:color] = false
60
+ @hosts = [ make_host("myHost", @options), make_host("myOtherHost", @options) ]
61
+ @my_io = StringIO.new
62
+ @my_logger = Beaker::Logger.new(@options)
63
+ @my_logger.add_destination(@my_io)
64
+ @options[:logger] = @my_logger
65
+ end
66
+
67
+ it "Does the Right Thing on Linux hosts" do
68
+ @hosts[0]['platform'] = "centos"
69
+ @my_logger.remove_destination(STDOUT)
70
+ perf = Perf.new( @hosts, @options )
71
+ expect( perf ).to be_a_kind_of Perf
72
+ perf.print_perf_info
73
+ expect(@my_io.string).to match(/Setup perf on host: myHostSetup perf on host: myOtherHostGetting perf data for host: myHostGetting perf data for host: myOtherHost/)
74
+ end
75
+
76
+ it "Does the Right Thing on non-Linux hosts" do
77
+ @hosts[0]['platform'] = "windows"
78
+ @my_logger.remove_destination(STDOUT)
79
+ perf = Perf.new( @hosts, @options )
80
+ expect( perf ).to be_a_kind_of Perf
81
+ perf.print_perf_info
82
+ expect(@my_io.string).to match(/Setup perf on host: myHostSetup perf on host: myOtherHostGetting perf data for host: myHostGetting perf data for host: myOtherHost/)
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -2,13 +2,17 @@ require 'spec_helper'
2
2
 
3
3
  module Beaker
4
4
  module Shared
5
- describe HostRoleParser do
6
- let( :host_handler ) { Beaker::Shared::HostRoleParser }
5
+ describe HostManager do
6
+ let( :host_handler ) { Beaker::Shared::HostManager }
7
+ let( :spec_block ) { Proc.new { |arr| arr } }
7
8
  let( :platform ) { @platform || 'unix' }
9
+ let( :role0 ) { "role0" }
10
+ let( :role1 ) { :role1 }
11
+ let( :role2 ) { :role2 }
8
12
  let( :hosts ) { hosts = make_hosts( { :platform => platform } )
9
- hosts[0][:roles] = ['agent']
10
- hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database']
11
- hosts[2][:roles] = ['agent']
13
+ hosts[0][:roles] = ['agent', role0]
14
+ hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database', role1]
15
+ hosts[2][:roles] = ['agent', role2]
12
16
  hosts }
13
17
 
14
18
  context "hosts_with_role" do
@@ -52,6 +56,33 @@ module Beaker
52
56
  end
53
57
  end
54
58
 
59
+ context "run_block_on" do
60
+ it "can execute a block against hosts identified by a string" do
61
+ myhosts = host_handler.run_block_on( hosts, role0 ) do |hosts|
62
+ hosts
63
+ end
64
+ expect( myhosts ).to be === hosts[0]
65
+
66
+ end
67
+
68
+ it "can execute a block against hosts identified by a hostname" do
69
+ myhosts = host_handler.run_block_on( hosts, hosts[0].name ) do |hosts|
70
+ hosts
71
+ end
72
+ expect( myhosts ).to be === hosts[0]
73
+
74
+ end
75
+
76
+ it "can execute a block against an array of hosts" do
77
+ myhosts = host_handler.run_block_on( hosts ) do |hosts|
78
+ hosts
79
+ end
80
+ expect( myhosts ).to be === hosts
81
+
82
+ end
83
+
84
+ end
85
+
55
86
  end
56
87
 
57
88
  end
@@ -35,6 +35,7 @@ module Beaker
35
35
  let(:rb_test) { 'my_ruby_file.rb' }
36
36
  let(:pl_test) { '/my_perl_file.pl' }
37
37
  let(:sh_test) { '/my_shell_file.sh' }
38
+ let(:hosts) { make_hosts() }
38
39
 
39
40
  it 'fails fast if fail_mode != :slow and runtime error is raised' do
40
41
  Logger.stub('new')
@@ -43,7 +44,7 @@ module Beaker
43
44
  File.open(pl_test, 'w') { |file| file.write(okay_script) }
44
45
  File.open(sh_test, 'w') { |file| file.write(okay_script) }
45
46
 
46
- ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :stop )
47
+ ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop )
47
48
  tsr = ts.instance_variable_get( :@test_suite_results )
48
49
  tsr.stub(:write_junit_xml).and_return( true )
49
50
  tsr.stub(:summarize).and_return( true )
@@ -63,7 +64,7 @@ module Beaker
63
64
  File.open(pl_test, 'w') { |file| file.write(okay_script) }
64
65
  File.open(sh_test, 'w') { |file| file.write(okay_script) }
65
66
 
66
- ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :stop )
67
+ ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop )
67
68
  tsr = ts.instance_variable_get( :@test_suite_results )
68
69
  tsr.stub(:write_junit_xml).and_return( true )
69
70
  tsr.stub(:summarize).and_return( true )
@@ -83,7 +84,7 @@ module Beaker
83
84
  File.open(pl_test, 'w') { |file| file.write(fail_script) }
84
85
  File.open(sh_test, 'w') { |file| file.write(okay_script) }
85
86
 
86
- ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :slow )
87
+ ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :slow )
87
88
  tsr = ts.instance_variable_get( :@test_suite_results )
88
89
  tsr.stub(:write_junit_xml).and_return( true )
89
90
  tsr.stub(:summarize).and_return( true )
data/spec/matchers.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  RSpec::Matchers.define :execute_commands_matching do |pattern|
2
-
3
2
  match do |actual|
4
- raise(RuntimeError, "Expected #{actual} to be a FakeHost") unless actual.kind_of?(FakeHost)
3
+ raise(RuntimeError, "Expected #{actual} to be a FakeHost") unless actual.kind_of?(FakeHost::MockedExec)
5
4
  @found_count = actual.command_strings.grep(pattern).size
6
5
  @times.nil? ?
7
6
  @found_count > 0 :
@@ -18,7 +17,6 @@ RSpec::Matchers.define :execute_commands_matching do |pattern|
18
17
 
19
18
  chain :once do
20
19
  @times = 1
21
- # clarity only
22
20
  end
23
21
 
24
22
  def message(actual, pattern, times, found_count)
@@ -37,3 +35,33 @@ RSpec::Matchers.define :execute_commands_matching do |pattern|
37
35
  "Unexpectedly found #{message(actual, pattern, @times, @found_count)}"
38
36
  end
39
37
  end
38
+
39
+ RSpec::Matchers.define :execute_commands_matching_in_order do |*patterns|
40
+ match do |actual|
41
+ raise(RuntimeError, "Expected #{actual} to be a FakeHost") unless actual.kind_of?(FakeHost::MockedExec)
42
+
43
+ remaining_patterns = patterns.clone
44
+ actual.command_strings.each do |line|
45
+ if remaining_patterns.empty?
46
+ break
47
+ elsif remaining_patterns.first.match(line)
48
+ remaining_patterns.shift
49
+ end
50
+ end
51
+
52
+ remaining_patterns.empty?
53
+ end
54
+
55
+ def message(actual, patterns)
56
+ msg = "#{patterns.join(', ')} in order" +
57
+ " in:\n #{actual.command_strings.pretty_inspect}"
58
+ end
59
+
60
+ failure_message_for_should do |actual|
61
+ "Expected to find #{message(actual, patterns)}"
62
+ end
63
+
64
+ failure_message_for_should_not do |actual|
65
+ "Unexpectedly found #{message(actual, patterns)}"
66
+ end
67
+ end
data/spec/mocks.rb CHANGED
@@ -43,7 +43,7 @@ module MockNet
43
43
  @uri = uri
44
44
  end
45
45
  end
46
-
46
+
47
47
  def initialize host, port
48
48
  @host = host
49
49
  @port = port
@@ -56,37 +56,43 @@ module MockNet
56
56
 
57
57
  end
58
58
 
59
- class FakeHost
60
- attr_accessor :commands
61
-
62
- def initialize(options = {})
63
- @pe = options[:pe]
64
- @options = options[:options]
65
- @commands = []
59
+ module FakeHost
60
+ def self.create(name = 'fakevm', platform = 'redhat-version-arch', options = {})
61
+ options_hash = Beaker::Options::OptionsHash.new.merge(options)
62
+ options_hash['HOSTS'] = { name => { 'platform' => Beaker::Platform.new(platform) } }
63
+ host = Beaker::Host.create(name, options_hash)
64
+ host.extend(MockedExec)
65
+ host
66
66
  end
67
67
 
68
- def port_open?(port)
69
- true
70
- end
68
+ module MockedExec
69
+ def self.extended(other)
70
+ other.instance_eval do
71
+ send(:instance_variable_set, :@commands, [])
72
+ end
73
+ end
71
74
 
72
- def is_pe?
73
- @pe
74
- end
75
+ attr_accessor :commands
75
76
 
76
- def [](name)
77
- @options[name]
78
- end
77
+ def port_open?(port)
78
+ true
79
+ end
79
80
 
80
- def any_exec_result
81
- RSpec::Mocks::Mock.new('exec-result').as_null_object
82
- end
81
+ def any_exec_result
82
+ RSpec::Mocks::Mock.new('exec-result').as_null_object
83
+ end
83
84
 
84
- def exec(command, options = {})
85
- commands << command
86
- any_exec_result
85
+ def exec(command, options = {})
86
+ commands << command
87
+ any_exec_result
88
+ end
89
+
90
+ def command_strings
91
+ commands.map { |c| [c.command, c.args].join(' ') }
92
+ end
87
93
  end
88
94
 
89
- def command_strings
90
- commands.map { |c| [c.command, c.args].join(' ') }
95
+ def log_prefix
96
+ "FakeHost"
91
97
  end
92
98
  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: 1.16.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-18 00:00:00.000000000 Z
11
+ date: 2014-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ~>
165
165
  - !ruby/object:Gem::Version
166
166
  version: '1.8'
167
+ - !ruby/object:Gem::Dependency
168
+ name: hocon
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 0.0.4
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ~>
179
+ - !ruby/object:Gem::Version
180
+ version: 0.0.4
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: net-ssh
169
183
  requirement: !ruby/object:Gem::Requirement
@@ -344,6 +358,7 @@ files:
344
358
  - .rspec
345
359
  - .simplecov
346
360
  - .travis.yml
361
+ - CONTRIBUTING.md
347
362
  - DOCUMENTING.md
348
363
  - Gemfile
349
364
  - HISTORY.md
@@ -369,6 +384,7 @@ files:
369
384
  - lib/beaker/dsl/helpers.rb
370
385
  - lib/beaker/dsl/install_utils.rb
371
386
  - lib/beaker/dsl/outcomes.rb
387
+ - lib/beaker/dsl/patterns.rb
372
388
  - lib/beaker/dsl/roles.rb
373
389
  - lib/beaker/dsl/structure.rb
374
390
  - lib/beaker/dsl/wrappers.rb
@@ -417,11 +433,12 @@ files:
417
433
  - lib/beaker/options/parser.rb
418
434
  - lib/beaker/options/pe_version_scraper.rb
419
435
  - lib/beaker/options/presets.rb
436
+ - lib/beaker/perf.rb
420
437
  - lib/beaker/platform.rb
421
438
  - lib/beaker/result.rb
422
439
  - lib/beaker/shared.rb
423
440
  - lib/beaker/shared/error_handler.rb
424
- - lib/beaker/shared/host_role_parser.rb
441
+ - lib/beaker/shared/host_manager.rb
425
442
  - lib/beaker/shared/repetition.rb
426
443
  - lib/beaker/shared/timed.rb
427
444
  - lib/beaker/ssh_connection.rb
@@ -470,10 +487,11 @@ files:
470
487
  - spec/beaker/options/parser_spec.rb
471
488
  - spec/beaker/options/pe_version_scaper_spec.rb
472
489
  - spec/beaker/options/presets_spec.rb
490
+ - spec/beaker/perf_spec.rb
473
491
  - spec/beaker/platform_spec.rb
474
492
  - spec/beaker/puppet_command_spec.rb
475
493
  - spec/beaker/shared/error_handler_spec.rb
476
- - spec/beaker/shared/host_role_parser_spec.rb
494
+ - spec/beaker/shared/host_manager_spec.rb
477
495
  - spec/beaker/shared/repetition_spec.rb
478
496
  - spec/beaker/ssh_connection_spec.rb
479
497
  - spec/beaker/test_case_spec.rb
@@ -551,10 +569,11 @@ test_files:
551
569
  - spec/beaker/options/parser_spec.rb
552
570
  - spec/beaker/options/pe_version_scaper_spec.rb
553
571
  - spec/beaker/options/presets_spec.rb
572
+ - spec/beaker/perf_spec.rb
554
573
  - spec/beaker/platform_spec.rb
555
574
  - spec/beaker/puppet_command_spec.rb
556
575
  - spec/beaker/shared/error_handler_spec.rb
557
- - spec/beaker/shared/host_role_parser_spec.rb
576
+ - spec/beaker/shared/host_manager_spec.rb
558
577
  - spec/beaker/shared/repetition_spec.rb
559
578
  - spec/beaker/ssh_connection_spec.rb
560
579
  - spec/beaker/test_case_spec.rb
@@ -1,36 +0,0 @@
1
- module Beaker
2
- module Shared
3
- #Methods for selecting host or hosts that match roles.
4
- module HostRoleParser
5
-
6
- #Find hosts from a given array of hosts that all have the desired role.
7
- #@param [Array<Host>] hosts The hosts to examine
8
- #@param [String] desired_role The hosts returned will have this role in their roles list
9
- #@return [Array<Host>] The hosts that have the desired role in their roles list
10
- def hosts_with_role(hosts, desired_role = nil)
11
- hosts.select do |host|
12
- desired_role.nil? or host['roles'].include?(desired_role.to_s)
13
- end
14
- end
15
-
16
- #Find a single host with the role provided. Raise an error if more than one host is found to have the
17
- #provided role.
18
- #@param [Array<Host>] hosts The hosts to examine
19
- #@param [String] role The host returned will have this role in its role list
20
- #@return [Host] The single host with the desired role in its roles list
21
- #@raise [ArgumentError] Raised if more than one host has the given role defined, or if no host has the
22
- # role defined.
23
- def only_host_with_role(hosts, role)
24
- a_host = hosts_with_role(hosts, role)
25
- case
26
- when a_host.length == 0
27
- raise ArgumentError, "There should be one host with #{role} defined!"
28
- when a_host.length > 1
29
- host_string = ( a_host.map { |host| host.name } ).join( ', ')
30
- raise ArgumentError, "There should be only one host with #{role} defined, but I found #{a_host.length} (#{host_string})"
31
- end
32
- a_host.first
33
- end
34
- end
35
- end
36
- end