flapjack 1.1.0 → 1.2.0rc1

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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +12 -7
  5. data/CHANGELOG.md +12 -0
  6. data/Gemfile +6 -2
  7. data/Gemfile-ruby1.9 +29 -0
  8. data/Gemfile-ruby1.9.lock +251 -0
  9. data/README.md +2 -2
  10. data/Rakefile +1 -0
  11. data/etc/flapjack_config.yaml.example +2 -2
  12. data/features/steps/events_steps.rb +2 -2
  13. data/features/steps/flapjack-netsaint-parser_steps.rb +1 -1
  14. data/features/support/env.rb +1 -6
  15. data/lib/flapjack/cli/import.rb +2 -5
  16. data/lib/flapjack/cli/purge.rb +4 -4
  17. data/lib/flapjack/cli/receiver.rb +122 -54
  18. data/lib/flapjack/cli/server.rb +0 -5
  19. data/lib/flapjack/coordinator.rb +6 -0
  20. data/lib/flapjack/data/contact.rb +10 -62
  21. data/lib/flapjack/data/entity.rb +36 -52
  22. data/lib/flapjack/data/entity_check.rb +90 -21
  23. data/lib/flapjack/data/event.rb +4 -5
  24. data/lib/flapjack/data/notification.rb +8 -10
  25. data/lib/flapjack/data/notification_rule.rb +32 -35
  26. data/lib/flapjack/data/tagged.rb +48 -0
  27. data/lib/flapjack/gateways/jabber.rb +4 -5
  28. data/lib/flapjack/gateways/jsonapi/check_methods.rb +45 -7
  29. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +1 -1
  30. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +8 -2
  31. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +26 -8
  32. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +13 -9
  33. data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +2 -2
  34. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +1 -1
  35. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +24 -17
  36. data/lib/flapjack/gateways/jsonapi/rack/json_params_parser.rb +1 -1
  37. data/lib/flapjack/gateways/jsonapi/report_methods.rb +4 -4
  38. data/lib/flapjack/gateways/jsonapi.rb +52 -31
  39. data/lib/flapjack/gateways/oobetet.rb +2 -3
  40. data/lib/flapjack/gateways/pagerduty.rb +9 -8
  41. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +19 -0
  42. data/lib/flapjack/gateways/web/public/js/flapjack.js +6 -2
  43. data/lib/flapjack/gateways/web/public/js/modules/contact.js +9 -14
  44. data/lib/flapjack/gateways/web/public/js/modules/medium.js +1 -0
  45. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -1
  46. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +3 -3
  47. data/lib/flapjack/gateways/web.rb +8 -7
  48. data/lib/flapjack/notifier.rb +2 -4
  49. data/lib/flapjack/processor.rb +2 -2
  50. data/lib/flapjack/version.rb +1 -1
  51. data/lib/flapjack.rb +10 -0
  52. data/spec/lib/flapjack/coordinator_spec.rb +18 -0
  53. data/spec/lib/flapjack/data/contact_spec.rb +4 -12
  54. data/spec/lib/flapjack/data/entity_check_spec.rb +56 -3
  55. data/spec/lib/flapjack/data/entity_spec.rb +79 -67
  56. data/spec/lib/flapjack/data/event_spec.rb +78 -78
  57. data/spec/lib/flapjack/data/notification_rule_spec.rb +4 -2
  58. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +94 -11
  59. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +84 -0
  60. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +5 -3
  61. data/spec/lib/flapjack/gateways/web_spec.rb +3 -3
  62. data/spec/service_consumers/pact_helper.rb +74 -0
  63. data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +4522 -0
  64. data/spec/service_consumers/provider_states_for_flapjack-diner.rb +356 -0
  65. data/spec/spec_helper.rb +0 -8
  66. data/spec/support/jsonapi_helper.rb +1 -1
  67. data/tasks/benchmarks.rake +6 -3
  68. data/tasks/profile.rake +1 -1
  69. data/tmp/acknowledge.rb +0 -3
  70. data/tmp/create_event_ok.rb +0 -3
  71. data/tmp/create_event_unknown.rb +0 -3
  72. data/tmp/create_events_failure.rb +0 -3
  73. data/tmp/create_events_ok.rb +0 -3
  74. data/tmp/create_events_ok_fail_ack_ok.rb +0 -3
  75. data/tmp/create_events_ok_failure.rb +2 -5
  76. data/tmp/create_events_ok_failure_ack.rb +0 -3
  77. data/tmp/test_json_post.rb +4 -3
  78. data/tmp/test_notification_rules_api.rb +2 -3
  79. metadata +13 -8
  80. data/lib/flapjack/data/tag.rb +0 -61
  81. data/lib/flapjack/data/tag_set.rb +0 -16
  82. data/spec/lib/flapjack/data/tag_spec.rb +0 -36
@@ -5,7 +5,7 @@ describe Flapjack::Data::Event do
5
5
 
6
6
  let(:entity_name) { 'xyz-example.com' }
7
7
  let(:check) { 'ping' }
8
- let(:mock_redis) { double(::Redis) }
8
+ let(:redis) { double(::Redis) }
9
9
 
10
10
  let!(:time) { Time.now}
11
11
 
@@ -25,66 +25,66 @@ describe Flapjack::Data::Event do
25
25
  context 'class' do
26
26
 
27
27
  it "returns the next event (blocking, archiving)" do
28
- expect(mock_redis).to receive(:brpoplpush).
28
+ expect(redis).to receive(:brpoplpush).
29
29
  with('events', /^events_archive:/, 0).and_return(event_data.to_json)
30
- expect(mock_redis).to receive(:expire)
30
+ expect(redis).to receive(:expire)
31
31
 
32
32
  result = Flapjack::Data::Event.next('events', :block => true,
33
- :archive_events => true, :redis => mock_redis)
33
+ :archive_events => true, :redis => redis)
34
34
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
35
35
  end
36
36
 
37
37
  it "returns the next event (blocking, not archiving)" do
38
- expect(mock_redis).to receive(:brpop).with('events', 0).
38
+ expect(redis).to receive(:brpop).with('events', 0).
39
39
  and_return(['events', event_data.to_json])
40
40
 
41
41
  result = Flapjack::Data::Event.next('events',:block => true,
42
- :archive_events => false, :redis => mock_redis)
42
+ :archive_events => false, :redis => redis)
43
43
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
44
44
  end
45
45
 
46
46
  it "returns the next event (non-blocking, archiving)" do
47
- expect(mock_redis).to receive(:rpoplpush).
47
+ expect(redis).to receive(:rpoplpush).
48
48
  with('events', /^events_archive:/).and_return(event_data.to_json)
49
- expect(mock_redis).to receive(:expire)
49
+ expect(redis).to receive(:expire)
50
50
 
51
51
  result = Flapjack::Data::Event.next('events', :block => false,
52
- :archive_events => true, :redis => mock_redis)
52
+ :archive_events => true, :redis => redis)
53
53
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
54
54
  end
55
55
 
56
56
  it "returns the next event (non-blocking, not archiving)" do
57
- expect(mock_redis).to receive(:rpop).with('events').
57
+ expect(redis).to receive(:rpop).with('events').
58
58
  and_return(event_data.to_json)
59
59
 
60
60
  result = Flapjack::Data::Event.next('events', :block => false,
61
- :archive_events => false, :redis => mock_redis)
61
+ :archive_events => false, :redis => redis)
62
62
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
63
63
  end
64
64
 
65
65
  it "rejects invalid event JSON (archiving)" do
66
66
  bad_event_json = '{{{'
67
- expect(mock_redis).to receive(:brpoplpush).
67
+ expect(redis).to receive(:brpoplpush).
68
68
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
69
- expect(mock_redis).to receive(:multi)
70
- expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
71
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
72
- expect(mock_redis).to receive(:exec)
73
- expect(mock_redis).to receive(:expire)
69
+ expect(redis).to receive(:multi)
70
+ expect(redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
71
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
72
+ expect(redis).to receive(:exec)
73
+ expect(redis).to receive(:expire)
74
74
 
75
75
  result = Flapjack::Data::Event.next('events', :block => true,
76
- :archive_events => true, :redis => mock_redis)
76
+ :archive_events => true, :redis => redis)
77
77
  expect(result).to be_nil
78
78
  end
79
79
 
80
80
  it "rejects invalid event JSON (not archiving)" do
81
81
  bad_event_json = '{{{'
82
- expect(mock_redis).to receive(:brpop).with('events', 0).
82
+ expect(redis).to receive(:brpop).with('events', 0).
83
83
  and_return(['events', bad_event_json])
84
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
84
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
85
85
 
86
86
  result = Flapjack::Data::Event.next('events', :block => true,
87
- :archive_events => false, :redis => mock_redis)
87
+ :archive_events => false, :redis => redis)
88
88
  expect(result).to be_nil
89
89
  end
90
90
 
@@ -94,16 +94,16 @@ describe Flapjack::Data::Event do
94
94
  bad_event_data = event_data.clone
95
95
  bad_event_data.delete(required_key)
96
96
  bad_event_json = bad_event_data.to_json
97
- expect(mock_redis).to receive(:brpoplpush).
97
+ expect(redis).to receive(:brpoplpush).
98
98
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
99
- expect(mock_redis).to receive(:multi)
100
- expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
101
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
102
- expect(mock_redis).to receive(:exec)
103
- expect(mock_redis).to receive(:expire)
99
+ expect(redis).to receive(:multi)
100
+ expect(redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
101
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
102
+ expect(redis).to receive(:exec)
103
+ expect(redis).to receive(:expire)
104
104
 
105
105
  result = Flapjack::Data::Event.next('events', :block => true,
106
- :archive_events => true, :redis => mock_redis)
106
+ :archive_events => true, :redis => redis)
107
107
  expect(result).to be_nil
108
108
  end
109
109
 
@@ -111,12 +111,12 @@ describe Flapjack::Data::Event do
111
111
  bad_event_data = event_data.clone
112
112
  bad_event_data.delete(required_key)
113
113
  bad_event_json = bad_event_data.to_json
114
- expect(mock_redis).to receive(:brpop).with('events', 0).
114
+ expect(redis).to receive(:brpop).with('events', 0).
115
115
  and_return(['events', bad_event_json])
116
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
116
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
117
117
 
118
118
  result = Flapjack::Data::Event.next('events', :block => true,
119
- :archive_events => false, :redis => mock_redis)
119
+ :archive_events => false, :redis => redis)
120
120
  expect(result).to be_nil
121
121
  end
122
122
 
@@ -124,16 +124,16 @@ describe Flapjack::Data::Event do
124
124
  bad_event_data = event_data.clone
125
125
  bad_event_data[required_key] = {'hello' => 'there'}
126
126
  bad_event_json = bad_event_data.to_json
127
- expect(mock_redis).to receive(:brpoplpush).
127
+ expect(redis).to receive(:brpoplpush).
128
128
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
129
- expect(mock_redis).to receive(:multi)
130
- expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
131
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
132
- expect(mock_redis).to receive(:exec)
133
- expect(mock_redis).to receive(:expire)
129
+ expect(redis).to receive(:multi)
130
+ expect(redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
131
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
132
+ expect(redis).to receive(:exec)
133
+ expect(redis).to receive(:expire)
134
134
 
135
135
  result = Flapjack::Data::Event.next('events', :block => true,
136
- :archive_events => true, :redis => mock_redis)
136
+ :archive_events => true, :redis => redis)
137
137
  expect(result).to be_nil
138
138
  end
139
139
 
@@ -141,12 +141,12 @@ describe Flapjack::Data::Event do
141
141
  bad_event_data = event_data.clone
142
142
  bad_event_data[required_key] = {'hello' => 'there'}
143
143
  bad_event_json = bad_event_data.to_json
144
- expect(mock_redis).to receive(:brpop).with('events', 0).
144
+ expect(redis).to receive(:brpop).with('events', 0).
145
145
  and_return(['events', bad_event_json])
146
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
146
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
147
147
 
148
148
  result = Flapjack::Data::Event.next('events', :block => true,
149
- :archive_events => false, :redis => mock_redis)
149
+ :archive_events => false, :redis => redis)
150
150
  expect(result).to be_nil
151
151
  end
152
152
  end
@@ -156,16 +156,16 @@ describe Flapjack::Data::Event do
156
156
  bad_event_data = event_data.clone
157
157
  bad_event_data[optional_key] = {'hello' => 'there'}
158
158
  bad_event_json = bad_event_data.to_json
159
- expect(mock_redis).to receive(:brpoplpush).
159
+ expect(redis).to receive(:brpoplpush).
160
160
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
161
- expect(mock_redis).to receive(:multi)
162
- expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
163
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
164
- expect(mock_redis).to receive(:exec)
165
- expect(mock_redis).to receive(:expire)
161
+ expect(redis).to receive(:multi)
162
+ expect(redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
163
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
164
+ expect(redis).to receive(:exec)
165
+ expect(redis).to receive(:expire)
166
166
 
167
167
  result = Flapjack::Data::Event.next('events', :block => true,
168
- :archive_events => true, :redis => mock_redis)
168
+ :archive_events => true, :redis => redis)
169
169
  expect(result).to be_nil
170
170
  end
171
171
 
@@ -173,12 +173,12 @@ describe Flapjack::Data::Event do
173
173
  bad_event_data = event_data.clone
174
174
  bad_event_data[optional_key] = {'hello' => 'there'}
175
175
  bad_event_json = bad_event_data.to_json
176
- expect(mock_redis).to receive(:brpop).with('events', 0).
176
+ expect(redis).to receive(:brpop).with('events', 0).
177
177
  and_return(['events', bad_event_json])
178
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
178
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
179
179
 
180
180
  result = Flapjack::Data::Event.next('events', :block => true,
181
- :archive_events => false, :redis => mock_redis)
181
+ :archive_events => false, :redis => redis)
182
182
  expect(result).to be_nil
183
183
  end
184
184
  end
@@ -188,23 +188,23 @@ describe Flapjack::Data::Event do
188
188
  it "it matches case-insensitively for #{key} (archiving)" do
189
189
  case_event_data = event_data.clone
190
190
  case_event_data[key] = event_data[key].upcase
191
- expect(mock_redis).to receive(:brpoplpush).
191
+ expect(redis).to receive(:brpoplpush).
192
192
  with('events', /^events_archive:/, 0).and_return(case_event_data.to_json)
193
- expect(mock_redis).to receive(:expire)
193
+ expect(redis).to receive(:expire)
194
194
 
195
195
  result = Flapjack::Data::Event.next('events', :block => true,
196
- :archive_events => true, :redis => mock_redis)
196
+ :archive_events => true, :redis => redis)
197
197
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
198
198
  end
199
199
 
200
200
  it "it matches case-insensitively for #{key} (not archiving)" do
201
201
  case_event_data = event_data.clone
202
202
  case_event_data[key] = event_data[key].upcase
203
- expect(mock_redis).to receive(:brpop).with('events', 0).
203
+ expect(redis).to receive(:brpop).with('events', 0).
204
204
  and_return(['events', case_event_data.to_json])
205
205
 
206
206
  result = Flapjack::Data::Event.next('events',:block => true,
207
- :archive_events => false, :redis => mock_redis)
207
+ :archive_events => false, :redis => redis)
208
208
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
209
209
  end
210
210
  end
@@ -214,23 +214,23 @@ describe Flapjack::Data::Event do
214
214
  it "it accepts an event with a numeric #{key} key (archiving)" do
215
215
  num_event_data = event_data.clone
216
216
  num_event_data[key] = event_data[key].to_i.to_s
217
- expect(mock_redis).to receive(:brpoplpush).
217
+ expect(redis).to receive(:brpoplpush).
218
218
  with('events', /^events_archive:/, 0).and_return(num_event_data.to_json)
219
- expect(mock_redis).to receive(:expire)
219
+ expect(redis).to receive(:expire)
220
220
 
221
221
  result = Flapjack::Data::Event.next('events', :block => true,
222
- :archive_events => true, :redis => mock_redis)
222
+ :archive_events => true, :redis => redis)
223
223
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
224
224
  end
225
225
 
226
226
  it "it accepts an event with a numeric #{key} key (not archiving)" do
227
227
  num_event_data = event_data.clone
228
228
  num_event_data[key] = event_data[key].to_i.to_s
229
- expect(mock_redis).to receive(:brpop).with('events', 0).
229
+ expect(redis).to receive(:brpop).with('events', 0).
230
230
  and_return(['events', num_event_data.to_json])
231
231
 
232
232
  result = Flapjack::Data::Event.next('events',:block => true,
233
- :archive_events => false, :redis => mock_redis)
233
+ :archive_events => false, :redis => redis)
234
234
  expect(result).to be_an_instance_of(Flapjack::Data::Event)
235
235
  end
236
236
 
@@ -238,16 +238,16 @@ describe Flapjack::Data::Event do
238
238
  bad_event_data = event_data.clone
239
239
  bad_event_data[key] = 'NaN'
240
240
  bad_event_json = bad_event_data.to_json
241
- expect(mock_redis).to receive(:brpoplpush).
241
+ expect(redis).to receive(:brpoplpush).
242
242
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
243
- expect(mock_redis).to receive(:multi)
244
- expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
245
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
246
- expect(mock_redis).to receive(:exec)
247
- expect(mock_redis).to receive(:expire)
243
+ expect(redis).to receive(:multi)
244
+ expect(redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
245
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
246
+ expect(redis).to receive(:exec)
247
+ expect(redis).to receive(:expire)
248
248
 
249
249
  result = Flapjack::Data::Event.next('events', :block => true,
250
- :archive_events => true, :redis => mock_redis)
250
+ :archive_events => true, :redis => redis)
251
251
  expect(result).to be_nil
252
252
  end
253
253
 
@@ -255,12 +255,12 @@ describe Flapjack::Data::Event do
255
255
  bad_event_data = event_data.clone
256
256
  bad_event_data[key] = 'NaN'
257
257
  bad_event_json = bad_event_data.to_json
258
- expect(mock_redis).to receive(:brpop).with('events', 0).
258
+ expect(redis).to receive(:brpop).with('events', 0).
259
259
  and_return(['events', bad_event_json])
260
- expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
260
+ expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
261
261
 
262
262
  result = Flapjack::Data::Event.next('events', :block => true,
263
- :archive_events => false, :redis => mock_redis)
263
+ :archive_events => false, :redis => redis)
264
264
  expect(result).to be_nil
265
265
  end
266
266
 
@@ -268,26 +268,26 @@ describe Flapjack::Data::Event do
268
268
 
269
269
  it "returns a count of pending events" do
270
270
  events_len = 23
271
- expect(mock_redis).to receive(:llen).with('events').and_return(events_len)
271
+ expect(redis).to receive(:llen).with('events').and_return(events_len)
272
272
 
273
- pc = Flapjack::Data::Event.pending_count('events', :redis => mock_redis)
273
+ pc = Flapjack::Data::Event.pending_count('events', :redis => redis)
274
274
  expect(pc).to eq(events_len)
275
275
  end
276
276
 
277
277
  it "creates a notification testing event" do
278
278
  expect(Time).to receive(:now).and_return(time)
279
- expect(mock_redis).to receive(:lpush).with('events', /"testing"/ )
279
+ expect(redis).to receive(:lpush).with('events', /"testing"/ )
280
280
 
281
281
  Flapjack::Data::Event.test_notifications(entity_name, check,
282
- :summary => 'test', :details => 'testing', :redis => mock_redis)
282
+ :summary => 'test', :details => 'testing', :redis => redis)
283
283
  end
284
284
 
285
285
  it "creates an acknowledgement event" do
286
286
  expect(Time).to receive(:now).and_return(time)
287
- expect(mock_redis).to receive(:lpush).with('events', /"acking"/ )
287
+ expect(redis).to receive(:lpush).with('events', /"acking"/ )
288
288
 
289
289
  Flapjack::Data::Event.create_acknowledgement(entity_name, check,
290
- :summary => 'acking', :time => time.to_i, :redis => mock_redis)
290
+ :summary => 'acking', :time => time.to_i, :redis => redis)
291
291
  end
292
292
 
293
293
  end
@@ -302,7 +302,7 @@ describe Flapjack::Data::Event do
302
302
  expect(event.time).to eq(event_data['time'])
303
303
  expect(event.id).to eq('xyz-example.com:ping')
304
304
  expect(event.type).to eq('service')
305
- expect(event.tags).to be_an_instance_of(Flapjack::Data::TagSet)
305
+ expect(event.tags).to be_an_instance_of(Set)
306
306
  expect(event.tags).to include('dev')
307
307
  expect(event.tags).to_not include('prod')
308
308
 
@@ -90,8 +90,10 @@ describe Flapjack::Data::NotificationRule, :redis => true do
90
90
 
91
91
  it "generates a JSON string representing its data" do
92
92
  rule = existing_rule
93
- # bit of extra hackery for the inserted ID values
94
- expect(rule.to_json).to eq({:id => rule.id}.merge(rule_data).to_json)
93
+ # bit of extra hackery for the ID values
94
+ munged = {:id => rule.id}.merge(rule_data)
95
+ munged[:links] = {:contacts => [munged.delete(:contact_id)]}
96
+ expect(rule.to_jsonapi).to eq(Flapjack.dump_json(munged))
95
97
  end
96
98
 
97
99
  it "checks whether entity names match" do
@@ -18,12 +18,16 @@ describe 'Flapjack::Gateways::JSONAPI::CheckMethods', :sinatra => true, :logger
18
18
 
19
19
  it "retrieves all checks" do
20
20
  expect(entity).to receive(:id).and_return('23')
21
+ expect(entity).to receive(:name).exactly(3).times.and_return('www.example.net')
21
22
 
22
- expect(entity_check).to receive(:entity).and_return(entity)
23
- expect(entity_check).to receive(:key).twice.and_return('PING')
23
+ expect(Flapjack::Data::EntityCheck).to receive(:enabled_for).
24
+ with(['www.example.net:PING'], :redis => redis).and_return(['www.example.net:PING'])
25
+
26
+ expect(entity_check).to receive(:entity).exactly(3).times.and_return(entity)
27
+ expect(entity_check).to receive(:check).exactly(3).times.and_return('PING')
24
28
  expect(entity_check).to receive(:to_jsonapi).and_return(check_data.to_json)
25
- expect(Flapjack::Data::EntityCheck).to receive(:find_current).with(:redis => redis).
26
- and_return([entity_check])
29
+ expect(Flapjack::Data::EntityCheck).to receive(:all).
30
+ with(:logger => @logger, :redis => redis).and_return([entity_check])
27
31
 
28
32
  aget '/checks'
29
33
  expect(last_response).to be_ok
@@ -32,9 +36,13 @@ describe 'Flapjack::Gateways::JSONAPI::CheckMethods', :sinatra => true, :logger
32
36
 
33
37
  it "retrieves one check" do
34
38
  expect(entity).to receive(:id).and_return('23')
39
+ expect(entity).to receive(:name).exactly(3).times.and_return('www.example.net')
35
40
 
36
- expect(entity_check).to receive(:entity).and_return(entity)
37
- expect(entity_check).to receive(:key).twice.and_return('PING')
41
+ expect(Flapjack::Data::EntityCheck).to receive(:enabled_for).
42
+ with(['www.example.net:PING'], :redis => redis).and_return(['www.example.net:PING'])
43
+
44
+ expect(entity_check).to receive(:entity).exactly(3).times.and_return(entity)
45
+ expect(entity_check).to receive(:check).exactly(3).times.and_return('PING')
38
46
  expect(entity_check).to receive(:to_jsonapi).and_return(check_data.to_json)
39
47
  expect(Flapjack::Data::EntityCheck).to receive(:for_event_id).
40
48
  with('www.example.com:PING', :logger => @logger, :redis => redis).
@@ -45,22 +53,27 @@ describe 'Flapjack::Gateways::JSONAPI::CheckMethods', :sinatra => true, :logger
45
53
  expect(last_response.body).to eq({:checks => [check_data]}.to_json)
46
54
  end
47
55
 
48
- it "retrieves several entities" do
56
+ it "retrieves several checks" do
49
57
  entity_check_2 = double(Flapjack::Data::EntityCheck)
50
58
  check_data_2 = {'name' => 'SSH',
51
59
  'entity_name' => 'www.example.com'}
52
60
 
53
61
  expect(entity).to receive(:id).twice.and_return('23')
62
+ expect(entity).to receive(:name).exactly(6).times.and_return('www.example.net')
54
63
 
55
- expect(entity_check).to receive(:entity).and_return(entity)
56
- expect(entity_check).to receive(:key).twice.and_return('PING')
64
+ expect(Flapjack::Data::EntityCheck).to receive(:enabled_for).
65
+ with(['www.example.net:PING', 'www.example.net:SSH'], :redis => redis).
66
+ and_return(['www.example.net:PING', 'www.example.net:SSH'])
67
+
68
+ expect(entity_check).to receive(:entity).exactly(3).times.and_return(entity)
69
+ expect(entity_check).to receive(:check).exactly(3).times.and_return('PING')
57
70
  expect(entity_check).to receive(:to_jsonapi).and_return(check_data.to_json)
58
71
  expect(Flapjack::Data::EntityCheck).to receive(:for_event_id).
59
72
  with('www.example.com:PING', :logger => @logger, :redis => redis).
60
73
  and_return(entity_check)
61
74
 
62
- expect(entity_check_2).to receive(:entity).and_return(entity)
63
- expect(entity_check_2).to receive(:key).twice.and_return('SSH')
75
+ expect(entity_check_2).to receive(:entity).exactly(3).times.and_return(entity)
76
+ expect(entity_check_2).to receive(:check).exactly(3).times.and_return('SSH')
64
77
  expect(entity_check_2).to receive(:to_jsonapi).and_return(check_data_2.to_json)
65
78
  expect(Flapjack::Data::EntityCheck).to receive(:for_event_id).
66
79
  with('www.example.com:SSH', :logger => @logger, :redis => redis).
@@ -70,6 +83,35 @@ describe 'Flapjack::Gateways::JSONAPI::CheckMethods', :sinatra => true, :logger
70
83
  expect(last_response).to be_ok
71
84
  expect(last_response.body).to eq({:checks => [check_data, check_data_2]}.to_json)
72
85
  end
86
+ it "creates checks from a submitted list" do
87
+ checks = {'checks' =>
88
+ [
89
+ {"entity_id" => "10001",
90
+ "name" => "PING"
91
+ },
92
+ {"entity_id" => "10001",
93
+ "name" => "SSH"
94
+ }
95
+ ]
96
+ }
97
+
98
+ entity_check_2 = double(Flapjack::Data::EntityCheck)
99
+ expect(entity).to receive(:name).twice.and_return('example.com')
100
+
101
+ expect(entity_check).to receive(:entity).and_return(entity)
102
+ expect(entity_check_2).to receive(:entity).and_return(entity)
103
+
104
+ expect(entity_check).to receive(:check).and_return('PING')
105
+ expect(entity_check_2).to receive(:check).and_return('SSH')
106
+
107
+ expect(Flapjack::Data::EntityCheck).to receive(:add).twice.
108
+ and_return(entity_check, entity_check_2)
109
+
110
+ apost "/checks", checks.to_json, jsonapi_post_env
111
+ expect(last_response.status).to eq(201)
112
+ expect(last_response.headers['Location']).to eq("http://example.org/checks/example.com:PING,example.com:SSH")
113
+ expect(last_response.body).to eq('["example.com:PING","example.com:SSH"]')
114
+ end
73
115
 
74
116
  it 'disables a check' do
75
117
  expect(Flapjack::Data::Entity).to receive(:find_by_name).
@@ -83,7 +125,48 @@ describe 'Flapjack::Gateways::JSONAPI::CheckMethods', :sinatra => true, :logger
83
125
  [{:op => 'replace', :path => '/checks/0/enabled', :value => false}].to_json,
84
126
  jsonapi_patch_env
85
127
  expect(last_response.status).to eq(204)
128
+ end
129
+
130
+ it 'enables a check' do
131
+ expect(Flapjack::Data::Entity).to receive(:find_by_name).
132
+ with(entity_name, :redis => redis).and_return(entity)
133
+ expect(Flapjack::Data::EntityCheck).to receive(:for_entity).
134
+ with(entity, check, :redis => redis).and_return(entity_check)
135
+
136
+ expect(entity_check).to receive(:enable!)
137
+
138
+ apatch "/checks/#{check_esc}",
139
+ [{:op => 'replace', :path => '/checks/0/enabled', :value => true}].to_json,
140
+ jsonapi_patch_env
141
+ expect(last_response.status).to eq(204)
142
+ end
143
+
144
+ it "adds tags to a check" do
145
+ expect(Flapjack::Data::Entity).to receive(:find_by_name).
146
+ with(entity_name, :redis => redis).and_return(entity)
147
+ expect(Flapjack::Data::EntityCheck).to receive(:for_entity).
148
+ with(entity, check, :redis => redis).and_return(entity_check)
149
+
150
+ expect(entity_check).to receive(:add_tags).with('database', 'virtualised')
151
+
152
+ apatch "/checks/#{check_esc}",
153
+ [{:op => 'add', :path => '/checks/0/links/tags', :value => ['database', 'virtualised']}].to_json,
154
+ jsonapi_patch_env
155
+ expect(last_response.status).to eq(204)
156
+ end
157
+
158
+ it "removes tags from a check" do
159
+ expect(Flapjack::Data::Entity).to receive(:find_by_name).
160
+ with(entity_name, :redis => redis).and_return(entity)
161
+ expect(Flapjack::Data::EntityCheck).to receive(:for_entity).
162
+ with(entity, check, :redis => redis).and_return(entity_check)
163
+
164
+ expect(entity_check).to receive(:delete_tags).with('database')
86
165
 
166
+ apatch "/checks/#{check_esc}",
167
+ [{:op => 'remove', :path => '/checks/0/links/tags/database'}].to_json,
168
+ jsonapi_patch_env
169
+ expect(last_response.status).to eq(204)
87
170
  end
88
171
 
89
172
  it "creates an acknowledgement for an entity check" do
@@ -21,6 +21,8 @@ describe 'Flapjack::Gateways::JSONAPI::EntityMethods', :sinatra => true, :logger
21
21
 
22
22
  expect(Flapjack::Data::Entity).to receive(:contact_ids_for).
23
23
  with([entity_core['id']], :redis => redis).and_return({})
24
+ expect(Flapjack::Data::Entity).to receive(:check_ids_for).
25
+ with([entity_core['id']], :redis => redis).and_return({})
24
26
  expect(entity).to receive(:to_jsonapi).and_return(entity_core.to_json)
25
27
  expect(Flapjack::Data::Entity).to receive(:all).with(:enabled => nil, :redis => redis).
26
28
  and_return([entity])
@@ -36,6 +38,8 @@ describe 'Flapjack::Gateways::JSONAPI::EntityMethods', :sinatra => true, :logger
36
38
  expect(entity).to receive(:id).exactly(4).times.and_return(entity_core['id'])
37
39
  expect(Flapjack::Data::Entity).to receive(:contact_ids_for).
38
40
  with([entity_core['id']], :redis => redis).and_return({})
41
+ expect(Flapjack::Data::Entity).to receive(:check_ids_for).
42
+ with([entity_core['id']], :redis => redis).and_return({})
39
43
  expect(entity).to receive(:to_jsonapi).and_return(entity_core.to_json)
40
44
  expect(idless_entity).not_to receive(:to_jsonapi)
41
45
  expect(Flapjack::Data::Entity).to receive(:all).with(:enabled => nil, :redis => redis).
@@ -53,6 +57,8 @@ describe 'Flapjack::Gateways::JSONAPI::EntityMethods', :sinatra => true, :logger
53
57
 
54
58
  expect(Flapjack::Data::Entity).to receive(:contact_ids_for).
55
59
  with(['1234'], :redis => redis).and_return({})
60
+ expect(Flapjack::Data::Entity).to receive(:check_ids_for).
61
+ with(['1234'], :redis => redis).and_return({})
56
62
  expect(entity).to receive(:to_jsonapi).and_return(entity_core.to_json)
57
63
  expect(Flapjack::Data::Entity).to receive(:find_by_id).
58
64
  with('1234', :logger => @logger, :redis => redis).
@@ -73,6 +79,9 @@ describe 'Flapjack::Gateways::JSONAPI::EntityMethods', :sinatra => true, :logger
73
79
  expect(Flapjack::Data::Entity).to receive(:contact_ids_for).
74
80
  with(['1234', '5678'], :redis => redis).and_return({})
75
81
 
82
+ expect(Flapjack::Data::Entity).to receive(:check_ids_for).
83
+ with(['1234', '5678'], :redis => redis).and_return({})
84
+
76
85
  expect(entity).to receive(:id).twice.and_return('1234')
77
86
  expect(entity_2).to receive(:id).twice.and_return('5678')
78
87
 
@@ -152,6 +161,81 @@ describe 'Flapjack::Gateways::JSONAPI::EntityMethods', :sinatra => true, :logger
152
161
  expect(last_response.status).to eq(204)
153
162
  end
154
163
 
164
+ it "adds tags to an entity" do
165
+ expect(Flapjack::Data::Entity).to receive(:find_by_id).
166
+ with('1234', :redis => redis).and_return(entity)
167
+
168
+ expect(entity).to receive(:add_tags).with('database')
169
+
170
+ apatch "/entities/1234",
171
+ [{:op => 'add', :path => '/entities/0/links/tags', :value => 'database'}].to_json,
172
+ jsonapi_patch_env
173
+ expect(last_response.status).to eq(204)
174
+ end
175
+
176
+ it "removes tags from an entity" do
177
+ expect(Flapjack::Data::Entity).to receive(:find_by_id).
178
+ with('1234', :redis => redis).and_return(entity)
179
+
180
+ expect(entity).to receive(:delete_tags).with('database')
181
+ expect(entity).to receive(:delete_tags).with('virtualised')
182
+
183
+ apatch "/entities/1234",
184
+ [{:op => 'remove', :path => '/entities/0/links/tags/database'},
185
+ {:op => 'remove', :path => '/entities/0/links/tags/virtualised'}].to_json,
186
+ jsonapi_patch_env
187
+ expect(last_response.status).to eq(204)
188
+ end
189
+
190
+ it "renames an entity when an entity with the new name doesn't exist" do
191
+ expect(entity).to receive(:name).and_return('example.com')
192
+ expect(Flapjack::Data::Entity).to receive(:find_by_id).
193
+ with('1234', :redis => redis).and_return(entity)
194
+
195
+ expect(Flapjack::Data::Entity).to receive(:find_by_name).
196
+ with('example2.com', :redis => redis).and_return(nil)
197
+
198
+ expect(Flapjack::Data::Entity).to receive(:rename).
199
+ with('example.com', 'example2.com', :redis => redis)
200
+
201
+ apatch "/entities/1234",
202
+ [{:op => 'replace', :path => '/entities/0/name', :value => 'example2.com'}].to_json,
203
+ jsonapi_patch_env
204
+ expect(last_response.status).to eq(204)
205
+ end
206
+
207
+ it "merges an entity when an entity with the new name exists" do
208
+ expect(entity).to receive(:name).and_return('example.com')
209
+ expect(Flapjack::Data::Entity).to receive(:find_by_id).
210
+ with('1234', :redis => redis).and_return(entity)
211
+
212
+ expect(Flapjack::Data::Entity).to receive(:find_by_name).
213
+ with('example2.com', :redis => redis).and_return(double(Flapjack::Data::Entity))
214
+
215
+ expect(Flapjack::Data::Entity).to receive(:merge).
216
+ with('example.com', 'example2.com', :redis => redis)
217
+
218
+ apatch "/entities/1234",
219
+ [{:op => 'replace', :path => '/entities/0/name', :value => 'example2.com'}].to_json,
220
+ jsonapi_patch_env
221
+ expect(last_response.status).to eq(204)
222
+ end
223
+
224
+ it 'skips a rename if old and new names are the same' do
225
+ expect(entity).to receive(:name).and_return('example.com')
226
+ expect(Flapjack::Data::Entity).to receive(:find_by_id).
227
+ with('1234', :redis => redis).and_return(entity)
228
+
229
+ expect(Flapjack::Data::Entity).not_to receive(:find_by_name)
230
+ expect(Flapjack::Data::Entity).not_to receive(:rename)
231
+
232
+ apatch "/entities/1234",
233
+ [{:op => 'replace', :path => '/entities/0/name', :value => 'example.com'}].to_json,
234
+
235
+ jsonapi_patch_env
236
+ expect(last_response.status).to eq(204)
237
+ end
238
+
155
239
  it "creates acknowledgements for all checks on an entity" do
156
240
  expect(entity).to receive(:check_list).and_return([check])
157
241
  expect(Flapjack::Data::Entity).to receive(:find_by_id).