rsmp 0.1.17 → 0.1.19
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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +14 -12
- data/README.md +1 -1
- data/config/tlc.yaml +7 -6
- data/documentation/classes.md +62 -0
- data/lib/rsmp/archive.rb +11 -5
- data/lib/rsmp/component.rb +1 -0
- data/lib/rsmp/error.rb +1 -1
- data/lib/rsmp/message.rb +25 -2
- data/lib/rsmp/node.rb +33 -6
- data/lib/rsmp/probe.rb +5 -18
- data/lib/rsmp/proxy.rb +37 -41
- data/lib/rsmp/site.rb +4 -1
- data/lib/rsmp/site_proxy.rb +84 -65
- data/lib/rsmp/supervisor.rb +3 -2
- data/lib/rsmp/supervisor_proxy.rb +50 -14
- data/lib/rsmp/tlc.rb +185 -65
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp/wait.rb +149 -3
- metadata +9 -3
- data/lib/rsmp/supervisor_base.rb +0 -10
data/lib/rsmp/version.rb
CHANGED
data/lib/rsmp/wait.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# Helper for waiting for an Async condition using a block
|
2
2
|
|
3
3
|
module RSMP
|
4
|
-
|
4
|
+
module Wait
|
5
5
|
|
6
|
-
def
|
7
|
-
|
6
|
+
def wait_for condition, timeout, &block
|
7
|
+
raise RuntimeError.new("Can't wait for state because task is stopped") unless @task.running?
|
8
|
+
@task.with_timeout(timeout) do
|
8
9
|
while task.running? do
|
9
10
|
value = condition.wait
|
10
11
|
result = yield value
|
@@ -13,5 +14,150 @@ module RSMP
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
17
|
+
def capture_status_updates_or_responses task, type, options, m_id
|
18
|
+
task.annotate "wait for status update/response"
|
19
|
+
want = convert_status_list options[:status_list]
|
20
|
+
result = {}
|
21
|
+
# wait for a status update
|
22
|
+
item = @archive.capture(task,options.merge({
|
23
|
+
type: [type,'MessageNotAck'],
|
24
|
+
num: 1
|
25
|
+
})) do |item|
|
26
|
+
message = item[:message]
|
27
|
+
if message.is_a?(MessageNotAck) && message.attribute('oMId') == m_id
|
28
|
+
# set result to an exception, but don't raise it.
|
29
|
+
# this will be returned by the task and stored as the task result
|
30
|
+
# when the parent task call wait() on the task, the exception
|
31
|
+
# will be raised in the parent task, and caught by rspec.
|
32
|
+
# rspec will then show the error and record the test as failed
|
33
|
+
m_id_short = RSMP::Message.shorten_m_id m_id, 8
|
34
|
+
result = RSMP::MessageRejected.new "Status request #{m_id_short} was rejected: #{message.attribute('rea')}"
|
35
|
+
next true # done, no more messages wanted
|
36
|
+
end
|
37
|
+
found = []
|
38
|
+
# look through querues
|
39
|
+
want.each_with_index do |query,i|
|
40
|
+
# look through status items in message
|
41
|
+
item[:message].attributes['sS'].each do |input|
|
42
|
+
ok = status_match? query, input
|
43
|
+
if ok
|
44
|
+
result[query] = input
|
45
|
+
found << i # record which queries where matched succesfully
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
# remove queries that where matched
|
50
|
+
found.sort.reverse.each do |i|
|
51
|
+
want.delete_at i
|
52
|
+
end
|
53
|
+
want.empty? # any queries left to match?
|
54
|
+
end
|
55
|
+
result
|
56
|
+
rescue Async::TimeoutError
|
57
|
+
type_str = {'StatusUpdate'=>'update', 'StatusResponse'=>'response'}[type]
|
58
|
+
raise RSMP::TimeoutError.new "Did not received status #{type_str} in reply to #{m_id} within #{options[:timeout]}s"
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait_for_status_updates_or_responses parent_task, type, options={}, &block
|
62
|
+
raise ArgumentError.new("component argument is missing") unless options[:component]
|
63
|
+
raise ArgumentError.new("status_list argument is missing") unless options[:status_list]
|
64
|
+
m_id = RSMP::Message.make_m_id # make message id so we can start waiting for it
|
65
|
+
|
66
|
+
# wait for command responses in an async task
|
67
|
+
task = parent_task.async do |task|
|
68
|
+
capture_status_updates_or_responses task, type, options, m_id
|
69
|
+
end
|
70
|
+
|
71
|
+
# call block, it should send command request using the given m_id
|
72
|
+
yield m_id
|
73
|
+
|
74
|
+
# wait for the response and return it, raise exception if NotAck received, it it timed out
|
75
|
+
task.wait
|
76
|
+
end
|
77
|
+
|
78
|
+
def wait_for_status_updates parent_task, options={}, &block
|
79
|
+
wait_for_status_updates_or_responses parent_task, 'StatusUpdate', options, &block
|
80
|
+
end
|
81
|
+
|
82
|
+
def wait_for_status_responses parent_task, options={}, &block
|
83
|
+
wait_for_status_updates_or_responses parent_task, 'StatusResponse', options, &block
|
84
|
+
end
|
85
|
+
|
86
|
+
def process_command_response message
|
87
|
+
log "Received #{message.type}", message: message, level: :log
|
88
|
+
acknowledge message
|
89
|
+
end
|
90
|
+
|
91
|
+
def command_match? query, item
|
92
|
+
return false if query[:sCI] && query[:sCI] != item['sCI']
|
93
|
+
return false if query[:n] && query[:n] != item['n']
|
94
|
+
if query[:s].is_a? Regexp
|
95
|
+
return false if query[:v] && item['v'] !~ query[:v]
|
96
|
+
else
|
97
|
+
return false if query[:v] && item['v'] != query[:v]
|
98
|
+
end
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
def capture_command_responses parent_task, type, options, m_id
|
103
|
+
task.annotate "wait for command response"
|
104
|
+
want = options[:command_list].clone
|
105
|
+
result = {}
|
106
|
+
item = @archive.capture(parent_task,options.merge({
|
107
|
+
type: [type,'MessageNotAck'],
|
108
|
+
num: 1
|
109
|
+
})) do |item|
|
110
|
+
message = item[:message]
|
111
|
+
if message.is_a?(MessageNotAck) && message.attribute('oMId') == m_id
|
112
|
+
# and message.attribute('oMId')==m_id
|
113
|
+
# set result to an exception, but don't raise it.
|
114
|
+
# this will be returned by the task and stored as the task result
|
115
|
+
# when the parent task call wait() on the task, the exception
|
116
|
+
# will be raised in the parent task, and caught by rspec.
|
117
|
+
# rspec will then show the error and record the test as failed
|
118
|
+
m_id_short = RSMP::Message.shorten_m_id m_id, 8
|
119
|
+
result = RSMP::MessageRejected.new "Command request #{m_id_short} was rejected: #{message.attribute('rea')}"
|
120
|
+
next true # done, no more messages wanted
|
121
|
+
end
|
122
|
+
|
123
|
+
found = []
|
124
|
+
# look through querues
|
125
|
+
want.each_with_index do |query,i|
|
126
|
+
# look through items in message
|
127
|
+
item[:message].attributes['rvs'].each do |input|
|
128
|
+
ok = command_match? query, input
|
129
|
+
if ok
|
130
|
+
result[query] = input
|
131
|
+
found << i # record which queries where matched succesfully
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
# remove queries that where matched
|
136
|
+
found.sort.reverse.each do |i|
|
137
|
+
want.delete_at i
|
138
|
+
end
|
139
|
+
want.empty? # any queries left to match?
|
140
|
+
end
|
141
|
+
result
|
142
|
+
rescue Async::TimeoutError
|
143
|
+
raise RSMP::TimeoutError.new "Did not receive command response to #{m_id} within #{options[:timeout]}s"
|
144
|
+
end
|
145
|
+
|
146
|
+
def wait_for_command_responses parent_task, options={}, &block
|
147
|
+
raise ArgumentError.new("component argument is missing") unless options[:component]
|
148
|
+
raise ArgumentError.new("command_list argument is missing") unless options[:command_list]
|
149
|
+
m_id = RSMP::Message.make_m_id # make message id so we can start waiting for it
|
150
|
+
|
151
|
+
# wait for command responses in an async task
|
152
|
+
task = parent_task.async do |task|
|
153
|
+
capture_command_responses task, 'CommandResponse', options, m_id
|
154
|
+
end
|
155
|
+
|
156
|
+
# call block, it should send command request using the given m_id
|
157
|
+
yield m_id
|
158
|
+
|
159
|
+
# wait for the response and return it, raise exception if NotAck received, it it timed out
|
160
|
+
task.wait
|
161
|
+
end
|
16
162
|
end
|
17
163
|
end
|
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.
|
4
|
+
version: 0.1.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emil Tin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- config/site.yaml
|
201
201
|
- config/supervisor.yaml
|
202
202
|
- config/tlc.yaml
|
203
|
+
- documentation/classes.md
|
203
204
|
- exe/rsmp
|
204
205
|
- lib/rsmp.rb
|
205
206
|
- lib/rsmp/alarm.rb
|
@@ -219,7 +220,6 @@ files:
|
|
219
220
|
- lib/rsmp/site_base.rb
|
220
221
|
- lib/rsmp/site_proxy.rb
|
221
222
|
- lib/rsmp/supervisor.rb
|
222
|
-
- lib/rsmp/supervisor_base.rb
|
223
223
|
- lib/rsmp/supervisor_proxy.rb
|
224
224
|
- lib/rsmp/tlc.rb
|
225
225
|
- lib/rsmp/version.rb
|
@@ -274,7 +274,10 @@ files:
|
|
274
274
|
- lib/rsmp_schema/schema/tlc/commands/M0017.json
|
275
275
|
- lib/rsmp_schema/schema/tlc/commands/M0018.json
|
276
276
|
- lib/rsmp_schema/schema/tlc/commands/M0019.json
|
277
|
+
- lib/rsmp_schema/schema/tlc/commands/M0020.json
|
278
|
+
- lib/rsmp_schema/schema/tlc/commands/M0021.json
|
277
279
|
- lib/rsmp_schema/schema/tlc/commands/M0103.json
|
280
|
+
- lib/rsmp_schema/schema/tlc/commands/M0104.json
|
278
281
|
- lib/rsmp_schema/schema/tlc/commands/command_requests.json
|
279
282
|
- lib/rsmp_schema/schema/tlc/commands/command_responses.json
|
280
283
|
- lib/rsmp_schema/schema/tlc/commands/commands.json
|
@@ -307,10 +310,13 @@ files:
|
|
307
310
|
- lib/rsmp_schema/schema/tlc/statuses/S0027.json
|
308
311
|
- lib/rsmp_schema/schema/tlc/statuses/S0028.json
|
309
312
|
- lib/rsmp_schema/schema/tlc/statuses/S0029.json
|
313
|
+
- lib/rsmp_schema/schema/tlc/statuses/S0030.json
|
314
|
+
- lib/rsmp_schema/schema/tlc/statuses/S0031.json
|
310
315
|
- lib/rsmp_schema/schema/tlc/statuses/S0091.json
|
311
316
|
- lib/rsmp_schema/schema/tlc/statuses/S0092.json
|
312
317
|
- lib/rsmp_schema/schema/tlc/statuses/S0095.json
|
313
318
|
- lib/rsmp_schema/schema/tlc/statuses/S0096.json
|
319
|
+
- lib/rsmp_schema/schema/tlc/statuses/S0097.json
|
314
320
|
- lib/rsmp_schema/schema/tlc/statuses/S0201.json
|
315
321
|
- lib/rsmp_schema/schema/tlc/statuses/S0202.json
|
316
322
|
- lib/rsmp_schema/schema/tlc/statuses/S0203.json
|