beaker 2.5.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,14 +2,23 @@ module PSWindows::File
2
2
  include Beaker::CommandFactory
3
3
 
4
4
  def tmpfile(name)
5
- execute("echo C:\\Windows\\Temp\\#{name}.XXXXXX")
5
+ execute("echo C:\\Windows\\Temp\\#{name}.%RANDOM%")
6
6
  end
7
7
 
8
8
  def tmpdir(name)
9
- execute("echo C:\\Windows\\Temp\\#{name}.XXXXXX")
9
+ # generate name
10
+ tmpdirname = execute("echo C:\\Windows\\Temp\\#{name}.%RANDOM%")
11
+ # created named dir
12
+ execute("md #{tmpdirname}")
13
+ tmpdirname
10
14
  end
11
15
 
12
16
  def path_split(paths)
13
17
  paths.split(';')
14
18
  end
19
+
20
+ def file_exist?(path)
21
+ result = exec(Beaker::Command.new("if exist #{path} echo true"), :acceptable_exit_codes => [0, 1])
22
+ result.stdout =~ /true/
23
+ end
15
24
  end
@@ -7,15 +7,21 @@ module PSWindows::Pkg
7
7
  end
8
8
 
9
9
  def check_for_package(name)
10
- raise "Cannot check for package #{name} on #{self}"
10
+ #HACK NOOP
11
+ #raise "Cannot check for package #{name} on #{self}"
12
+ 0
11
13
  end
12
14
 
13
15
  def install_package(name, cmdline_args = '')
14
- raise "Package #{name} cannot be installed on #{self}"
16
+ #HACK NOOP
17
+ #raise "Package #{name} cannot be installed on #{self}"
18
+ 0
15
19
  end
16
20
 
17
21
  def uninstall_package(name, cmdline_args = '')
18
- raise "Package #{name} cannot be uninstalled on #{self}"
22
+ #HACK NOOP
23
+ #raise "Package #{name} cannot be uninstalled on #{self}"
24
+ 0
19
25
  end
20
26
 
21
27
  private
@@ -23,7 +29,7 @@ module PSWindows::Pkg
23
29
  # @api private
24
30
  def identify_windows_architecture
25
31
  arch = nil
26
- execute("echo '' | wmic os get osarchitecture",
32
+ execute("wmic os get osarchitecture",
27
33
  :acceptable_exit_codes => (0...127)) do |result|
28
34
 
29
35
  arch = if result.exit_code == 0
@@ -38,9 +44,9 @@ module PSWindows::Pkg
38
44
  # @api private
39
45
  def identify_windows_architecture_from_os_name_for_win2003
40
46
  arch = nil
41
- execute("echo '' | wmic os get name | grep x64",
47
+ execute("wmic os get name",
42
48
  :acceptable_exit_codes => (0...127)) do |result|
43
- arch = result.exit_code == 0 ? '64' : '32'
49
+ arch = result.stdout =~ /64/ ? '64' : '32'
44
50
  end
45
51
  arch
46
52
  end
@@ -61,20 +61,24 @@ module Unix
61
61
  end
62
62
 
63
63
  def self.aio_defaults
64
- h = self.foss_defaults
65
- h['puppetserver-confdir'] = '/etc/puppetlabs/puppetserver/conf.d'
66
- h['puppetservice'] = 'puppetserver'
67
- h['puppetbindir'] = '/opt/puppetlabs/agent/bin'
68
- h['puppetbin'] = "#{h['puppetbindir']}/puppet"
69
- h['puppetpath'] = '/etc/puppetlabs/agent'
70
- h['puppetconfdir'] = "#{h['puppetpath']}/config"
71
- h['puppetcodedir'] = "#{h['puppetpath']}/code"
72
- h['puppetvardir'] = '/opt/puppetlabs/agent/cache'
73
- h['distmoduledir'] = "#{h['puppetcodedir']}/modules"
74
- h['sitemoduledir'] = '/opt/puppetlabs/agent/modules'
75
- h['hieraconf'] = "#{h['puppetcodedir']}/hiera.yaml"
76
- h['hieradatadir'] = "#{h['puppetcodedir']}/hieradata"
77
- h
64
+ h = Beaker::Options::OptionsHash.new
65
+ h.merge({
66
+ 'user' => 'root',
67
+ 'group' => 'puppet',
68
+ 'puppetserver-confdir' => '/etc/puppetlabs/puppetserver/conf.d',
69
+ 'puppetservice' => 'puppetserver',
70
+ 'puppetpath' => '/etc/puppetlabs/puppet',
71
+ 'puppetconfdir' => '/etc/puppetlabs/puppet',
72
+ 'puppetvardir' => '/opt/puppetlabs/puppet/cache',
73
+ 'puppetbin' => '/opt/puppetlabs/puppet/bin/puppet',
74
+ 'puppetbindir' => '/opt/puppetlabs/bin',
75
+ 'systembindir' => '/usr/bin',
76
+ 'hieradatadir' => '/etc/puppetlabs/code/hieradata',
77
+ 'hieraconf' => '/etc/puppetlabs/code/hiera.yaml',
78
+ 'distmoduledir' => '/etc/puppetlabs/code/modules',
79
+ 'sitemoduledir' => '/opt/puppetlabs/puppet/modules',
80
+ 'pathseparator' => ':',
81
+ })
78
82
  end
79
83
  end
80
84
  end
@@ -55,7 +55,24 @@ module Windows
55
55
  end
56
56
 
57
57
  def self.aio_defaults
58
- self.foss_defaults
58
+ h = Beaker::Options::OptionsHash.new
59
+ h.merge({
60
+ 'user' => 'Administrator',
61
+ 'group' => 'Administrators',
62
+ # 'puppetserver-confdir' not applicable on Windows
63
+ # 'puppetservice' not applicable on Windows
64
+ 'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
65
+ 'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
66
+ 'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/cache',
67
+ # 'puppetbin' not required on Windows
68
+ 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/sys/ruby/bin',
69
+ # systembindir not required on Windows
70
+ 'hieradatadir' => '`cygpath -smF 35`/Puppetlabs/code/hieradata',
71
+ 'hieraconf' => '`cygpath -smF 35`/Puppetlabs/code/hiera.yaml',
72
+ 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/code/modules',
73
+ # sitemoduledir not included (check PUP-4049 for more info)
74
+ 'pathseparator' => ';',
75
+ })
59
76
  end
60
77
  end
61
78
  end
@@ -12,4 +12,9 @@ module Windows::File
12
12
  def path_split(paths)
13
13
  paths.split(';')
14
14
  end
15
+
16
+ def file_exist?(path)
17
+ result = exec(Beaker::Command.new("test -e #{path}"), :acceptable_exit_codes => [0, 1])
18
+ result.exit_code == 0
19
+ end
15
20
  end
@@ -14,6 +14,7 @@ module Beaker
14
14
  TRIES = 5
15
15
  UNIX_PACKAGES = ['curl', 'ntpdate']
16
16
  WINDOWS_PACKAGES = ['curl']
17
+ PSWINDOWS_PACKAGES = []
17
18
  SLES_PACKAGES = ['curl', 'ntp']
18
19
  DEBIAN_PACKAGES = ['curl', 'ntpdate', 'lsb-release']
19
20
  CUMULUS_PACKAGES = ['addons', 'ntpdate', 'lsb-release']
@@ -76,7 +77,8 @@ module Beaker
76
77
  # {HostPrebuiltSteps::SLES_PACKAGES} on SUSE platform hosts,
77
78
  # {HostPrebuiltSteps::DEBIAN_PACKAGES} on debian platform hosts,
78
79
  # {HostPrebuiltSteps::CUMULUS_PACKAGES} on cumulus platform hosts,
79
- # and {HostPrebuiltSteps::WINDOWS_PACKAGES} on windows platform hosts.
80
+ # {HostPrebuiltSteps::WINDOWS_PACKAGES} on cygwin-installed windows platform hosts,
81
+ # and {HostPrebuiltSteps::PSWINDOWS_PACKAGES} on non-cygwin windows platform hosts.
80
82
  #
81
83
  # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon
82
84
  # @param [Hash{Symbol=>String}] opts Options to alter execution.
@@ -91,8 +93,10 @@ module Beaker
91
93
  check_and_install_packages_if_needed(host, DEBIAN_PACKAGES)
92
94
  when host['platform'] =~ /cumulus/
93
95
  check_and_install_packages_if_needed(host, CUMULUS_PACKAGES)
94
- when host['platform'] =~ /windows/
96
+ when (host['platform'] =~ /windows/ and host.is_cygwin?)
95
97
  check_and_install_packages_if_needed(host, WINDOWS_PACKAGES)
98
+ when (host['platform'] =~ /windows/ and not host.is_cygwin?)
99
+ check_and_install_packages_if_needed(host, PSWINDOWS_PACKAGES)
96
100
  when host['platform'] !~ /debian|aix|solaris|windows|sles-|osx-|cumulus/
97
101
  check_and_install_packages_if_needed(host, UNIX_PACKAGES)
98
102
  end
@@ -296,9 +300,11 @@ module Beaker
296
300
  logger = opts[:logger]
297
301
  block_on host do |host|
298
302
  logger.debug "Give root a copy of current user's keys, on #{host.name}"
299
- if host['platform'] =~ /windows/
303
+ if host['platform'] =~ /windows/ and host.is_cygwin?
300
304
  host.exec(Command.new('cp -r .ssh /cygdrive/c/Users/Administrator/.'))
301
305
  host.exec(Command.new('chown -R Administrator /cygdrive/c/Users/Administrator/.ssh'))
306
+ elsif host['platform'] =~ /windows/ and not host.is_cygwin?
307
+ host.exec(Command.new("if exist .ssh (xcopy .ssh C:\\Users\\Administrator\\.ssh /s /e)"))
302
308
  elsif host['platform'] =~ /osx/
303
309
  host.exec(Command.new('sudo cp -r .ssh /var/root/.'), {:pty => true})
304
310
  else
@@ -433,7 +439,11 @@ module Beaker
433
439
  # @param [String] val The string to 'echo' on the host
434
440
  def echo_on_host host, val
435
441
  #val = val.gsub(/"/, "\"").gsub(/\(/, "\(")
436
- host.exec(Command.new("echo \"#{val}\"")).stdout.chomp
442
+ if host.is_cygwin?
443
+ host.exec(Command.new("echo \"#{val}\"")).stdout.chomp
444
+ else
445
+ host.exec(Command.new("echo #{val}")).stdout.chomp
446
+ end
437
447
  end
438
448
 
439
449
  # Create the hash of default environment from host (:host_env), global options hash (:host_env) and default PE/Foss puppet variables
@@ -463,7 +473,7 @@ module Beaker
463
473
  env['RUBYLIB'].map! { |val| echo_on_host(host, val) }
464
474
 
465
475
  env.each_key do |key|
466
- env[key] = env[key].join(':')
476
+ env[key] = env[key].join(host['pathseparator'])
467
477
  end
468
478
  env
469
479
  end
@@ -479,10 +489,14 @@ module Beaker
479
489
  logger.debug("setting local environment on #{host.name}")
480
490
  case host['platform']
481
491
  when /windows/
482
- host.exec(Command.new("echo '\nPermitUserEnvironment yes' >> /etc/sshd_config"))
483
- host.exec(Command.new("cygrunsrv -E sshd"))
484
- host.exec(Command.new("cygrunsrv -S sshd"))
485
- env['CYGWIN'] = 'nodosfilewarning'
492
+ if host.is_cygwin?
493
+ host.exec(Command.new("echo '\nPermitUserEnvironment yes' >> /etc/sshd_config"))
494
+ host.exec(Command.new("cygrunsrv -E sshd"))
495
+ host.exec(Command.new("cygrunsrv -S sshd"))
496
+ env['CYGWIN'] = 'nodosfilewarning'
497
+ else
498
+ #nothing to do here
499
+ end
486
500
  when /osx/
487
501
  host.exec(Command.new("echo '\nPermitUserEnvironment yes' >> /etc/sshd_config"))
488
502
  host.exec(Command.new("launchctl unload /System/Library/LaunchDaemons/ssh.plist"))
@@ -505,22 +519,30 @@ module Beaker
505
519
  host.exec(Command.new("startsrc -g ssh"))
506
520
  end
507
521
 
508
- #ensure that ~/.ssh/environment exists
509
- host.exec(Command.new("mkdir -p #{Pathname.new(host[:ssh_env_file]).dirname}"))
510
- host.exec(Command.new("chmod 0600 #{Pathname.new(host[:ssh_env_file]).dirname}"))
511
- host.exec(Command.new("touch #{host[:ssh_env_file]}"))
512
-
513
- #add the constructed env vars to this host
514
- host.add_env_var('RUBYLIB', '$RUBYLIB')
515
- host.add_env_var('PATH', '$PATH')
522
+ if host['platform'] !~ /windows/ or (host['platform'] =~ /windows/ and host.is_cygwin?)
523
+ #ensure that ~/.ssh/environment exists
524
+ host.exec(Command.new("mkdir -p #{Pathname.new(host[:ssh_env_file]).dirname}"))
525
+ host.exec(Command.new("chmod 0600 #{Pathname.new(host[:ssh_env_file]).dirname}"))
526
+ host.exec(Command.new("touch #{host[:ssh_env_file]}"))
527
+ #add the constructed env vars to this host
528
+ host.add_env_var('RUBYLIB', '$RUBYLIB')
529
+ host.add_env_var('PATH', '$PATH')
530
+ end
531
+ #add the env var set to this test host
516
532
  env.each_pair do |var, value|
517
533
  host.add_env_var(var, value)
518
534
  end
519
535
 
520
- host.exec(Command.new("cat #{host[:ssh_env_file]}"))
521
-
522
536
  #close the host to re-establish the connection with the new sshd settings
523
537
  host.close
538
+
539
+ # print out the working env
540
+ if host.is_cygwin?
541
+ host.exec(Command.new("cat #{host[:ssh_env_file]}"))
542
+ else
543
+ host.exec(Command.new("SET"))
544
+ end
545
+
524
546
  end
525
547
  end
526
548
 
@@ -110,7 +110,9 @@ module Beaker
110
110
  if @options[:disable_iptables]
111
111
  disable_iptables @hosts, @options
112
112
  end
113
- set_env(@hosts, @options)
113
+ if @options[:set_env]
114
+ set_env(@hosts, @options)
115
+ end
114
116
  end
115
117
 
116
118
  #Default validation steps to be run for a given hypervisor. Ensures that SUTs meet requirements to be
@@ -119,15 +119,15 @@ module Beaker
119
119
  sshd_options = ''
120
120
 
121
121
  # add platform-specific actions
122
+ service_name = "sshd"
122
123
  case host['platform']
123
124
  when /ubuntu/, /debian/
124
- sshd_options = '-o "PermitRootLogin yes" -o "PasswordAuthentication yes"'
125
+ service_name = "ssh"
125
126
  dockerfile += <<-EOF
126
127
  RUN apt-get update
127
128
  RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::DEBIAN_PACKAGES.join(' ')}
128
129
  EOF
129
130
  when /cumulus/
130
- sshd_options = '-o "PermitRootLogin yes" -o "PasswordAuthentication yes"'
131
131
  dockerfile += <<-EOF
132
132
  RUN apt-get update
133
133
  RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::CUMULUS_PACKAGES.join(' ')}
@@ -140,11 +140,11 @@ module Beaker
140
140
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
141
141
  EOF
142
142
  when /opensuse/, /sles/
143
- sshd_options = '-o "PermitRootLogin yes" -o "PasswordAuthentication yes" -o "UsePAM no"'
144
143
  dockerfile += <<-EOF
145
144
  RUN zypper -n in openssh #{Beaker::HostPrebuiltSteps::SLES_PACKAGES.join(' ')}
146
145
  RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
147
146
  RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
147
+ RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
148
148
  EOF
149
149
  else
150
150
  # TODO add more platform steps here
@@ -157,6 +157,13 @@ module Beaker
157
157
  RUN echo root:#{root_password} | chpasswd
158
158
  EOF
159
159
 
160
+ # Configure sshd service to allowroot login using password
161
+ dockerfile += <<-EOF
162
+ RUN sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
163
+ RUN sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
164
+ EOF
165
+
166
+
160
167
  # Any extra commands specified for the host
161
168
  dockerfile += (host['docker_image_commands'] || []).map { |command|
162
169
  "RUN #{command}\n"
@@ -168,7 +175,8 @@ module Beaker
168
175
  end
169
176
 
170
177
  # How to start a sshd on port 22. May be an init for more supervision
171
- cmd = host['docker_cmd'] || "/usr/sbin/sshd -D #{sshd_options}"
178
+ # Ensure that the ssh server can be restarted (done from set_env) and container keeps running
179
+ cmd = host['docker_cmd'] || ["sh","-c","service #{service_name} start ; tail -f /dev/null"]
172
180
  dockerfile += <<-EOF
173
181
  EXPOSE 22
174
182
  CMD #{cmd}
@@ -44,7 +44,8 @@ module Beaker
44
44
  :provider => :openstack,
45
45
  :openstack_api_key => @options[:openstack_api_key],
46
46
  :openstack_username => @options[:openstack_username],
47
- :openstack_auth_url => @options[:openstack_auth_url])
47
+ :openstack_auth_url => @options[:openstack_auth_url],
48
+ :openstack_tenant => @options[:openstack_tenant])
48
49
  if not @network_client
49
50
 
50
51
  raise "Unable to create OpenStack Network instance (api_key: #{@options[:openstack_api_key]}, username: #{@options[:openstack_username]}, auth_url: #{@options[:openstack_auth_url]}, tenant: #{@options[:openstack_tenant]})"
@@ -88,10 +89,7 @@ module Beaker
88
89
  :nics => [ {'net_id' => network(@options[:openstack_network]).id } ],
89
90
  :name => host[:vmhostname],
90
91
  }
91
- if @options[:openstack_keyname]
92
- @logger.debug "Adding optional key_name #{@options[:openstack_keyname]} to #{host.name} (#{host[:vmhostname]})"
93
- options[:key_name] = @options[:openstack_keyname]
94
- end
92
+ options[:key_name] = key_name(host)
95
93
  vm = @compute_client.servers.create(options)
96
94
 
97
95
  #wait for the new instance to start up
@@ -149,6 +147,10 @@ module Beaker
149
147
  end
150
148
  @logger.debug "Destroying OpenStack host #{vm.name}"
151
149
  vm.destroy
150
+ if @options[:openstack_keyname].nil?
151
+ @logger.debug "Deleting random keypair"
152
+ @compute_client.delete_key_pair vm.name
153
+ end
152
154
  end
153
155
  end
154
156
 
@@ -175,5 +177,26 @@ module Beaker
175
177
  end
176
178
  end
177
179
 
180
+ #Get key_name from options or generate a new rsa key and add it to
181
+ #OpenStack keypairs
182
+ #
183
+ #@param [Host] host The OpenStack host to provision
184
+ #@return [String] key_name
185
+ #@api private
186
+ def key_name(host)
187
+ if @options[:openstack_keyname]
188
+ @logger.debug "Adding optional key_name #{@options[:openstack_keyname]} to #{host.name} (#{host[:vmhostname]})"
189
+ @options[:openstack_keyname]
190
+ else
191
+ @logger.debug "Generate a new rsa key"
192
+ key = OpenSSL::PKey::RSA.new 2048
193
+ type = key.ssh_type
194
+ data = [ key.to_blob ].pack('m0')
195
+ @logger.debug "Creating Openstack keypair for public key '#{type} #{data}'"
196
+ @compute_client.create_key_pair host[:vmhostname], "#{type} #{data}"
197
+ host['ssh'][:key_data] = [ key.to_pem ]
198
+ host[:vmhostname]
199
+ end
200
+ end
178
201
  end
179
202
  end
@@ -143,6 +143,7 @@ module Beaker
143
143
  :accept_all_exit_codes => false,
144
144
  :timesync => false,
145
145
  :disable_iptables => false,
146
+ :set_env => true,
146
147
  :repo_proxy => false,
147
148
  :package_proxy => false,
148
149
  :add_el_extras => false,
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '2.5.0'
3
+ STRING = '2.5.1'
4
4
  end
5
5
  end
@@ -258,7 +258,19 @@ describe ClassMixedWithDSLHelpers do
258
258
  end
259
259
  end
260
260
 
261
- describe '#create_remote_file' do
261
+ describe '#rsync_to' do
262
+ it 'delegates to the host' do
263
+ allow( subject ).to receive( :hosts ).and_return( hosts )
264
+
265
+ hosts.each do |host|
266
+ expect( host ).to receive( :do_rsync_to ).and_return( result )
267
+ end
268
+
269
+ subject.rsync_to( hosts, '/var/log/my.log', 'log/my.log' )
270
+ end
271
+ end
272
+
273
+ describe '#create_remote_file using scp' do
262
274
  it 'scps the contents passed in to the hosts' do
263
275
  my_opts = { :silent => true }
264
276
  tmpfile = double
@@ -277,6 +289,25 @@ describe ClassMixedWithDSLHelpers do
277
289
  end
278
290
  end
279
291
 
292
+ describe '#create_remote_file using rsync' do
293
+ it 'scps the contents passed in to the hosts' do
294
+ my_opts = { :silent => true, :protocol => 'rsync' }
295
+ tmpfile = double
296
+
297
+ expect( tmpfile ).to receive( :path ).exactly( 2 ).times.
298
+ and_return( '/local/path/to/blah' )
299
+
300
+ expect( Tempfile ).to receive( :open ).and_yield( tmpfile )
301
+
302
+ expect( File ).to receive( :open )
303
+
304
+ expect( subject ).to receive( :rsync_to ).
305
+ with( hosts, '/local/path/to/blah', '/remote/path', my_opts )
306
+
307
+ subject.create_remote_file( hosts, '/remote/path', 'blah', my_opts )
308
+ end
309
+ end
310
+
280
311
  describe '#create_tmpdir_for_user' do
281
312
  let(:host) { {} }
282
313
  let(:result) { double.as_null_object }
@@ -784,12 +815,6 @@ describe ClassMixedWithDSLHelpers do
784
815
  let( :result_pass ) { Beaker::Result.new( [], "" ) }
785
816
  before :each do
786
817
  allow( subject ).to receive( :sleep ).and_return( true )
787
- result_fail.stdout = 'stdout'
788
- result_fail.stderr = 'stderr'
789
- result_fail.exit_code = 1
790
- result_pass.stdout = 'stdout'
791
- result_pass.stderr = 'stderr'
792
- result_pass.exit_code = 0
793
818
  end
794
819
 
795
820
  it 'runs the pe-puppet on a system without pe-puppet-agent' do
@@ -797,9 +822,9 @@ describe ClassMixedWithDSLHelpers do
797
822
  deb_agent = make_host( 'deb', :platform => 'debian-7-amd64' )
798
823
  allow( deb_agent ).to receive( :puppet ).and_return( { 'vardir' => vardir } )
799
824
 
800
- allow( subject ).to receive( :hosts ).and_return( hosts )
801
- expect( subject ).to receive( :on ).with( deb_agent, "[ -e '#{vardir}/state/agent_catalog_run.lock' ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
802
- expect( subject ).to receive( :on ).with( deb_agent, "[ -e /etc/init.d/pe-puppet-agent ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
825
+ expect( deb_agent ).to receive( :file_exist? ).with("/var/state/agent_catalog_run.lock").and_return(false)
826
+ expect( deb_agent ).to receive( :file_exist? ).with("/etc/init.d/pe-puppet-agent").and_return(false)
827
+
803
828
  expect( subject ).to receive( :puppet_resource ).with( "service", "pe-puppet", "ensure=stopped").once
804
829
  expect( subject ).to receive( :on ).once
805
830
 
@@ -812,10 +837,10 @@ describe ClassMixedWithDSLHelpers do
812
837
  el_agent = make_host( 'el', :platform => 'el-5-x86_64' )
813
838
  allow( el_agent ).to receive( :puppet ).and_return( { 'vardir' => vardir } )
814
839
 
815
- allow( subject ).to receive( :hosts ).and_return( hosts )
816
- expect( subject ).to receive( :on ).with( el_agent, "[ -e '#{vardir}/state/agent_catalog_run.lock' ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
817
- expect( subject ).to receive( :on ).with( el_agent, "[ -e /etc/init.d/pe-puppet-agent ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_pass )
818
- expect( subject ).to receive( :puppet_resource ).with("service", "pe-puppet-agent", "ensure=stopped").once
840
+ expect( el_agent ).to receive( :file_exist? ).with("/var/state/agent_catalog_run.lock").and_return(false)
841
+ expect( el_agent ).to receive( :file_exist? ).with("/etc/init.d/pe-puppet-agent").and_return(true)
842
+
843
+ expect( subject ).to receive( :puppet_resource ).with( "service", "pe-puppet-agent", "ensure=stopped").once
819
844
  expect( subject ).to receive( :on ).once
820
845
 
821
846
  subject.stop_agent_on( el_agent )
@@ -916,6 +941,12 @@ describe ClassMixedWithDSLHelpers do
916
941
  }.to raise_error(RuntimeError, /puppet conf backup failed/)
917
942
  end
918
943
 
944
+ it 'receives a Minitest::Assertion and fails the test correctly' do
945
+ allow( subject ).to receive( :backup_the_file ).and_raise( Minitest::Assertion.new('assertion failed!') )
946
+ expect( subject ).to receive( :fail_test )
947
+ subject.with_puppet_running_on(host, {})
948
+ end
949
+
919
950
  describe 'with puppet-server' do
920
951
  let(:default_confdir) { "/etc/puppet" }
921
952
  let(:default_vardir) { "/var/lib/puppet" }
@@ -958,8 +989,11 @@ describe ClassMixedWithDSLHelpers do
958
989
  stub_post_setup
959
990
  allow( subject ).to receive( :options) .and_return( {:is_puppetserver => true})
960
991
  allow( subject ).to receive( :modify_tk_config)
961
- allow( host ).to receive(:puppet).with('master') .and_return({'confdir' => default_confdir,
962
- 'vardir' => default_vardir})
992
+ allow( host ).to receive(:puppet).with( any_args ).and_return({
993
+ 'confdir' => default_confdir,
994
+ 'vardir' => default_vardir,
995
+ 'config' => "#{default_confdir}/puppet.conf"
996
+ })
963
997
  end
964
998
 
965
999
  describe 'and command line args passed' do
@@ -1087,7 +1121,7 @@ describe ClassMixedWithDSLHelpers do
1087
1121
  execution = 0
1088
1122
  expect do
1089
1123
  subject.with_puppet_running_on(host, {}) do
1090
- expect(host).to execute_commands_matching(/^puppet master/).once
1124
+ expect(host).to execute_commands_matching(/^puppet master/).exactly(4).times
1091
1125
  execution += 1
1092
1126
  end
1093
1127
  end.to change { execution }.by(1)
@@ -1103,9 +1137,22 @@ describe ClassMixedWithDSLHelpers do
1103
1137
  end
1104
1138
 
1105
1139
  describe 'backup and restore of puppet.conf' do
1106
- let(:original_location) { "#{host['puppetpath']}/puppet.conf" }
1107
- let(:backup_location) { "#{tmpdir_path}/puppet.conf.bak" }
1108
- let(:new_location) { "#{tmpdir_path}/puppet.conf" }
1140
+ before :each do
1141
+ mock_puppetconf_reader = Object.new
1142
+ allow( mock_puppetconf_reader ).to receive( :[] ).with( 'config' ).and_return( '/root/mock/puppet.conf' )
1143
+ allow( mock_puppetconf_reader ).to receive( :[] ).with( 'confdir' ).and_return( '/root/mock' )
1144
+ allow( host ).to receive( :puppet ).with( any_args ).and_return( mock_puppetconf_reader )
1145
+ end
1146
+
1147
+ let(:original_location) { host.puppet['config'] }
1148
+ let(:backup_location) {
1149
+ filename = File.basename(host.puppet['config'])
1150
+ File.join(tmpdir_path, "#{filename}.bak")
1151
+ }
1152
+ let(:new_location) {
1153
+ filename = File.basename(host.puppet['config'])
1154
+ File.join(tmpdir_path, filename)
1155
+ }
1109
1156
 
1110
1157
  context 'when a puppetservice is used' do
1111
1158
  let(:use_service) { true }
@@ -1299,13 +1346,13 @@ describe ClassMixedWithDSLHelpers do
1299
1346
  let(:hierarchy) { [ 'nodes/%{::fqdn}', 'common' ] }
1300
1347
  it 'on FOSS host' do
1301
1348
  host = make_host('testhost', { :platform => 'ubuntu' } )
1302
- expect(subject).to receive(:create_remote_file).with(host, host[:hieraconf], /#{host[:hieradatadir]}/)
1349
+ expect(subject).to receive(:create_remote_file).with(host, host.puppet['hiera_config'], /#{host[:hieradatadir]}/)
1303
1350
  subject.write_hiera_config_on(host, hierarchy)
1304
1351
  end
1305
1352
 
1306
1353
  it 'on PE host' do
1307
1354
  host = make_host('testhost', { :platform => 'ubuntu', :type => 'pe' } )
1308
- expect(subject).to receive(:create_remote_file).with(host, host[:hieraconf], /#{host[:hieradatadir]}/)
1355
+ expect(subject).to receive(:create_remote_file).with(host, host.puppet['hiera_config'], /#{host[:hieradatadir]}/)
1309
1356
  subject.write_hiera_config_on(host, hierarchy)
1310
1357
  end
1311
1358