flapjack 0.5.5 → 0.6.23
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/.rbenv-version +1 -0
- data/.rspec +10 -0
- data/Gemfile +18 -0
- data/Guardfile +14 -0
- data/README.md +152 -173
- data/Rakefile +53 -150
- data/bin/flapjack +72 -0
- data/bin/flapjack-nagios-receiver +111 -0
- data/bin/flapjack-nagios-receiver-control +15 -0
- data/bin/flapjack-netsaint-parser +0 -2
- data/bin/flapjack-populator +133 -16
- data/bin/install-flapjack-systemwide +2 -2
- data/config.ru +11 -0
- data/dist/etc/init.d/flapjack +46 -0
- data/dist/etc/init.d/flapjack-nagios-receiver +36 -0
- data/doc/GLOSSARY.md +19 -0
- data/etc/flapjack_config.yaml.example +90 -0
- data/features/events.feature +132 -0
- data/features/notifications.feature +57 -0
- data/features/packaging-lintian.feature +5 -3
- data/features/steps/events_steps.rb +164 -0
- data/features/steps/flapjack-importer_steps.rb +2 -5
- data/features/steps/flapjack-worker_steps.rb +13 -6
- data/features/steps/notifications_steps.rb +178 -0
- data/features/steps/packaging-lintian_steps.rb +14 -0
- data/features/steps/time_travel_steps.rb +34 -0
- data/features/support/env.rb +63 -36
- data/flapjack.gemspec +35 -186
- data/lib/flapjack.rb +2 -0
- data/lib/flapjack/api.rb +274 -0
- data/lib/flapjack/api/entity_check_presenter.rb +184 -0
- data/lib/flapjack/api/entity_presenter.rb +66 -0
- data/lib/flapjack/cli/worker_manager.rb +1 -2
- data/lib/flapjack/configuration.rb +11 -0
- data/lib/flapjack/coordinator.rb +288 -0
- data/lib/flapjack/daemonizing.rb +186 -0
- data/lib/flapjack/data/contact.rb +45 -0
- data/lib/flapjack/data/entity.rb +89 -0
- data/lib/flapjack/data/entity_check.rb +396 -0
- data/lib/flapjack/data/event.rb +144 -0
- data/lib/flapjack/data/notification.rb +13 -0
- data/lib/flapjack/executive.rb +289 -0
- data/lib/flapjack/filters/acknowledgement.rb +39 -0
- data/lib/flapjack/filters/{any_parents_failed.rb → base.rb} +6 -4
- data/lib/flapjack/filters/delays.rb +53 -0
- data/lib/flapjack/filters/detect_mass_client_failures.rb +44 -0
- data/lib/flapjack/filters/ok.rb +25 -5
- data/lib/flapjack/filters/scheduled_maintenance.rb +17 -0
- data/lib/flapjack/filters/unscheduled_maintenance.rb +17 -0
- data/lib/flapjack/jabber.rb +294 -0
- data/lib/flapjack/notification/common.rb +23 -0
- data/lib/flapjack/notification/email.rb +107 -0
- data/lib/flapjack/notification/email/alert.html.haml +48 -0
- data/lib/flapjack/notification/email/alert.text.erb +14 -0
- data/lib/flapjack/notification/sms.rb +42 -0
- data/lib/flapjack/notification/sms/messagenet.rb +49 -0
- data/lib/flapjack/notifier_engine.rb +4 -4
- data/lib/flapjack/notifiers/mailer/mailer.rb +6 -7
- data/lib/flapjack/notifiers/xmpp/xmpp.rb +12 -12
- data/lib/flapjack/pagerduty.rb +230 -0
- data/lib/flapjack/patches.rb +108 -19
- data/lib/flapjack/persistence/data_mapper/models/check.rb +5 -3
- data/lib/flapjack/persistence/data_mapper/models/check_template.rb +2 -0
- data/lib/flapjack/persistence/data_mapper/models/event.rb +2 -0
- data/lib/flapjack/persistence/data_mapper/models/node.rb +3 -1
- data/lib/flapjack/persistence/data_mapper/models/related_check.rb +3 -1
- data/lib/flapjack/pikelet.rb +56 -0
- data/lib/flapjack/transports/beanstalkd.rb +1 -1
- data/lib/flapjack/transports/result.rb +6 -6
- data/lib/flapjack/utility.rb +46 -0
- data/lib/flapjack/version.rb +5 -0
- data/lib/flapjack/web.rb +198 -0
- data/lib/flapjack/web/views/acknowledge.haml +55 -0
- data/lib/flapjack/web/views/check.haml +162 -0
- data/lib/flapjack/web/views/index.haml +92 -0
- data/lib/flapjack/web/views/self_stats.haml +56 -0
- data/lib/flapjack/{applications/worker.rb → worker/application.rb} +0 -0
- data/lib/flapjack/worker/cli.rb +49 -0
- data/{spec → spec.old}/check_sandbox/echo +0 -0
- data/{spec → spec.old}/check_sandbox/sandboxed_check +0 -0
- data/{spec → spec.old}/configs/flapjack-notifier-couchdb.ini +0 -0
- data/{spec → spec.old}/configs/flapjack-notifier.ini +0 -0
- data/{spec → spec.old}/configs/recipients.ini +0 -0
- data/{spec → spec.old}/helpers.rb +0 -0
- data/{spec → spec.old}/inifile_spec.rb +0 -0
- data/{spec → spec.old}/mock-notifiers/mock/init.rb +0 -0
- data/{spec → spec.old}/mock-notifiers/mock/mock.rb +0 -0
- data/{spec → spec.old}/notifier-directories/spoons/testmailer/init.rb +0 -0
- data/{spec → spec.old}/notifier_application_spec.rb +0 -0
- data/{spec → spec.old}/notifier_filters_spec.rb +0 -0
- data/{spec → spec.old}/notifier_options_multiplexer_spec.rb +0 -0
- data/{spec → spec.old}/notifier_options_spec.rb +0 -0
- data/{spec → spec.old}/notifier_spec.rb +0 -0
- data/{spec → spec.old}/notifiers/mailer_spec.rb +0 -0
- data/{spec → spec.old}/notifiers/xmpp_spec.rb +0 -0
- data/{spec → spec.old}/persistence/datamapper_spec.rb +0 -0
- data/{spec → spec.old}/persistence/mock_persistence_backend.rb +0 -0
- data/{spec → spec.old}/simple.ini +0 -0
- data/{spec → spec.old}/spec.opts +0 -0
- data/{spec → spec.old}/test-filters/blocker.rb +0 -0
- data/{spec → spec.old}/test-filters/mock.rb +0 -0
- data/{spec → spec.old}/transports/beanstalkd_spec.rb +0 -0
- data/{spec → spec.old}/transports/mock_transport.rb +0 -0
- data/{spec → spec.old}/worker_application_spec.rb +0 -0
- data/{spec → spec.old}/worker_options_spec.rb +0 -0
- data/spec/lib/flapjack/api/entity_check_presenter_spec.rb +117 -0
- data/spec/lib/flapjack/api/entity_presenter_spec.rb +92 -0
- data/spec/lib/flapjack/api_spec.rb +170 -0
- data/spec/lib/flapjack/coordinator_spec.rb +16 -0
- data/spec/lib/flapjack/data/entity_check_spec.rb +398 -0
- data/spec/lib/flapjack/data/entity_spec.rb +71 -0
- data/spec/lib/flapjack/data/event_spec.rb +6 -0
- data/spec/lib/flapjack/executive_spec.rb +59 -0
- data/spec/lib/flapjack/filters/acknowledgement_spec.rb +6 -0
- data/spec/lib/flapjack/filters/delays_spec.rb +6 -0
- data/spec/lib/flapjack/filters/detect_mass_client_failures_spec.rb +6 -0
- data/spec/lib/flapjack/filters/ok_spec.rb +6 -0
- data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +6 -0
- data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +6 -0
- data/spec/lib/flapjack/jabber_spec.rb +150 -0
- data/spec/lib/flapjack/notification/email_spec.rb +6 -0
- data/spec/lib/flapjack/notification/sms_spec.rb +6 -0
- data/spec/lib/flapjack/pikelet_spec.rb +28 -0
- data/spec/lib/flapjack/web_spec.rb +188 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/profile_all_formatter.rb +44 -0
- data/spec/support/uncolored_doc_formatter.rb +9 -0
- data/tasks/events.rake +85 -0
- data/tmp/acknowledge.rb +14 -0
- data/tmp/create_config_yaml.rb +16 -0
- data/tmp/create_events_failure.rb +33 -0
- data/tmp/create_events_ok.rb +33 -0
- data/tmp/create_events_ok_fail_ack_ok.rb +54 -0
- data/tmp/create_events_ok_failure.rb +40 -0
- data/tmp/create_events_ok_failure_ack.rb +54 -0
- data/tmp/dummy_entities.json +1 -0
- data/tmp/generate_nagios_test_hosts.rb +16 -0
- data/tmp/parse_config_yaml.rb +7 -0
- data/tmp/redis_delete_all_keys.rb +11 -0
- data/tmp/test_entities.json +1 -0
- metadata +482 -221
- data/TODO.md +0 -36
- data/VERSION +0 -1
- data/bin/flapjack-benchmark +0 -50
- data/bin/flapjack-notifier +0 -21
- data/bin/flapjack-notifier-manager +0 -43
- data/bin/flapjack-stats +0 -27
- data/bin/flapjack-worker +0 -13
- data/bin/flapjack-worker-manager +0 -35
- data/dist/etc/init.d/flapjack-notifier +0 -47
- data/dist/etc/init.d/flapjack-workers +0 -44
- data/features/flapjack-notifier-manager.feature +0 -19
- data/features/flapjack-worker-manager.feature +0 -27
- data/features/flapjack-worker.feature +0 -27
- data/features/netsaint-config-converter.feature +0 -126
- data/features/persistence/couch.feature +0 -105
- data/features/persistence/sqlite3.feature +0 -105
- data/features/persistence/steps/couch_steps.rb +0 -25
- data/features/persistence/steps/generic_steps.rb +0 -102
- data/features/persistence/steps/sqlite3_steps.rb +0 -13
- data/features/steps/flapjack-notifier-manager_steps.rb +0 -24
- data/features/steps/flapjack-worker-manager_steps.rb +0 -48
- data/lib/flapjack/applications/notifier.rb +0 -222
- data/lib/flapjack/cli/notifier.rb +0 -108
- data/lib/flapjack/cli/notifier_manager.rb +0 -86
- data/lib/flapjack/cli/worker.rb +0 -51
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/{spec → spec.old}/spec.opts
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/api/entity_check_presenter'
|
3
|
+
|
4
|
+
# require 'flapjack/data/entity'
|
5
|
+
# require 'flapjack/data/entity_check'
|
6
|
+
|
7
|
+
describe 'Flapjack::API::EntityCheck::Presenter' do
|
8
|
+
|
9
|
+
let(:entity_check) { mock(Flapjack::Data::EntityCheck) }
|
10
|
+
|
11
|
+
let(:time) { Time.now.to_i }
|
12
|
+
|
13
|
+
let(:states) {
|
14
|
+
[{:state => 'critical', :timestamp => time - (4 * 60 * 60)},
|
15
|
+
{:state => 'ok', :timestamp => time - (4 * 60 * 60) + (5 * 60)},
|
16
|
+
{:state => 'critical', :timestamp => time - (3 * 60 * 60)},
|
17
|
+
{:state => 'ok', :timestamp => time - (3 * 60 * 60) + (10 * 60)},
|
18
|
+
{:state => 'critical', :timestamp => time - (2 * 60 * 60)},
|
19
|
+
{:state => 'ok', :timestamp => time - (2 * 60 * 60) + (15 * 60)},
|
20
|
+
{:state => 'critical', :timestamp => time - (1 * 60 * 60)},
|
21
|
+
{:state => 'ok', :timestamp => time - (1 * 60 * 60) + (20 * 60)}
|
22
|
+
]
|
23
|
+
}
|
24
|
+
|
25
|
+
# one overlap at start, one overlap at end, one wholly overlapping,
|
26
|
+
# one wholly contained
|
27
|
+
let(:maintenances) {
|
28
|
+
[{:start_time => time - ((4 * 60 * 60) + (1 * 60)), # 1 minute before outage starts
|
29
|
+
:end_time => time - (4 * 60 * 60) + (2 * 60), # 2 minutes after outage starts
|
30
|
+
:duration => (3 * 60)},
|
31
|
+
{:start_time => time - (3 * 60 * 60) + (8 * 60), # 2 minutes before outage ends
|
32
|
+
:end_time => time - (3 * 60 * 60) + (11 * 60), # 1 minute after outage ends
|
33
|
+
:duration => (3 * 60)},
|
34
|
+
{:start_time => time - ((2 * 60 * 60) + (1 * 60)), # 1 minute before outage starts
|
35
|
+
:end_time => time - (2 * 60 * 60) + (17 * 60), # 2 minutes after outage ends
|
36
|
+
:duration => (3 * 60)},
|
37
|
+
{:start_time => time - (1 * 60 * 60) + (1 * 60), # 1 minute after outage starts
|
38
|
+
:end_time => time - (1 * 60 * 60) + (10 * 60), # 10 minutes before outage ends
|
39
|
+
:duration => (9 * 60)}
|
40
|
+
]
|
41
|
+
}
|
42
|
+
|
43
|
+
it "returns a list of outage hashes for an entity check" do
|
44
|
+
entity_check.should_receive(:historical_states).
|
45
|
+
with(time - (5 * 60 * 60), time - (2 * 60 * 60)).and_return(states)
|
46
|
+
|
47
|
+
entity_check.should_receive(:historical_state_before).
|
48
|
+
with(time - (4 * 60 * 60)).and_return(nil)
|
49
|
+
|
50
|
+
ecp = Flapjack::API::EntityCheckPresenter.new(entity_check)
|
51
|
+
outages = ecp.outages(time - (5 * 60 * 60), time - (2 * 60 * 60))
|
52
|
+
outages.should_not be_nil
|
53
|
+
outages.should be_an(Array)
|
54
|
+
outages.should have(4).time_ranges
|
55
|
+
|
56
|
+
# TODO check the data in those hashes
|
57
|
+
end
|
58
|
+
|
59
|
+
it "a list of unscheduled maintenances for an entity check" do
|
60
|
+
entity_check.should_receive(:maintenances).
|
61
|
+
with(time - (12 * 60 * 60), time, :scheduled => false).and_return(maintenances)
|
62
|
+
|
63
|
+
entity_check.should_receive(:maintenances).
|
64
|
+
with(nil, time - (12 * 60 * 60), :scheduled => false).and_return([])
|
65
|
+
|
66
|
+
ecp = Flapjack::API::EntityCheckPresenter.new(entity_check)
|
67
|
+
unsched_maint = ecp.unscheduled_maintenance(time - (12 * 60 * 60), time)
|
68
|
+
|
69
|
+
unsched_maint.should be_an(Array)
|
70
|
+
unsched_maint.should have(4).time_ranges
|
71
|
+
|
72
|
+
# TODO check the data in those hashes
|
73
|
+
end
|
74
|
+
|
75
|
+
it "a list of scheduled maintenances for an entity check" do
|
76
|
+
entity_check.should_receive(:maintenances).
|
77
|
+
with(time - (12 * 60 * 60), time, :scheduled => true).and_return(maintenances)
|
78
|
+
|
79
|
+
entity_check.should_receive(:maintenances).
|
80
|
+
with(nil, time - (12 * 60 * 60), :scheduled => true).and_return([])
|
81
|
+
|
82
|
+
ecp = Flapjack::API::EntityCheckPresenter.new(entity_check)
|
83
|
+
sched_maint = ecp.scheduled_maintenance(time - (12 * 60 * 60), time)
|
84
|
+
|
85
|
+
sched_maint.should be_an(Array)
|
86
|
+
sched_maint.should have(4).time_ranges
|
87
|
+
|
88
|
+
# TODO check the data in those hashes
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns downtime and percentage for an entity check" do
|
92
|
+
entity_check.should_receive(:historical_states).
|
93
|
+
with(time - (12 * 60 * 60), time).and_return(states)
|
94
|
+
|
95
|
+
entity_check.should_receive(:historical_state_before).
|
96
|
+
with(time - (4 * 60 * 60)).and_return(nil)
|
97
|
+
|
98
|
+
entity_check.should_receive(:maintenances).
|
99
|
+
with(time - (12 * 60 * 60), time, :scheduled => true).and_return(maintenances)
|
100
|
+
|
101
|
+
entity_check.should_receive(:maintenances).
|
102
|
+
with(nil, time - (12 * 60 * 60), :scheduled => true).and_return([])
|
103
|
+
|
104
|
+
ecp = Flapjack::API::EntityCheckPresenter.new(entity_check)
|
105
|
+
downtimes = ecp.downtime(time - (12 * 60 * 60), time)
|
106
|
+
|
107
|
+
# 22 minutes, 3 + 8 + 11
|
108
|
+
downtimes.should be_a(Hash)
|
109
|
+
downtimes[:total_seconds].should == (22 * 60)
|
110
|
+
downtimes[:percentage].should == (((22 * 60) * 100) / (12 * 60 * 60))
|
111
|
+
downtimes[:downtime].should be_an(Array)
|
112
|
+
# the last outage gets split by the intervening maintenance period,
|
113
|
+
# but the fully covered one gets removed.
|
114
|
+
downtimes[:downtime].should have(4).time_ranges
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/api/entity_presenter'
|
3
|
+
|
4
|
+
describe 'Flapjack::API::Entity::Presenter' do
|
5
|
+
|
6
|
+
let(:entity) { mock(Flapjack::Data::Entity) }
|
7
|
+
|
8
|
+
let(:check_a) { mock(Flapjack::Data::EntityCheck) }
|
9
|
+
let(:check_b) { mock(Flapjack::Data::EntityCheck) }
|
10
|
+
|
11
|
+
let(:checkpres_a) { mock(Flapjack::API::EntityCheckPresenter) }
|
12
|
+
let(:checkpres_b) { mock(Flapjack::API::EntityCheckPresenter) }
|
13
|
+
|
14
|
+
let(:time) { Time.now.to_i }
|
15
|
+
|
16
|
+
let(:start_time) { time - (6 * 60 * 60) }
|
17
|
+
let(:end_time) { time - (2 * 60 * 60) }
|
18
|
+
|
19
|
+
def expect_check_presenters
|
20
|
+
entity.should_receive(:check_list).and_return(['ssh', 'ping'])
|
21
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
22
|
+
with(entity, 'ssh', anything).and_return(check_a)
|
23
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
24
|
+
with(entity, 'ping', anything).and_return(check_b)
|
25
|
+
|
26
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
27
|
+
with(check_a).and_return(checkpres_a)
|
28
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
29
|
+
with(check_b).and_return(checkpres_b)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns a list of outage hashes for each check on an entity" do
|
33
|
+
expect_check_presenters
|
34
|
+
outages_a = mock('outages_a')
|
35
|
+
outages_b = mock('outages_b')
|
36
|
+
checkpres_a.should_receive(:outages).with(start_time, end_time).
|
37
|
+
and_return(outages_a)
|
38
|
+
checkpres_b.should_receive(:outages).with(start_time, end_time).
|
39
|
+
and_return(outages_b)
|
40
|
+
|
41
|
+
ep = Flapjack::API::EntityPresenter.new(entity)
|
42
|
+
outages = ep.outages(start_time, end_time)
|
43
|
+
outages.should == [{:check => 'ssh', :outages => outages_a},
|
44
|
+
{:check => 'ping', :outages => outages_b}]
|
45
|
+
end
|
46
|
+
|
47
|
+
it "returns a list of unscheduled maintenance periods for each check on an entity" do
|
48
|
+
expect_check_presenters
|
49
|
+
unsched_maint_a = mock('unsched_maint_a')
|
50
|
+
unsched_maint_b = mock('unsched_maint_b')
|
51
|
+
checkpres_a.should_receive(:unscheduled_maintenance).with(start_time, end_time).
|
52
|
+
and_return(unsched_maint_a)
|
53
|
+
checkpres_b.should_receive(:unscheduled_maintenance).with(start_time, end_time).
|
54
|
+
and_return(unsched_maint_b)
|
55
|
+
|
56
|
+
ep = Flapjack::API::EntityPresenter.new(entity)
|
57
|
+
unsched_maint = ep.unscheduled_maintenance(start_time, end_time)
|
58
|
+
unsched_maint.should == [{:check => 'ssh', :unscheduled_maintenance => unsched_maint_a},
|
59
|
+
{:check => 'ping', :unscheduled_maintenance => unsched_maint_b}]
|
60
|
+
end
|
61
|
+
|
62
|
+
it "returns a list of scheduled maintenance periods for each check on an entity" do
|
63
|
+
expect_check_presenters
|
64
|
+
sched_maint_a = mock('sched_maint_a')
|
65
|
+
sched_maint_b = mock('sched_maint_b')
|
66
|
+
checkpres_a.should_receive(:scheduled_maintenance).with(start_time, end_time).
|
67
|
+
and_return(sched_maint_a)
|
68
|
+
checkpres_b.should_receive(:scheduled_maintenance).with(start_time, end_time).
|
69
|
+
and_return(sched_maint_b)
|
70
|
+
|
71
|
+
ep = Flapjack::API::EntityPresenter.new(entity)
|
72
|
+
sched_maint = ep.scheduled_maintenance(start_time, end_time)
|
73
|
+
sched_maint.should == [{:check => 'ssh', :scheduled_maintenance => sched_maint_a},
|
74
|
+
{:check => 'ping', :scheduled_maintenance => sched_maint_b}]
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns a list of downtime for each check on an entity" do
|
78
|
+
expect_check_presenters
|
79
|
+
downtime_a = mock('downtime_a')
|
80
|
+
downtime_b = mock('downtime_b')
|
81
|
+
checkpres_a.should_receive(:downtime).with(start_time, end_time).
|
82
|
+
and_return(downtime_a)
|
83
|
+
checkpres_b.should_receive(:downtime).with(start_time, end_time).
|
84
|
+
and_return(downtime_b)
|
85
|
+
|
86
|
+
ep = Flapjack::API::EntityPresenter.new(entity)
|
87
|
+
downtime = ep.downtime(start_time, end_time)
|
88
|
+
downtime.should == [{:check => 'ssh', :downtime => downtime_a},
|
89
|
+
{:check => 'ping', :downtime => downtime_b}]
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/api'
|
3
|
+
|
4
|
+
describe 'Flapjack::API', :sinatra => true do
|
5
|
+
|
6
|
+
def app
|
7
|
+
Flapjack::API
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:entity) { mock(Flapjack::Data::Entity) }
|
11
|
+
let(:entity_check) { mock(Flapjack::Data::EntityCheck) }
|
12
|
+
|
13
|
+
let(:entity_name) { 'example.com'}
|
14
|
+
let(:entity_name_esc) { URI.escape(entity_name) }
|
15
|
+
let(:check) { 'ping' }
|
16
|
+
|
17
|
+
let(:entity_presenter) { mock(Flapjack::API::EntityPresenter) }
|
18
|
+
let(:entity_check_presenter) { mock(Flapjack::API::EntityCheckPresenter) }
|
19
|
+
|
20
|
+
let(:redis) { mock(::Redis) }
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
Flapjack::API.class_variable_set('@@redis', redis)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a list of checks for an entity" do
|
27
|
+
check_list = ['ping']
|
28
|
+
entity.should_receive(:check_list).and_return(check_list)
|
29
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
30
|
+
with(entity_name, :redis => redis).and_return(entity)
|
31
|
+
|
32
|
+
get "/checks/#{entity_name_esc}"
|
33
|
+
last_response.should be_ok
|
34
|
+
last_response.body.should == check_list.to_json
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns a list of scheduled maintenance periods for an entity" do
|
38
|
+
result = mock('result')
|
39
|
+
result_json = %q{"result"}
|
40
|
+
result.should_receive(:to_json).and_return(result_json)
|
41
|
+
entity_presenter.should_receive(:scheduled_maintenance).with(nil, nil).and_return(result)
|
42
|
+
Flapjack::API::EntityPresenter.should_receive(:new).
|
43
|
+
with(entity, :redis => redis).and_return(entity_presenter)
|
44
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
45
|
+
with(entity_name, :redis => redis).and_return(entity)
|
46
|
+
|
47
|
+
get "/scheduled_maintenances/#{entity_name_esc}"
|
48
|
+
last_response.should be_ok
|
49
|
+
last_response.body.should == result_json
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns a list of scheduled maintenance periods within a time window for an entity"
|
53
|
+
|
54
|
+
it "returns a list of scheduled maintenance periods for a check on an entity" do
|
55
|
+
result = mock('result')
|
56
|
+
result_json = %q{"result"}
|
57
|
+
result.should_receive(:to_json).and_return(result_json)
|
58
|
+
entity_check_presenter.should_receive(:scheduled_maintenance).with(nil, nil).and_return(result)
|
59
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
60
|
+
with(entity_check).and_return(entity_check_presenter)
|
61
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
62
|
+
with(entity_name, :redis => redis).and_return(entity)
|
63
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
64
|
+
with(entity, check, :redis => redis).and_return(entity_check)
|
65
|
+
|
66
|
+
get "/scheduled_maintenances/#{entity_name_esc}/#{check}"
|
67
|
+
last_response.should be_ok
|
68
|
+
last_response.body.should == result_json
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns a list of unscheduled maintenance periods for an entity" do
|
72
|
+
result = mock('result')
|
73
|
+
result_json = %q{"result"}
|
74
|
+
result.should_receive(:to_json).and_return(result_json)
|
75
|
+
entity_presenter.should_receive(:unscheduled_maintenance).with(nil, nil).and_return(result)
|
76
|
+
Flapjack::API::EntityPresenter.should_receive(:new).
|
77
|
+
with(entity, :redis => redis).and_return(entity_presenter)
|
78
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
79
|
+
with(entity_name, :redis => redis).and_return(entity)
|
80
|
+
|
81
|
+
get "/unscheduled_maintenances/#{entity_name_esc}"
|
82
|
+
last_response.should be_ok
|
83
|
+
last_response.body.should == result_json
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns a list of unscheduled maintenance periods for a check on an entity" do
|
87
|
+
result = mock('result')
|
88
|
+
result_json = %q{"result"}
|
89
|
+
result.should_receive(:to_json).and_return(result_json)
|
90
|
+
entity_check_presenter.should_receive(:unscheduled_maintenance).with(nil, nil).and_return(result)
|
91
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
92
|
+
with(entity_check).and_return(entity_check_presenter)
|
93
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
94
|
+
with(entity_name, :redis => redis).and_return(entity)
|
95
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
96
|
+
with(entity, check, :redis => redis).and_return(entity_check)
|
97
|
+
|
98
|
+
get "/unscheduled_maintenances/#{entity_name_esc}/#{check}"
|
99
|
+
last_response.should be_ok
|
100
|
+
last_response.body.should == result_json
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
it "returns a list of unscheduled maintenance periods within a time window for a check an entity"
|
105
|
+
|
106
|
+
it "returns a list of outages for an entity" do
|
107
|
+
result = mock('result')
|
108
|
+
result_json = %q{"result"}
|
109
|
+
result.should_receive(:to_json).and_return(result_json)
|
110
|
+
entity_presenter.should_receive(:outages).with(nil, nil).and_return(result)
|
111
|
+
Flapjack::API::EntityPresenter.should_receive(:new).
|
112
|
+
with(entity, :redis => redis).and_return(entity_presenter)
|
113
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
114
|
+
with(entity_name, :redis => redis).and_return(entity)
|
115
|
+
|
116
|
+
get "/outages/#{entity_name_esc}"
|
117
|
+
last_response.should be_ok
|
118
|
+
last_response.body.should == result_json
|
119
|
+
end
|
120
|
+
|
121
|
+
it "returns a list of outages for a check on an entity" do
|
122
|
+
result = mock('result')
|
123
|
+
result_json = %q{"result"}
|
124
|
+
result.should_receive(:to_json).and_return(result_json)
|
125
|
+
entity_check_presenter.should_receive(:outages).with(nil, nil).and_return(result)
|
126
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
127
|
+
with(entity_check).and_return(entity_check_presenter)
|
128
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
129
|
+
with(entity_name, :redis => redis).and_return(entity)
|
130
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
131
|
+
with(entity, check, :redis => redis).and_return(entity_check)
|
132
|
+
|
133
|
+
get "/outages/#{entity_name_esc}/#{check}"
|
134
|
+
last_response.should be_ok
|
135
|
+
last_response.body.should == result_json
|
136
|
+
end
|
137
|
+
|
138
|
+
it "returns a list of downtimes for an entity" do
|
139
|
+
result = mock('result')
|
140
|
+
result_json = %q{"result"}
|
141
|
+
result.should_receive(:to_json).and_return(result_json)
|
142
|
+
entity_presenter.should_receive(:downtime).with(nil, nil).and_return(result)
|
143
|
+
Flapjack::API::EntityPresenter.should_receive(:new).
|
144
|
+
with(entity, :redis => redis).and_return(entity_presenter)
|
145
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
146
|
+
with(entity_name, :redis => redis).and_return(entity)
|
147
|
+
|
148
|
+
get "/downtime/#{entity_name_esc}"
|
149
|
+
last_response.should be_ok
|
150
|
+
last_response.body.should == result_json
|
151
|
+
end
|
152
|
+
|
153
|
+
it "returns a list of downtimes for a check on an entity" do
|
154
|
+
result = mock('result')
|
155
|
+
result_json = %q{"result"}
|
156
|
+
result.should_receive(:to_json).and_return(result_json)
|
157
|
+
entity_check_presenter.should_receive(:downtime).with(nil, nil).and_return(result)
|
158
|
+
Flapjack::API::EntityCheckPresenter.should_receive(:new).
|
159
|
+
with(entity_check).and_return(entity_check_presenter)
|
160
|
+
Flapjack::Data::Entity.should_receive(:find_by_name).
|
161
|
+
with(entity_name, :redis => redis).and_return(entity)
|
162
|
+
Flapjack::Data::EntityCheck.should_receive(:for_entity).
|
163
|
+
with(entity, check, :redis => redis).and_return(entity_check)
|
164
|
+
|
165
|
+
get "/downtime/#{entity_name_esc}/#{check}"
|
166
|
+
last_response.should be_ok
|
167
|
+
last_response.body.should == result_json
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/coordinator'
|
3
|
+
|
4
|
+
describe Flapjack::Coordinator do
|
5
|
+
|
6
|
+
it "is initialized"
|
7
|
+
|
8
|
+
it "starts a suite of services based on config settings"
|
9
|
+
|
10
|
+
it "runs daemonized"
|
11
|
+
|
12
|
+
it "runs undaemonized"
|
13
|
+
|
14
|
+
it "stops its services when closing"
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,398 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'yajl/json_gem'
|
4
|
+
|
5
|
+
require 'flapjack/data/entity'
|
6
|
+
require 'flapjack/data/entity_check'
|
7
|
+
|
8
|
+
describe Flapjack::Data::EntityCheck, :redis => true do
|
9
|
+
|
10
|
+
let(:name) { 'abc-123' }
|
11
|
+
let(:check) { 'ping' }
|
12
|
+
|
13
|
+
let(:half_an_hour) { 30 * 60 }
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
Flapjack::Data::Entity.add({'id' => '5000',
|
17
|
+
'name' => name},
|
18
|
+
:redis => @redis)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "is created for an event id" do
|
22
|
+
ec = Flapjack::Data::EntityCheck.for_event_id("#{name}:ping", :redis => @redis)
|
23
|
+
ec.should_not be_nil
|
24
|
+
ec.entity.should_not be_nil
|
25
|
+
ec.entity.name.should_not be_nil
|
26
|
+
ec.entity.name.should == name
|
27
|
+
ec.check.should_not be_nil
|
28
|
+
ec.check.should == 'ping'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "is created for an entity name" do
|
32
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, 'ping', :redis => @redis)
|
33
|
+
ec.should_not be_nil
|
34
|
+
ec.entity.should_not be_nil
|
35
|
+
ec.entity.name.should_not be_nil
|
36
|
+
ec.entity.name.should == name
|
37
|
+
ec.check.should_not be_nil
|
38
|
+
ec.check.should == 'ping'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is created for an entity id" do
|
42
|
+
ec = Flapjack::Data::EntityCheck.for_entity_id(5000, 'ping', :redis => @redis)
|
43
|
+
ec.should_not be_nil
|
44
|
+
ec.entity.should_not be_nil
|
45
|
+
ec.entity.name.should_not be_nil
|
46
|
+
ec.entity.name.should == name
|
47
|
+
ec.check.should_not be_nil
|
48
|
+
ec.check.should == 'ping'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "is created for an entity object" do
|
52
|
+
e = Flapjack::Data::Entity.find_by_name(name, :redis => @redis)
|
53
|
+
ec = Flapjack::Data::EntityCheck.for_entity(e, 'ping', :redis => @redis)
|
54
|
+
ec.should_not be_nil
|
55
|
+
ec.entity.should_not be_nil
|
56
|
+
ec.entity.name.should_not be_nil
|
57
|
+
ec.entity.name.should == name
|
58
|
+
ec.check.should_not be_nil
|
59
|
+
ec.check.should == 'ping'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "is not created for a missing entity" do
|
63
|
+
expect {
|
64
|
+
Flapjack::Data::EntityCheck.for_entity(nil, 'ping', :redis => @redis)
|
65
|
+
}.to raise_error
|
66
|
+
end
|
67
|
+
|
68
|
+
it "raises an error if not created with a redis connection handle" do
|
69
|
+
expect {
|
70
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, 'ping')
|
71
|
+
}.to raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
context "maintenance" do
|
75
|
+
|
76
|
+
it "returns that it is in unscheduled maintenance" do
|
77
|
+
@redis.set("#{name}:#{check}:unscheduled_maintenance", Time.now.to_i.to_s)
|
78
|
+
|
79
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
80
|
+
ec.should be_in_unscheduled_maintenance
|
81
|
+
end
|
82
|
+
|
83
|
+
it "returns that it is not in unscheduled maintenance" do
|
84
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
85
|
+
ec.should_not be_in_unscheduled_maintenance
|
86
|
+
end
|
87
|
+
|
88
|
+
it "returns that it is in scheduled maintenance" do
|
89
|
+
@redis.set("#{name}:#{check}:scheduled_maintenance", Time.now.to_i.to_s)
|
90
|
+
|
91
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
92
|
+
ec.should be_in_scheduled_maintenance
|
93
|
+
end
|
94
|
+
|
95
|
+
it "returns that it is not in scheduled maintenance" do
|
96
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
97
|
+
ec.should_not be_in_scheduled_maintenance
|
98
|
+
end
|
99
|
+
|
100
|
+
it "creates an unscheduled maintenance period" do
|
101
|
+
t = Time.now.to_i
|
102
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
103
|
+
ec.create_unscheduled_maintenance(:start_time => t, :duration => half_an_hour, :summary => 'oops')
|
104
|
+
|
105
|
+
timestamp = @redis.get("#{name}:#{check}:unscheduled_maintenance")
|
106
|
+
timestamp.should_not be_nil
|
107
|
+
timestamp.should == t.to_s
|
108
|
+
|
109
|
+
umps = @redis.zrange("#{name}:#{check}:unscheduled_maintenances", 0, -1, :with_scores => true)
|
110
|
+
umps.should_not be_nil
|
111
|
+
umps.should be_an(Array)
|
112
|
+
umps.should have(1).unscheduled_maintenance_period
|
113
|
+
umps[0].should be_an(Array)
|
114
|
+
|
115
|
+
start_time = umps[0][0]
|
116
|
+
start_time.should_not be_nil
|
117
|
+
start_time.should be_a(String)
|
118
|
+
start_time.should == t.to_s
|
119
|
+
|
120
|
+
score = umps[0][1]
|
121
|
+
score.should_not be_nil
|
122
|
+
score.should be_a(Float)
|
123
|
+
score.should == half_an_hour
|
124
|
+
|
125
|
+
summary = @redis.get("#{name}:#{check}:#{t}:unscheduled_maintenance:summary")
|
126
|
+
summary.should_not be_nil
|
127
|
+
summary.should == 'oops'
|
128
|
+
end
|
129
|
+
|
130
|
+
it "creates a scheduled maintenance period for a future time" do
|
131
|
+
t = Time.now.to_i
|
132
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
133
|
+
ec.create_scheduled_maintenance(:start_time => t + (60 * 60),
|
134
|
+
:duration => half_an_hour, :summary => "30 minutes")
|
135
|
+
|
136
|
+
smps = @redis.zrange("#{name}:#{check}:scheduled_maintenances", 0, -1, :with_scores => true)
|
137
|
+
smps.should_not be_nil
|
138
|
+
smps.should be_an(Array)
|
139
|
+
smps.should have(1).scheduled_maintenance_period
|
140
|
+
smps[0].should be_an(Array)
|
141
|
+
|
142
|
+
start_time = smps[0][0]
|
143
|
+
start_time.should_not be_nil
|
144
|
+
start_time.should be_a(String)
|
145
|
+
start_time.should == (t + (60 * 60)).to_s
|
146
|
+
|
147
|
+
score = smps[0][1]
|
148
|
+
score.should_not be_nil
|
149
|
+
score.should be_a(Float)
|
150
|
+
score.should == half_an_hour
|
151
|
+
end
|
152
|
+
|
153
|
+
it "creates a scheduled maintenance period covering the current time"
|
154
|
+
|
155
|
+
it "removes a scheduled maintenance period for a future time"
|
156
|
+
|
157
|
+
it "removes a scheduled maintenance period covering a current time"
|
158
|
+
|
159
|
+
it "returns a list of scheduled maintenance periods" do
|
160
|
+
t = Time.now.to_i
|
161
|
+
five_hours_ago = t - (60 * 60 * 5)
|
162
|
+
three_hours_ago = t - (60 * 60 * 3)
|
163
|
+
|
164
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
165
|
+
ec.create_scheduled_maintenance(:start_time => five_hours_ago,
|
166
|
+
:duration => half_an_hour, :summary => "first")
|
167
|
+
ec.create_scheduled_maintenance(:start_time => three_hours_ago,
|
168
|
+
:duration => half_an_hour, :summary => "second")
|
169
|
+
|
170
|
+
smp = ec.maintenances(nil, nil, :scheduled => true)
|
171
|
+
smp.should_not be_nil
|
172
|
+
smp.should be_an(Array)
|
173
|
+
smp.should have(2).scheduled_maintenance_periods
|
174
|
+
smp[0].should == {:start_time => five_hours_ago,
|
175
|
+
:end_time => five_hours_ago + half_an_hour,
|
176
|
+
:duration => half_an_hour,
|
177
|
+
:summary => "first"}
|
178
|
+
smp[1].should == {:start_time => three_hours_ago,
|
179
|
+
:end_time => three_hours_ago + half_an_hour,
|
180
|
+
:duration => half_an_hour,
|
181
|
+
:summary => "second"}
|
182
|
+
end
|
183
|
+
|
184
|
+
it "returns a list of unscheduled maintenance periods" do
|
185
|
+
t = Time.now.to_i
|
186
|
+
five_hours_ago = t - (60 * 60 * 5)
|
187
|
+
three_hours_ago = t - (60 * 60 * 3)
|
188
|
+
|
189
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
190
|
+
ec.create_unscheduled_maintenance(:start_time => five_hours_ago,
|
191
|
+
:duration => half_an_hour, :summary => "first")
|
192
|
+
ec.create_unscheduled_maintenance(:start_time => three_hours_ago,
|
193
|
+
:duration => half_an_hour, :summary => "second")
|
194
|
+
|
195
|
+
ump = ec.maintenances(nil, nil, :scheduled => false)
|
196
|
+
ump.should_not be_nil
|
197
|
+
ump.should be_an(Array)
|
198
|
+
ump.should have(2).unscheduled_maintenance_periods
|
199
|
+
ump[0].should == {:start_time => five_hours_ago,
|
200
|
+
:end_time => five_hours_ago + half_an_hour,
|
201
|
+
:duration => half_an_hour,
|
202
|
+
:summary => "first"}
|
203
|
+
ump[1].should == {:start_time => three_hours_ago,
|
204
|
+
:end_time => three_hours_ago + half_an_hour,
|
205
|
+
:duration => half_an_hour,
|
206
|
+
:summary => "second"}
|
207
|
+
end
|
208
|
+
|
209
|
+
it "updates scheduled maintenance periods"
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
it "creates an event" do
|
214
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
215
|
+
t = Time.now.to_i
|
216
|
+
ec.create_event('type' => 'service',
|
217
|
+
'state' => 'ok',
|
218
|
+
'summary' => 'everything checked out',
|
219
|
+
'time' => t)
|
220
|
+
event_json = @redis.rpop('events')
|
221
|
+
event_json.should_not be_nil
|
222
|
+
event = nil
|
223
|
+
expect {
|
224
|
+
event = JSON.parse(event_json)
|
225
|
+
}.not_to raise_error
|
226
|
+
event.should_not be_nil
|
227
|
+
event.should be_a(Hash)
|
228
|
+
event.should == {
|
229
|
+
'entity' => name,
|
230
|
+
'check' => check,
|
231
|
+
'type' => 'service',
|
232
|
+
'state' => 'ok',
|
233
|
+
'summary' => 'everything checked out',
|
234
|
+
'time' => t
|
235
|
+
}
|
236
|
+
end
|
237
|
+
|
238
|
+
it "creates an acknowledgement" do
|
239
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
240
|
+
t = Time.now.to_i
|
241
|
+
ec.create_acknowledgement('summary' => 'looking now',
|
242
|
+
'time' => t,
|
243
|
+
'acknowledgement_id' => '75',
|
244
|
+
'duration' => 40 * 60)
|
245
|
+
event_json = @redis.rpop('events')
|
246
|
+
event_json.should_not be_nil
|
247
|
+
event = nil
|
248
|
+
expect {
|
249
|
+
event = JSON.parse(event_json)
|
250
|
+
}.not_to raise_error
|
251
|
+
event.should_not be_nil
|
252
|
+
event.should be_a(Hash)
|
253
|
+
event.should == {
|
254
|
+
'entity' => name,
|
255
|
+
'check' => check,
|
256
|
+
'type' => 'action',
|
257
|
+
'state' => 'acknowledgement',
|
258
|
+
'summary' => 'looking now',
|
259
|
+
'time' => t,
|
260
|
+
'acknowledgement_id' => '75',
|
261
|
+
'duration' => 2400
|
262
|
+
}
|
263
|
+
end
|
264
|
+
|
265
|
+
it "returns its state" do
|
266
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'ok')
|
267
|
+
|
268
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
269
|
+
state = ec.state
|
270
|
+
state.should_not be_nil
|
271
|
+
state.should == 'ok'
|
272
|
+
end
|
273
|
+
|
274
|
+
it "updates state" do
|
275
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'ok')
|
276
|
+
|
277
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
278
|
+
ec.update_state('critical')
|
279
|
+
|
280
|
+
state = @redis.hget("check:#{name}:#{check}", 'state')
|
281
|
+
state.should_not be_nil
|
282
|
+
state.should == 'critical'
|
283
|
+
end
|
284
|
+
|
285
|
+
it "does not update state with invalid value" do
|
286
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'ok')
|
287
|
+
|
288
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
289
|
+
ec.update_state('silly')
|
290
|
+
|
291
|
+
state = @redis.hget("check:#{name}:#{check}", 'state')
|
292
|
+
state.should_not be_nil
|
293
|
+
state.should == 'ok'
|
294
|
+
end
|
295
|
+
|
296
|
+
def time_before(t, min, sec = 0)
|
297
|
+
t - ((60 * min) + sec)
|
298
|
+
end
|
299
|
+
|
300
|
+
it "returns a list of historical states for a time range" do
|
301
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
302
|
+
|
303
|
+
t = Time.now.to_i
|
304
|
+
ec.update_state('ok', :timestamp => time_before(t, 5), :summary => 'a')
|
305
|
+
ec.update_state('critical', :timestamp => time_before(t, 4), :summary => 'b')
|
306
|
+
ec.update_state('ok', :timestamp => time_before(t, 3), :summary => 'c')
|
307
|
+
ec.update_state('critical', :timestamp => time_before(t, 2), :summary => 'd')
|
308
|
+
ec.update_state('ok', :timestamp => time_before(t, 1), :summary => 'e')
|
309
|
+
|
310
|
+
states = ec.historical_states(time_before(t, 4), t)
|
311
|
+
states.should_not be_nil
|
312
|
+
states.should be_an(Array)
|
313
|
+
states.should have(4).data_hashes
|
314
|
+
states[0][:summary].should == 'b'
|
315
|
+
states[1][:summary].should == 'c'
|
316
|
+
states[2][:summary].should == 'd'
|
317
|
+
states[3][:summary].should == 'e'
|
318
|
+
end
|
319
|
+
|
320
|
+
it "returns a list of historical unscheduled maintenances for a time range" do
|
321
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
322
|
+
|
323
|
+
t = Time.now.to_i
|
324
|
+
# ec.update_state('ok', :timestamp => time_before(t, 5), :summary => 'a')
|
325
|
+
# ec.update_state('critical', :timestamp => time_before(t, 4), :summary => 'b')
|
326
|
+
# ec.update_state('ok', :timestamp => time_before(t, 3), :summary => 'c')
|
327
|
+
# ec.update_state('critical', :timestamp => time_before(t, 2), :summary => 'd')
|
328
|
+
# ec.update_state('ok', :timestamp => time_before(t, 1), :summary => 'e')
|
329
|
+
|
330
|
+
# states = ec.historical_states(time_before(t, 4), t)
|
331
|
+
# states.should_not be_nil
|
332
|
+
# states.should be_an(Array)
|
333
|
+
# states.should have(4).data_hashes
|
334
|
+
# states[0][:summary].should == 'b'
|
335
|
+
# states[1][:summary].should == 'c'
|
336
|
+
# states[2][:summary].should == 'd'
|
337
|
+
# states[3][:summary].should == 'e'
|
338
|
+
end
|
339
|
+
|
340
|
+
it "returns a list of historical scheduled maintenances for a time range" do
|
341
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
342
|
+
|
343
|
+
t = Time.now.to_i
|
344
|
+
|
345
|
+
ec.create_scheduled_maintenance(:start_time => time_before(t, 180),
|
346
|
+
:duration => half_an_hour, :summary => "a")
|
347
|
+
ec.create_scheduled_maintenance(:start_time => time_before(t, 120),
|
348
|
+
:duration => half_an_hour, :summary => "b")
|
349
|
+
ec.create_scheduled_maintenance(:start_time => time_before(t, 60),
|
350
|
+
:duration => half_an_hour, :summary => "c")
|
351
|
+
|
352
|
+
sched_maint_periods = ec.maintenances(time_before(t, 150), t,
|
353
|
+
:scheduled => true)
|
354
|
+
sched_maint_periods.should_not be_nil
|
355
|
+
sched_maint_periods.should be_an(Array)
|
356
|
+
sched_maint_periods.should have(2).data_hashes
|
357
|
+
sched_maint_periods[0][:summary].should == 'b'
|
358
|
+
sched_maint_periods[1][:summary].should == 'c'
|
359
|
+
end
|
360
|
+
|
361
|
+
it "returns that it has failed" do
|
362
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
363
|
+
|
364
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'warning')
|
365
|
+
ec.should be_failed
|
366
|
+
|
367
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'critical')
|
368
|
+
ec.should be_failed
|
369
|
+
end
|
370
|
+
|
371
|
+
it "returns that it has not failed" do
|
372
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
373
|
+
|
374
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'ok')
|
375
|
+
ec.should_not be_failed
|
376
|
+
|
377
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'acknowledgement')
|
378
|
+
ec.should_not be_failed
|
379
|
+
|
380
|
+
@redis.hset("check:#{name}:#{check}", 'state', 'unknown')
|
381
|
+
ec.should_not be_failed
|
382
|
+
end
|
383
|
+
|
384
|
+
it "returns a status summary"
|
385
|
+
|
386
|
+
it "returns timestamps for its last notifications" do
|
387
|
+
t = Time.now.to_i
|
388
|
+
@redis.set("#{name}:#{check}:last_problem_notification", t - 30)
|
389
|
+
@redis.set("#{name}:#{check}:last_acknowledgement_notification", t - 15)
|
390
|
+
@redis.set("#{name}:#{check}:last_recovery_notification", t)
|
391
|
+
|
392
|
+
ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
|
393
|
+
ec.last_problem_notification.should == t - 30
|
394
|
+
ec.last_acknowledgement_notification.should == t - 15
|
395
|
+
ec.last_recovery_notification.should == t
|
396
|
+
end
|
397
|
+
|
398
|
+
end
|