arborist 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,8 +27,10 @@ describe Arborist::Event::Node do
27
27
 
28
28
 
29
29
  it "serializes with useful metadata attached" do
30
- expect( event.to_h ).to include( :identifier, :parent, :nodetype )
30
+ expect( event.to_h ).to include( :identifier, :parent, :nodetype, :flapping )
31
31
  expect( event.to_h[:nodetype] ).to eq( 'testnode' )
32
+ expect( event.to_h[:parent] ).to eq( 'bar' )
33
+ expect( event.to_h[:flapping] ).to eq( false )
32
34
  end
33
35
 
34
36
 
@@ -60,5 +60,15 @@ describe Arborist::Event do
60
60
 
61
61
  end
62
62
 
63
+
64
+ describe "meta/informational predicate" do
65
+
66
+ it "returns false" do
67
+ event = described_class.new( 'chunky' => 'meat' )
68
+ expect( event ).to_not be_informational
69
+ end
70
+
71
+ end
72
+
63
73
  end
64
74
 
@@ -685,7 +685,7 @@ describe Arborist::Manager do
685
685
  msg.send_to( sock )
686
686
  resmsg = sock.receive
687
687
 
688
- hdr, body = Arborist::TreeAPI.decode( resmsg )
688
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
689
689
  expect( hdr ).to include( 'success' => true )
690
690
  end
691
691
 
@@ -694,7 +694,7 @@ describe Arborist::Manager do
694
694
  msg.send_to( sock )
695
695
  resmsg = sock.receive
696
696
 
697
- hdr, body = Arborist::TreeAPI.decode( resmsg )
697
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
698
698
  expect( hdr ).to include( 'success' => false )
699
699
  expect( hdr['reason'] ).to match( /respond to #each/ )
700
700
  end
@@ -715,8 +715,6 @@ describe Arborist::Manager do
715
715
  )
716
716
  hdr, body = Arborist::TreeAPI.decode( resmsg )
717
717
 
718
- sub_id = manager.subscriptions.keys.first
719
-
720
718
  expect( hdr ).to include( 'success' => true )
721
719
  expect( body ).to be_a( Hash )
722
720
  expect( body ).to include( 'id' )
@@ -753,7 +751,7 @@ describe Arborist::Manager do
753
751
  }.to change { manager.subscriptions.length }.by( 1 ).and(
754
752
  change { manager.root.subscriptions.length }.by( 1 )
755
753
  )
756
- hdr, body = Arborist::TreeAPI.decode( resmsg )
754
+ _hdr, body = Arborist::TreeAPI.decode( resmsg )
757
755
  node = manager.subscriptions[ body['id'] ]
758
756
  sub = node.subscriptions[ body['id'] ]
759
757
 
@@ -773,7 +771,7 @@ describe Arborist::Manager do
773
771
  }.to change { manager.subscriptions.length }.by( 1 ).and(
774
772
  change { manager.root.subscriptions.length }.by( 1 )
775
773
  )
776
- hdr, body = Arborist::TreeAPI.decode( resmsg )
774
+ _hdr, body = Arborist::TreeAPI.decode( resmsg )
777
775
  expect( body ).to be_a( Hash ).and( include('id') )
778
776
  node = manager.subscriptions[ body['id'] ]
779
777
  sub = node.subscriptions[ body['id'] ]
@@ -795,7 +793,7 @@ describe Arborist::Manager do
795
793
  }.to change { manager.subscriptions.length }.by( 1 ).and(
796
794
  change { manager.root.subscriptions.length }.by( 1 )
797
795
  )
798
- hdr, body = Arborist::TreeAPI.decode( resmsg )
796
+ _hdr, body = Arborist::TreeAPI.decode( resmsg )
799
797
  expect( body ).to be_a( Hash ).and( include('id') )
800
798
  node = manager.subscriptions[ body['id'] ]
801
799
  sub = node.subscriptions[ body['id'] ]
@@ -824,7 +822,7 @@ describe Arborist::Manager do
824
822
  }.to change { manager.subscriptions.length }.by( -1 ).and(
825
823
  change { manager.root.subscriptions.length }.by( -1 )
826
824
  )
827
- hdr, body = Arborist::TreeAPI.decode( resmsg )
825
+ _hdr, body = Arborist::TreeAPI.decode( resmsg )
828
826
 
829
827
  expect( body ).to include( 'event_type' => 'node.delta', 'criteria' => {'type' => 'host'} )
830
828
  end
@@ -838,7 +836,7 @@ describe Arborist::Manager do
838
836
  msg.send_to( sock )
839
837
  resmsg = sock.receive
840
838
  }.to_not change { manager.subscriptions.length }
841
- hdr, body = Arborist::TreeAPI.decode( resmsg )
839
+ _hdr, body = Arborist::TreeAPI.decode( resmsg )
842
840
 
843
841
  expect( body ).to be_nil
844
842
  end
@@ -891,7 +889,7 @@ describe Arborist::Manager do
891
889
  msg.send_to( sock )
892
890
  resmsg = sock.receive
893
891
 
894
- hdr, body = Arborist::TreeAPI.decode( resmsg )
892
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
895
893
  expect( hdr ).to include( 'success' => false )
896
894
  expect( hdr['reason'] ).to match( /no identifier/i )
897
895
  end
@@ -1000,7 +998,7 @@ describe Arborist::Manager do
1000
998
  msg.send_to( sock )
1001
999
  resmsg = sock.receive
1002
1000
 
1003
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1001
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1004
1002
  expect( hdr ).to include( 'success' => false )
1005
1003
  expect( hdr['reason'] ).to match( /no host given/i )
1006
1004
  end
@@ -1016,7 +1014,7 @@ describe Arborist::Manager do
1016
1014
  msg.send_to( sock )
1017
1015
  resmsg = sock.receive
1018
1016
 
1019
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1017
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1020
1018
  expect( hdr ).to include( 'success' => false )
1021
1019
  expect( hdr['reason'] ).to match( /exists/i )
1022
1020
  end
@@ -1038,7 +1036,7 @@ describe Arborist::Manager do
1038
1036
  msg.send_to( sock )
1039
1037
  resmsg = sock.receive
1040
1038
 
1041
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1039
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1042
1040
  expect( hdr ).to include( 'success' => true )
1043
1041
 
1044
1042
  node = manager.nodes[ 'sidonie' ]
@@ -1061,7 +1059,7 @@ describe Arborist::Manager do
1061
1059
  msg.send_to( sock )
1062
1060
  resmsg = sock.receive
1063
1061
 
1064
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1062
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1065
1063
  expect( hdr ).to include( 'success' => true )
1066
1064
 
1067
1065
  expect( manager.nodes['sidonie'] ).to be_an( Arborist::Node )
@@ -1081,7 +1079,7 @@ describe Arborist::Manager do
1081
1079
  msg.send_to( sock )
1082
1080
  resmsg = sock.receive
1083
1081
 
1084
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1082
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1085
1083
  expect( hdr ).to include( 'success' => false )
1086
1084
  expect( manager.nodes['_'].identifier ).to eq( '_' )
1087
1085
  end
@@ -1099,7 +1097,7 @@ describe Arborist::Manager do
1099
1097
  msg.send_to( sock )
1100
1098
  resmsg = sock.receive
1101
1099
 
1102
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1100
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1103
1101
  expect( hdr ).to include( 'success' => false )
1104
1102
  end
1105
1103
 
@@ -1121,7 +1119,7 @@ describe Arborist::Manager do
1121
1119
  msg.send_to( sock )
1122
1120
  resmsg = sock.receive
1123
1121
 
1124
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1122
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1125
1123
  expect( hdr ).to include( 'success' => true )
1126
1124
 
1127
1125
  new_parent = manager.nodes[ 'yevaud' ]
@@ -1178,7 +1176,7 @@ describe Arborist::Manager do
1178
1176
  msg.send_to( sock )
1179
1177
  resmsg = sock.receive
1180
1178
 
1181
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1179
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1182
1180
  expect( hdr ).to include( 'success' => false )
1183
1181
  expect( hdr['reason'] ).to match( /no such node/i )
1184
1182
  end
@@ -1189,7 +1187,7 @@ describe Arborist::Manager do
1189
1187
  msg.send_to( sock )
1190
1188
  resmsg = sock.receive
1191
1189
 
1192
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1190
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1193
1191
  expect( hdr ).to include( 'success' => false )
1194
1192
  expect( hdr['reason'] ).to match( /no identifier/i )
1195
1193
  end
@@ -1203,7 +1201,7 @@ describe Arborist::Manager do
1203
1201
  msg.send_to( sock )
1204
1202
  resmsg = sock.receive
1205
1203
 
1206
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1204
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1207
1205
  expect( hdr ).to include( 'success' => false )
1208
1206
  expect( hdr['reason'] ).to match( /missing required ack sender/i )
1209
1207
  end
@@ -1245,7 +1243,7 @@ describe Arborist::Manager do
1245
1243
  msg.send_to( sock )
1246
1244
  resmsg = sock.receive
1247
1245
 
1248
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1246
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1249
1247
  expect( hdr ).to include( 'success' => false )
1250
1248
  expect( hdr['reason'] ).to match( /no such/i )
1251
1249
  end
@@ -1256,7 +1254,7 @@ describe Arborist::Manager do
1256
1254
  msg.send_to( sock )
1257
1255
  resmsg = sock.receive
1258
1256
 
1259
- hdr, body = Arborist::TreeAPI.decode( resmsg )
1257
+ hdr, _body = Arborist::TreeAPI.decode( resmsg )
1260
1258
  expect( hdr ).to include( 'success' => false )
1261
1259
  expect( hdr['reason'] ).to match( /no identifier/i )
1262
1260
  end
@@ -12,7 +12,9 @@ describe Arborist, "mixins" do
12
12
  describe Arborist::MethodUtilities, 'used to extend a class' do
13
13
 
14
14
  let!( :extended_class ) do
15
- klass = Class.new
15
+ klass = Class.new do
16
+ def initialize; @foo = nil; end
17
+ end
16
18
  klass.extend( Arborist::MethodUtilities )
17
19
  klass
18
20
  end
@@ -27,6 +27,16 @@ describe Arborist::Node do
27
27
  let( :identifier2 ) { 'the_other_identifier' }
28
28
 
29
29
 
30
+ ### Suppress $VERBOSE warnings for the duration of a block
31
+ def with_warnings_suppressed
32
+ oldwarn = $VERBOSE
33
+ $VERBOSE = nil
34
+ yield
35
+ ensure
36
+ $VERBOSE = oldwarn
37
+ end
38
+
39
+
30
40
  shared_examples_for "a reachable node" do
31
41
 
32
42
  it "is still 'reachable'" do
@@ -114,11 +124,12 @@ describe Arborist::Node do
114
124
  expect( subnode_class.parent_types ).to include( concrete_class )
115
125
  end
116
126
 
117
-
118
127
  it "can be constructed via a factory method on instances of their parent type" do
119
- subnode_class = Class.new( described_class ) do
120
- def self::name; "TestSubNode"; end
121
- def self::plugin_name; "testsub"; end
128
+ subnode_class = with_warnings_suppressed do
129
+ Class.new( described_class ) do
130
+ def self::name; "TestSubNode"; end
131
+ def self::plugin_name; "testsub"; end
132
+ end
122
133
  end
123
134
  described_class.derivatives['testsub'] = subnode_class
124
135
 
@@ -133,17 +144,19 @@ describe Arborist::Node do
133
144
 
134
145
 
135
146
  it "can pre-process the factory method arguments" do
136
- subnode_class = Class.new( described_class ) do
137
- def self::name; "TestSubNode"; end
138
- def self::plugin_name; "testsub"; end
139
- def args( new_args=nil )
140
- @args = new_args if new_args
141
- return @args
142
- end
143
- def modify( attributes )
144
- attributes = stringify_keys( attributes )
145
- super
146
- self.args( attributes['args'] )
147
+ subnode_class = with_warnings_suppressed do
148
+ Class.new( described_class ) do
149
+ def self::name; "TestSubNode"; end
150
+ def self::plugin_name; "testsub"; end
151
+ def args( new_args=nil )
152
+ @args = new_args if new_args
153
+ return @args
154
+ end
155
+ def modify( attributes )
156
+ attributes = stringify_keys( attributes )
157
+ super
158
+ self.args( attributes['args'] )
159
+ end
147
160
  end
148
161
  end
149
162
  described_class.derivatives['testsub'] = subnode_class
@@ -253,6 +266,36 @@ describe Arborist::Node do
253
266
  end
254
267
 
255
268
 
269
+ it "stores a history of its status" do
270
+ node.status_history_size( 3 )
271
+
272
+ node.update( {} )
273
+ node.update( {} )
274
+ node.update( { warning: 'whoopsie' } )
275
+ node.update( {} )
276
+
277
+ expect( node.status_history ).to eq( ['up', 'warn', 'up'] )
278
+ end
279
+
280
+
281
+ it "knows if its status is transitioning frequently" do
282
+ node.status_history_size( 10 )
283
+ node.flap_threshold( 3 )
284
+
285
+ 7.times{ node.update( {} ) }
286
+ node.update( { error: 'boooM!' } )
287
+ node.update( { warning: 'whoopsie' } )
288
+ node.update( {} )
289
+
290
+ expect( node ).to be_flapping
291
+
292
+ node.flap_threshold( 4 )
293
+ node.update( {} )
294
+
295
+ expect( node ).to_not be_flapping
296
+ end
297
+
298
+
256
299
  it "groups errors from separate monitors by their key" do
257
300
  expect( node ).to be_unknown
258
301
 
@@ -374,6 +417,17 @@ describe Arborist::Node do
374
417
  }.to change { node.status }.from( 'up' ).to( 'quieted' )
375
418
  end
376
419
 
420
+
421
+ it "records its transition to quieted in its status history" do
422
+ node.status_history_size( 3 )
423
+ down_event = Arborist::Event.create( :node_down, parent_node )
424
+
425
+ expect( node.status ).to eq( 'up' )
426
+ node.handle_event( down_event )
427
+ expect( node.status ).to eq( 'quieted' )
428
+
429
+ expect( node.status_history ).to eq( ['quieted'] )
430
+ end
377
431
  end
378
432
 
379
433
 
@@ -795,12 +849,16 @@ describe Arborist::Node do
795
849
  )
796
850
  old_node.last_contacted = Time.now - 28
797
851
  old_node.dependencies.mark_down( 'svchost-postgres' )
852
+ old_node.status_history << 'up'
853
+ old_node.flapping = true
798
854
 
799
855
  node.restore( old_node )
800
856
 
801
857
  expect( node.status ).to eq( old_node.status )
802
858
  expect( node.status_changed ).to eq( old_node.status_changed )
803
859
  expect( node.status_last_changed ).to eq( old_node.status_last_changed )
860
+ expect( node.status_history ).to eq( old_node.status_history )
861
+ expect( node.flapping? ).to eq( old_node.flapping? )
804
862
  expect( node.errors ).to eq( old_node.errors )
805
863
  expect( node.ack ).to eq( old_node.ack )
806
864
  expect( node.properties ).to include( old_node.properties )
@@ -873,6 +931,8 @@ describe Arborist::Node do
873
931
  expect( result[:errors] ).to be_empty
874
932
  expect( result[:dependencies] ).to be_a( Hash )
875
933
  expect( result[:quieted_reasons] ).to be_a( Hash )
934
+ expect( result[:status_history] ).to eq( node.status_history )
935
+ expect( result[:flapping] ).to eq( node.flapping? )
876
936
 
877
937
  expect( result[:children] ).to be_empty
878
938
  end
@@ -1147,7 +1207,7 @@ describe Arborist::Node do
1147
1207
  describe "matching" do
1148
1208
 
1149
1209
  let( :concrete_class ) do
1150
- cls = Class.new( described_class ) do
1210
+ Class.new( described_class ) do
1151
1211
  def self::name; "TestNode"; end
1152
1212
  end
1153
1213
  end
@@ -77,6 +77,31 @@ describe Arborist::Observer::Action do
77
77
 
78
78
  end
79
79
 
80
+ context "ignoring flapping nodes" do
81
+
82
+ before( :each ) do
83
+ @call_count = 0
84
+ @last_call_arguments = nil
85
+ end
86
+
87
+ let( :action ) do
88
+ described_class.new( ignore_flapping: true ) do |args|
89
+ @call_count += 1
90
+ @last_call_arguments = args
91
+ end
92
+ end
93
+
94
+ let( :flapping_event ) { { 'flapping' => true } }
95
+
96
+ it "calls its block if the event is generated by a node that is not flapping" do
97
+ expect { action.handle_event(event) }.to change { @call_count }.by( 1 )
98
+ end
99
+
100
+ it "doesn't call its block if the event is generated by a flapping node" do
101
+ expect { action.handle_event(flapping_event) }.to_not change { @call_count }
102
+ end
103
+ end
104
+
80
105
 
81
106
  # within: 0, after: 1, during: nil
82
107
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arborist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -11,32 +11,27 @@ bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
28
- 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
- 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
- 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
- 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
- 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
- MaTVMjsHqJUwU2xVfhGtxGAWAer5S1HGYHkbio6mGVtiie0uWjmnzi7ppIlMr48a
34
- 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
- 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
- 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
- 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
32
+ UrSf3b+cPoC8PNfjp8zsdw==
38
33
  -----END CERTIFICATE-----
39
- date: 2018-08-29 00:00:00.000000000 Z
34
+ date: 2018-11-21 00:00:00.000000000 Z
40
35
  dependencies:
41
36
  - !ruby/object:Gem::Dependency
42
37
  name: schedulability
@@ -44,14 +39,14 @@ dependencies:
44
39
  requirements:
45
40
  - - "~>"
46
41
  - !ruby/object:Gem::Version
47
- version: '0.1'
42
+ version: '0.4'
48
43
  type: :runtime
49
44
  prerelease: false
50
45
  version_requirements: !ruby/object:Gem::Requirement
51
46
  requirements:
52
47
  - - "~>"
53
48
  - !ruby/object:Gem::Version
54
- version: '0.1'
49
+ version: '0.4'
55
50
  - !ruby/object:Gem::Dependency
56
51
  name: loggability
57
52
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +221,14 @@ dependencies:
226
221
  requirements:
227
222
  - - "~>"
228
223
  - !ruby/object:Gem::Version
229
- version: '0.9'
224
+ version: '0.10'
230
225
  type: :development
231
226
  prerelease: false
232
227
  version_requirements: !ruby/object:Gem::Requirement
233
228
  requirements:
234
229
  - - "~>"
235
230
  - !ruby/object:Gem::Version
236
- version: '0.9'
231
+ version: '0.10'
237
232
  - !ruby/object:Gem::Dependency
238
233
  name: hoe-highline
239
234
  requirement: !ruby/object:Gem::Requirement
@@ -338,14 +333,14 @@ dependencies:
338
333
  requirements:
339
334
  - - "~>"
340
335
  - !ruby/object:Gem::Version
341
- version: '3.16'
336
+ version: '3.17'
342
337
  type: :development
343
338
  prerelease: false
344
339
  version_requirements: !ruby/object:Gem::Requirement
345
340
  requirements:
346
341
  - - "~>"
347
342
  - !ruby/object:Gem::Version
348
- version: '3.16'
343
+ version: '3.17'
349
344
  description: |-
350
345
  Arborist is a monitoring toolkit that follows the UNIX philosophy
351
346
  of small parts and loose coupling for stability, reliability, and