rsmp 0.1.31 → 0.1.36

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f80e0af2bf0edfda1135147a08767bb2ab5bcd9af8a16275c720d31b3111277f
4
- data.tar.gz: 39305d0736734baf1bbbb95a765ede6966ade096644a667478f9cb11049d3ae1
3
+ metadata.gz: a9146bde932fc22eeb1f696e9446d063cf98942afa46ef7a876a3ae9b5e3070a
4
+ data.tar.gz: 5044ef657416b04e1e6a519ded5d500d7fe6c98fcde4a1697a0e08a1540d5e3b
5
5
  SHA512:
6
- metadata.gz: 4c94bb1a213635658e290d53098ee4cd7944dac8d14a1bedd14b0762755d8388344221cfd590197a45328091b1df209d519773cb335b894f23049b58f16b3a85
7
- data.tar.gz: e0fd3077875214a36f2142dda0cec205266741be4e9c45e3d8283198f49e5340597bd486daeb5e8d8aeac17047dc913e70c1814386e0d5d459afd39858d37fa6
6
+ metadata.gz: d914ba6a4c7b2ba491999e16be4ae5d12b39ab30482952fec8b07e11ba1801f4bbc6623684c53d0d868258f60cb86b4ddc46cfd0235736d91889b0634516f9b8
7
+ data.tar.gz: a4d7f7fa683c31ed002d2a57c4f0a6f63f1bd99fd7703f25e72ce69d32073f1f19353476f91d7c597feb72ddcc4ff9b71e3108cf13e2bc7b9d0a1534115fcdf8
data/Gemfile.lock CHANGED
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.1.31)
4
+ rsmp (0.1.36)
5
5
  async (~> 1.28.7)
6
6
  async-io (~> 1.30.2)
7
7
  colorize (~> 0.8.1)
8
- rsmp_schemer (~> 0.2.0)
8
+ rsmp_schemer
9
9
  thor (~> 1.0.1)
10
10
 
11
11
  GEM
@@ -28,7 +28,7 @@ GEM
28
28
  builder (3.2.4)
29
29
  childprocess (3.0.0)
30
30
  colorize (0.8.1)
31
- console (1.12.0)
31
+ console (1.13.1)
32
32
  fiber-local
33
33
  contracts (0.16.0)
34
34
  cucumber (3.1.2)
@@ -64,7 +64,7 @@ GEM
64
64
  nio4r (2.5.7)
65
65
  rake (13.0.1)
66
66
  regexp_parser (2.1.1)
67
- rsmp_schemer (0.2.0)
67
+ rsmp_schemer (0.3)
68
68
  json_schemer (~> 0.2.18)
69
69
  rspec (3.9.0)
70
70
  rspec-core (~> 3.9.0)
data/lib/rsmp/cli.rb CHANGED
@@ -30,8 +30,8 @@ module RSMP
30
30
  end
31
31
 
32
32
  if options[:supervisors]
33
+ settings['supervisors'] = []
33
34
  options[:supervisors].split(',').each do |supervisor|
34
- settings['supervisors'] = []
35
35
  ip, port = supervisor.split ':'
36
36
  ip = '127.0.0.1' if ip.empty?
37
37
  port = '12111' if port.empty?
@@ -28,7 +28,7 @@ module RSMP
28
28
  @aggregated_status_bools[5] = true
29
29
  end
30
30
 
31
- def set_aggregated_status status
31
+ def set_aggregated_status status, options={}
32
32
  status = [status] if status.is_a? Symbol
33
33
  raise InvalidArgument unless status.is_a? Array
34
34
  input = status & AGGREGATED_STATUS_KEYS
@@ -36,7 +36,7 @@ module RSMP
36
36
  AGGREGATED_STATUS_KEYS.each_with_index do |key,index|
37
37
  @aggregated_status_bools[index] = status.include?(key)
38
38
  end
39
- aggrated_status_changed
39
+ aggregated_status_changed options
40
40
  end
41
41
  end
42
42
 
@@ -50,12 +50,12 @@ module RSMP
50
50
  @aggregated_status_bools[index] = on
51
51
  @aggregated_status << key if on
52
52
  end
53
- aggrated_status_changed
53
+ aggregated_status_changed
54
54
  end
55
55
  end
56
56
 
57
- def aggrated_status_changed
58
- @node.aggrated_status_changed self
57
+ def aggregated_status_changed options={}
58
+ @node.aggregated_status_changed self, options
59
59
  end
60
60
 
61
61
  def alarm code:, status:
@@ -8,7 +8,7 @@ module RSMP
8
8
  @components = {}
9
9
  end
10
10
 
11
- def aggrated_status_changed component
11
+ def aggregated_status_changed component, options={}
12
12
  end
13
13
 
14
14
  def setup_components settings
@@ -1,4 +1,4 @@
1
- class Hash
1
+ class Hash
2
2
  def deep_merge(other_hash)
3
3
  self.merge(other_hash) do |key, old, fresh|
4
4
  if old.is_a?(Hash) && fresh.is_a?(Hash)
data/lib/rsmp/proxy.rb CHANGED
@@ -528,18 +528,6 @@ module RSMP
528
528
  def version_acknowledged
529
529
  end
530
530
 
531
- def wait_for_acknowledgement original, timeout
532
- raise ArgumentError unless original
533
- wait_for(@acknowledgement_condition,timeout) do |message|
534
- if message.is_a?(MessageNotAck) && message.attributes["oMId"] == original.m_id
535
- raise RSMP::MessageRejected.new(message.attributes['rea'])
536
- end
537
- message.is_a?(MessageAck) && message.attributes["oMId"] == original.m_id
538
- end
539
- rescue Async::TimeoutError
540
- raise RSMP::TimeoutError.new("Acknowledgement for #{original.type} #{original.m_id} not received within #{timeout}s")
541
- end
542
-
543
531
  def node
544
532
  raise 'Must be overridden'
545
533
  end
@@ -547,5 +535,29 @@ module RSMP
547
535
  def author
548
536
  node.site_id
549
537
  end
538
+
539
+ def wait_for_acknowledgement parent_task, options={}, m_id
540
+ collect(parent_task,options.merge({
541
+ type: ['MessageAck','MessageNotAck'],
542
+ num: 1
543
+ })) do |message|
544
+ if message.is_a?(MessageNotAck)
545
+ if message.attribute('oMId') == m_id
546
+ # set result to an exception, but don't raise it.
547
+ # this will be returned by the task and stored as the task result
548
+ # when the parent task call wait() on the task, the exception
549
+ # will be raised in the parent task, and caught by rspec.
550
+ # rspec will then show the error and record the test as failed
551
+ m_id_short = RSMP::Message.shorten_m_id m_id, 8
552
+ result = RSMP::MessageRejected.new "Aggregated status request #{m_id_short} was rejected: #{message.attribute('rea')}"
553
+ next true # done, no more messages wanted
554
+ end
555
+ elsif message.is_a?(MessageAck)
556
+ next true if message.attribute('oMId') == m_id
557
+ end
558
+ false
559
+ end
560
+ end
561
+
550
562
  end
551
563
  end
data/lib/rsmp/site.rb CHANGED
@@ -14,6 +14,7 @@ module RSMP
14
14
  super options
15
15
  @proxies = []
16
16
  @sleep_condition = Async::Notification.new
17
+ @proxies_condition = Async::Notification.new
17
18
  end
18
19
 
19
20
  def site_id
@@ -30,7 +31,7 @@ module RSMP
30
31
  'sxl' => 'tlc',
31
32
  'sxl_version' => '1.0.15',
32
33
  'intervals' => {
33
- 'timer_' => 0.1,
34
+ 'timer' => 0.1,
34
35
  'watchdog' => 1,
35
36
  'reconnect' => 0.1
36
37
  },
@@ -52,7 +53,7 @@ module RSMP
52
53
  def check_sxl_version
53
54
  sxl = @site_settings['sxl']
54
55
  version = @site_settings['sxl_version']
55
- RSMP::Schemer::find_schema! sxl, version
56
+ RSMP::Schemer::find_schema! sxl, version, lenient: true
56
57
  end
57
58
 
58
59
  def reconnect
@@ -74,9 +75,9 @@ module RSMP
74
75
  SupervisorProxy.new settings
75
76
  end
76
77
 
77
- def aggrated_status_changed component
78
+ def aggregated_status_changed component, options={}
78
79
  @proxies.each do |proxy|
79
- proxy.send_aggregated_status component
80
+ proxy.send_aggregated_status component, options
80
81
  end
81
82
  end
82
83
 
@@ -91,9 +92,11 @@ module RSMP
91
92
  archive: @archive
92
93
  })
93
94
  @proxies << proxy
95
+ @proxies_condition.signal
94
96
  run_site_proxy task, proxy
95
97
  ensure
96
98
  @proxies.delete proxy
99
+ @proxies_condition.signal
97
100
  end
98
101
 
99
102
  def run_site_proxy task, proxy
@@ -142,5 +145,19 @@ module RSMP
142
145
  end
143
146
  end
144
147
 
148
+ def wait_for_supervisor ip, timeout
149
+ supervisor = find_supervisor ip
150
+ return supervisor if supervisor
151
+ wait_for(@proxy_condition,timeout) { find_supervisor ip }
152
+ rescue Async::TimeoutError
153
+ raise RSMP::TimeoutError.new "Supervisor '#{ip}' did not connect within #{timeout}s"
154
+ end
155
+
156
+ def find_supervisor ip
157
+ @proxies.each do |supervisor|
158
+ return supervisor if ip == :any || supervisor.ip == ip
159
+ end
160
+ nil
161
+ end
145
162
  end
146
163
  end
@@ -94,7 +94,7 @@ module RSMP
94
94
  if options[:collect]
95
95
  result = nil
96
96
  task = @task.async do |task|
97
- wait_for_aggregated_status task, options[:collect]
97
+ wait_for_aggregated_status task, options[:collect], m_id
98
98
  end
99
99
  send_message message, validate: options[:validate]
100
100
  return message, task.wait
@@ -134,7 +134,7 @@ module RSMP
134
134
  acknowledge message
135
135
  end
136
136
 
137
- def aggrated_status_changed component
137
+ def aggregated_status_changed component, options={}
138
138
  @supervisor.aggregated_status_changed self, component
139
139
  end
140
140
 
@@ -308,7 +308,7 @@ module RSMP
308
308
  # comes from the Version message send by the site
309
309
  type = 'tlc'
310
310
  version = message.attribute 'SXL'
311
- RSMP::Schemer::find_schema! type, version
311
+ RSMP::Schemer::find_schema! type, version, lenient: true
312
312
 
313
313
  # store sxl version requested by site
314
314
  # TODO should check agaist site settings
@@ -2,24 +2,6 @@
2
2
  module RSMP
3
3
  module SiteProxyWait
4
4
 
5
- def wait_for_status_updates parent_task, options={}, &send_block
6
- send_while_collecting parent_task, send_block do |task, m_id|
7
- collect_status_updates_or_responses task, 'StatusUpdate', options, m_id
8
- end
9
- end
10
-
11
- def wait_for_status_responses parent_task, options={}, &send_block
12
- send_while_collecting parent_task, send_block do |task, m_id|
13
- collect_status_updates_or_responses task, 'StatusResponse', options, m_id
14
- end
15
- end
16
-
17
- def wait_for_command_responses parent_task, options={}, &send_block
18
- send_while_collecting parent_task, send_block do |task, m_id|
19
- collect_command_responses task, options, m_id
20
- end
21
- end
22
-
23
5
  def wait_for_alarm parent_task, options={}
24
6
  matching_alarm = nil
25
7
  message = collect(parent_task,options.merge(type: "Alarm", with_message: true, num: 1)) do |message|
@@ -161,24 +143,7 @@ module RSMP
161
143
  true
162
144
  end
163
145
 
164
- def send_while_collecting parent_task, send_block, &collect_block
165
- m_id = RSMP::Message.make_m_id # make message id so we can start waiting for it
166
-
167
- # wait for command responses in an async task
168
- task = parent_task.async do |task|
169
- collect_block.call task, m_id
170
- rescue StandardError => e
171
- notify_error e, level: :internal
172
- end
173
-
174
- # call block, it should send command request using the given m_id
175
- send_block.call m_id
176
-
177
- # wait for the response and return it, raise exception if NotAck received, it it timed out
178
- task.wait
179
- end
180
-
181
- def wait_for_aggregated_status parent_task, options={}
146
+ def wait_for_aggregated_status parent_task, options, m_id
182
147
  collect(parent_task,options.merge({
183
148
  type: ['AggregatedStatus','MessageNotAck'],
184
149
  num: 1
@@ -49,7 +49,6 @@ module RSMP
49
49
  raise RSMP::ConfigurationError.new("Configuration for site '#{site_id}' is empty")
50
50
  end
51
51
  sxl = settings['sxl']
52
- sxl = 'tlc' unless sxl # temporary fix until configs are updated
53
52
  unless sxl
54
53
  raise RSMP::ConfigurationError.new("Configuration error for site '#{site_id}': No SXL specified")
55
54
  end
@@ -123,15 +123,28 @@ module RSMP
123
123
  @version_determined = true
124
124
  end
125
125
 
126
- def send_aggregated_status component
126
+ def send_aggregated_status component, options={}
127
+ m_id = options[:m_id] || RSMP::Message.make_m_id
127
128
  message = AggregatedStatus.new({
128
129
  "aSTS" => clock.to_s,
129
130
  "cId" => component.c_id,
130
131
  "fP" => 'NormalControl',
131
132
  "fS" => nil,
132
- "se" => component.aggregated_status_bools
133
+ "se" => component.aggregated_status_bools,
134
+ "mId" => m_id
133
135
  })
134
- send_message message
136
+
137
+ if options[:collect]
138
+ result = nil
139
+ task = @task.async do |task|
140
+ wait_for_acknowledgement task, options[:collect], m_id
141
+ end
142
+ send_message message, validate: options[:validate]
143
+ return message, task.wait
144
+ else
145
+ send_message message, validate: options[:validate]
146
+ message
147
+ end
135
148
  end
136
149
 
137
150
  def process_aggregated_status message
data/lib/rsmp/tlc.rb CHANGED
@@ -69,7 +69,7 @@ module RSMP
69
69
  group.move pos
70
70
  end
71
71
  if pos == 0
72
- aggrated_status_changed
72
+ aggregated_status_changed
73
73
  end
74
74
  end
75
75
 
@@ -798,7 +798,7 @@ module RSMP
798
798
  super options
799
799
  @sxl = 'traffic_light_controller'
800
800
  @security_codes = options[:site_settings]['security_codes']
801
- @interval = options[:site_settings]['interval'] || 1
801
+ @interval = options[:site_settings]['intervals']['timer'] || 1
802
802
  unless @main
803
803
  raise ConfigurationError.new "TLC must have a main component"
804
804
  end
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.1.31"
2
+ VERSION = "0.1.36"
3
3
  end
data/rsmp.gemspec CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "async-io", "~> 1.30.2"
35
35
  spec.add_dependency "colorize", "~> 0.8.1"
36
36
  spec.add_dependency "thor", "~> 1.0.1"
37
- spec.add_dependency "rsmp_schemer", "~> 0.2.0"
37
+ spec.add_dependency "rsmp_schemer"
38
38
 
39
39
  spec.add_development_dependency "bundler", "~> 2.2.3"
40
40
  spec.add_development_dependency "rake", "~> 13.0.1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.31
4
+ version: 0.1.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Tin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-02 00:00:00.000000000 Z
11
+ date: 2021-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: rsmp_schemer
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.2.0
75
+ version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.2.0
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bundler
85
85
  requirement: !ruby/object:Gem::Requirement