cpee 2.1.29 → 2.1.33
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/cockpit/templates/Frames.xml +297 -0
- data/cockpit/templates/Worklist.xml +58 -26
- data/cockpit/themes/compact/theme.js +1 -1
- data/cockpit/themes/control/theme.js +1 -1
- data/cockpit/themes/default/theme.js +1 -1
- data/cockpit/themes/extended/theme.js +1 -1
- data/cockpit/themes/model/theme.js +1 -1
- data/cockpit/themes/packed/theme.js +1 -1
- data/cockpit/themes/preset/theme.js +1 -1
- data/cpee.gemspec +2 -2
- data/lib/cpee/fail.rb +23 -0
- data/lib/cpee/implementation.rb +84 -23
- data/lib/cpee/implementation_callbacks.rb +11 -10
- data/lib/cpee/implementation_notifications.rb +4 -3
- data/lib/cpee/implementation_properties.rb +2 -1
- data/lib/cpee/message.rb +35 -13
- data/lib/cpee/persistence.rb +30 -11
- data/server/executionhandlers/ruby/connection.rb +18 -2
- data/server/executionhandlers/ruby/controller.rb +11 -6
- data/server/executionhandlers/ruby/dsl_to_dslx.xsl +5 -5
- data/server/resources/topics.xml +1 -0
- data/server/routing/forward-events.rb +6 -0
- data/server/routing/persist.rb +4 -2
- data/server/server.conf +1 -1
- metadata +17 -25
- data/cockpit/templates/Coopis 2010.xml.active +0 -1
- data/cockpit/templates/Coopis 2010.xml.active-uuid +0 -1
- data/cockpit/templates/Subprocess.xml.active +0 -1
- data/cockpit/templates/Subprocess.xml.active-uuid +0 -1
- data/cockpit/templates/Track Test.xml.active +0 -1
- data/cockpit/templates/Track Test.xml.active-uuid +0 -1
- data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active +0 -1
- data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active-uuid +0 -1
- data/cockpit/templates/Wait.xml.active +0 -1
- data/cockpit/templates/Wait.xml.active-uuid +0 -1
data/lib/cpee/implementation.rb
CHANGED
@@ -16,6 +16,7 @@ require 'fileutils'
|
|
16
16
|
require 'redis'
|
17
17
|
require 'riddl/server'
|
18
18
|
require 'riddl/client'
|
19
|
+
require_relative 'fail'
|
19
20
|
require_relative 'redis'
|
20
21
|
require_relative 'message'
|
21
22
|
require_relative 'persistence'
|
@@ -67,6 +68,9 @@ module CPEE
|
|
67
68
|
opts[:watchdog_start_off] ||= false
|
68
69
|
opts[:infinite_loop_stop] ||= 10000
|
69
70
|
|
71
|
+
opts[:dashing_frequency] ||= 3
|
72
|
+
opts[:dashing_target] ||= nil
|
73
|
+
|
70
74
|
### set redis_cmd to nil if you want to do global
|
71
75
|
### at least redis_path or redis_url and redis_db have to be set if you do global
|
72
76
|
opts[:redis_path] ||= 'redis.sock' # use e.g. /tmp/redis.sock for global stuff. Look it up in your redis config
|
@@ -83,7 +87,7 @@ module CPEE
|
|
83
87
|
opts[:sse_connections] = {}
|
84
88
|
|
85
89
|
opts[:statemachine] = CPEE::StateMachine.new opts[:states], %w{running simulating replaying finishing stopping abandoned finished} do |id|
|
86
|
-
opts
|
90
|
+
CPEE::Persistence::extract_item(id,opts,"state")
|
87
91
|
end
|
88
92
|
|
89
93
|
opts[:runtime_cmds] << [
|
@@ -113,6 +117,55 @@ module CPEE
|
|
113
117
|
EM.add_periodic_timer(opts[:sse_keepalive_frequency]) do
|
114
118
|
CPEE::Notifications::sse_heartbeat(opts)
|
115
119
|
end
|
120
|
+
|
121
|
+
if opts[:dashing_target]
|
122
|
+
cpu_last = 0
|
123
|
+
idl_last = 0
|
124
|
+
EM.add_periodic_timer(opts[:dashing_frequency]) do
|
125
|
+
src = `cat /proc/stat | head -n 1`.split("\n")
|
126
|
+
srm = `cat /proc/meminfo`.split("\n")
|
127
|
+
sc = {}
|
128
|
+
sm = {}
|
129
|
+
src.each do |e|
|
130
|
+
x = e.split(' ')
|
131
|
+
sc[x[0]] = x[1..-1].map{|r| r.to_i}
|
132
|
+
end
|
133
|
+
srm.each do |e|
|
134
|
+
x = e.split(/\s+/)
|
135
|
+
sm[x[0].chop] = x[1].to_i
|
136
|
+
end
|
137
|
+
scc = 0
|
138
|
+
sci = 0
|
139
|
+
sc.each do |_,e|
|
140
|
+
scc = e[0..4].sum
|
141
|
+
sci = e[3]
|
142
|
+
end
|
143
|
+
cpu_delta = scc - cpu_last
|
144
|
+
cpu_idle = sci - idl_last
|
145
|
+
cpu_used = cpu_delta - cpu_idle
|
146
|
+
cpu_usage = '%.2f' % (100 * cpu_used / cpu_delta.to_f)
|
147
|
+
mem_tot = '%.1f' % (sm['MemTotal']/1024.0)
|
148
|
+
mem_fre = '%.1f' % (sm['MemFree']/1024.0)
|
149
|
+
mem_ava = '%.1f' % (sm['MemAvailable']/1024.0)
|
150
|
+
mem_buc = '%.1f' % ((sm['Buffers'] + sm['Cached'] + sm['SReclaimable'])/1024.0)
|
151
|
+
mem_usd = '%.1f' % ((sm['MemTotal'] - sm['MemFree'] - sm['Buffers'] - sm['Cached'] - sm['SReclaimable'])/1024.0)
|
152
|
+
|
153
|
+
# puts "CPU usage at #{cpu_usage}%"
|
154
|
+
# puts "Mem usage at #{mem_tot}/#{mem_fre}/#{mem_usd}/#{mem_buc}/#{mem_ava}"
|
155
|
+
content = {}
|
156
|
+
content['cpu_usage'] = cpu_usage
|
157
|
+
content['mem_total'] = mem_tot
|
158
|
+
content['mem_free'] = mem_fre
|
159
|
+
content['mem_available'] = mem_ava
|
160
|
+
content['mem_bufferedandcached'] = mem_buc
|
161
|
+
content['mem_used'] = mem_usd
|
162
|
+
CPEE::Message::send_url(:event,'node/resource_utilization',File.join(opts[:url],'/'),content,File.join(opts[:dashing_target],'/dash/events'))
|
163
|
+
|
164
|
+
# Keep this as last for our next read
|
165
|
+
idl_last = sci
|
166
|
+
cpu_last = scc
|
167
|
+
end
|
168
|
+
end
|
116
169
|
end
|
117
170
|
|
118
171
|
cleanup do
|
@@ -176,16 +229,14 @@ module CPEE
|
|
176
229
|
|
177
230
|
class Instances < Riddl::Implementation #{{{
|
178
231
|
def response
|
179
|
-
|
232
|
+
opts = @a[0]
|
180
233
|
Riddl::Parameter::Complex.new("wis","text/xml") do
|
181
234
|
ins = XML::Smart::string('<instances/>')
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
state = redis.get(statekey)
|
188
|
-
state_changed = redis.get(File.join(statekey,'@changed'))
|
235
|
+
CPEE::Persistence::each_object(opts) do |instance|
|
236
|
+
info = CPEE::Persistence::extract_item(instance,opts,'attributes/info')
|
237
|
+
uuid = CPEE::Persistence::extract_item(instance,opts,'attributes/uuid')
|
238
|
+
state = CPEE::Persistence::extract_item(instance,opts,'state')
|
239
|
+
state_changed = CPEE::Persistence::extract_item(instance,opts,'state/@changed')
|
189
240
|
ins.root.add('instance', info, 'uuid' => uuid, 'id' => instance, 'state' => state, 'state_changed' => state_changed )
|
190
241
|
end
|
191
242
|
ins.to_s
|
@@ -209,9 +260,9 @@ module CPEE
|
|
209
260
|
doc = XML::Smart::open_unprotected(opts[:properties_init])
|
210
261
|
doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
|
211
262
|
name = @p[0].value
|
212
|
-
id =
|
263
|
+
id = CPEE::Persistence::new_object(opts)
|
213
264
|
uuid = SecureRandom.uuid
|
214
|
-
instance = '
|
265
|
+
instance = CPEE::Persistence::OBJ + ':' + id.to_s
|
215
266
|
redis.multi do |multi|
|
216
267
|
multi.zadd('instances',id,id)
|
217
268
|
doc.root.find(PROPERTIES_PATHS_FULL.join(' | ')).each do |e|
|
@@ -235,12 +286,12 @@ module CPEE
|
|
235
286
|
doc.register_namespace 'np', 'http://riddl.org/ns/common-patterns/notifications-producer/2.0'
|
236
287
|
key = File.basename(File.dirname(f))
|
237
288
|
url = doc.find('string(/np:subscription/@url)')
|
238
|
-
multi.sadd("
|
239
|
-
multi.set("
|
289
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers",key)
|
290
|
+
multi.set(CPEE::Persistence::OBJ + ":#{id}/handlers/#{key}/url",url)
|
240
291
|
doc.find('/np:subscription/np:topic/*').each do |e|
|
241
292
|
c = File.join(e.parent.attributes['id'],e.qname.name,e.text)
|
242
|
-
multi.sadd("
|
243
|
-
multi.sadd("
|
293
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers/#{key}",c)
|
294
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers/#{c}",key)
|
244
295
|
end
|
245
296
|
end rescue nil # all the ones that are not ok, are ignored
|
246
297
|
end
|
@@ -251,6 +302,12 @@ module CPEE
|
|
251
302
|
multi.set(File.join(instance, 'state', '@changed'), Time.now.xmlschema(3))
|
252
303
|
end
|
253
304
|
|
305
|
+
content = {
|
306
|
+
:state => 'ready',
|
307
|
+
:attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h
|
308
|
+
}
|
309
|
+
CPEE::Message::send(:event,'state/change',File.join(opts[:url],'/'),id,uuid,name,content,redis)
|
310
|
+
|
254
311
|
@headers << Riddl::Header.new("CPEE-INSTANCE", id.to_s)
|
255
312
|
@headers << Riddl::Header.new("CPEE-INSTANCE-URL", File.join(opts[:url].to_s,id.to_s,'/'))
|
256
313
|
@headers << Riddl::Header.new("CPEE-INSTANCE-UUID", uuid)
|
@@ -289,7 +346,18 @@ module CPEE
|
|
289
346
|
@status = 404
|
290
347
|
return
|
291
348
|
end
|
292
|
-
|
349
|
+
|
350
|
+
content = {
|
351
|
+
:state => 'purged',
|
352
|
+
:attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h
|
353
|
+
}
|
354
|
+
state = CPEE::Persistence::extract_item(id,opts,'state')
|
355
|
+
if state == 'stopped' || state == 'ready'
|
356
|
+
CPEE::Message::send(:event,'state/change',File.join(opts[:url],'/'),id,content[:attributes]['uuid'],content[:attributes]['info'],content,redis)
|
357
|
+
end
|
358
|
+
|
359
|
+
empt = CPEE::Persistence::keys(id,opts).to_a
|
360
|
+
empt.delete_if{|e| e =~ /\/handlers/ }
|
293
361
|
redis.multi do |multi|
|
294
362
|
multi.del empt
|
295
363
|
multi.zrem 'instances', id
|
@@ -297,11 +365,4 @@ module CPEE
|
|
297
365
|
end
|
298
366
|
end #}}}
|
299
367
|
|
300
|
-
class FAIL < Riddl::Implementation #{{{
|
301
|
-
def response
|
302
|
-
@status = 404
|
303
|
-
nil
|
304
|
-
end
|
305
|
-
end #}}}
|
306
|
-
|
307
368
|
end
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# <http://www.gnu.org/licenses/>.
|
14
14
|
|
15
15
|
require 'json'
|
16
|
+
require_relative 'fail'
|
16
17
|
|
17
18
|
module CPEE
|
18
19
|
module Callbacks
|
@@ -54,13 +55,13 @@ module CPEE
|
|
54
55
|
opts = @a[1]
|
55
56
|
callback = @r[-1]
|
56
57
|
|
57
|
-
if
|
58
|
+
if CPEE::Persistence::is_member?(id,opts,'callbacks',callback)
|
58
59
|
res = {}
|
59
|
-
res[:uuid]
|
60
|
-
res[:type]
|
61
|
-
res[:position] = opts
|
62
|
-
res[:label]
|
63
|
-
if sub = opts
|
60
|
+
res[:uuid] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/uuid")
|
61
|
+
res[:type] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type")
|
62
|
+
res[:position] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/position")
|
63
|
+
res[:label] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/label")
|
64
|
+
if sub = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/subscription")
|
64
65
|
res[:subscription] = sub
|
65
66
|
end
|
66
67
|
|
@@ -77,7 +78,7 @@ module CPEE
|
|
77
78
|
opts = @a[1]
|
78
79
|
callback = @r[-1]
|
79
80
|
|
80
|
-
if opts
|
81
|
+
if CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'callback'
|
81
82
|
CPEE::Message::send(
|
82
83
|
:'callback-end',
|
83
84
|
callback,
|
@@ -88,7 +89,7 @@ module CPEE
|
|
88
89
|
{},
|
89
90
|
opts[:redis]
|
90
91
|
)
|
91
|
-
elsif opts
|
92
|
+
elsif CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'vote'
|
92
93
|
CPEE::Message::send(
|
93
94
|
:'vote-response',
|
94
95
|
callback,
|
@@ -112,7 +113,7 @@ module CPEE
|
|
112
113
|
opts = @a[1]
|
113
114
|
callback = @r[-1]
|
114
115
|
|
115
|
-
if opts
|
116
|
+
if CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'callback'
|
116
117
|
ret = {}
|
117
118
|
ret['values'] = @p.map{ |e|
|
118
119
|
[e.name, e.class == Riddl::Parameter::Simple ? [:simple,e.value] : [:complex,e.mimetype,e.value.path] ]
|
@@ -129,7 +130,7 @@ module CPEE
|
|
129
130
|
ret,
|
130
131
|
opts[:redis]
|
131
132
|
)
|
132
|
-
elsif opts
|
133
|
+
elsif CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'vote'
|
133
134
|
if @p.length == 1 && @p[0].name == 'continue' && @p[0].class == Riddl::Parameter::Simple
|
134
135
|
CPEE::Message::send(
|
135
136
|
:'vote-response',
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# <http://www.gnu.org/licenses/>.
|
14
14
|
|
15
15
|
require 'json'
|
16
|
+
require_relative 'fail'
|
16
17
|
|
17
18
|
module CPEE
|
18
19
|
module Notifications
|
@@ -188,7 +189,7 @@ module CPEE
|
|
188
189
|
on.pmessage do |pat, what, message|
|
189
190
|
if pat == 'forward:*'
|
190
191
|
id, key = what.match(/forward:([^\/]+)\/(.+)/).captures
|
191
|
-
if sse = opts.dig(:sse_connections,id
|
192
|
+
if sse = opts.dig(:sse_connections,id,key)
|
192
193
|
sse.send message
|
193
194
|
else
|
194
195
|
DeleteSubscription::set(id,opts,key)
|
@@ -197,7 +198,7 @@ module CPEE
|
|
197
198
|
mess = JSON.parse(message[message.index(' ')+1..-1])
|
198
199
|
state = mess.dig('content','state')
|
199
200
|
if state == 'finished' || state == 'abandoned'
|
200
|
-
opts.dig(:sse_connections,mess.dig('instance').
|
201
|
+
opts.dig(:sse_connections,mess.dig('instance').to_s)&.each do |key,sse|
|
201
202
|
EM.add_timer(10) do # just to be sure that all messages arrived. 10 seconds should be enough ... we think ... therefore we are (not sure)
|
202
203
|
sse.close
|
203
204
|
end
|
@@ -218,7 +219,7 @@ module CPEE
|
|
218
219
|
class SSE < Riddl::SSEImplementation #{{{
|
219
220
|
def onopen
|
220
221
|
@opts = @a[1]
|
221
|
-
@id = @a[0]
|
222
|
+
@id = @a[0].to_s
|
222
223
|
@key = @r[-2]
|
223
224
|
if CPEE::Persistence::exists_handler?(@id,@opts,@key)
|
224
225
|
@opts[:sse_connections][@id] ||= {}
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# <http://www.gnu.org/licenses/>.
|
14
14
|
|
15
15
|
require_relative 'attributes_helper'
|
16
|
+
require_relative 'fail'
|
16
17
|
require_relative 'value_helper'
|
17
18
|
require 'json'
|
18
19
|
require 'erb'
|
@@ -226,7 +227,7 @@ module CPEE
|
|
226
227
|
end #}}}
|
227
228
|
class PutState < Riddl::Implementation #{{{
|
228
229
|
def self::set(id,opts,state)
|
229
|
-
CPEE::Persistence::set_item(id,opts,'state',:state => state, :
|
230
|
+
CPEE::Persistence::set_item(id,opts,'state',:state => state, :attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h)
|
230
231
|
end
|
231
232
|
|
232
233
|
def self::run(id,opts,state)
|
data/lib/cpee/message.rb
CHANGED
@@ -15,28 +15,50 @@
|
|
15
15
|
module CPEE
|
16
16
|
|
17
17
|
module Message
|
18
|
+
WHO = 'cpee'
|
19
|
+
TYPE = 'instance'
|
18
20
|
|
19
21
|
def self::send(type, event, cpee, instance, instance_uuid, instance_name, content={}, backend)
|
20
22
|
topic = ::File::dirname(event)
|
21
23
|
name = ::File::basename(event)
|
24
|
+
payload = {
|
25
|
+
WHO => cpee,
|
26
|
+
TYPE + '-url' => File.join(cpee,instance.to_s),
|
27
|
+
TYPE => instance,
|
28
|
+
'topic' => topic,
|
29
|
+
'type' => type,
|
30
|
+
'name' => name,
|
31
|
+
'timestamp' => Time.now.xmlschema(3),
|
32
|
+
'content' => content
|
33
|
+
}
|
34
|
+
payload[TYPE + '-uuid'] = instance_uuid if instance_uuid
|
35
|
+
payload[TYPE + '-name'] = instance_name if instance_name
|
22
36
|
backend.publish(type.to_s + ':' + event,
|
23
37
|
instance.to_s + ' ' +
|
24
|
-
JSON::generate(
|
25
|
-
{ 'cpee' => cpee,
|
26
|
-
'instance-url' => File.join(cpee,instance.to_s),
|
27
|
-
'instance-uuid' => instance_uuid,
|
28
|
-
'instance-name' => instance_name,
|
29
|
-
'instance' => instance,
|
30
|
-
'topic' => topic,
|
31
|
-
'type' => type,
|
32
|
-
'name' => name,
|
33
|
-
'timestamp' => Time.now.xmlschema(3),
|
34
|
-
'content' => content
|
35
|
-
}
|
36
|
-
)
|
38
|
+
JSON::generate(payload)
|
37
39
|
)
|
38
40
|
end
|
39
41
|
|
42
|
+
def self::send_url(type, event, cpee, content={}, backend)
|
43
|
+
topic = ::File::dirname(event)
|
44
|
+
name = ::File::basename(event)
|
45
|
+
client = Riddl::Client.new(backend)
|
46
|
+
payload = {
|
47
|
+
WHO => cpee,
|
48
|
+
'topic' => topic,
|
49
|
+
'type' => type,
|
50
|
+
'name' => name,
|
51
|
+
'timestamp' => Time.now.xmlschema(3),
|
52
|
+
'content' => content
|
53
|
+
}
|
54
|
+
client = Riddl::Client.new(backend)
|
55
|
+
client.post [
|
56
|
+
Riddl::Parameter::Simple::new('type',type),
|
57
|
+
Riddl::Parameter::Simple::new('topic',topic),
|
58
|
+
Riddl::Parameter::Simple::new('event',name),
|
59
|
+
Riddl::Parameter::Complex::new('notification','application/json',JSON::generate(payload))
|
60
|
+
]
|
61
|
+
end
|
40
62
|
end
|
41
63
|
|
42
64
|
end
|
data/lib/cpee/persistence.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
module CPEE
|
16
16
|
|
17
17
|
module Persistence
|
18
|
+
OBJ = 'instance'
|
19
|
+
|
18
20
|
def self::set_list(id,opts,item,values,deleted=[]) #{{{
|
19
21
|
ah = AttributesHelper.new
|
20
22
|
attributes = Persistence::extract_list(id,opts,'attributes').to_h
|
@@ -37,13 +39,13 @@ module CPEE
|
|
37
39
|
)
|
38
40
|
end #}}}
|
39
41
|
def self::extract_set(id,opts,item) #{{{
|
40
|
-
opts[:redis].smembers("
|
41
|
-
[e,opts[:redis].get("
|
42
|
+
opts[:redis].smembers(OBJ + ":#{id}/#{item}").map do |e|
|
43
|
+
[e,opts[:redis].get(OBJ + ":#{id}/#{item}/#{e}")]
|
42
44
|
end
|
43
45
|
end #}}}
|
44
46
|
def self::extract_list(id,opts,item) #{{{
|
45
|
-
opts[:redis].zrange("
|
46
|
-
[e,opts[:redis].get("
|
47
|
+
opts[:redis].zrange(OBJ + ":#{id}/#{item}",0,-1).map do |e|
|
48
|
+
[e,opts[:redis].get(OBJ + ":#{id}/#{item}/#{e}")]
|
47
49
|
end
|
48
50
|
end #}}}
|
49
51
|
|
@@ -60,15 +62,32 @@ module CPEE
|
|
60
62
|
)
|
61
63
|
end #}}}
|
62
64
|
def self::extract_item(id,opts,item) #{{{
|
63
|
-
opts[:redis].get("
|
65
|
+
opts[:redis].get(OBJ + ":#{id}/#{item}")
|
64
66
|
end #}}}
|
65
67
|
|
66
68
|
def self::exists?(id,opts) #{{{
|
67
|
-
opts[:redis].exists?("
|
69
|
+
opts[:redis].exists?(OBJ + ":#{id}/state")
|
68
70
|
end #}}}
|
71
|
+
def self::is_member?(id,opts,item,value) #{{{
|
72
|
+
opts[:redis].sismember(OBJ + ":#{id}/#{item}",value)
|
73
|
+
end #}}}
|
74
|
+
|
75
|
+
def self::each_object(opts)
|
76
|
+
opts[:redis].zrevrange(OBJ + 's',0,-1).each do |instance|
|
77
|
+
yield instance
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self::new_object(opts)
|
82
|
+
opts[:redis].zrevrange(OBJ + 's', 0, 0).first.to_i + 1
|
83
|
+
end
|
84
|
+
|
85
|
+
def self::keys(id,opts,item=nil)
|
86
|
+
opts[:redis].keys(File.join(OBJ + ":#{id}",item.to_s,'*'))
|
87
|
+
end
|
69
88
|
|
70
89
|
def self::set_handler(id,opts,key,url,values,update=false) #{{{
|
71
|
-
exis = opts[:redis].smembers("
|
90
|
+
exis = opts[:redis].smembers(OBJ + ":#{id}/handlers/#{key}")
|
72
91
|
|
73
92
|
if update == false && exis.length > 0
|
74
93
|
return 405
|
@@ -101,14 +120,14 @@ module CPEE
|
|
101
120
|
200
|
102
121
|
end #}}}
|
103
122
|
def self::extract_handler(id,opts,key) #{{{
|
104
|
-
opts[:redis].smembers("
|
123
|
+
opts[:redis].smembers(OBJ + ":#{id}/handlers/#{key}")
|
105
124
|
end #}}}
|
106
125
|
def self::exists_handler?(id,opts,key) #{{{
|
107
|
-
opts[:redis].exists?("
|
126
|
+
opts[:redis].exists?(OBJ + ":#{id}/handlers/#{key}")
|
108
127
|
end #}}}
|
109
128
|
def self::extract_handlers(id,opts) #{{{
|
110
|
-
opts[:redis].smembers("
|
111
|
-
[e, opts[:redis].get("
|
129
|
+
opts[:redis].smembers(OBJ + ":#{id}/handlers").map do |e|
|
130
|
+
[e, opts[:redis].get(OBJ + ":#{id}/handlers/#{e}/url")]
|
112
131
|
end
|
113
132
|
end #}}}
|
114
133
|
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
require 'charlock_holmes'
|
16
16
|
require 'mimemagic'
|
17
17
|
require 'base64'
|
18
|
+
require 'get_process_mem'
|
18
19
|
|
19
20
|
class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
20
21
|
def self::loop_guard(arguments,id,count) # {{{
|
@@ -77,7 +78,15 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
|
77
78
|
end #}}}
|
78
79
|
|
79
80
|
def additional #{{{
|
80
|
-
{
|
81
|
+
{
|
82
|
+
:attributes => @controller.attributes,
|
83
|
+
:cpee => {
|
84
|
+
'base' => @controller.base_url,
|
85
|
+
'instance' => @controller.instance_id,
|
86
|
+
'instance_url' => @controller.instance_url,
|
87
|
+
'instance_uuid' => @controller.uuid
|
88
|
+
}
|
89
|
+
}
|
81
90
|
end #}}}
|
82
91
|
|
83
92
|
def proto_curl(parameters) #{{{
|
@@ -184,6 +193,7 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
|
184
193
|
|
185
194
|
def inform_activity_done # {{{
|
186
195
|
@controller.notify("activity/done", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
|
196
|
+
@controller.notify("status/resource_utilization", :mib => GetProcessMem.new.mb, **Process.times.to_h)
|
187
197
|
end # }}}
|
188
198
|
def inform_activity_manipulate # {{{
|
189
199
|
@controller.notify("activity/manipulating", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
|
@@ -220,6 +230,8 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
|
220
230
|
elsif result[0].is_a? Riddl::Parameter::Complex
|
221
231
|
if result[0].mimetype == 'application/json'
|
222
232
|
result = JSON::parse(result[0].value.read) rescue nil
|
233
|
+
elsif result[0].mimetype == 'text/yaml'
|
234
|
+
result = YAML::load(result[0].value.read) rescue nil
|
223
235
|
elsif result[0].mimetype == 'application/xml' || result[0].mimetype == 'text/xml'
|
224
236
|
result = XML::Smart::string(result[0].value.read) rescue nil
|
225
237
|
elsif result[0].mimetype == 'text/plain'
|
@@ -301,10 +313,14 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
|
301
313
|
end
|
302
314
|
|
303
315
|
def callback(result=nil,options={})
|
304
|
-
|
316
|
+
recv = structurize_result(result)
|
317
|
+
@controller.notify("activity/receiving", :'activity-uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => recv, :annotations => @anno)
|
305
318
|
@guard_files += result
|
306
319
|
@handler_returnValue = simplify_result(result)
|
307
320
|
@handler_returnOptions = options
|
321
|
+
if options['CPEE_EVENT']
|
322
|
+
@controller.notify("task/#{headers['CPEE_EVENT'].gsub(/[^\w_-]/,'')}", :'activity-uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => recv)
|
323
|
+
end
|
308
324
|
if options['CPEE_UPDATE']
|
309
325
|
if options['CPEE_UPDATE_STATUS']
|
310
326
|
@controller.notify("activity/status", :'activity-uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :status => options['CPEE_UPDATE_STATUS'])
|
@@ -21,6 +21,7 @@ require 'cpee/value_helper'
|
|
21
21
|
require 'cpee/attributes_helper'
|
22
22
|
require 'cpee/message'
|
23
23
|
require 'cpee/redis'
|
24
|
+
require 'cpee/persistence'
|
24
25
|
|
25
26
|
require 'ostruct'
|
26
27
|
class ParaStruct < OpenStruct
|
@@ -41,8 +42,8 @@ class Controller
|
|
41
42
|
@id = id
|
42
43
|
|
43
44
|
@attributes = {}
|
44
|
-
|
45
|
-
@attributes[
|
45
|
+
CPEE::Persistence::extract_list(id,opts,'attributes').each do |de|
|
46
|
+
@attributes[de[0]] = de[1]
|
46
47
|
end
|
47
48
|
|
48
49
|
@attributes_helper = AttributesHelper.new
|
@@ -52,9 +53,9 @@ class Controller
|
|
52
53
|
@loop_guard = {}
|
53
54
|
|
54
55
|
@callback_keys = {}
|
55
|
-
@psredis = @opts[:redis_dyn].call "Instance #{@id} Callback Response"
|
56
56
|
|
57
|
-
Thread.new do
|
57
|
+
@subs = Thread.new do
|
58
|
+
@psredis = @opts[:redis_dyn].call "Instance #{@id} Callback Response"
|
58
59
|
@psredis.psubscribe('callback-response:*','callback-end:*') do |on|
|
59
60
|
on.pmessage do |pat, what, message|
|
60
61
|
if pat == 'callback-response:*' && @callback_keys.has_key?(what[18..-1])
|
@@ -77,6 +78,10 @@ class Controller
|
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
81
|
+
@psredis.close
|
82
|
+
rescue => e
|
83
|
+
sleep 1
|
84
|
+
retry
|
80
85
|
end
|
81
86
|
end
|
82
87
|
|
@@ -136,7 +141,6 @@ class Controller
|
|
136
141
|
CPEE::Message::send(:'vote-response',key,base,@id,uuid,info,true,@redis)
|
137
142
|
end
|
138
143
|
end
|
139
|
-
@thread.join if !@thread.nil? && @thread.alive?
|
140
144
|
end
|
141
145
|
|
142
146
|
def info
|
@@ -152,7 +156,8 @@ class Controller
|
|
152
156
|
topic, name = what.split('/')
|
153
157
|
handler = File.join(topic,'vote',name)
|
154
158
|
votes = []
|
155
|
-
|
159
|
+
|
160
|
+
CPEE::Persistence::extract_handler(id,@opts,handler).each do |client|
|
156
161
|
voteid = Digest::MD5.hexdigest(Kernel::rand().to_s)
|
157
162
|
content[:key] = voteid
|
158
163
|
content[:attributes] = attributes_translated
|
@@ -6,10 +6,10 @@
|
|
6
6
|
<xsl:template match="/">
|
7
7
|
<xsl:text>control flow do</xsl:text>
|
8
8
|
<xsl:call-template name="print-newline"/>
|
9
|
-
<xsl:apply-templates select="
|
9
|
+
<xsl:apply-templates select="/d:description"/>
|
10
10
|
<xsl:text>end</xsl:text>
|
11
11
|
</xsl:template>
|
12
|
-
<xsl:template match="
|
12
|
+
<xsl:template match="/d:description">
|
13
13
|
<xsl:apply-templates>
|
14
14
|
<xsl:with-param name="myspace">
|
15
15
|
<xsl:value-of select="0*$myspacemultiplier"/>
|
@@ -749,9 +749,9 @@
|
|
749
749
|
<xsl:otherwise>
|
750
750
|
<xsl:choose>
|
751
751
|
<xsl:when test="substring(.,1,1) = '!'">
|
752
|
-
<xsl:text>#{</xsl:text>
|
753
|
-
<xsl:value-of select="
|
754
|
-
<xsl:text
|
752
|
+
<xsl:text>#{(</xsl:text>
|
753
|
+
<xsl:value-of select="substring(.,2)"/>
|
754
|
+
<xsl:text>).to_json}</xsl:text>
|
755
755
|
</xsl:when>
|
756
756
|
<xsl:otherwise>
|
757
757
|
<xsl:text>\"</xsl:text>
|
data/server/resources/topics.xml
CHANGED
@@ -62,6 +62,12 @@ Daemonite.new do |opts|
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
65
|
+
unless opts[:redis].exists?("instance:#{instance}/state")
|
66
|
+
empt = opts[:redis].keys("instance:#{instance}/*").to_a
|
67
|
+
opts[:redis].multi do |multi|
|
68
|
+
multi.del empt
|
69
|
+
end
|
70
|
+
end
|
65
71
|
rescue => e
|
66
72
|
puts e.message
|
67
73
|
puts e.backtrace
|
data/server/routing/persist.rb
CHANGED
@@ -66,8 +66,10 @@ Daemonite.new do |opts|
|
|
66
66
|
end
|
67
67
|
when 'event:state/change'
|
68
68
|
opts[:redis].multi do |multi|
|
69
|
-
|
70
|
-
|
69
|
+
unless mess.dig('content','state') == 'purged'
|
70
|
+
multi.set("instance:#{instance}/state",mess.dig('content','state'))
|
71
|
+
multi.set("instance:#{instance}/state/@changed",mess.dig('timestamp'))
|
72
|
+
end
|
71
73
|
end
|
72
74
|
when 'event:executionhandler/change'
|
73
75
|
opts[:redis].set("instance:#{instance}/executionhandler",mess.dig('content','executionhandler'))
|
data/server/server.conf
CHANGED