langrove 0.0.4.5 → 0.0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. data/.rvmrc +29 -38
  2. data/Gemfile +13 -7
  3. data/Gemfile.lock +35 -32
  4. data/Guardfile +11 -0
  5. data/README.md +34 -0
  6. data/Rakefile +8 -6
  7. data/bin/README.md +3 -0
  8. data/bin/langrove +1 -2
  9. data/langrove.gemspec +35 -0
  10. data/lib/langrove/README.md +82 -0
  11. data/lib/langrove/adaptor/README.md +92 -0
  12. data/lib/langrove/adaptor/adaptor_base.rb +123 -0
  13. data/lib/langrove/adaptor/base.rb +12 -2
  14. data/lib/langrove/adaptor/default.rb +8 -0
  15. data/lib/langrove/adaptor/event_machine_adaptor.rb +152 -0
  16. data/lib/langrove/adaptor/query_adaptor.rb +271 -0
  17. data/lib/langrove/behaviour/README.md +170 -0
  18. data/lib/langrove/behaviour/assessable.rb +63 -0
  19. data/lib/langrove/behaviour/base.rb +16 -0
  20. data/lib/langrove/behaviour/behaviour_base.rb +341 -0
  21. data/lib/langrove/behaviour/enqueueable.rb +104 -0
  22. data/lib/langrove/behaviour/notifiable.rb +48 -0
  23. data/lib/langrove/behaviour/persistable.rb +89 -0
  24. data/lib/langrove/behaviour/preloadable.rb +63 -0
  25. data/lib/langrove/daemon/README.md +7 -0
  26. data/lib/langrove/daemon/base.rb +9 -2
  27. data/lib/langrove/daemon/daemon_base.rb +330 -0
  28. data/lib/langrove/daemon/default.rb +3 -0
  29. data/lib/langrove/ext/README.md +48 -0
  30. data/lib/langrove/ext/class_loader.rb +9 -66
  31. data/lib/langrove/ext/config_item.rb +31 -23
  32. data/lib/langrove/ext/config_loader.rb +42 -8
  33. data/lib/langrove/ext/fake_config.rb +121 -0
  34. data/lib/langrove/ext/fake_logger.rb +50 -7
  35. data/lib/langrove/ext/fake_root.rb +38 -0
  36. data/lib/langrove/ext/hash.rb +56 -0
  37. data/lib/langrove/ext/i.rb +43 -0
  38. data/lib/langrove/ext/log_monitor.rb +272 -0
  39. data/lib/langrove/ext/module_loader.rb +52 -0
  40. data/lib/langrove/ext/recursive_string.rb +94 -0
  41. data/lib/langrove/ext/spec_helper.rb +84 -0
  42. data/lib/langrove/ext.rb +8 -2
  43. data/lib/langrove/handler/README.md +161 -0
  44. data/lib/langrove/handler/base.rb +29 -2
  45. data/lib/langrove/handler/default.rb +4 -0
  46. data/lib/langrove/handler/deferred.rb +105 -0
  47. data/lib/langrove/handler/handler_base.rb +242 -0
  48. data/lib/langrove/handler/http_servlet.rb +58 -0
  49. data/lib/langrove/handler/socket.rb +21 -0
  50. data/lib/langrove/handler/socket_base.rb +127 -0
  51. data/lib/langrove/handler/socket_multiplexer.rb +438 -0
  52. data/lib/langrove/handler/web_socket.rb +41 -0
  53. data/lib/langrove/plugin/README.md +76 -0
  54. data/lib/langrove/plugin/assessor.rb +363 -0
  55. data/lib/langrove/plugin/base.rb +18 -0
  56. data/lib/langrove/plugin/buffered_persistor.rb +97 -0
  57. data/lib/langrove/plugin/enqueuer.rb +186 -0
  58. data/lib/langrove/plugin/notifier.rb +144 -0
  59. data/lib/langrove/plugin/persistor.rb +360 -0
  60. data/lib/langrove/plugin/plugin_base.rb +79 -0
  61. data/lib/langrove/plugin/yaml_file.md +5 -0
  62. data/lib/langrove/plugin/yaml_file.rb +261 -0
  63. data/lib/langrove/protocol/README.md +102 -0
  64. data/lib/langrove/protocol/base.rb +10 -2
  65. data/lib/langrove/protocol/default.rb +3 -0
  66. data/lib/langrove/protocol/protocol_base.rb +60 -0
  67. data/lib/langrove/protocol/syslog.rb +34 -27
  68. data/lib/langrove/root/README.md +17 -0
  69. data/lib/langrove/root/base.rb +11 -0
  70. data/lib/langrove/root/config.rb +163 -0
  71. data/lib/langrove/root/root_base.rb +259 -0
  72. data/lib/langrove/server/README.md +7 -0
  73. data/lib/langrove/server/base.rb +9 -0
  74. data/lib/langrove/server/default.rb +3 -0
  75. data/lib/langrove/server/server_base.rb +301 -0
  76. data/lib/langrove/version.rb +3 -1
  77. data/lib/langrove.rb +44 -1
  78. data/spec/langrove/adaptor/adaptor_base_spec.rb +33 -0
  79. data/spec/langrove/adaptor/event_machine_adaptor_spec.rb +62 -0
  80. data/spec/langrove/adaptor/query_adaptor_spec.rb +94 -0
  81. data/spec/langrove/behaviour/assessable_spec.rb +42 -0
  82. data/spec/langrove/behaviour/behaviour_base_spec.rb +396 -0
  83. data/spec/langrove/behaviour/enqueueable_spec.rb +19 -0
  84. data/spec/langrove/behaviour/notifiable_spec.rb +6 -0
  85. data/spec/langrove/behaviour/persistable_spec.rb +19 -0
  86. data/spec/langrove/behaviour/preloadable_spec.rb +19 -0
  87. data/spec/langrove/daemon/base_spec.rb +6 -0
  88. data/spec/langrove/daemon/daemon_base_spec.rb +253 -0
  89. data/spec/langrove/ext/class_loader_spec.rb +9 -12
  90. data/spec/langrove/ext/fake_config_spec.rb +50 -0
  91. data/spec/langrove/ext/fake_logger_spec.rb +12 -0
  92. data/spec/langrove/ext/fake_root_spec.rb +19 -0
  93. data/spec/langrove/ext/hash_spec.rb +54 -0
  94. data/spec/langrove/ext/i_spec.rb +11 -0
  95. data/spec/langrove/ext/log_monitor_spec.rb +254 -0
  96. data/spec/langrove/ext/module_loader_spec.rb +70 -0
  97. data/spec/langrove/ext/recursive_string_spec.rb +132 -0
  98. data/{functional/config/environments/development.rb → spec/langrove/ext/spec_helper_spec.rb} +0 -0
  99. data/spec/langrove/handler/deferred_spec.rb +9 -0
  100. data/spec/langrove/handler/handler_base_spec.rb +134 -0
  101. data/spec/langrove/handler/socket_base_spec.rb +76 -0
  102. data/spec/langrove/handler/socket_multiplexer_spec.rb +480 -0
  103. data/spec/langrove/handler/socket_spec.rb +6 -0
  104. data/spec/langrove/handler/web_socket_spec.rb +19 -0
  105. data/spec/langrove/plugin/assessor_spec.rb +278 -0
  106. data/spec/langrove/plugin/buffered_persistor_spec.rb +94 -0
  107. data/spec/langrove/plugin/enqueuer_spec.rb +136 -0
  108. data/spec/langrove/plugin/notifier_spec.rb +107 -0
  109. data/spec/langrove/plugin/persistor_spec.rb +300 -0
  110. data/spec/langrove/plugin/plugin_base_spec.rb +86 -0
  111. data/spec/langrove/plugin/yaml_file_spec.rb +348 -0
  112. data/spec/langrove/protocol/protocol_base_spec.rb +19 -0
  113. data/spec/langrove/protocol/syslog_spec.rb +5 -2
  114. data/spec/langrove/root/config_spec.rb +103 -0
  115. data/spec/langrove/root/root_base_spec.rb +93 -0
  116. data/spec/langrove/server/server_base_spec.rb +414 -0
  117. data/spec/spec_helper.rb +38 -0
  118. metadata +157 -92
  119. data/.watchr +0 -27
  120. data/functional/config/boot.rb +0 -64
  121. data/functional/config/daemons.yml +0 -13
  122. data/functional/config/environment.rb +0 -28
  123. data/functional/config/environments/production.rb +0 -0
  124. data/functional/config/environments/test.rb +0 -0
  125. data/functional/lib/client/socket_to_file.rb +0 -47
  126. data/functional/lib/daemon/datagram.rb +0 -21
  127. data/functional/lib/protocol/socket_to_file.rb +0 -55
  128. data/functional/libexec/daemon.rb +0 -68
  129. data/functional/tmp/README +0 -1
  130. data/lib/langrove/_base.rb +0 -28
  131. data/lib/langrove/adaptor_base.rb +0 -116
  132. data/lib/langrove/client/base.rb +0 -2
  133. data/lib/langrove/client/datagram.rb +0 -25
  134. data/lib/langrove/client_base.rb +0 -92
  135. data/lib/langrove/daemon_base.rb +0 -281
  136. data/lib/langrove/ext/find.rb +0 -90
  137. data/lib/langrove/ext/persistable.rb +0 -103
  138. data/lib/langrove/handler_base.rb +0 -148
  139. data/lib/langrove/job/base.rb +0 -1
  140. data/lib/langrove/job_base.rb +0 -24
  141. data/lib/langrove/protocol_base.rb +0 -32
  142. data/spec/functional/daemon/datagram_spec.rb +0 -121
  143. data/spec/langrove/adaptor_base_spec.rb +0 -63
  144. data/spec/langrove/client/datagram_spec.rb +0 -1
  145. data/spec/langrove/client_base_spec.rb +0 -5
  146. data/spec/langrove/daemon_base_spec.rb +0 -154
  147. data/spec/langrove/ext/find_spec.rb +0 -53
  148. data/spec/langrove/ext/persistable_spec.rb +0 -117
  149. data/spec/langrove/handler_base_spec.rb +0 -103
  150. data/spec/langrove/job_base_spec.rb +0 -28
  151. data/spec/langrove/protocol_base_spec.rb +0 -6
  152. data/spec/todo_spec.rb +0 -12
  153. data/tmp/README +0 -2
@@ -0,0 +1,278 @@
1
+ require 'spec_helper'
2
+
3
+ ASSESSES = {}
4
+
5
+ describe LanGrove::Plugin::Assessor do
6
+
7
+ before :each do
8
+
9
+ CONFIG.plugins[:previous_state] = {
10
+ :class => 'Persistor',
11
+ :key => {
12
+ :uniq => :uniq
13
+ }
14
+ }
15
+
16
+ CONFIG.plugins[:assessor_plugin] = {
17
+ :class => 'Assessor',
18
+ :plugin => :previous_state,
19
+ :assess => ASSESSES
20
+ }
21
+
22
+ end
23
+
24
+ subject {
25
+
26
+ LanGrove::Plugin::Assessor.new( ROOT, CONFIG.plugins[:assessor_plugin], nil )
27
+
28
+ }
29
+
30
+ it 'ensures a nested persistor in config' do
31
+
32
+ expect {
33
+
34
+ LanGrove::Plugin::Assessor.new( ROOT, {}, nil )
35
+
36
+ }.to raise_error(
37
+
38
+ LanGrove::DaemonConfigException,
39
+
40
+ /requires a nested Persistor :plugin:/
41
+
42
+ )
43
+
44
+ end
45
+
46
+ it 'ensures an :assess: subconfig' do
47
+
48
+ CONFIG.plugins[:assessor_plugin].delete( :assess )
49
+
50
+ expect {
51
+
52
+ LanGrove::Plugin::Assessor.new( ROOT, CONFIG.plugins[:assessor_plugin], nil )
53
+
54
+ }.to raise_error(
55
+
56
+ LanGrove::DaemonConfigException,
57
+
58
+ /requires :assess: subconfig/
59
+
60
+ )
61
+
62
+ end
63
+
64
+ it 'loads the nested persistor' do
65
+
66
+ subject.persistor.should be_a( LanGrove::Plugin::Persistor )
67
+
68
+ end
69
+
70
+ context 'collects the previously collated capsule' do
71
+
72
+ before :each do
73
+
74
+ @handler = mock( 'handler' )
75
+ @key = { 'key' => { :uniq => 'value' } }
76
+
77
+ @handler.should_receive(
78
+
79
+ :key
80
+
81
+ ).twice.and_return(
82
+
83
+ @key
84
+
85
+ )
86
+
87
+ @handler.should_receive(
88
+
89
+ :capsule
90
+
91
+ ).twice
92
+
93
+ end
94
+
95
+ it 'yields changes and then stores the new state' do
96
+
97
+ subject.persistor.should_receive(
98
+
99
+ :fetch
100
+
101
+ ).with(
102
+
103
+ be_a( LanGrove::Plugin::Handler )
104
+
105
+ ).and_return(
106
+
107
+ true
108
+
109
+ )
110
+
111
+ subject.should_receive(
112
+
113
+ :each_change
114
+
115
+ )
116
+
117
+ subject.persistor.should_receive(
118
+
119
+ :store
120
+
121
+ )
122
+
123
+ subject.assess( @handler )
124
+
125
+ end
126
+
127
+ end
128
+
129
+ context 'yields presence state changes' do
130
+
131
+ before :each do
132
+
133
+ ASSESSES['thing'] = :present
134
+
135
+ @new = {}
136
+ @old = {}
137
+
138
+ end
139
+
140
+ it 'with :on' do
141
+
142
+ @new['thing'] = 2
143
+
144
+ key = nil
145
+ state = nil
146
+ value = nil
147
+
148
+ subject.each_change( @old, @new ) do |k, s, v|
149
+
150
+ key, state, value = k, s, v
151
+
152
+ end
153
+
154
+ key.should == 'thing'
155
+ state.should == :on
156
+ value.should == 2
157
+
158
+ end
159
+
160
+ it 'with :repeat' do
161
+
162
+ @new['nested'] = { 'thing' => 3 }
163
+ @old['nested'] = { 'thing' => 1 }
164
+
165
+ key = nil
166
+ state = nil
167
+ value = nil
168
+ delta = nil
169
+
170
+ subject.each_change( @old, @new ) do |k, s, v, d|
171
+
172
+ key, state, value, delta = k, s, v, d
173
+
174
+ end
175
+
176
+ key.should == 'thing'
177
+ state.should == :repeat
178
+ value.should == 3
179
+ delta.should == 2
180
+
181
+ end
182
+
183
+ it 'with :off' do
184
+
185
+ @old['nested'] = { 'thing' => 3 }
186
+
187
+ key = nil
188
+ state = nil
189
+ value = nil
190
+
191
+ subject.each_change( @old, @new ) do |k, s, v|
192
+
193
+ key, state, value = k, s, v
194
+
195
+ end
196
+
197
+ key.should == 'thing'
198
+ state.should == :off
199
+ value.should == nil
200
+
201
+ end
202
+
203
+ end
204
+
205
+ context 'yields all nested presence state changes from subkeys of a match' do
206
+
207
+ before :each do
208
+
209
+ ASSESSES['known_errors'] = :present
210
+
211
+ @new = {}
212
+ @old = {}
213
+
214
+ end
215
+
216
+ it 'with one :on and one :repeat' do
217
+
218
+ @new['known_errors'] = {
219
+
220
+ 'error_new' => 1,
221
+ 'error_repeated' => 41
222
+
223
+ }
224
+
225
+ @old['known_errors'] = {
226
+
227
+ 'error_repeated' => 39
228
+
229
+ }
230
+
231
+
232
+ key = []
233
+ state = []
234
+ value = []
235
+ delta = []
236
+
237
+ subject.each_change( @old, @new ) do |k, s, v, d|
238
+
239
+ key << k
240
+ state << s
241
+ value << v
242
+ delta << d
243
+
244
+ end
245
+
246
+ key.should == [ 'error_new', 'error_repeated' ]
247
+ state.should == [ :on, :repeat ]
248
+ value.should == [ 1, 41 ]
249
+ delta.should == [ nil, 2 ]
250
+
251
+ end
252
+
253
+ it 'with one :off and one :on' do
254
+
255
+ @new['known_errors'] = { 'error_two' => 3 }
256
+ @old['known_errors'] = { 'error_one' => 3 }
257
+
258
+ key = []
259
+ state = []
260
+ value = []
261
+
262
+ subject.each_change( @old, @new ) do |k, s, v|
263
+
264
+ key << k
265
+ state << s
266
+ value << v
267
+
268
+ end
269
+
270
+ key.should == [ 'error_two', 'error_one' ]
271
+ state.should == [ :on, :off ]
272
+ value.should == [ 3, nil ]
273
+
274
+ end
275
+
276
+ end
277
+
278
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+ require 'em-rspec'
3
+
4
+ BUFFERED_PERSISTOR = {
5
+ :interval => 1,
6
+ :class => 'BufferedPersistor',
7
+ :table => 'tablename',
8
+ :key => {
9
+
10
+ :hostname => :hostname
11
+
12
+ }
13
+ }
14
+
15
+ describe LanGrove::Plugin::BufferedPersistor do
16
+
17
+ subject {
18
+
19
+ LanGrove::Plugin::BufferedPersistor.new(
20
+
21
+ ROOT, BUFFERED_PERSISTOR, nil
22
+
23
+ )
24
+
25
+ }
26
+
27
+
28
+ it 'is a persistor' do
29
+
30
+ # LOG.on
31
+
32
+ subject.provides.has_key?(
33
+
34
+ :persistor
35
+
36
+ ).should == true
37
+
38
+ end
39
+
40
+ it 'requires eventmachine' do
41
+
42
+ EM.should_receive( :reactor_running? ).and_return( false )
43
+
44
+ expect {
45
+
46
+ subject
47
+
48
+ }.to raise_error(
49
+
50
+ LanGrove::PluginException,
51
+
52
+ /only runs inside EventMachine enabled daemons/
53
+
54
+ )
55
+
56
+ end
57
+
58
+ it 'pends persistance for interval' do
59
+
60
+ EM.should_receive(
61
+
62
+ :add_periodic_timer ).with( 1
63
+
64
+ )
65
+
66
+ subject
67
+
68
+ end
69
+
70
+ it 'pends persistance into @capsules Hash' do
71
+
72
+ @handler1 = LanGrove::Handler::Base.new
73
+ @handler1.capsule = {
74
+
75
+ :hostname => 'one.test.com',
76
+ :value => '1'
77
+
78
+ }
79
+ subject.store( @handler1 )
80
+ @handler2 = LanGrove::Handler::Base.new
81
+ @handler2.capsule = {
82
+
83
+ :hostname => 'two.test.com',
84
+ :value => '2'
85
+
86
+ }
87
+ subject.store( @handler2 )
88
+
89
+
90
+ subject.store_all
91
+
92
+ end
93
+
94
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ describe LanGrove::Plugin::Enqueuer do
4
+
5
+ subject {
6
+
7
+ LanGrove::Plugin::Enqueuer.new(
8
+
9
+ ROOT, ENQUEUER_CONFIG, nil
10
+
11
+ )
12
+
13
+ }
14
+
15
+ before :each do
16
+
17
+ @capsule = {
18
+
19
+ 'data' => 'DATA',
20
+ 'persisted_seq' => 1
21
+
22
+ }
23
+
24
+ end
25
+
26
+ it 'enqueues the handler persistance key into a work queue' do
27
+
28
+ handler = mock( handler )
29
+
30
+ handler.should_receive(
31
+
32
+ :key
33
+
34
+ ).and_return(
35
+
36
+ "the handler.key to collect a persisted capsule"
37
+
38
+ )
39
+
40
+ handler.should_receive(
41
+
42
+ :capsule
43
+
44
+ ).and_return(
45
+
46
+ @capsule
47
+
48
+ )
49
+
50
+ expect {
51
+
52
+ subject.enqueue_key( handler )
53
+
54
+ }.to raise_error(
55
+
56
+ LanGrove::PluginException,
57
+
58
+ /not implemented/
59
+
60
+ )
61
+
62
+ end
63
+
64
+ it 'enqueues the handler capsule into a work queue' do
65
+
66
+ handler = mock( handler )
67
+
68
+ handler.should_receive(
69
+
70
+ :capsule
71
+
72
+ ).twice.and_return(
73
+
74
+ @capsule
75
+
76
+ )
77
+
78
+ expect {
79
+
80
+ subject.enqueue_capsule( handler )
81
+
82
+ }.to raise_error(
83
+
84
+ LanGrove::PluginException,
85
+
86
+ /not implemented/
87
+
88
+ )
89
+
90
+ end
91
+
92
+ it 'assembles a queue header with the sequence number' do
93
+
94
+ handler = mock( handler )
95
+
96
+ handler.should_receive(
97
+
98
+ :capsule
99
+
100
+ ).and_return(
101
+
102
+ @capsule
103
+
104
+ )
105
+
106
+ header = subject.queue_header(
107
+
108
+ :get_capsule, handler
109
+
110
+ )
111
+
112
+ header['action'].should == :get_capsule
113
+ header['sequence'].should == 1
114
+ header['created_at'].should be_a( Time )
115
+
116
+ end
117
+
118
+ it 'validates presence of :worker in config' do
119
+
120
+ ENQUEUER_CONFIG.delete :job
121
+
122
+ expect {
123
+
124
+ subject.validate_config
125
+
126
+ }.to raise_error(
127
+
128
+ LanGrove::DaemonConfigException,
129
+
130
+ /equires :job:/
131
+
132
+ )
133
+
134
+ end
135
+
136
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe LanGrove::Plugin::Notifier do
4
+
5
+ before :all do
6
+
7
+ NOTIFIER_CONFIG = {
8
+
9
+ }
10
+
11
+ @capsule = {
12
+
13
+ 'system' => 'Red Bull',
14
+ 'application' => 'Protocol Routing Challenge',
15
+ 'source' => 'hop.checkpoint12.ip_routing_challenge.redbull.com',
16
+ 'key' => 'ttl_zero',
17
+ 'state' => 'on',
18
+ 'value' => 'contestant404',
19
+ 'delta' => nil
20
+
21
+ }
22
+
23
+ end
24
+
25
+ subject {
26
+
27
+ LanGrove::Plugin::Notifier.new( ROOT, NOTIFIER_CONFIG, nil )
28
+
29
+ }
30
+
31
+ it 'can transform the contents of the notification' do
32
+
33
+ handler = mock( 'handler' )
34
+
35
+ handler.should_receive(
36
+
37
+ :transform
38
+
39
+ ).with(
40
+
41
+ :notifier, @capsule
42
+
43
+ ).and_yield(
44
+
45
+ @capsule
46
+
47
+ )
48
+
49
+ handler.should_receive(
50
+
51
+ :capsule
52
+
53
+ ).twice.and_return(
54
+
55
+ @capsule
56
+
57
+ )
58
+
59
+ expect {
60
+
61
+ subject.notify_handler( handler )
62
+
63
+ }.to raise_error(
64
+
65
+ LanGrove::PluginException,
66
+
67
+ /.notify\(\) not implemented/
68
+
69
+ )
70
+
71
+ end
72
+
73
+ it 'skips the notification if transform returns false' do
74
+
75
+ handler = mock( 'handler' )
76
+
77
+ handler.should_receive(
78
+
79
+ :capsule
80
+
81
+ ).and_return(
82
+
83
+ @capsule
84
+
85
+ )
86
+
87
+ subject.should_receive(
88
+
89
+ :transform
90
+
91
+ ).and_return(
92
+
93
+ false
94
+
95
+ )
96
+
97
+ subject.should_not_receive(
98
+
99
+ :notify
100
+
101
+ )
102
+
103
+ subject.notify_handler( handler )
104
+
105
+ end
106
+
107
+ end