cpee 2.1.29 → 2.1.50

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.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/cockpit/config.json +1 -1
  4. data/cockpit/css/graph.css +13 -0
  5. data/cockpit/css/track.css +1 -1
  6. data/cockpit/css/wfadaptor.css +9 -2
  7. data/cockpit/edit.html +1 -1
  8. data/cockpit/graph.html +1 -0
  9. data/cockpit/index.html +2 -2
  10. data/cockpit/js/details.js +2 -2
  11. data/cockpit/js/instance.js +162 -112
  12. data/cockpit/js/wfadaptor.js +20 -14
  13. data/cockpit/js_libs.zip +0 -0
  14. data/cockpit/templates/Coopis 2010.xml +109 -14
  15. data/cockpit/templates/Frames.xml +297 -0
  16. data/cockpit/templates/Subprocess.xml +54 -6
  17. data/cockpit/templates/Wait.xml +5 -11
  18. data/cockpit/templates/Worklist.xml +58 -26
  19. data/cockpit/themes/compact/rngs/call.rng +127 -86
  20. data/cockpit/themes/compact/rngs/callmanipulate.rng +32 -7
  21. data/cockpit/themes/compact/rngs/closed_loop_control.rng +2 -2
  22. data/cockpit/themes/compact/rngs/closed_loop_measuring.rng +3 -3
  23. data/cockpit/themes/compact/rngs/start.rng +110 -72
  24. data/cockpit/themes/compact/symbols/call_sensor.svg +9 -0
  25. data/cockpit/themes/compact/symbols/callmanipulate.svg +3 -3
  26. data/cockpit/themes/compact/symbols/callmanipulate_sensor.svg +11 -0
  27. data/cockpit/themes/compact/symbols/delete.svg +4 -0
  28. data/cockpit/themes/compact/symbols/start_event.svg +5 -0
  29. data/cockpit/themes/compact/symbols/test.svg +74 -0
  30. data/cockpit/themes/compact/theme.js +105 -9
  31. data/cockpit/themes/control/rngs/call.rng +127 -86
  32. data/cockpit/themes/control/rngs/callmanipulate.rng +32 -7
  33. data/cockpit/themes/control/rngs/closed_loop_control.rng +2 -2
  34. data/cockpit/themes/control/rngs/closed_loop_measuring.rng +3 -3
  35. data/cockpit/themes/control/rngs/start.rng +110 -72
  36. data/cockpit/themes/control/symbols/call_sensor.svg +9 -0
  37. data/cockpit/themes/control/symbols/callmanipulate.svg +3 -3
  38. data/cockpit/themes/control/symbols/callmanipulate_sensor.svg +11 -0
  39. data/cockpit/themes/control/symbols/delete.svg +4 -0
  40. data/cockpit/themes/control/symbols/start_event.svg +5 -0
  41. data/cockpit/themes/control/symbols/test.svg +74 -0
  42. data/cockpit/themes/control/theme.js +53 -7
  43. data/cockpit/themes/default/rngs/call.rng +127 -86
  44. data/cockpit/themes/default/rngs/callmanipulate.rng +32 -7
  45. data/cockpit/themes/default/rngs/closed_loop_control.rng +2 -2
  46. data/cockpit/themes/default/rngs/closed_loop_measuring.rng +3 -3
  47. data/cockpit/themes/default/rngs/start.rng +110 -72
  48. data/cockpit/themes/default/symbols/call_sensor.svg +9 -0
  49. data/cockpit/themes/default/symbols/callmanipulate.svg +3 -3
  50. data/cockpit/themes/default/symbols/callmanipulate_sensor.svg +11 -0
  51. data/cockpit/themes/default/symbols/delete.svg +4 -0
  52. data/cockpit/themes/default/symbols/start_event.svg +5 -0
  53. data/cockpit/themes/default/symbols/test.svg +74 -0
  54. data/cockpit/themes/default/theme.js +105 -9
  55. data/cockpit/themes/extended/rngs/call.rng +127 -86
  56. data/cockpit/themes/extended/rngs/callmanipulate.rng +32 -7
  57. data/cockpit/themes/extended/rngs/closed_loop_control.rng +2 -2
  58. data/cockpit/themes/extended/rngs/closed_loop_measuring.rng +3 -3
  59. data/cockpit/themes/extended/rngs/start.rng +110 -72
  60. data/cockpit/themes/extended/symbols/call_sensor.svg +9 -0
  61. data/cockpit/themes/extended/symbols/callmanipulate.svg +3 -3
  62. data/cockpit/themes/extended/symbols/callmanipulate_sensor.svg +11 -0
  63. data/cockpit/themes/extended/symbols/delete.svg +4 -0
  64. data/cockpit/themes/extended/symbols/start_event.svg +5 -0
  65. data/cockpit/themes/extended/symbols/test.svg +74 -0
  66. data/cockpit/themes/extended/theme.js +105 -9
  67. data/cockpit/themes/model/symbols/call_sensor.svg +9 -0
  68. data/cockpit/themes/model/symbols/callmanipulate.svg +3 -3
  69. data/cockpit/themes/model/symbols/callmanipulate_sensor.svg +11 -0
  70. data/cockpit/themes/model/symbols/delete.svg +4 -0
  71. data/cockpit/themes/model/symbols/start_event.svg +5 -0
  72. data/cockpit/themes/model/symbols/test.svg +74 -0
  73. data/cockpit/themes/model/theme.js +50 -4
  74. data/cockpit/themes/packed/rngs/call.rng +127 -86
  75. data/cockpit/themes/packed/rngs/callmanipulate.rng +32 -7
  76. data/cockpit/themes/packed/rngs/closed_loop_control.rng +2 -2
  77. data/cockpit/themes/packed/rngs/closed_loop_measuring.rng +3 -3
  78. data/cockpit/themes/packed/rngs/start.rng +110 -72
  79. data/cockpit/themes/packed/symbols/call_sensor.svg +9 -0
  80. data/cockpit/themes/packed/symbols/callmanipulate.svg +3 -3
  81. data/cockpit/themes/packed/symbols/callmanipulate_sensor.svg +11 -0
  82. data/cockpit/themes/packed/symbols/delete.svg +4 -0
  83. data/cockpit/themes/packed/symbols/start_event.svg +5 -0
  84. data/cockpit/themes/packed/symbols/test.svg +74 -0
  85. data/cockpit/themes/packed/theme.js +105 -9
  86. data/cockpit/themes/preset/rngs/call.rng +127 -86
  87. data/cockpit/themes/preset/rngs/callmanipulate.rng +32 -7
  88. data/cockpit/themes/preset/rngs/closed_loop_control.rng +2 -2
  89. data/cockpit/themes/preset/rngs/closed_loop_measuring.rng +3 -3
  90. data/cockpit/themes/preset/rngs/start.rng +110 -72
  91. data/cockpit/themes/preset/symbols/call_sensor.svg +9 -0
  92. data/cockpit/themes/preset/symbols/callmanipulate.svg +3 -3
  93. data/cockpit/themes/preset/symbols/callmanipulate_sensor.svg +11 -0
  94. data/cockpit/themes/preset/symbols/delete.svg +4 -0
  95. data/cockpit/themes/preset/symbols/start_event.svg +5 -0
  96. data/cockpit/themes/preset/symbols/test.svg +74 -0
  97. data/cockpit/themes/preset/theme.js +105 -9
  98. data/cpee.gemspec +6 -5
  99. data/lib/cpee/fail.rb +23 -0
  100. data/lib/cpee/implementation.rb +144 -49
  101. data/lib/cpee/implementation_callbacks.rb +11 -10
  102. data/lib/cpee/implementation_notifications.rb +4 -3
  103. data/lib/cpee/implementation_properties.rb +2 -2
  104. data/lib/cpee/message.rb +49 -15
  105. data/lib/cpee/persistence.rb +34 -12
  106. data/lib/cpee.xml +1 -1
  107. data/server/executionhandlers/ruby/backend/instance.template +1 -1
  108. data/server/executionhandlers/ruby/backend/run +4 -4
  109. data/server/executionhandlers/ruby/connection.rb +93 -34
  110. data/server/executionhandlers/ruby/controller.rb +29 -19
  111. data/server/executionhandlers/ruby/desc.xml +107 -0
  112. data/server/executionhandlers/ruby/dsl_to_dslx.xsl +67 -24
  113. data/server/executionhandlers/ruby/execution.rb +1 -0
  114. data/server/resources/states.xml +3 -0
  115. data/server/resources/test.pdf +0 -0
  116. data/server/resources/topics.xml +4 -2
  117. data/server/routing/end.pid +1 -0
  118. data/server/routing/end.rb +3 -2
  119. data/server/routing/forward-events-00.pid +1 -0
  120. data/server/routing/forward-events.rb +26 -13
  121. data/server/routing/forward-votes.pid +1 -0
  122. data/server/routing/forward-votes.rb +4 -4
  123. data/server/routing/persist.pid +1 -0
  124. data/server/routing/persist.rb +41 -31
  125. data/server/server.pid +1 -0
  126. data/tools/cpee +99 -24
  127. metadata +80 -32
  128. data/cockpit/templates/Coopis 2010.xml.active +0 -1
  129. data/cockpit/templates/Coopis 2010.xml.active-uuid +0 -1
  130. data/cockpit/templates/Subprocess.xml.active +0 -1
  131. data/cockpit/templates/Subprocess.xml.active-uuid +0 -1
  132. data/cockpit/templates/Track Test.xml.active +0 -1
  133. data/cockpit/templates/Track Test.xml.active-uuid +0 -1
  134. data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active +0 -1
  135. data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active-uuid +0 -1
  136. data/cockpit/templates/Wait.xml.active +0 -1
  137. data/cockpit/templates/Wait.xml.active-uuid +0 -1
  138. data/cockpit/templates/Wait.xml.attrs +0 -13
  139. data/server/executionhandlers/ruby/test.xml +0 -43
@@ -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
@@ -34,6 +35,7 @@ def ⭐(a); ParaStruct.new(a); end
34
35
  class Controller
35
36
  def initialize(id,dir,opts)
36
37
  CPEE::redis_connect(opts,"Instance #{id}")
38
+ CPEE::Message::set_workers(opts[:workers])
37
39
 
38
40
  @redis = opts[:redis]
39
41
  @votes = []
@@ -41,8 +43,8 @@ class Controller
41
43
  @id = id
42
44
 
43
45
  @attributes = {}
44
- @redis.keys("instance:#{id}/attributes/*").each do |key|
45
- @attributes[File.basename(key)] = @redis.get(key)
46
+ CPEE::Persistence::extract_list(id,opts,'attributes').each do |de|
47
+ @attributes[de[0]] = de[1]
46
48
  end
47
49
 
48
50
  @attributes_helper = AttributesHelper.new
@@ -52,31 +54,39 @@ class Controller
52
54
  @loop_guard = {}
53
55
 
54
56
  @callback_keys = {}
55
- @psredis = @opts[:redis_dyn].call "Instance #{@id} Callback Response"
56
57
 
57
- Thread.new do
58
+ @subs = Thread.new do
59
+ @psredis = @opts[:redis_dyn].call "Instance #{@id} Callback Response"
58
60
  @psredis.psubscribe('callback-response:*','callback-end:*') do |on|
59
61
  on.pmessage do |pat, what, message|
60
- if pat == 'callback-response:*' && @callback_keys.has_key?(what[18..-1])
61
- index = message.index(' ')
62
- mess = message[index+1..-1]
63
- instance = message[0...index]
64
- m = JSON.parse(mess)
65
- resp = []
66
- m['content']['values'].each do |e|
67
- if e[1][0] == 'simple'
68
- resp << Riddl::Parameter::Simple.new(e[0],e[1][1])
69
- elsif e[1][0] == 'complex'
70
- resp << Riddl::Parameter::Complex.new(e[0],e[1][1],File.open(e[1][2]))
62
+ if pat == 'callback-response:*'
63
+ _, worker, identifier = what.split(':')
64
+ if @callback_keys.has_key?(identifier)
65
+ index = message.index(' ')
66
+ mess = message[index+1..-1]
67
+ instance = message[0...index]
68
+ m = JSON.parse(mess)
69
+ resp = []
70
+ m['content']['values'].each do |e|
71
+ if e[1][0] == 'simple'
72
+ resp << Riddl::Parameter::Simple.new(e[0],e[1][1])
73
+ elsif e[1][0] == 'complex'
74
+ resp << Riddl::Parameter::Complex.new(e[0],e[1][1],File.open(e[1][2]))
75
+ end
71
76
  end
77
+ @callback_keys[identifier].send(:callback,resp,m['content']['headers'])
72
78
  end
73
- @callback_keys[what[18..-1]].send(:callback,resp,m['content']['headers'])
74
79
  end
75
80
  if pat == 'callback-end:*'
76
- @callback_keys.delete(what[13..-1])
81
+ _, worker, identifier = what.split(':')
82
+ @callback_keys.delete(identifier)
77
83
  end
78
84
  end
79
85
  end
86
+ @psredis.close
87
+ rescue => e
88
+ sleep 1
89
+ retry
80
90
  end
81
91
  end
82
92
 
@@ -136,7 +146,6 @@ class Controller
136
146
  CPEE::Message::send(:'vote-response',key,base,@id,uuid,info,true,@redis)
137
147
  end
138
148
  end
139
- @thread.join if !@thread.nil? && @thread.alive?
140
149
  end
141
150
 
142
151
  def info
@@ -152,7 +161,8 @@ class Controller
152
161
  topic, name = what.split('/')
153
162
  handler = File.join(topic,'vote',name)
154
163
  votes = []
155
- @redis.smembers("instance:#{id}/handlers/#{handler}").each do |client|
164
+
165
+ CPEE::Persistence::extract_handler(id,@opts,handler).each do |client|
156
166
  voteid = Digest::MD5.hexdigest(Kernel::rand().to_s)
157
167
  content[:key] = voteid
158
168
  content[:attributes] = attributes_translated
@@ -0,0 +1,107 @@
1
+ <?xml version="1.0"?>
2
+ <description xmlns="http://cpee.org/ns/description/1.0">
3
+ <call id="a3" endpoint="">
4
+ <parameters>
5
+ <label>asdasd</label>
6
+ <method>:post</method>
7
+ <arguments/>
8
+ </parameters>
9
+ <annotations>
10
+ <_timing>
11
+ <_timing_weight/>
12
+ <_timing_avg/>
13
+ <explanations/>
14
+ </_timing>
15
+ <_shifting>
16
+ <_shifting_type>Duration</_shifting_type>
17
+ </_shifting>
18
+ <_context_data_analysis>
19
+ <probes/>
20
+ <ips/>
21
+ </_context_data_analysis>
22
+ <report>
23
+ <url/>
24
+ </report>
25
+ <_notes>
26
+ <_notes_general/>
27
+ </_notes>
28
+ </annotations>
29
+ <documentation>
30
+ <input/>
31
+ <output/>
32
+ <implementation>
33
+ <description/>
34
+ </implementation>
35
+ </documentation>
36
+ </call>
37
+ <closed_loop overrun="wait" execution="sequential">
38
+ <_probability>
39
+ <_probability_min/>
40
+ <_probability_max/>
41
+ <_probability_avg/>
42
+ </_probability>
43
+ <closed_loop_measuring ctime="200">
44
+ <_expected/>
45
+ </closed_loop_measuring>
46
+ <closed_loop_measuring ctime="200">
47
+ <_expected>
48
+ <value>test</value>
49
+ <value>bla</value>
50
+ </_expected>
51
+ </closed_loop_measuring>
52
+ <closed_loop_control ctime="200">
53
+ <_expected>
54
+ <change>
55
+ <type>:PID</type>
56
+ <value>grrr</value>
57
+ <upper/>
58
+ <lower/>
59
+ </change>
60
+ <change>
61
+ <type>:PID</type>
62
+ <value>duuur</value>
63
+ <upper/>
64
+ <lower/>
65
+ </change>
66
+ </_expected>
67
+ <closed_loop_control ctime="200">
68
+ <_expected/>
69
+ </closed_loop_control>
70
+ </closed_loop_control>
71
+ <closed_loop_cancel condition=""/>
72
+ </closed_loop>
73
+ <call id="a1" endpoint="">
74
+ <parameters>
75
+ <label/>
76
+ <method>:post</method>
77
+ <arguments/>
78
+ </parameters>
79
+ <annotations>
80
+ <_timing>
81
+ <_timing_weight/>
82
+ <_timing_avg/>
83
+ <explanations/>
84
+ </_timing>
85
+ <_shifting>
86
+ <_shifting_type>Duration</_shifting_type>
87
+ </_shifting>
88
+ <_context_data_analysis>
89
+ <probes/>
90
+ <ips/>
91
+ </_context_data_analysis>
92
+ <report>
93
+ <url/>
94
+ </report>
95
+ <_notes>
96
+ <_notes_general/>
97
+ </_notes>
98
+ </annotations>
99
+ <documentation>
100
+ <input/>
101
+ <output/>
102
+ <implementation>
103
+ <description/>
104
+ </implementation>
105
+ </documentation>
106
+ </call>
107
+ </description>
@@ -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="//d:description"/>
9
+ <xsl:apply-templates select="/d:description"/>
10
10
  <xsl:text>end</xsl:text>
11
11
  </xsl:template>
12
- <xsl:template match="//d:description">
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"/>
@@ -221,6 +221,67 @@
221
221
  <xsl:text>end</xsl:text>
222
222
  <xsl:call-template name="print-newline"/>
223
223
  </xsl:if>
224
+ <xsl:if test="name()='closed_loop'">
225
+ <xsl:call-template name="print-space">
226
+ <xsl:with-param name="i">1</xsl:with-param>
227
+ <xsl:with-param name="count">
228
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
229
+ </xsl:with-param>
230
+ </xsl:call-template>
231
+ <xsl:text>closed_loop</xsl:text>
232
+ <xsl:if test="@overrun">
233
+ <xsl:text> :overrun =&gt; </xsl:text>
234
+ <xsl:value-of select="@overrun"/>
235
+ <xsl:if test="@execution">
236
+ <xsl:text>, :execution =&gt; :</xsl:text>
237
+ <xsl:value-of select="@execution"/>
238
+ </xsl:if>
239
+ </xsl:if>
240
+ <xsl:text> do</xsl:text>
241
+ <xsl:call-template name="print-newline"/>
242
+ <xsl:apply-templates>
243
+ <xsl:with-param name="myspace">
244
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
245
+ </xsl:with-param>
246
+ </xsl:apply-templates>
247
+ <xsl:call-template name="print-space">
248
+ <xsl:with-param name="i">1</xsl:with-param>
249
+ <xsl:with-param name="count">
250
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
251
+ </xsl:with-param>
252
+ </xsl:call-template>
253
+ <xsl:text>end</xsl:text>
254
+ <xsl:call-template name="print-newline"/>
255
+ </xsl:if>
256
+ <xsl:if test="name()='closed_loop_measuring' or name()='closed_loop_control'">
257
+ <xsl:call-template name="print-space">
258
+ <xsl:with-param name="i">1</xsl:with-param>
259
+ <xsl:with-param name="count">
260
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
261
+ </xsl:with-param>
262
+ </xsl:call-template>
263
+ <xsl:text>closed_loop_slice :type =&gt; :</xsl:text>
264
+ <xsl:value-of select="substring(name(),13,10)"/>
265
+ <xsl:if test="@ctime">
266
+ <xsl:text>, :ctime =&gt; </xsl:text>
267
+ <xsl:value-of select="@ctime"/>
268
+ </xsl:if>
269
+ <xsl:text> do</xsl:text>
270
+ <xsl:call-template name="print-newline"/>
271
+ <xsl:apply-templates>
272
+ <xsl:with-param name="myspace">
273
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
274
+ </xsl:with-param>
275
+ </xsl:apply-templates>
276
+ <xsl:call-template name="print-space">
277
+ <xsl:with-param name="i">1</xsl:with-param>
278
+ <xsl:with-param name="count">
279
+ <xsl:value-of select="$myspace+$myspacemultiplier"/>
280
+ </xsl:with-param>
281
+ </xsl:call-template>
282
+ <xsl:text>end</xsl:text>
283
+ <xsl:call-template name="print-newline"/>
284
+ </xsl:if>
224
285
  <xsl:if test="name()='choose'">
225
286
  <xsl:call-template name="print-space">
226
287
  <xsl:with-param name="i">1</xsl:with-param>
@@ -229,14 +290,6 @@
229
290
  </xsl:with-param>
230
291
  </xsl:call-template>
231
292
  <xsl:text>choose </xsl:text>
232
- <xsl:choose>
233
- <xsl:when test="@mode='exclusive'">
234
- <xsl:text>:exclusive</xsl:text>
235
- </xsl:when>
236
- <xsl:otherwise>
237
- <xsl:text>:inclusive</xsl:text>
238
- </xsl:otherwise>
239
- </xsl:choose>
240
293
  <xsl:text> do</xsl:text>
241
294
  <xsl:call-template name="print-newline"/>
242
295
  <xsl:apply-templates>
@@ -374,17 +427,7 @@
374
427
  <xsl:value-of select="$myspace+$myspacemultiplier"/>
375
428
  </xsl:with-param>
376
429
  </xsl:call-template>
377
- <xsl:text>parallel_branch</xsl:text>
378
- <xsl:if test="@pass">
379
- <xsl:text> </xsl:text>
380
- <xsl:value-of select="@pass"/>
381
- </xsl:if>
382
- <xsl:text> do</xsl:text>
383
- <xsl:if test="@local">
384
- <xsl:text> |</xsl:text>
385
- <xsl:value-of select="@local"/>
386
- <xsl:text>|</xsl:text>
387
- </xsl:if>
430
+ <xsl:text>parallel_branch data do |local|</xsl:text>
388
431
  <xsl:call-template name="print-newline"/>
389
432
  <xsl:apply-templates>
390
433
  <xsl:with-param name="myspace">
@@ -749,9 +792,9 @@
749
792
  <xsl:otherwise>
750
793
  <xsl:choose>
751
794
  <xsl:when test="substring(.,1,1) = '!'">
752
- <xsl:text>#{</xsl:text>
753
- <xsl:value-of select="str:replace(str:replace(substring(.,2),'\','\\'),'&quot;','\\\&quot;')"/>
754
- <xsl:text>.to_json}</xsl:text>
795
+ <xsl:text>#{(</xsl:text>
796
+ <xsl:value-of select="substring(.,2)"/>
797
+ <xsl:text>).to_json}</xsl:text>
755
798
  </xsl:when>
756
799
  <xsl:otherwise>
757
800
  <xsl:text>\"</xsl:text>
@@ -46,6 +46,7 @@ module CPEE
46
46
  :redis_url => opts[:redis_url],
47
47
  :redis_path => File.join(opts[:basepath],opts[:redis_path]),
48
48
  :redis_db => opts[:redis_db],
49
+ :workers => opts[:workers],
49
50
  :global_executionhandlers => opts[:global_executionhandlers],
50
51
  :executionhandlers => opts[:executionhandlers],
51
52
  :executionhandler => hw
@@ -14,6 +14,9 @@
14
14
  <running><!-- in this state you can set the following state -->
15
15
  <stopping/>
16
16
  </running>
17
+ <stopping><!-- in this state you can set the following state -->
18
+ <stopping/>
19
+ </stopping>
17
20
  <stopped><!-- in this state you can set the following four states -->
18
21
  <running/>
19
22
  <simulating/>
Binary file
@@ -25,8 +25,9 @@
25
25
  <vote>syncing_before</vote>
26
26
  <vote>syncing_after</vote>
27
27
  </topic>
28
- <topic id='condition'>
29
- <event>eval</event>
28
+ <topic id='gateway'>
29
+ <event>decide</event>
30
+ <event>join</event>
30
31
  </topic>
31
32
  <topic id='position'>
32
33
  <event>change</event>
@@ -41,6 +42,7 @@
41
42
  <vote>change</vote>
42
43
  </topic>
43
44
  <topic id='status'>
45
+ <event>resource_utilization</event>
44
46
  <event>change</event>
45
47
  </topic>
46
48
  <topic id='dataelements'>
@@ -0,0 +1 @@
1
+ 1105683
@@ -23,7 +23,8 @@ Daemonite.new do |opts|
23
23
  opts[:runtime_opts] += [
24
24
  ["--url=URL", "-uURL", "Specify redis url", ->(p){ opts[:redis_url] = p }],
25
25
  ["--path=PATH", "-pPATH", "Specify redis path, e.g. /tmp/redis.sock", ->(p){ opts[:redis_path] = p }],
26
- ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }]
26
+ ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }],
27
+ ["--workers=NUM", "-wNUM", "Number of workers that are expected, e.g. 3", ->(p) { opts[:workers] = p.to_i }]
27
28
  ]
28
29
 
29
30
  on startup do
@@ -37,7 +38,7 @@ Daemonite.new do |opts|
37
38
  run do
38
39
  opts[:pubsubredis].psubscribe('callback-end:*') do |on|
39
40
  on.pmessage do |pat, what, message|
40
- _, key = what.split(':')
41
+ _, worker, key = what.split(':',3)
41
42
  index = message.index(' ')
42
43
  instance = message[0...index]
43
44
  opts[:redis].multi do |multi|
@@ -0,0 +1 @@
1
+ 1105692
@@ -23,25 +23,30 @@ Daemonite.new do |opts|
23
23
  opts[:runtime_opts] += [
24
24
  ["--url=URL", "-uURL", "Specify redis url", ->(p){ opts[:redis_url] = p }],
25
25
  ["--path=PATH", "-pPATH", "Specify redis path, e.g. /tmp/redis.sock", ->(p){ opts[:redis_path] = p }],
26
- ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }]
26
+ ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }],
27
+ ["--worker=NUM", "-wNUM", "Specify the worker id, e.g. 0", ->(p) { opts[:worker] = p.to_i }]
27
28
  ]
28
29
 
30
+ on setup do
31
+ opts[:worker] ||= 0
32
+ opts[:worker] = ('%02i' % opts[:worker]).freeze
33
+ opts[:pidfile] = File.basename(opts[:pidfile],'.pid') + '-' + opts[:worker].to_s + '.pid'
34
+ end
35
+
29
36
  on startup do
30
37
  opts[:redis_path] ||= '/tmp/redis.sock'
31
38
  opts[:redis_db] ||= 1
32
-
33
39
  CPEE::redis_connect opts, 'Server Routing Forward Events'
34
40
  opts[:pubsubredis] = opts[:redis_dyn].call 'Server Routing Forward Events Sub'
35
41
  end
36
42
 
37
43
  run do
38
- opts[:pubsubredis].psubscribe('event:*') do |on|
44
+ opts[:pubsubredis].psubscribe("event:#{opts[:worker]}:*") do |on|
39
45
  on.pmessage do |pat, what, message|
40
46
  index = message.index(' ')
41
47
  mess = message[index+1..-1]
42
48
  instance = message[0...index]
43
- type = pat[0..-3]
44
- event = what[(type.length+1)..-1]
49
+ type, worker, event = what.split(':',3)
45
50
  topic = ::File::dirname(event)
46
51
  name = ::File::basename(event)
47
52
  long = File.join(topic,type,name)
@@ -51,17 +56,25 @@ Daemonite.new do |opts|
51
56
  if url.nil? || url == ""
52
57
  opts[:redis].publish("forward:#{instance}/#{key}",mess)
53
58
  else
54
- p "#{type}/#{topic}/#{event}-#{url}"
55
- client = Riddl::Client.new(url)
56
- client.post [
57
- Riddl::Parameter::Simple::new('type',type),
58
- Riddl::Parameter::Simple::new('topic',topic),
59
- Riddl::Parameter::Simple::new('event',name),
60
- Riddl::Parameter::Complex::new('notification','application/json',mess)
61
- ]
59
+ # Ractor.new(url,type,topic,name,mess) do |url,type,topic,name,mess|
60
+ # sadly typhoes does not support ractors
61
+ Thread.new do
62
+ Riddl::Client.new(url).post [
63
+ Riddl::Parameter::Simple::new('type',type),
64
+ Riddl::Parameter::Simple::new('topic',topic),
65
+ Riddl::Parameter::Simple::new('event',name),
66
+ Riddl::Parameter::Complex::new('notification','application/json',mess)
67
+ ]
68
+ end
62
69
  end
63
70
  end
64
71
  end
72
+ unless opts[:redis].exists?("instance:#{instance}/state")
73
+ empt = opts[:redis].keys("instance:#{instance}/*").to_a
74
+ opts[:redis].multi do |multi|
75
+ multi.del empt
76
+ end
77
+ end
65
78
  rescue => e
66
79
  puts e.message
67
80
  puts e.backtrace
@@ -0,0 +1 @@
1
+ 1105689
@@ -49,7 +49,8 @@ Daemonite.new do |opts|
49
49
  opts[:runtime_opts] += [
50
50
  ["--url=URL", "-uURL", "Specify redis url", ->(p){ opts[:redis_url] = p }],
51
51
  ["--path=PATH", "-pPATH", "Specify redis path, e.g. /tmp/redis.sock", ->(p){ opts[:redis_path] = p }],
52
- ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }]
52
+ ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }],
53
+ ["--workers=NUM", "-wNUM", "Number of workers that are expected, e.g. 3", ->(p) { opts[:workers] = p.to_i }]
53
54
  ]
54
55
 
55
56
  on startup do
@@ -64,11 +65,10 @@ Daemonite.new do |opts|
64
65
  opts[:pubsubredis].psubscribe('vote:*') do |on|
65
66
  on.pmessage do |pat, what, message|
66
67
  index = message.index(' ')
68
+ instance = message[0...index]
67
69
  mess = message[index+1..-1]
68
70
 
69
- instance = message[0...index]
70
- type = pat[0..-3]
71
- event = what[(type.length+1)..-1]
71
+ type, worker, event = what.split(':',3)
72
72
  topic = ::File::dirname(event)
73
73
  name = ::File::basename(event)
74
74
  long = File.join(topic,type,name)
@@ -0,0 +1 @@
1
+ 1105686
@@ -20,42 +20,50 @@ require 'daemonite'
20
20
  require_relative '../../lib/cpee/value_helper'
21
21
  require_relative '../../lib/cpee/redis'
22
22
 
23
- EVENTS = %w{
24
- event:state/change
25
- event:executionhandler/change
26
- event:description/change
27
- event:dataelements/change
28
- event:endpoints/change
29
- event:attributes/change
30
- event:transformation/change
31
- event:status/change
32
- event:position/change
33
- event:handler/change
34
- callback:activity/content
35
- }
23
+ EVENTS =
36
24
 
37
25
  Daemonite.new do |opts|
38
26
  opts[:runtime_opts] += [
39
27
  ["--url=URL", "-uURL", "Specify redis url", ->(p){ opts[:redis_url] = p }],
40
28
  ["--path=PATH", "-pPATH", "Specify redis path, e.g. /tmp/redis.sock", ->(p){ opts[:redis_path] = p }],
41
- ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }]
29
+ ["--db=DB", "-dDB", "Specify redis db, e.g. 1", ->(p) { opts[:redis_db] = p.to_i }],
30
+ ["--workers=NUM", "-wNUM", "Number of workers that are expected, e.g. 3", ->(p) { opts[:workers] = p.to_i }]
42
31
  ]
43
32
 
44
33
  on startup do
45
- opts[:redis_path] ||= '/tmp/redis.sock'
34
+ opts[:redis_path] ||= '/tmp/redis.sock'.freeze
46
35
  opts[:redis_db] ||= 1
47
-
36
+ opts[:events] = []
37
+ 0.upto(opts[:workers]-1) do |w|
38
+ opts[:events] += [
39
+ 'event:' + ('%02i' % w) + ':state/change',
40
+ 'event:' + ('%02i' % w) + ':executionhandler/change',
41
+ 'event:' + ('%02i' % w) + ':description/change',
42
+ 'event:' + ('%02i' % w) + ':dataelements/change',
43
+ 'event:' + ('%02i' % w) + ':endpoints/change',
44
+ 'event:' + ('%02i' % w) + ':attributes/change',
45
+ 'event:' + ('%02i' % w) + ':transformation/change',
46
+ 'event:' + ('%02i' % w) + ':status/change',
47
+ 'event:' + ('%02i' % w) + ':position/change',
48
+ 'event:' + ('%02i' % w) + ':handler/change',
49
+ 'callback:' + ('%02i' % w) + ':activity/content'
50
+ ]
51
+ end
52
+ opts[:events].freeze
48
53
  CPEE::redis_connect opts, 'Server Routing Persist'
49
54
  opts[:pubsubredis] = opts[:redis_dyn].call 'Server Routing Persist Sub'
55
+ rescue => e
56
+ puts e.message
57
+ puts e.backtrace
50
58
  end
51
59
 
52
60
  run do
53
- opts[:pubsubredis].subscribe(EVENTS) do |on|
61
+ opts[:pubsubredis].subscribe(opts[:events]) do |on|
54
62
  on.message do |what, message|
55
63
  mess = JSON.parse(message[message.index(' ')+1..-1])
56
64
  instance = mess.dig('instance')
57
65
  case what
58
- when 'callback:activity/content'
66
+ when /callback:\d+:activity\/content/
59
67
  key = mess.dig('content','key')
60
68
  opts[:redis].multi do |multi|
61
69
  multi.sadd("instance:#{instance}/callbacks",key)
@@ -64,26 +72,28 @@ Daemonite.new do |opts|
64
72
  multi.set("instance:#{instance}/callback/#{key}/position",mess.dig('content','activity'))
65
73
  multi.set("instance:#{instance}/callback/#{key}/type",'callback')
66
74
  end
67
- when 'event:state/change'
75
+ when /event:\d+:state\/change/
68
76
  opts[:redis].multi do |multi|
69
- multi.set("instance:#{instance}/state",mess.dig('content','state'))
70
- multi.set("instance:#{instance}/state/@changed",mess.dig('timestamp'))
77
+ unless mess.dig('content','state') == 'purged'
78
+ multi.set("instance:#{instance}/state",mess.dig('content','state'))
79
+ multi.set("instance:#{instance}/state/@changed",mess.dig('timestamp'))
80
+ end
71
81
  end
72
- when 'event:executionhandler/change'
82
+ when /event:\d+:executionhandler\/change/
73
83
  opts[:redis].set("instance:#{instance}/executionhandler",mess.dig('content','executionhandler'))
74
- when 'event:description/change'
84
+ when /event:\d+:description\/change/
75
85
  opts[:redis].multi do |multi|
76
86
  multi.set("instance:#{instance}/description",mess.dig('content','description'))
77
87
  multi.set("instance:#{instance}/dslx",mess.dig('content','dslx'))
78
88
  multi.set("instance:#{instance}/dsl",mess.dig('content','dsl'))
79
89
  end
80
- when 'event:dataelements/change', 'event:endpoints/change', 'event:attributes/change'
90
+ when /event:\d+:dataelements\/change/, /event:\d+:endpoints\/change/, /event:\d+:attributes\/change/
81
91
  topic = mess.dig('topic')
82
92
  opts[:redis].multi do |multi|
83
93
  mess.dig('content','changed')&.each_with_index do |c,i|
84
- unless what == 'event:attributes/change' && c == 'uuid'
94
+ unless what =~ /event:\d+:attributes\/change/ && c == 'uuid'
85
95
  multi.zadd("instance:#{instance}/#{topic}",i,c)
86
- if what == 'event:dataelements/change'
96
+ if what =~ /event:\d+:dataelements\/change/
87
97
  multi.set("instance:#{instance}/#{topic}/#{c}",CPEE::ValueHelper::generate(mess.dig('content','values',c)))
88
98
  else
89
99
  multi.set("instance:#{instance}/#{topic}/#{c}",mess.dig('content','values',c))
@@ -91,13 +101,13 @@ Daemonite.new do |opts|
91
101
  end
92
102
  end
93
103
  mess.dig('content','deleted')&.to_a&.each do |c|
94
- unless what == 'event:attributes/change' && c == 'uuid'
104
+ unless what =~ /event:\d+:attributes\/change/ && c == 'uuid'
95
105
  multi.zrem("instance:#{instance}/#{topic}",c)
96
106
  multi.del("instance:#{instance}/#{topic}/#{c}")
97
107
  end
98
108
  end
99
109
  end
100
- when 'event:transformation/change'
110
+ when /event:\d+:transformation\/change/
101
111
  opts[:redis].multi do |multi|
102
112
  multi.set("instance:#{instance}/transformation/description",mess.dig('content','description'))
103
113
  multi.set("instance:#{instance}/transformation/description/@type",mess.dig('content','description_type'))
@@ -106,12 +116,12 @@ Daemonite.new do |opts|
106
116
  multi.set("instance:#{instance}/transformation/endpoints",mess.dig('content','endpoints'))
107
117
  multi.set("instance:#{instance}/transformation/endpoints/@type",mess.dig('content','endpoints_type'))
108
118
  end
109
- when 'event:status/change'
119
+ when /event:\d+:status\/change/
110
120
  opts[:redis].multi do |multi|
111
121
  multi.set("instance:#{instance}/status/id",mess.dig('content','id'))
112
122
  multi.set("instance:#{instance}/status/message",mess.dig('content','message'))
113
123
  end
114
- when 'event:position/change'
124
+ when /event:\d+:position\/change/
115
125
  opts[:redis].multi do |multi|
116
126
  c = mess.dig('content')
117
127
  c.dig('unmark')&.each do |ele|
@@ -138,7 +148,7 @@ Daemonite.new do |opts|
138
148
  multi.set("instance:#{instance}/positions/#{ele['position']}",'after')
139
149
  end
140
150
  end
141
- when 'event:handler/change'
151
+ when /event:\d+:handler\/change/
142
152
  opts[:redis].multi do |multi|
143
153
  mess.dig('content','changed').each do |c|
144
154
  multi.sadd("instance:#{instance}/handlers",mess.dig('content','key'))
data/server/server.pid ADDED
@@ -0,0 +1 @@
1
+ 592827