nagios-promoo 0.0.6 → 0.1.0
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/lib/nagios/promoo.rb +4 -1
- data/lib/nagios/promoo/occi/probes/categories_probe.rb +18 -4
- data/lib/nagios/promoo/occi/probes/compute_probe.rb +103 -61
- data/lib/nagios/promoo/occi/probes/kinds_probe.rb +18 -4
- data/lib/nagios/promoo/occi/version.rb +1 -1
- data/lib/nagios/promoo/version.rb +1 -1
- data/nagios-promoo.gemspec +2 -3
- metadata +9 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1787169d8cb255b046e890de4ff5916b6d43a548
|
4
|
+
data.tar.gz: 402a454be9941e1133c7ee3c65bbb973ab27623e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fb8f36c9fa1f65a67c4360f2f50d6bf5efc956368ac55cc96d9802b7efa9496524236bbc496df393aab30ad1fa795a7291aca3cff15e1be172d456d7274b265
|
7
|
+
data.tar.gz: 5ed803935e772f15a3ea1e4da16d96c3d960ac286dd0b5c05e706b60f0e7437f7fda00fc6341bd8d43c56e1810a8010690930dd90206c90e8f8267f936634204
|
data/lib/nagios/promoo.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# Global deps
|
2
2
|
require 'thor'
|
3
3
|
require 'timeout'
|
4
|
+
require 'ox'
|
4
5
|
require 'multi_xml'
|
5
|
-
require 'multi_json'
|
6
6
|
require 'httparty'
|
7
7
|
|
8
|
+
# Force multi_xml to use ox
|
9
|
+
MultiXml.parser = :ox
|
10
|
+
|
8
11
|
# Define modules
|
9
12
|
module Nagios; end
|
10
13
|
module Nagios::Promoo; end
|
@@ -11,7 +11,8 @@ class Nagios::Promoo::Occi::Probes::CategoriesProbe < Nagios::Promoo::Occi::Prob
|
|
11
11
|
|
12
12
|
def options
|
13
13
|
[
|
14
|
-
[:optional, { type: :array, default: [], desc: 'Identifiers of optional categories (optional by force)' }]
|
14
|
+
[:optional, { type: :array, default: [], desc: 'Identifiers of optional categories (optional by force)' }],
|
15
|
+
[:check_location, { type: :boolean, default: false, desc: 'Verify declared REST locations for INFRA resources' }],
|
15
16
|
]
|
16
17
|
end
|
17
18
|
|
@@ -27,9 +28,22 @@ class Nagios::Promoo::Occi::Probes::CategoriesProbe < Nagios::Promoo::Occi::Prob
|
|
27
28
|
categories -= options[:optional] if options[:optional]
|
28
29
|
|
29
30
|
begin
|
30
|
-
Timeout::timeout(options[:timeout])
|
31
|
-
categories.each
|
32
|
-
|
31
|
+
Timeout::timeout(options[:timeout]) do
|
32
|
+
categories.each do |cat|
|
33
|
+
fail "#{cat.inspect} is missing" unless client(options).model.get_by_id(cat, true)
|
34
|
+
next unless options[:check_location] && Nagios::Promoo::Occi::Probes::KindsProbe::INFRA_KINDS.include?(cat)
|
35
|
+
|
36
|
+
# Make sure declared locations are actually available as REST
|
37
|
+
# endpoints. Failure will raise an exception, no need to do
|
38
|
+
# anything here. To keep requirements reasonable, only INFRA
|
39
|
+
# kinds are considered relevant for this part of the check.
|
40
|
+
begin
|
41
|
+
client(options).list(cat)
|
42
|
+
rescue => err
|
43
|
+
fail "Failed to verify declared REST location for #{cat.inspect} (#{err.message})"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
33
47
|
rescue => ex
|
34
48
|
puts "CATEGORIES CRITICAL - #{ex.message}"
|
35
49
|
puts ex.backtrace if options[:debug]
|
@@ -10,9 +10,8 @@ class Nagios::Promoo::Occi::Probes::ComputeProbe < Nagios::Promoo::Occi::Probes:
|
|
10
10
|
def options
|
11
11
|
[
|
12
12
|
[:mpuri, { type: :string, required: true, desc: 'AppDB MPURI referencing a virtual appliance' }],
|
13
|
+
[:with_storage, { type: :boolean, default: false, desc: 'Run test attaching a storage instance to compute instance' }],
|
13
14
|
[:cache_expiration, { type: :numeric, default: 7200, desc: 'AppDB cache expiration (in seconds)' }],
|
14
|
-
[:compute_timeout, { type: :numeric, default: 359, desc: 'Timeout for compute instantiation (in seconds)' }],
|
15
|
-
[:appdb_timeout, { type: :numeric, default: 359, desc: 'Timeout for AppDB queries (in seconds)' }],
|
16
15
|
[:cleanup, { type: :boolean, default: true, desc: 'Perform clean-up before launching a new instance' }],
|
17
16
|
]
|
18
17
|
end
|
@@ -24,53 +23,97 @@ class Nagios::Promoo::Occi::Probes::ComputeProbe < Nagios::Promoo::Occi::Probes:
|
|
24
23
|
def runnable?; true; end
|
25
24
|
end
|
26
25
|
|
26
|
+
READY_STATES = %w(active online).freeze
|
27
|
+
NONREADY_STATES = %w(inactive offline).freeze
|
28
|
+
ERROR_STATES = %w(error).freeze
|
29
|
+
|
27
30
|
CPU_SUM_WEIGHT = 1000
|
28
31
|
COMPUTE_NAME_PREFIX = "sam-nagios-promoo"
|
32
|
+
DEFAULT_STORAGE_SIZE = 1 # GB
|
29
33
|
APPDB_PROXY_URL = 'https://appdb.egi.eu/api/proxy'
|
30
34
|
APPDB_REQUEST_FORM = 'version=1.0&resource=broker&data=%3Cappdb%3Abroker%20xmlns%3Axs%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%22%20xmlns%3Axsi%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance%22%20xmlns%3Aappdb%3D%22http%3A%2F%2Fappdb.egi.eu%2Fapi%2F1.0%2Fappdb%22%3E%3Cappdb%3Arequest%20id%3D%22vaproviders%22%20method%3D%22GET%22%20resource%3D%22va_providers%22%3E%3Cappdb%3Aparam%20name%3D%22listmode%22%3Edetails%3C%2Fappdb%3Aparam%3E%3C%2Fappdb%3Arequest%3E%3C%2Fappdb%3Abroker%3E'
|
31
35
|
|
32
36
|
def run(options, args = [])
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
puts "COMPUTE OK - Instance #{link.inspect} created & cleaned up"
|
37
|
+
links = begin
|
38
|
+
Timeout::timeout(options[:timeout]) { compute_provision(options) }
|
39
|
+
rescue Timeout::Error => ex
|
40
|
+
puts "COMPUTE CRITICAL - Probe execution timed out [#{options[:timeout]}s]"
|
41
|
+
exit 2
|
42
|
+
end
|
43
|
+
|
44
|
+
puts "COMPUTE OK - Instance(s) #{links[:compute].inspect} created & cleaned up"
|
44
45
|
end
|
45
46
|
|
46
47
|
private
|
47
48
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
puts ex.backtrace if options[:debug]
|
64
|
-
exit 2
|
65
|
-
ensure
|
66
|
-
begin
|
67
|
-
client(options).delete(link) unless link.blank?
|
68
|
-
rescue => ex
|
69
|
-
## ignoring
|
70
|
-
end
|
49
|
+
def compute_provision(options)
|
50
|
+
links = {}
|
51
|
+
|
52
|
+
compute_link = compute_create(options)
|
53
|
+
links[:compute] = compute_link
|
54
|
+
wait4ready(compute_link, options)
|
55
|
+
|
56
|
+
if options[:with_storage]
|
57
|
+
storage_link = storage_create(options)
|
58
|
+
links[:storage] = storage_link
|
59
|
+
wait4ready(storage_link, options)
|
60
|
+
|
61
|
+
slink = link_instances(compute_link, storage_link, options)
|
62
|
+
links[:storagelink] = slink
|
63
|
+
wait4ready(slink, options)
|
71
64
|
end
|
72
65
|
|
73
|
-
|
66
|
+
links
|
67
|
+
rescue => ex
|
68
|
+
puts "COMPUTE CRITICAL - #{ex.message}"
|
69
|
+
puts ex.backtrace if options[:debug]
|
70
|
+
exit 2
|
71
|
+
ensure
|
72
|
+
mandatory_cleanup links, options
|
73
|
+
end
|
74
|
+
|
75
|
+
def compute_create(options)
|
76
|
+
client(options).delete('compute') if options[:cleanup]
|
77
|
+
|
78
|
+
compute = client(options).get_resource('compute')
|
79
|
+
compute.title = compute.hostname = "#{COMPUTE_NAME_PREFIX}-#{Time.now.to_i}"
|
80
|
+
|
81
|
+
os_tpl, resource_tpl = appdb_information(options)
|
82
|
+
compute.mixins << get_mixin(os_tpl, 'os_tpl', options)
|
83
|
+
compute.mixins << get_mixin(resource_tpl, 'resource_tpl', options)
|
84
|
+
|
85
|
+
client(options).create compute
|
86
|
+
end
|
87
|
+
|
88
|
+
def storage_create(options)
|
89
|
+
client(options).delete('storage') if options[:cleanup]
|
90
|
+
|
91
|
+
storage = client(options).get_resource('storage')
|
92
|
+
storage.title = "#{COMPUTE_NAME_PREFIX}-block-#{Time.now.to_i}"
|
93
|
+
storage.size = DEFAULT_STORAGE_SIZE # GB
|
94
|
+
|
95
|
+
client(options).create storage
|
96
|
+
end
|
97
|
+
|
98
|
+
def link_instances(compute_link, storage_link, options)
|
99
|
+
slink = client(options).get_link('storagelink')
|
100
|
+
slink.source = compute_link
|
101
|
+
slink.target = storage_link
|
102
|
+
|
103
|
+
client(options).create slink
|
104
|
+
end
|
105
|
+
|
106
|
+
def mandatory_cleanup(links, options)
|
107
|
+
mandatory_cleanup_part links[:storagelink], true, options
|
108
|
+
mandatory_cleanup_part links[:storage], false, options
|
109
|
+
mandatory_cleanup_part links[:compute], false, options
|
110
|
+
end
|
111
|
+
|
112
|
+
def mandatory_cleanup_part(link, wait4inactive, options)
|
113
|
+
client(options).delete link
|
114
|
+
wait4inactive(link, options) if wait4inactive
|
115
|
+
rescue => ex
|
116
|
+
# ignore
|
74
117
|
end
|
75
118
|
|
76
119
|
def get_mixin(term, type, options)
|
@@ -79,35 +122,34 @@ class Nagios::Promoo::Occi::Probes::ComputeProbe < Nagios::Promoo::Occi::Probes:
|
|
79
122
|
mxn
|
80
123
|
end
|
81
124
|
|
82
|
-
def
|
83
|
-
state =
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
fail 'Failed to deploy an instance (resulting OCCI state was "error")' if state == 'error'
|
90
|
-
sleep 5
|
91
|
-
end
|
92
|
-
}
|
93
|
-
rescue Timeout::Error => ex
|
94
|
-
puts "COMPUTE WARNING - Execution timed out while waiting for the instance to become active [#{options[:compute_timeout]}s]"
|
95
|
-
exit 1
|
125
|
+
def wait4ready(link, options)
|
126
|
+
state = nil
|
127
|
+
|
128
|
+
while !READY_STATES.include?(state) do
|
129
|
+
state = client(options).describe(link).first.state
|
130
|
+
fail "Provisioning failure on #{link.inspect}" if ERROR_STATES.include?(state)
|
131
|
+
sleep 5
|
96
132
|
end
|
97
133
|
end
|
98
134
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
puts ex.backtrace if options[:debug]
|
107
|
-
exit 3
|
135
|
+
def wait4inactive(link, options)
|
136
|
+
state = nil
|
137
|
+
|
138
|
+
while !NONREADY_STATES.include?(state) do
|
139
|
+
state = client(options).describe(link).first.state
|
140
|
+
fail "De-provisioning failure on #{link.inspect}" if ERROR_STATES.include?(state)
|
141
|
+
sleep 5
|
108
142
|
end
|
109
143
|
end
|
110
144
|
|
145
|
+
def appdb_information(options)
|
146
|
+
[appdb_appliance(options), appdb_smallest_size(options)]
|
147
|
+
rescue => ex
|
148
|
+
puts "COMPUTE UNKNOWN - #{ex.message}"
|
149
|
+
puts ex.backtrace if options[:debug]
|
150
|
+
exit 3
|
151
|
+
end
|
152
|
+
|
111
153
|
def appdb_appliance(options)
|
112
154
|
appliance = nil
|
113
155
|
appliance = [appdb_provider(options)['provider:image']].flatten.compact.select do |image|
|
@@ -138,7 +180,7 @@ class Nagios::Promoo::Occi::Probes::ComputeProbe < Nagios::Promoo::Occi::Probes:
|
|
138
180
|
|
139
181
|
parsed_response = cache_fetch('appdb-sites', options[:cache_expiration]) do
|
140
182
|
response = HTTParty.post(APPDB_PROXY_URL, { :body => APPDB_REQUEST_FORM })
|
141
|
-
fail "Could not get appliance"\
|
183
|
+
fail "Could not get appliance "\
|
142
184
|
"details from AppDB [#{response.code}]" unless response.success?
|
143
185
|
response.parsed_response
|
144
186
|
end
|
@@ -10,7 +10,8 @@ class Nagios::Promoo::Occi::Probes::KindsProbe < Nagios::Promoo::Occi::Probes::B
|
|
10
10
|
def options
|
11
11
|
[
|
12
12
|
[:kinds, { type: :string, enum: %w(core infra all), default: 'all', desc: 'Collection of mandatory kinds to check' }],
|
13
|
-
[:optional, { type: :array, default: [], desc: 'Identifiers of optional kinds (optional by force)' }]
|
13
|
+
[:optional, { type: :array, default: [], desc: 'Identifiers of optional kinds (optional by force)' }],
|
14
|
+
[:check_location, { type: :boolean, default: false, desc: 'Verify declared REST locations for INFRA resources' }],
|
14
15
|
]
|
15
16
|
end
|
16
17
|
|
@@ -42,9 +43,22 @@ class Nagios::Promoo::Occi::Probes::KindsProbe < Nagios::Promoo::Occi::Probes::B
|
|
42
43
|
kinds -= options[:optional] if options[:optional]
|
43
44
|
|
44
45
|
begin
|
45
|
-
Timeout::timeout(options[:timeout])
|
46
|
-
kinds.each
|
47
|
-
|
46
|
+
Timeout::timeout(options[:timeout]) do
|
47
|
+
kinds.each do |kind|
|
48
|
+
fail "#{kind.inspect} is missing" unless client(options).model.get_by_id(kind, true)
|
49
|
+
next unless options[:check_location] && INFRA_KINDS.include?(kind)
|
50
|
+
|
51
|
+
# Make sure declared locations are actually available as REST
|
52
|
+
# endpoints. Failure will raise an exception, no need to do
|
53
|
+
# anything here. To keep requirements reasonable, only INFRA
|
54
|
+
# kinds are considered relevant for this part of the check.
|
55
|
+
begin
|
56
|
+
client(options).list(kind)
|
57
|
+
rescue => err
|
58
|
+
fail "Failed to verify declared REST location for #{kind.inspect} (#{err.message})"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
48
62
|
rescue => ex
|
49
63
|
puts "KINDS CRITICAL - #{ex.message}"
|
50
64
|
puts ex.backtrace if options[:debug]
|
data/nagios-promoo.gemspec
CHANGED
@@ -18,14 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_runtime_dependency 'occi-api', '~> 4.3'
|
21
|
+
spec.add_runtime_dependency 'occi-api', '~> 4.3', '>= 4.3.7'
|
22
22
|
spec.add_runtime_dependency 'opennebula', '~> 4.14'
|
23
23
|
spec.add_runtime_dependency 'thor'
|
24
24
|
spec.add_runtime_dependency 'yell'
|
25
25
|
spec.add_runtime_dependency 'activesupport'
|
26
26
|
spec.add_runtime_dependency 'httparty'
|
27
|
-
spec.add_runtime_dependency '
|
28
|
-
spec.add_runtime_dependency 'multi_json'
|
27
|
+
spec.add_runtime_dependency 'ox'
|
29
28
|
|
30
29
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
31
30
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nagios-promoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boris Parak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: occi-api
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.3'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 4.3.7
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,6 +27,9 @@ dependencies:
|
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '4.3'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 4.3.7
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: opennebula
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,21 +101,7 @@ dependencies:
|
|
95
101
|
- !ruby/object:Gem::Version
|
96
102
|
version: '0'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: multi_json
|
104
|
+
name: ox
|
113
105
|
requirement: !ruby/object:Gem::Requirement
|
114
106
|
requirements:
|
115
107
|
- - ">="
|