rsmp 0.1.11 → 0.1.21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96c6fb10c7c6e59410be4cbd59a29ca3cd157231e3e8800982616c0d036d82bb
4
- data.tar.gz: 3f29330cabf6abf2f0e96c81cefd3765560ae6224e41dfc59061473951c0e756
3
+ metadata.gz: 0aea7740c0640bc069efa1ec9426deb23b3bf4e3f7dce4656e3df814500615d3
4
+ data.tar.gz: 30d954a75a62d71d46b76b30e448dbc2e30281784f18b82488780e9837b1223b
5
5
  SHA512:
6
- metadata.gz: 85c04e5637cefcf677546c2dbd887126276499c88d1e3261080957177f6e2a8853694134e28733ff9d77268a7ba574ec498801bf5f0752d92b919b8d64884012
7
- data.tar.gz: ba575044445b063bff0751aeddf42849de980604f43d69765b62a39764a13e7f46ea220bc08bbc6ecabc0cdadc0a287c2ade6b3e846a8a823a101a4674420692
6
+ metadata.gz: 7a42695cbf11f334d1873843a2550e7734d7719e8fca7ef245d32946d71aa884b6305ff329afbd1713caec41bf213bd0aab62d4f91f5d685c05ed5ce929c68f6
7
+ data.tar.gz: 3e6c90b6aa6d505285fc27613ce06716f5a00a21893d266cb2e31e0c0f99ea2784610f30f9c4a583c129e95c94770c84a08aabcc6e0e35accfc70b94f3aa2e60
data/.gitignore CHANGED
@@ -12,5 +12,6 @@ log
12
12
  /spec/reports/
13
13
  /tmp/
14
14
  /lib/rsmp_schema/
15
+ /config/private/
15
16
 
16
17
 
@@ -1,35 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.1.11)
5
- async (~> 1.23.0)
6
- async-io (~> 1.27.1)
4
+ rsmp (0.1.21)
5
+ async (~> 1.28.3)
6
+ async-io (~> 1.30.1)
7
7
  colorize (~> 0.8.1)
8
- json_schemer (~> 0.2.8)
9
- thor (~> 0.20.3)
8
+ json_schemer (~> 0.2.17)
9
+ thor (~> 1.0.1)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- aruba (0.14.11)
15
- childprocess (>= 0.6.3, < 3.0.0)
16
- contracts (~> 0.9)
17
- cucumber (>= 1.3.19)
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 (>= 2.99)
20
- thor (~> 0.19)
21
- async (1.23.0)
22
- console (~> 1.0)
19
+ rspec-expectations (~> 3.4)
20
+ thor (~> 1.0)
21
+ async (1.28.3)
22
+ console (~> 1.10)
23
23
  nio4r (~> 2.3)
24
24
  timers (~> 4.1)
25
- async-io (1.27.1)
25
+ async-io (1.30.1)
26
26
  async (~> 1.14)
27
- backports (3.15.0)
28
- builder (3.2.3)
29
- childprocess (2.0.0)
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.6.0)
31
+ console (1.10.1)
32
+ fiber-local
33
33
  contracts (0.16.0)
34
34
  cucumber (3.1.2)
35
35
  builder (>= 2.1.2)
@@ -48,54 +48,52 @@ 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.2.0)
52
- regexp_parser (~> 1.2)
53
- ffi (1.11.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.5)
56
- json_schemer (0.2.8)
57
- ecma-re-validator (~> 0.2)
56
+ hana (1.3.7)
57
+ json_schemer (0.2.17)
58
+ ecma-re-validator (~> 0.3)
58
59
  hana (~> 1.3)
59
- regexp_parser (~> 1.5)
60
+ regexp_parser (~> 2.0)
60
61
  uri_template (~> 0.7)
61
- multi_json (1.13.1)
62
+ multi_json (1.14.1)
62
63
  multi_test (0.1.2)
63
- nio4r (2.5.2)
64
- rake (10.5.0)
65
- regexp_parser (1.6.0)
66
- rspec (3.8.0)
67
- rspec-core (~> 3.8.0)
68
- rspec-expectations (~> 3.8.0)
69
- rspec-mocks (~> 3.8.0)
70
- rspec-core (3.8.2)
71
- rspec-support (~> 3.8.0)
72
- rspec-expectations (3.8.4)
64
+ nio4r (2.5.4)
65
+ rake (13.0.1)
66
+ regexp_parser (2.0.3)
67
+ rspec (3.9.0)
68
+ rspec-core (~> 3.9.0)
69
+ rspec-expectations (~> 3.9.0)
70
+ rspec-mocks (~> 3.9.0)
71
+ rspec-core (3.9.1)
72
+ rspec-support (~> 3.9.1)
73
+ rspec-expectations (3.9.1)
73
74
  diff-lcs (>= 1.2.0, < 2.0)
74
- rspec-support (~> 3.8.0)
75
- rspec-mocks (3.8.1)
75
+ rspec-support (~> 3.9.0)
76
+ rspec-mocks (3.9.1)
76
77
  diff-lcs (>= 1.2.0, < 2.0)
77
- rspec-support (~> 3.8.0)
78
- rspec-support (3.8.2)
79
- rspec-with_params (0.2.0)
80
- rspec (~> 3.0)
81
- thor (0.20.3)
78
+ rspec-support (~> 3.9.0)
79
+ rspec-support (3.9.2)
80
+ thor (1.0.1)
82
81
  timecop (0.9.1)
83
- timers (4.3.0)
82
+ timers (4.3.2)
84
83
  uri_template (0.7.0)
85
84
 
86
85
  PLATFORMS
87
86
  ruby
88
87
 
89
88
  DEPENDENCIES
90
- aruba (~> 0.14.11)
91
- bundler (~> 2.0)
89
+ aruba (~> 1.0.0)
90
+ bundler (~> 2.2.3)
92
91
  cucumber (~> 3.1.2)
93
- rake (~> 10.0)
92
+ rake (~> 13.0.1)
94
93
  rsmp!
95
- rspec (~> 3.0)
96
- rspec-expectations (~> 3.8.3)
97
- rspec-with_params (~> 0.2.0)
94
+ rspec (~> 3.9.0)
95
+ rspec-expectations (~> 3.9.1)
98
96
  timecop (~> 0.9.1)
99
97
 
100
98
  BUNDLED WITH
101
- 2.1.0.pre.2
99
+ 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
@@ -12,8 +12,8 @@ rsmp_versions:
12
12
  - 3.1.4
13
13
 
14
14
  components:
15
- C1:
16
- type: main
15
+ main:
16
+ C1:
17
17
 
18
18
  watchdog_interval: 1
19
19
  watchdog_timeout: 2
@@ -0,0 +1,44 @@
1
+ site_id: RN+SI0001
2
+ supervisors:
3
+ - ip: 127.0.0.1
4
+ port: 12111
5
+
6
+ components:
7
+ main:
8
+ TC:
9
+ cycle_time: 6
10
+ signal_group:
11
+ A1:
12
+ plan: '11NBBB'
13
+ A2:
14
+ plan: '1NBBBB'
15
+ B1:
16
+ plan: 'BBB11N'
17
+ B2:
18
+ plan: 'BBB1NB'
19
+ detector_logic:
20
+ DL1:
21
+ watchdog_interval: 0.1
22
+ watchdog_timeout: 0.2
23
+ acknowledgement_timeout: 0.2
24
+ reconnect_interval: 0.1
25
+
26
+ security_codes:
27
+ 1: '1111'
28
+ 2: '2222'
29
+
30
+ log:
31
+ active: true
32
+ color: true
33
+ timestamp: true
34
+ id: true
35
+ component: true
36
+ ip: false
37
+ site_id: true
38
+ level: false
39
+ text: true
40
+ direction: true
41
+ json: true
42
+ acknowledgements: false
43
+ watchdogs: false
44
+
@@ -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 - - Distributor --> Receivers
4
+
5
+ A proxy distributes message to receivers, when they are installed.
6
+
7
+ Probes are special receivers 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 receiver, and does not receive messages via the Distributor. 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
+ ## Distributor
12
+ A module that handles distributing messages to receivers.
13
+
14
+ ## Receiver
15
+ Receives messages as long as it's installed into a distributor.
16
+
17
+ ## Probe
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 Distributor module and distributes each message to listerens after processing it.
23
+
@@ -10,20 +10,25 @@ require 'json_schemer'
10
10
  require 'async/queue'
11
11
 
12
12
  require 'rsmp/rsmp'
13
- require 'rsmp/base'
13
+ require 'rsmp/logging'
14
14
  require 'rsmp/wait'
15
- require 'rsmp/version'
16
15
  require 'rsmp/node'
17
16
  require 'rsmp/supervisor'
17
+ require 'rsmp/components'
18
+ require 'rsmp/notifier'
19
+
20
+ require 'rsmp/listener'
21
+ require 'rsmp/collector'
18
22
  require 'rsmp/component'
19
- require 'rsmp/site_base'
20
23
  require 'rsmp/site'
21
24
  require 'rsmp/proxy'
22
25
  require 'rsmp/supervisor_proxy'
26
+ require 'rsmp/site_proxy_wait'
23
27
  require 'rsmp/site_proxy'
24
28
  require 'rsmp/error'
25
- require 'rsmp/probe'
26
- require 'rsmp/probe_collection'
27
29
  require 'rsmp/message'
28
30
  require 'rsmp/logger'
29
31
  require 'rsmp/archive'
32
+ require 'rsmp/tlc'
33
+
34
+ require 'rsmp/version'
@@ -4,11 +4,12 @@
4
4
  module RSMP
5
5
  class Archive
6
6
  attr_reader :items
7
- attr_accessor :probes
8
7
 
9
- def initialize
8
+ @@index = 0
9
+
10
+ def initialize max=100
10
11
  @items = []
11
- @probes = ProbeCollection.new
12
+ @max = max
12
13
  end
13
14
 
14
15
  def self.prepare_item item
@@ -27,6 +28,14 @@ module RSMP
27
28
  cleaned
28
29
  end
29
30
 
31
+ def self.increase_index
32
+ @@index += 1
33
+ end
34
+
35
+ def self.current_index
36
+ @@index
37
+ end
38
+
30
39
  def by_level levels
31
40
  items.select { |item| levels.include? item[:level] }
32
41
  end
@@ -35,27 +44,16 @@ module RSMP
35
44
  items.map { |item| item[:str] }
36
45
  end
37
46
 
38
- def current_index
39
- @items.size
40
- end
41
-
42
47
  def add item
43
- item[:index] = @items.size
48
+ item[:index] = RSMP::Archive.increase_index
44
49
  @items << item
45
- probe item
46
- end
47
-
48
- def capture task, options, &block
49
- probe = RSMP::Probe.new self
50
- probe.capture task, options, &block
50
+ if @items.size > @max
51
+ @items.shift
52
+ end
51
53
  end
52
54
 
53
55
  private
54
56
 
55
- def probe item
56
- @probes.process item
57
- end
58
-
59
57
  def find options, &block
60
58
  # search backwards from newest to older, stopping once messages
61
59
  # are older that options[:earliest]
@@ -10,6 +10,7 @@ module RSMP
10
10
  method_option :supervisors, :type => :string, :aliases => "-s", banner: 'ip:port,... list of supervisor to connect to'
11
11
  method_option :log, :type => :string, :aliases => "-l", banner: 'Path to log file'
12
12
  method_option :json, :type => :boolean, :aliases => "-j", banner: 'Show JSON messages in log'
13
+ method_option :type, :type => :string, :aliases => "-t", banner: 'Type of site: [tlc]'
13
14
  def site
14
15
  settings = {}
15
16
  log_settings = { 'active' => true }
@@ -17,7 +18,7 @@ module RSMP
17
18
  if options[:config]
18
19
  if File.exist? options[:config]
19
20
  settings = YAML.load_file options[:config]
20
- log_settings = settings.delete 'log'
21
+ log_settings = settings.delete('log') || {}
21
22
  else
22
23
  puts "Error: Config #{options[:config]} not found"
23
24
  exit
@@ -28,9 +29,9 @@ module RSMP
28
29
  settings['site_id'] = options[:id]
29
30
  end
30
31
 
31
- if options[:supervisors]
32
- options[:supervisors].split(',').each do |supervisor|
33
- settings[:supervisors] ||= []
32
+ if options[:supervisors]
33
+ options[:supervisors].split(',').each do |supervisor|
34
+ settings[:supervisors] ||= []
34
35
  ip, port = supervisor.split ':'
35
36
  ip = '127.0.0.1' if ip.empty?
36
37
  port = '12111' if port.empty?
@@ -46,7 +47,16 @@ module RSMP
46
47
  log_settings['json'] = options[:json]
47
48
  end
48
49
 
49
- RSMP::Site.new(site_settings:settings, log_settings: log_settings).start
50
+ site_class = RSMP::Site
51
+ if options[:type]
52
+ case options[:type]
53
+ when 'tlc'
54
+ site_class = RSMP::Tlc
55
+ else
56
+ site_class = RSMP::Site
57
+ end
58
+ end
59
+ site_class.new(site_settings:settings, log_settings: log_settings).start
50
60
  end
51
61
 
52
62
  desc "supervisor", "Run RSMP supervisor"