cpee 1.5.16 → 1.5.17

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.
@@ -152,7 +152,7 @@ function WFAdaptorManifestation(adaptor) {
152
152
  'params': [null, xml_node]
153
153
  }];
154
154
  }
155
- if($('> finalize, > update', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
155
+ if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
156
156
  var icon = self.elements.callmanipulate.illustrator.svg.clone();
157
157
  icon.children('.rfill:last').addClass('menu');
158
158
  menu['Delete'].push({
@@ -160,7 +160,7 @@ function WFAdaptorManifestation(adaptor) {
160
160
  'function_call': self.adaptor.description.remove,
161
161
  'menu_icon': icon,
162
162
  'type': undefined,
163
- 'params': ['> finalize, > update', xml_node]
163
+ 'params': ['> code', xml_node]
164
164
  });
165
165
  }
166
166
  if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
@@ -253,7 +253,7 @@ function WFAdaptorManifestation(adaptor) {
253
253
  },
254
254
  'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
255
255
  'resolve_symbol': function(node) {
256
- if($('finalize,update', node).length > 0) {
256
+ if($('code', node).length > 0) {
257
257
  return 'callmanipulate';
258
258
  } else {
259
259
  return 'call';
@@ -263,7 +263,7 @@ function WFAdaptorManifestation(adaptor) {
263
263
  },//}}}
264
264
  'description': self.adaptor.theme_dir + 'rngs/call.rng',
265
265
  'permissible_children': function(node,mode) { //{{{
266
- if(node.children('finalize,update').length < 1)
266
+ if(node.children('code').length < 1)
267
267
  return [
268
268
  {'label': 'Scripts',
269
269
  'function_call': self.adaptor.description.insert_last_into,
@@ -538,7 +538,7 @@ function WFAdaptorManifestation(adaptor) {
538
538
  var childs = null;
539
539
  if (mode == 'into') { func = self.adaptor.description.insert_first_into }
540
540
  else { func = self.adaptor.description.insert_after }
541
- return [
541
+ var childs = [
542
542
  {'label': 'Service Call with Scripts',
543
543
  'function_call': func,
544
544
  'menu_icon': self.elements.callmanipulate.illustrator.svg.clone(),
@@ -578,13 +578,18 @@ function WFAdaptorManifestation(adaptor) {
578
578
  'function_call': func,
579
579
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
580
580
  'type': 'stop',
581
- 'params': [self.adaptor.description.elements.stop, node]},
582
- {'label': 'Critical',
583
- 'function_call': func,
584
- 'menu_icon': self.elements.critical.illustrator.svg.clone(),
585
- 'type': 'critical',
586
- 'params': [self.adaptor.description.elements.critical, node]}
581
+ 'params': [self.adaptor.description.elements.stop, node]}
587
582
  ];
583
+ if(node.parent('parallel_branch').length > 0) {
584
+ childs.push({
585
+ 'label': 'Critical',
586
+ 'function_call': func,
587
+ 'menu_icon': self.elements.critical.illustrator.svg.clone(),
588
+ 'type': 'critical',
589
+ 'params': [self.adaptor.description.elements.critical, node]
590
+ });
591
+ }
592
+ return childs;
588
593
  }, //}}}
589
594
  'adaptor': {//{{{
590
595
  'mousedown': function (node,e) {
@@ -625,7 +630,7 @@ function WFAdaptorManifestation(adaptor) {
625
630
  'type': 'parallel_branch',
626
631
  'params': [self.adaptor.description.elements.parallel_branch, node]}];
627
632
  }
628
- return [
633
+ var childs = [
629
634
  {'label': 'Service Call with Scripts',
630
635
  'function_call': func,
631
636
  'menu_icon': self.elements.callmanipulate.illustrator.svg.clone(),
@@ -665,13 +670,18 @@ function WFAdaptorManifestation(adaptor) {
665
670
  'function_call': func,
666
671
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
667
672
  'type': 'stop',
668
- 'params': [self.adaptor.description.elements.stop, node]},
669
- {'label': 'Critical',
670
- 'function_call': func,
671
- 'menu_icon': self.elements.critical.illustrator.svg.clone(),
672
- 'type': 'critical',
673
- 'params': [self.adaptor.description.elements.critical, node]}
673
+ 'params': [self.adaptor.description.elements.stop, node]}
674
674
  ];
675
+ if(node.parent('parallel_branch').length > 0) {
676
+ childs.push({
677
+ 'label': 'Critical',
678
+ 'function_call': func,
679
+ 'menu_icon': self.elements.critical.illustrator.svg.clone(),
680
+ 'type': 'critical',
681
+ 'params': [self.adaptor.description.elements.critical, node]
682
+ });
683
+ }
684
+ return childs;
675
685
  }, //}}}
676
686
  'adaptor': {//{{{
677
687
  'mousedown': function (node,e) {
@@ -717,7 +727,7 @@ function WFAdaptorManifestation(adaptor) {
717
727
  'menu_icon': self.elements.call.illustrator.svg.clone(),
718
728
  'type': 'call',
719
729
  'params': [self.adaptor.description.elements.call, node]},
720
- {'label': 'Manipulate',
730
+ {'label': 'Script',
721
731
  'function_call': func,
722
732
  'menu_icon': self.elements.manipulate.illustrator.svg.clone(),
723
733
  'type': 'manipulate',
@@ -741,13 +751,17 @@ function WFAdaptorManifestation(adaptor) {
741
751
  'function_call': func,
742
752
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
743
753
  'type': 'stop',
744
- 'params': [self.adaptor.description.elements.stop, node]},
745
- {'label': 'Critical',
746
- 'function_call': func,
747
- 'menu_icon': self.elements.critical.illustrator.svg.clone(),
748
- 'type': 'critical',
749
- 'params': [self.adaptor.description.elements.critical, node]}
754
+ 'params': [self.adaptor.description.elements.stop, node]}
750
755
  ];
756
+ if(node.parent('parallel_branch').length > 0) {
757
+ childs.push({
758
+ 'label': 'Critical',
759
+ 'function_call': func,
760
+ 'menu_icon': self.elements.critical.illustrator.svg.clone(),
761
+ 'type': 'critical',
762
+ 'params': [self.adaptor.description.elements.critical, node]
763
+ });
764
+ }
751
765
  if(node.parent('parallel').length > node.parent('parallel_branch').length) {
752
766
  childs.push({'label': 'Parallel Branch',
753
767
  'function_call': func,
@@ -807,7 +821,7 @@ function WFAdaptorManifestation(adaptor) {
807
821
  'menu_icon': self.elements.call.illustrator.svg.clone(),
808
822
  'type': 'call',
809
823
  'params': [self.adaptor.description.elements.call, node]},
810
- {'label': 'Manipulate',
824
+ {'label': 'Script',
811
825
  'function_call': func,
812
826
  'menu_icon': self.elements.manipulate.illustrator.svg.clone(),
813
827
  'type': 'manipulate',
@@ -826,7 +840,12 @@ function WFAdaptorManifestation(adaptor) {
826
840
  'function_call': func,
827
841
  'menu_icon': self.elements.parallel_branch.illustrator.svg.clone(),
828
842
  'type': 'parallel_branch',
829
- 'params': [self.adaptor.description.elements.parallel_branch, node]}
843
+ 'params': [self.adaptor.description.elements.parallel_branch, node]},
844
+ {'label': 'Stop',
845
+ 'function_call': func,
846
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
847
+ 'type': 'stop',
848
+ 'params': [self.adaptor.description.elements.stop, node]}
830
849
  ];
831
850
  if(node.get(0).tagName != 'parallel')
832
851
  childs.push({'label': 'Parallel',
@@ -872,10 +891,9 @@ function WFAdaptorManifestation(adaptor) {
872
891
  'description': self.adaptor.theme_dir + 'rngs/parallel_branch.rng',
873
892
  'permissible_children': function(node,mode) { //{{{
874
893
  var func = null;
875
- var childs = null;
876
894
  if (mode == 'into') { func = self.adaptor.description.insert_first_into }
877
895
  else { func = self.adaptor.description.insert_after }
878
- childs = [
896
+ var childs = [
879
897
  {'label': 'Service Call with Scripts',
880
898
  'function_call': func,
881
899
  'menu_icon': self.elements.callmanipulate.illustrator.svg.clone(),
@@ -920,7 +938,7 @@ function WFAdaptorManifestation(adaptor) {
920
938
  'function_call': func,
921
939
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
922
940
  'type': 'critical',
923
- 'params': [self.adaptor.description.elements.critical, node]},
941
+ 'params': [self.adaptor.description.elements.critical, node]}
924
942
  ];
925
943
  if(node.parents('choose').length > node.parents('alternative, otherwise').length && node.get(0).tagName == 'parallel_branch') {
926
944
  return [{'label': 'Alternative',
@@ -965,7 +983,7 @@ function WFAdaptorManifestation(adaptor) {
965
983
  var func = null;
966
984
  if (mode == 'into') { func = self.adaptor.description.insert_first_into }
967
985
  else { func = self.adaptor.description.insert_after }
968
- return [
986
+ var childs = [
969
987
  {'label': 'Service Call with Scripts',
970
988
  'function_call': func,
971
989
  'menu_icon': self.elements.callmanipulate.illustrator.svg.clone(),
@@ -1005,13 +1023,18 @@ function WFAdaptorManifestation(adaptor) {
1005
1023
  'function_call': func,
1006
1024
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
1007
1025
  'type': 'stop',
1008
- 'params': [self.adaptor.description.elements.stop, node]},
1009
- {'label': 'Critical',
1010
- 'function_call': func,
1011
- 'menu_icon': self.elements.critical.illustrator.svg.clone(),
1012
- 'type': 'critical',
1013
- 'params': [self.adaptor.description.elements.critical, node]},
1026
+ 'params': [self.adaptor.description.elements.stop, node]}
1014
1027
  ];
1028
+ if(node.parent('parallel_branch').length > 0) {
1029
+ childs.push({
1030
+ 'label': 'Critical',
1031
+ 'function_call': func,
1032
+ 'menu_icon': self.elements.critical.illustrator.svg.clone(),
1033
+ 'type': 'critical',
1034
+ 'params': [self.adaptor.description.elements.critical, node]
1035
+ });
1036
+ }
1037
+ return childs;
1015
1038
  }, //}}}
1016
1039
  'adaptor': {//{{{
1017
1040
  'mousedown': function (node,e) {
@@ -1075,7 +1098,7 @@ function WFAdaptorManifestation(adaptor) {
1075
1098
  var func = null;
1076
1099
  if (mode == 'into') { func = self.adaptor.description.insert_first_into }
1077
1100
  else { func = self.adaptor.description.insert_after }
1078
- return [
1101
+ var childs = [
1079
1102
  {'label': 'Service Call with Scripts',
1080
1103
  'function_call': func,
1081
1104
  'menu_icon': self.elements.callmanipulate.illustrator.svg.clone(),
@@ -1086,7 +1109,7 @@ function WFAdaptorManifestation(adaptor) {
1086
1109
  'menu_icon': self.elements.call.illustrator.svg.clone(),
1087
1110
  'type': 'call',
1088
1111
  'params': [self.adaptor.description.elements.call, node]},
1089
- {'label': 'Script Task',
1112
+ {'label': 'Script',
1090
1113
  'function_call': func,
1091
1114
  'menu_icon': self.elements.manipulate.illustrator.svg.clone(),
1092
1115
  'type': 'manipulate',
@@ -1115,13 +1138,18 @@ function WFAdaptorManifestation(adaptor) {
1115
1138
  'function_call': func,
1116
1139
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
1117
1140
  'type': 'stop',
1118
- 'params': [self.adaptor.description.elements.stop, node]},
1119
- {'label': 'Critical',
1120
- 'function_call': func,
1121
- 'menu_icon': self.elements.critical.illustrator.svg.clone(),
1122
- 'type': 'critical',
1123
- 'params': [self.adaptor.description.elements.critical, node]}
1141
+ 'params': [self.adaptor.description.elements.stop, node]}
1124
1142
  ];
1143
+ if(node.parent('parallel_branch').length > 0) {
1144
+ childs.push({
1145
+ 'label': 'Critical',
1146
+ 'function_call': func,
1147
+ 'menu_icon': self.elements.critical.illustrator.svg.clone(),
1148
+ 'type': 'critical',
1149
+ 'params': [self.adaptor.description.elements.critical, node]
1150
+ });
1151
+ }
1152
+ return childs;
1125
1153
  }, //}}}
1126
1154
  'adaptor': {//{{{
1127
1155
  'mousedown': function (node,e) {
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee"
3
- s.version = "1.5.16"
3
+ s.version = "1.5.17"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "Preliminary release of cloud process execution engine (cpee). If you just need workflow execution, without a rest/xmpp service exposing it, then use WEEL"
@@ -27,7 +27,7 @@ module CPEE
27
27
  SERVER = File.expand_path(__dir__ + '/../instantiation.xml')
28
28
 
29
29
  module Helpers #{{{
30
- def load_testset(tdoc,cpee,name=nil) #{{{
30
+ def load_testset(tdoc,cpee,name=nil,stream=nil) #{{{
31
31
  ins = -1
32
32
  uuid = nil
33
33
  XML::Smart.string(tdoc) do |doc|
@@ -41,6 +41,23 @@ module CPEE
41
41
  e.text = name
42
42
  end
43
43
  end
44
+ if stream && !stream.empty?
45
+ JSON.parse(stream).each do |e|
46
+ begin
47
+ stream = Typhoeus.get e['url']
48
+ if stream.success?
49
+ XML::Smart::string(stream.response_body) do |str|
50
+ doc.find("//desc:call[@id=\"#{e['id']}\"]/desc:parameters/desc:stream").each do |ele|
51
+ ele.replace_by str.root
52
+ end
53
+ end
54
+ end
55
+ rescue => e
56
+ puts e.message
57
+ puts e.backtrace
58
+ end
59
+ end
60
+ end
44
61
 
45
62
  status, response, headers = res.post Riddl::Parameter::Simple.new("info",doc.find("string(/testset/attributes/prop:info)"))
46
63
 
@@ -160,8 +177,8 @@ module CPEE
160
177
  else
161
178
  (@status = 500) && return
162
179
  end
163
-
164
- if (instance, uuid = load_testset(tdoc,cpee)).first == -1
180
+ stream = @p.find{ |e| e.name == 'stream' }&.value
181
+ if (instance, uuid = load_testset(tdoc,cpee,nil,stream)).first == -1
165
182
  @status = 500
166
183
  else
167
184
  handle_data cpee, instance, @p[4]&.value if @p[4]&.name == 'init'
@@ -198,8 +215,8 @@ module CPEE
198
215
  else
199
216
  (@status = 500) && return
200
217
  end
201
-
202
- if (instance, uuid = load_testset(tdoc,cpee,name)).first == -1
218
+ stream = @p.find{ |e| e.name == 'stream' }&.value
219
+ if (instance, uuid = load_testset(tdoc,cpee,name,stream)).first == -1
203
220
  @status = 500
204
221
  else
205
222
  handle_data cpee, instance, @p[2]&.value if @p[2]&.name == 'init'
@@ -33,6 +33,9 @@
33
33
  <optional>
34
34
  <parameter name="endpoints" type="string"/>
35
35
  </optional>
36
+ <optional>
37
+ <parameter name="stream" type="string"/>
38
+ </optional>
36
39
  </message>
37
40
  <message name="url">
38
41
  <parameter name="behavior" type="string">
@@ -50,6 +53,9 @@
50
53
  <optional>
51
54
  <parameter name="endpoints" type="string"/>
52
55
  </optional>
56
+ <optional>
57
+ <parameter name="stream" type="string"/>
58
+ </optional>
53
59
  </message>
54
60
  <message name="git">
55
61
  <parameter name="behavior" type="string">
@@ -69,6 +75,9 @@
69
75
  <optional>
70
76
  <parameter name="endpoints" type="string"/>
71
77
  </optional>
78
+ <optional>
79
+ <parameter name="stream" type="string"/>
80
+ </optional>
72
81
  </message>
73
82
  <message name="instance">
74
83
  <parameter name="behavior" type="string">
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/ruby
2
+ require_relative 'azure_logger'
3
+
4
+ Riddl::Server.new(File.join(__dir__,'/log.xml'), :host => 'localhost', :port => 9313) do
5
+ accessible_description true
6
+ cross_site_xhr true
7
+ interface 'events' do
8
+ run Logging if post 'event'
9
+ end
10
+ end.loop!
@@ -0,0 +1,136 @@
1
+ require 'pp'
2
+ require 'time'
3
+ require 'digest'
4
+
5
+ require 'json'
6
+ require 'riddl/server'
7
+ require 'typhoeus'
8
+
9
+ EP_ARTEFACTS = "https://api.powerbi.com/beta/7ba47c6d-039d-44e5-8834-ee103ea08c19/datasets/2fb85c30-2e66-42d3-ac16-18c1fe76f501/rows?key=qpnTPKsn4ekXasNFs9he4afwAb%2Bj8DndJ6mGAomCGkkAdKsIDifRDK9hsQd0mk3X94KCzqGrNCYN%2Fs7T7STQjg%3D%3D"
10
+ EP_INSTANCES = "https://api.powerbi.com/beta/7ba47c6d-039d-44e5-8834-ee103ea08c19/datasets/25c94fa0-f6f3-4547-9815-f772e1abc92f/rows?key=vWSGqHeQp6BQ8IPt4RBMLAbDPhVsyTW2NVcXfqQBCMx17cAZXfVejyAW72MeMGSbEk3fguhhqLoR3nYmopLIow%3D%3D"
11
+ EP_SPAWNED = "https://api.powerbi.com/beta/7ba47c6d-039d-44e5-8834-ee103ea08c19/datasets/79620e3f-a65c-4e34-b859-5aa43074f086/rows?key=dFS4XmqxI8iauMKucZenHQOi6mNcPhBslYo%2B8NwlzMYgiDYN%2FGDv6hX%2BwHMRIJwvQDyCxgd614KDihPw1Q%2BGSA%3D%3D"
12
+ EP_SENSORS = "https://api.powerbi.com/beta/7ba47c6d-039d-44e5-8834-ee103ea08c19/datasets/b62aada9-fe26-43e6-9e18-4bd3978e651d/rows?key=QWKNhGe3glUuWMOkCmJPytVQjaCn1Wyf8NboH3RXJTdA2ryiY%2Fk5%2Fz2lXDpgfguAa1xq%2BO%2Fw3lDhuXLYx4CyFA%3D%3D"
13
+ EP_VALUES = "https://api.powerbi.com/beta/7ba47c6d-039d-44e5-8834-ee103ea08c19/datasets/fc53f106-0299-458d-aa33-a04a00d68571/rows?key=mp9Om5wrPLG5hDA4efGzpfEGG5uHRUTtnUGlzNrfHJ5qaub2fG2FpwS5gq3g4IYRKMWG7mlCK5pgwm48XxtItw%3D%3D"
14
+
15
+ class Logging < Riddl::Implementation
16
+
17
+ def doc(topic,event_name,instancenr,notification)
18
+ uuid = notification['instance_uuid']
19
+ return unless uuid
20
+
21
+ uuid = notification.dig('instance_uuid')
22
+
23
+ if notification.dig('attributes','artefacts') #{{{
24
+ artefacts = JSON.parse(notification.dig('attributes','artefacts'))
25
+
26
+ artefacts.each do |a|
27
+ aid = Digest::MD5.hexdigest(a['group'] + '_' + a['name'])
28
+ iid = Digest::MD5.hexdigest(a['group'] + '_' + a['name'] + '_' + uuid)
29
+ Typhoeus.post(EP_ARTEFACTS,
30
+ headers: {'Content-Type'=> "application/json"},
31
+ body: JSON.generate([a])
32
+ )
33
+ Typhoeus.post(EP_INSTANCES,
34
+ headers: {'Content-Type'=> "application/json"},
35
+ body: [
36
+ {
37
+ 'uuid': uuid,
38
+ 'group': a['group'],
39
+ 'name': a['name'],
40
+ 'date': Time.now.iso8601,
41
+ 'info': notification.dig('attributes','info')
42
+ }
43
+ ]
44
+ )
45
+ end
46
+ end #}}}
47
+
48
+ case "#{topic}/#{event_name}"
49
+ when "dataelements/change", "endpoints/change"
50
+ sensors = JSON.parse(notification.dig('attributes','sensors') || '[]')
51
+ sensors.each do |s|
52
+ sid = Digest::MD5.hexdigest(uuid + '_' + s['name'])
53
+ Typhoeus.post(EP_SENSORS,
54
+ headers: {'Content-Type'=> "application/json"},
55
+ body: [
56
+ {
57
+ 'uuid': uuid,
58
+ 'sensor': s['name'],
59
+ 'visualizer_url': s['visualizer_url'],
60
+ 'visualizer_params': [s['visualizer_params']]
61
+ }
62
+ ]
63
+ )
64
+ Typhoeus.post(EP_VALUES,
65
+ headers: {'Content-Type'=> "application/json"},
66
+ body: [
67
+ {
68
+ 'uuid': uuid,
69
+ 'sensor': s['name'],
70
+ 'timestamp': notification.dig('timestamp'),
71
+ 'value': s['value']
72
+ }
73
+ ]
74
+ )
75
+ end
76
+ when "activity/receiving"
77
+ sensors = JSON.parse(notification.dig('sensors') || '[]')
78
+ tdoc = notification.dig('received')
79
+ sensors.each do |s|
80
+ sid = Digest::MD5.hexdigest(uuid + '_' + s['name'])
81
+ Typhoeus.post(EP_SENSORS,
82
+ headers: {'Content-Type'=> "application/json"},
83
+ body: [
84
+ {
85
+ 'uuid': uuid,
86
+ 'sensor': s['name'],
87
+ 'task': notification.dig('activity'),
88
+ 'visualizer_url': s['visualizer_url'],
89
+ 'visualizer_params': (s['visualizer_params'].nil? || s['visualizer_params'].empty? ? [] : [s['visualizer_params']])
90
+ }
91
+ ]
92
+ )
93
+ status, result = Riddl::Client.new(s['extractor_url']).post [
94
+ Riddl::Parameter::Simple.new('data',JSON.pretty_generate(tdoc)),
95
+ Riddl::Parameter::Simple.new('what',s['extractor_arg'])
96
+ ]
97
+ if status >= 200 && status < 300
98
+ ret = JSON::parse(result[0]&.value.read) rescue []
99
+ ret.each do |v,t|
100
+ Typhoeus.post(EP_VALUES,
101
+ headers: {'Content-Type'=> "application/json"},
102
+ body: [
103
+ {
104
+ 'uuid': uuid,
105
+ 'sensor': s['name'],
106
+ 'timestamp': t,
107
+ 'value': v
108
+ }
109
+ ]
110
+ )
111
+ end
112
+ end
113
+
114
+ end
115
+ end
116
+ nil
117
+ end
118
+
119
+ def response #{{{
120
+ ### save events for later replay
121
+ # a = {
122
+ # :topic => @p[1].value,
123
+ # :event_name => @p[2].value,
124
+ # :instancenr => @h['CPEE_INSTANCE'].split('/').last,
125
+ # :notification => JSON.parse(@p[3].value)
126
+ # }.to_yaml
127
+ # File.open('events.yaml','a') do |f|
128
+ # f << a
129
+ # end
130
+ topic = @p[1].value
131
+ event_name = @p[2].value
132
+ instancenr = @h['CPEE_INSTANCE'].split('/').last
133
+ notification = JSON.parse(@p[3].value)
134
+ doc topic, event_name, instancenr, notification
135
+ end #}}}
136
+ end