foreman_maintain 0.6.0 → 0.6.1
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 +5 -5
- data/definitions/checks/pulpcore/db_up.rb +29 -0
- data/definitions/features/foreman_database.rb +5 -3
- data/definitions/features/foreman_tasks.rb +7 -2
- data/definitions/features/instance.rb +5 -2
- data/definitions/features/{pulp3.rb → pulpcore.rb} +9 -3
- data/definitions/features/pulpcore_database.rb +39 -0
- data/definitions/features/tar.rb +5 -0
- data/definitions/procedures/backup/offline/pulpcore_db.rb +57 -0
- data/definitions/procedures/backup/online/pulpcore_db.rb +20 -0
- data/definitions/procedures/backup/snapshot/logical_volume_confirmation.rb +1 -0
- data/definitions/procedures/backup/snapshot/mount_pulpcore_db.rb +48 -0
- data/definitions/procedures/content/prepare.rb +1 -1
- data/definitions/procedures/content/switchover.rb +18 -0
- data/definitions/procedures/packages/installer_confirmation.rb +1 -1
- data/definitions/procedures/packages/update_all_confirmation.rb +24 -0
- data/definitions/procedures/pulpcore/migrate.rb +25 -0
- data/definitions/procedures/restore/drop_databases.rb +11 -1
- data/definitions/procedures/restore/extract_files.rb +1 -0
- data/definitions/procedures/restore/pulpcore_dump.rb +30 -0
- data/definitions/scenarios/backup.rb +18 -3
- data/definitions/scenarios/packages.rb +7 -3
- data/definitions/scenarios/restore.rb +7 -1
- data/extras/foreman_protector/foreman-protector.py +1 -1
- data/lib/foreman_maintain/cli/packages_command.rb +1 -1
- data/lib/foreman_maintain/concerns/base_database.rb +5 -1
- data/lib/foreman_maintain/reporter/cli_reporter.rb +3 -3
- data/lib/foreman_maintain/utils/backup.rb +58 -62
- data/lib/foreman_maintain/utils/disk/io_device.rb +1 -1
- data/lib/foreman_maintain/version.rb +1 -1
- metadata +173 -165
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a4e65df7ebef0968a8e42c0d8bcc643b46dfb2855dd2d7c89124004370b63e15
|
4
|
+
data.tar.gz: 6f18c7e5ed3415ecf1bfe1e75bc13bb437aab40a95d06493e531a5d500d99d95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c51b1f7d04a9df33f4c5b0e82c3df17f51162942eee4a4df61a2fe8930f8118d03b35c0f21de56a208662dee0b259e980a9552785d3f83bb6fd60f7422f5e943
|
7
|
+
data.tar.gz: 81e2b0db0d04283cc4ec49b778dc7fdb783ef0b462f826230713fa77a2c6425f54f93283706f4c24886d9d0c4e195dc39f403b0707e83ff5a7df673788b89c54
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Checks
|
2
|
+
module Pulpcore
|
3
|
+
class DBUp < ForemanMaintain::Check
|
4
|
+
metadata do
|
5
|
+
description 'Make sure Pulpcore DB is up'
|
6
|
+
label :pulpcore_db_up
|
7
|
+
for_feature :pulpcore_database
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
status = false
|
12
|
+
with_spinner('Checking connection to the Pulpcore DB') do
|
13
|
+
status = feature(:pulpcore_database).ping
|
14
|
+
end
|
15
|
+
assert(status, 'Pulpcore DB is not responding. ' \
|
16
|
+
'It needs to be up and running to perform the following steps',
|
17
|
+
:next_steps => next_steps)
|
18
|
+
end
|
19
|
+
|
20
|
+
def next_steps
|
21
|
+
if feature(:pulpcore_database).local?
|
22
|
+
[Procedures::Service::Start.new(:only => 'postgresql')]
|
23
|
+
else
|
24
|
+
[] # there is nothing we can do for remote db
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -16,9 +16,11 @@ class Features::ForemanDatabase < ForemanMaintain::Feature
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def config_files
|
19
|
-
|
20
|
-
'/var/lib/pgsql/data/postgresql.conf'
|
21
|
-
|
19
|
+
if check_min_version('foreman', '2.0')
|
20
|
+
['/var/opt/rh/rh-postgresql12/lib/pgsql/data/postgresql.conf']
|
21
|
+
else
|
22
|
+
['/var/lib/pgsql/data/postgresql.conf']
|
23
|
+
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def services
|
@@ -162,8 +162,13 @@ class Features::ForemanTasks < ForemanMaintain::Feature
|
|
162
162
|
def export_csv(sql, file_name, state)
|
163
163
|
dir = prepare_for_backup(state)
|
164
164
|
filepath = "#{dir}/#{file_name}"
|
165
|
-
|
166
|
-
|
165
|
+
csv_output = feature(:foreman_database).query_csv(sql)
|
166
|
+
File.open(filepath, 'w') do |f|
|
167
|
+
f.write(csv_output)
|
168
|
+
f.close
|
169
|
+
end
|
170
|
+
execute("bzip2 #{filepath} -c -9 > #{filepath}.bz2")
|
171
|
+
FileUtils.rm_rf(filepath)
|
167
172
|
end
|
168
173
|
|
169
174
|
def old_tasks_condition(state = "'stopped', 'paused'")
|
@@ -37,7 +37,9 @@ class Features::Instance < ForemanMaintain::Feature
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def postgresql_local?
|
40
|
-
database_local?(:candlepin_database) ||
|
40
|
+
database_local?(:candlepin_database) ||
|
41
|
+
database_local?(:foreman_database) ||
|
42
|
+
database_local?(:pulpcore_database)
|
41
43
|
end
|
42
44
|
|
43
45
|
def foreman_proxy_with_content?
|
@@ -65,7 +67,7 @@ class Features::Instance < ForemanMaintain::Feature
|
|
65
67
|
end
|
66
68
|
|
67
69
|
def pulp
|
68
|
-
feature(:pulp2) || feature(:
|
70
|
+
feature(:pulp2) || feature(:pulpcore)
|
69
71
|
end
|
70
72
|
|
71
73
|
private
|
@@ -143,6 +145,7 @@ class Features::Instance < ForemanMaintain::Feature
|
|
143
145
|
'candlepin' => %w[candlepin candlepin_database],
|
144
146
|
'pulp_auth' => %w[pulp2 mongo],
|
145
147
|
'pulp' => %w[pulp2 mongo],
|
148
|
+
'pulpcore' => %w[pulpcore pulpcore_database],
|
146
149
|
'foreman_tasks' => %w[foreman_tasks]
|
147
150
|
}
|
148
151
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'foreman_maintain/utils/service/systemd'
|
2
2
|
|
3
|
-
class Features::
|
3
|
+
class Features::Pulpcore < ForemanMaintain::Feature
|
4
4
|
metadata do
|
5
|
-
label :
|
5
|
+
label :pulpcore
|
6
6
|
|
7
7
|
confine do
|
8
8
|
ForemanMaintain::Utils::Service::Systemd.new('pulpcore-api', 0).exist?
|
@@ -11,12 +11,18 @@ class Features::Pulp3 < ForemanMaintain::Feature
|
|
11
11
|
|
12
12
|
def services
|
13
13
|
[
|
14
|
+
system_service('rh-redis5-redis', 5),
|
14
15
|
system_service('pulpcore-api', 10),
|
15
16
|
system_service('pulpcore-content', 10),
|
16
17
|
system_service('pulpcore-resource-manager', 10),
|
17
18
|
system_service('pulpcore-worker@*', 20, :all => true, :skip_enablement => true),
|
18
|
-
system_service('rh-redis5-redis', 30),
|
19
19
|
system_service('httpd', 30)
|
20
20
|
]
|
21
21
|
end
|
22
|
+
|
23
|
+
def config_files
|
24
|
+
[
|
25
|
+
'/etc/pulp/settings.py'
|
26
|
+
]
|
27
|
+
end
|
22
28
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Features::PulpcoreDatabase < ForemanMaintain::Feature
|
2
|
+
PULPCORE_DB_CONFIG = '/etc/pulp/settings.py'.freeze
|
3
|
+
|
4
|
+
include ForemanMaintain::Concerns::BaseDatabase
|
5
|
+
|
6
|
+
metadata do
|
7
|
+
label :pulpcore_database
|
8
|
+
|
9
|
+
confine do
|
10
|
+
file_nonzero?(PULPCORE_DB_CONFIG)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def configuration
|
15
|
+
@configuration || load_configuration
|
16
|
+
end
|
17
|
+
|
18
|
+
def services
|
19
|
+
[
|
20
|
+
system_service('postgresql', 10, :component => 'pulpcore',
|
21
|
+
:db_feature => feature(:pulpcore_database))
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def load_configuration
|
28
|
+
full_config = File.read(PULPCORE_DB_CONFIG).split(/[\s,'":]/).reject(&:empty?)
|
29
|
+
|
30
|
+
@configuration = {}
|
31
|
+
@configuration['adapter'] = 'postgresql'
|
32
|
+
@configuration['host'] = full_config[full_config.index('HOST') + 1]
|
33
|
+
@configuration['port'] = full_config[full_config.index('PORT') + 1]
|
34
|
+
@configuration['database'] = full_config[full_config.index('NAME') + 1]
|
35
|
+
@configuration['username'] = full_config[full_config.index('USER') + 1]
|
36
|
+
@configuration['password'] = full_config[full_config.index('PASSWORD') + 1]
|
37
|
+
@configuration
|
38
|
+
end
|
39
|
+
end
|
data/definitions/features/tar.rb
CHANGED
@@ -38,6 +38,7 @@ class Features::Tar < ForemanMaintain::Feature
|
|
38
38
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
39
39
|
def tar_command(options)
|
40
40
|
volume_size = options.fetch(:volume_size, nil)
|
41
|
+
absolute_names = options.fetch(:absolute_names, nil)
|
41
42
|
validate_volume_size(volume_size) unless volume_size.nil?
|
42
43
|
|
43
44
|
tar_command = ['tar']
|
@@ -45,6 +46,10 @@ class Features::Tar < ForemanMaintain::Feature
|
|
45
46
|
tar_command << "--#{options.fetch(:command, 'create')}"
|
46
47
|
tar_command << "--file=#{options.fetch(:archive)}"
|
47
48
|
|
49
|
+
if absolute_names
|
50
|
+
tar_command << '--absolute-names'
|
51
|
+
end
|
52
|
+
|
48
53
|
if volume_size
|
49
54
|
split_tar_script = default_split_tar_script
|
50
55
|
tar_command << "--tape-length=#{volume_size}"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Procedures::Backup
|
2
|
+
module Offline
|
3
|
+
class PulpcoreDB < ForemanMaintain::Procedure
|
4
|
+
metadata do
|
5
|
+
description 'Backup Pulpcore DB offline'
|
6
|
+
tags :backup
|
7
|
+
label :backup_offline_pulpcore_db
|
8
|
+
for_feature :pulpcore_database
|
9
|
+
preparation_steps { Checks::Pulpcore::DBUp.new unless feature(:pulpcore_database).local? }
|
10
|
+
param :backup_dir, 'Directory where to backup to', :required => true
|
11
|
+
param :tar_volume_size, 'Size of tar volume (indicates splitting)'
|
12
|
+
param :mount_dir, 'Snapshot mount directory'
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
if feature(:pulpcore_database).local?
|
17
|
+
if File.exist?(pg_backup_file)
|
18
|
+
puts 'Already done'
|
19
|
+
else
|
20
|
+
local_backup
|
21
|
+
end
|
22
|
+
else
|
23
|
+
puts "Backup of #{pg_data_dir} is not supported for remote databases." \
|
24
|
+
' Doing postgres dump instead...'
|
25
|
+
with_spinner('Getting Pulpcore DB dump') do
|
26
|
+
feature(:pulpcore_database).dump_db(File.join(@backup_dir, 'pulpcore.dump'))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def local_backup
|
34
|
+
with_spinner("Collecting data from #{pg_data_dir}") do
|
35
|
+
feature(:pulpcore_database).backup_local(
|
36
|
+
pg_backup_file,
|
37
|
+
:listed_incremental => File.join(@backup_dir, '.postgres.snar'),
|
38
|
+
:volume_size => @tar_volume_size,
|
39
|
+
:data_dir => pg_data_dir
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def pg_backup_file
|
45
|
+
File.join(@backup_dir, 'pgsql_data.tar')
|
46
|
+
end
|
47
|
+
|
48
|
+
def pg_data_dir
|
49
|
+
return feature(:pulpcore_database).data_dir if @mount_dir.nil?
|
50
|
+
mount_point = File.join(@mount_dir, 'pgsql')
|
51
|
+
dir = feature(:pulpcore_database).find_base_directory(mount_point)
|
52
|
+
fail!("Snapshot of Pulpcore DB was not found mounted in #{mount_point}") if dir.nil?
|
53
|
+
dir
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Procedures::Backup
|
2
|
+
module Online
|
3
|
+
class PulpcoreDB < ForemanMaintain::Procedure
|
4
|
+
metadata do
|
5
|
+
description 'Backup Pulpcore database online'
|
6
|
+
tags :backup
|
7
|
+
label :backup_online_pulpcore_db
|
8
|
+
for_feature :pulpcore_database
|
9
|
+
preparation_steps { Checks::Pulpcore::DBUp.new }
|
10
|
+
param :backup_dir, 'Directory where to backup to', :required => true
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
with_spinner('Getting Pulpcore DB dump') do
|
15
|
+
feature(:pulpcore_database).dump_db(File.join(@backup_dir, 'pulpcore.dump'))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -16,6 +16,7 @@ module Procedures::Backup
|
|
16
16
|
dbs[:mongo] = 'Mongo' if db_local?(:mongo)
|
17
17
|
dbs[:candlepin_database] = 'Candlepin' if db_local?(:candlepin_database)
|
18
18
|
dbs[:foreman_database] = 'Foreman' if db_local?(:foreman_database)
|
19
|
+
dbs[:pulpcore_database] = 'Pulpcore' if db_local?(:pulpcore_database)
|
19
20
|
|
20
21
|
shared_lv = dbs.inject([]) do |list, (db_label, db_name)|
|
21
22
|
db_lv = get_lv_info(feature(db_label).data_dir)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'procedures/backup/snapshot/mount_base'
|
2
|
+
module Procedures::Backup
|
3
|
+
module Snapshot
|
4
|
+
class MountPulpcoreDB < MountBase
|
5
|
+
metadata do
|
6
|
+
description 'Create and mount snapshot of Pulpcore DB'
|
7
|
+
tags :backup
|
8
|
+
label :backup_snapshot_mount_pulpcore_db
|
9
|
+
for_feature :pulpcore_database
|
10
|
+
preparation_steps { Checks::Pulpcore::DBUp.new unless feature(:pulpcore_database).local? }
|
11
|
+
MountBase.common_params(self)
|
12
|
+
param :backup_dir, 'Directory where to backup to'
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
if feature(:pulpcore_database).local?
|
17
|
+
snapshot
|
18
|
+
else
|
19
|
+
dump_pulpcore
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def dump_pulpcore
|
26
|
+
puts 'LV snapshots are not supported for remote databases. Doing postgres dump instead... '
|
27
|
+
with_spinner('Getting Pulpcore DB dump') do
|
28
|
+
feature(:pulpcore_database).dump_db(File.join(@backup_dir, 'pulpcore.dump'))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def snapshot
|
33
|
+
mount_point = mount_location('pgsql')
|
34
|
+
FileUtils.mkdir_p(mount_point) unless File.directory?(mount_point)
|
35
|
+
if directory_empty?(mount_point)
|
36
|
+
with_spinner('Creating snapshot of Postgres') do |spinner|
|
37
|
+
lv_info = get_lv_info(feature(:pulpcore_database).data_dir)
|
38
|
+
create_lv_snapshot('pgsql-snap', @block_size, lv_info[0])
|
39
|
+
spinner.update("Mounting snapshot of Postgres on #{mount_point}")
|
40
|
+
mount_snapshot('pgsql', lv_info[1])
|
41
|
+
end
|
42
|
+
else
|
43
|
+
puts 'Snapshot of Postgres is already mounted'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Procedures::Content
|
2
|
+
class Switchover < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
description 'Switch support for certain content from Pulp 2 to Pulp 3'
|
5
|
+
for_feature :pulpcore
|
6
|
+
end
|
7
|
+
|
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')
|
12
|
+
args = ['--foreman-proxy-content-proxy-pulp-isos-to-pulpcore=true',
|
13
|
+
'--katello-use-pulp-2-for-file=false',
|
14
|
+
'--katello-use-pulp-2-for-docker=false']
|
15
|
+
feature(:installer).run(args.join(' '))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -5,7 +5,7 @@ module Procedures::Packages
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def run
|
8
|
-
question = "
|
8
|
+
question = "\nWARNING: This script runs #{feature(:installer).installer_command} " \
|
9
9
|
"after the yum execution \n" \
|
10
10
|
"to ensure the #{feature(:instance).product_name} " \
|
11
11
|
"is in a consistent state.\n" \
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Procedures::Packages
|
2
|
+
class UpdateAllConfirmation < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
param :packages, 'List of packages to update', :array => true
|
5
|
+
|
6
|
+
description 'Confirm update all is intentional'
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
if @packages.nil? || @packages.empty?
|
11
|
+
question = "\nWARNING: No specific packages to update were provided\n" \
|
12
|
+
"so we are going to update all available packages.\n" \
|
13
|
+
"It is recommended to update everything only as part of upgrade\n" \
|
14
|
+
"of the #{feature(:instance).product_name} to the next version. \n" \
|
15
|
+
"To Upgrade to next version use 'foreman-maintain upgrade'.\n\n" \
|
16
|
+
"NOTE: --assumeyes is not applicable for this check\n\n" \
|
17
|
+
"Do you want to proceed with update of everything regardless\n" \
|
18
|
+
'of the recommendations?'
|
19
|
+
answer = ask_decision(question, 'y(yes), q(quit)', ignore_assumeyes: true)
|
20
|
+
abort! unless answer == :yes
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Procedures::Pulpcore
|
2
|
+
class Migrate < ForemanMaintain::Procedure
|
3
|
+
include ForemanMaintain::Concerns::SystemService
|
4
|
+
|
5
|
+
metadata do
|
6
|
+
description 'Migrate pulpcore db'
|
7
|
+
for_feature :pulpcore
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
with_spinner('Migrating pulpcore') do |spinner|
|
12
|
+
necessary_services = feature(:pulpcore_database).services
|
13
|
+
pulp_services = feature(:pulpcore).services
|
14
|
+
|
15
|
+
feature(:service).handle_services(spinner, 'start', :only => necessary_services)
|
16
|
+
feature(:service).handle_services(spinner, 'stop', :only => pulp_services)
|
17
|
+
|
18
|
+
spinner.update('Migrating pulpcore database')
|
19
|
+
execute!('sudo PULP_SETTINGS=/etc/pulp/settings.py '\
|
20
|
+
'DJANGO_SETTINGS_MODULE=pulpcore.app.settings '\
|
21
|
+
'python3-django-admin migrate --noinput')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -8,7 +8,7 @@ module Procedures::Restore
|
|
8
8
|
:required => true
|
9
9
|
|
10
10
|
confine do
|
11
|
-
feature(:foreman_database) || feature(:candlepin_database)
|
11
|
+
feature(:foreman_database) || feature(:candlepin_database) || feature(:pulpcore_database)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -19,6 +19,9 @@ module Procedures::Restore
|
|
19
19
|
feature(:service).handle_services(spinner, 'start', :only => ['postgresql'])
|
20
20
|
drop_foreman(backup, spinner)
|
21
21
|
drop_candlepin(backup, spinner)
|
22
|
+
if feature(:pulpcore)
|
23
|
+
drop_pulpcore(backup, spinner)
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
@@ -35,5 +38,12 @@ module Procedures::Restore
|
|
35
38
|
feature(:candlepin_database).dropdb
|
36
39
|
end
|
37
40
|
end
|
41
|
+
|
42
|
+
def drop_pulpcore(backup, spinner)
|
43
|
+
if backup.file_map[:pulpcore_dump][:present]
|
44
|
+
spinner.update('Dropping pulpcore database')
|
45
|
+
feature(:pulpcore_database).dropdb
|
46
|
+
end
|
47
|
+
end
|
38
48
|
end
|
39
49
|
end
|