foreman_maintain 0.7.5 → 0.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01f23ac8f61f67d6c71e3a31156f0267e724b62386f951e02ed4272276be5007
4
- data.tar.gz: b4cc1198b259cbb1b074a2622caac177e7d93571cb3cb2f3d2d3630adaab205f
3
+ metadata.gz: 743d74ea6833807f28ea4f14096821c03d080ede64f8cc74ee4146b4dd8eea26
4
+ data.tar.gz: 4b54030179cb8019c0a5936f5accfb8a91f6a092c9221cd1b03e9d342c5bbaa3
5
5
  SHA512:
6
- metadata.gz: 21bfdc38c8d3a3a710aedb2e114bb0616e854b1144af15ede8ce0b326938662620e32117947f13c6eacff88b3ed5bc2076d403bb147310722c0110b71828d297
7
- data.tar.gz: a232dd4b4ac70ad534fe4310a55382c89cfaf65b61a8afd3f850961c0ce84012810f91e577394c14d2fcaa2df2bc127b2d494312b3c8f31b3458031ef438add7
6
+ metadata.gz: 89f47a46c1061c416d9042c116dea5ad0acbf973418d4452e44500a8ebbb55cd598d3d3001332ec92970094dd2ebd36af8a92fde9d28835a5544e96d6bd333d0
7
+ data.tar.gz: 370b409946044d658e102e0aa64733842163b5834289b7cf059dd16733ee2e6f1263aa6221212caa3b5fcb1f77fd81519c414e542357cac8df579f0d4031c7fd
@@ -9,15 +9,19 @@ module Checks
9
9
 
10
10
  def run
11
11
  status = false
12
- with_spinner('Checking connection to the Candlepin DB') do
13
- status = feature(:candlepin_database).ping
12
+ if feature(:candlepin_database).psql_cmd_available?
13
+ with_spinner('Checking connection to the Candlepin DB') do
14
+ status = feature(:candlepin_database).ping
15
+ end
16
+ assert(status, 'Candlepin DB is not responding. ' \
17
+ 'It needs to be up and running to perform the following steps',
18
+ :next_steps => start_pgsql)
19
+ else
20
+ feature(:candlepin_database).raise_psql_missing_error
14
21
  end
15
- assert(status, 'Candlepin DB is not responding. ' \
16
- 'It needs to be up and running to perform the following steps',
17
- :next_steps => next_steps)
18
22
  end
19
23
 
20
- def next_steps
24
+ def start_pgsql
21
25
  if feature(:candlepin_database).local?
22
26
  [Procedures::Service::Start.new(:only => 'postgresql')]
23
27
  else
@@ -9,15 +9,19 @@ module Checks
9
9
 
10
10
  def run
11
11
  status = false
12
- with_spinner('Checking connection to the Foreman DB') do
13
- status = feature(:foreman_database).ping
12
+ if feature(:foreman_database).psql_cmd_available?
13
+ with_spinner('Checking connection to the Foreman DB') do
14
+ status = feature(:foreman_database).ping
15
+ end
16
+ assert(status, 'Foreman DB is not responding. ' \
17
+ 'It needs to be up and running to perform the following steps',
18
+ :next_steps => start_pgsql)
19
+ else
20
+ feature(:foreman_database).raise_psql_missing_error
14
21
  end
15
- assert(status, 'Foreman DB is not responding. ' \
16
- 'It needs to be up and running to perform the following steps',
17
- :next_steps => next_steps)
18
22
  end
19
23
 
20
- def next_steps
24
+ def start_pgsql
21
25
  if feature(:foreman_database).local?
22
26
  [Procedures::Service::Start.new(:only => 'postgresql')]
23
27
  else
@@ -9,15 +9,19 @@ module Checks
9
9
 
10
10
  def run
11
11
  status = false
12
- with_spinner('Checking connection to the Mongo DB') do
13
- status = feature(:mongo).ping
12
+ if feature(:mongo).mongo_cmd_available?
13
+ with_spinner('Checking connection to the Mongo DB') do
14
+ status = feature(:mongo).ping
15
+ end
16
+ assert(status, 'Mongo DB is not responding. ' \
17
+ 'It needs to be up and running to perform the following steps.',
18
+ :next_steps => start_mongodb)
19
+ else
20
+ feature(:mongo).raise_mongo_client_missing_error
14
21
  end
15
- assert(status, 'Mongo DB is not responding. ' \
16
- 'It needs to be up and running to perform the following steps.',
17
- :next_steps => next_steps)
18
22
  end
19
23
 
20
- def next_steps
24
+ def start_mongodb
21
25
  if feature(:mongo).local?
22
26
  [Procedures::Service::Start.new(:only => feature(:mongo).services)]
23
27
  else
@@ -97,10 +97,10 @@ class Features::ForemanTasks < ForemanMaintain::Feature
97
97
  end
98
98
 
99
99
  def resume_task_using_hammer
100
- if check_min_version('satellite', '6.8')
101
- feature(:hammer).run('task resume --search ""')
100
+ if feature(:satellite) && feature(:satellite).current_minor_version == '6.8'
101
+ feature(:hammer).run('task resume --search "" --fields="Total tasks resumed"')
102
102
  else
103
- feature(:hammer).run('task resume')
103
+ feature(:hammer).run('task resume --fields="Total tasks resumed"')
104
104
  end
105
105
  end
106
106
 
@@ -140,6 +140,16 @@ class Features::Mongo < ForemanMaintain::Feature
140
140
  end
141
141
  end
142
142
 
143
+ def mongo_cmd_available?
144
+ exit_status, _output = execute_with_status("which #{core.client_command}")
145
+ exit_status == 0
146
+ end
147
+
148
+ def raise_mongo_client_missing_error
149
+ raise ForemanMaintain::Error::Fail, "The #{core.client_command} command not found."\
150
+ " Make sure system has #{core.client_command} utility installed."
151
+ end
152
+
143
153
  private
144
154
 
145
155
  def load_mongo_core_default(version)
@@ -8,7 +8,6 @@ class Features::Service < ForemanMaintain::Feature
8
8
  # { :only => ["httpd"] }
9
9
  # { :exclude => ["pulp-workers", "tomcat"] }
10
10
  # { :include => ["crond"] }
11
-
12
11
  if feature(:instance).downstream && feature(:instance).downstream.less_than_version?('6.3')
13
12
  use_katello_service(action, options)
14
13
  else
@@ -27,11 +26,12 @@ class Features::Service < ForemanMaintain::Feature
27
26
  end
28
27
 
29
28
  def filtered_services(options)
30
- service_list = include_unregistered_services(existing_services, options[:include])
31
- service_list = filter_services(service_list, options)
32
- raise 'No services found matching your parameters' unless service_list.any?
29
+ services = include_unregistered_services(existing_services, options[:include])
30
+ services = filter_services(services, options)
31
+ raise 'No services found matching your parameters' unless services.any?
32
+ return services unless options[:reverse]
33
33
 
34
- options[:reverse] ? service_list.reverse : service_list
34
+ Hash[services.sort_by { |k, _| k.to_i }.reverse]
35
35
  end
36
36
 
37
37
  def action_noun(action)
@@ -61,40 +61,59 @@ class Features::Service < ForemanMaintain::Feature
61
61
  def run_action_on_services(action, options, spinner)
62
62
  status = 0
63
63
  failed_services = []
64
+ filtered_services(options).each_value do |group|
65
+ systemctl_status, _output = execute_with_status('systemctl ' \
66
+ "#{action} #{group.map(&:name).join(' ')}")
67
+ display_status(group, options, action, spinner)
68
+ if systemctl_status > 0
69
+ status = systemctl_status
70
+ failed_services |= failed_services_by_status(action, group, spinner)
71
+ end
72
+ end
73
+ [status, failed_services]
74
+ end
64
75
 
65
- filtered_services(options).each do |service|
76
+ def display_status(services, options, action, spinner)
77
+ services.each do |service|
66
78
  spinner.update("#{action_noun(action)} #{service}")
67
- item_status, output = service.send(action.to_sym)
68
-
69
- formatted = format_status(output, item_status, options)
79
+ formatted = format_status(service.status, options, action)
70
80
  puts formatted unless formatted.empty?
71
-
72
- if item_status > 0
73
- status = item_status
74
- failed_services << service
75
- end
76
81
  end
77
- [status, failed_services]
78
82
  end
79
83
 
80
- def format_status(output, exit_code, options)
84
+ def format_status(service_status, options, action)
85
+ exit_code, output = service_status
81
86
  status = ''
82
87
  if !options[:failing] || exit_code > 0
83
88
  if options[:brief]
84
89
  status += format_brief_status(exit_code)
85
- elsif !(output.nil? || output.empty?)
90
+ elsif include_output?(action, exit_code)
86
91
  status += "\n" + output
87
92
  end
88
93
  end
89
94
  status
90
95
  end
91
96
 
97
+ def include_output?(action, status)
98
+ (action == 'start' && status > 0) ||
99
+ action == 'status'
100
+ end
101
+
92
102
  def format_brief_status(exit_code)
93
103
  result = exit_code == 0 ? reporter.status_label(:success) : reporter.status_label(:fail)
94
104
  padding = reporter.max_length - reporter.last_line.to_s.length - 30
95
105
  "#{' ' * padding} #{result}"
96
106
  end
97
107
 
108
+ def failed_services_by_status(action, services, spinner)
109
+ failed_services = []
110
+ services.each do |service|
111
+ spinner.update("#{action_noun(action)} #{service}")
112
+ failed_services << service unless service.running?
113
+ end
114
+ failed_services
115
+ end
116
+
98
117
  def allowed_action?(action)
99
118
  %w[start stop restart status enable disable].include?(action)
100
119
  end
@@ -119,7 +138,7 @@ class Features::Service < ForemanMaintain::Feature
119
138
  end
120
139
 
121
140
  service_list = extend_service_list_with_sockets(service_list, options)
122
- service_list.sort
141
+ service_list.group_by(&:priority).to_h
123
142
  end
124
143
 
125
144
  def include_unregistered_services(service_list, services_filter)
@@ -0,0 +1,12 @@
1
+ module Procedures::Content
2
+ class MigrationReset < ForemanMaintain::Procedure
3
+ metadata do
4
+ description 'Reset the Pulp 2 to Pulp 3 migration data (pre-switchover)'
5
+ for_feature :pulpcore
6
+ end
7
+
8
+ def run
9
+ puts execute!('foreman-rake katello:pulp3_migration_reset')
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,87 @@
1
+ module Procedures::Pulp
2
+ class Remove < ForemanMaintain::Procedure
3
+ metadata do
4
+ description 'Remove pulp2'
5
+
6
+ confine do
7
+ check_min_version('katello-common', '4.0')
8
+ end
9
+ end
10
+
11
+ def sys
12
+ ForemanMaintain::Utils::SystemHelpers.new
13
+ end
14
+
15
+ def pulp_data_dirs
16
+ [
17
+ '/var/lib/pulp/published',
18
+ '/var/lib/pulp/content',
19
+ '/var/lib/pulp/importers',
20
+ '/var/lib/pulp/uploads',
21
+ '/var/lib/mongodb/'
22
+ ]
23
+ end
24
+
25
+ def pulp_packages
26
+ [
27
+ 'pulp-server', 'python-pulp-streamer', 'pulp-puppet-plugins',
28
+ 'python-pulp-rpm-common', 'python-pulp-common',
29
+ 'pulp-selinux', 'python-pulp-oid_validation',
30
+ 'python-pulp-puppet-common', 'python-pulp-repoauth',
31
+ 'pulp-rpm-plugins', 'python-blinker', 'python-celery',
32
+ 'python-django', 'python-isodate', 'python-ldap',
33
+ 'python-mongoengine', 'python-nectar', 'python-oauth2',
34
+ 'python-pymongo'
35
+ ]
36
+ end
37
+
38
+ def data_dir_removal_cmds
39
+ pulp_data_dirs.collect { |dir| "rm -rf #{dir}" }
40
+ end
41
+
42
+ def ask_to_proceed(rm_cmds)
43
+ question = "\nWARNING: All pulp2 packages will be removed with the following commands:\n" \
44
+ "\n# yum remove #{pulp_packages.join(' ')}" \
45
+ "\n# yum remove rh-mongodb34-*" \
46
+ "\n\nAll pulp2 data will be removed.\n"
47
+ question += rm_cmds.collect { |cmd| "\n# #{cmd}" }.join
48
+ question += "\n\nDo you want to proceed?"
49
+ answer = ask_decision(question, actions_msg: 'y(yes), q(quit)')
50
+ abort! if answer != :yes
51
+ end
52
+
53
+ def run
54
+ rm_cmds = data_dir_removal_cmds
55
+ ask_to_proceed(rm_cmds)
56
+
57
+ remove_pulp
58
+
59
+ remove_mongo
60
+
61
+ delete_pulp_data(rm_cmds)
62
+ end
63
+
64
+ def remove_pulp
65
+ with_spinner('Removing pulp2 packages') do
66
+ packages_action(:remove, pulp_packages, :assumeyes => true)
67
+ end
68
+ end
69
+
70
+ def remove_mongo
71
+ with_spinner('Removing mongo packages') do
72
+ packages_action(:remove, ['rh-mongodb34-*'], :assumeyes => true)
73
+ end
74
+ end
75
+
76
+ def delete_pulp_data(rm_cmds)
77
+ with_spinner('Deleting pulp2 data directories') do |spinner|
78
+ rm_cmds.each do |cmd|
79
+ if File.directory?(cmd.split[2])
80
+ execute!(cmd)
81
+ end
82
+ end
83
+ spinner.update('Done deleting pulp2 data directories')
84
+ end
85
+ end
86
+ end
87
+ end
@@ -18,7 +18,6 @@ module Procedures
18
18
  puts "\n#{action_noun} the following service(s):"
19
19
  services = feature(:service).filtered_services(options)
20
20
  print_services(services)
21
-
22
21
  with_spinner('') do |spinner|
23
22
  feature(:service).handle_services(spinner, action, options)
24
23
  end
@@ -31,7 +30,7 @@ module Procedures
31
30
  private
32
31
 
33
32
  def print_services(services)
34
- puts services.map(&:to_s).join(', ')
33
+ puts services.values.flatten(1).join(', ')
35
34
  end
36
35
  end
37
36
  end
@@ -9,6 +9,7 @@ module Procedures::Service
9
9
 
10
10
  def run
11
11
  services = feature(:service).filtered_services(common_options)
12
+ services = services.values.flatten(1)
12
13
  unit_files = unit_files_list(services)
13
14
  puts unit_files + "\n"
14
15
  puts 'All services listed'
@@ -78,5 +78,35 @@ module ForemanMaintain::Scenarios
78
78
  end
79
79
  end
80
80
  end
81
+
82
+ class MigrationReset < ForemanMaintain::Scenario
83
+ metadata do
84
+ label :content_migration_reset
85
+ description 'Reset the Pulp 2 to Pulp 3 migration data (pre-switchover)'
86
+ manual_detection
87
+ end
88
+
89
+ def compose
90
+ if feature(:satellite) && feature(:satellite).at_least_version?('6.9')
91
+ enable_and_start_services
92
+ add_step(Procedures::Content::MigrationReset)
93
+ disable_and_stop_services
94
+ elsif !feature(:satellite)
95
+ add_step(Procedures::Content::MigrationReset)
96
+ end
97
+ end
98
+ end
99
+
100
+ class RemovePulp2 < ForemanMaintain::Scenario
101
+ metadata do
102
+ label :content_remove_pulp2
103
+ description 'Remove Pulp2 and mongodb packages and data'
104
+ manual_detection
105
+ end
106
+
107
+ def compose
108
+ add_step_with_context(Procedures::Pulp::Remove)
109
+ end
110
+ end
81
111
  end
82
112
  end
@@ -103,7 +103,7 @@ module ForemanMaintain::Scenarios
103
103
 
104
104
  class RestoreRescue < ForemanMaintain::Scenario
105
105
  metadata do
106
- description 'Resuce Restore backup'
106
+ description 'Rescue Restore backup'
107
107
  manual_detection
108
108
  end
109
109
 
@@ -27,6 +27,18 @@ module ForemanMaintain
27
27
  run_scenarios_and_exit(Scenarios::Content::MigrationStats.new)
28
28
  end
29
29
  end
30
+
31
+ subcommand 'migration-reset', 'Reset the Pulp 2 to Pulp 3 migration data (pre-switchover)' do
32
+ def execute
33
+ run_scenarios_and_exit(Scenarios::Content::MigrationReset.new)
34
+ end
35
+ end
36
+
37
+ subcommand 'remove-pulp2', 'Remove pulp2 and mongodb packages and data' do
38
+ def execute
39
+ run_scenarios_and_exit(Scenarios::Content::RemovePulp2.new)
40
+ end
41
+ end
30
42
  end
31
43
  end
32
44
  end
@@ -119,6 +119,7 @@ module ForemanMaintain
119
119
  SQL
120
120
  result = query(sql)
121
121
  return false if result.nil? || (result && result.empty?)
122
+
122
123
  result.first['exists'].eql?('t')
123
124
  end
124
125
 
@@ -161,6 +162,16 @@ module ForemanMaintain
161
162
  end
162
163
  end
163
164
 
165
+ def psql_cmd_available?
166
+ exit_status, _output = execute_with_status('which psql')
167
+ exit_status == 0
168
+ end
169
+
170
+ def raise_psql_missing_error
171
+ raise Error::Fail, 'The psql command not found.'\
172
+ ' Make sure system has psql utility installed.'
173
+ end
174
+
164
175
  private
165
176
 
166
177
  def base_command(config, command = 'psql')
@@ -1,3 +1,3 @@
1
1
  module ForemanMaintain
2
- VERSION = '0.7.5'.freeze
2
+ VERSION = '0.7.6'.freeze
3
3
  end
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: 0.7.5
4
+ version: 0.7.6
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: 2021-02-04 00:00:00.000000000 Z
11
+ date: 2021-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clamp
@@ -222,6 +222,7 @@ files:
222
222
  - definitions/procedures/backup/snapshot/mount_pulpcore_db.rb
223
223
  - definitions/procedures/backup/snapshot/prepare_mount.rb
224
224
  - definitions/procedures/candlepin/delete_orphaned_records_from_env_content.rb
225
+ - definitions/procedures/content/migration_reset.rb
225
226
  - definitions/procedures/content/migration_stats.rb
226
227
  - definitions/procedures/content/prepare.rb
227
228
  - definitions/procedures/content/prepare_abort.rb
@@ -259,6 +260,7 @@ files:
259
260
  - definitions/procedures/passenger_recycler.rb
260
261
  - definitions/procedures/prep_6_10_upgrade.rb
261
262
  - definitions/procedures/pulp/migrate.rb
263
+ - definitions/procedures/pulp/remove.rb
262
264
  - definitions/procedures/pulpcore/migrate.rb
263
265
  - definitions/procedures/puppet/delete_empty_ca_cert_request_files.rb
264
266
  - definitions/procedures/remote_execution/remove_existing_settingsd.rb