cpee 1.5.16 → 1.5.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -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