foreman_maintain 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +3 -2
- data/definitions/checks/disk_speed_minimal.rb +41 -0
- data/definitions/features/foreman_database.rb +1 -1
- data/definitions/procedures/foreman_tasks_resume.rb +3 -3
- data/lib/foreman_maintain/cli/base.rb +13 -1
- data/lib/foreman_maintain/cli/health_command.rb +25 -2
- data/lib/foreman_maintain/concerns/system_helpers.rb +1 -1
- data/lib/foreman_maintain/scenario.rb +16 -7
- data/lib/foreman_maintain/utils/disk/device.rb +62 -0
- data/lib/foreman_maintain/utils/disk/io/block_device.rb +40 -0
- data/lib/foreman_maintain/utils/disk/io/file_system.rb +41 -0
- data/lib/foreman_maintain/utils/disk/io.rb +2 -0
- data/lib/foreman_maintain/utils/disk/nil_device.rb +18 -0
- data/lib/foreman_maintain/utils/disk.rb +3 -0
- data/lib/foreman_maintain/utils.rb +1 -0
- data/lib/foreman_maintain/version.rb +1 -1
- data/lib/foreman_maintain.rb +7 -0
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe40b2c9fdd4999acc0a0b764a916815e51c9c4a
|
4
|
+
data.tar.gz: cf9939ee27a333b61665f3eee0277005bfdd0167
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3297df9601ce8f75dae19f2539b9563434d523d2f3eec602f4562bb6ce98ff29a3622f5c07c859a4da29c6f2cd38f2d90cd8d9d3531dee6b6f08bc49fdecefc
|
7
|
+
data.tar.gz: 67e607579907ad237d497692781c7e226352f87b9494f3cbe51aa167e67298ef500884b2099b386a002a9604432a4afa41da8c74a0b51bcf64721a5fa9a421e8
|
data/README.md
CHANGED
@@ -10,10 +10,11 @@ enough to provide the right tools for the specific version.
|
|
10
10
|
```
|
11
11
|
Subcommands:
|
12
12
|
health Health related commands
|
13
|
-
list
|
13
|
+
list List the checks based on criteria
|
14
14
|
list-tags List the tags to use for filtering checks
|
15
15
|
check Run the health checks against the system
|
16
|
-
--
|
16
|
+
--label label Run only a specific check
|
17
|
+
--tags tags Limit only for specific set of tags
|
17
18
|
|
18
19
|
upgrade Upgrade related commands
|
19
20
|
list-versions List versions this system is upgradable to
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Checks::DiskSpeedMinimal < ForemanMaintain::Check
|
2
|
+
EXPECTED_IO = 80
|
3
|
+
DEFAULT_UNIT = 'MB/sec'.freeze
|
4
|
+
DEFAULT_DIRS = ['/var/lib/pulp', '/var/lib/mongodb', '/var/lib/pgsql'].freeze
|
5
|
+
|
6
|
+
label :disk_io
|
7
|
+
description 'Check for recommended disk speed of pulp, mongodb, pgsql dir.'
|
8
|
+
tags :basic
|
9
|
+
|
10
|
+
confine do
|
11
|
+
execute?('which hdparm') && execute?('which fio')
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
success = true
|
16
|
+
io_obj = ForemanMaintain::Utils::Disk::NilDevice.new
|
17
|
+
|
18
|
+
dirs_to_check.each do |dir|
|
19
|
+
io_obj = ForemanMaintain::Utils::Disk::Device.new(dir)
|
20
|
+
|
21
|
+
next if io_obj.read_speed >= EXPECTED_IO
|
22
|
+
|
23
|
+
success = false
|
24
|
+
logger.info "\n Slow disk detected for #{dir} - #{io_obj.read_speed} #{io_obj.unit}."
|
25
|
+
break
|
26
|
+
end
|
27
|
+
|
28
|
+
assert(success, io_obj.slow_disk_error_msg)
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_only_single_device?
|
32
|
+
DEFAULT_DIRS.map do |dir|
|
33
|
+
ForemanMaintain::Utils::Disk::Device.new(dir).name
|
34
|
+
end.uniq.length <= 1
|
35
|
+
end
|
36
|
+
|
37
|
+
def dirs_to_check
|
38
|
+
return DEFAULT_DIRS.first(1) if check_only_single_device?
|
39
|
+
DEFAULT_DIRS
|
40
|
+
end
|
41
|
+
end
|
@@ -37,8 +37,20 @@ module ForemanMaintain
|
|
37
37
|
collection.inject([]) { |array, check| array.concat(check.tags).uniq }.sort_by(&:to_s)
|
38
38
|
end
|
39
39
|
|
40
|
+
def self.label_option
|
41
|
+
option '--label', 'label',
|
42
|
+
'Limit only for a specific label. ' \
|
43
|
+
'(Use "list" command to see available labels)' do |label|
|
44
|
+
raise ArgumentError, 'value not specified' if label.nil? || label.empty?
|
45
|
+
underscorize(label).to_sym
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
40
49
|
def self.tags_option
|
41
|
-
option '--tags', 'tags',
|
50
|
+
option '--tags', 'tags',
|
51
|
+
'Limit only for specific set of labels. ' \
|
52
|
+
'(Use list-tags command to see available tags)' do |tags|
|
53
|
+
raise ArgumentError, 'value not specified' if tags.nil? || tags.empty?
|
42
54
|
tags.split(',').map(&:strip).map { |tag| underscorize(tag).to_sym }
|
43
55
|
end
|
44
56
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ForemanMaintain
|
2
2
|
module Cli
|
3
3
|
class HealthCommand < Base
|
4
|
-
subcommand 'list
|
4
|
+
subcommand 'list', 'List the checks based on criteria' do
|
5
5
|
tags_option
|
6
6
|
|
7
7
|
def execute
|
@@ -28,10 +28,33 @@ module ForemanMaintain
|
|
28
28
|
end
|
29
29
|
|
30
30
|
subcommand 'check', 'Run the health checks against the system' do
|
31
|
+
label_option
|
31
32
|
tags_option
|
32
33
|
|
33
34
|
def execute
|
34
|
-
|
35
|
+
scenario = Scenario::FilteredScenario.new(filter)
|
36
|
+
if scenario.steps.empty?
|
37
|
+
puts "No scenario matching #{humanized_filter}"
|
38
|
+
exit 1
|
39
|
+
else
|
40
|
+
run_scenario(scenario)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def filter
|
45
|
+
if label
|
46
|
+
{ :label => label }
|
47
|
+
else
|
48
|
+
{ :tags => tags || [:basic] }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def humanized_filter
|
53
|
+
if label
|
54
|
+
"label #{label_string(filter[:label])}"
|
55
|
+
else
|
56
|
+
"tags #{filter[:tags].map { |tag| tag_string(tag) }.join}"
|
57
|
+
end
|
35
58
|
end
|
36
59
|
end
|
37
60
|
end
|
@@ -7,23 +7,32 @@ module ForemanMaintain
|
|
7
7
|
|
8
8
|
attr_reader :steps
|
9
9
|
|
10
|
-
class
|
10
|
+
class FilteredScenario < Scenario
|
11
11
|
manual_detection
|
12
|
-
attr_reader :filter_tags
|
12
|
+
attr_reader :filter_label, :filter_tags
|
13
13
|
|
14
|
-
def initialize(
|
15
|
-
@filter_tags =
|
16
|
-
@
|
14
|
+
def initialize(filter)
|
15
|
+
@filter_tags = filter[:tags]
|
16
|
+
@filter_label = filter[:label]
|
17
|
+
@steps = ForemanMaintain.available_checks(filter)
|
17
18
|
end
|
18
19
|
|
19
20
|
def description
|
20
|
-
|
21
|
+
if @filter_label
|
22
|
+
"check with label [#{dashize(@filter_label)}]"
|
23
|
+
else
|
24
|
+
"checks with tags #{tag_string(@filter_tags)}"
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
private
|
24
29
|
|
25
30
|
def tag_string(tags)
|
26
|
-
tags.map { |tag| "[#{tag}]" }.join(' ')
|
31
|
+
tags.map { |tag| dashize("[#{tag}]") }.join(' ')
|
32
|
+
end
|
33
|
+
|
34
|
+
def dashize(string)
|
35
|
+
string.to_s.tr('_', '-')
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module ForemanMaintain
|
2
|
+
module Utils
|
3
|
+
module Disk
|
4
|
+
class Device
|
5
|
+
include ForemanMaintain::Concerns::SystemHelpers
|
6
|
+
|
7
|
+
EXTERNAL_MOUNT_TYPE = %w(fuseblk nfs).freeze
|
8
|
+
|
9
|
+
attr_accessor :dir, :name, :unit, :read_speed
|
10
|
+
|
11
|
+
attr_reader :io_device
|
12
|
+
|
13
|
+
def initialize(dir)
|
14
|
+
@dir = dir
|
15
|
+
@name = find_device
|
16
|
+
@io_device = init_io_device
|
17
|
+
end
|
18
|
+
|
19
|
+
def unit
|
20
|
+
@unit ||= io_device.unit
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_speed
|
24
|
+
@read_speed ||= io_device.read_speed
|
25
|
+
end
|
26
|
+
|
27
|
+
def slow_disk_error_msg
|
28
|
+
"Slow disk detected #{dir} mounted on #{name}.
|
29
|
+
Actual disk speed: #{read_speed} #{default_unit}
|
30
|
+
Expected disk speed: #{expected_io} #{default_unit}."
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def init_io_device
|
36
|
+
if externally_mounted?
|
37
|
+
IO::FileSystem
|
38
|
+
else
|
39
|
+
IO::BlockDevice
|
40
|
+
end.new(dir, name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def externally_mounted?
|
44
|
+
device_type = execute("stat -f -c %T #{dir}")
|
45
|
+
EXTERNAL_MOUNT_TYPE.include?(device_type)
|
46
|
+
end
|
47
|
+
|
48
|
+
def find_device
|
49
|
+
execute("df -h #{dir} | sed -n '2p' | awk '{print $1}'")
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_unit
|
53
|
+
Checks::DiskSpeedMinimal::DEFAULT_UNIT
|
54
|
+
end
|
55
|
+
|
56
|
+
def expected_io
|
57
|
+
Checks::DiskSpeedMinimal::EXPECTED_IO
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ForemanMaintain
|
2
|
+
module Utils
|
3
|
+
module Disk
|
4
|
+
module IO
|
5
|
+
class BlockDevice
|
6
|
+
include ForemanMaintain::Concerns::SystemHelpers
|
7
|
+
|
8
|
+
attr_accessor :dir, :unit, :read_speed, :name
|
9
|
+
|
10
|
+
def initialize(dir, name = Disk::Device.new('/var').name)
|
11
|
+
@dir = dir
|
12
|
+
@name = name
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_speed
|
16
|
+
@read_speed ||= extract_speed(hdparm)
|
17
|
+
end
|
18
|
+
|
19
|
+
def unit
|
20
|
+
@unit ||= extract_unit(hdparm)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def hdparm
|
26
|
+
@stdout ||= execute("hdparm -t #{name} | awk 'NF'")
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_unit(stdout)
|
30
|
+
stdout.split(' ').last
|
31
|
+
end
|
32
|
+
|
33
|
+
def extract_speed(stdout)
|
34
|
+
stdout.split(' ').reverse[1].to_i
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ForemanMaintain
|
2
|
+
module Utils
|
3
|
+
module Disk
|
4
|
+
module IO
|
5
|
+
class FileSystem
|
6
|
+
include ForemanMaintain::Concerns::SystemHelpers
|
7
|
+
|
8
|
+
attr_accessor :dir, :unit, :read_speed, :name
|
9
|
+
|
10
|
+
def initialize(dir, name = '')
|
11
|
+
@dir = dir
|
12
|
+
@name = name
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_speed
|
16
|
+
@read_speed ||= convert_kb_to_mb(fio)
|
17
|
+
end
|
18
|
+
|
19
|
+
def unit
|
20
|
+
@unit ||= 'MB/sec'
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# In fio command, --direct option bypass the cache page
|
26
|
+
def fio
|
27
|
+
cmd = "fio --name=job1 --rw=read --size=1g --output-format=json\
|
28
|
+
--directory=#{dir} --direct=1"
|
29
|
+
stdout = execute(cmd)
|
30
|
+
output = JSON.parse(stdout)
|
31
|
+
@fio ||= output['jobs'].first['read']['bw'].to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def convert_kb_to_mb(val)
|
35
|
+
val / 1024
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ForemanMaintain
|
2
|
+
module Utils
|
3
|
+
module Disk
|
4
|
+
class NilDevice
|
5
|
+
NULL = 'NULL'.freeze
|
6
|
+
|
7
|
+
attr_accessor :dir, :name, :unit, :read_speed
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@dir = NULL
|
11
|
+
@name = NULL
|
12
|
+
@unit = NULL
|
13
|
+
@read_speed = NULL
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'foreman_maintain/utils/disk'
|
data/lib/foreman_maintain.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
if RUBY_VERSION <= '1.8.7'
|
2
|
+
require 'rubygems'
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'json'
|
6
|
+
|
1
7
|
module ForemanMaintain
|
2
8
|
require 'foreman_maintain/concerns/logger'
|
3
9
|
require 'foreman_maintain/concerns/metadata'
|
@@ -13,6 +19,7 @@ module ForemanMaintain
|
|
13
19
|
require 'foreman_maintain/scenario'
|
14
20
|
require 'foreman_maintain/runner'
|
15
21
|
require 'foreman_maintain/reporter'
|
22
|
+
require 'foreman_maintain/utils'
|
16
23
|
|
17
24
|
class << self
|
18
25
|
attr_accessor :config
|
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.2
|
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-03-
|
11
|
+
date: 2017-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: clamp
|
@@ -98,7 +98,8 @@ description: |
|
|
98
98
|
Provides various features that helps keeping the Foreman/Satellite up and
|
99
99
|
running.
|
100
100
|
email: inecas@redhat.com
|
101
|
-
executables:
|
101
|
+
executables:
|
102
|
+
- foreman-maintain
|
102
103
|
extensions: []
|
103
104
|
extra_rdoc_files:
|
104
105
|
- LICENSE
|
@@ -107,6 +108,7 @@ files:
|
|
107
108
|
- LICENSE
|
108
109
|
- README.md
|
109
110
|
- bin/foreman-maintain
|
111
|
+
- definitions/checks/disk_speed_minimal.rb
|
110
112
|
- definitions/checks/foreman_tasks_not_paused.rb
|
111
113
|
- definitions/checks/foreman_tasks_not_running.rb
|
112
114
|
- definitions/features/downstream.rb
|
@@ -145,6 +147,13 @@ files:
|
|
145
147
|
- lib/foreman_maintain/runner/execution.rb
|
146
148
|
- lib/foreman_maintain/scenario.rb
|
147
149
|
- lib/foreman_maintain/top_level_modules.rb
|
150
|
+
- lib/foreman_maintain/utils.rb
|
151
|
+
- lib/foreman_maintain/utils/disk.rb
|
152
|
+
- lib/foreman_maintain/utils/disk/device.rb
|
153
|
+
- lib/foreman_maintain/utils/disk/io.rb
|
154
|
+
- lib/foreman_maintain/utils/disk/io/block_device.rb
|
155
|
+
- lib/foreman_maintain/utils/disk/io/file_system.rb
|
156
|
+
- lib/foreman_maintain/utils/disk/nil_device.rb
|
148
157
|
- lib/foreman_maintain/version.rb
|
149
158
|
homepage: https://github.com/theforeman/foreman_maintain
|
150
159
|
licenses:
|