fuey_client 0.6.0 → 0.7.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/fuey_client/fuey/client.rb +4 -3
- data/lib/fuey_client/fuey/inspections/inspection.rb +18 -12
- data/lib/fuey_client/fuey/inspections/ping.rb +7 -5
- data/lib/fuey_client/fuey/inspections/rfc_ping.rb +2 -5
- data/lib/fuey_client/fuey/inspections/snmp_walk.rb +2 -5
- data/lib/fuey_client/fuey/inspections/support/status.rb +33 -0
- data/lib/fuey_client/fuey/redis.rb +11 -0
- data/lib/fuey_client/fuey/reporters.rb +1 -1
- data/lib/fuey_client/fuey/reporters/error_logger.rb +2 -2
- data/lib/fuey_client/fuey/reporters/notification_queue.rb +47 -0
- data/lib/fuey_client/fuey/trace.rb +35 -37
- data/lib/fuey_client/fuey/trace_repository.rb +21 -0
- data/lib/fuey_client/version.rb +1 -1
- data/spec/fuey_client/fuey/inspections/inspection_spec.rb +8 -5
- data/spec/fuey_client/fuey/inspections/rfc_ping_spec.rb +1 -1
- data/spec/fuey_client/fuey/inspections/support/status_spec.rb +54 -0
- data/spec/fuey_client/fuey/reporters/notification_queue_spec.rb +33 -0
- data/spec/fuey_client/fuey/trace_repository_spec.rb +73 -0
- data/spec/fuey_client/fuey/trace_spec.rb +28 -71
- data/spec/matchers/inspection_shared_examples.rb +5 -5
- metadata +12 -5
- data/lib/fuey_client/fuey/reporters/redis.rb +0 -20
- data/spec/fuey_client/fuey/#trace_spec.rb# +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 495dc67e99ddd7c14963c64ab490cfb1c6852731
|
4
|
+
data.tar.gz: d3bc7df65ad943b288a1346c815ec207729fefaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33b22f4767a69e9b8960fd51143e4ae0c41fc0eabdec71ef7130322418e6fc25113009b460d9cc29356c5dfe7bf9c40b73f9462ee9c4ed3020ad401a48790ebe
|
7
|
+
data.tar.gz: 53e23f3935bf6a51b51af9f17026fa750e3c73938fb7347afa5841b59bae5193aa10c6ffc8efcf3e03bbe0eb73e91d04a442af9705f801068e6f1637e686a4d8
|
@@ -4,6 +4,7 @@ require "fuey_client/fuey/null_object"
|
|
4
4
|
require "fuey_client/fuey/trace"
|
5
5
|
require "fuey_client/fuey/inspections"
|
6
6
|
require "fuey_client/fuey/reporters"
|
7
|
+
require "fuey_client/fuey/trace_repository"
|
7
8
|
|
8
9
|
require "active_support"
|
9
10
|
|
@@ -17,12 +18,12 @@ module Fuey
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def reporter
|
20
|
-
@_reporter ||= Reporters::Redis.
|
21
|
+
@_reporter ||= Reporters::NotificationQueue.new(Fuey::Redis.instance)
|
21
22
|
end
|
22
23
|
|
23
24
|
def run
|
24
|
-
|
25
|
-
trace.
|
25
|
+
TraceRepository.new.all.each do |trace|
|
26
|
+
trace.receiver = reporter
|
26
27
|
output = trace.run
|
27
28
|
Log.write %([#{trace.name}] #{output})
|
28
29
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "observer"
|
2
2
|
require "stately"
|
3
3
|
require "fuey_client/fuey/model_initializer"
|
4
|
+
require "fuey_client/fuey/inspections/support/status"
|
4
5
|
|
5
6
|
module Fuey
|
6
7
|
module Inspections
|
@@ -13,17 +14,30 @@ module Fuey
|
|
13
14
|
stately :start => :pending, :attr => :state do
|
14
15
|
state :executed, :action => :execute do
|
15
16
|
before_transition :do => :notify
|
16
|
-
after_transition
|
17
|
-
after_transition
|
17
|
+
after_transition :do => :notify
|
18
|
+
after_transition :do => :_execute
|
18
19
|
end
|
19
20
|
state :passed, :action => :pass do
|
20
|
-
after_transition
|
21
|
+
after_transition :do => :notify
|
21
22
|
end
|
22
23
|
state :failed, :action => :fail do
|
23
|
-
after_transition
|
24
|
+
after_transition :do => :notify
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
28
|
+
def status
|
29
|
+
Support::Status.new(
|
30
|
+
:type => self.class.to_s.split('::').last,
|
31
|
+
:name => name,
|
32
|
+
:status => state,
|
33
|
+
:settings => settings, # defined in child class
|
34
|
+
:status_message => status_message # defined in child class
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def settings; end
|
39
|
+
def status_message; end
|
40
|
+
|
27
41
|
def passed?
|
28
42
|
state == 'passed'
|
29
43
|
end
|
@@ -37,14 +51,6 @@ module Fuey
|
|
37
51
|
notify_observers status
|
38
52
|
end
|
39
53
|
|
40
|
-
def status
|
41
|
-
{
|
42
|
-
:type => self.class.to_s.split('::').last,
|
43
|
-
:name => name,
|
44
|
-
:status => self.state
|
45
|
-
}
|
46
|
-
end
|
47
|
-
|
48
54
|
end
|
49
55
|
end
|
50
56
|
end
|
@@ -18,12 +18,14 @@ module Fuey
|
|
18
18
|
%(Ping #{name} #{host})
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
23
|
-
:settings => host || "",
|
24
|
-
:statusMessage => %(#{state} ping for #{host}),
|
25
|
-
}.merge(super)
|
21
|
+
def settings
|
22
|
+
host || ""
|
26
23
|
end
|
24
|
+
|
25
|
+
def status_message
|
26
|
+
%(#{state} ping for #{host})
|
27
|
+
end
|
28
|
+
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -23,11 +23,8 @@ module Fuey
|
|
23
23
|
%(RFCPing #{state} for #{ashost}.)
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
{
|
28
|
-
:settings => config.reject{|k,v| k == 'passwd'},
|
29
|
-
:statusMessage => status_message
|
30
|
-
}.merge(super)
|
26
|
+
def settings
|
27
|
+
config.reject{|k,v| k == 'passwd'}
|
31
28
|
end
|
32
29
|
|
33
30
|
def config
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "fuey_client/fuey/model_initializer"
|
2
|
+
|
3
|
+
module Fuey
|
4
|
+
module Inspections
|
5
|
+
module Support
|
6
|
+
class Status
|
7
|
+
include ModelInitializer
|
8
|
+
include Comparable
|
9
|
+
|
10
|
+
attr_accessor :type, :name, :status, :settings, :status_message
|
11
|
+
|
12
|
+
def passed?
|
13
|
+
status == 'passed'
|
14
|
+
end
|
15
|
+
|
16
|
+
def failed?
|
17
|
+
status == 'failed'
|
18
|
+
end
|
19
|
+
|
20
|
+
def attributes
|
21
|
+
[:type, :name, :status, :settings, :status_message].inject(Hash.new) do |memo, attr|
|
22
|
+
memo[attr] = self.send(attr)
|
23
|
+
memo
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def <=>(another)
|
28
|
+
attributes.hash <=> another.attributes.hash
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
require "fuey_client/fuey/reporters/
|
1
|
+
require "fuey_client/fuey/reporters/notification_queue"
|
2
2
|
require "fuey_client/fuey/reporters/error_logger"
|
@@ -4,8 +4,8 @@ module Fuey
|
|
4
4
|
module Reporters
|
5
5
|
class ErrorLogger
|
6
6
|
def update(status)
|
7
|
-
if status
|
8
|
-
Log.alert "#{status
|
7
|
+
if status.failed?
|
8
|
+
Log.alert "#{status.name} failed. #{status.status_message}"
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "json"
|
2
|
+
require "fuey_client/fuey/redis"
|
3
|
+
|
4
|
+
module Fuey
|
5
|
+
module Reporters
|
6
|
+
class NotificationQueue
|
7
|
+
def initialize(redis)
|
8
|
+
@_redis = redis
|
9
|
+
end
|
10
|
+
|
11
|
+
def update(type, *args)
|
12
|
+
self.send("publish_#{type}", args)
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def publish_update(args)
|
17
|
+
trace_name, statuses = args[0], args[1]
|
18
|
+
status = statuses.first
|
19
|
+
message = [ trace_name, status.attributes ]
|
20
|
+
@_redis.publish "fuey.trace.update", message.to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
def publish_complete(args)
|
24
|
+
trace = args.first
|
25
|
+
message = {
|
26
|
+
:time => Time.now.strftime("%Y%m%d%H%M%S"),
|
27
|
+
:name => trace.name,
|
28
|
+
:status => trace.status,
|
29
|
+
:status_message => trace.status_message,
|
30
|
+
:steps => trace.steps.map(&:status).map(&:attributes)
|
31
|
+
}
|
32
|
+
@_redis.lpush trace.name.downcase, message.to_json
|
33
|
+
end
|
34
|
+
|
35
|
+
def publish_new(args)
|
36
|
+
trace_name, statuses = args[0], args[1]
|
37
|
+
message = {
|
38
|
+
:name => trace_name,
|
39
|
+
:status => "executed",
|
40
|
+
:status_message => "",
|
41
|
+
:steps => statuses.map(&:attributes)
|
42
|
+
}
|
43
|
+
@_redis.publish "fuey.trace.new", message.to_json
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -3,36 +3,36 @@ require "fuey_client/fuey/reporters"
|
|
3
3
|
require "active_support"
|
4
4
|
require "observer"
|
5
5
|
|
6
|
-
|
7
6
|
module Fuey
|
8
7
|
class Trace
|
9
8
|
include ModelInitializer
|
10
9
|
include Observable
|
11
10
|
|
12
|
-
attr_accessor :name
|
11
|
+
attr_accessor :name
|
13
12
|
|
14
13
|
def initialize(args)
|
15
14
|
super(args)
|
16
|
-
@steps ||= Array.new
|
17
15
|
end
|
18
16
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
17
|
+
def receiver=(observer)
|
18
|
+
add_observer observer
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_step(inspection)
|
22
|
+
inspection.add_observer(self)
|
23
|
+
inspection.add_observer(error_logger)
|
24
|
+
steps.push inspection
|
25
|
+
inspection
|
26
|
+
end
|
27
|
+
|
28
|
+
def steps
|
29
|
+
@_steps ||= Array.new
|
31
30
|
end
|
32
31
|
|
33
|
-
def
|
34
|
-
|
32
|
+
def error_logger
|
33
|
+
@_error_logger ||= Fuey::Reporters::ErrorLogger.new
|
35
34
|
end
|
35
|
+
private :error_logger
|
36
36
|
|
37
37
|
def to_s
|
38
38
|
%(#{name}: [#{steps.join(', ')}])
|
@@ -41,42 +41,40 @@ module Fuey
|
|
41
41
|
# Handle updates from inpsections via observation
|
42
42
|
def update(status)
|
43
43
|
changed
|
44
|
-
notify_observers
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
44
|
+
notify_observers :update, name, [status]
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
def status
|
49
|
+
@_current ? @_current.state : "pending"
|
50
|
+
end
|
51
|
+
|
52
|
+
def status_message
|
53
|
+
@_current.failed? ? @_current.status_message : ""
|
52
54
|
end
|
53
55
|
|
54
56
|
def run
|
55
57
|
changed
|
56
|
-
notify_observers(
|
57
|
-
|
58
|
-
{
|
59
|
-
:name => name,
|
60
|
-
:status => "executed",
|
61
|
-
:statusMessage => "",
|
62
|
-
:steps => steps.map(&:status)
|
63
|
-
}
|
64
|
-
)
|
58
|
+
notify_observers :new, name, steps.map(&:status)
|
59
|
+
|
65
60
|
ActiveSupport::Notifications.instrument("run.trace", {:trace => self.to_s}) do
|
66
|
-
run, failed,
|
61
|
+
run, failed, @_current = 0, 0, nil
|
67
62
|
steps.each do |step|
|
68
63
|
run += 1
|
69
|
-
|
64
|
+
@_current = step
|
70
65
|
step.execute
|
71
66
|
if step.failed?
|
72
67
|
failed += 1
|
73
68
|
break
|
74
69
|
end
|
75
70
|
end
|
71
|
+
|
72
|
+
changed
|
73
|
+
notify_observers :complete, self
|
76
74
|
if failed == 0
|
77
75
|
%(#{name} passed. #{steps.size} steps, #{run} executed, #{failed} failed.)
|
78
76
|
else
|
79
|
-
%(#{name} failed on #{
|
77
|
+
%(#{name} failed on #{@_current.name}. #{steps.size} steps, #{run} executed, #{failed} failed.)
|
80
78
|
end
|
81
79
|
end
|
82
80
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "fuey_client/fuey/trace"
|
2
|
+
|
3
|
+
module Fuey
|
4
|
+
class TraceRepository
|
5
|
+
def all
|
6
|
+
traces ||= Config::Fuey.traces.keys.map do |trace_name|
|
7
|
+
fetch trace_name
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch(trace_name)
|
12
|
+
trace = Trace.new :name => trace_name
|
13
|
+
Config::Fuey.traces.send(trace_name).each do |step|
|
14
|
+
inspection_class = ActiveSupport::Inflector.constantize %(Fuey::Inspections::#{step.keys.first})
|
15
|
+
inspection = inspection_class.new(step.values.first)
|
16
|
+
trace.add_step inspection
|
17
|
+
end
|
18
|
+
trace
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/fuey_client/version.rb
CHANGED
@@ -29,11 +29,14 @@ describe Fuey::Inspections::Inspection do
|
|
29
29
|
def expects_notification_of(*states)
|
30
30
|
states.each do |state|
|
31
31
|
self.should_receive(:update).
|
32
|
-
with(
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
with(Fuey::Inspections::Support::Status.new(
|
33
|
+
:type => @inspection.class.to_s,
|
34
|
+
:name => @inspection.name,
|
35
|
+
:status => state,
|
36
|
+
:settings => nil,
|
37
|
+
:status_message => nil
|
38
|
+
)
|
39
|
+
)
|
37
40
|
end
|
38
41
|
end
|
39
42
|
end
|
@@ -16,7 +16,7 @@ describe Fuey::Inspections::RFCPing do
|
|
16
16
|
Given (:rfc_ping) { Fuey::Inspections::RFCPing.new config }
|
17
17
|
|
18
18
|
describe "status" do
|
19
|
-
Then { expect( rfc_ping.status
|
19
|
+
Then { expect( rfc_ping.status.settings ).to_not include('passwd') }
|
20
20
|
end
|
21
21
|
|
22
22
|
context "when the ping fails" do
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fuey::Inspections::Support::Status do
|
4
|
+
|
5
|
+
describe "attributes" do
|
6
|
+
Then { expect( subject ).to respond_to(:type) }
|
7
|
+
Then { expect( subject ).to respond_to(:name) }
|
8
|
+
Then { expect( subject ).to respond_to(:status) }
|
9
|
+
Then { expect( subject ).to respond_to(:settings) }
|
10
|
+
Then { expect( subject ).to respond_to(:status_message) }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "passed?" do
|
14
|
+
Given (:status) { Fuey::Inspections::Support::Status.new :status => 'passed' }
|
15
|
+
Then { expect( status ).to be_passed }
|
16
|
+
Then { expect( status ).to_not be_failed }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "failed?" do
|
20
|
+
Given (:status) { Fuey::Inspections::Support::Status.new :status => 'failed' }
|
21
|
+
Then { expect( status ).to_not be_passed }
|
22
|
+
Then { expect( status ).to be_failed }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "equality" do
|
26
|
+
Given (:attributes) { { :name => "Status 1", :status => "pending", :type => "Inspection" } }
|
27
|
+
|
28
|
+
context "when both have same attributes" do
|
29
|
+
Given (:status1) { Fuey::Inspections::Support::Status.new attributes.clone }
|
30
|
+
Given (:status2) { Fuey::Inspections::Support::Status.new attributes.clone }
|
31
|
+
Then { expect( status1 ).to eq( status2 ) }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when both have same values, but one has additional key with a nil value" do
|
35
|
+
Given (:status1) { Fuey::Inspections::Support::Status.new attributes.clone }
|
36
|
+
Given (:status2) { Fuey::Inspections::Support::Status.new attributes.clone.merge({:settings => nil}) }
|
37
|
+
Then { expect( status1 ).to eq( status2 ) }
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when both only have a different status" do
|
41
|
+
Given (:status1) { Fuey::Inspections::Support::Status.new attributes.clone }
|
42
|
+
Given (:status2) { Fuey::Inspections::Support::Status.new attributes.clone.merge({:status => 'failed'}) }
|
43
|
+
Then { expect( status1 ).to_not eq( status2 ) }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when both only have a different name" do
|
47
|
+
Given (:status1) { Fuey::Inspections::Support::Status.new attributes.clone }
|
48
|
+
Given (:status2) { Fuey::Inspections::Support::Status.new attributes.clone.merge({:name => 'Status X'}) }
|
49
|
+
Then { expect( status1 ).to_not eq( status2 ) }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Fuey::Reporters::NotificationQueue do
|
4
|
+
Given (:redis) { double "Redis" }
|
5
|
+
Given (:q) { Fuey::Reporters::NotificationQueue.new redis }
|
6
|
+
|
7
|
+
describe "receiving updates for new traces" do
|
8
|
+
Given (:statuses) { [create_status("Ping 1"), create_status("Ping 2")] }
|
9
|
+
Given (:json_string) { {
|
10
|
+
:name => "QA Alpha Trace",
|
11
|
+
:status => "executed",
|
12
|
+
:status_message => "",
|
13
|
+
:steps => statuses.map(&:attributes)
|
14
|
+
}.to_json }
|
15
|
+
Given { redis.should_receive(:publish).with("fuey.trace.new", json_string) }
|
16
|
+
When (:result) { q.update :new, "QA Alpha Trace", statuses }
|
17
|
+
Then { expect( result ).to be_true, "and publish to Redis" }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "receiving updates for existing traces" do
|
21
|
+
Given (:statuses) { [create_status("Ping 1")] }
|
22
|
+
Given (:json_string) {
|
23
|
+
["QA Alpha Trace", statuses.first.attributes].to_json
|
24
|
+
}
|
25
|
+
Given { redis.should_receive(:publish).with("fuey.trace.update", json_string) }
|
26
|
+
When (:result) { q.update :update, "QA Alpha Trace", statuses }
|
27
|
+
Then { expect( result ).to be_true, "and publish to Redis" }
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_status(name)
|
31
|
+
Fuey::Inspections::Support::Status.new :name => name
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fuey::TraceRepository do
|
4
|
+
after(:each) { Fuey::Config::Fuey.reload_configuration }
|
5
|
+
|
6
|
+
describe "retrieving all configured traces" do
|
7
|
+
context "when configured for no traces" do
|
8
|
+
Given { Fuey::Config::Fuey.test_with(no_traces) }
|
9
|
+
When (:result) { Fuey::TraceRepository.new.all }
|
10
|
+
Then { expect( result ).to be_empty }
|
11
|
+
end
|
12
|
+
|
13
|
+
context "when configured with one trace" do
|
14
|
+
Given { Fuey::Config::Fuey.test_with(two_pings) }
|
15
|
+
When (:result) { Fuey::TraceRepository.new.all }
|
16
|
+
Then { expect( result ).to have(1).items }
|
17
|
+
And { expect( result.first ).to be_a(Fuey::Trace) }
|
18
|
+
And { expect( result.first ).to have(2).steps }
|
19
|
+
And { expect( result.first.steps[0] ).to ping("Google").at("8.8.8.8") }
|
20
|
+
And { expect( result.first.steps[1] ).to ping("Self").at("172.0.0.1") }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
RSpec::Matchers.define :ping do |name|
|
25
|
+
match do |actual|
|
26
|
+
(actual.name == name) && (actual.host == @host)
|
27
|
+
end
|
28
|
+
|
29
|
+
chain :at do |host|
|
30
|
+
@host = host
|
31
|
+
end
|
32
|
+
|
33
|
+
failure_message_for_should do
|
34
|
+
%(should have pinged #{name} at #{@host}, but was #{actual.name} and #{actual.host})
|
35
|
+
end
|
36
|
+
|
37
|
+
failure_message_for_should_not do
|
38
|
+
%(should not have pinged #{actual.host})
|
39
|
+
end
|
40
|
+
|
41
|
+
description do
|
42
|
+
%(should ping #{name} at #{@host})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def two_pings
|
47
|
+
{
|
48
|
+
"traces" => {
|
49
|
+
"two_pings" =>
|
50
|
+
[
|
51
|
+
{
|
52
|
+
"Ping" => {
|
53
|
+
"name" => "Google",
|
54
|
+
"host" => "8.8.8.8"
|
55
|
+
}
|
56
|
+
},
|
57
|
+
{
|
58
|
+
"Ping" => {
|
59
|
+
"name" => "Self",
|
60
|
+
"host" => "172.0.0.1"
|
61
|
+
}
|
62
|
+
}
|
63
|
+
]
|
64
|
+
}
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
def no_traces
|
69
|
+
{
|
70
|
+
"traces" => {}
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
@@ -1,90 +1,47 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Fuey::Trace do
|
4
|
-
after(:each) { Fuey::Config::Fuey.reload_configuration }
|
5
|
-
|
6
|
-
describe "retrieving all configured traces" do
|
7
|
-
context "when configured for no traces" do
|
8
|
-
Given { Fuey::Config::Fuey.test_with(no_traces) }
|
9
|
-
When (:result) { Fuey::Trace.all }
|
10
|
-
Then { expect( result ).to be_empty }
|
11
|
-
end
|
12
|
-
|
13
|
-
context "when configured with one trace" do
|
14
|
-
Given { Fuey::Config::Fuey.test_with(two_pings) }
|
15
|
-
When (:result) { Fuey::Trace.all }
|
16
|
-
Then { expect( result ).to have(1).items }
|
17
|
-
And { expect( result.first ).to be_a(Fuey::Trace) }
|
18
|
-
And { expect( result.first ).to have(2).steps }
|
19
|
-
And { expect( result.first.steps[0] ).to ping("Google").at("8.8.8.8") }
|
20
|
-
And { expect( result.first.steps[1] ).to ping("Self").at("172.0.0.1") }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
4
|
describe "running a trace" do
|
25
5
|
context "when the first step fails" do
|
26
|
-
Given
|
27
|
-
Given (:
|
28
|
-
Given {
|
29
|
-
|
30
|
-
|
6
|
+
Given (:trace) { Fuey::Trace.new :name => "trace1" }
|
7
|
+
Given! (:step1) { trace.add_step failed_inspection.new :name => "step1" }
|
8
|
+
Given! (:step2) { trace.add_step successful_inspection.new :name => "step2" }
|
9
|
+
Given { step2.should_not_receive(:execute) }
|
10
|
+
When (:result) { trace.run }
|
11
|
+
Then { expect( result ).to eql(%[trace1 failed on step1. 2 steps, 1 executed, 1 failed.]) }
|
31
12
|
end
|
32
13
|
|
33
14
|
context "when all steps pass" do
|
34
|
-
Given
|
35
|
-
Given (:
|
36
|
-
|
37
|
-
|
15
|
+
Given (:trace) { Fuey::Trace.new :name => "trace1" }
|
16
|
+
Given! (:step1) { trace.add_step successful_inspection.new :name => "step1" }
|
17
|
+
Given! (:step2) { trace.add_step successful_inspection.new :name => "step2" }
|
18
|
+
When (:result){ trace.run }
|
19
|
+
Then { expect( result ).to eql(%[trace1 passed. 2 steps, 2 executed, 0 failed.]) }
|
38
20
|
end
|
39
21
|
end
|
40
22
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
chain :at do |host|
|
47
|
-
@host = host
|
48
|
-
end
|
23
|
+
def successful_inspection
|
24
|
+
Class.new(Fuey::Inspections::Inspection) do
|
25
|
+
def _execute
|
26
|
+
self.pass
|
27
|
+
end
|
49
28
|
|
50
|
-
|
51
|
-
|
29
|
+
def add_observer(observer)
|
30
|
+
# dont observe
|
31
|
+
end
|
52
32
|
end
|
33
|
+
end
|
53
34
|
|
54
|
-
|
55
|
-
|
56
|
-
|
35
|
+
def failed_inspection
|
36
|
+
Class.new(Fuey::Inspections::Inspection) do
|
37
|
+
def _execute
|
38
|
+
self.fail
|
39
|
+
end
|
57
40
|
|
58
|
-
|
59
|
-
|
41
|
+
def add_observer(observer)
|
42
|
+
# dont observe
|
43
|
+
end
|
60
44
|
end
|
61
45
|
end
|
62
46
|
|
63
|
-
def two_pings
|
64
|
-
{
|
65
|
-
"traces" => {
|
66
|
-
"two_pings" =>
|
67
|
-
[
|
68
|
-
{
|
69
|
-
"Ping" => {
|
70
|
-
"name" => "Google",
|
71
|
-
"host" => "8.8.8.8"
|
72
|
-
}
|
73
|
-
},
|
74
|
-
{
|
75
|
-
"Ping" => {
|
76
|
-
"name" => "Self",
|
77
|
-
"host" => "172.0.0.1"
|
78
|
-
}
|
79
|
-
}
|
80
|
-
]
|
81
|
-
}
|
82
|
-
}
|
83
|
-
end
|
84
|
-
|
85
|
-
def no_traces
|
86
|
-
{
|
87
|
-
"traces" => {}
|
88
|
-
}
|
89
|
-
end
|
90
47
|
end
|
@@ -17,11 +17,11 @@ shared_examples "an inspection" do
|
|
17
17
|
|
18
18
|
describe "and have specific pieces of information" do
|
19
19
|
When (:status) { described_class.new({:name => 'descriptive'}).status }
|
20
|
-
Then { expect( status
|
21
|
-
And { expect( status
|
22
|
-
And { expect( status
|
23
|
-
And { expect( status
|
24
|
-
And { expect( status
|
20
|
+
Then { expect( status.type ).to eql(described_class.to_s.split('::').last) }
|
21
|
+
And { expect( status.name ).to eql('descriptive') }
|
22
|
+
And { expect( status.settings ).to_not be_nil }
|
23
|
+
And { expect( status.status ).to eql("pending") }
|
24
|
+
And { expect( status.status_message ).to_not be_nil }
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fuey_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Snyder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: configurethis
|
@@ -141,20 +141,25 @@ files:
|
|
141
141
|
- lib/fuey_client/fuey/inspections/snmp_walk.rb
|
142
142
|
- lib/fuey_client/fuey/inspections/support/sap.rb
|
143
143
|
- lib/fuey_client/fuey/inspections/support/shell_command.rb
|
144
|
+
- lib/fuey_client/fuey/inspections/support/status.rb
|
144
145
|
- lib/fuey_client/fuey/log.rb
|
145
146
|
- lib/fuey_client/fuey/model_initializer.rb
|
146
147
|
- lib/fuey_client/fuey/null_object.rb
|
148
|
+
- lib/fuey_client/fuey/redis.rb
|
147
149
|
- lib/fuey_client/fuey/reporters.rb
|
148
150
|
- lib/fuey_client/fuey/reporters/error_logger.rb
|
149
|
-
- lib/fuey_client/fuey/reporters/
|
151
|
+
- lib/fuey_client/fuey/reporters/notification_queue.rb
|
150
152
|
- lib/fuey_client/fuey/trace.rb
|
153
|
+
- lib/fuey_client/fuey/trace_repository.rb
|
151
154
|
- lib/fuey_client/version.rb
|
152
|
-
- spec/fuey_client/fuey/#trace_spec.rb#
|
153
155
|
- spec/fuey_client/fuey/client_spec.rb
|
154
156
|
- spec/fuey_client/fuey/inspections/inspection_spec.rb
|
155
157
|
- spec/fuey_client/fuey/inspections/ping_spec.rb
|
156
158
|
- spec/fuey_client/fuey/inspections/rfc_ping_spec.rb
|
157
159
|
- spec/fuey_client/fuey/inspections/snmpwalk_spec.rb
|
160
|
+
- spec/fuey_client/fuey/inspections/support/status_spec.rb
|
161
|
+
- spec/fuey_client/fuey/reporters/notification_queue_spec.rb
|
162
|
+
- spec/fuey_client/fuey/trace_repository_spec.rb
|
158
163
|
- spec/fuey_client/fuey/trace_spec.rb
|
159
164
|
- spec/matchers/inspection_shared_examples.rb
|
160
165
|
- spec/matchers/pass_fail.rb
|
@@ -187,12 +192,14 @@ specification_version: 4
|
|
187
192
|
summary: Client for inspecting server state and reports it back to Fuey. Requires
|
188
193
|
the Fuey web app to have any value.
|
189
194
|
test_files:
|
190
|
-
- spec/fuey_client/fuey/#trace_spec.rb#
|
191
195
|
- spec/fuey_client/fuey/client_spec.rb
|
192
196
|
- spec/fuey_client/fuey/inspections/inspection_spec.rb
|
193
197
|
- spec/fuey_client/fuey/inspections/ping_spec.rb
|
194
198
|
- spec/fuey_client/fuey/inspections/rfc_ping_spec.rb
|
195
199
|
- spec/fuey_client/fuey/inspections/snmpwalk_spec.rb
|
200
|
+
- spec/fuey_client/fuey/inspections/support/status_spec.rb
|
201
|
+
- spec/fuey_client/fuey/reporters/notification_queue_spec.rb
|
202
|
+
- spec/fuey_client/fuey/trace_repository_spec.rb
|
196
203
|
- spec/fuey_client/fuey/trace_spec.rb
|
197
204
|
- spec/matchers/inspection_shared_examples.rb
|
198
205
|
- spec/matchers/pass_fail.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require "redis"
|
2
|
-
require "json"
|
3
|
-
|
4
|
-
module Fuey
|
5
|
-
module Reporters
|
6
|
-
class Redis
|
7
|
-
def redis
|
8
|
-
@@redis ||= ::Redis.new(
|
9
|
-
:host => Config::Redis.host,
|
10
|
-
:port => Config::Redis.port )
|
11
|
-
end
|
12
|
-
private :redis
|
13
|
-
|
14
|
-
# Handles update from observable
|
15
|
-
def update(channel, message)
|
16
|
-
redis.publish channel, message.to_json
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Fuey::Trace do
|
4
|
-
after(:each) { Fuey::Config.reload_configuration }
|
5
|
-
|
6
|
-
describe "retrieving all configured traces" do
|
7
|
-
context "when configured for no traces" do
|
8
|
-
Given { Fuey::Config.test_with(no_traces) }
|
9
|
-
When (:result) { Fuey::Trace.all }
|
10
|
-
Then { expect( result ).to be_empty }
|
11
|
-
end
|
12
|
-
|
13
|
-
context "when configured with one trace" do
|
14
|
-
Given { Fuey::Config.test_with(two_pings) }
|
15
|
-
When (:result) { Fuey::Trace.all }
|
16
|
-
Then { expect( result ).to have(1).items }
|
17
|
-
And { expect( result.first ).to be_a(Fuey::Trace) }
|
18
|
-
And { expect( result.first ).to have(2).steps }
|
19
|
-
And { expect( result.first.steps[0] ).to ping("Google").at("8.8.8.8") }
|
20
|
-
And { expect( result.first.steps[1] ).to ping("Self").at("172.0.0.1") }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "running a trace" do
|
25
|
-
context "when the first step fails" do
|
26
|
-
Given (:step1) { double(Fuey::Inspections::Ping, :name => "step1", :execute => false) }
|
27
|
-
Given (:step2) { double(Fuey::Inspections::Ping) }
|
28
|
-
Given { step2.should_not_receive(:execute) }
|
29
|
-
When (:result) { Fuey::Trace.new(:name => "trace1", :steps => [step1, step2]).run }
|
30
|
-
Then { expect( result ).to eql(%[trace1 failed on step1. 2 steps, 1 executed, 1 failed.]) }
|
31
|
-
end
|
32
|
-
|
33
|
-
context "when all steps pass" do
|
34
|
-
Given (:step1) { double(Fuey::Inspections::Ping, :name => "step1", :execute => true) }
|
35
|
-
Given (:step2) { double(Fuey::Inspections::Ping, :name => "step2", :execute => true) }
|
36
|
-
When (:result) { Fuey::Trace.new(:name => "trace1", :steps => [step1, step2]).run }
|
37
|
-
Then { expect( result ).to eql(%[trace1 passed. 2 steps, 2 executed, 0 failed.]) }
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
RSpec::Matchers.define :ping do |name|
|
42
|
-
match do |actual|
|
43
|
-
(actual.name == name) && (actual.host == @host)
|
44
|
-
end
|
45
|
-
|
46
|
-
chain :at do |host|
|
47
|
-
@host = host
|
48
|
-
end
|
49
|
-
|
50
|
-
failure_message_for_should do
|
51
|
-
%(should have pinged #{name} at #{@host}, but was #{actual.name} and #{actual.host})
|
52
|
-
end
|
53
|
-
|
54
|
-
failure_message_for_should_not do
|
55
|
-
%(should not have pinged #{actual.host})
|
56
|
-
end
|
57
|
-
|
58
|
-
description do
|
59
|
-
%(should ping #{name} at #{@host})
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def two_pings
|
64
|
-
{
|
65
|
-
"traces" => {
|
66
|
-
"two_pings" =>
|
67
|
-
[
|
68
|
-
{
|
69
|
-
"Ping" => {
|
70
|
-
"name" => "Google",
|
71
|
-
"host" => "8.8.8.8"
|
72
|
-
}
|
73
|
-
},
|
74
|
-
{
|
75
|
-
"Ping" => {
|
76
|
-
"name" => "Self",
|
77
|
-
"host" => "172.0.0.1"
|
78
|
-
}
|
79
|
-
}
|
80
|
-
]
|
81
|
-
}
|
82
|
-
}
|
83
|
-
end
|
84
|
-
|
85
|
-
def no_traces
|
86
|
-
{
|
87
|
-
"traces" => {}
|
88
|
-
}
|
89
|
-
end
|
90
|
-
end
|