foreman_maintain 0.7.5 → 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
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