rsmp 0.1.32 → 0.1.37

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: 7992be63350c61210d51f99a820314c3e8d9d7020e5e08e5000d2fb4a054e96e
4
- data.tar.gz: b2b0d397391912c748fe6f1a9b7ea1896e17affaead760ac58b1df8b00355164
3
+ metadata.gz: a20b2e46548b2ebcdc9e3148168fafb7062113d171d88bef186900b0c8fe98a9
4
+ data.tar.gz: 436e96144e55742c3c9df9f549ca345c21137deb579c10d10fcefdaad1d94a39
5
5
  SHA512:
6
- metadata.gz: fce26ff77f208cfe072a0f672a66e75e64d7e73fa7fe61ca28604df64a4c1039cc566340338d5734b745bfadf7fdfc9b34ed6e444a78984e97a1e009f07e68c3
7
- data.tar.gz: 698e829317c201896b52ac2a3f2c2c9258d947a64b2cf3b6f3dbc82fff987881c65603d3966437b4b699d6962cf1d38d30da1b31b3d09e2c24fa19519aa2cfbc
6
+ metadata.gz: d2e07fc806b798e15af70789085d6c5ecf582b46dfe9ff7e5ed2cd48f8e8b2d7d74eddb66ed488150dee047d1fc3886b8d84edf7dc85976db570e89544f29160
7
+ data.tar.gz: 8baba395982e5c105a7e04d3a0c01c91a89ae82fb21cfd180c3fe6adf436cc4b70a437206c1f499f5c5cbfe476746d7cebd1c0b38f1354a467ff4e0f80b6904d
data/Gemfile.lock CHANGED
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.1.32)
4
+ rsmp (0.1.37)
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)
@@ -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
data/lib/rsmp/proxy.rb CHANGED
@@ -162,6 +162,8 @@ module RSMP
162
162
  begin
163
163
  now = Clock.now
164
164
  timer(now)
165
+ rescue RSMP::Schemer::Error => e
166
+ puts "Timer: Schema error: #{e}"
165
167
  rescue EOFError => e
166
168
  log "Timer: Connection closed: #{e}", level: :warning
167
169
  rescue IOError => e
@@ -246,7 +248,7 @@ module RSMP
246
248
  # TODO
247
249
  # what schema should we use to validate the intial Version and MessageAck messages?
248
250
  schemas = { core: '3.1.5' }
249
- schemas[sxl] = sxl_version if sxl
251
+ schemas[sxl] = RSMP::Schemer.sanitize_version(sxl_version) if sxl
250
252
  schemas
251
253
  end
252
254
 
@@ -261,7 +263,7 @@ module RSMP
261
263
  log_send message, reason
262
264
  rescue EOFError, IOError
263
265
  buffer_message message
264
- rescue SchemaError => e
266
+ rescue SchemaError, RSMP::Schemer::Error => e
265
267
  str = "Could not send #{message.type} because schema validation failed: #{e.message}"
266
268
  log str, message: message, level: :error
267
269
  notify_error e.exception("#{str} #{message.json}")
@@ -306,7 +308,7 @@ module RSMP
306
308
  log str, message: Malformed.new(attributes), level: :warning
307
309
  # cannot send NotAcknowledged for a malformed message since we can't read it, just ignore it
308
310
  nil
309
- rescue SchemaError => e
311
+ rescue SchemaError, RSMP::Schemer::Error => e
310
312
  str = "Received invalid #{message.type}, schema errors: #{e.message}"
311
313
  log str, message: message, level: :warning
312
314
  notify_error e.exception("#{str} #{message.json}")
@@ -528,18 +530,6 @@ module RSMP
528
530
  def version_acknowledged
529
531
  end
530
532
 
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
533
  def node
544
534
  raise 'Must be overridden'
545
535
  end
@@ -547,5 +537,29 @@ module RSMP
547
537
  def author
548
538
  node.site_id
549
539
  end
540
+
541
+ def wait_for_acknowledgement parent_task, options={}, m_id
542
+ collect(parent_task,options.merge({
543
+ type: ['MessageAck','MessageNotAck'],
544
+ num: 1
545
+ })) do |message|
546
+ if message.is_a?(MessageNotAck)
547
+ if message.attribute('oMId') == m_id
548
+ # set result to an exception, but don't raise it.
549
+ # this will be returned by the task and stored as the task result
550
+ # when the parent task call wait() on the task, the exception
551
+ # will be raised in the parent task, and caught by rspec.
552
+ # rspec will then show the error and record the test as failed
553
+ m_id_short = RSMP::Message.shorten_m_id m_id, 8
554
+ result = RSMP::MessageRejected.new "Aggregated status request #{m_id_short} was rejected: #{message.attribute('rea')}"
555
+ next true # done, no more messages wanted
556
+ end
557
+ elsif message.is_a?(MessageAck)
558
+ next true if message.attribute('oMId') == m_id
559
+ end
560
+ false
561
+ end
562
+ end
563
+
550
564
  end
551
565
  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
@@ -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
@@ -36,7 +36,8 @@ module RSMP
36
36
 
37
37
  def connection_complete
38
38
  super
39
- log "Connection to site #{@site_id} established, using core #{@rsmp_version}, #{@sxl} #{@site_sxl_version}", level: :info
39
+ sanitized_sxl_version = RSMP::Schemer.sanitize_version(@site_sxl_version)
40
+ log "Connection to site #{@site_id} established, using core #{@rsmp_version}, #{@sxl} #{sanitized_sxl_version}", level: :info
40
41
  end
41
42
 
42
43
  def process_message message
@@ -94,7 +95,7 @@ module RSMP
94
95
  if options[:collect]
95
96
  result = nil
96
97
  task = @task.async do |task|
97
- wait_for_aggregated_status task, options[:collect]
98
+ wait_for_aggregated_status task, options[:collect], m_id
98
99
  end
99
100
  send_message message, validate: options[:validate]
100
101
  return message, task.wait
@@ -134,7 +135,7 @@ module RSMP
134
135
  acknowledge message
135
136
  end
136
137
 
137
- def aggrated_status_changed component
138
+ def aggregated_status_changed component, options={}
138
139
  @supervisor.aggregated_status_changed self, component
139
140
  end
140
141
 
@@ -308,11 +309,13 @@ module RSMP
308
309
  # comes from the Version message send by the site
309
310
  type = 'tlc'
310
311
  version = message.attribute 'SXL'
311
- RSMP::Schemer::find_schema! type, version
312
+ RSMP::Schemer::find_schema! type, version, lenient: true
312
313
 
313
314
  # store sxl version requested by site
314
315
  # TODO should check agaist site settings
315
316
  @site_sxl_version = message.attribute 'SXL'
317
+ rescue RSMP::Schemer::UnknownSchemaError => e
318
+ dont_acknowledge message, "Rejected #{message.type} message,", "#{e}"
316
319
  end
317
320
 
318
321
  def sxl_version
@@ -327,8 +330,6 @@ module RSMP
327
330
  check_rsmp_version message
328
331
  check_sxl_version message
329
332
  version_accepted message
330
- rescue RSMP::Schemer::UnknownSchemaError => e
331
- dont_acknowledge message, "Rejected #{message.type} message,", "#{e}"
332
333
  end
333
334
 
334
335
  def check_site_ids message
@@ -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
@@ -54,7 +54,8 @@ module RSMP
54
54
 
55
55
  def connection_complete
56
56
  super
57
- log "Connection to supervisor established, using core #{@rsmp_version}, #{sxl} #{sxl_version}", level: :info
57
+ sanitized_sxl_version = RSMP::Schemer.sanitize_version(sxl_version)
58
+ log "Connection to supervisor established, using core #{@rsmp_version}, #{sxl} #{sanitized_sxl_version}", level: :info
58
59
  start_watchdog
59
60
  end
60
61
 
@@ -123,15 +124,28 @@ module RSMP
123
124
  @version_determined = true
124
125
  end
125
126
 
126
- def send_aggregated_status component
127
+ def send_aggregated_status component, options={}
128
+ m_id = options[:m_id] || RSMP::Message.make_m_id
127
129
  message = AggregatedStatus.new({
128
130
  "aSTS" => clock.to_s,
129
131
  "cId" => component.c_id,
130
132
  "fP" => 'NormalControl',
131
133
  "fS" => nil,
132
- "se" => component.aggregated_status_bools
134
+ "se" => component.aggregated_status_bools,
135
+ "mId" => m_id
133
136
  })
134
- send_message message
137
+
138
+ if options[:collect]
139
+ result = nil
140
+ task = @task.async do |task|
141
+ wait_for_acknowledgement task, options[:collect], m_id
142
+ end
143
+ send_message message, validate: options[:validate]
144
+ return message, task.wait
145
+ else
146
+ send_message message, validate: options[:validate]
147
+ message
148
+ end
135
149
  end
136
150
 
137
151
  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
 
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.1.32"
2
+ VERSION = "0.1.37"
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.32
4
+ version: 0.1.37
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