foreman_maintain 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/definitions/checks/disk_speed_minimal.rb +9 -5
- data/definitions/checks/foreman_tasks/not_running.rb +20 -2
- data/definitions/checks/hammer_ping.rb +16 -0
- data/definitions/checks/system_registration.rb +8 -8
- data/definitions/features/downstream.rb +9 -1
- data/definitions/features/foreman_proxy.rb +4 -1
- data/definitions/features/foreman_server.rb +12 -0
- data/definitions/features/foreman_tasks.rb +49 -4
- data/definitions/features/hammer.rb +55 -0
- data/definitions/features/katello.rb +17 -0
- data/definitions/features/katello_service.rb +54 -5
- data/definitions/procedures/foreman_tasks/fetch_tasks_status.rb +15 -0
- data/definitions/procedures/foreman_tasks/ui_investigate.rb +1 -1
- data/definitions/procedures/katello_service/restart.rb +24 -0
- data/definitions/procedures/katello_service/start.rb +19 -0
- data/definitions/procedures/katello_service/stop.rb +17 -0
- data/definitions/scenarios/upgrade_to_satellite_6_2.rb +3 -1
- data/definitions/scenarios/upgrade_to_satellite_6_2_z.rb +3 -1
- data/definitions/scenarios/upgrade_to_satellite_6_3.rb +3 -1
- data/definitions/scenarios/upgrade_to_satellite_6_3_z.rb +3 -1
- data/lib/foreman_maintain/cli/advanced/procedure/abstract_by_tag_command.rb +2 -2
- data/lib/foreman_maintain/cli/transform_clamp_options.rb +2 -2
- data/lib/foreman_maintain/cli/upgrade_command.rb +6 -1
- data/lib/foreman_maintain/concerns/system_helpers.rb +67 -45
- data/lib/foreman_maintain/config.rb +2 -2
- data/lib/foreman_maintain/detector.rb +1 -1
- data/lib/foreman_maintain/executable.rb +1 -3
- data/lib/foreman_maintain/runner/execution.rb +1 -1
- data/lib/foreman_maintain/utils/disk/io/block_device.rb +1 -1
- data/lib/foreman_maintain/utils/disk/io/file_system.rb +1 -1
- data/lib/foreman_maintain/version.rb +1 -1
- data/lib/foreman_maintain.rb +2 -1
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6541f1ff74d6b4f49f684fdf4a90169407fff41c
|
4
|
+
data.tar.gz: 0de3f21c5ec4b3f20da234dd4ab6de64914e1da4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c728131aed58b4939b2d8b2e1d4c0df2adfa192a28523643072ee16a1348f9136feb178987bd4a230ffc123adad54298be86697b6a657956c6c970c49313bb25
|
7
|
+
data.tar.gz: 643d48edb17bd4d7dafc84fd0a80b0404152c9ee77b834b88a4d10c960c107fe5b71bdb2da5a0801552d4cc31017bbe870f55c7b0b1f4154e79a62e2c7dd6ede
|
data/README.md
CHANGED
@@ -85,7 +85,7 @@ state of the system.
|
|
85
85
|
|
86
86
|
#### Satellite notes
|
87
87
|
|
88
|
-
To use custom
|
88
|
+
To use custom organization/activation key for configuring repositories during
|
89
89
|
upgrade, set the following environment variables
|
90
90
|
|
91
91
|
```
|
@@ -116,7 +116,7 @@ The definitions for this components are present in `definitions` folder.
|
|
116
116
|
### Features
|
117
117
|
|
118
118
|
Before `foreman_maintain` starts, it takes the set of `features` definition
|
119
|
-
and determines their
|
119
|
+
and determines their presence by running their `confine` blocks against
|
120
120
|
the system.
|
121
121
|
|
122
122
|
The `confine` block can run an external command to check if the feature
|
@@ -154,7 +154,7 @@ scenarios) from version-specific nuances.
|
|
154
154
|
Checks define assertions to determine status of the system.
|
155
155
|
|
156
156
|
```ruby
|
157
|
-
class Checks::
|
157
|
+
class Checks::ForemanIsRunning < ForemanMaintain::Check
|
158
158
|
metadata do
|
159
159
|
for_feature :foreman
|
160
160
|
description 'check foreman service is running'
|
@@ -3,12 +3,16 @@ class Checks::DiskSpeedMinimal < ForemanMaintain::Check
|
|
3
3
|
label :disk_io
|
4
4
|
description 'Check for recommended disk speed of pulp, mongodb, pgsql dir.'
|
5
5
|
tags :pre_upgrade
|
6
|
+
|
6
7
|
preparation_steps { Procedures::Packages::Install.new(:packages => %w[hdparm fio]) }
|
8
|
+
|
9
|
+
confine do
|
10
|
+
feature(:katello)
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
EXPECTED_IO = 80
|
10
|
-
DEFAULT_UNIT
|
11
|
-
DEFAULT_DIRS = ['/var/lib/pulp', '/var/lib/mongodb', '/var/lib/pgsql'].freeze
|
15
|
+
DEFAULT_UNIT = 'MB/sec'.freeze
|
12
16
|
|
13
17
|
def run
|
14
18
|
with_spinner(description) do |spinner|
|
@@ -20,14 +24,14 @@ class Checks::DiskSpeedMinimal < ForemanMaintain::Check
|
|
20
24
|
end
|
21
25
|
|
22
26
|
def check_only_single_device?
|
23
|
-
|
27
|
+
feature(:katello).data_dirs.map do |dir|
|
24
28
|
ForemanMaintain::Utils::Disk::Device.new(dir).name
|
25
29
|
end.uniq.length <= 1
|
26
30
|
end
|
27
31
|
|
28
32
|
def dirs_to_check
|
29
|
-
return
|
30
|
-
|
33
|
+
return feature(:katello).data_dirs.first(1) if check_only_single_device?
|
34
|
+
feature(:katello).data_dirs
|
31
35
|
end
|
32
36
|
|
33
37
|
private
|
@@ -9,8 +9,26 @@ module Checks::ForemanTasks
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def run
|
12
|
-
|
13
|
-
|
12
|
+
task_count = feature(:foreman_tasks).running_tasks_count
|
13
|
+
assert(task_count == 0,
|
14
|
+
failure_message(task_count),
|
15
|
+
:next_steps =>
|
16
|
+
[Procedures::ForemanTasks::FetchTasksStatus.new(:state => 'running'),
|
17
|
+
Procedures::ForemanTasks::UiInvestigate.new(
|
18
|
+
'search_query' => search_query_for_running_tasks
|
19
|
+
)])
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def search_query_for_running_tasks
|
25
|
+
'state = running AND '\
|
26
|
+
"label !^(#{Features::ForemanTasks::EXCLUDE_ACTIONS_FOR_RUNNING_TASKS.join(' ')})"
|
27
|
+
end
|
28
|
+
|
29
|
+
def failure_message(task_count)
|
30
|
+
"There are #{task_count} active task(s) in the system." \
|
31
|
+
"\nPlease wait for these to complete or cancel them from the Monitor tab."
|
14
32
|
end
|
15
33
|
end
|
16
34
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Checks::HammerPing < ForemanMaintain::Check
|
2
|
+
include ForemanMaintain::Concerns::Hammer
|
3
|
+
metadata do
|
4
|
+
label :hammer_ping
|
5
|
+
for_feature :hammer
|
6
|
+
description 'Check whether all services are running using hammer ping'
|
7
|
+
tags :default
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
result = feature(:hammer).hammer_ping_cmd
|
12
|
+
assert(result[:success],
|
13
|
+
result[:message],
|
14
|
+
:next_steps => Procedures::KatelloService::Restart.new(:only => result[:data]))
|
15
|
+
end
|
16
|
+
end
|
@@ -5,22 +5,18 @@ class Checks::SystemRegistration < ForemanMaintain::Check
|
|
5
5
|
tags :default
|
6
6
|
|
7
7
|
confine do
|
8
|
-
file_exists?('/etc/rhsm/rhsm.conf')
|
8
|
+
file_exists?('/etc/rhsm/rhsm.conf') &&
|
9
|
+
!feature(:foreman_server) &&
|
10
|
+
feature(:foreman_proxy)
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
14
|
def run
|
13
|
-
if
|
15
|
+
if rhsm_hostname_eql_hostname?
|
14
16
|
warn! 'System is self registered'
|
15
|
-
else
|
16
|
-
puts 'System is not self registered'
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def system_is_self_registerd?
|
21
|
-
rhsm_hostname.casecmp(hostname).zero?
|
22
|
-
end
|
23
|
-
|
24
20
|
def rhsm_hostname
|
25
21
|
execute("grep '\\bhostname\\b' < #{rhsm_conf_file} | grep -v '^#'").sub(/.*?=/, '').strip
|
26
22
|
end
|
@@ -28,4 +24,8 @@ class Checks::SystemRegistration < ForemanMaintain::Check
|
|
28
24
|
def rhsm_conf_file
|
29
25
|
'/etc/rhsm/rhsm.conf'
|
30
26
|
end
|
27
|
+
|
28
|
+
def rhsm_hostname_eql_hostname?
|
29
|
+
@result ||= rhsm_hostname.casecmp(hostname).zero?
|
30
|
+
end
|
31
31
|
end
|
@@ -34,9 +34,17 @@ class Features::Downstream < ForemanMaintain::Feature
|
|
34
34
|
def rh_repos(sat_version)
|
35
35
|
sat_version = version(sat_version)
|
36
36
|
rh_version_major = execute!('facter operatingsystemmajrelease')
|
37
|
+
|
38
|
+
sat_repo_id = "rhel-#{rh_version_major}-server-satellite-#{sat_version.major}"\
|
39
|
+
".#{sat_version.minor}-rpms"
|
40
|
+
# Override to use Beta repositories for 6.3 until GA
|
41
|
+
if sat_version.to_s == '6.3'
|
42
|
+
sat_repo_id = "rhel-server-#{rh_version_major}-satellite-6-beta-rpms"
|
43
|
+
end
|
44
|
+
|
37
45
|
["rhel-#{rh_version_major}-server-rpms",
|
38
46
|
"rhel-server-rhscl-#{rh_version_major}-rpms",
|
39
|
-
|
47
|
+
sat_repo_id]
|
40
48
|
end
|
41
49
|
|
42
50
|
def version_from_source
|
@@ -1,6 +1,9 @@
|
|
1
1
|
class Features::ForemanProxy < ForemanMaintain::Feature
|
2
2
|
metadata do
|
3
3
|
label :foreman_proxy
|
4
|
+
confine do
|
5
|
+
find_package('foreman-proxy')
|
6
|
+
end
|
4
7
|
end
|
5
8
|
|
6
9
|
attr_reader :dhcpd_conf_file, :cert_path
|
@@ -36,7 +39,7 @@ class Features::ForemanProxy < ForemanMaintain::Feature
|
|
36
39
|
array_output = curl_resp.split(/\r\n/)
|
37
40
|
result_array = array_output.last.split(/\n/)
|
38
41
|
curl_http_status = result_array.delete_at(result_array.length - 1).strip.to_i
|
39
|
-
curl_http_resp =
|
42
|
+
curl_http_resp = parse_json(result_array.join(''))
|
40
43
|
ForemanMaintain::Utils::CurlResponse.new(
|
41
44
|
curl_http_resp,
|
42
45
|
curl_http_status,
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class Features::ForemanTasks < ForemanMaintain::Feature
|
2
2
|
MIN_AGE = 30
|
3
|
+
TIMEOUT_FOR_TASKS_STATUS = 300
|
4
|
+
RETRY_INTERVAL_FOR_TASKS_STATE = 10
|
3
5
|
|
4
6
|
SAFE_TO_DELETE = %w[
|
5
7
|
Actions::Katello::Host::GenerateApplicability
|
@@ -11,6 +13,11 @@ class Features::ForemanTasks < ForemanMaintain::Feature
|
|
11
13
|
Actions::Katello::EventQueue::Monitor
|
12
14
|
].freeze
|
13
15
|
|
16
|
+
EXCLUDE_ACTIONS_FOR_RUNNING_TASKS = %w[
|
17
|
+
Actions::Candlepin::ListenOnCandlepinEvents
|
18
|
+
Actions::Katello::EventQueue::Monitor
|
19
|
+
].freeze
|
20
|
+
|
14
21
|
metadata do
|
15
22
|
label :foreman_tasks
|
16
23
|
|
@@ -33,10 +40,14 @@ class Features::ForemanTasks < ForemanMaintain::Feature
|
|
33
40
|
end
|
34
41
|
|
35
42
|
def running_tasks_count
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
actions_to_exclude = quotize(EXCLUDE_ACTIONS_FOR_RUNNING_TASKS)
|
44
|
+
sql = <<-SQL
|
45
|
+
SELECT count(*) AS count
|
46
|
+
FROM foreman_tasks_tasks
|
47
|
+
WHERE state IN ('running') AND
|
48
|
+
label NOT IN (#{actions_to_exclude})
|
49
|
+
SQL
|
50
|
+
feature(:foreman_database).query(sql).first['count'].to_i
|
40
51
|
end
|
41
52
|
|
42
53
|
def paused_tasks_count(ignored_tasks = [])
|
@@ -86,8 +97,42 @@ class Features::ForemanTasks < ForemanMaintain::Feature
|
|
86
97
|
hammer('task resume')
|
87
98
|
end
|
88
99
|
|
100
|
+
def fetch_tasks_status(state, spinner)
|
101
|
+
Timeout.timeout(TIMEOUT_FOR_TASKS_STATUS) do
|
102
|
+
check_task_count(state, spinner)
|
103
|
+
end
|
104
|
+
rescue Timeout::Error => e
|
105
|
+
logger.error e.message
|
106
|
+
puts "\nTimeout: #{e.message}. Try again."
|
107
|
+
end
|
108
|
+
|
89
109
|
private
|
90
110
|
|
111
|
+
def check_task_count(state, spinner)
|
112
|
+
loop do
|
113
|
+
spinner.update "Try checking status of #{state} task(s)"
|
114
|
+
task_count = call_tasks_count_by_state(state)
|
115
|
+
break if task_count == 0
|
116
|
+
puts "\nThere are #{task_count} #{state} tasks."
|
117
|
+
spinner.update "Waiting #{RETRY_INTERVAL_FOR_TASKS_STATE} seconds before retry."
|
118
|
+
sleep RETRY_INTERVAL_FOR_TASKS_STATE
|
119
|
+
end
|
120
|
+
rescue StandardError => e
|
121
|
+
logger.error e.message
|
122
|
+
end
|
123
|
+
|
124
|
+
def call_tasks_count_by_state(state)
|
125
|
+
case state
|
126
|
+
when 'running'
|
127
|
+
running_tasks_count
|
128
|
+
when 'paused'
|
129
|
+
paused_tasks_count
|
130
|
+
else
|
131
|
+
logger.error "No count method defined for state #{state}."
|
132
|
+
raise "Unsupported for state #{state}."
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
91
136
|
def parent_backup_dir
|
92
137
|
File.expand_path(ForemanMaintain.config.backup_dir)
|
93
138
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Features::Hammer < ForemanMaintain::Feature
|
2
|
+
metadata do
|
3
|
+
label :hammer
|
4
|
+
end
|
5
|
+
|
6
|
+
SERVICES_MAPPING = {
|
7
|
+
'candlepin_auth' => %w[postgresql tomcat],
|
8
|
+
'candlepin' => %w[postgresql tomcat],
|
9
|
+
'pulp_auth' => %w[pulp_resource_manager pulp_workers pulp_celerybeat],
|
10
|
+
'pulp' => %w[pulp_resource_manager pulp_workers pulp_celerybeat],
|
11
|
+
'foreman_tasks' => %w[foreman-tasks]
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
def hammer_ping_cmd
|
15
|
+
cmd_output = exec_hammer_cmd('--output json ping', true)
|
16
|
+
return init_result_obj(false, cmd_output) if cmd_output.is_a?(String)
|
17
|
+
resources_failed = find_resources_which_failed(cmd_output.first)
|
18
|
+
return init_result_obj if resources_failed.empty?
|
19
|
+
services = map_resources_with_services(resources_failed)
|
20
|
+
msg_to_show = "#{resources_failed.join(', ')} resource(s) are failing."
|
21
|
+
init_result_obj(false, msg_to_show, services)
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_resources_which_failed(hammer_ping_output)
|
25
|
+
resources_failed = []
|
26
|
+
hammer_ping_output.each do |resource, resp_obj|
|
27
|
+
resources_failed << resource if /FAIL/ =~ resp_obj['Status']
|
28
|
+
end
|
29
|
+
resources_failed
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def map_resources_with_services(resources)
|
35
|
+
service_names = []
|
36
|
+
resources.each do |resource|
|
37
|
+
service_names.concat(SERVICES_MAPPING[resource])
|
38
|
+
end
|
39
|
+
service_names
|
40
|
+
end
|
41
|
+
|
42
|
+
def init_result_obj(success_val = true, message = '', data = [])
|
43
|
+
{
|
44
|
+
:success => success_val,
|
45
|
+
:message => message,
|
46
|
+
:data => data
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def exec_hammer_cmd(cmd, required_json = false)
|
51
|
+
response = ForemanMaintain::Utils::Hammer.instance.run_command(cmd)
|
52
|
+
json_str = parse_json(response) if required_json
|
53
|
+
json_str ? json_str : response
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Features::Katello < ForemanMaintain::Feature
|
2
|
+
metadata do
|
3
|
+
label :katello
|
4
|
+
|
5
|
+
confine do
|
6
|
+
find_package('katello')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def data_dirs
|
11
|
+
@dirs ||= ['/var/lib/pulp', '/var/lib/mongodb', '/var/lib/pgsql']
|
12
|
+
end
|
13
|
+
|
14
|
+
def current_version
|
15
|
+
@current_version ||= rpm_version('katello')
|
16
|
+
end
|
17
|
+
end
|
@@ -3,20 +3,22 @@ class Features::KatelloService < ForemanMaintain::Feature
|
|
3
3
|
label :katello_service
|
4
4
|
end
|
5
5
|
|
6
|
+
RETRIES_FOR_SERVICES_RESTART = 5
|
7
|
+
PING_RETRY_INTERVAL = 30
|
8
|
+
|
6
9
|
def make_stop(spinner, options = {})
|
7
10
|
services = find_services_for_only_filter(running_services, options)
|
8
11
|
if services.empty?
|
9
12
|
spinner.update 'No katello service running'
|
10
|
-
yield
|
13
|
+
yield if block_given?
|
11
14
|
else
|
12
15
|
begin
|
13
16
|
filters = "--only #{services.join(',')}"
|
14
17
|
spinner.update 'Stopping katello running services..'
|
15
18
|
execute!("katello-service stop #{filters}")
|
16
|
-
yield
|
19
|
+
yield if block_given?
|
17
20
|
ensure
|
18
|
-
spinner
|
19
|
-
execute("katello-service start #{filters}")
|
21
|
+
start_stopped_services_using_filters(spinner, filters) if block_given?
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -27,13 +29,60 @@ class Features::KatelloService < ForemanMaintain::Feature
|
|
27
29
|
spinner.update 'No katello service to start'
|
28
30
|
else
|
29
31
|
filters = "--only #{services.join(',')}"
|
30
|
-
spinner.update 'Starting
|
32
|
+
spinner.update 'Starting katello services..'
|
31
33
|
execute!("katello-service start #{filters}")
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
37
|
+
def restart(options = {})
|
38
|
+
if options[:only] || options[:exclude]
|
39
|
+
filters = construct_filters_for_restart(options)
|
40
|
+
execute!("katello-service restart #{filters}")
|
41
|
+
else
|
42
|
+
execute!('katello-service restart')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def hammer_ping_retry(spinner)
|
47
|
+
RETRIES_FOR_SERVICES_RESTART.times do |retry_count|
|
48
|
+
msg = "Try #{retry_count + 1}/#{RETRIES_FOR_SERVICES_RESTART}: checking status by hammer ping"
|
49
|
+
spinner.update msg
|
50
|
+
result = feature(:hammer).hammer_ping_cmd
|
51
|
+
if result[:success]
|
52
|
+
spinner.update 'All services are running.'
|
53
|
+
break
|
54
|
+
elsif retry_count < (RETRIES_FOR_SERVICES_RESTART - 1)
|
55
|
+
apply_sleep_before_retry(spinner, result)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
rescue StandardError => e
|
59
|
+
logger.error e.message
|
60
|
+
end
|
61
|
+
|
35
62
|
private
|
36
63
|
|
64
|
+
def apply_sleep_before_retry(spinner, result)
|
65
|
+
puts "\n#{result[:message]}"
|
66
|
+
spinner.update "Waiting #{PING_RETRY_INTERVAL} seconds before retry."
|
67
|
+
sleep PING_RETRY_INTERVAL
|
68
|
+
end
|
69
|
+
|
70
|
+
def construct_filters_for_restart(options)
|
71
|
+
filters = ''
|
72
|
+
if options[:only]
|
73
|
+
filters += "--only #{options[:only].join(',')}" unless options[:only].empty?
|
74
|
+
end
|
75
|
+
if options[:exclude]
|
76
|
+
filters += "--exclude #{options[:exclude].join(',')}" unless options[:exclude].empty?
|
77
|
+
end
|
78
|
+
filters
|
79
|
+
end
|
80
|
+
|
81
|
+
def start_stopped_services_using_filters(spinner, filters)
|
82
|
+
spinner.update 'Starting katello services..'
|
83
|
+
execute("katello-service start #{filters}")
|
84
|
+
end
|
85
|
+
|
37
86
|
def find_services_for_only_filter(curr_services, options)
|
38
87
|
defaults = { :only => [], :exclude => [] }
|
39
88
|
options = defaults.merge(options)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Procedures::ForemanTasks
|
2
|
+
class FetchTasksStatus < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
for_feature :foreman_tasks
|
5
|
+
description 'Fetch tasks status and wait till they finish'
|
6
|
+
param :state, :required => true
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
with_spinner("waiting for #{@state} tasks to finish") do |spinner|
|
11
|
+
feature(:foreman_tasks).fetch_tasks_status(@state, spinner)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -12,7 +12,7 @@ module Procedures::ForemanTasks
|
|
12
12
|
def run
|
13
13
|
ask(<<-MESSAGE.strip_heredoc)
|
14
14
|
Go to https://#{hostname}/foreman_tasks/tasks?search=#{CGI.escape(@search_query.to_s)}
|
15
|
-
press ENTER after the
|
15
|
+
press ENTER after the tasks are resolved.
|
16
16
|
MESSAGE
|
17
17
|
end
|
18
18
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Procedures::KatelloService
|
2
|
+
class Restart < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
description 'katello-service restart'
|
5
|
+
param :only, 'A comma-separated list of services to include', :array => true
|
6
|
+
param :exclude, 'A comma-separated list of services to skip', :array => true
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
with_spinner('restarting katello service(s)') do |spinner|
|
11
|
+
spinner.update('Restarting services')
|
12
|
+
feature(:katello_service).restart(:only => @only, :exclude => @exclude)
|
13
|
+
feature(:katello_service).hammer_ping_retry(spinner)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def runtime_message
|
18
|
+
msg = 'katello-service restart'
|
19
|
+
msg += "--only #{@only.join(',')}" unless @only.empty?
|
20
|
+
msg += "--exclude #{@exclude.join(',')}" unless @exclude.empty?
|
21
|
+
msg
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Procedures::KatelloService
|
2
|
+
class Start < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
description 'katello-service start'
|
5
|
+
param :only, 'A comma-separated list of services to include', :array => true
|
6
|
+
param :exclude, 'A comma-separated list of services to skip', :array => true
|
7
|
+
for_feature :katello_service
|
8
|
+
tags :katello_service_start
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
with_spinner('stopping katello service(s)') do |spinner|
|
13
|
+
feature(:katello_service).make_start(
|
14
|
+
spinner, :only => @only, :exclude => @exclude
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Procedures::KatelloService
|
2
|
+
class Stop < ForemanMaintain::Procedure
|
3
|
+
metadata do
|
4
|
+
description 'katello-service stop'
|
5
|
+
param :only, 'A comma-separated list of services to include', :array => true
|
6
|
+
param :exclude, 'A comma-separated list of services to skip', :array => true
|
7
|
+
for_feature :katello_service
|
8
|
+
tags :katello_service_stop
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
with_spinner('stopping katello service(s)') do |spinner|
|
13
|
+
feature(:katello_service).make_stop(spinner, :only => @only, :exclude => @exclude)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -32,6 +32,7 @@ module Scenarios::Satellite_6_2
|
|
32
32
|
|
33
33
|
def compose
|
34
34
|
add_steps(find_procedures(:pre_migrations))
|
35
|
+
add_step(Procedures::KatelloService::Stop.new)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -43,7 +44,7 @@ module Scenarios::Satellite_6_2
|
|
43
44
|
|
44
45
|
def compose
|
45
46
|
add_step(Procedures::Repositories::Setup.new(:version => '6.2'))
|
46
|
-
add_step(Procedures::Packages::Update.new(:assumeyes =>
|
47
|
+
add_step(Procedures::Packages::Update.new(:assumeyes => true))
|
47
48
|
add_step(Procedures::Installer::Upgrade.new)
|
48
49
|
end
|
49
50
|
end
|
@@ -55,6 +56,7 @@ module Scenarios::Satellite_6_2
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def compose
|
59
|
+
add_step(Procedures::KatelloService::Start.new)
|
58
60
|
add_steps(find_procedures(:post_migrations))
|
59
61
|
end
|
60
62
|
end
|
@@ -32,6 +32,7 @@ module Scenarios::Satellite_6_2_z
|
|
32
32
|
|
33
33
|
def compose
|
34
34
|
add_steps(find_procedures(:pre_migrations))
|
35
|
+
add_step(Procedures::KatelloService::Stop.new)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -42,7 +43,7 @@ module Scenarios::Satellite_6_2_z
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def compose
|
45
|
-
add_step(Procedures::Packages::Update.new(:assumeyes =>
|
46
|
+
add_step(Procedures::Packages::Update.new(:assumeyes => true))
|
46
47
|
add_step(Procedures::Installer::Upgrade.new)
|
47
48
|
end
|
48
49
|
end
|
@@ -54,6 +55,7 @@ module Scenarios::Satellite_6_2_z
|
|
54
55
|
end
|
55
56
|
|
56
57
|
def compose
|
58
|
+
add_step(Procedures::KatelloService::Start.new)
|
57
59
|
add_steps(find_procedures(:post_migrations))
|
58
60
|
end
|
59
61
|
end
|
@@ -32,6 +32,7 @@ module Scenarios::Satellite_6_3
|
|
32
32
|
|
33
33
|
def compose
|
34
34
|
add_steps(find_procedures(:pre_migrations))
|
35
|
+
add_step(Procedures::KatelloService::Stop.new)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -43,7 +44,7 @@ module Scenarios::Satellite_6_3
|
|
43
44
|
|
44
45
|
def compose
|
45
46
|
add_step(Procedures::Repositories::Setup.new(:version => '6.3'))
|
46
|
-
add_step(Procedures::Packages::Update.new(:assumeyes =>
|
47
|
+
add_step(Procedures::Packages::Update.new(:assumeyes => true))
|
47
48
|
add_step(Procedures::Installer::Upgrade.new)
|
48
49
|
end
|
49
50
|
end
|
@@ -55,6 +56,7 @@ module Scenarios::Satellite_6_3
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def compose
|
59
|
+
add_step(Procedures::KatelloService::Start.new)
|
58
60
|
add_steps(find_procedures(:post_migrations))
|
59
61
|
end
|
60
62
|
end
|
@@ -32,6 +32,7 @@ module Scenarios::Satellite_6_3_z
|
|
32
32
|
|
33
33
|
def compose
|
34
34
|
add_steps(find_procedures(:pre_migrations))
|
35
|
+
add_step(Procedures::KatelloService::Stop.new)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -42,7 +43,7 @@ module Scenarios::Satellite_6_3_z
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def compose
|
45
|
-
add_step(Procedures::Packages::Update.new(:assumeyes =>
|
46
|
+
add_step(Procedures::Packages::Update.new(:assumeyes => true))
|
46
47
|
add_step(Procedures::Installer::Upgrade.new)
|
47
48
|
end
|
48
49
|
end
|
@@ -54,6 +55,7 @@ module Scenarios::Satellite_6_3_z
|
|
54
55
|
end
|
55
56
|
|
56
57
|
def compose
|
58
|
+
add_step(Procedures::KatelloService::Start.new)
|
57
59
|
add_steps(find_procedures(:post_migrations))
|
58
60
|
end
|
59
61
|
end
|
@@ -4,7 +4,7 @@ module ForemanMaintain
|
|
4
4
|
class AbstractByTagCommand < AbstractProcedureCommand
|
5
5
|
def self.tag_params_to_options(tag)
|
6
6
|
params = params_for_tag(tag)
|
7
|
-
params.
|
7
|
+
params.each_value do |param|
|
8
8
|
mapping = param[:procedures]
|
9
9
|
instance = param[:instance]
|
10
10
|
param_to_option(instance, :description => instance.description + " #{mapping}")
|
@@ -14,7 +14,7 @@ module ForemanMaintain
|
|
14
14
|
def self.params_for_tag(tag)
|
15
15
|
params = {}
|
16
16
|
ForemanMaintain.available_procedures(:tags => tag).each do |procedure|
|
17
|
-
procedure.params.
|
17
|
+
procedure.params.each_value do |param|
|
18
18
|
unless params.key?(param.name)
|
19
19
|
params[param.name] = { :instance => param, :procedures => [] }
|
20
20
|
end
|
@@ -17,7 +17,7 @@ module ForemanMaintain
|
|
17
17
|
def get_params_for(definition)
|
18
18
|
all_params = options_to_params
|
19
19
|
params = {}
|
20
|
-
definition.params.
|
20
|
+
definition.params.each_value do |param|
|
21
21
|
params[param.name] = all_params[param.name]
|
22
22
|
end
|
23
23
|
params
|
@@ -37,7 +37,7 @@ module ForemanMaintain
|
|
37
37
|
|
38
38
|
module ParamsToOptions
|
39
39
|
def params_to_options(params)
|
40
|
-
params.
|
40
|
+
params.each_value do |param|
|
41
41
|
param_to_option(param)
|
42
42
|
end
|
43
43
|
end
|
@@ -66,7 +66,12 @@ module ForemanMaintain
|
|
66
66
|
subcommand 'run', 'Run full upgrade to a specified version' do
|
67
67
|
target_version_option
|
68
68
|
interactive_option
|
69
|
-
option '--phase', 'phase', 'run only a specific phase', :required => false
|
69
|
+
option '--phase', 'phase', 'run only a specific phase', :required => false do |phase|
|
70
|
+
unless UpgradeRunner::PHASES.include?(phase.to_sym)
|
71
|
+
raise Error::UsageError, "Unknown phase #{phase}"
|
72
|
+
end
|
73
|
+
phase
|
74
|
+
end
|
70
75
|
|
71
76
|
def execute
|
72
77
|
if phase
|
@@ -26,16 +26,69 @@ module ForemanMaintain
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
29
|
+
def check_min_version(name, minimal_version)
|
30
|
+
current_version = package_version(name)
|
31
|
+
if current_version
|
32
|
+
return current_version >= version(minimal_version)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def downstream_installation?
|
37
|
+
execute?('rpm -q satellite') ||
|
38
|
+
(execute('rpm -q foreman') =~ /sat.noarch/)
|
39
|
+
end
|
40
|
+
|
41
|
+
def execute?(command, input = nil)
|
42
|
+
execute(command, :stdin => input)
|
43
|
+
$CHILD_STATUS.success?
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute!(command, options = {})
|
47
|
+
command_runner = Utils::CommandRunner.new(logger, command, options)
|
48
|
+
execution.puts '' if command_runner.interactive? && respond_to?(:execution)
|
49
|
+
command_runner.run
|
50
|
+
if command_runner.success?
|
51
|
+
command_runner.output
|
52
|
+
else
|
53
|
+
raise command_runner.execution_error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute(command, options = {})
|
58
|
+
command_runner = Utils::CommandRunner.new(logger, command, options)
|
59
|
+
execution.puts '' if command_runner.interactive? && respond_to?(:execution)
|
60
|
+
command_runner.run
|
61
|
+
command_runner.output
|
31
62
|
end
|
32
63
|
|
33
64
|
def file_exists?(filename)
|
34
65
|
File.exist?(filename)
|
35
66
|
end
|
36
67
|
|
37
|
-
def
|
38
|
-
|
68
|
+
def find_package(name)
|
69
|
+
result = execute(%(rpm -q '#{name}'))
|
70
|
+
if $CHILD_STATUS.success?
|
71
|
+
result
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def hostname
|
76
|
+
execute('hostname -f')
|
77
|
+
end
|
78
|
+
|
79
|
+
def install_packages(packages, options = {})
|
80
|
+
options.validate_options!(:assumeyes)
|
81
|
+
yum_options = []
|
82
|
+
yum_options << '-y' if options[:assumeyes]
|
83
|
+
execute!("yum #{yum_options.join(' ')} install #{packages.join(' ')}", :interactive => true)
|
84
|
+
end
|
85
|
+
|
86
|
+
def server?
|
87
|
+
find_package('foreman')
|
88
|
+
end
|
89
|
+
|
90
|
+
def smart_proxy?
|
91
|
+
!server? && find_package('foreman-proxy')
|
39
92
|
end
|
40
93
|
|
41
94
|
def packages_action(action, packages, options = {})
|
@@ -50,30 +103,11 @@ module ForemanMaintain
|
|
50
103
|
:interactive => true)
|
51
104
|
end
|
52
105
|
|
53
|
-
def check_min_version(name, minimal_version)
|
54
|
-
current_version = package_version(name)
|
55
|
-
if current_version
|
56
|
-
return current_version >= version(minimal_version)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def downstream_installation?
|
61
|
-
execute?('rpm -q satellite') ||
|
62
|
-
(execute('rpm -q foreman') =~ /sat.noarch/)
|
63
|
-
end
|
64
|
-
|
65
106
|
def package_version(name)
|
66
107
|
# space for extension to support non-rpm distributions
|
67
108
|
rpm_version(name)
|
68
109
|
end
|
69
110
|
|
70
|
-
def rpm_version(name, queryformat = 'VERSION')
|
71
|
-
rpm_version = execute(%(rpm -q '#{name}' --queryformat="%{#{queryformat}}"))
|
72
|
-
if $CHILD_STATUS.success?
|
73
|
-
version(rpm_version)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
111
|
def parse_csv(data)
|
78
112
|
parsed_data = CSV.parse(data)
|
79
113
|
header = parsed_data.first
|
@@ -82,37 +116,25 @@ module ForemanMaintain
|
|
82
116
|
end
|
83
117
|
end
|
84
118
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
119
|
+
def parse_json(json_string)
|
120
|
+
JSON.parse(json_string)
|
121
|
+
rescue StandardError
|
122
|
+
nil
|
88
123
|
end
|
89
124
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if command_runner.success?
|
95
|
-
command_runner.output
|
96
|
-
else
|
97
|
-
raise command_runner.execution_error
|
125
|
+
def rpm_version(name)
|
126
|
+
rpm_version = execute(%(rpm -q '#{name}' --queryformat="%{VERSION}"))
|
127
|
+
if $CHILD_STATUS.success?
|
128
|
+
version(rpm_version)
|
98
129
|
end
|
99
130
|
end
|
100
131
|
|
101
|
-
def execute(command, options = {})
|
102
|
-
command_runner = Utils::CommandRunner.new(logger, command, options)
|
103
|
-
execution.puts '' if command_runner.interactive? && respond_to?(:execution)
|
104
|
-
command_runner.run
|
105
|
-
command_runner.output
|
106
|
-
end
|
107
|
-
|
108
132
|
def shellescape(string)
|
109
133
|
Shellwords.escape(string)
|
110
134
|
end
|
111
135
|
|
112
|
-
def
|
113
|
-
|
114
|
-
rescue
|
115
|
-
nil
|
136
|
+
def version(value)
|
137
|
+
Version.new(value)
|
116
138
|
end
|
117
139
|
end
|
118
140
|
end
|
@@ -35,7 +35,7 @@ module ForemanMaintain
|
|
35
35
|
"Config file #{config_file} not found, using default configuration"
|
36
36
|
{}
|
37
37
|
end
|
38
|
-
rescue => e
|
38
|
+
rescue StandardError => e
|
39
39
|
raise "Couldn't load configuration file. Error: #{e.message}"
|
40
40
|
end
|
41
41
|
|
@@ -51,7 +51,7 @@ module ForemanMaintain
|
|
51
51
|
dir_path = File.expand_path(dir_path_str)
|
52
52
|
begin
|
53
53
|
FileUtils.mkdir_p(dir_path, :mode => 0o750) unless File.exist?(dir_path)
|
54
|
-
rescue => e
|
54
|
+
rescue StandardError => e
|
55
55
|
$stderr.puts "No permissions to create dir #{dir_path_str}"
|
56
56
|
$stderr.puts e.message.inspect
|
57
57
|
end
|
@@ -67,7 +67,7 @@ module ForemanMaintain
|
|
67
67
|
return if @all_features_scanned
|
68
68
|
@available_features = []
|
69
69
|
@features_by_label = {}
|
70
|
-
autodetect_features.
|
70
|
+
autodetect_features.each_key do |label|
|
71
71
|
detect_feature(label)
|
72
72
|
end
|
73
73
|
@all_features_scanned = true
|
@@ -8,8 +8,6 @@ module ForemanMaintain
|
|
8
8
|
:assumeyes?, :whitelisted?,
|
9
9
|
:execution, :puts, :print, :with_spinner, :ask, :storage
|
10
10
|
|
11
|
-
attr_accessor :associated_feature
|
12
|
-
|
13
11
|
def initialize(options = {})
|
14
12
|
@options = options.inject({}) { |h, (k, v)| h.update(k.to_s => v) }
|
15
13
|
@param_values = {}
|
@@ -33,7 +31,7 @@ module ForemanMaintain
|
|
33
31
|
# processes the params from provided options
|
34
32
|
def setup_params
|
35
33
|
@options.validate_options!(params.values.map(&:name).map(&:to_s))
|
36
|
-
params.
|
34
|
+
params.each_value do |param|
|
37
35
|
set_param_variable(param.name, param.process(@options[param.name.to_s]))
|
38
36
|
end
|
39
37
|
end
|
data/lib/foreman_maintain.rb
CHANGED
@@ -6,6 +6,7 @@ require 'forwardable'
|
|
6
6
|
require 'json'
|
7
7
|
require 'logger'
|
8
8
|
require 'yaml'
|
9
|
+
require 'timeout'
|
9
10
|
|
10
11
|
module ForemanMaintain
|
11
12
|
require 'foreman_maintain/core_ext'
|
@@ -110,7 +111,7 @@ module ForemanMaintain
|
|
110
111
|
|
111
112
|
def storage(label = :default)
|
112
113
|
ForemanMaintain::YamlStorage.load(label)
|
113
|
-
rescue => e
|
114
|
+
rescue StandardError => e
|
114
115
|
logger.error "Invalid Storage label i.e #{label}. Error - #{e.message}"
|
115
116
|
end
|
116
117
|
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.0.
|
4
|
+
version: 0.0.10
|
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: 2017-
|
11
|
+
date: 2017-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: clamp
|
@@ -116,21 +116,29 @@ files:
|
|
116
116
|
- definitions/checks/foreman_tasks/invalid/check_planning_state.rb
|
117
117
|
- definitions/checks/foreman_tasks/not_paused.rb
|
118
118
|
- definitions/checks/foreman_tasks/not_running.rb
|
119
|
+
- definitions/checks/hammer_ping.rb
|
119
120
|
- definitions/checks/system_registration.rb
|
120
121
|
- definitions/features/downstream.rb
|
121
122
|
- definitions/features/foreman_1_11_x.rb
|
122
123
|
- definitions/features/foreman_1_7_x.rb
|
123
124
|
- definitions/features/foreman_database.rb
|
124
125
|
- definitions/features/foreman_proxy.rb
|
126
|
+
- definitions/features/foreman_server.rb
|
125
127
|
- definitions/features/foreman_tasks.rb
|
128
|
+
- definitions/features/hammer.rb
|
129
|
+
- definitions/features/katello.rb
|
126
130
|
- definitions/features/katello_service.rb
|
127
131
|
- definitions/features/sync_plans.rb
|
128
132
|
- definitions/features/upstream.rb
|
129
133
|
- definitions/procedures/foreman_tasks/delete.rb
|
134
|
+
- definitions/procedures/foreman_tasks/fetch_tasks_status.rb
|
130
135
|
- definitions/procedures/foreman_tasks/resume.rb
|
131
136
|
- definitions/procedures/foreman_tasks/ui_investigate.rb
|
132
137
|
- definitions/procedures/hammer_setup.rb
|
133
138
|
- definitions/procedures/installer/upgrade.rb
|
139
|
+
- definitions/procedures/katello_service/restart.rb
|
140
|
+
- definitions/procedures/katello_service/start.rb
|
141
|
+
- definitions/procedures/katello_service/stop.rb
|
134
142
|
- definitions/procedures/maintenance_mode/disable.rb
|
135
143
|
- definitions/procedures/maintenance_mode/enable.rb
|
136
144
|
- definitions/procedures/packages/install.rb
|
@@ -211,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
219
|
version: '0'
|
212
220
|
requirements: []
|
213
221
|
rubyforge_project:
|
214
|
-
rubygems_version: 2.
|
222
|
+
rubygems_version: 2.6.12
|
215
223
|
signing_key:
|
216
224
|
specification_version: 4
|
217
225
|
summary: Foreman maintenance tool belt
|