beaker 2.24.0 → 2.25.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.
@@ -36,9 +36,13 @@ module Beaker
36
36
  # @param [String] step_name The name of the step to be logged.
37
37
  # @param [Proc] block The actions to be performed in this step.
38
38
  def step step_name, &block
39
- logger.notify "\n * #{step_name}\n"
39
+ logger.notify "\n* #{step_name}\n"
40
40
  set_current_step_name(step_name)
41
- yield if block_given?
41
+ if block_given?
42
+ logger.step_in()
43
+ yield
44
+ logger.step_out()
45
+ end
42
46
  end
43
47
 
44
48
  # Provides a method to name tests.
@@ -49,7 +53,11 @@ module Beaker
49
53
  def test_name my_name, &block
50
54
  logger.notify "\n#{my_name}\n"
51
55
  set_current_test_name(my_name)
52
- yield if block_given?
56
+ if block_given?
57
+ logger.step_in()
58
+ yield
59
+ logger.step_out()
60
+ end
53
61
  end
54
62
 
55
63
  # Declare a teardown process that will be called after a test case is
@@ -170,6 +178,12 @@ module Beaker
170
178
  # @example Confining from an already defined subset of hosts
171
179
  # confine :except, {}, agents
172
180
  #
181
+ # @example Confining to all ubuntu agents + all non-agents
182
+ # confine :to, { :platform => 'ubuntu' }, agents
183
+ #
184
+ # @example Confining to any non-windows agents + all non-agents
185
+ # confine :except, { :platform => 'windows' }, agents
186
+ #
173
187
  #
174
188
  # @return [Array<Host>] Returns an array of hosts that are still valid
175
189
  # targets for this tests case.
@@ -177,17 +191,18 @@ module Beaker
177
191
  # this test case after confinement.
178
192
  def confine(type, criteria, host_array = nil, &block)
179
193
  hosts_to_modify = Array( host_array || hosts )
194
+ hosts_not_modified = hosts - hosts_to_modify #we aren't examining these hosts
180
195
  case type
181
196
  when :except
182
197
  if criteria and ( not criteria.empty? )
183
- hosts_to_modify = hosts_to_modify - select_hosts(criteria, hosts_to_modify, &block)
198
+ hosts_to_modify = hosts_to_modify - select_hosts(criteria, hosts_to_modify, &block) + hosts_not_modified
184
199
  else
185
200
  # confining to all hosts *except* provided array of hosts
186
- hosts_to_modify = hosts - host_array
201
+ hosts_to_modify = hosts_not_modified
187
202
  end
188
203
  when :to
189
204
  if criteria and ( not criteria.empty? )
190
- hosts_to_modify = select_hosts(criteria, hosts_to_modify, &block)
205
+ hosts_to_modify = select_hosts(criteria, hosts_to_modify, &block) + hosts_not_modified
191
206
  else
192
207
  # confining to only hosts in provided array of hosts
193
208
  end
@@ -214,7 +229,13 @@ module Beaker
214
229
 
215
230
  yield
216
231
 
217
- rescue Beaker::DSL::Outcomes::SkipTest
232
+ rescue Beaker::DSL::Outcomes::SkipTest => e
233
+ # I don't like this much, but adding options to confine is a breaking change
234
+ # to the DSL that would involve a major version bump
235
+ if e.message !~ /No suitable hosts found/
236
+ # a skip generated from the provided block, pass it up the chain
237
+ raise e
238
+ end
218
239
  ensure
219
240
  self.hosts = original_hosts
220
241
  end
@@ -274,9 +274,11 @@ module Beaker
274
274
  # and they shouldn't be ssh specific
275
275
  result = nil
276
276
 
277
+ @logger.step_in()
277
278
  seconds = Benchmark.realtime {
278
279
  result = connection.execute(cmdline, options, output_callback)
279
280
  }
281
+ @logger.step_out()
280
282
 
281
283
  if not options[:silent]
282
284
  @logger.debug "\n#{log_prefix} executed in %0.2f seconds" % seconds
@@ -160,7 +160,7 @@ module Beaker
160
160
  # @return [String, String, String] The URL, arch and package name for EPL for the provided host
161
161
  # @param [Hash{Symbol=>String}] opts Options to alter execution.
162
162
  # @option opts [String] :epel_url Link to download
163
- # @option opts [String] :epel_arch Architecture to download (i386, x86_64, etc), defaults to i386
163
+ # @option opts [String] :epel_arch Architecture to download (i386, x86_64, etc), defaults to i386 for 5 and 6, x86_64 for 7
164
164
  # @option opts [String] :epel_6_pkg Package to download from provided link for el-6
165
165
  # @option opts [String] :epel_5_pkg Package to download from provided link for el-5
166
166
  # @raise [Exception] Raises an error if the host provided's platform != /el-(5|6)/
@@ -170,16 +170,23 @@ module Beaker
170
170
  end
171
171
 
172
172
  version = host['platform'].version
173
- if version == '6'
174
- url = "#{host[:epel_url] || opts[:epel_url]}/#{version}"
173
+ url = "#{host[:epel_url] || opts[:epel_url]}/#{version}"
174
+ if version == '7'
175
+ if opts[:epel_7_arch] == 'i386'
176
+ raise ArgumentError.new("epel-7 does not provide packages for i386")
177
+ end
178
+ pkg = host[:epel_pkg] || opts[:epel_7_pkg]
179
+ arch = opts[:epel_7_arch] || 'x86_64'
180
+ elsif version == '6'
175
181
  pkg = host[:epel_pkg] || opts[:epel_6_pkg]
182
+ arch = host[:epel_arch] || opts[:epel_6_arch] || 'i386'
176
183
  elsif version == '5'
177
- url = "#{host[:epel_url] || opts[:epel_url]}/#{version}"
178
184
  pkg = host[:epel_pkg] || opts[:epel_5_pkg]
185
+ arch = host[:epel_arch] || opts[:epel_5_arch] || 'i386'
179
186
  else
180
- raise "epel_info_for does not support el version #{version}, on #{host.name}"
187
+ raise ArgumentError.new("epel_info_for does not support el version #{version}, on #{host.name}")
181
188
  end
182
- return url, host[:epel_arch] || opts[:epel_arch] || 'i386', pkg
189
+ return url, arch, pkg
183
190
  end
184
191
 
185
192
  # Run 'apt-get update' on the provided host or hosts.
@@ -237,7 +244,7 @@ module Beaker
237
244
  report_and_raise(logger, e, "proxy_config")
238
245
  end
239
246
 
240
- #Install EPEL on host or hosts with platform = /el-(5|6)/. Do nothing on host or hosts of other platforms.
247
+ #Install EPEL on host or hosts with platform = /el-(5|6|7)/. Do nothing on host or hosts of other platforms.
241
248
  # @param [Host, Array<Host>] host One or more hosts to act upon. Will use individual host epel_url, epel_arch
242
249
  # and epel_pkg before using defaults provided in opts.
243
250
  # @param [Hash{Symbol=>String}] opts Options to alter execution.
@@ -245,6 +252,7 @@ module Beaker
245
252
  # @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
246
253
  # @option opts [String] :epel_url Link to download from
247
254
  # @option opts [String] :epel_arch Architecture of epel to download (i386, x86_64, etc)
255
+ # @option opts [String] :epel_7_pkg Package to download from provided link for el-7
248
256
  # @option opts [String] :epel_6_pkg Package to download from provided link for el-6
249
257
  # @option opts [String] :epel_5_pkg Package to download from provided link for el-5
250
258
  def add_el_extras( host, opts )
@@ -254,11 +262,15 @@ module Beaker
254
262
  debug_opt = opts[:debug] ? 'vh' : ''
255
263
  block_on host do |host|
256
264
  case
257
- when el_based?(host) && ['5','6'].include?(host['platform'].version)
265
+ when el_based?(host) && ['5','6','7'].include?(host['platform'].version)
258
266
  result = host.exec(Command.new('rpm -qa | grep epel-release'), :acceptable_exit_codes => [0,1])
259
267
  if result.exit_code == 1
260
268
  url, arch, pkg = epel_info_for host, opts
261
- host.exec(Command.new("rpm -i#{debug_opt} #{url}/#{arch}/#{pkg}"))
269
+ if host['platform'].version == '7'
270
+ host.exec(Command.new("rpm -i#{debug_opt} #{url}/#{arch}/e/#{pkg}"))
271
+ else
272
+ host.exec(Command.new("rpm -i#{debug_opt} #{url}/#{arch}/#{pkg}"))
273
+ end
262
274
  #update /etc/yum.repos.d/epel.repo for new baseurl
263
275
  host.exec(Command.new("sed -i -e 's;#baseurl.*$;baseurl=#{Regexp.escape(url)}/\$basearch;' /etc/yum.repos.d/epel.repo"))
264
276
  #remove mirrorlist
@@ -92,6 +92,7 @@ module Beaker
92
92
  def cleanup
93
93
  # Provisioning should have set the host 'instance' values.
94
94
  kill_instances(@hosts.map{|h| h['instance']}.select{|x| !x.nil?})
95
+ delete_key_pair_all_regions()
95
96
  nil
96
97
  end
97
98
 
@@ -193,6 +194,7 @@ module Beaker
193
194
  end
194
195
  end
195
196
  end
197
+ delete_key_pair_all_regions(key_name_prefix)
196
198
 
197
199
  @logger.notify "#{key}: Killed #{kill_count} instance(s)"
198
200
  end
@@ -665,13 +667,23 @@ module Beaker
665
667
  File.read(key_file)
666
668
  end
667
669
 
670
+ # Generate a key prefix for key pair names
671
+ #
672
+ # @note This is the part of the key that will stay static between Beaker
673
+ # runs on the same host.
674
+ #
675
+ # @return [String] Beaker key pair name based on sanitized hostname
676
+ def key_name_prefix
677
+ safe_hostname = Socket.gethostname.gsub('.', '-')
678
+ "Beaker-#{local_user}-#{safe_hostname}"
679
+ end
680
+
668
681
  # Generate a reusable key name from the local hosts hostname
669
682
  #
670
683
  # @return [String] safe key name for current host
671
684
  # @api private
672
685
  def key_name
673
- safe_hostname = Socket.gethostname.gsub('.', '-')
674
- "Beaker-#{local_user}-#{safe_hostname}"
686
+ "#{key_name_prefix}-#{@options[:timestamp].strftime("%F_%H_%M_%S")}"
675
687
  end
676
688
 
677
689
  # Returns the local user running this tool
@@ -682,22 +694,86 @@ module Beaker
682
694
  ENV['USER']
683
695
  end
684
696
 
685
- # Returns the KeyPair for this host, creating it if needed
697
+ # Creates the KeyPair for this test run
686
698
  #
687
699
  # @param region [AWS::EC2::Region] region to create the key pair in
688
700
  # @return [AWS::EC2::KeyPair] created key_pair
689
701
  # @api private
690
702
  def ensure_key_pair(region)
691
- @logger.notify("aws-sdk: Ensure key pair exists, create if not")
692
- key_pairs = region.key_pairs
693
703
  pair_name = key_name()
694
- kp = key_pairs[pair_name]
695
- unless kp.exists?
696
- ssh_string = public_key()
697
- kp = key_pairs.import(pair_name, ssh_string)
704
+ delete_key_pair(region, pair_name)
705
+ create_new_key_pair(region, pair_name)
706
+ end
707
+
708
+ # Deletes key pairs from all regions
709
+ #
710
+ # @param [String] keypair_name_filter if given, will get all keypairs that match
711
+ # a simple {::String#start_with?} filter. If no filter is given, the basic key
712
+ # name returned by {#key_name} will be used.
713
+ #
714
+ # @return nil
715
+ # @api private
716
+ def delete_key_pair_all_regions(keypair_name_filter=nil)
717
+ region_keypairs_hash = my_key_pairs(keypair_name_filter)
718
+ region_keypairs_hash.each_pair do |region, keypair_name_array|
719
+ keypair_name_array.each do |keypair_name|
720
+ delete_key_pair(region, keypair_name)
721
+ end
722
+ end
723
+ end
724
+
725
+ # Gets the Beaker user's keypairs by region
726
+ #
727
+ # @param [String] name_filter if given, will get all keypairs that match
728
+ # a simple {::String#start_with?} filter. If no filter is given, the basic key
729
+ # name returned by {#key_name} will be used.
730
+ #
731
+ # @return [Hash{AWS::EC2::Region=>Array[String]}] a hash of region instance to
732
+ # an array of the keypair names that match for the filter
733
+ # @api private
734
+ def my_key_pairs(name_filter=nil)
735
+ keypairs_by_region = {}
736
+ keyname_default = key_name()
737
+ keyname_filtered = "#{name_filter}-*"
738
+ @ec2.regions.each do |region|
739
+ if name_filter
740
+ aws_name_filter = keyname_filtered
741
+ else
742
+ aws_name_filter = keyname_default
743
+ end
744
+ keypair_collection = region.key_pairs.filter('key-name', aws_name_filter)
745
+ keypair_collection.each do |keypair|
746
+ keypairs_by_region[region] ||= []
747
+ keypairs_by_region[region] << keypair.name
748
+ end
698
749
  end
750
+ keypairs_by_region
751
+ end
699
752
 
700
- kp
753
+ # Deletes a given key pair
754
+ #
755
+ # @param [AWS::EC2::Region] region the region the key belongs to
756
+ # @param [String] pair_name the name of the key to be deleted
757
+ #
758
+ # @api private
759
+ def delete_key_pair(region, pair_name)
760
+ kp = region.key_pairs[pair_name]
761
+ if kp.exists?
762
+ @logger.debug("aws-sdk: delete key pair in region: #{region.name}")
763
+ kp.delete()
764
+ end
765
+ end
766
+
767
+ # Create a new key pair for a given Beaker run
768
+ #
769
+ # @param [AWS::EC2::Region] region the region the key pair will be imported into
770
+ # @param [String] pair_name the name of the key to be created
771
+ #
772
+ # @return [AWS::EC2::KeyPair] key pair created
773
+ def create_new_key_pair(region, pair_name)
774
+ @logger.debug("aws-sdk: generating new key pair: #{pair_name}")
775
+ ssh_string = public_key()
776
+ region.key_pairs.import(pair_name, ssh_string)
701
777
  end
702
778
 
703
779
  # Return a reproducable security group identifier based on input ports
@@ -8,6 +8,9 @@ module Beaker
8
8
  #The results of the most recently run command
9
9
  attr_accessor :last_result
10
10
 
11
+ #Determines the spacing that happens before an output line
12
+ attr_accessor :line_prefix
13
+
11
14
  NORMAL = "\e[00;00m"
12
15
  BRIGHT_NORMAL = "\e[00;01m"
13
16
  BLACK = "\e[00;30m"
@@ -75,6 +78,8 @@ module Beaker
75
78
  end
76
79
 
77
80
  @last_result = nil
81
+ @line_prefix_length = 0
82
+ @line_prefix = ''
78
83
 
79
84
  @destinations = []
80
85
 
@@ -176,6 +181,47 @@ module Beaker
176
181
  end
177
182
  end
178
183
 
184
+ # Prefixes a log line with the appropriate amount of whitespace for the level
185
+ # of test that's running.
186
+ #
187
+ # @param [String] line the line to prefix
188
+ #
189
+ # @return [String] the prefixed line
190
+ def prefix_log_line line
191
+ if line.kind_of?(Array)
192
+ line.map do |s|
193
+ prefix_log_line s
194
+ end
195
+ else
196
+ line.gsub!(/\r/, '')
197
+ has_ending_newline = line.end_with?("\n")
198
+ actual_lines = line.split("\n")
199
+ actual_lines.map! do |actual_line|
200
+ @line_prefix + actual_line
201
+ end
202
+ new_line = actual_lines.join("\n")
203
+ new_line << "\n" if has_ending_newline
204
+ new_line
205
+ end
206
+ end
207
+
208
+ # Sets the step level appropriately for logging to be indented correctly
209
+ #
210
+ # @return nil
211
+ def step_in
212
+ @line_prefix_length += 2
213
+ @line_prefix = ' ' * @line_prefix_length
214
+ end
215
+
216
+ # Sets the step level appropriately for logging to be indented correctly
217
+ #
218
+ # @return nil
219
+ def step_out
220
+ @line_prefix_length -= 2
221
+ @line_prefix_length = 0 if @line_prefix_length < 0
222
+ @line_prefix = ' ' * @line_prefix_length
223
+ end
224
+
179
225
  # Custom reporting for messages generated by host SUTs.
180
226
  # Will not print unless we are at {LOG_LEVELS} 'verbose' or higher.
181
227
  # Strips any color codes already in the provided messages, then adds logger color codes before reporting
@@ -278,9 +324,11 @@ module Beaker
278
324
  # @param [Boolean] add_newline (true) Add newlines between the color codes and the message
279
325
  def optionally_color color_code, msg, add_newline = true
280
326
  print_statement = add_newline ? :puts : :print
327
+ msg = convert(msg)
328
+ msg = prefix_log_line(msg)
281
329
  @destinations.each do |to|
282
330
  to.print color_code if @color
283
- to.send print_statement, convert( msg )
331
+ to.send print_statement, msg
284
332
  to.print NORMAL if @color unless color_code == NONE
285
333
  end
286
334
  end
@@ -165,6 +165,7 @@ module Beaker
165
165
  :add_el_extras => false,
166
166
  :epel_url => "http://mirrors.kernel.org/fedora-epel",
167
167
  :epel_arch => "i386",
168
+ :epel_7_pkg => "epel-release-7-5.noarch.rpm",
168
169
  :epel_6_pkg => "epel-release-6-8.noarch.rpm",
169
170
  :epel_5_pkg => "epel-release-5-4.noarch.rpm",
170
171
  :consoleport => 443,
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '2.24.0'
3
+ STRING = '2.25.0'
4
4
  end
5
5
  end
@@ -1048,10 +1048,10 @@ describe ClassMixedWithDSLInstallUtils do
1048
1048
  allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
1049
1049
  end
1050
1050
 
1051
- def test_fetch_http_file()
1051
+ def test_fetch_http_file(agent_version = '1.0.0')
1052
1052
  expect( subject ).to receive( :configure_type_defaults_on ).with(host)
1053
1053
  expect( subject ).to receive( :fetch_http_file ).with( /[^\/]\z/, anything, anything )
1054
- subject.install_puppet_agent_dev_repo_on( host, opts.merge({ :puppet_agent_version => '1.0.0' }) )
1054
+ subject.install_puppet_agent_dev_repo_on( host, opts.merge({ :puppet_agent_version => agent_version }) )
1055
1055
  end
1056
1056
 
1057
1057
  context 'on windows' do
@@ -1084,20 +1084,31 @@ describe ClassMixedWithDSLInstallUtils do
1084
1084
  @platform = 'solaris-10-x86_64'
1085
1085
  end
1086
1086
 
1087
- it "copies package to the root directory and installs it" do
1088
- expect( subject ).to receive( :link_exists? ).with(/puppet-agent-1\.0\.0-1\.i386\.pkg\.gz/).and_return( true )
1089
- expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-1\.0\.0\-1.i386\.pkg\.gz/, '/' )
1090
- expect( subject ).to receive( :create_remote_file ).with( host, '/noask', /noask file/m )
1091
- expect( subject ).to receive( :on ).with( host, 'gunzip -c puppet-agent-1.0.0-1.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all' )
1092
- test_fetch_http_file
1093
- end
1087
+ [
1088
+ ['1.0.1.786.477', '1.0.1.786.477'],
1089
+ ['1.0.1.786.a477', '1.0.1.786.a477'],
1090
+ ['1.0.1.786.477-', '1.0.1.786.477-'],
1091
+ ['1.0.1.0000786.477', '1.0.1.0000786.477'],
1092
+ ['1.000000.1.786.477', '1.000000.1.786.477'],
1093
+ ['-1.0.1.786.477', '-1.0.1.786.477'],
1094
+ ['1.2.5.38.6813', '1.2.5.38.6813']
1095
+ ].each do |val, expected|
1096
+
1097
+ it "copies package to the root directory and installs it" do
1098
+ expect( subject ).to receive( :link_exists? ).with(/puppet-agent-#{expected}-1\.i386\.pkg\.gz/).and_return( true )
1099
+ expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-#{expected}-1.i386\.pkg\.gz/, '/' )
1100
+ expect( subject ).to receive( :create_remote_file ).with( host, '/noask', /noask file/m )
1101
+ expect( subject ).to receive( :on ).with( host, "gunzip -c puppet-agent-#{expected}-1.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all" )
1102
+ test_fetch_http_file(val)
1103
+ end
1094
1104
 
1095
- it "copies old package to the root directory and installs it" do
1096
- expect( subject ).to receive( :link_exists? ).with(/puppet-agent-1\.0\.0-1\.i386\.pkg\.gz/).and_return( false )
1097
- expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-1\.0\.0\.i386\.pkg\.gz/, '/' )
1098
- expect( subject ).to receive( :create_remote_file ).with( host, '/noask', /noask file/m )
1099
- expect( subject ).to receive( :on ).with( host, 'gunzip -c puppet-agent-1.0.0.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all' )
1100
- test_fetch_http_file
1105
+ it "copies old package to the root directory and installs it" do
1106
+ expect( subject ).to receive( :link_exists? ).with(/puppet-agent-#{expected}-1\.i386\.pkg\.gz/).and_return( false )
1107
+ expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-#{expected}.i386\.pkg\.gz/, '/' )
1108
+ expect( subject ).to receive( :create_remote_file ).with( host, '/noask', /noask file/m )
1109
+ expect( subject ).to receive( :on ).with( host, "gunzip -c puppet-agent-#{expected}.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all" )
1110
+ test_fetch_http_file(val)
1111
+ end
1101
1112
  end
1102
1113
  end
1103
1114
 
@@ -1106,20 +1117,30 @@ describe ClassMixedWithDSLInstallUtils do
1106
1117
  @platform = 'solaris-11-x86_64'
1107
1118
  end
1108
1119
 
1109
- it "copies package to the root user directory and installs it" do
1110
- expect( subject ).to receive( :link_exists? ).with(/puppet-agent-1\.0\.0-1\.i386\.pkg\.gz/).and_return( true )
1111
- expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-1\.0\.0-1\.i386\.pkg\.gz/, '/root' )
1112
- expect( subject ).to receive( :create_remote_file ).with( host, '/root/noask', /noask file/m )
1113
- expect( subject ).to receive( :on ).with( host, 'gunzip -c puppet-agent-1.0.0-1.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all' )
1114
- test_fetch_http_file
1115
- end
1120
+ [
1121
+ ['1.0.1.786.477', '1.0.1.786.477'],
1122
+ ['1.0.1.786.a477', '1.0.1.786.477'],
1123
+ ['1.0.1.786.477-', '1.0.1.786.477'],
1124
+ ['1.0.1.0000786.477', '1.0.1.786.477'],
1125
+ ['1.000000.1.786.477', '1.0.1.786.477'],
1126
+ ['-1.0.1.786.477', '1.0.1.786.477'],
1127
+ ['1.2.5.38.6813', '1.2.5.38.6813']
1128
+ ].each do |val, expected|
1129
+
1130
+ it "copies package to the root user directory and installs it" do
1131
+ # version = 1.0.0
1132
+ expect( subject ).to receive( :link_exists? ).with(/puppet-agent@#{expected},5\.11-1\.i386\.p5p/).and_return( true )
1133
+ expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent@#{expected},5\.11-1\.i386\.p5p/, '/root' )
1134
+ expect( subject ).to receive( :on ).with( host, "pkg install -g puppet-agent@#{expected},5.11-1.i386.p5p puppet-agent" )
1135
+ test_fetch_http_file(val)
1136
+ end
1116
1137
 
1117
- it "copies old package to the root directory and installs it" do
1118
- expect( subject ).to receive( :link_exists? ).with(/puppet-agent-1\.0\.0-1\.i386\.pkg\.gz/).and_return( false )
1119
- expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent-1\.0\.0\.i386\.pkg\.gz/, '/root' )
1120
- expect( subject ).to receive( :create_remote_file ).with( host, '/root/noask', /noask file/m )
1121
- expect( subject ).to receive( :on ).with( host, 'gunzip -c puppet-agent-1.0.0.i386.pkg.gz | pkgadd -d /dev/stdin -a noask -n all' )
1122
- test_fetch_http_file
1138
+ it "copies old package to the root directory and installs it" do
1139
+ expect( subject ).to receive( :link_exists? ).with(/puppet-agent@#{expected},5\.11-1\.i386\.p5p/).and_return( false )
1140
+ expect( subject ).to receive( :scp_to ).with( host, /\/puppet-agent@#{expected},5\.11\.i386\.p5p/, '/root' )
1141
+ expect( subject ).to receive( :on ).with( host, "pkg install -g puppet-agent@#{expected},5.11.i386.p5p puppet-agent" )
1142
+ test_fetch_http_file(val)
1143
+ end
1123
1144
  end
1124
1145
  end
1125
1146
  end