simp-rake-helpers 5.3.0 → 5.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -2
  3. data/.travis.yml +54 -37
  4. data/CHANGELOG.md +40 -2
  5. data/Gemfile +1 -0
  6. data/README.md +70 -82
  7. data/lib/simp/rake/build/auto.rb +6 -0
  8. data/lib/simp/rake/build/pkg.rb +2 -2
  9. data/lib/simp/rake/build/rpmdeps.rb +6 -3
  10. data/lib/simp/rake/helpers/assets/rpm_spec/simpdefault.spec +284 -71
  11. data/lib/simp/rake/helpers/version.rb +1 -1
  12. data/lib/simp/rake/pkg.rb +38 -18
  13. data/lib/simp/rake/rubygem.rb +1 -1
  14. data/lib/simp/rpm.rb +49 -6
  15. data/spec/acceptance/00_pkg_rpm_custom_scriptlets_spec.rb +117 -0
  16. data/spec/acceptance/10_pkg_rpm_spec.rb +153 -0
  17. data/spec/acceptance/20_pkg_rpm_safely_upgrading_obsolete_modules_spec.rb +175 -0
  18. data/spec/acceptance/development/docker_env.sh +29 -0
  19. data/spec/acceptance/development/rerun_acceptance_tests.sh +15 -0
  20. data/spec/acceptance/development/vagrant_rsync.sh +23 -0
  21. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.1/CHANGELOG +2 -0
  22. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.1/Rakefile +3 -0
  23. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.1/build/rpm_metadata/custom/overrides +14 -0
  24. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.1/build/rpm_metadata/requires +1 -0
  25. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.1/metadata.json +33 -0
  26. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-3.0/CHANGELOG +2 -0
  27. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-3.0/Rakefile +3 -0
  28. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-3.0/build/rpm_metadata/custom/overrides +14 -0
  29. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-3.0/build/rpm_metadata/requires +1 -0
  30. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-3.0/metadata.json +33 -0
  31. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-1.0/CHANGELOG +2 -0
  32. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-1.0/Rakefile +3 -0
  33. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-1.0/build/rpm_metadata/requires +1 -0
  34. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-1.0/metadata.json +33 -0
  35. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.0/CHANGELOG +2 -0
  36. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.0/Rakefile +3 -0
  37. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.0/build/rpm_metadata/requires +1 -0
  38. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.0/metadata.json +33 -0
  39. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.2/CHANGELOG +2 -0
  40. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.2/Rakefile +3 -0
  41. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.2/build/rpm_metadata/custom/overrides +14 -0
  42. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.2/build/rpm_metadata/requires +1 -0
  43. data/spec/acceptance/files/custom_scriptlet_triggers/pupmod-old-package-2.2/metadata.json +33 -0
  44. data/spec/acceptance/files/mock_packages/pupmod-puppetlabs-stdlib.spec +32 -0
  45. data/spec/acceptance/files/mock_packages/pupmod-simp-foo.spec +32 -0
  46. data/spec/acceptance/files/mock_packages/pupmod-simp-simplib.spec +32 -0
  47. data/spec/acceptance/files/mock_packages/rpmbuild.sh +25 -0
  48. data/spec/acceptance/files/mock_packages/simp-adapter/etc/simp/adapter_config.yaml +3 -0
  49. data/spec/acceptance/files/mock_packages/simp-adapter/usr/local/sbin/simp_rpm_helper +406 -0
  50. data/spec/acceptance/files/mock_packages/simp-adapter.spec +43 -0
  51. data/spec/acceptance/files/testpackage_custom_scriptlet/CHANGELOG +2 -0
  52. data/spec/acceptance/files/testpackage_custom_scriptlet/Rakefile +3 -0
  53. data/spec/acceptance/files/testpackage_custom_scriptlet/build/rpm_metadata/custom/overrides +18 -0
  54. data/spec/acceptance/files/testpackage_custom_scriptlet/build/rpm_metadata/requires +1 -0
  55. data/spec/acceptance/files/testpackage_custom_scriptlet/metadata.json +33 -0
  56. data/spec/acceptance/nodesets/default.yml +2 -4
  57. data/spec/acceptance/support/pkg_rpm_helpers.rb +81 -0
  58. data/spec/lib/simp/rake/build/files/unmanaged_mod/build/rpm_metadata/requires +2 -1
  59. data/spec/lib/simp/rake/build/rpmdeps_spec.rb +2 -1
  60. data/spec/spec_helper_acceptance.rb +20 -1
  61. metadata +44 -17
  62. data/spec/acceptance/pkg_rpm_spec.rb +0 -164
data/lib/simp/rpm.rb CHANGED
@@ -12,7 +12,7 @@ module Simp
12
12
  require 'rake'
13
13
 
14
14
  @@gpg_keys = Hash.new
15
- attr_reader :verbose, :packages
15
+ attr_reader :verbose, :lua_debug, :packages
16
16
 
17
17
  if Gem.loaded_specs['rake'].version >= Gem::Version.new('0.9')
18
18
  def self.sh(args)
@@ -20,6 +20,10 @@ module Simp
20
20
  end
21
21
  end
22
22
 
23
+ def self.rpm_cmd
24
+ @rpm_cmd ||= (ENV.fetch('SIMP_RPM_LUA_debug','no') =='yes') ? "rpm -D 'lua_debug 1'" : 'rpm'
25
+ end
26
+
23
27
  # Constructs a new Simp::RPM object. Requires the path to the spec file, or
24
28
  # RPM, from which information will be gathered.
25
29
  #
@@ -38,6 +42,8 @@ module Simp
38
42
  # apply when +rpm_source+ is an RPM spec file.
39
43
  # [rpm_name] The full name of the rpm
40
44
  def initialize(rpm_source)
45
+ @verbose = ENV.fetch('SIMP_RPM_verbose','no') =='yes'
46
+
41
47
  update_rpmmacros
42
48
 
43
49
  # Simp::RPM.get_info returns a Hash or an Array of Hashes.
@@ -52,7 +58,14 @@ module Simp
52
58
  @info[package_info[:basename]] = package_info
53
59
  end
54
60
 
61
+
55
62
  @packages = @info.keys
63
+
64
+ if @verbose
65
+ require 'pp'
66
+ puts "== Simp::RPM @packages"
67
+ puts @packages.pretty_inspect
68
+ end
56
69
  end
57
70
 
58
71
  # @returns The RPM '.dist' of the system. 'nil' will be will be returned if
@@ -60,7 +73,13 @@ module Simp
60
73
  def self.system_dist
61
74
  # We can only have one of these
62
75
  unless defined?(@@system_dist)
63
- dist = %x(rpm -E '%{dist}' 2> /dev/null).strip.split('.')
76
+ cmd = %Q(#{rpm_cmd} -E '%{dist}' 2> /dev/null)
77
+ if @verbose
78
+ puts "== Simp::RPM.system_dist"
79
+ puts " #{cmd} "
80
+ end
81
+ dist = %x{#{cmd}}.strip.split('.')
82
+ puts " result = '#{dist}'" if @verbose
64
83
 
65
84
  if dist.size > 1
66
85
  @@system_dist = '.' + dist[1]
@@ -106,6 +125,13 @@ module Simp
106
125
  fh.flush
107
126
  end
108
127
 
128
+ if @verbose
129
+ puts "== SIMP::RPM#update_rpmmacros:"
130
+ puts " wrote to '#{rpmmacros_file}': "
131
+ puts " #{'-'*20}"
132
+ puts rpmmacros.map{|x| " #{x}\n"}.join
133
+ puts
134
+ end
109
135
  @@macros_updated = true
110
136
  end
111
137
  end
@@ -259,7 +285,11 @@ module Simp
259
285
  # stdout output and stderr output.
260
286
  # cmd:: command to be executed
261
287
  def self.execute(cmd)
262
- #puts "Executing: [#{cmd}]"
288
+ if @verbose ||= ENV.fetch('SIMP_RPM_verbose','no') =='yes'
289
+ puts "== Simp::RPM.execute(#{cmd})"
290
+ puts " #{cmd}"
291
+ end
292
+
263
293
  outfile = File.join('/tmp', "#{ENV['USER']}_#{SecureRandom.hex}")
264
294
  errfile = File.join('/tmp', "#{ENV['USER']}_#{SecureRandom.hex}")
265
295
  pid = spawn(cmd, :out=>outfile, :err=>errfile)
@@ -276,6 +306,13 @@ module Simp
276
306
 
277
307
  { :exit_status => exit_status, :stdout => stdout, :stderr => stderr }
278
308
  ensure
309
+ if @verbose
310
+ puts " -------- exit_status: #{exit_status}"
311
+ puts " -------- stdout ",''
312
+ puts File.readlines(outfile).map{|x| " #{x}"}.join
313
+ puts ''," -------- stderr ",''
314
+ puts File.readlines(errfile).map{|x| " #{x}"}.join
315
+ end
279
316
  FileUtils.rm_f([outfile, errfile])
280
317
  end
281
318
 
@@ -313,9 +350,9 @@ module Simp
313
350
  :dist => system_dist
314
351
  }
315
352
 
316
- rpm_version_query = %(rpm -q --queryformat '%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n' 2>/dev/null)
353
+ rpm_version_query = %Q(#{rpm_cmd} -q --queryformat '%{NAME} %{VERSION} %{RELEASE} %{ARCH}\\n')
317
354
 
318
- rpm_signature_query = %(rpm -q --queryformat '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|\n\')
355
+ rpm_signature_query = %Q(#{rpm_cmd} -q --queryformat '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|\\n')
319
356
 
320
357
  source_is_rpm = rpm_source.split('.').last == 'rpm'
321
358
  if source_is_rpm
@@ -373,6 +410,12 @@ EOE
373
410
  info_array << info
374
411
  end
375
412
 
413
+ if @verbose
414
+ puts "== SIMP::RPM.get_info"
415
+ require 'pp'
416
+ pp info_array
417
+ end
418
+
376
419
  if info_array.size == 1
377
420
  return info_array[0]
378
421
  else
@@ -387,7 +430,7 @@ EOE
387
430
  end
388
431
 
389
432
  def self.create_rpm_build_metadata(project_dir, srpms=nil, rpms=nil)
390
- require 'yaml'
433
+ require 'yaml'
391
434
 
392
435
  last_build = {
393
436
  'git_hash' => %x(git rev-list --max-count=1 HEAD).chomp,
@@ -0,0 +1,117 @@
1
+ require 'spec_helper_acceptance'
2
+ require_relative 'support/pkg_rpm_helpers'
3
+
4
+ RSpec.configure do |c|
5
+ c.include Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
6
+ c.extend Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
7
+ end
8
+
9
+ shared_examples_for 'an RPM generator with customized scriptlets' do
10
+ it 'should create an RPM with customized scriptlets' do
11
+ scriptlets = rpm_scriptlets_for(
12
+ host,
13
+ "#{pkg_root_dir}/testpackage_custom_scriptlet/dist/" +
14
+ 'pupmod-simp-testpackage-0.0.1-0.noarch.rpm'
15
+ )
16
+
17
+ comment '...the expected scriptlet types are present'
18
+ expect(scriptlets.keys.sort).to eq [
19
+ 'pretrans',
20
+ 'preinstall',
21
+ 'postinstall',
22
+ 'preuninstall',
23
+ 'postuninstall',
24
+ ].sort
25
+
26
+ comment '...there are no duplicates' # this *should* be impossible
27
+ expect(scriptlets.map{|k,v| v[:count]}.max).to be == 1
28
+
29
+ comment '...pretrans scriptlet contains custom content'
30
+ expect(scriptlets['pretrans'][:content]).to eq '-- Custom scriptlet'
31
+
32
+ comment '...preinstall scriptlet has been overridden with custom content'
33
+ expect(scriptlets['preinstall'][:bare_content]).to eq(
34
+ "echo 'I override the default %%pre section provided by the spec file.'"
35
+ )
36
+
37
+ comment '...remaining default scriptlets call simp_rpm_helper with correct arguments'
38
+ expected_simp_rpm_helper_scriptlets = scriptlet_label_map.select{|k,v| %w(post preun postun).include? v }
39
+ expected_simp_rpm_helper_scriptlets.each do |rpm_label, simp_helper_label|
40
+ expect(scriptlets[rpm_label][:bare_content]).to eq(
41
+ "/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage --rpm_section='#{simp_helper_label}' --rpm_status=$1"
42
+ )
43
+ end
44
+ end
45
+ end
46
+
47
+
48
+ shared_examples_for 'an RPM generator with customized triggers' do
49
+
50
+ it 'should create an RPM with customized triggers' do
51
+ triggers = rpm_triggers_for(
52
+ host,
53
+ "#{pkg_root_dir}/testpackage_custom_scriptlet/dist/" +
54
+ 'pupmod-simp-testpackage-0.0.1-0.noarch.rpm'
55
+ )
56
+
57
+
58
+ comment '...the expected trigger types are present'
59
+ expect(triggers.keys.sort).to eq [
60
+ 'triggerun scriptlet (using /bin/sh) -- bar',
61
+ 'triggerun scriptlet (using /bin/sh) -- foo',
62
+ ]
63
+
64
+ comment '...there are no duplicates' # <-- this also should be impossible
65
+ expect(triggers.map{|k,v| v[:count]}.max).to be == 1
66
+
67
+ comment '..."triggerun -- foo" contains the expected content'
68
+ expect(triggers['triggerun scriptlet (using /bin/sh) -- foo'][:bare_content]).to eq(
69
+ %q{echo "The 'foo' package is great; why would you uninstall it?"}
70
+ )
71
+
72
+ comment '..."triggerun -- bar" contains the expected content'
73
+ expect(triggers['triggerun scriptlet (using /bin/sh) -- bar'][:bare_content]).to eq(
74
+ %q{echo "This trigger runs just before the 'bar' package's %%preun"}
75
+ )
76
+ end
77
+
78
+ end
79
+
80
+ describe 'rake pkg:rpm with customized content' do
81
+
82
+ before :all do
83
+ copy_host_files_into_build_user_homedir(hosts)
84
+ end
85
+
86
+ let(:pkg_root_dir){'/home/build_user/host_files/spec/acceptance/files'}
87
+ let(:testpackage_dir){"#{pkg_root_dir}/testpackage"}
88
+
89
+ hosts.each do |_host|
90
+ context "on #{_host}" do
91
+ let!(:host){ _host }
92
+
93
+ it 'can prep the package directories' do
94
+ testpackages = [
95
+ 'testpackage_custom_scriptlet',
96
+ ]
97
+
98
+ testpackages.each do |package|
99
+ on hosts, %Q(#{run_cmd} "cd #{pkg_root_dir}/#{package}; ) +
100
+ %Q(rvm use default; bundle update --local || bundle update")
101
+ end
102
+ end
103
+
104
+ context 'when valid custom content is defined under rpm_metadata' do
105
+
106
+ it 'should create an RPM' do
107
+ on host, %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_custom_scriptlet; #{rake_cmd} pkg:rpm")
108
+ end
109
+
110
+ it_should_behave_like 'an RPM generator with customized scriptlets'
111
+ it_should_behave_like 'an RPM generator with customized triggers'
112
+
113
+ end
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper_acceptance'
2
+ require_relative 'support/pkg_rpm_helpers'
3
+
4
+ RSpec.configure do |c|
5
+ c.include Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
6
+ c.extend Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
7
+ end
8
+
9
+ shared_examples_for "an RPM generator with edge cases" do
10
+ it 'should use specified release number for the RPM' do
11
+ on host, %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_with_release; rake pkg:rpm")
12
+ release_test_rpm = File.join(pkg_root_dir, 'testpackage_with_release',
13
+ 'dist', 'pupmod-simp-testpackage-0.0.1-42.noarch.rpm')
14
+ on host, %(test -f #{release_test_rpm})
15
+ end
16
+
17
+ it 'should generate a changelog for the RPM when no CHANGELOG exists' do
18
+ on host, %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_without_changelog; #{rake_cmd} pkg:rpm")
19
+ changelog_test_rpm = File.join(pkg_root_dir, 'testpackage_without_changelog',
20
+ 'dist', File.basename(testpackage_rpm))
21
+ on host, %(rpm --changelog -qp #{changelog_test_rpm} | grep -q 'Auto Changelog')
22
+ end
23
+
24
+ it 'should not require pupmod-simp-simplib for simp-simplib RPM' do
25
+ on host, %(#{run_cmd} "cd #{pkg_root_dir}/simplib; #{rake_cmd} pkg:rpm")
26
+ simplib_rpm = File.join(pkg_root_dir, 'simplib', 'dist',
27
+ File.basename(testpackage_rpm).gsub(/simp-testpackage-0.0.1/,'simp-simplib-1.2.3'))
28
+ on host, %(test -f #{simplib_rpm})
29
+ on host, %(rpm -qpR #{simplib_rpm} | grep -q pupmod-simp-simplib), {:acceptable_exit_codes => [1]}
30
+ end
31
+
32
+ it 'should not fail to create an RPM when the CHANGELOG has a bad date' do
33
+ on host,
34
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_with_bad_changelog_date; #{rake_cmd} pkg:rpm")
35
+
36
+ bad_date_test_rpm = File.join(pkg_root_dir, 'testpackage_with_bad_changelog_date',
37
+ 'dist', File.basename(testpackage_rpm))
38
+ on host, %(test -f #{bad_date_test_rpm})
39
+ end
40
+
41
+ it 'should fail to create an RPM when metadata.json is missing' do
42
+ on host,
43
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_metadata_file; #{rake_cmd} pkg:rpm"),
44
+ :acceptable_exit_codes => [1]
45
+ end
46
+
47
+ it 'should fail to create an RPM when license metadata is missing' do
48
+ on host,
49
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_license; #{rake_cmd} pkg:rpm"),
50
+ :acceptable_exit_codes => [1]
51
+ end
52
+
53
+ it 'should fail to create an RPM when name metadata is missing' do
54
+ on host,
55
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_name; #{rake_cmd} pkg:rpm"),
56
+ :acceptable_exit_codes => [1]
57
+ end
58
+
59
+ it 'should fail to create an RPM when source metadata is missing' do
60
+ on host,
61
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_source; #{rake_cmd} pkg:rpm"),
62
+ :acceptable_exit_codes => [1]
63
+ end
64
+
65
+ it 'should fail to create an RPM when summary metadata is missing' do
66
+ on host,
67
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_summary; #{rake_cmd} pkg:rpm"),
68
+ :acceptable_exit_codes => [1]
69
+ end
70
+
71
+ it 'should fail to create an RPM when version metadata is missing' do
72
+ on host,
73
+ %(#{run_cmd} "cd #{pkg_root_dir}/testpackage_missing_version; #{rake_cmd} pkg:rpm"),
74
+ :acceptable_exit_codes => [1]
75
+ end
76
+
77
+ end
78
+
79
+ describe 'rake pkg:rpm' do
80
+ before :all do
81
+ copy_host_files_into_build_user_homedir(hosts)
82
+ end
83
+
84
+
85
+ hosts.each do |_host|
86
+ context "on #{_host}" do
87
+ let!(:host){ _host }
88
+
89
+ context 'rpm building' do
90
+
91
+ let(:pkg_root_dir){'/home/build_user/host_files/spec/acceptance/files'}
92
+ let(:testpackage_dir){"#{pkg_root_dir}/testpackage"}
93
+
94
+ it 'can prep the package directories' do
95
+ testpackages = [
96
+ 'simplib',
97
+ 'testpackage',
98
+ 'testpackage_missing_license',
99
+ 'testpackage_missing_metadata_file',
100
+ 'testpackage_missing_name',
101
+ 'testpackage_missing_source',
102
+ 'testpackage_missing_summary',
103
+ 'testpackage_missing_version',
104
+ 'testpackage_with_bad_changelog_date',
105
+ 'testpackage_with_release',
106
+ 'testpackage_without_changelog',
107
+ ]
108
+
109
+ testpackages.each do |package|
110
+ on hosts, %Q(#{run_cmd} "cd #{pkg_root_dir}/#{package}; ) +
111
+ %Q(rvm use default; bundle update --local || bundle update")
112
+ end
113
+ end
114
+
115
+ context 'using simpdefault.spec' do
116
+
117
+ let(:build_type) {:default}
118
+ let(:testpackage_rpm) { File.join(testpackage_dir, 'dist/pupmod-simp-testpackage-0.0.1-0.noarch.rpm') }
119
+
120
+ it 'should create an RPM' do
121
+ comment "produces RPM on #{host}"
122
+ on host, %(#{run_cmd} "cd #{testpackage_dir}; #{rake_cmd} pkg:rpm")
123
+ on host, %(test -f #{testpackage_rpm})
124
+
125
+ comment 'produces RPM with appropriate dependencies'
126
+ on host, %(rpm -qpR #{testpackage_rpm} | grep -q simp-adapter)
127
+ on host, %(rpm -qpR #{testpackage_rpm} | grep -q pupmod-simp-foo)
128
+ on host, %(rpm -qpR #{testpackage_rpm} | grep -q pupmod-simp-simplib)
129
+ on host, %(rpm -qpR #{testpackage_rpm} | grep -q pupmod-puppetlabs-stdlib)
130
+ on host, %(rpm -qp --provides #{testpackage_rpm} | grep -q -x 'pupmod-testpackage = 0.0.1-0')
131
+ on host, %(rpm -qp --provides #{testpackage_rpm} | grep -q -x 'simp-testpackage = 0.0.1-0')
132
+ on host, %(rpm -qp --queryformat "[%{obsoletes}\\n]" #{testpackage_rpm} | grep -q "^pupmod-testpackage")
133
+ on host, %(rpm -qp --queryformat "[%{obsoletes}\\n]" #{testpackage_rpm} | grep -q "^simp-testpackage")
134
+
135
+ comment 'produces RPM with a sourced CHANGELOG'
136
+ on host, %(rpm --changelog -qp #{testpackage_rpm} | grep -q Stallman)
137
+
138
+ comment 'produces RPM with appropriate pre/post/preun/postun'
139
+ result = on host, %(rpm -qp --scripts #{testpackage_rpm})
140
+ scriptlets = result.stdout.scan( %r{^.*?scriptlet.*?/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage.*?$}m )
141
+
142
+ expect( scriptlets.grep( %r{\Apreinstall scriptlet.*\n/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage --rpm_section='pre' --rpm_status=\$1\Z}m )).not_to be_empty
143
+ expect( scriptlets.grep( %r{\Apostinstall scriptlet.*\n/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage --rpm_section='post' --rpm_status=\$1\Z}m )).not_to be_empty
144
+ expect( scriptlets.grep( %r{\Apreuninstall scriptlet.*\n/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage --rpm_section='preun' --rpm_status=\$1\Z}m )).not_to be_empty
145
+ expect( scriptlets.grep( %r{\Apostuninstall scriptlet.*\n/usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/testpackage --rpm_section='postun' --rpm_status=\$1\Z}m )).not_to be_empty
146
+ end
147
+
148
+ it_should_behave_like 'an RPM generator with edge cases'
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper_acceptance'
2
+ require_relative 'support/pkg_rpm_helpers'
3
+
4
+ require 'beaker/puppet_install_helper'
5
+ require 'json'
6
+
7
+ RSpec.configure do |c|
8
+ c.include Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
9
+ c.extend Simp::BeakerHelpers::SimpRakeHelpers::PkgRpmHelpers
10
+ end
11
+
12
+
13
+ # These tests demonstrate custom RPM triggers that work around the obsolete
14
+ # module RPM upgrate + simp_rpm_helper problem described in SIMP-3895:
15
+ #
16
+ # https://simp-project.atlassian.net/browse/SIMP-3988
17
+ #
18
+ # The expected outcome is that simp_rpm_helper always ensures the correct
19
+ # content is installed after an upgrade, even during after a package has been
20
+ # obsoleted. This is accomplished via %triggerpostun -- <name of old package>
21
+ #
22
+ # old 1.0 -> old 2.0 = no need for a trigger
23
+ # old 1.0 -> new 2.0 = must re-run simp_rpm_helper
24
+ # old 1.0 -> new 3.0 = must re-run simp_rpm_helper
25
+ # old 2.0 -> new 2.0 = must re-run simp_rpm_helper
26
+ # old 2.0 -> new 3.0 = must re-run simp_rpm_helper
27
+ # new 2.0 -> new 3.0 = no need for a trigger
28
+
29
+
30
+ shared_examples_for 'an upgrade path that works safely with rpm_simp_helper' do |first_package_file, second_package_file|
31
+ let( :rpm_regex ) do
32
+ /^(?<name>pupmod-[a-z0-9_]+-[a-z0-9_]+)-(?<version>\d+\.\d+\.\d+)-(?<release>\d+)\..*\.rpm$/
33
+ end
34
+
35
+ let( :first_package_version ){ first_package_file.match(rpm_regex)['version'] }
36
+ let( :first_package_name ){ first_package_file.match(rpm_regex)['name'] }
37
+ let( :first_package_forge_name ){ first_package_name.sub(/^[^-]+-/,'') }
38
+ let( :first_package_module_name ){ first_package_forge_name.sub(/^[^-]+-/,'') }
39
+ let( :first_package_dir_name ){ first_package_name + '-' + first_package_version.sub(/\.\d+-\d+$/,'') }
40
+
41
+ let( :second_package_name ){ second_package_file.match(rpm_regex)['name'] }
42
+ let( :second_package_forge_name ){ second_package_name.sub(/^[^-]+-/,'') }
43
+ let( :second_package_module_name ){ second_package_forge_name.sub(/^[^-]+-/,'') }
44
+ let( :second_package_version ){ second_package_file.match(rpm_regex)['version'] }
45
+ let( :second_package_dir_name ){ second_package_name + '-' + second_package_version.sub(/\.\d+-\d+$/,'') }
46
+
47
+ context "When upgrading from #{first_package_file} to #{second_package_file}" do
48
+ it "should clean out any old installs" do
49
+ on host, "rpm -e #{first_package_name} &> /dev/null; " +
50
+ "rpm -e #{second_package_name} &> /dev/null ",
51
+ accept_all_exit_codes: true
52
+ end
53
+
54
+ it "should install #{first_package_file}" do
55
+ on host, "cd #{pkg_root_dir}/#{first_package_dir_name.gsub(/\.\d+$/,'')}; "+
56
+ "rpm -Uvh dist/#{first_package_file}"
57
+ end
58
+
59
+ it "should transfer contents of #{first_package_file} into the code directory" do
60
+ result = on host, "cat /opt/test/puppet/code/#{first_package_module_name}/metadata.json"
61
+ metadata = JSON.parse(result.stdout)
62
+ expect(metadata['name']).to eq first_package_forge_name
63
+ expect(metadata['version']).to eq first_package_version
64
+ end
65
+
66
+ it "should upgrade to #{second_package_file}" do
67
+ on host, "cd #{pkg_root_dir}/#{second_package_dir_name.gsub(/\.\d+$/,'')}; rpm -Uvh dist/#{second_package_file}"
68
+ end
69
+
70
+ it "should transfer contents of #{second_package_file} into the code directory" do
71
+ result = on host, "cat /opt/test/puppet/code/#{second_package_module_name}/metadata.json"
72
+ metadata = JSON.parse(result.stdout)
73
+ expect(metadata['name']).to eq second_package_forge_name
74
+ expect(metadata['version']).to eq second_package_version
75
+ end
76
+
77
+
78
+ end
79
+ end
80
+
81
+ describe 'rake pkg:rpm + modules with customized content to safely upgrade obsoleted packagess' do
82
+
83
+ let(:pkg_root_dir) do
84
+ '/home/build_user/host_files/spec/acceptance/files/custom_scriptlet_triggers'
85
+ end
86
+
87
+ before :all do
88
+ copy_host_files_into_build_user_homedir(hosts)
89
+
90
+ comment 'ensure the Puppet AIO is installed'
91
+ ENV['PUPPET_INSTALL_TYPE'] ||= 'agent'
92
+ ENV['PUPPET_INSTALL_VERSION'] ||= '1.10.6'
93
+ run_puppet_install_helper_on(hosts)
94
+
95
+ comment 'configure puppet agent to look like a Puppet server for simp_rpm_helper'
96
+ on hosts, '/opt/puppetlabs/bin/puppet config --section master set user root; ' +
97
+ '/opt/puppetlabs/bin/puppet config --section master set group root; ' +
98
+ '/opt/puppetlabs/bin/puppet config --section master set codedir /opt/test/puppet/code; ' +
99
+ '/opt/puppetlabs/bin/puppet config --section master set confdir /opt/test/puppet/code'
100
+
101
+
102
+ comment 'build and install mock RPMs'
103
+ mock_pkg_dir = '/home/build_user/host_files/spec/acceptance/files/mock_packages'
104
+ on hosts, %Q[#{run_cmd} "cd #{mock_pkg_dir}; rm -rf pkg"]
105
+ on hosts, %Q[#{run_cmd} "cd #{mock_pkg_dir}; bash rpmbuild.sh simp-adapter.spec"]
106
+ on hosts, %Q[#{run_cmd} "cd #{mock_pkg_dir}; bash rpmbuild.sh pupmod-puppetlabs-stdlib.spec"]
107
+ on hosts, %Q[#{run_cmd} "cd #{mock_pkg_dir}; bash rpmbuild.sh pupmod-simp-simplib.spec"]
108
+ on hosts, %Q[#{run_cmd} "cd #{mock_pkg_dir}; bash rpmbuild.sh pupmod-simp-foo.spec"]
109
+
110
+ on hosts, %Q[rpm -Uvh "#{mock_pkg_dir}/pkg/dist/*.noarch.rpm"], acceptable_exit_codes: [0,1]
111
+ end
112
+
113
+ hosts.each do |_host|
114
+ context "on #{_host}" do
115
+ let!(:host){ _host }
116
+
117
+ context 'with module RPMs that are suceptible to SIMP-3895' do
118
+
119
+ let(:testpackages) do
120
+ [
121
+ 'pupmod-old-package-1.0',
122
+ 'pupmod-old-package-2.0',
123
+ 'pupmod-old-package-2.2',
124
+ 'pupmod-new-package-2.1',
125
+ 'pupmod-new-package-3.0',
126
+ ]
127
+ end
128
+
129
+ it 'should create RPMs' do
130
+ testpackages.each do |package|
131
+ on host, %Q(#{run_cmd} "cd #{pkg_root_dir}/#{package}; ) +
132
+ %Q(rvm use default; bundle update --local || bundle update")
133
+ rpm_name = package.sub(/-[^-]+$/,'')
134
+ # In case previous tests haven't been clean
135
+ on host, "rpm -q #{rpm_name} && rpm -e #{rpm_name}; :"
136
+
137
+ on host, %(#{run_cmd} "cd #{pkg_root_dir}/#{package}; #{rake_cmd} pkg:rpm")
138
+ end
139
+ end
140
+
141
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
142
+ 'pupmod-old-package-1.0.0-0.noarch.rpm',
143
+ 'pupmod-old-package-2.0.0-0.noarch.rpm')
144
+
145
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
146
+ 'pupmod-old-package-1.0.0-0.noarch.rpm',
147
+ 'pupmod-new-package-2.1.0-0.noarch.rpm')
148
+
149
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
150
+ 'pupmod-new-package-2.1.0-0.noarch.rpm',
151
+ 'pupmod-old-package-2.2.0-0.noarch.rpm')
152
+
153
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
154
+ 'pupmod-old-package-1.0.0-0.noarch.rpm',
155
+ 'pupmod-new-package-3.0.0-0.noarch.rpm')
156
+
157
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
158
+ 'pupmod-old-package-2.0.0-0.noarch.rpm',
159
+ 'pupmod-new-package-2.1.0-0.noarch.rpm')
160
+
161
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
162
+ 'pupmod-old-package-2.0.0-0.noarch.rpm',
163
+ 'pupmod-new-package-3.0.0-0.noarch.rpm')
164
+
165
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
166
+ 'pupmod-old-package-2.2.0-0.noarch.rpm',
167
+ 'pupmod-new-package-3.0.0-0.noarch.rpm')
168
+
169
+ it_should_behave_like('an upgrade path that works safely with rpm_simp_helper',
170
+ 'pupmod-new-package-2.1.0-0.noarch.rpm',
171
+ 'pupmod-new-package-3.0.0-0.noarch.rpm')
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,29 @@
1
+ # Source this file within a docker container to set up convenience shell
2
+ # variables & functions.
3
+ #
4
+ # Usage:
5
+ #
6
+ # source /host_files/spec/acceptance/development/docker_env.sh [DIR]
7
+ #
8
+ # # testing a particular
9
+ # source /host_files/spec/acceptance/development/docker_env.sh /home/build_user/host_files/spec/acceptance/files/testpackage_custom_scriptlet
10
+
11
+
12
+ export TERM=xterm
13
+ export TOPWD=/home/build_user/host_files
14
+ export TOPWD_FILES=${TOPWD}/spec/acceptance/files
15
+ export TWD=${1:-$TOPWD_FILES/testpackage}
16
+ export TW=$(basename ${TWD})
17
+ export TWSPEC="$TWD/dist/tmp/testpackage.spec"
18
+ alias twd="cd $TWD"
19
+ rug(){
20
+ runuser build_user -l -c "cd /$TOPWD; $@"
21
+ }
22
+ ru(){
23
+ runuser build_user -l -c "cd /$TWD; SIMP_RPM_LUA_debug=yes SIMP_RPM_verbose=yes SIMP_PKG_verbose=yes $@"
24
+ }
25
+ ru_specfile_rpm_q(){
26
+ ru "rpm -q -D 'pup_module_info_dir $TWD' --specfile $TWD/dist/tmp/testpackage.spec $@"
27
+ }
28
+ cd $TWD
29
+ (yum install -y vim-enhanced tree > /dev/null &)
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+
3
+ # Run this from your docker host to wipe out all containers and restart beaker
4
+ # tests.
5
+
6
+ # Find & kill running beaker containers
7
+ (docker ps -a | grep -v CONT | awk '{print "docker kill " $1 "; docker rm " $1}') > /tmp/x.$$
8
+ source /tmp/x.$$ && rm /tmp/x.$$
9
+
10
+ if [[ $# -gt 0 ]]; then
11
+ BEAKER_destroy=no SIMP_RPM_LUA_debug=yes SIMP_RAKE_PKG_verbose=yes SIMP_RPM_verbose=yes $@
12
+ else
13
+ # re-run acceptance tests
14
+ BEAKER_destroy=no SIMP_RPM_LUA_debug=yes SIMP_RAKE_PKG_verbose=yes SIMP_RPM_verbose=yes bundle exec rake acceptance
15
+ fi
@@ -0,0 +1,23 @@
1
+ vagrant rsync
2
+ vagrant ssh -c "cd /vagrant; bundle --local || bundle; ls -l; source /vagrant/spec/acceptance/development/rerun_acceptance_tests.sh" -- -v
3
+
4
+
5
+ [[ $? -eq 0 ]] && status=SUCCESS || status=FAILED
6
+ echo
7
+ echo ==================
8
+ echo $status
9
+ echo ==================
10
+ echo
11
+ echo 'In order to troubleshoot directly on a container:'
12
+ echo
13
+ echo ' vagrant ssh # enter vagrant VM'
14
+ echo ' docker ps # identify container to inspect'
15
+ echo ' docker exec -it el6-build-server bash # log into container (example: el6-build-server)'
16
+ echo
17
+ echo ' source /host_files/spec/acceptance/development/docker_env.sh '
18
+ echo
19
+ echo ' # or, to start testing a particular script'
20
+ echo
21
+ echo ' source /host_files/spec/acceptance/development/docker_env.sh /home/build_user/host_files/spec/acceptance/files/custom_scriptlet_triggers/pupmod-new-package-2.0'
22
+ echo
23
+ echo ' ru "rpm -q --queryformat '%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n' --specfile $TWD/dist/tmp/testpackage_custom_scriptlet.spec"'
@@ -0,0 +1,2 @@
1
+ * Sat Dec 13 2014 Richard Stallman <rms@gnu.org> - 0.0.1-0
2
+ - Behold, there was a brave GNU world....
@@ -0,0 +1,3 @@
1
+ require 'simp/rake/pkg'
2
+
3
+ Simp::Rake::Pkg.new( File.dirname( __FILE__ ) )
@@ -0,0 +1,14 @@
1
+ %triggerpostun -- pupmod-old-package
2
+
3
+ echo
4
+ echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
5
+ echo "@@@@@@ Executing SIMP-3895 workaround @@@@@@"
6
+ echo "@@@@@@ @@@@@@"
7
+ echo "@@@@@@ upgrading from obsoleted pkg @@@@@@"
8
+ echo "@@@@@@ 'pupmod-old-package' @@@@@@"
9
+ echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
10
+ echo
11
+ echo "pupmod-new-package: post 1=2 (triggered by: %triggerpostun -- pupmod-old-package)"
12
+
13
+ # re-send the 'post' message
14
+ /usr/local/sbin/simp_rpm_helper --rpm_dir=/usr/share/simp/modules/package --rpm_section='post' --rpm_status=2