rsmp 0.1.13 → 0.1.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +0 -4
- data/Gemfile.lock +52 -52
- data/README.md +7 -1
- data/config/supervisor.yaml +9 -15
- data/config/tlc.yaml +26 -28
- data/documentation/classes_and_modules.md +65 -0
- data/documentation/message_distribution.md +23 -0
- data/lib/rsmp.rb +14 -5
- data/lib/rsmp/archive.rb +23 -22
- data/lib/rsmp/cli.rb +133 -102
- data/lib/rsmp/collector.rb +102 -0
- data/lib/rsmp/component.rb +13 -4
- data/lib/rsmp/{site_base.rb → components.rb} +8 -6
- data/lib/rsmp/convert/export/json_schema.rb +204 -0
- data/lib/rsmp/convert/import/yaml.rb +38 -0
- data/lib/rsmp/deep_merge.rb +11 -0
- data/lib/rsmp/error.rb +1 -1
- data/lib/rsmp/inspect.rb +46 -0
- data/lib/rsmp/listener.rb +23 -0
- data/lib/rsmp/logger.rb +6 -4
- data/lib/rsmp/{base.rb → logging.rb} +3 -3
- data/lib/rsmp/message.rb +46 -32
- data/lib/rsmp/node.rb +47 -12
- data/lib/rsmp/notifier.rb +29 -0
- data/lib/rsmp/proxy.rb +143 -71
- data/lib/rsmp/rsmp.rb +34 -23
- data/lib/rsmp/site.rb +35 -42
- data/lib/rsmp/site_proxy.rb +182 -78
- data/lib/rsmp/site_proxy_wait.rb +206 -0
- data/lib/rsmp/supervisor.rb +85 -49
- data/lib/rsmp/supervisor_proxy.rb +80 -34
- data/lib/rsmp/tlc.rb +761 -86
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp/wait.rb +7 -8
- data/rsmp.gemspec +9 -21
- metadata +37 -142
- data/config/site.yaml +0 -40
- data/lib/rsmp/probe.rb +0 -114
- data/lib/rsmp/probe_collection.rb +0 -28
- data/lib/rsmp/supervisor_base.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c123985ef66b5f1a4b1676a01d07900d1a4ca365b93cc06a113bd0a7605679a9
|
4
|
+
data.tar.gz: 5df915ef9e4e6143281ab23ffc48127a71502784e4a132691be2463285762b22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8989828fa898324ce2b5dc9b0d0de2bd90ddc0ff5276ac768ae09526e3adf0728de67e87b01554f7374b25aed5884201367e4368efbaf37b3d594e4958c8ce3e
|
7
|
+
data.tar.gz: 2fd22365257c3f2595fb3329cd047feaa87b9d52aa335232a3126023414bf5859950a11d778d0e8b2a6983644475c95173aa8ec0886b3018850ae156a98c6063
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rsmp (0.1.
|
5
|
-
async (~> 1.
|
6
|
-
async-io (~> 1.
|
4
|
+
rsmp (0.1.29)
|
5
|
+
async (~> 1.28.7)
|
6
|
+
async-io (~> 1.30.2)
|
7
7
|
colorize (~> 0.8.1)
|
8
|
-
|
9
|
-
thor (~> 0.
|
8
|
+
rsmp_schemer (~> 0.2.0)
|
9
|
+
thor (~> 1.0.1)
|
10
10
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
aruba (0.
|
15
|
-
childprocess (
|
16
|
-
contracts (~> 0.
|
17
|
-
cucumber (>=
|
14
|
+
aruba (1.0.0)
|
15
|
+
childprocess (~> 3.0)
|
16
|
+
contracts (~> 0.16.0)
|
17
|
+
cucumber (>= 2.4, < 4.0)
|
18
18
|
ffi (~> 1.9)
|
19
|
-
rspec-expectations (
|
20
|
-
thor (~> 0
|
21
|
-
async (1.
|
22
|
-
console (~> 1.
|
19
|
+
rspec-expectations (~> 3.4)
|
20
|
+
thor (~> 1.0)
|
21
|
+
async (1.28.9)
|
22
|
+
console (~> 1.10)
|
23
23
|
nio4r (~> 2.3)
|
24
24
|
timers (~> 4.1)
|
25
|
-
async-io (1.
|
25
|
+
async-io (1.30.2)
|
26
26
|
async (~> 1.14)
|
27
|
-
backports (3.
|
28
|
-
builder (3.2.
|
29
|
-
childprocess (
|
30
|
-
rake (< 13.0)
|
27
|
+
backports (3.17.0)
|
28
|
+
builder (3.2.4)
|
29
|
+
childprocess (3.0.0)
|
31
30
|
colorize (0.8.1)
|
32
|
-
console (1.
|
31
|
+
console (1.12.0)
|
32
|
+
fiber-local
|
33
33
|
contracts (0.16.0)
|
34
34
|
cucumber (3.1.2)
|
35
35
|
builder (>= 2.1.2)
|
@@ -48,54 +48,54 @@ GEM
|
|
48
48
|
cucumber-tag_expressions (1.1.1)
|
49
49
|
cucumber-wire (0.0.1)
|
50
50
|
diff-lcs (1.3)
|
51
|
-
ecma-re-validator (0.
|
52
|
-
regexp_parser (~>
|
53
|
-
ffi (1.
|
51
|
+
ecma-re-validator (0.3.0)
|
52
|
+
regexp_parser (~> 2.0)
|
53
|
+
ffi (1.12.2)
|
54
|
+
fiber-local (1.0.0)
|
54
55
|
gherkin (5.1.0)
|
55
|
-
hana (1.3.
|
56
|
-
json_schemer (0.2.
|
57
|
-
ecma-re-validator (~> 0.
|
56
|
+
hana (1.3.7)
|
57
|
+
json_schemer (0.2.18)
|
58
|
+
ecma-re-validator (~> 0.3)
|
58
59
|
hana (~> 1.3)
|
59
|
-
regexp_parser (~>
|
60
|
+
regexp_parser (~> 2.0)
|
60
61
|
uri_template (~> 0.7)
|
61
|
-
multi_json (1.
|
62
|
+
multi_json (1.14.1)
|
62
63
|
multi_test (0.1.2)
|
63
|
-
nio4r (2.5.
|
64
|
-
rake (
|
65
|
-
regexp_parser (1.
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
rspec-
|
70
|
-
|
71
|
-
rspec-
|
72
|
-
rspec-
|
64
|
+
nio4r (2.5.7)
|
65
|
+
rake (13.0.1)
|
66
|
+
regexp_parser (2.1.1)
|
67
|
+
rsmp_schemer (0.2.0)
|
68
|
+
json_schemer (~> 0.2.18)
|
69
|
+
rspec (3.9.0)
|
70
|
+
rspec-core (~> 3.9.0)
|
71
|
+
rspec-expectations (~> 3.9.0)
|
72
|
+
rspec-mocks (~> 3.9.0)
|
73
|
+
rspec-core (3.9.1)
|
74
|
+
rspec-support (~> 3.9.1)
|
75
|
+
rspec-expectations (3.9.1)
|
73
76
|
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
-
rspec-support (~> 3.
|
75
|
-
rspec-mocks (3.
|
77
|
+
rspec-support (~> 3.9.0)
|
78
|
+
rspec-mocks (3.9.1)
|
76
79
|
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
-
rspec-support (~> 3.
|
78
|
-
rspec-support (3.
|
79
|
-
|
80
|
-
rspec (~> 3.0)
|
81
|
-
thor (0.20.3)
|
80
|
+
rspec-support (~> 3.9.0)
|
81
|
+
rspec-support (3.9.2)
|
82
|
+
thor (1.0.1)
|
82
83
|
timecop (0.9.1)
|
83
|
-
timers (4.3.
|
84
|
+
timers (4.3.3)
|
84
85
|
uri_template (0.7.0)
|
85
86
|
|
86
87
|
PLATFORMS
|
87
88
|
ruby
|
88
89
|
|
89
90
|
DEPENDENCIES
|
90
|
-
aruba (~> 0.
|
91
|
-
bundler (~> 2.
|
91
|
+
aruba (~> 1.0.0)
|
92
|
+
bundler (~> 2.2.3)
|
92
93
|
cucumber (~> 3.1.2)
|
93
|
-
rake (~>
|
94
|
+
rake (~> 13.0.1)
|
94
95
|
rsmp!
|
95
|
-
rspec (~> 3.0)
|
96
|
-
rspec-expectations (~> 3.
|
97
|
-
rspec-with_params (~> 0.2.0)
|
96
|
+
rspec (~> 3.9.0)
|
97
|
+
rspec-expectations (~> 3.9.1)
|
98
98
|
timecop (~> 0.9.1)
|
99
99
|
|
100
100
|
BUNDLED WITH
|
101
|
-
2.
|
101
|
+
2.2.3
|
data/README.md
CHANGED
@@ -163,6 +163,12 @@ The ```site``` command will start an RSMP site, which will try to connect to one
|
|
163
163
|
2019-11-11 12:22:00 UTC RN+SU0001 C1 <-- 8280 Sent AggregatedStatus
|
164
164
|
```
|
165
165
|
|
166
|
+
|
167
|
+
Use the the --type switch to select a specific type of site. Messages will be validated against the corresponding SXL JSON schema. Without any type specified, messages will be validated against the core RSMP schema only.
|
168
|
+
|
169
|
+
Use the ```tlc``` site type to run an emulation of a traffic light controller. This type of site implements enough of functionality to pass all the rsmp_validator tests. You can setup signal group components, in the config file.
|
170
|
+
|
171
|
+
|
166
172
|
### CLI help and options.
|
167
173
|
Use ```--help <command>``` to get a list of available options.
|
168
174
|
|
@@ -172,7 +178,7 @@ Use ```--config <path>``` to point to a .yaml config file, controlling things li
|
|
172
178
|
### RSpec
|
173
179
|
RSpec tests are located in spec/. The tests will start supervisor and sites to test communication, but will do so on port 13111, rather than the usual port 12111, to avoid inferference with other RMSP processes running locally.
|
174
180
|
|
175
|
-
Note that these tests are NOT intented for testing external equipment or systems. The tests are for validating the code in this repository. To test external equipment or systems.
|
181
|
+
Note that these tests are NOT intented for testing external equipment or systems. The tests are for validating the code in this repository. To test external equipment or systems use the rsmp_validator tool.
|
176
182
|
|
177
183
|
```console
|
178
184
|
$ rspec
|
data/config/supervisor.yaml
CHANGED
@@ -1,18 +1,12 @@
|
|
1
1
|
port: 12111
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
acknowledgement_timeout: 2
|
11
|
-
store_messages: false
|
12
|
-
command_response_timeout: 1
|
13
|
-
status_response_timeout: 1
|
14
|
-
status_update_timeout: 1
|
15
|
-
|
2
|
+
guest:
|
3
|
+
sxl: tlc
|
4
|
+
intervals:
|
5
|
+
timer: 0.1
|
6
|
+
watchdog: 0.1
|
7
|
+
timeouts:
|
8
|
+
watchdog: 0.2
|
9
|
+
acknowledgement: 0.2
|
16
10
|
log:
|
17
11
|
active: true
|
18
12
|
color: true
|
@@ -20,6 +14,7 @@ log:
|
|
20
14
|
id: true
|
21
15
|
component: true
|
22
16
|
ip: false
|
17
|
+
port: true
|
23
18
|
site_id: true
|
24
19
|
text: true
|
25
20
|
direction: true
|
@@ -27,4 +22,3 @@ log:
|
|
27
22
|
json: true
|
28
23
|
acknowledgements: false
|
29
24
|
watchdogs: false
|
30
|
-
|
data/config/tlc.yaml
CHANGED
@@ -2,34 +2,33 @@ site_id: RN+SI0001
|
|
2
2
|
supervisors:
|
3
3
|
- ip: 127.0.0.1
|
4
4
|
port: 12111
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
rsmp_versions:
|
9
|
-
- 3.1.1
|
10
|
-
- 3.1.2
|
11
|
-
- 3.1.3
|
12
|
-
- 3.1.4
|
13
|
-
|
5
|
+
sxl: tlc
|
6
|
+
sxl_version: 1.0.15
|
14
7
|
components:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
8
|
+
main:
|
9
|
+
TC:
|
10
|
+
cycle_time: 6
|
11
|
+
signal_group:
|
12
|
+
A1:
|
13
|
+
plan: '11NBBB'
|
14
|
+
A2:
|
15
|
+
plan: '1NBBBB'
|
16
|
+
B1:
|
17
|
+
plan: 'BBB11N'
|
18
|
+
B2:
|
19
|
+
plan: 'BBB1NB'
|
20
|
+
detector_logic:
|
21
|
+
DL1:
|
22
|
+
intervals:
|
23
|
+
timer: 0.1
|
24
|
+
watchdog: 0.1
|
25
|
+
reconnect: 0.1
|
26
|
+
timeouts:
|
27
|
+
watchdog: 0.2
|
28
|
+
acknowledgement: 0.2
|
29
|
+
security_codes:
|
30
|
+
1: '1111'
|
31
|
+
2: '2222'
|
33
32
|
log:
|
34
33
|
active: true
|
35
34
|
color: true
|
@@ -44,4 +43,3 @@ log:
|
|
44
43
|
json: true
|
45
44
|
acknowledgements: false
|
46
45
|
watchdogs: false
|
47
|
-
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Classes and Modules
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
```
|
5
|
+
Node - - include Logging, Wait
|
6
|
+
/ \
|
7
|
+
Super Site - - include Components
|
8
|
+
|
9
|
+
|
10
|
+
Proxy - - include Logging, Wait
|
11
|
+
/ \
|
12
|
+
SupervisorProxy SiteProxy - - include Components, SiteProxyWait
|
13
|
+
```
|
14
|
+
|
15
|
+
## Modules
|
16
|
+
### Logging
|
17
|
+
Handle logging.
|
18
|
+
|
19
|
+
### Wait
|
20
|
+
Handles waiting for an async condition and block.
|
21
|
+
|
22
|
+
### SiteProxyWait
|
23
|
+
Handles waiting for different types of messages and responses from a remote site.
|
24
|
+
|
25
|
+
### Components
|
26
|
+
Component handling.
|
27
|
+
|
28
|
+
## Classes
|
29
|
+
### Node
|
30
|
+
A Node has an async task. A node can be started and stopped.
|
31
|
+
|
32
|
+
Node has two child classes: Site and Supervisor.
|
33
|
+
|
34
|
+
### Site
|
35
|
+
A Site represents an RSMP site, typically a traffic light, variable message sign, or other type of field equipment. An RSMP site can connect to one or more supervisors.
|
36
|
+
|
37
|
+
A Site has one or more SupervisorProxies (connections to supervisor).
|
38
|
+
|
39
|
+
A site has one of more components.
|
40
|
+
|
41
|
+
### Supervisor
|
42
|
+
A Supervisor represents an RSMP supervisor, typically a central supervisor system. An RSMP supervisor can handle connections one or more sites.
|
43
|
+
|
44
|
+
A Supervisor has one or more SiteProxies (connections to sites).
|
45
|
+
|
46
|
+
### Proxy
|
47
|
+
A Proxy represents a connection to a remove Site or Supervisor and handles the RSMP interface.
|
48
|
+
|
49
|
+
A proxy has an async task listening for messages on an TCP/IP socket. Incoming RSMP messages are parsing and appropriate handles are called.
|
50
|
+
|
51
|
+
A proxy also has a repaating async timer task for handling watchdog and acknowledgement timeouts.
|
52
|
+
|
53
|
+
Proxy has to child classes: SiteProxy and SupervisorProxy.
|
54
|
+
|
55
|
+
### SiteProxy
|
56
|
+
A connection to a remote Site.
|
57
|
+
|
58
|
+
Handles RSMP messaging specific to a supervisor, including methods for requesting status, sending commands, etc.
|
59
|
+
|
60
|
+
A SiteProxy has one or more components, representing the components in the remote site.
|
61
|
+
|
62
|
+
### SupervisorProxy
|
63
|
+
A connection to a remote Site. Handles RSMP messaging specific to a site, including sending aggregated status, handling status requests, status subscription and command requests.
|
64
|
+
|
65
|
+
Status and command requests are delegated to the appropriate components.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Message distribution
|
2
|
+
|
3
|
+
Proxy - - Notifier --> Listeners
|
4
|
+
|
5
|
+
A proxy distributes messages to listeners, when they are installed.
|
6
|
+
|
7
|
+
Collectors are special listenerws that waits for specific message, and are used to implement methods for waiting for RMSP responses, statuses, alarms, etc.
|
8
|
+
|
9
|
+
Note that Archive is not a listener, and does not receive messages via the Notifier. Instead the Archive gets and stores messages via the log() interface in the Logging module. The reason is that the items that the Archive and the Logger contain other data as well as the message, like error messages, warnings, text descriptions, colors codes, etc. The Distributor and Receiver handles only Message objects.
|
10
|
+
|
11
|
+
## Notifier
|
12
|
+
A module that handles distributing messages to receivers.
|
13
|
+
|
14
|
+
## Listener
|
15
|
+
Receives messages as long as it's installed into a distributor.
|
16
|
+
|
17
|
+
## Collector
|
18
|
+
A subclass of Receiver that wait for specific messages. Once received
|
19
|
+
the client receives the collection.
|
20
|
+
|
21
|
+
## Proxy
|
22
|
+
A proxy includes the Notifier module and distributes each message to listerens after processing it.
|
23
|
+
|
data/lib/rsmp.rb
CHANGED
@@ -10,21 +10,30 @@ require 'json_schemer'
|
|
10
10
|
require 'async/queue'
|
11
11
|
|
12
12
|
require 'rsmp/rsmp'
|
13
|
-
require 'rsmp/
|
13
|
+
require 'rsmp/deep_merge'
|
14
|
+
require 'rsmp/inspect'
|
15
|
+
require 'rsmp/logging'
|
14
16
|
require 'rsmp/wait'
|
15
|
-
require 'rsmp/version'
|
16
17
|
require 'rsmp/node'
|
17
18
|
require 'rsmp/supervisor'
|
19
|
+
require 'rsmp/components'
|
20
|
+
require 'rsmp/notifier'
|
21
|
+
|
22
|
+
require 'rsmp/listener'
|
23
|
+
require 'rsmp/collector'
|
18
24
|
require 'rsmp/component'
|
19
|
-
require 'rsmp/site_base'
|
20
25
|
require 'rsmp/site'
|
21
26
|
require 'rsmp/proxy'
|
22
27
|
require 'rsmp/supervisor_proxy'
|
28
|
+
require 'rsmp/site_proxy_wait'
|
23
29
|
require 'rsmp/site_proxy'
|
24
30
|
require 'rsmp/error'
|
25
|
-
require 'rsmp/probe'
|
26
|
-
require 'rsmp/probe_collection'
|
27
31
|
require 'rsmp/message'
|
28
32
|
require 'rsmp/logger'
|
29
33
|
require 'rsmp/archive'
|
30
34
|
require 'rsmp/tlc'
|
35
|
+
|
36
|
+
require 'rsmp/convert/import/yaml'
|
37
|
+
require 'rsmp/convert/export/json_schema'
|
38
|
+
|
39
|
+
require 'rsmp/version'
|
data/lib/rsmp/archive.rb
CHANGED
@@ -3,22 +3,26 @@
|
|
3
3
|
|
4
4
|
module RSMP
|
5
5
|
class Archive
|
6
|
+
include Inspect
|
7
|
+
|
6
8
|
attr_reader :items
|
7
|
-
attr_accessor :probes
|
8
9
|
|
9
|
-
|
10
|
+
@@index = 0
|
11
|
+
|
12
|
+
def initialize max=100
|
10
13
|
@items = []
|
11
|
-
@
|
14
|
+
@max = max
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
"#<#{self.class.name}:#{self.object_id}, #{inspector(:@items)}>"
|
12
19
|
end
|
13
20
|
|
14
21
|
def self.prepare_item item
|
15
22
|
raise ArgumentError unless item.is_a? Hash
|
16
23
|
|
17
|
-
now_obj = RSMP.now_object
|
18
|
-
now_str = RSMP.now_string(now_obj)
|
19
|
-
|
20
24
|
cleaned = item.select { |k,v| [:author,:level,:ip,:port,:site_id,:component_id,:str,:message,:exception].include? k }
|
21
|
-
cleaned[:timestamp] =
|
25
|
+
cleaned[:timestamp] = Clock.now
|
22
26
|
if item[:message]
|
23
27
|
cleaned[:direction] = item[:message].direction
|
24
28
|
cleaned[:component_id] = item[:message].attributes['cId']
|
@@ -27,6 +31,14 @@ module RSMP
|
|
27
31
|
cleaned
|
28
32
|
end
|
29
33
|
|
34
|
+
def self.increase_index
|
35
|
+
@@index += 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.current_index
|
39
|
+
@@index
|
40
|
+
end
|
41
|
+
|
30
42
|
def by_level levels
|
31
43
|
items.select { |item| levels.include? item[:level] }
|
32
44
|
end
|
@@ -35,27 +47,16 @@ module RSMP
|
|
35
47
|
items.map { |item| item[:str] }
|
36
48
|
end
|
37
49
|
|
38
|
-
def current_index
|
39
|
-
@items.size
|
40
|
-
end
|
41
|
-
|
42
50
|
def add item
|
43
|
-
item[:index] =
|
51
|
+
item[:index] = RSMP::Archive.increase_index
|
44
52
|
@items << item
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
def capture task, options, &block
|
49
|
-
probe = RSMP::Probe.new self
|
50
|
-
probe.capture task, options, &block
|
53
|
+
if @items.size > @max
|
54
|
+
@items.shift
|
55
|
+
end
|
51
56
|
end
|
52
57
|
|
53
58
|
private
|
54
59
|
|
55
|
-
def probe item
|
56
|
-
@probes.process item
|
57
|
-
end
|
58
|
-
|
59
60
|
def find options, &block
|
60
61
|
# search backwards from newest to older, stopping once messages
|
61
62
|
# are older that options[:earliest]
|