LanGrove 0.0.1 → 0.0.2
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.
- data/.watchr +11 -3
- data/Rakefile +12 -5
- data/functional/.gitignore +1 -0
- data/{bin/datagram_example → functional/bin/datagram} +2 -0
- data/{config/environments/development.rb → functional/config/.gitignore} +0 -0
- data/{config → functional/config}/boot.rb +0 -0
- data/functional/config/daemons.yml +12 -0
- data/{config → functional/config}/environment.rb +0 -0
- data/{config/environments/production.rb → functional/config/environments/development.rb} +0 -0
- data/{config/environments/test.rb → functional/config/environments/production.rb} +0 -0
- data/{lib/jobs/Rakefile → functional/config/environments/test.rb} +0 -0
- data/functional/lib/daemon/datagram.rb +23 -0
- data/functional/lib/handler/socket_to_file.rb +36 -0
- data/functional/lib/protocol/socket_to_file.rb +55 -0
- data/{libexec → functional/libexec}/daemon.rb +14 -3
- data/functional/log/.gitignore +3 -0
- data/functional/tmp/README +1 -0
- data/lib/langrove.rb +1 -0
- data/lib/langrove/_base.rb +26 -0
- data/lib/langrove/adaptor/base.rb +3 -0
- data/lib/langrove/adaptor/datagram.rb +27 -0
- data/lib/langrove/adaptor_base.rb +89 -0
- data/lib/langrove/client/base.rb +2 -0
- data/lib/langrove/client/datagram.rb +28 -0
- data/lib/langrove/client_base.rb +114 -0
- data/lib/langrove/daemon/base.rb +2 -0
- data/lib/{daemon_base.rb → langrove/daemon_base.rb} +30 -23
- data/lib/langrove/ext.rb +7 -0
- data/lib/langrove/ext/class_loader.rb +146 -0
- data/lib/{ext → langrove/ext}/config_item.rb +4 -5
- data/lib/{ext → langrove/ext}/config_loader.rb +2 -2
- data/lib/langrove/ext/fake_logger.rb +8 -0
- data/lib/{ext → langrove/ext}/persistable.rb +2 -2
- data/lib/{ext → langrove/ext}/string.rb +0 -0
- data/lib/langrove/handler/base.rb +2 -0
- data/lib/{handler_base.rb → langrove/handler_base.rb} +25 -9
- data/lib/langrove/protocol/base.rb +2 -0
- data/lib/langrove/protocol/syslog.rb +32 -0
- data/lib/langrove/protocol_base.rb +32 -0
- data/lib/langrove/version.rb +3 -0
- data/spec/functional/daemon/datagram_spec.rb +115 -0
- data/spec/langrove/adaptor/datagram_spec.rb +6 -0
- data/spec/langrove/adaptor_base_spec.rb +48 -0
- data/spec/langrove/client/datagram_spec.rb +1 -0
- data/spec/langrove/client_base_spec.rb +5 -0
- data/spec/langrove/daemon_base_spec.rb +101 -0
- data/spec/langrove/ext/class_loader_spec.rb +83 -0
- data/spec/langrove/ext/config_item_spec.rb +81 -0
- data/spec/langrove/ext/config_loader_spec.rb +5 -0
- data/{tmp/TMP → spec/langrove/ext/fake_logger_spec.rb} +0 -0
- data/spec/{ext → langrove/ext}/persistable_spec.rb +8 -9
- data/spec/{ext → langrove/ext}/string_spec.rb +1 -1
- data/spec/langrove/handler_base_spec.rb +57 -0
- data/spec/langrove/protocol/syslog_spec.rb +45 -0
- data/spec/langrove/protocol_base_spec.rb +6 -0
- data/spec/todo_spec.rb +1 -2
- data/tmp/README +2 -0
- metadata +150 -46
- data/config/daemons.yml.tmpl +0 -78
- data/lib/adaptor/base.rb +0 -1
- data/lib/adaptor/datagram.rb +0 -20
- data/lib/adaptor/socket_handler.rb +0 -27
- data/lib/adaptor_base.rb +0 -39
- data/lib/client/base.rb +0 -1
- data/lib/client/puppet_state.rb +0 -74
- data/lib/client/radio_state.rb +0 -81
- data/lib/client_base.rb +0 -24
- data/lib/daemon/base.rb +0 -1
- data/lib/daemon/datagram_example.rb +0 -12
- data/lib/handler/base.rb +0 -1
- data/lib/handler/socket_to_file.rb +0 -30
- data/lib/jobs/jobs.rb +0 -1
- data/lib/jobs/updated_puppet_state.rb +0 -17
- data/lib/protocol_base.rb +0 -5
- data/spec/adaptor/datagram_spec.rb +0 -6
- data/spec/adaptor/socket_handler_spec.rb +0 -5
- data/spec/adaptor_base_spec.rb +0 -45
- data/spec/client_base_spec.rb +0 -5
- data/spec/daemon_base_spec.rb +0 -97
- data/spec/ext/config_item_spec.rb +0 -77
- data/spec/ext/config_loader_spec.rb +0 -5
- data/spec/functional/datagram_spec.rb +0 -122
- data/spec/handler_base_spec.rb +0 -71
- data/spec/protocol_base_spec.rb +0 -6
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'langrove'
|
2
|
+
|
3
|
+
describe 'A daemon' do
|
4
|
+
|
5
|
+
#
|
6
|
+
# Use the demos in ./functional dir for integration tests
|
7
|
+
#
|
8
|
+
# Note: This uses the init.d style start|stop functionality
|
9
|
+
# as provided by DaemonKit
|
10
|
+
#
|
11
|
+
# Therefore, bugs that may exist in DaemonKit could be
|
12
|
+
# exposed here.
|
13
|
+
#
|
14
|
+
# I have not directly ovbserved any thus far.
|
15
|
+
#
|
16
|
+
|
17
|
+
before :all do
|
18
|
+
|
19
|
+
@daemon_name = 'datagram'
|
20
|
+
|
21
|
+
#
|
22
|
+
# cd - to get the rvm environment up
|
23
|
+
#
|
24
|
+
@daemon_root = File.expand_path("../../../../functional", __FILE__)
|
25
|
+
@daemon_stub = "./bin/#{@daemon_name}"
|
26
|
+
|
27
|
+
#
|
28
|
+
# Daemon is configured with Handler::SocketToFile
|
29
|
+
#
|
30
|
+
# The test sends a message to the daemon and then
|
31
|
+
# verifies the presence of the file.
|
32
|
+
#
|
33
|
+
@file = "#{@daemon_root}/tmp/datagram.txt"
|
34
|
+
@mesg = "Hello Datagram To File"
|
35
|
+
|
36
|
+
#
|
37
|
+
# remove the file ahead of testing
|
38
|
+
#
|
39
|
+
`rm -f #{@file}`
|
40
|
+
|
41
|
+
#
|
42
|
+
# call shell to start daemon
|
43
|
+
#
|
44
|
+
|
45
|
+
`cd #{@daemon_root} && #{@daemon_stub} start`
|
46
|
+
|
47
|
+
#
|
48
|
+
# give it a moment to start
|
49
|
+
#
|
50
|
+
sleep 1
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
after :all do
|
55
|
+
|
56
|
+
#
|
57
|
+
# call shell to stop daemon
|
58
|
+
#
|
59
|
+
`cd #{@daemon_root} && #{@daemon_stub} stop`
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'running a server' do
|
64
|
+
|
65
|
+
it 'receives a message' do
|
66
|
+
|
67
|
+
require "eventmachine"
|
68
|
+
|
69
|
+
class Sender < EventMachine::Connection
|
70
|
+
|
71
|
+
def send( data )
|
72
|
+
|
73
|
+
send_datagram( data, '127.0.0.1', 12701 )
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
EM.run do
|
80
|
+
|
81
|
+
sender = nil
|
82
|
+
|
83
|
+
EM.add_periodic_timer(1) do
|
84
|
+
|
85
|
+
sender.send( "#{@file}|#{@mesg}" )
|
86
|
+
EM.stop
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
EM.open_datagram_socket "127.0.0.1", 0, Sender do |connected|
|
91
|
+
|
92
|
+
sender = connected
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Give the daemon a moment to write the file
|
100
|
+
#
|
101
|
+
sleep 1
|
102
|
+
|
103
|
+
File.file?( @file ).should == true
|
104
|
+
|
105
|
+
File.open( @file, 'r' ).each_line do |line|
|
106
|
+
|
107
|
+
line.should == @mesg
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'langrove'
|
2
|
+
|
3
|
+
describe LanGrove::Adaptor::Base do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
|
7
|
+
@logger = LanGrove::FakeLogger.new
|
8
|
+
|
9
|
+
@extendhandler = 'ExtendedHandler'
|
10
|
+
|
11
|
+
@config = {
|
12
|
+
|
13
|
+
:iface => '111.111.111.111',
|
14
|
+
|
15
|
+
:port => 11111,
|
16
|
+
|
17
|
+
:connector => @extendhandler,
|
18
|
+
|
19
|
+
:client => {
|
20
|
+
|
21
|
+
:class => 'Base'
|
22
|
+
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
pending 'may need to override default connection handler' do
|
29
|
+
|
30
|
+
LanGrove::Adaptor.const_set( @extendhandler, Class.new )
|
31
|
+
|
32
|
+
subject = LanGrove::Adaptor::Base.new( @config, @logger )
|
33
|
+
connector = subject.instance_variable_get( :@handler )
|
34
|
+
|
35
|
+
connector.should be_a( LanGrove::Adaptor.const_get( @extendhandler ) )
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
pending 'assigns defaults' do
|
40
|
+
|
41
|
+
subject = LanGrove::Adaptor::Base.new( {}, @logger )
|
42
|
+
connector = subject.instance_variable_get( :@connector )
|
43
|
+
|
44
|
+
connector.should == LanGrove::Adaptor::SocketHandler
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'langrove/client/datagram'
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'langrove'
|
2
|
+
|
3
|
+
describe LanGrove::Daemon::Base do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
|
7
|
+
@logger = LanGrove::FakeLogger.new :silent
|
8
|
+
|
9
|
+
@daemon_name = 'pretend_daemon'
|
10
|
+
|
11
|
+
@adaptor_class = 'Base'
|
12
|
+
@collection_class = 'Base'
|
13
|
+
@client_class = 'Base'
|
14
|
+
|
15
|
+
@config = {
|
16
|
+
|
17
|
+
:daemons => {
|
18
|
+
|
19
|
+
@daemon_name => {
|
20
|
+
|
21
|
+
:server => false,
|
22
|
+
|
23
|
+
:adaptor => {
|
24
|
+
|
25
|
+
:connection => @adaptor_class,
|
26
|
+
|
27
|
+
:client => {
|
28
|
+
|
29
|
+
:class => @client_class
|
30
|
+
|
31
|
+
}
|
32
|
+
},
|
33
|
+
|
34
|
+
:handler => {
|
35
|
+
|
36
|
+
:collection => @collection_class
|
37
|
+
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
subject do
|
46
|
+
|
47
|
+
LanGrove::Daemon::Base.new( @config, @daemon_name, @logger )
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'requires a logger' do
|
52
|
+
|
53
|
+
expect {
|
54
|
+
|
55
|
+
LanGrove::Daemon::Base.new( @config, @daemon_name, nil )
|
56
|
+
|
57
|
+
}.to raise_error( LanGrove::DaemonConfigException, /Requires a logger/ )
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'requires a configuration' do
|
62
|
+
|
63
|
+
expect {
|
64
|
+
|
65
|
+
LanGrove::Daemon::Base.new( {}, @daemon_name, @logger )
|
66
|
+
|
67
|
+
}.to raise_error( LanGrove::DaemonConfigException, /Missing config item/ )
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'latebinds an adaptor by config' do
|
72
|
+
|
73
|
+
adaptor = subject.instance_variable_get( :@adaptor )
|
74
|
+
|
75
|
+
adaptor.should be_a( LanGrove::Adaptor.const_get( @adaptor_class ) )
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'latebinds a handler by config' do
|
80
|
+
|
81
|
+
handler = subject.instance_variable_get( :@handler )
|
82
|
+
|
83
|
+
handler.should be_a( LanGrove::Handler.const_get( @collection_class ) )
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'it schedules periodics'
|
88
|
+
|
89
|
+
it 'when run, it calls to listen if server is true' do
|
90
|
+
|
91
|
+
expect {
|
92
|
+
|
93
|
+
subject.instance_variable_set( :@server, true )
|
94
|
+
|
95
|
+
subject.run
|
96
|
+
|
97
|
+
}.to raise_error( LanGrove::DaemonConfigException, "NotYetExtended: undefined listen()" )
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'langrove/ext/class_loader'
|
2
|
+
require 'langrove/ext/fake_logger'
|
3
|
+
|
4
|
+
describe LanGrove::ClassLoader do
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
|
8
|
+
@logger = LanGrove::FakeLogger.new :silent
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'raises on missing class definition file' do
|
13
|
+
|
14
|
+
expect {
|
15
|
+
|
16
|
+
LanGrove::ClassLoader.create( {
|
17
|
+
|
18
|
+
:module => 'Protocol',
|
19
|
+
:class => 'MedievalLanternMorse'
|
20
|
+
|
21
|
+
}, @logger )
|
22
|
+
|
23
|
+
}.to raise_error(
|
24
|
+
|
25
|
+
LanGrove::ClassLoaderException,
|
26
|
+
|
27
|
+
"no such file to load -- protocol/medieval_lantern_morse.rb"
|
28
|
+
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'raises on missing ModuleName' do
|
33
|
+
|
34
|
+
expect {
|
35
|
+
|
36
|
+
LanGrove::ClassLoader.create( {
|
37
|
+
|
38
|
+
:class => 'MedievalLanternMorse'
|
39
|
+
|
40
|
+
}, @logger )
|
41
|
+
|
42
|
+
}.to raise_error(
|
43
|
+
|
44
|
+
LanGrove::ClassLoaderException, /:module/
|
45
|
+
|
46
|
+
)
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'raises on missing ClassName' do
|
51
|
+
|
52
|
+
expect {
|
53
|
+
|
54
|
+
LanGrove::ClassLoader.create( {
|
55
|
+
|
56
|
+
:module => 'Protocol'
|
57
|
+
|
58
|
+
}, @logger )
|
59
|
+
|
60
|
+
}.to raise_error(
|
61
|
+
|
62
|
+
LanGrove::ClassLoaderException, /:class/
|
63
|
+
|
64
|
+
)
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'returns a constantized class definition' do
|
69
|
+
|
70
|
+
test = LanGrove::ClassLoader.create( {
|
71
|
+
|
72
|
+
:module => 'Protocol',
|
73
|
+
:class => 'Base'
|
74
|
+
|
75
|
+
}, @logger ).new( nil, @logger )
|
76
|
+
|
77
|
+
test.should be_a( LanGrove::Protocol::Base )
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'also works on local implementation'
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'langrove/ext'
|
2
|
+
|
3
|
+
describe LanGrove::ConfigItem do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@config_hash = {
|
7
|
+
'root' => "3",
|
8
|
+
'BLANK' => "",
|
9
|
+
:daemons => {
|
10
|
+
'puppet_log' => {
|
11
|
+
:handler => {
|
12
|
+
:collection => 'SyslogStateMachines'
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'accesses config items' do
|
20
|
+
LanGrove::ConfigItem.get(@config_hash, ['root']).should == '3'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'accesses nested config items' do
|
24
|
+
LanGrove::ConfigItem.get(@config_hash,
|
25
|
+
|
26
|
+
[:daemons , 'puppet_log', :handler, :collection]
|
27
|
+
|
28
|
+
).should == 'SyslogStateMachines'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'raises a config exception if the key isnt present' do
|
32
|
+
|
33
|
+
expect {
|
34
|
+
|
35
|
+
LanGrove::ConfigItem.get(@config_hash, ['NOT'])
|
36
|
+
|
37
|
+
}.to raise_error( LanGrove::ConfigException, /Missing config item 'NOT'/ )
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'raises a config exception if the key isnt present' do
|
42
|
+
|
43
|
+
expect {
|
44
|
+
|
45
|
+
LanGrove::ConfigItem.get(@config_hash, ['BLANK'])
|
46
|
+
|
47
|
+
}.to raise_error( LanGrove::ConfigException, /Missing config item 'BLANK'/ )
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'raises a config exception if the value isnt present' do
|
52
|
+
|
53
|
+
expect {
|
54
|
+
|
55
|
+
LanGrove::ConfigItem.get(@config_hash, ['BLANK'], false)
|
56
|
+
|
57
|
+
}.to_not raise_error( LanGrove::ConfigException, /Missing config item 'BLANK'/ )
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'raises a config exception if the nested item isnt present' do
|
62
|
+
|
63
|
+
expect {
|
64
|
+
|
65
|
+
LanGrove::ConfigItem.get(@config_hash, [ :daemons, 'NEITHER', 'this'])
|
66
|
+
|
67
|
+
}.to raise_error( LanGrove::ConfigException, /Missing config item 'NEITHER'/ )
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'does not raise on not mandatory fields' do
|
72
|
+
|
73
|
+
expect {
|
74
|
+
|
75
|
+
LanGrove::ConfigItem.get(@config_hash, [ :daemons, 'NEITHER' ], false)
|
76
|
+
|
77
|
+
}.to_not raise_error( LanGrove::ConfigException )
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|