foreman_maintain 1.1.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/definitions/checks/foreman/check_tuning_requirements.rb +79 -0
  3. data/definitions/checks/non_rh_packages.rb +1 -6
  4. data/definitions/checks/repositories/check_upstream_repository.rb +3 -1
  5. data/definitions/features/capsule.rb +1 -0
  6. data/definitions/features/foreman_install.rb +12 -0
  7. data/definitions/features/foreman_server.rb +5 -0
  8. data/definitions/features/installer.rb +12 -3
  9. data/definitions/features/instance.rb +9 -0
  10. data/definitions/features/katello.rb +2 -0
  11. data/definitions/features/katello_install.rb +12 -0
  12. data/definitions/features/satellite.rb +1 -0
  13. data/definitions/procedures/content/switchover.rb +1 -1
  14. data/definitions/procedures/packages/enable_modules.rb +16 -0
  15. data/definitions/procedures/packages/uninstall.rb +30 -0
  16. data/definitions/procedures/pulpcore/trim_rpm_changelogs.rb +23 -0
  17. data/definitions/procedures/repositories/setup.rb +2 -1
  18. data/definitions/scenarios/self_upgrade.rb +50 -4
  19. data/definitions/scenarios/upgrade_to_foreman_nightly.rb +89 -0
  20. data/definitions/scenarios/upgrade_to_katello_nightly.rb +87 -0
  21. data/definitions/scenarios/upgrade_to_satellite_6_11.rb +1 -0
  22. data/definitions/scenarios/upgrade_to_satellite_6_12.rb +1 -0
  23. data/definitions/scenarios/upgrade_to_satellite_6_12_z.rb +1 -0
  24. data/extras/foreman_protector/foreman-protector.whitelist +5 -0
  25. data/lib/foreman_maintain/cli/upgrade_command.rb +7 -3
  26. data/lib/foreman_maintain/concerns/downstream.rb +0 -12
  27. data/lib/foreman_maintain/concerns/foreman_and_katello_version_map.rb +17 -0
  28. data/lib/foreman_maintain/concerns/os_facts.rb +25 -0
  29. data/lib/foreman_maintain/concerns/upstream.rb +103 -0
  30. data/lib/foreman_maintain/concerns/versions.rb +17 -0
  31. data/lib/foreman_maintain/package_manager/apt.rb +7 -0
  32. data/lib/foreman_maintain/scenario.rb +1 -0
  33. data/lib/foreman_maintain/version.rb +1 -1
  34. data/lib/foreman_maintain.rb +3 -0
  35. metadata +13 -6
  36. data/definitions/features/foreman_1_11_x.rb +0 -9
  37. data/definitions/features/foreman_1_7_x.rb +0 -9
  38. data/definitions/features/upstream.rb +0 -14
  39. data/definitions/features/upstream_repositories.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91f6ed30cd64c8a77327a681177355d94c2afc783ebad3c6341353ac1930d2ef
4
- data.tar.gz: ae2a2c770198febfeb4037a883b6b03a02498f0e461ce9acf4bc6661ae9ef7e7
3
+ metadata.gz: 5bf9227086619d4fb28185c0fdb796c7045b9f35ea52df8fc3d9aa1a45fbb85d
4
+ data.tar.gz: 77281b4efd0cb3b2d1e6fed2badce28d183dcb7b16d65246987f57407eb92642
5
5
  SHA512:
6
- metadata.gz: 372122b9854841be9b61c16dc4e32456b917348413cca28d5ebb930c1753e456818d70278c4d74da64d9096b092d5ccaced4aac2bfe62d46ec59333f86844c9d
7
- data.tar.gz: 170d5f54b55dbbe4e91b7bfca2842d0f9c0f4389844208f558b6944b61e086a7cd7edc378c1a27e37f7d09e5eb326b31c7a96c00daf2807f59cf82596815f8da
6
+ metadata.gz: 3b2e771c53927fa0f637da5a5066eb1afecbfe7876b9a241a68dfc8300ac82f8835fa308a42742d7b2a126716bac825e37179ddd91695a529de0b64e5272e245
7
+ data.tar.gz: 283f7004e4268f19cadc052dcd044273be28f96e786fd012bca57692276a3765eaded4848a596a66efdfe36d490870f6cfbbee07ccfa4c0dcdcf6362a9fda740
@@ -0,0 +1,79 @@
1
+ module Checks
2
+ module Foreman
3
+ class TuningRequirements < ForemanMaintain::Check
4
+ metadata do
5
+ label :check_tuning_requirements
6
+ tags :pre_upgrade
7
+ description 'Check if system requirements match current tuning profile'
8
+ confine do
9
+ feature(:katello)
10
+ end
11
+ do_not_whitelist
12
+ end
13
+
14
+ def run
15
+ failure_message = check_tuning_profile
16
+ fail! failure_message if failure_message
17
+ end
18
+
19
+ def check_tuning_profile
20
+ installer_config = feature(:installer).configuration
21
+ tuning_profile = installer_config[:facts]['tuning']
22
+
23
+ cpu_message = check_cpu_cores(tuning_profile)
24
+ memory_message = check_memory(tuning_profile)
25
+
26
+ return unless cpu_message || memory_message
27
+
28
+ message = failure_message(tuning_profile)
29
+ if cpu_message
30
+ message += "#{cpu_message}\n"
31
+ end
32
+ if memory_message
33
+ message += "#{memory_message}\n"
34
+ end
35
+
36
+ message
37
+ end
38
+
39
+ def check_memory(tuning_profile)
40
+ # Check if it's actually 90% of the required. If a crash kernel is enabled
41
+ # then the reported total memory is lower than in reality.
42
+ kb_to_gb = (1024 * 1024)
43
+ memory_percentile = 0.9
44
+ tuning_memory = tuning_sizes[tuning_profile][:memory]
45
+ system_memory = memory.to_i
46
+
47
+ unless system_memory.to_i >= (tuning_memory * kb_to_gb * memory_percentile)
48
+ "The system memory is #{system_memory / kb_to_gb} GB but the currently configured tuning profile requires #{tuning_memory} GB." # rubocop:disable Metrics/LineLength
49
+ end
50
+ end
51
+
52
+ def check_cpu_cores(tuning_profile)
53
+ tuning_cpu_cores = tuning_sizes[tuning_profile][:cpu_cores]
54
+ system_cpu_cores = cpu_cores
55
+
56
+ unless system_cpu_cores.to_i >= tuning_cpu_cores
57
+ "The number of CPU cores for the system is #{system_cpu_cores} but the currently configured tuning profile requires #{tuning_cpu_cores}." # rubocop:disable Metrics/LineLength
58
+ end
59
+ end
60
+
61
+ def tuning_sizes
62
+ {
63
+ 'development' => { cpu_cores: 1, memory: 6 },
64
+ 'default' => { cpu_cores: 4, memory: 20 },
65
+ 'medium' => { cpu_cores: 8, memory: 32 },
66
+ 'large' => { cpu_cores: 16, memory: 64 },
67
+ 'extra-large' => { cpu_cores: 32, memory: 128 },
68
+ 'extra-extra-large' => { cpu_cores: 48, memory: 256 }
69
+ }
70
+ end
71
+
72
+ def failure_message(tuning_profile)
73
+ <<-MESSAGE.strip_heredoc
74
+ \nERROR: The installer is configured to use the #{tuning_profile} tuning profile and does not meet the requirements.
75
+ MESSAGE
76
+ end
77
+ end
78
+ end
79
+ end
@@ -11,8 +11,7 @@ class Checks::NonRhPackages < ForemanMaintain::Check
11
11
  def run
12
12
  rpm_query_format = '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} : %{VENDOR}\n'
13
13
  all_packages = package_manager.list_installed_packages(rpm_query_format)
14
- non_rh_packages = all_packages - \
15
- all_packages.grep(Regexp.union(rh_regexp_list + ansible_runner_regexp_list))
14
+ non_rh_packages = all_packages - all_packages.grep(Regexp.union(rh_regexp_list))
16
15
  assert(non_rh_packages.empty?, error_msg(non_rh_packages), :warn => true)
17
16
  end
18
17
 
@@ -27,8 +26,4 @@ class Checks::NonRhPackages < ForemanMaintain::Check
27
26
  /-qpid-router-server/, /java-client/, /pulp-client/, /katello-default-ca/, /katello-server-ca/,
28
27
  /katello-ca-consumer/, /gpg-pubkey/, /-tomcat/]
29
28
  end
30
-
31
- def ansible_runner_regexp_list
32
- [/ansible-runner/, /[python\d]+-ansible-runner/]
33
- end
34
29
  end
@@ -1,4 +1,6 @@
1
1
  class Checks::CheckUpstreamRepository < ForemanMaintain::Check
2
+ include ForemanMaintain::Concerns::Upstream
3
+
2
4
  metadata do
3
5
  label :check_upstream_repository
4
6
  description 'Check if any upstream repositories are enabled on system'
@@ -14,7 +16,7 @@ class Checks::CheckUpstreamRepository < ForemanMaintain::Check
14
16
 
15
17
  def run
16
18
  with_spinner('Checking for presence of upstream repositories') do
17
- enabled_repo_ids = feature(:upstream_repositories).repoids_and_urls.keys
19
+ enabled_repo_ids = repoids_and_urls.keys
18
20
  assert(enabled_repo_ids.empty?,
19
21
  "System has upstream #{enabled_repo_ids.join(',')} repositories enabled",
20
22
  :next_steps => Procedures::Repositories::Disable.new(:repos => enabled_repo_ids))
@@ -1,5 +1,6 @@
1
1
  class Features::Capsule < ForemanMaintain::Feature
2
2
  include ForemanMaintain::Concerns::Downstream
3
+ include ForemanMaintain::Concerns::Versions
3
4
 
4
5
  metadata do
5
6
  label :capsule
@@ -0,0 +1,12 @@
1
+ class Features::ForemanInstall < ForemanMaintain::Feature
2
+ include ForemanMaintain::Concerns::Upstream
3
+ include ForemanMaintain::Concerns::Versions
4
+
5
+ metadata do
6
+ label :foreman_install
7
+
8
+ confine do
9
+ !feature(:instance).downstream && !feature(:katello) && feature(:foreman_server)
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,7 @@
1
1
  module ForemanMaintain
2
2
  module Features
3
3
  class ForemanServer < ForemanMaintain::Feature
4
+ include ForemanMaintain::Concerns::Versions
4
5
  metadata do
5
6
  label :foreman_server
6
7
  confine do
@@ -47,6 +48,10 @@ module ForemanMaintain
47
48
  def services_running?
48
49
  services.all?(&:running?)
49
50
  end
51
+
52
+ def current_version
53
+ @current_version ||= package_version('foreman')
54
+ end
50
55
  end
51
56
  end
52
57
  end
@@ -92,11 +92,18 @@ class Features::Installer < ForemanMaintain::Feature
92
92
  end
93
93
 
94
94
  def run(arguments = '', exec_options = {})
95
- out = execute!("LANG=en_US.utf-8 #{installer_command} #{arguments}".strip, exec_options)
95
+ out = execute!("#{installer_command} #{arguments}".strip, exec_options)
96
96
  @configuration = nil
97
97
  out
98
98
  end
99
99
 
100
+ def run_with_status(arguments = '', exec_options = {})
101
+ cmd_with_arguments = "#{installer_command} #{arguments}".strip
102
+ cmd_status, out = execute_with_status(cmd_with_arguments, exec_options)
103
+ @configuration = nil
104
+ [cmd_status, out]
105
+ end
106
+
100
107
  def upgrade(exec_options = {})
101
108
  run(installer_arguments, exec_options)
102
109
  end
@@ -105,13 +112,15 @@ class Features::Installer < ForemanMaintain::Feature
105
112
  installer_args = ''
106
113
 
107
114
  if feature(:foreman_proxy) &&
108
- feature(:foreman_proxy).with_content?
115
+ feature(:foreman_proxy).with_content? &&
116
+ check_max_version('foreman-installer', '3.4')
109
117
  installer_args += ' --disable-system-checks'
110
118
  end
111
119
 
112
- unless check_min_version('foreman', '2.1') || check_min_version('foreman-proxy', '2.1')
120
+ unless check_min_version('foreman-installer', '2.1')
113
121
  installer_args += ' --upgrade' if can_upgrade?
114
122
  end
123
+
115
124
  installer_args
116
125
  end
117
126
 
@@ -60,8 +60,13 @@ class Features::Instance < ForemanMaintain::Feature
60
60
  end
61
61
  end
62
62
 
63
+ def foreman_server_ssl_ca
64
+ @foreman_server_ssl_ca ||= feature(:installer).answers['foreman']['server_ssl_ca']
65
+ end
66
+
63
67
  def server_connection
64
68
  net = Net::HTTP.new(ForemanMaintain.config.foreman_url, ForemanMaintain.config.foreman_port)
69
+ net.ca_file = foreman_server_ssl_ca
65
70
  net.use_ssl = true
66
71
  net
67
72
  end
@@ -74,6 +79,10 @@ class Features::Instance < ForemanMaintain::Feature
74
79
  feature(:nftables) || feature(:iptables)
75
80
  end
76
81
 
82
+ def upstream_install
83
+ feature(:foreman_install) || feature(:katello_install)
84
+ end
85
+
77
86
  private
78
87
 
79
88
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
@@ -1,4 +1,6 @@
1
1
  class Features::Katello < ForemanMaintain::Feature
2
+ include ForemanMaintain::Concerns::Versions
3
+
2
4
  metadata do
3
5
  label :katello
4
6
 
@@ -0,0 +1,12 @@
1
+ class Features::KatelloInstall < ForemanMaintain::Feature
2
+ include ForemanMaintain::Concerns::Upstream
3
+ include ForemanMaintain::Concerns::Versions
4
+
5
+ metadata do
6
+ label :katello_install
7
+
8
+ confine do
9
+ !feature(:instance).downstream && feature(:katello)
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,6 @@
1
1
  class Features::Satellite < ForemanMaintain::Feature
2
2
  include ForemanMaintain::Concerns::Downstream
3
+ include ForemanMaintain::Concerns::Versions
3
4
 
4
5
  metadata do
5
6
  label :satellite
@@ -19,7 +19,7 @@ module Procedures::Content
19
19
  puts execute!('foreman-rake katello:pulp3_post_migration_check')
20
20
  puts 'Switching specified content over to pulp 3'
21
21
  puts execute!('foreman-rake katello:pulp3_content_switchover')
22
- run_installer if feature(:upstream)
22
+ run_installer if feature(:katello_install)
23
23
  end
24
24
 
25
25
  def run_installer
@@ -0,0 +1,16 @@
1
+ module Procedures::Packages
2
+ class EnableModules < ForemanMaintain::Procedure
3
+ metadata do
4
+ description 'Enable the given stream modules'
5
+ confine do
6
+ package_manager.class.name == 'ForemanMaintain::PackageManager::Dnf'
7
+ end
8
+ param :module_names, 'Module names', :array => true, :required => true
9
+ advanced_run false
10
+ end
11
+
12
+ def run
13
+ execute!("dnf module enable #{@module_names.join(' ')} -y")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ module Procedures::Packages
2
+ class Uninstall < ForemanMaintain::Procedure
3
+ metadata do
4
+ description 'Uninstall packages'
5
+ param :packages, 'List of packages to uninstall', :array => true
6
+ param :assumeyes, 'Do not ask for confirmation'
7
+ param :warn_on_errors, 'Do not interrupt scenario on failure',
8
+ :flag => true, :default => false
9
+ end
10
+
11
+ def run
12
+ assumeyes_val = @assumeyes.nil? ? assumeyes? : @assumeyes
13
+ packages_action(:remove, @packages, :assumeyes => assumeyes_val)
14
+ rescue ForemanMaintain::Error::ExecutionError => e
15
+ if @warn_on_errors
16
+ set_status(:warning, e.message)
17
+ else
18
+ raise
19
+ end
20
+ end
21
+
22
+ def necessary?
23
+ @force || @packages.any? { |package| package_version(package).nil? }
24
+ end
25
+
26
+ def runtime_message
27
+ "Uninstalling package(s) #{@packages.join(', ')}"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ module Procedures::Pulpcore
2
+ class TrimRpmChangelogs < ForemanMaintain::Procedure
3
+ include ForemanMaintain::Concerns::SystemService
4
+
5
+ metadata do
6
+ description 'Trim RPM changelogs in the pulpcore db'
7
+ for_feature :pulpcore
8
+ end
9
+
10
+ def run
11
+ with_spinner('Trimming RPM changelogs in the pulpcore db') do |spinner|
12
+ necessary_services = feature(:pulpcore_database).services
13
+
14
+ feature(:service).handle_services(spinner, 'start', :only => necessary_services)
15
+
16
+ spinner.update('Trimming RPM changelogs')
17
+ execute!('sudo PULP_SETTINGS=/etc/pulp/settings.py '\
18
+ 'DJANGO_SETTINGS_MODULE=pulpcore.app.settings '\
19
+ 'pulpcore-manager rpm-trim-changelogs')
20
+ end
21
+ end
22
+ end
23
+ end
@@ -13,7 +13,8 @@ module Procedures::Repositories
13
13
 
14
14
  def run
15
15
  with_spinner("Configuring repositories for #{@version}") do
16
- (feature(:instance).downstream || feature(:upstream)).setup_repositories(@version)
16
+ (feature(:instance).downstream || \
17
+ feature(:instance).upstream_install).setup_repositories(@version)
17
18
  end
18
19
  end
19
20
  end
@@ -1,12 +1,14 @@
1
1
  module ForemanMaintain::Scenarios
2
2
  class SelfUpgradeBase < ForemanMaintain::Scenario
3
3
  include ForemanMaintain::Concerns::Downstream
4
+ include ForemanMaintain::Concerns::Versions
5
+
4
6
  def target_version
5
- @target_version ||= current_version.bump
7
+ @target_version ||= Gem::Version.new(current_version).bump.to_s
6
8
  end
7
9
 
8
10
  def current_version
9
- feature(:instance).downstream.current_minor_version
11
+ feature(:instance).downstream.current_version.to_s[/^\d+\.\d+\.\d+/]
10
12
  end
11
13
 
12
14
  def maintenance_repo_label
@@ -48,6 +50,14 @@ module ForemanMaintain::Scenarios
48
50
  [maintenance_repo_id(target_version)]
49
51
  end
50
52
  end
53
+
54
+ def upstream_target_version
55
+ if feature(:katello_install)
56
+ return foreman_version_by_katello(target_version)
57
+ else
58
+ target_version
59
+ end
60
+ end
51
61
  end
52
62
 
53
63
  class SelfUpgrade < SelfUpgradeBase
@@ -58,9 +68,8 @@ module ForemanMaintain::Scenarios
58
68
  manual_detection
59
69
  end
60
70
 
61
- def compose
71
+ def downstream_self_upgrade(pkgs_to_update)
62
72
  if check_min_version('foreman', '2.5') || check_min_version('foreman-proxy', '2.5')
63
- pkgs_to_update = %w[satellite-maintain rubygem-foreman_maintain]
64
73
  yum_options = req_repos_to_update_pkgs.map do |id|
65
74
  "--enablerepo=#{id}"
66
75
  end
@@ -68,5 +77,42 @@ module ForemanMaintain::Scenarios
68
77
  yum_options: yum_options))
69
78
  end
70
79
  end
80
+
81
+ def upstream_self_upgrade(pkgs_to_update)
82
+ # This method is responsible for
83
+ # 1. Setup the repositories of next major version
84
+ # 2. Update the foreman-maintain packages from next major version repository
85
+ # 3. Rollback the repository to current major version
86
+
87
+ add_step(Procedures::Repositories::Setup.new(:version => upstream_target_version))
88
+ add_step(Procedures::Packages::Update.new(packages: pkgs_to_update, assumeyes: true))
89
+ ensure
90
+ rollback_repositories
91
+ end
92
+
93
+ def rollback_repositories
94
+ installed_release_pkg = package_manager.find_installed_package('foreman-release',
95
+ '%{VERSION}')
96
+
97
+ unless current_version.nil? && installed_release_pkg.nil?
98
+ current_major_version = current_version[0..2]
99
+ installed_foreman_release_major_version = installed_release_pkg[0..2]
100
+ if installed_foreman_release_major_version != current_major_version
101
+ add_step(Procedures::Packages::Uninstall.new(packages: %w[foreman-release katello-repos],
102
+ assumeyes: true))
103
+ add_step(Procedures::Repositories::Setup.new(:version => current_major_version))
104
+ end
105
+ end
106
+ end
107
+
108
+ def compose
109
+ pkgs_to_update = %w[rubygem-foreman_maintain]
110
+ if feature(:instance).downstream
111
+ pkgs_to_update << 'satellite-maintain'
112
+ downstream_self_upgrade(pkgs_to_update)
113
+ elsif feature(:instance).upstream_install
114
+ upstream_self_upgrade(pkgs_to_update)
115
+ end
116
+ end
71
117
  end
72
118
  end
@@ -0,0 +1,89 @@
1
+ module Scenarios::Foreman_Nightly
2
+ class Abstract < ForemanMaintain::Scenario
3
+ def self.upgrade_metadata(&block)
4
+ metadata do
5
+ tags :upgrade_scenario
6
+ confine do
7
+ feature(:foreman_install) || ForemanMaintain.upgrade_in_progress == 'nightly'
8
+ end
9
+ instance_eval(&block)
10
+ end
11
+ end
12
+
13
+ def target_version
14
+ 'nightly'
15
+ end
16
+ end
17
+
18
+ class PreUpgradeCheck < Abstract
19
+ upgrade_metadata do
20
+ description 'Checks before upgrading to Foreman nightly'
21
+ tags :pre_upgrade_checks
22
+ run_strategy :fail_slow
23
+ end
24
+
25
+ def compose
26
+ add_steps(find_checks(:default))
27
+ add_steps(find_checks(:pre_upgrade))
28
+ end
29
+ end
30
+
31
+ class PreMigrations < Abstract
32
+ upgrade_metadata do
33
+ description 'Procedures before upgrading to Foreman nightly'
34
+ tags :pre_migrations
35
+ end
36
+
37
+ def compose
38
+ add_steps(find_procedures(:pre_migrations))
39
+ end
40
+ end
41
+
42
+ class Migrations < Abstract
43
+ upgrade_metadata do
44
+ description 'Upgrade steps for Foreman nightly'
45
+ tags :migrations
46
+ run_strategy :fail_fast
47
+ end
48
+
49
+ def set_context_mapping
50
+ context.map(:assumeyes, Procedures::Installer::Upgrade => :assumeyes)
51
+ end
52
+
53
+ def compose
54
+ add_step(Procedures::Repositories::Setup.new(:version => 'nightly'))
55
+ if el?
56
+ modules_to_enable = ["foreman:#{el_short_name}"]
57
+ add_step(Procedures::Packages::EnableModules.new(:module_names => modules_to_enable))
58
+ end
59
+ add_step(Procedures::Packages::Update.new(:assumeyes => true))
60
+ add_step_with_context(Procedures::Installer::Upgrade)
61
+ end
62
+ end
63
+
64
+ class PostMigrations < Abstract
65
+ upgrade_metadata do
66
+ description 'Post upgrade procedures for Foreman nightly'
67
+ tags :post_migrations
68
+ end
69
+
70
+ def compose
71
+ add_step(Procedures::RefreshFeatures)
72
+ add_step(Procedures::Service::Start.new)
73
+ add_steps(find_procedures(:post_migrations))
74
+ end
75
+ end
76
+
77
+ class PostUpgradeChecks < Abstract
78
+ upgrade_metadata do
79
+ description 'Checks after upgrading to Foreman nightly'
80
+ tags :post_upgrade_checks
81
+ run_strategy :fail_slow
82
+ end
83
+
84
+ def compose
85
+ add_steps(find_checks(:default))
86
+ add_steps(find_checks(:post_upgrade))
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,87 @@
1
+ module Scenarios::Katello_Nightly
2
+ class Abstract < ForemanMaintain::Scenario
3
+ def self.upgrade_metadata(&block)
4
+ metadata do
5
+ tags :upgrade_scenario
6
+ confine do
7
+ feature(:katello_install) || ForemanMaintain.upgrade_in_progress == 'nightly'
8
+ end
9
+ instance_eval(&block)
10
+ end
11
+ end
12
+
13
+ def target_version
14
+ 'nightly'
15
+ end
16
+ end
17
+
18
+ class PreUpgradeCheck < Abstract
19
+ upgrade_metadata do
20
+ description 'Checks before upgrading to Katello nightly'
21
+ tags :pre_upgrade_checks
22
+ run_strategy :fail_slow
23
+ end
24
+
25
+ def compose
26
+ add_steps(find_checks(:default))
27
+ add_steps(find_checks(:pre_upgrade))
28
+ end
29
+ end
30
+
31
+ class PreMigrations < Abstract
32
+ upgrade_metadata do
33
+ description 'Procedures before upgrading to Katello nightly'
34
+ tags :pre_migrations
35
+ end
36
+
37
+ def compose
38
+ add_steps(find_procedures(:pre_migrations))
39
+ end
40
+ end
41
+
42
+ class Migrations < Abstract
43
+ upgrade_metadata do
44
+ description 'Upgrade steps for Katello nightly'
45
+ tags :migrations
46
+ run_strategy :fail_fast
47
+ end
48
+
49
+ def set_context_mapping
50
+ context.map(:assumeyes, Procedures::Installer::Upgrade => :assumeyes)
51
+ end
52
+
53
+ def compose
54
+ add_step(Procedures::Repositories::Setup.new(:version => 'nightly'))
55
+ modules_to_enable = ["katello:#{el_short_name}", "pulpcore:#{el_short_name}"]
56
+ add_step(Procedures::Packages::EnableModules.new(:module_names => modules_to_enable))
57
+ add_step(Procedures::Packages::Update.new(:assumeyes => true))
58
+ add_step_with_context(Procedures::Installer::Upgrade)
59
+ end
60
+ end
61
+
62
+ class PostMigrations < Abstract
63
+ upgrade_metadata do
64
+ description 'Post upgrade procedures for Katello nightly'
65
+ tags :post_migrations
66
+ end
67
+
68
+ def compose
69
+ add_step(Procedures::RefreshFeatures)
70
+ add_step(Procedures::Service::Start.new)
71
+ add_steps(find_procedures(:post_migrations))
72
+ end
73
+ end
74
+
75
+ class PostUpgradeChecks < Abstract
76
+ upgrade_metadata do
77
+ description 'Checks after upgrading to Katello nightly'
78
+ tags :post_upgrade_checks
79
+ run_strategy :fail_slow
80
+ end
81
+
82
+ def compose
83
+ add_steps(find_checks(:default))
84
+ add_steps(find_checks(:post_upgrade))
85
+ end
86
+ end
87
+ end
@@ -76,6 +76,7 @@ module Scenarios::Satellite_6_11
76
76
  def compose
77
77
  add_step(Procedures::RefreshFeatures)
78
78
  add_step(Procedures::Service::Start.new)
79
+ add_step(Procedures::Pulpcore::TrimRpmChangelogs.new)
79
80
  add_steps(find_procedures(:post_migrations))
80
81
  end
81
82
  end
@@ -73,6 +73,7 @@ module Scenarios::Satellite_6_12
73
73
  def compose
74
74
  add_step(Procedures::RefreshFeatures)
75
75
  add_step(Procedures::Service::Start.new)
76
+ add_step(Procedures::Pulpcore::TrimRpmChangelogs.new)
76
77
  add_steps(find_procedures(:post_migrations))
77
78
  end
78
79
  end
@@ -72,6 +72,7 @@ module Scenarios::Satellite_6_12_z
72
72
  def compose
73
73
  add_step(Procedures::RefreshFeatures)
74
74
  add_step(Procedures::Service::Start.new)
75
+ add_step(Procedures::Pulpcore::TrimRpmChangelogs.new)
75
76
  add_steps(find_procedures(:post_migrations))
76
77
  end
77
78
  end
@@ -20,7 +20,12 @@ yum-utils
20
20
  # el7 psql client dependencies
21
21
  rh-postgresql12-postgresql
22
22
  rh-postgresql12-postgresql-libs
23
+ rh-postgresql12-postgresql-syspaths
23
24
  rh-postgresql12-runtime
25
+ scl-utils
26
+ # el8 psql client dependencies
27
+ postgresql
28
+ libpq
24
29
  # el8 yum-utils dependencies
25
30
  dnf-plugins-core
26
31
  python3-dnf-plugins-core
@@ -52,12 +52,16 @@ module ForemanMaintain
52
52
  target_versions.sort.each { |version| puts version }
53
53
  end
54
54
 
55
+ def allow_self_upgrade?
56
+ !disable_self_upgrade?
57
+ end
58
+
55
59
  subcommand 'list-versions', 'List versions this system is upgradable to' do
56
60
  disable_self_upgrade_option
57
61
 
58
62
  def execute
59
63
  ForemanMaintain.validate_downstream_packages
60
- ForemanMaintain.perform_self_upgrade unless disable_self_upgrade?
64
+ ForemanMaintain.perform_self_upgrade if allow_self_upgrade?
61
65
  print_versions(UpgradeRunner.available_targets)
62
66
  end
63
67
  end
@@ -69,7 +73,7 @@ module ForemanMaintain
69
73
 
70
74
  def execute
71
75
  ForemanMaintain.validate_downstream_packages
72
- ForemanMaintain.perform_self_upgrade unless disable_self_upgrade?
76
+ ForemanMaintain.perform_self_upgrade if allow_self_upgrade?
73
77
  upgrade_runner.run_phase(:pre_upgrade_checks)
74
78
  exit upgrade_runner.exit_code
75
79
  end
@@ -89,7 +93,7 @@ module ForemanMaintain
89
93
 
90
94
  def execute
91
95
  ForemanMaintain.validate_downstream_packages
92
- ForemanMaintain.perform_self_upgrade unless disable_self_upgrade?
96
+ ForemanMaintain.perform_self_upgrade if allow_self_upgrade?
93
97
  if phase
94
98
  upgrade_runner.run_phase(phase.to_sym)
95
99
  else
@@ -5,18 +5,6 @@ module ForemanMaintain
5
5
  raise NotImplementedError
6
6
  end
7
7
 
8
- def less_than_version?(version)
9
- Gem::Version.new(current_version) < Gem::Version.new(version)
10
- end
11
-
12
- def at_least_version?(version)
13
- Gem::Version.new(current_version) >= Gem::Version.new(version)
14
- end
15
-
16
- def current_minor_version
17
- current_version.to_s[/^\d+\.\d+/]
18
- end
19
-
20
8
  def repository_manager
21
9
  ForemanMaintain.repository_manager
22
10
  end
@@ -0,0 +1,17 @@
1
+ module ForemanMaintain
2
+ module Concerns
3
+ module ForemanAndKatelloVersionMap
4
+ FOREMAN_AND_KATELLO_VERSION_MAP = {
5
+ 'nightly' => 'nightly'
6
+ }.freeze
7
+
8
+ def foreman_version_by_katello(version)
9
+ FOREMAN_AND_KATELLO_VERSION_MAP.key(version)
10
+ end
11
+
12
+ def katello_version_by_foreman(version)
13
+ FOREMAN_AND_KATELLO_VERSION_MAP.fetch(version)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -89,6 +89,31 @@ module ForemanMaintain
89
89
  def os_version
90
90
  facts.fetch('VERSION')
91
91
  end
92
+
93
+ def os_version_codename
94
+ facts.fetch('VERSION_CODENAME')
95
+ end
96
+
97
+ def rhel?
98
+ os_id == 'rhel'
99
+ end
100
+
101
+ def centos?
102
+ os_id == 'centos'
103
+ end
104
+
105
+ def el_short_name
106
+ "el#{el_major_version}"
107
+ end
108
+
109
+ def memory
110
+ meminfo = File.read('/proc/meminfo')
111
+ meminfo.match(/^MemTotal:\s+(?<memory>\d+) kB/)['memory']
112
+ end
113
+
114
+ def cpu_cores
115
+ execute('nproc')
116
+ end
92
117
  end
93
118
  end
94
119
  end
@@ -0,0 +1,103 @@
1
+ module ForemanMaintain
2
+ module Concerns
3
+ module Upstream
4
+ include Concerns::ForemanAndKatelloVersionMap
5
+
6
+ def server_url
7
+ if el?
8
+ 'https://yum.theforeman.org/'
9
+ elsif debian_or_ubuntu?
10
+ 'https://deb.theforeman.org/'
11
+ else
12
+ raise 'Unknown operating system detected!'
13
+ end
14
+ end
15
+
16
+ def foreman_release_pkg_url(version)
17
+ if el?
18
+ "#{server_url}releases/#{version}/#{el_short_name}/x86_64/foreman-release.rpm"
19
+ elsif debian_or_ubuntu?
20
+ "#{server_url}pool/#{os_version_codename}/#{version}"\
21
+ '/f/foreman-release/foreman-release.deb'
22
+ else
23
+ raise 'Unknown operating system detected!'
24
+ end
25
+ end
26
+
27
+ def katello_pkgs_url(katello_version)
28
+ "#{server_url}katello/#{katello_version}/katello/#{el_short_name}/x86_64/"
29
+ end
30
+
31
+ def katello_release_pkg(version)
32
+ "#{katello_pkgs_url(katello_version_by_foreman(version))}katello-repos-latest.rpm"
33
+ end
34
+
35
+ def update_release_pkg_el(pkg_url)
36
+ package_manager.install(pkg_url, assumeyes: true)
37
+ end
38
+
39
+ def update_release_pkg_deb(pkg_url)
40
+ Dir.mktmpdir do |dir|
41
+ release_file_path = "#{dir}/foreman-release.deb"
42
+ exit_status, = execute_with_status("wget -q -O #{release_file_path} #{pkg_url}")
43
+ if exit_status == 0
44
+ package_manager.install(release_file_path, assumeyes: true)
45
+ else
46
+ warn! "Couldn't install Foreman release package: #{pkg_url}"
47
+ end
48
+ end
49
+ end
50
+
51
+ def use_activation_key(activation_key, org)
52
+ org_options = org ? %(--org #{shellescape(org)}) : ''
53
+ execute!(%(subscription-manager register #{org_options}\
54
+ --activationkey #{shellescape(activation_key)} --force))
55
+ end
56
+
57
+ def update_foreman_release_pkg(version)
58
+ pkg_url = foreman_release_pkg_url(version)
59
+ if el?
60
+ update_release_pkg_el(pkg_url)
61
+ elsif debian_or_ubuntu?
62
+ update_release_pkg_deb(pkg_url)
63
+ end
64
+ end
65
+
66
+ def update_katello_release_pkg(version)
67
+ if feature(:katello)
68
+ pkg_url = katello_release_pkg(version)
69
+ update_release_pkg_el(pkg_url)
70
+ end
71
+ end
72
+
73
+ def setup_repositories(version)
74
+ # Documentation needs update with respect to new env vars
75
+ activation_key = ENV['ACTIVATION_KEY']
76
+ org = ENV['FOREMAN_ORG']
77
+ if activation_key
78
+ use_activation_key(activation_key, org)
79
+ else
80
+ update_foreman_release_pkg(version)
81
+ update_katello_release_pkg(version)
82
+ end
83
+ end
84
+
85
+ def repoids_and_urls
86
+ repoids_and_urls = {}
87
+ repository_manager.enabled_repos.each do |repo, url|
88
+ repo_urls.each do |regex|
89
+ repoids_and_urls[repo] = url if url =~ regex
90
+ end
91
+ end
92
+ repoids_and_urls
93
+ end
94
+
95
+ private
96
+
97
+ def repo_urls
98
+ [%r{yum.theforeman.org\/*},
99
+ %r{yum.puppetlabs.com\/*}]
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,17 @@
1
+ module ForemanMaintain
2
+ module Concerns
3
+ module Versions
4
+ def less_than_version?(version)
5
+ Gem::Version.new(current_version) < Gem::Version.new(version)
6
+ end
7
+
8
+ def at_least_version?(version)
9
+ Gem::Version.new(current_version) >= Gem::Version.new(version)
10
+ end
11
+
12
+ def current_minor_version
13
+ current_version.to_s[/^\d+\.\d+/]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,5 @@
1
+ require 'open3'
2
+
1
3
  module ForemanMaintain::PackageManager
2
4
  class Apt < Base
3
5
  def installed?(packages)
@@ -41,6 +43,11 @@ module ForemanMaintain::PackageManager
41
43
  apt_action('upgrade --dry-run', packages, :with_status => with_status)
42
44
  end
43
45
 
46
+ def update_available?(package)
47
+ output, status = Open3.capture2("apt-get install #{package} --dry-run")
48
+ status.success? && output.include?("Inst #{package}")
49
+ end
50
+
44
51
  def list_installed_packages(queryfm = '${binary:Package}-${VERSION}\n')
45
52
  # The queryfm should only include valid tag(s) as per `dpkg-query` man page.
46
53
  # If any special formatting is required with querytag then it should be provided with tag i.e,
@@ -4,6 +4,7 @@ module ForemanMaintain
4
4
  include Concerns::SystemHelpers
5
5
  include Concerns::ScenarioMetadata
6
6
  include Concerns::Finders
7
+ include Concerns::Versions
7
8
  extend Concerns::Finders
8
9
 
9
10
  attr_reader :steps, :context
@@ -1,3 +1,3 @@
1
1
  module ForemanMaintain
2
- VERSION = '1.1.7'.freeze
2
+ VERSION = '1.2.0'.freeze
3
3
  end
@@ -21,7 +21,10 @@ module ForemanMaintain
21
21
  require 'foreman_maintain/concerns/hammer'
22
22
  require 'foreman_maintain/concerns/base_database'
23
23
  require 'foreman_maintain/concerns/directory_marker'
24
+ require 'foreman_maintain/concerns/versions'
24
25
  require 'foreman_maintain/concerns/downstream'
26
+ require 'foreman_maintain/concerns/foreman_and_katello_version_map'
27
+ require 'foreman_maintain/concerns/upstream'
25
28
  require 'foreman_maintain/concerns/primary_checks'
26
29
  require 'foreman_maintain/concerns/pulp_common'
27
30
  require 'foreman_maintain/concerns/firewall/iptables_maintenance_mode'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_maintain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nečas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-26 00:00:00.000000000 Z
11
+ date: 2022-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clamp
@@ -161,6 +161,7 @@ files:
161
161
  - definitions/checks/foreman/check_duplicate_roles.rb
162
162
  - definitions/checks/foreman/check_https_proxies.rb
163
163
  - definitions/checks/foreman/check_puppet_capsules.rb
164
+ - definitions/checks/foreman/check_tuning_requirements.rb
164
165
  - definitions/checks/foreman/db_up.rb
165
166
  - definitions/checks/foreman/facts_names.rb
166
167
  - definitions/checks/foreman/puppet_class_duplicates.rb
@@ -201,10 +202,9 @@ files:
201
202
  - definitions/features/capsule.rb
202
203
  - definitions/features/cron.rb
203
204
  - definitions/features/dynflow_sidekiq.rb
204
- - definitions/features/foreman_1_11_x.rb
205
- - definitions/features/foreman_1_7_x.rb
206
205
  - definitions/features/foreman_cockpit.rb
207
206
  - definitions/features/foreman_database.rb
207
+ - definitions/features/foreman_install.rb
208
208
  - definitions/features/foreman_openscap.rb
209
209
  - definitions/features/foreman_proxy.rb
210
210
  - definitions/features/foreman_server.rb
@@ -215,6 +215,7 @@ files:
215
215
  - definitions/features/instance.rb
216
216
  - definitions/features/iptables.rb
217
217
  - definitions/features/katello.rb
218
+ - definitions/features/katello_install.rb
218
219
  - definitions/features/mongo.rb
219
220
  - definitions/features/nftables.rb
220
221
  - definitions/features/pulp2.rb
@@ -226,8 +227,6 @@ files:
226
227
  - definitions/features/service.rb
227
228
  - definitions/features/sync_plans.rb
228
229
  - definitions/features/tar.rb
229
- - definitions/features/upstream.rb
230
- - definitions/features/upstream_repositories.rb
231
230
  - definitions/procedures/backup/accessibility_confirmation.rb
232
231
  - definitions/procedures/backup/clean.rb
233
232
  - definitions/procedures/backup/compress_data.rb
@@ -285,10 +284,12 @@ files:
285
284
  - definitions/procedures/maintenance_mode/enable_maintenance_mode.rb
286
285
  - definitions/procedures/maintenance_mode/is_enabled.rb
287
286
  - definitions/procedures/packages/check_update.rb
287
+ - definitions/procedures/packages/enable_modules.rb
288
288
  - definitions/procedures/packages/install.rb
289
289
  - definitions/procedures/packages/installer_confirmation.rb
290
290
  - definitions/procedures/packages/lock_versions.rb
291
291
  - definitions/procedures/packages/locking_status.rb
292
+ - definitions/procedures/packages/uninstall.rb
292
293
  - definitions/procedures/packages/unlock_versions.rb
293
294
  - definitions/procedures/packages/update.rb
294
295
  - definitions/procedures/packages/update_all_confirmation.rb
@@ -298,6 +299,7 @@ files:
298
299
  - definitions/procedures/pulp/print_remove_instructions.rb
299
300
  - definitions/procedures/pulp/remove.rb
300
301
  - definitions/procedures/pulpcore/migrate.rb
302
+ - definitions/procedures/pulpcore/trim_rpm_changelogs.rb
301
303
  - definitions/procedures/puppet/delete_empty_ca_cert_request_files.rb
302
304
  - definitions/procedures/puppet/remove_puppet.rb
303
305
  - definitions/procedures/puppet/remove_puppet_data.rb
@@ -352,6 +354,8 @@ files:
352
354
  - definitions/scenarios/upgrade_to_capsule_6_8_z.rb
353
355
  - definitions/scenarios/upgrade_to_capsule_6_9.rb
354
356
  - definitions/scenarios/upgrade_to_capsule_6_9_z.rb
357
+ - definitions/scenarios/upgrade_to_foreman_nightly.rb
358
+ - definitions/scenarios/upgrade_to_katello_nightly.rb
355
359
  - definitions/scenarios/upgrade_to_satellite_6_10.rb
356
360
  - definitions/scenarios/upgrade_to_satellite_6_10_z.rb
357
361
  - definitions/scenarios/upgrade_to_satellite_6_11.rb
@@ -408,6 +412,7 @@ files:
408
412
  - lib/foreman_maintain/concerns/firewall/iptables_maintenance_mode.rb
409
413
  - lib/foreman_maintain/concerns/firewall/maintenance_mode.rb
410
414
  - lib/foreman_maintain/concerns/firewall/nftables_maintenance_mode.rb
415
+ - lib/foreman_maintain/concerns/foreman_and_katello_version_map.rb
411
416
  - lib/foreman_maintain/concerns/hammer.rb
412
417
  - lib/foreman_maintain/concerns/logger.rb
413
418
  - lib/foreman_maintain/concerns/metadata.rb
@@ -418,6 +423,8 @@ files:
418
423
  - lib/foreman_maintain/concerns/scenario_metadata.rb
419
424
  - lib/foreman_maintain/concerns/system_helpers.rb
420
425
  - lib/foreman_maintain/concerns/system_service.rb
426
+ - lib/foreman_maintain/concerns/upstream.rb
427
+ - lib/foreman_maintain/concerns/versions.rb
421
428
  - lib/foreman_maintain/config.rb
422
429
  - lib/foreman_maintain/context.rb
423
430
  - lib/foreman_maintain/core_ext.rb
@@ -1,9 +0,0 @@
1
- require 'features/foreman_1_7_x'
2
-
3
- class Features::Foreman_1_11_x < Features::Foreman_1_7_x
4
- metadata do
5
- confine do
6
- check_min_version('foreman', '1.11')
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class Features::Foreman_1_7_x < ForemanMaintain::Feature
2
- metadata do
3
- label :foreman
4
-
5
- confine do
6
- check_min_version('foreman', '1.7')
7
- end
8
- end
9
- end
@@ -1,14 +0,0 @@
1
- class Features::Upstream < ForemanMaintain::Feature
2
- metadata do
3
- label :upstream
4
-
5
- confine do
6
- # TODO: remove this upstream feature
7
- !feature(:instance).downstream
8
- end
9
- end
10
-
11
- def setup_repositories(_version)
12
- raise NotImplementedError
13
- end
14
- end
@@ -1,23 +0,0 @@
1
- class Features::UpstreamRepositories < ForemanMaintain::Feature
2
- metadata do
3
- label :upstream_repositories
4
- description 'Feature for operations on upstream repositories'
5
- end
6
-
7
- def repoids_and_urls
8
- repoids_and_urls = {}
9
- repository_manager.enabled_repos.each do |repo, url|
10
- repo_urls.each do |regex|
11
- repoids_and_urls[repo] = url if url =~ regex
12
- end
13
- end
14
- repoids_and_urls
15
- end
16
-
17
- private
18
-
19
- def repo_urls
20
- [%r{yum.theforeman.org\/*},
21
- %r{yum.puppetlabs.com\/*}]
22
- end
23
- end