cpee-model-management 1.2.4 → 1.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70a1bebe35489c61c12ce579cf533eed01d4471bd81dfe35f1f8ec9229ab9991
4
- data.tar.gz: 99e78da9cb6fc8f9487c6753eef04adbf4359ba72a12979c546120c19c91df56
3
+ metadata.gz: da8a1393a981789476307ef0e613545dc263312cc059d6660fb532ec89f01e4d
4
+ data.tar.gz: 810b7bd624babce546318e16ed0c1dda2a46332dcbb8968640db0fc0c6679e23
5
5
  SHA512:
6
- metadata.gz: 41da660e08a891990154eff23942d4df183edb36142417a90067821d9554e7e83bfbcc493ca1e533664f43e49179fd8ea4c1c504782f16e8497c4b95c354bb48
7
- data.tar.gz: c410854184e37eb40cf4bc0fed672f244a9015a1385b4329015358d977c7653ee260b746997442b5b79453d91dbb8a05ffb468eb451ef23710fe6de8da274402
6
+ metadata.gz: 15fbcfa24d65bae3f763963726664b74bdae9b5c4843f1121e21bd65dd78448a3325607a880483e04e046c76556ff66c7d956a857345992301c4ba1bd67943e9
7
+ data.tar.gz: f1836da53235376adeaef4186be11803b605a2e2f76f2bfaad71991be020bdc3663a627769f7ba7eca08d5c4246879c5430bc8beaabc93989e6ff62782eb59c7
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee-model-management"
3
- s.version = "1.2.4"
3
+ s.version = "1.2.7"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "(Lifecycle) manage your process models in a directory or git repo."
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.email = 'juergen.mangler@gmail.com'
21
21
  s.homepage = 'http://cpee.org/'
22
22
 
23
- s.add_runtime_dependency 'riddl', '~> 1.0'
23
+ s.add_runtime_dependency 'riddl', '~> 1.0', '>=1.0.12'
24
24
  s.add_runtime_dependency 'json', '~> 2.1'
25
- s.add_runtime_dependency 'cpee', '~> 2.1', '>= 2.1.7'
25
+ s.add_runtime_dependency 'cpee', '~> 2.1', '>= 2.1.114'
26
26
  end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/ruby
2
+ require_relative 'implementation'
3
+
4
+ options = {
5
+ :host => 'localhost',
6
+ :port => 9317,
7
+ :secure => false
8
+ }
9
+
10
+ Riddl::Server.new(File.join(__dir__,'dashing.xml'), options) do |opts|
11
+ accessible_description true
12
+ cross_site_xhr true
13
+
14
+ ### set redis_cmd to nil if you want to do global
15
+ ### at least redis_path or redis_url and redis_db have to be set if you do global
16
+ opts[:redis_db] ||= 0
17
+ opts[:redis_url] ||= 'unix://redis.sock' # sadly we have to do this for now
18
+ opts[:redis_unixsocket] ||= true
19
+ opts[:redis_cmd] ||= 'redis-server --port #redis_port# --unixsocket #redis_path# --unixsocketperm 600 --pidfile #redis_pid# --dir #redis_db_dir# --dbfilename #redis_db_name# --databases 1 --save 900 1 --save 300 10 --save 60 10000 --rdbcompression yes -- daemonize yes --protected-mode no'
20
+ opts[:redis_pid] ||= 'redis.pid' # use e.g. /var/run/redis.pid if you do global. Look it up in your redis config
21
+ opts[:redis_db_name] ||= 'redis.rdb' # use e.g. /var/lib/redis.rdb for global stuff. Look it up in your redis config
22
+
23
+ startup do
24
+ CPEE::redis_connect opts, 'Server Main'
25
+ end
26
+
27
+ interface 'events' do
28
+ run CPEE::ModelManagement::StatReceive, opts[:redis], opts[:stat_receivers] if post 'event'
29
+ end
30
+ end.loop!
@@ -1,18 +1,12 @@
1
1
  <declaration xmlns="http://riddl.org/ns/declaration/1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
2
- <interface name="implementation">
3
- <xi:include href="implementation.xml"/>
4
- </interface>
5
2
  <interface name="events">
6
3
  <xi:include href="http://www.riddl.org/ns/common-patterns/notifications-consumer/2.0/consumer.xml"/>
7
4
  </interface>
8
5
 
9
6
  <facade>
10
7
  <tile>
11
- <layer name="implementation">
12
- <apply-to>/</apply-to>
13
- </layer>
14
8
  <layer name="events">
15
- <apply-to>/dash/events</apply-to>
9
+ <apply-to>/</apply-to>
16
10
  </layer>
17
11
  </tile>
18
12
  </facade>
@@ -31,7 +31,7 @@ require 'digest/sha1'
31
31
  module CPEE
32
32
  module ModelManagement
33
33
 
34
- SERVER = File.expand_path(File.join(__dir__,'moma.xml'))
34
+ SERVER = File.expand_path(File.join(__dir__,'implementation.xml'))
35
35
 
36
36
  def self::git_mv(models,old,new)
37
37
  cdir = Dir.pwd
@@ -299,7 +299,7 @@ module CPEE
299
299
  end
300
300
  File.write(fname + '.attrs',JSON::pretty_generate(attrs))
301
301
 
302
- CPEE::ModelManagement::op author, 'mv', models, File.join('.', where, nname + '.xml'), File.join('.', where, name + '.xml')
302
+ CPEE::ModelManagement::op author, 'mv', models, File.join('.', where, File.basename(fnname)), File.join('.', where, name + '.xml')
303
303
  CPEE::ModelManagement::notify conns, 'rename', models, fnname, fname
304
304
  nil
305
305
  end
@@ -330,7 +330,7 @@ module CPEE
330
330
  XML::Smart::modify(f) do |doc|
331
331
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
332
332
  doc.find('/p:testset/p:attributes/p:design_dir').each do |ele|
333
- ele.text = nname + '.dir'
333
+ ele.text = File.basename(fnname,'.dir')
334
334
  end
335
335
  attrs = doc.find('/p:testset/p:attributes/*').map do |e|
336
336
  [e.qname.name,e.text]
@@ -339,7 +339,7 @@ module CPEE
339
339
  File.write(f + '.attrs',JSON::pretty_generate(attrs))
340
340
  end
341
341
 
342
- CPEE::ModelManagement::op author, 'mv', models, File.join(nname + '.dir'), File.join(name + '.dir')
342
+ CPEE::ModelManagement::op author, 'mv', models, File.basename(fnname), name + '.dir'
343
343
  CPEE::ModelManagement::notify conns, 'rename', models, fnname, fname
344
344
  nil
345
345
  end
@@ -667,7 +667,6 @@ module CPEE
667
667
  class StatReceive < Riddl::Implementation #{{{
668
668
  def response
669
669
  redis = @a[0]
670
- receivers = @a[1]
671
670
  topic = @p[1].value
672
671
  event_name = @p[2].value
673
672
  notification = JSON.parse(@p[3].value.read)
@@ -727,18 +726,23 @@ module CPEE
727
726
  multi.set(File.join(prefix,'time'),Time.now.to_i)
728
727
  end
729
728
  elsif %w{stopping}.include?(content['state'])
730
- redis.multi do |multi|
731
- multi.set(File.join(prefix,'state'),content['state'])
732
- multi.set(File.join(prefix,'time'),Time.now.to_i)
729
+ unless redis.get(File.join(prefix,'state')) == "stopped" # if stopped arrives before stopping, we have a wrong state. We want to avoid this.
730
+ redis.multi do |multi|
731
+ multi.set(File.join(prefix,'state'),content['state'])
732
+ multi.set(File.join(prefix,'time'),Time.now.to_i)
733
+ end
733
734
  end
734
735
  elsif %w{stopped}.include?(content['state'])
735
- redis.multi do |multi|
736
- multi.decr(File.join(engine,'running'))
737
- multi.incr(File.join(engine,'stopped'))
738
- multi.set(File.join(prefix,'state'),content['state'])
739
- multi.set(File.join(prefix,'cpu'),0)
740
- multi.set(File.join(prefix,'mem'),0)
741
- multi.set(File.join(prefix,'time'),Time.now.to_i)
736
+ oldstate = redis.get(File.join(prefix,'state'))
737
+ if oldstate && oldstate != 'stopped' # stopped can be repeated when reloading instance, any other state before is either fine or can not happen
738
+ redis.multi do |multi|
739
+ multi.decr(File.join(engine,'running'))
740
+ multi.incr(File.join(engine,'stopped'))
741
+ multi.set(File.join(prefix,'state'),content['state'])
742
+ multi.set(File.join(prefix,'cpu'),0)
743
+ multi.set(File.join(prefix,'mem'),0)
744
+ multi.set(File.join(prefix,'time'),Time.now.to_i)
745
+ end
742
746
  end
743
747
  elsif %w{running}.include?(content['state'])
744
748
  oldstate = redis.get(File.join(prefix,'state'))
@@ -760,9 +764,7 @@ module CPEE
760
764
  File.join(prefix,'time'),
761
765
  File.join(prefix,'parent')
762
766
  )
763
- receivers.each do |conn|
764
- conn.send JSON::generate(:topic => topic, :event => event_name, :engine => engine, :uuid => notification['instance-uuid'], :url => url, :author => author, :path => path.to_s, :name => name, :state => content['state'], :time => time, :parent => parent.to_s)
765
- end
767
+ redis.publish 'forward', JSON::generate(:topic => topic, :event => event_name, :engine => engine, :uuid => notification['instance-uuid'], :url => url, :author => author, :path => path.to_s, :name => name, :state => content['state'], :time => time, :parent => parent.to_s)
766
768
  elsif topic == 'task' && event_name == 'instantiation'
767
769
  redis.multi do |multi|
768
770
  multi.rpush(File.join(engine,notification['instance-uuid'],'children'),content['received']['CPEE-INSTANCE-UUID'])
@@ -778,18 +780,14 @@ module CPEE
778
780
  File.join(prefix,'time'),
779
781
  File.join(prefix,'parent')
780
782
  )
781
- receivers.each do |conn|
782
- conn.send JSON::generate(:topic => 'state', :event => 'change', :engine => engine, :uuid => content['received']['CPEE-INSTANCE-UUID'], :url => url, :author => author, :path => path.to_s, :name => name, :state => state, :time => time, :parent => parent.to_s)
783
- end
783
+ redis.publish 'forward', JSON::generate(:topic => 'state', :event => 'change', :engine => engine, :uuid => content['received']['CPEE-INSTANCE-UUID'], :url => url, :author => author, :path => path.to_s, :name => name, :state => state, :time => time, :parent => parent.to_s)
784
784
  elsif topic == 'status' && event_name == 'resource_utilization'
785
785
  redis.multi do |multi|
786
786
  multi.set(File.join(prefix,'name'),attr['info'])
787
787
  multi.set(File.join(prefix,'cpu'),content['utime'] + content['stime'])
788
788
  multi.set(File.join(prefix,'mem'),content['mib'])
789
789
  end
790
- receivers.each do |conn|
791
- conn.send JSON::generate(:topic => topic, :event => event_name, :engine => engine, :uuid => notification['instance-uuid'], :cpu => content['utime'] + content['stime'], :mem => content['mib'])
792
- end
790
+ redis.publish 'forward', JSON::generate(:topic => topic, :event => event_name, :engine => engine, :uuid => notification['instance-uuid'], :cpu => content['utime'] + content['stime'], :mem => content['mib'])
793
791
  elsif topic == 'node' && event_name == 'resource_utilization'
794
792
  redis.multi do |multi|
795
793
  multi.set(File.join(engine,'cpu_usage'),content['cpu_usage'])
@@ -797,9 +795,7 @@ module CPEE
797
795
  multi.set(File.join(engine,'mem_total'),content['mem_total'])
798
796
  multi.set(File.join(engine,'mem_available'),content['mem_available'])
799
797
  end
800
- receivers.each do |conn|
801
- conn.send JSON::generate(:topic => topic, :event => event_name, :engine => engine, :cpu_usage => content['cpu_usage'], :mem_free => content['mem_free'], :mem_total => content['mem_total'], :mem_available => content['mem_available'])
802
- end
798
+ redis.publish 'forward', JSON::generate(:topic => topic, :event => event_name, :engine => engine, :cpu_usage => content['cpu_usage'], :mem_free => content['mem_free'], :mem_total => content['mem_total'], :mem_available => content['mem_available'])
803
799
  end
804
800
  end
805
801
  end #}}}
@@ -864,28 +860,54 @@ module CPEE
864
860
  end
865
861
  end #}}}
866
862
 
863
+ def self::service_handler(opts,cmd,out) #{{{
864
+ 1.upto opts[:workers] do |i|
865
+ s = File.join(__dir__,'dashing.rb')
866
+ next if File.exist?(s + '.lock')
867
+ pid = (File.read(s + '.pid').to_i rescue nil)
868
+ if (pid.nil? || !(Process.kill(0, pid) rescue false))
869
+ params = "-p #{opts[:port].to_i + i} -o basepath=#{File.realpath(opts[:basepath])} #{cmd} 1>/dev/null 2>&1"
870
+ system "#{s} #{params} 1>/dev/null 2>&1"
871
+ puts "➡ Service #{File.basename(s)} (#{params}) #{out} ..."
872
+ end
873
+ end
874
+ end #}}}
875
+ def self::sse_stat_distributor(opts) #{{{
876
+ conn = opts[:redis_dyn].call "Server SSE"
877
+ conn.subscribe('forward') do |on|
878
+ on.message do |what, message|
879
+ opts[:stat_receivers].each do |conn|
880
+ conn.send message
881
+ end
882
+ end
883
+ end
884
+ conn.close
885
+ end #}}}
867
886
 
868
887
  def self::implementation(opts)
869
888
  opts[:management_receivers] = []
870
889
  opts[:stat_receivers] = []
871
890
 
891
+ opts[:workers] = 1
892
+
872
893
  ### set redis_cmd to nil if you want to do global
873
894
  ### at least redis_path or redis_url and redis_db have to be set if you do global
874
- opts[:redis_path] ||= 'redis.sock' # use e.g. /tmp/redis.sock for global stuff. Look it up in your redis config
875
895
  opts[:redis_db] ||= 0
876
- ### optional redis stuff
877
- opts[:redis_url] ||= nil
878
- opts[:redis_cmd] ||= 'redis-server --port 0 --unixsocket #redis_path# --unixsocketperm 600 --pidfile #redis_pid# --dir #redis_db_dir# --dbfilename #redis_db_name# --databases 1 --save 900 1 --save 300 10 --save 60 10000 --rdbcompression yes --daemonize yes'
896
+ opts[:redis_url] ||= 'unix://redis.sock' # sadly we have to do this for now
897
+ opts[:redis_unixsocket] ||= true
898
+ opts[:redis_cmd] ||= 'redis-server --port #redis_port# --unixsocket #redis_path# --unixsocketperm 600 --pidfile #redis_pid# --dir #redis_db_dir# --dbfilename #redis_db_name# --databases 1 --save 900 1 --save 300 10 --save 60 10000 --rdbcompression yes -- daemonize yes --protected-mode no'
879
899
  opts[:redis_pid] ||= 'redis.pid' # use e.g. /var/run/redis.pid if you do global. Look it up in your redis config
880
900
  opts[:redis_db_name] ||= 'redis.rdb' # use e.g. /var/lib/redis.rdb for global stuff. Look it up in your redis config
881
901
 
882
- CPEE::redis_connect opts, 'Server Main'
883
-
884
902
  opts[:sse_keepalive_frequency] ||= 10
885
903
 
904
+ CPEE::redis_connect opts, 'Server Main'
886
905
  Proc.new do
887
906
 
888
907
  parallel do
908
+ EM.defer do ### catch all sse connections
909
+ CPEE::ModelManagement::sse_stat_distributor(opts)
910
+ end
889
911
  EM.add_periodic_timer(opts[:sse_keepalive_frequency]) do
890
912
  opts[:management_receivers].each do |sse|
891
913
  sse.send_with_id('heartbeat', '42') unless sse&.closed?
@@ -896,11 +918,14 @@ module CPEE
896
918
  end
897
919
  end
898
920
 
899
- interface 'events' do
900
- run StatReceive, opts[:redis], opts[:stat_receivers] if post 'event'
921
+ startup do
922
+ CPEE::ModelManagement::service_handler(opts,'restart','started')
923
+ end
924
+ cleanup do
925
+ CPEE::ModelManagement::service_handler(opts,'stop','stopped')
901
926
  end
902
927
 
903
- interface 'implementation' do
928
+ on resource do
904
929
  run GetList, :main, opts[:views], opts[:models] if get 'stage'
905
930
  run GetListFull, opts[:views], opts[:models] if get 'full'
906
931
  run GetStages, opts[:themes] if get 'stages'
data/server/moma CHANGED
@@ -1,6 +1,11 @@
1
1
  #!/usr/bin/ruby
2
- require 'rubygems'
3
- require 'cpee-model-management/implementation'
2
+ if File.exist?(File.join(__dir__,'..','lib','cpee-model-management','implementation.rb'))
3
+ require_relative File.join(__dir__,'..','lib','cpee-model-management','implementation')
4
+ elsif File.exist?(File.join(Dir.home,'Projects','cpee-model-management','lib','cpee-model-management','implementation.rb'))
5
+ require_relative File.join(Dir.home, 'Projects','cpee-model-management','lib','cpee-model-management','implementation')
6
+ else
7
+ require 'cpee-model-management/implementation'
8
+ end
4
9
 
5
10
  options = {
6
11
  :host => 'localhost',
data/server/moma.conf CHANGED
@@ -1,4 +1,5 @@
1
1
  :port: 9316
2
+ :workers: 1
2
3
  :models: models
3
4
  :location: https://cpee.org/design/server/
4
5
  :instantiate: https://cpee.org/flow/start/
data/ui/js/stats.js CHANGED
@@ -163,15 +163,15 @@ function instances_init(ename) {
163
163
  }
164
164
 
165
165
  function resource_paint(iname,data,count) {
166
- count[iname]++
167
- Plotly.extendTraces('resource_utilization_plot_' + iname, {y: [[data.cpu_usage], [(data.mem_total-data.mem_available)/data.mem_total * 100]]}, [0,1])
168
- Plotly.relayout('resource_utilization_plot_' + iname, {
169
- xaxis: {
170
- range: [count[iname]-value_count,count[iname]],
171
- showticklabels: false,
172
- fixedrange: true
173
- }
174
- });
166
+ count[iname]++;
167
+ Plotly.extendTraces('resource_utilization_plot_' + iname, {y: [[data.cpu_usage], [(data.mem_total-data.mem_available)/data.mem_total * 100]]}, [0,1], value_count)
168
+ // Plotly.relayout('resource_utilization_plot_' + iname, {
169
+ // xaxis: {
170
+ // range: [count[iname]-value_count,count[iname]],
171
+ // showticklabels: false,
172
+ // fixedrange: true
173
+ // }
174
+ // });
175
175
  }
176
176
 
177
177
  function stats_init() {
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpee-model-management
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
8
- autorequire:
9
8
  bindir: tools
10
9
  cert_chain: []
11
- date: 2024-07-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: riddl
@@ -17,6 +16,9 @@ dependencies:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '1.0'
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.12
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +26,9 @@ dependencies:
24
26
  - - "~>"
25
27
  - !ruby/object:Gem::Version
26
28
  version: '1.0'
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.0.12
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: json
29
34
  requirement: !ruby/object:Gem::Requirement
@@ -47,7 +52,7 @@ dependencies:
47
52
  version: '2.1'
48
53
  - - ">="
49
54
  - !ruby/object:Gem::Version
50
- version: 2.1.7
55
+ version: 2.1.114
51
56
  type: :runtime
52
57
  prerelease: false
53
58
  version_requirements: !ruby/object:Gem::Requirement
@@ -57,7 +62,7 @@ dependencies:
57
62
  version: '2.1'
58
63
  - - ">="
59
64
  - !ruby/object:Gem::Version
60
- version: 2.1.7
65
+ version: 2.1.114
61
66
  description: see http://cpee.org
62
67
  email: juergen.mangler@gmail.com
63
68
  executables:
@@ -72,14 +77,14 @@ files:
72
77
  - Rakefile
73
78
  - cpee-model-management.gemspec
74
79
  - lib/cpee-model-management/commit.rb
80
+ - lib/cpee-model-management/dashing.rb
81
+ - lib/cpee-model-management/dashing.xml
75
82
  - lib/cpee-model-management/implementation.rb
76
83
  - lib/cpee-model-management/implementation.xml
77
- - lib/cpee-model-management/moma.xml
78
84
  - lib/cpee-model-management/stages
79
85
  - server/model.xml
80
86
  - server/moma
81
87
  - server/moma.conf
82
- - server/redis.rdb
83
88
  - server/testset.xml
84
89
  - tools/cpee-moma
85
90
  - ui/css/moma.css
@@ -96,7 +101,6 @@ homepage: http://cpee.org/
96
101
  licenses:
97
102
  - LGPL-3.0
98
103
  metadata: {}
99
- post_install_message:
100
104
  rdoc_options: []
101
105
  require_paths:
102
106
  - lib
@@ -111,8 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
115
  - !ruby/object:Gem::Version
112
116
  version: '0'
113
117
  requirements: []
114
- rubygems_version: 3.5.9
115
- signing_key:
118
+ rubygems_version: 3.6.9
116
119
  specification_version: 4
117
120
  summary: "(Lifecycle) manage your process models in a directory or git repo."
118
121
  test_files: []
data/server/redis.rdb DELETED
Binary file