foreman_maintain 0.6.1 → 0.6.6

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/definitions/checks/check_hotfix_installed.rb +2 -1
  4. data/definitions/checks/disk/performance.rb +24 -9
  5. data/definitions/checks/foreman/check_corrupted_roles.rb +14 -2
  6. data/definitions/checks/foreman/validate_external_db_version.rb +28 -0
  7. data/definitions/checks/foreman_proxy/check_tftp_storage.rb +52 -0
  8. data/definitions/checks/original_assets.rb +1 -0
  9. data/definitions/checks/repositories/check_non_rh_repository.rb +23 -0
  10. data/definitions/checks/repositories/check_upstream_repository.rb +2 -1
  11. data/definitions/checks/repositories/validate.rb +2 -1
  12. data/definitions/features/apache.rb +19 -0
  13. data/definitions/features/capsule.rb +2 -1
  14. data/definitions/features/dynflow_sidekiq.rb +1 -1
  15. data/definitions/features/foreman_proxy.rb +30 -5
  16. data/definitions/features/foreman_server.rb +10 -4
  17. data/definitions/features/installer.rb +9 -2
  18. data/definitions/features/katello.rb +7 -0
  19. data/definitions/features/puppet_server.rb +6 -2
  20. data/definitions/features/service.rb +10 -3
  21. data/definitions/procedures/backup/config_files.rb +3 -0
  22. data/definitions/procedures/backup/metadata.rb +2 -0
  23. data/definitions/procedures/content/prepare.rb +1 -1
  24. data/definitions/procedures/content/switchover.rb +9 -4
  25. data/definitions/procedures/hammer_setup.rb +1 -1
  26. data/definitions/procedures/installer/run.rb +3 -1
  27. data/definitions/procedures/installer/upgrade.rb +6 -1
  28. data/definitions/procedures/packages/update.rb +1 -1
  29. data/definitions/procedures/restore/configs.rb +6 -0
  30. data/definitions/procedures/restore/regenerate_queues.rb +69 -0
  31. data/definitions/procedures/service/stop.rb +1 -1
  32. data/definitions/scenarios/backup.rb +3 -1
  33. data/definitions/scenarios/content.rb +27 -0
  34. data/definitions/scenarios/packages.rb +36 -16
  35. data/definitions/scenarios/restore.rb +17 -2
  36. data/definitions/scenarios/upgrade_to_capsule_6_8.rb +88 -0
  37. data/definitions/scenarios/upgrade_to_capsule_6_8_z.rb +88 -0
  38. data/definitions/scenarios/upgrade_to_satellite_6_2.rb +13 -5
  39. data/definitions/scenarios/upgrade_to_satellite_6_2_z.rb +13 -5
  40. data/definitions/scenarios/upgrade_to_satellite_6_3.rb +13 -5
  41. data/definitions/scenarios/upgrade_to_satellite_6_3_z.rb +13 -5
  42. data/definitions/scenarios/upgrade_to_satellite_6_4.rb +13 -5
  43. data/definitions/scenarios/upgrade_to_satellite_6_4_z.rb +13 -5
  44. data/definitions/scenarios/upgrade_to_satellite_6_5.rb +13 -5
  45. data/definitions/scenarios/upgrade_to_satellite_6_5_z.rb +13 -5
  46. data/definitions/scenarios/upgrade_to_satellite_6_6.rb +13 -5
  47. data/definitions/scenarios/upgrade_to_satellite_6_6_z.rb +13 -5
  48. data/definitions/scenarios/upgrade_to_satellite_6_7.rb +13 -5
  49. data/definitions/scenarios/upgrade_to_satellite_6_7_z.rb +13 -5
  50. data/definitions/scenarios/upgrade_to_satellite_6_8.rb +88 -0
  51. data/definitions/scenarios/upgrade_to_satellite_6_8_z.rb +88 -0
  52. data/lib/foreman_maintain.rb +31 -0
  53. data/lib/foreman_maintain/cli.rb +2 -0
  54. data/lib/foreman_maintain/cli/content_command.rb +17 -0
  55. data/lib/foreman_maintain/cli/restore_command.rb +2 -1
  56. data/lib/foreman_maintain/cli/upgrade_command.rb +10 -0
  57. data/lib/foreman_maintain/concerns/base_database.rb +11 -0
  58. data/lib/foreman_maintain/concerns/downstream.rb +14 -10
  59. data/lib/foreman_maintain/feature.rb +4 -0
  60. data/lib/foreman_maintain/package_manager/dnf.rb +11 -5
  61. data/lib/foreman_maintain/package_manager/yum.rb +15 -5
  62. data/lib/foreman_maintain/reporter/cli_reporter.rb +3 -3
  63. data/lib/foreman_maintain/upgrade_runner.rb +20 -26
  64. data/lib/foreman_maintain/utils/backup.rb +4 -0
  65. data/lib/foreman_maintain/utils/facter.rb +1 -1
  66. data/lib/foreman_maintain/utils/service/abstract.rb +6 -0
  67. data/lib/foreman_maintain/version.rb +1 -1
  68. metadata +14 -4
  69. data/definitions/checks/check_epel_repository.rb +0 -21
@@ -52,6 +52,13 @@ class Features::Katello < ForemanMaintain::Feature
52
52
  end
53
53
  # rubocop:enable Metrics/MethodLength
54
54
 
55
+ def config_files_exclude_for_online
56
+ [
57
+ '/var/lib/qpidd',
58
+ '/var/lib/candlepin/activemq-artemis'
59
+ ]
60
+ end
61
+
55
62
  private
56
63
 
57
64
  def installer_scenario_answers
@@ -29,7 +29,7 @@ class Features::PuppetServer < ForemanMaintain::Feature
29
29
  end
30
30
 
31
31
  def puppet_version
32
- version(execute!('puppet --version'))
32
+ version(execute!("#{puppet_path} --version"))
33
33
  end
34
34
 
35
35
  def find_empty_cacert_request_files
@@ -56,6 +56,10 @@ class Features::PuppetServer < ForemanMaintain::Feature
56
56
  end
57
57
 
58
58
  def puppet_ssldir_path
59
- execute!('puppet master --configprint ssldir')
59
+ execute!("#{puppet_path} config print ssldir")
60
+ end
61
+
62
+ def puppet_path
63
+ '/opt/puppetlabs/bin/puppet'
60
64
  end
61
65
  end
@@ -27,7 +27,7 @@ class Features::Service < ForemanMaintain::Feature
27
27
  end
28
28
 
29
29
  def filtered_services(options)
30
- service_list = existing_services
30
+ service_list = include_unregistered_services(existing_services, options[:include])
31
31
  service_list = filter_services(service_list, options)
32
32
  raise 'No services found matching your parameters' unless service_list.any?
33
33
 
@@ -99,9 +99,14 @@ class Features::Service < ForemanMaintain::Feature
99
99
  %w[start stop restart status enable disable].include?(action)
100
100
  end
101
101
 
102
- def filter_services(service_list, options)
103
- service_list = include_unregistered_services(service_list, options[:include])
102
+ def extend_service_list_with_sockets(service_list, options)
103
+ return service_list unless options[:include_sockets]
104
+
105
+ socket_list = service_list.map(&:socket).compact.select(&:exist?)
106
+ service_list + socket_list
107
+ end
104
108
 
109
+ def filter_services(service_list, options)
105
110
  if options[:only] && options[:only].any?
106
111
  service_list = service_list.select do |service|
107
112
  options[:only].any? { |opt| service.matches?(opt) }
@@ -112,6 +117,8 @@ class Features::Service < ForemanMaintain::Feature
112
117
  if options[:exclude] && options[:exclude].any?
113
118
  service_list = service_list.reject { |service| options[:exclude].include?(service.name) }
114
119
  end
120
+
121
+ service_list = extend_service_list_with_sockets(service_list, options)
115
122
  service_list.sort
116
123
  end
117
124
 
@@ -17,6 +17,8 @@ module Procedures::Backup
17
17
  :array => true, :default => ['all']
18
18
  param :ignore_changed_files, 'Should packing tar ignore changed files',
19
19
  :flag => true, :default => false
20
+ param :online_backup, 'The config files are being prepared for an online backup',
21
+ :flag => true, :default => false
20
22
  end
21
23
 
22
24
  # rubocop:disable Metrics/MethodLength
@@ -55,6 +57,7 @@ module Procedures::Backup
55
57
 
56
58
  configs += feature.config_files
57
59
  exclude_configs += feature.config_files_to_exclude
60
+ exclude_configs += feature.config_files_exclude_for_online if @online_backup
58
61
  end
59
62
 
60
63
  if feature(:foreman_proxy)
@@ -6,6 +6,7 @@ module Procedures::Backup
6
6
  preparation_steps { Checks::Foreman::DBUp.new if feature(:foreman_server) }
7
7
  param :backup_dir, 'Directory where to backup to', :required => true
8
8
  param :incremental_dir, 'Changes since specified backup only'
9
+ param :online_backup, 'Select for online backup', :flag => true, :default => false
9
10
  end
10
11
 
11
12
  def run
@@ -16,6 +17,7 @@ module Procedures::Backup
16
17
  metadata['proxy_features'] = proxy_feature_list(spinner) || []
17
18
  metadata['rpms'] = rpms(spinner)
18
19
  metadata['incremental'] = @incremental_dir || false
20
+ metadata['online'] = @online_backup
19
21
  save_metadata(metadata, spinner)
20
22
  end
21
23
  end
@@ -6,7 +6,7 @@ module Procedures::Content
6
6
  end
7
7
 
8
8
  def run
9
- execute!('foreman-rake katello:pulp3_migration')
9
+ puts execute!('foreman-rake katello:pulp3_migration')
10
10
  end
11
11
  end
12
12
  end
@@ -6,12 +6,17 @@ module Procedures::Content
6
6
  end
7
7
 
8
8
  def run
9
- execute!('foreman-rake katello:pulp3_migration')
10
- execute!('foreman-rake katello:pulp3_post_migration_check')
11
- execute!('foreman-rake katello:pulp3_content_switchover')
9
+ puts 'Performing final content migration before switching content'
10
+ puts execute!('foreman-rake katello:pulp3_migration')
11
+ puts 'Performing a check to verify everything that is needed has been migrated'
12
+ puts execute!('foreman-rake katello:pulp3_post_migration_check')
13
+ puts 'Switching specified content over to pulp 3'
14
+ puts execute!('foreman-rake katello:pulp3_content_switchover')
15
+ puts 'Re-running the installer to switch specified content over to pulp3'
12
16
  args = ['--foreman-proxy-content-proxy-pulp-isos-to-pulpcore=true',
13
17
  '--katello-use-pulp-2-for-file=false',
14
- '--katello-use-pulp-2-for-docker=false']
18
+ '--katello-use-pulp-2-for-docker=false',
19
+ '--katello-use-pulp-2-for-yum=false']
15
20
  feature(:installer).run(args.join(' '))
16
21
  end
17
22
  end
@@ -5,7 +5,7 @@ class Procedures::HammerSetup < ForemanMaintain::Procedure
5
5
  end
6
6
 
7
7
  def run
8
- if feature(:foreman_server) && ForemanMaintain::Utils.system_service('httpd', 30).running?
8
+ if feature(:foreman_server) && feature(:foreman_server).services_running?
9
9
  puts 'Configuring Hammer CLI...'
10
10
  result = feature(:hammer).setup_admin_access
11
11
  logger.info 'Hammer was configured successfully.' if result
@@ -2,10 +2,12 @@ module Procedures::Installer
2
2
  class Run < ForemanMaintain::Procedure
3
3
  metadata do
4
4
  param :arguments, 'Arguments passed to installer'
5
+ param :assumeyes, 'Do not ask for confirmation'
5
6
  end
6
7
 
7
8
  def run
8
- feature(:installer).run(@arguments, :interactive => true)
9
+ assumeyes_val = @assumeyes.nil? ? assumeyes? : @assumeyes
10
+ feature(:installer).run(@arguments, :interactive => !assumeyes_val)
9
11
  end
10
12
 
11
13
  def description
@@ -1,7 +1,12 @@
1
1
  module Procedures::Installer
2
2
  class Upgrade < ForemanMaintain::Procedure
3
+ metadata do
4
+ param :assumeyes, 'Do not ask for confirmation'
5
+ end
6
+
3
7
  def run
4
- feature(:installer).upgrade(:interactive => true)
8
+ assumeyes_val = @assumeyes.nil? ? assumeyes? : @assumeyes
9
+ feature(:installer).run(@arguments, :interactive => !assumeyes_val)
5
10
  end
6
11
  end
7
12
  end
@@ -10,7 +10,7 @@ module Procedures::Packages
10
10
 
11
11
  def run
12
12
  assumeyes_val = @assumeyes.nil? ? assumeyes? : @assumeyes
13
- package_manager.clean_cache
13
+ package_manager.clean_cache(:assumeyes => assumeyes_val)
14
14
  packages_action(:update, @packages, :assumeyes => assumeyes_val)
15
15
  rescue ForemanMaintain::Error::ExecutionError => e
16
16
  if @warn_on_errors
@@ -19,10 +19,15 @@ module Procedures::Restore
19
19
  end
20
20
  end
21
21
 
22
+ # rubocop:disable Metrics/MethodLength
22
23
  def restore_configs(backup)
23
24
  exclude = ForemanMaintain.available_features.each_with_object([]) do |feat, cfgs|
25
+ if backup.online_backup?
26
+ feat.config_files_exclude_for_online.each { |f| cfgs << f.gsub(%r{^/}, '') }
27
+ end
24
28
  feat.config_files_to_exclude.each { |f| cfgs << f.gsub(%r{^/}, '') }
25
29
  end
30
+
26
31
  tar_options = {
27
32
  :overwrite => true,
28
33
  :listed_incremental => '/dev/null',
@@ -35,6 +40,7 @@ module Procedures::Restore
35
40
 
36
41
  feature(:tar).run(tar_options)
37
42
  end
43
+ # rubocop:enable Metrics/MethodLength
38
44
 
39
45
  def reload_configs
40
46
  feature(:mongo).reload_db_config if feature(:mongo)
@@ -0,0 +1,69 @@
1
+ module Procedures::Restore
2
+ class RegenerateQueues < ForemanMaintain::Procedure
3
+ metadata do
4
+ advanced_run false
5
+ description 'Regenerate required activemq and qpidd queues while restoring online backup'
6
+ confine do
7
+ feature(:pulp2)
8
+ end
9
+ end
10
+
11
+ def qpid_router_broker_port
12
+ @qpid_router_broker_port ||= feature(:installer).
13
+ answers['foreman_proxy_content']['qpid_router_broker_port']
14
+ end
15
+
16
+ def qpid_configs
17
+ @qpid_configs ||= {
18
+ 'ssl_cert' => "/etc/pki/katello/certs/#{hostname}-qpid-broker.crt",
19
+ 'ssl_key' => "/etc/pki/katello/private/#{hostname}-qpid-broker.key",
20
+ 'amqps_url' => "amqps://localhost:#{qpid_router_broker_port}"
21
+ }
22
+ end
23
+
24
+ def katello_events
25
+ %w[compliance.created
26
+ entitlement.created
27
+ entitlement.deleted
28
+ pool.created
29
+ pool.deleted]
30
+ end
31
+
32
+ def run
33
+ with_spinner('Resetting the queues') do |spinner|
34
+ regenerate_activemq_queues(spinner)
35
+ regenerate_qpidd_queues(spinner)
36
+ spinner.update('Queues created successfully')
37
+ end
38
+ end
39
+
40
+ def regenerate_activemq_queues(spinner)
41
+ # The activemq queues(/var/lib/candlepin/activemq-artemis) regenerate on tomcat restart.
42
+ # After stopping the tomcat here, service start is triggered from the restore scenario.
43
+ spinner.update('Stopping tomcat service')
44
+ feature(:candlepin).services.select(&:exist?).first.stop
45
+ spinner.update('Recreating activemq queues')
46
+ execute!('rm -rf /var/lib/candlepin/activemq-artemis/')
47
+ end
48
+
49
+ def run_qpid_command(opts)
50
+ execute!("qpid-config --ssl-certificate #{qpid_configs['ssl_cert']} \\
51
+ --ssl-key #{qpid_configs['ssl_key']} -b #{qpid_configs['amqps_url']} #{opts}")
52
+ end
53
+
54
+ def regenerate_qpidd_queues(spinner)
55
+ feature(:service).handle_services(spinner, 'stop', :only => ['qpidd'])
56
+ execute!('rm -rf /var/lib/qpidd/.qpidd/qls')
57
+ spinner.update('Starting qpidd service')
58
+ feature(:service).handle_services(spinner, 'start', :only => ['qpidd'])
59
+ spinner.update('Service qpidd started, waiting 60 seconds to start it completely')
60
+ sleep 60
61
+ spinner.update('Recreating qpidd queues')
62
+ run_qpid_command('add exchange topic event --durable')
63
+ run_qpid_command('add queue katello_event_queue --durable')
64
+ katello_events.each do |event|
65
+ run_qpid_command("bind event katello_event_queue #{event}")
66
+ end
67
+ end
68
+ end
69
+ end
@@ -8,7 +8,7 @@ module Procedures::Service
8
8
  end
9
9
 
10
10
  def run
11
- run_service_action('stop', common_options)
11
+ run_service_action('stop', common_options.merge(:include_sockets => true))
12
12
  end
13
13
  end
14
14
  end
@@ -200,7 +200,8 @@ module ForemanMaintain::Scenarios
200
200
  # rubocop:enable Metrics/MethodLength
201
201
 
202
202
  def add_online_backup_steps
203
- add_step_with_context(Procedures::Backup::ConfigFiles, :ignore_changed_files => true)
203
+ add_step_with_context(Procedures::Backup::ConfigFiles, :ignore_changed_files => true,
204
+ :online_backup => true)
204
205
  add_step_with_context(Procedures::Backup::Pulp, :ensure_unchanged => true)
205
206
  add_steps_with_context(
206
207
  Procedures::Backup::Online::Mongo,
@@ -209,6 +210,7 @@ module ForemanMaintain::Scenarios
209
210
  Procedures::Backup::Online::ForemanDB,
210
211
  Procedures::Backup::Online::PulpcoreDB
211
212
  )
213
+ add_step_with_context(Procedures::Backup::Metadata, :online_backup => true)
212
214
  end
213
215
 
214
216
  def strategy
@@ -0,0 +1,27 @@
1
+ module ForemanMaintain::Scenarios
2
+ module Content
3
+ class Prepare < ForemanMaintain::Scenario
4
+ metadata do
5
+ label :content_prepare
6
+ description 'Prepare content for Pulp 3'
7
+ manual_detection
8
+ end
9
+
10
+ def compose
11
+ add_step(Procedures::Content::Prepare)
12
+ end
13
+ end
14
+
15
+ class Switchover < ForemanMaintain::Scenario
16
+ metadata do
17
+ label :content_switchover
18
+ description 'Switch support for certain content from Pulp 2 to Pulp 3'
19
+ manual_detection
20
+ end
21
+
22
+ def compose
23
+ add_step(Procedures::Content::Switchover)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,16 @@
1
1
  module ForemanMaintain::Scenarios
2
2
  module Packages
3
+ def self.skip_installer_run?(packages_list)
4
+ packages_list = packages_list.split(',').map(&:strip) if packages_list.is_a?(String)
5
+
6
+ return false unless packages_list.any? { |p| p.include?('foreman_maintain') }
7
+ return true if packages_list.length == 1
8
+
9
+ fm_pkg = ForemanMaintain.main_package_name
10
+ puts "ERROR: install or update '#{fm_pkg}' package individually."
11
+ exit 1
12
+ end
13
+
3
14
  class Status < ForemanMaintain::Scenario
4
15
  metadata do
5
16
  label :packages_status
@@ -45,13 +56,17 @@ module ForemanMaintain::Scenarios
45
56
  end
46
57
 
47
58
  def compose
48
- add_step_with_context(Procedures::Packages::InstallerConfirmation)
49
- add_step_with_context(Procedures::Packages::UnlockVersions)
50
- add_step_with_context(Procedures::Packages::Install,
51
- :force => true, :warn_on_errors => true)
52
- add_step_with_context(Procedures::Installer::Run,
53
- :arguments => '--upgrade --disable-system-checks')
54
- add_step(Procedures::Packages::LockingStatus)
59
+ if Packages.skip_installer_run?(context.get(:packages))
60
+ add_step_with_context(Procedures::Packages::Install,
61
+ :force => true, :warn_on_errors => true)
62
+ else
63
+ add_step_with_context(Procedures::Packages::InstallerConfirmation)
64
+ add_step_with_context(Procedures::Packages::UnlockVersions)
65
+ add_step_with_context(Procedures::Packages::Install,
66
+ :force => true, :warn_on_errors => true)
67
+ add_step_with_context(Procedures::Installer::Upgrade)
68
+ add_step(Procedures::Packages::LockingStatus)
69
+ end
55
70
  end
56
71
 
57
72
  def set_context_mapping
@@ -71,15 +86,20 @@ module ForemanMaintain::Scenarios
71
86
  end
72
87
 
73
88
  def compose
74
- add_steps_with_context(
75
- Procedures::Packages::UpdateAllConfirmation,
76
- Procedures::Packages::InstallerConfirmation,
77
- Procedures::Packages::UnlockVersions
78
- )
79
- add_step_with_context(Procedures::Packages::Update, :force => true, :warn_on_errors => true)
80
- add_step_with_context(Procedures::Installer::Run,
81
- :arguments => '--upgrade --disable-system-checks')
82
- add_step(Procedures::Packages::LockingStatus)
89
+ if Packages.skip_installer_run?(context.get(:packages))
90
+ add_step_with_context(Procedures::Packages::Update,
91
+ :force => true, :warn_on_errors => true)
92
+ else
93
+ add_steps_with_context(
94
+ Procedures::Packages::UpdateAllConfirmation,
95
+ Procedures::Packages::InstallerConfirmation,
96
+ Procedures::Packages::UnlockVersions
97
+ )
98
+ add_step_with_context(Procedures::Packages::Update,
99
+ :force => true, :warn_on_errors => true)
100
+ add_step_with_context(Procedures::Installer::Upgrade)
101
+ add_step(Procedures::Packages::LockingStatus)
102
+ end
83
103
  end
84
104
 
85
105
  def set_context_mapping
@@ -20,6 +20,7 @@ module ForemanMaintain::Scenarios
20
20
  Checks::Restore::ValidateHostname,
21
21
  Procedures::Selinux::SetFileSecurity,
22
22
  Procedures::Restore::Configs)
23
+ add_step_with_context(Procedures::Crond::Stop) if feature(:cron)
23
24
  unless backup.incremental?
24
25
  add_steps_with_context(Procedures::Restore::EnsureMongoEngineMatches,
25
26
  Procedures::Restore::InstallerReset)
@@ -36,9 +37,12 @@ module ForemanMaintain::Scenarios
36
37
  end
37
38
  restore_mongo_dump(backup)
38
39
  add_steps_with_context(Procedures::Pulp::Migrate,
39
- Procedures::Pulpcore::Migrate,
40
- Procedures::Service::Start,
40
+ Procedures::Pulpcore::Migrate)
41
+
42
+ add_steps_with_context(Procedures::Restore::RegenerateQueues) if backup.online_backup?
43
+ add_steps_with_context(Procedures::Service::Start,
41
44
  Procedures::Service::DaemonReload)
45
+ add_step_with_context(Procedures::Crond::Start) if feature(:cron)
42
46
  end
43
47
  # rubocop:enable Metrics/MethodLength,Metrics/AbcSize
44
48
 
@@ -96,4 +100,15 @@ module ForemanMaintain::Scenarios
96
100
  Procedures::Selinux::SetFileSecurity => :incremental_backup)
97
101
  end
98
102
  end
103
+
104
+ class RestoreRescue < ForemanMaintain::Scenario
105
+ metadata do
106
+ description 'Resuce Restore backup'
107
+ manual_detection
108
+ end
109
+
110
+ def compose
111
+ add_step_with_context(Procedures::Crond::Stop) if feature(:cron)
112
+ end
113
+ end
99
114
  end