beaker 2.5.0 → 2.5.1

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.
@@ -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