cpee-model-management 1.0.17 → 1.1.1

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: d3a70760a747bb5dd295cac87766307d1d3775767af440e3090d2e108757837d
4
- data.tar.gz: ed59f63e220bb3c6fb8e096ce21ee41f5542c59fff051e48c0d04ff7ee8ccd79
3
+ metadata.gz: 6fc783f8350eac7d65fbda35f275d4ea319878f2265e5d3e02eaf234eb0d4fd1
4
+ data.tar.gz: c16ceedc6068a9d0114ddc5456625f55a8a7072770d2e3af28479198a988282c
5
5
  SHA512:
6
- metadata.gz: fd9497631d3a6d95a98b0f829211aa13712626bf1aac340a4bdb19eb80ee1b26e624bfa3e5766d1f8cceeb37d215f75b8c05478566802daf667a297eb4c4b075
7
- data.tar.gz: 04c947de228d452fa277b01213c0a4a5deaa8d47bd3b357a94593c350c1ae15a728c470a38023a4298d9a2db808580bfe187cb1fe19dcf9bd4b634819a25a0a2
6
+ metadata.gz: 12fe97b8aa17301c3863fb983d0527efae7aacecfb313d5963a0a0d19aa30d73c00ff2b85275a1a0d50a48010d4185df3ff7fd9c4eae15c467ee230b8cc35154
7
+ data.tar.gz: 3a657a24d96ebde89e77378f35aed645e3548148c5c33ba28b064362030c5f9b35394e7704cf64b818d5d85b083ab0da84790575f1e8e601d25ae2e6ed0967d2
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee-model-management"
3
- s.version = "1.0.17"
3
+ s.version = "1.1.1"
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."
@@ -25,6 +25,7 @@ require 'fileutils'
25
25
  require 'pathname'
26
26
  require 'shellwords'
27
27
  require 'securerandom'
28
+ require 'cpee/redis'
28
29
 
29
30
  module CPEE
30
31
  module ModelManagement
@@ -358,7 +359,7 @@ module CPEE
358
359
  Dir.mkdir(fname)
359
360
  FileUtils.touch(File.join(fname,'.gitignore'))
360
361
 
361
- attrs = JSON::load File.open(fname + '.attrs')
362
+ attrs = {}
362
363
  attrs['creator'] = creator
363
364
  attrs['author'] = creator
364
365
  File.write(fname + '.attrs',JSON::pretty_generate(attrs))
@@ -507,6 +508,26 @@ module CPEE
507
508
  nil
508
509
  end
509
510
  end #}}}
511
+ class ShowUrl < Riddl::Implementation #{{{
512
+ def response
513
+ show = @a[0]
514
+ @status = 302
515
+ @headers << Riddl::Header.new('Location',show + @p.first.value)
516
+ end
517
+ end #}}}
518
+ class AbandonUrl < Riddl::Implementation #{{{
519
+ def response
520
+ aba = @p.first.value
521
+ res1 = Typhoeus.get(File.join(aba,'properties','state','/'))
522
+ if res1.success?
523
+ if res1.response_body == 'ready' || res1.response_body == 'stopped'
524
+ Typhoeus.put(File.join(aba,'properties','state','/'), headers: {'Content-Type' => 'application/x-www-form-urlencoded'}, body: "value=abandoned")
525
+ end
526
+ end
527
+ nil
528
+ end
529
+ end #}}}
530
+
510
531
  class MoveItem < Riddl::Implementation #{{{
511
532
  def response
512
533
  where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(@r[-2])
@@ -606,7 +627,17 @@ module CPEE
606
627
  end
607
628
  end #}}}
608
629
 
609
- class Active < Riddl::SSEImplementation #{{{
630
+ class ManagementSend < Riddl::SSEImplementation #{{{
631
+ def onopen
632
+ @conns = @a[0]
633
+ @conns << self
634
+ end
635
+ def onclose
636
+ @conns.delete(self)
637
+ end
638
+ end #}}}
639
+
640
+ class StatSend < Riddl::SSEImplementation #{{{
610
641
  def onopen
611
642
  @conns = @a[0]
612
643
  @conns << self
@@ -616,31 +647,240 @@ module CPEE
616
647
  end
617
648
  end #}}}
618
649
 
650
+ class StatReceive < Riddl::Implementation #{{{
651
+ def response
652
+ redis = @a[0]
653
+ receivers = @a[1]
654
+ topic = @p[1].value
655
+ event_name = @p[2].value
656
+ notification = JSON.parse(@p[3].value.read)
657
+
658
+ instancenr = notification['instance']
659
+ content = notification['content']
660
+ attr = content['attributes']
661
+ engine = notification['cpee']
662
+
663
+ prefix = File.join(engine,notification['instance-uuid'].to_s)
664
+
665
+ if topic == 'state' && event_name == 'change'
666
+ if %w{abandoned finished}.include?(content['state'])
667
+ parent = redis.get(File.join(prefix,'parent'))
668
+ oldstate = redis.get(File.join(prefix,'state'))
669
+ children = redis.lrange(File.join(prefix,'children'),0,-1)
670
+ redis.multi do |multi|
671
+ multi.decr(File.join(engine,oldstate)) rescue nil
672
+ multi.incr(File.join(engine,'total_' + content['state']))
673
+ multi.lrem(File.join(engine,'instances'),0,notification['instance-uuid'])
674
+ multi.del(File.join(prefix,'instance-url'))
675
+ multi.del(File.join(prefix,'author'))
676
+ multi.del(File.join(prefix,'path'))
677
+ multi.del(File.join(prefix,'name'))
678
+ multi.del(File.join(prefix,'state'))
679
+ multi.del(File.join(prefix,'cpu'))
680
+ multi.del(File.join(prefix,'mem'))
681
+ multi.del(File.join(prefix,'time'))
682
+ children.each do |child|
683
+ if parent
684
+ multi.set(File.join(engine,child,'parent'),parent)
685
+ else
686
+ multi.del(File.join(engine,child,'parent'))
687
+ end
688
+ end
689
+ multi.del(File.join(prefix,'children'))
690
+ multi.del(File.join(prefix,'parent'))
691
+ if parent
692
+ multi.lrem(File.join(engine,parent,'children'),0,notification['instance-uuid'].to_s)
693
+ end
694
+ end
695
+ elsif %w{ready}.include?(content['state'])
696
+ exi = true if redis.lrange(File.join(engine,'instances'),0,-1).include?(notification['instance-uuid'])
697
+ redis.multi do |multi|
698
+ unless exi
699
+ multi.incr(File.join(engine,'total_created'))
700
+ multi.incr(File.join(engine,'ready'))
701
+ multi.rpush(File.join(engine,'instances'),notification['instance-uuid'])
702
+ end
703
+ multi.set(File.join(prefix,'instance-url'),notification['instance-url'])
704
+ multi.set(File.join(prefix,'author'),attr['author'])
705
+ multi.set(File.join(prefix,'state'),content['state'])
706
+ multi.set(File.join(prefix,'path'),File.join(attr['design_dir'],attr['info']+'.xml')) unless attr['design_dir'].nil? || attr['info'].nil?
707
+ multi.set(File.join(prefix,'name'),attr['info'])
708
+ multi.set(File.join(prefix,'cpu'),0)
709
+ multi.set(File.join(prefix,'mem'),0)
710
+ multi.set(File.join(prefix,'time'),0)
711
+ end
712
+ elsif %w{stopping}.include?(content['state'])
713
+ redis.set(File.join(prefix,'state'),content['state'])
714
+ elsif %w{stopped}.include?(content['state'])
715
+ redis.multi do |multi|
716
+ multi.decr(File.join(engine,'running'))
717
+ multi.incr(File.join(engine,'stopped'))
718
+ multi.set(File.join(prefix,'state'),content['state'])
719
+ multi.set(File.join(prefix,'cpu'),0)
720
+ multi.set(File.join(prefix,'mem'),0)
721
+ multi.set(File.join(prefix,'time'),0)
722
+ end
723
+ elsif %w{running}.include?(content['state'])
724
+ oldstate = redis.get(File.join(prefix,'state'))
725
+ redis.multi do |multi|
726
+ multi.decr(File.join(engine,oldstate)) rescue nil
727
+ multi.incr(File.join(engine,'running'))
728
+ multi.set(File.join(prefix,'name'),attr['info'])
729
+ multi.set(File.join(prefix,'state'),content['state'])
730
+ multi.set(File.join(prefix,'time'),Time.now.to_i)
731
+ end
732
+ end
733
+
734
+ url, author, path, name, state, parent = redis.mget(
735
+ File.join(prefix,'instance-url'),
736
+ File.join(prefix,'author'),
737
+ File.join(prefix,'path'),
738
+ File.join(prefix,'name'),
739
+ File.join(prefix,'state'),
740
+ File.join(prefix,'parent')
741
+ )
742
+ receivers.each do |conn|
743
+ 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'], :parent => parent.to_s)
744
+ end
745
+ elsif topic == 'task' && event_name == 'instantiation'
746
+ redis.multi do |multi|
747
+ multi.rpush(File.join(engine,notification['instance-uuid'],'children'),content['received']['CPEE-INSTANCE-UUID'])
748
+ multi.set(File.join(engine,content['received']['CPEE-INSTANCE-UUID'],'parent'),notification['instance-uuid'])
749
+ end
750
+ prefix = File.join(engine,content['received']['CPEE-INSTANCE-UUID'].to_s)
751
+ url, author, path, name, state, parent = redis.mget(
752
+ File.join(prefix,'instance-url'),
753
+ File.join(prefix,'author'),
754
+ File.join(prefix,'path'),
755
+ File.join(prefix,'name'),
756
+ File.join(prefix,'state'),
757
+ File.join(prefix,'parent')
758
+ )
759
+ receivers.each do |conn|
760
+ 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, :parent => parent.to_s)
761
+ end
762
+ elsif topic == 'status' && event_name == 'resource_utilization'
763
+ redis.multi do |multi|
764
+ multi.set(File.join(prefix,'name'),attr['info'])
765
+ multi.set(File.join(prefix,'cpu'),content['utime'] + content['stime'])
766
+ multi.set(File.join(prefix,'mem'),content['mib'])
767
+ end
768
+ receivers.each do |conn|
769
+ conn.send JSON::generate(:topic => topic, :event => event_name, :engine => engine, :uuid => notification['instance-uuid'], :cpu => content['utime'] + content['stime'], :mem => content['mib'])
770
+ end
771
+ elsif topic == 'node' && event_name == 'resource_utilization'
772
+ redis.multi do |multi|
773
+ multi.set(File.join(engine,'cpu_usage'),content['cpu_usage'])
774
+ multi.set(File.join(engine,'mem_free'),content['mem_free'])
775
+ multi.set(File.join(engine,'mem_total'),content['mem_total'])
776
+ multi.set(File.join(engine,'mem_available'),content['mem_available'])
777
+ end
778
+ receivers.each do |conn|
779
+ 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'])
780
+ end
781
+ end
782
+ end
783
+ end #}}}
784
+
785
+ class StatGet < Riddl::Implementation #{{{
786
+ def response
787
+ redis = @a[0]
788
+ engine = @p[0].value
789
+ res = redis.mapped_mget(
790
+ File.join(engine,'total_created'),
791
+ File.join(engine,'total_finished'),
792
+ File.join(engine,'total_abandoned'),
793
+ File.join(engine,'ready'),
794
+ File.join(engine,'stopped'),
795
+ File.join(engine,'running')
796
+ ).transform_keys{ |k| File.basename(k) }.transform_values(&:to_i)
797
+ Riddl::Parameter::Complex.new('stats','application/json',JSON::pretty_generate(res || []))
798
+ end
799
+ end #}}}
800
+ class InstancesGet < Riddl::Implementation #{{{
801
+ def response
802
+ redis = @a[0]
803
+ engine = @p[0].value
804
+ doc = XML::Smart.string('<instances/>')
805
+ redis.lrange(File.join(engine,'instances'),0,-1).each do |i|
806
+ prefix = File.join(engine,i.to_s)
807
+ url, author, path, name, state, cpu, mem, parent = redis.mget(
808
+ File.join(prefix,'instance-url'),
809
+ File.join(prefix,'author'),
810
+ File.join(prefix,'path'),
811
+ File.join(prefix,'name'),
812
+ File.join(prefix,'state'),
813
+ File.join(prefix,'cpu'),
814
+ File.join(prefix,'mem'),
815
+ File.join(prefix,'parent')
816
+ )
817
+ doc.root.add('instance', :uuid => i, :url => url, :author => author, :path => path, :name => name, :state => state, :cpu => cpu, :mem => mem, :parent => parent)
818
+ end
819
+ Riddl::Parameter::Complex.new('tree','text/xml',doc.to_s)
820
+ end
821
+ end #}}}
822
+ class InstanceGet < Riddl::Implementation #{{{
823
+ def response
824
+ redis = @a[0]
825
+ engine = @p[0].value
826
+ uuid = @r[-1]
827
+ prefix = File.join(engine,uuid.to_s)
828
+ url, author, path, name, state, cpu, mem, parent = redis.mget(
829
+ File.join(prefix,'instance-url'),
830
+ File.join(prefix,'author'),
831
+ File.join(prefix,'path'),
832
+ File.join(prefix,'name'),
833
+ File.join(prefix,'state'),
834
+ File.join(prefix,'cpu'),
835
+ File.join(prefix,'mem'),
836
+ File.join(prefix,'parent')
837
+ )
838
+ Riddl::Parameter::Complex.new('instance','application/json',JSON.generate(:uuid => uuid, :url => url, :author => author, :path => path, :name => name, :state => state, :cpu => cpu, :mem => mem, :parent => parent))
839
+ end
840
+ end #}}}
841
+
842
+
619
843
  def self::implementation(opts)
620
- opts[:connections] = []
844
+ opts[:management_receivers] = []
845
+ opts[:stat_receivers] = []
846
+
847
+ ### set redis_cmd to nil if you want to do global
848
+ ### at least redis_path or redis_url and redis_db have to be set if you do global
849
+ opts[:redis_path] ||= 'redis.sock' # use e.g. /tmp/redis.sock for global stuff. Look it up in your redis config
850
+ opts[:redis_db] ||= 0
851
+ ### optional redis stuff
852
+ opts[:redis_url] ||= nil
853
+ 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'
854
+ opts[:redis_pid] ||= 'redis.pid' # use e.g. /var/run/redis.pid if you do global. Look it up in your redis config
855
+ opts[:redis_db_name] ||= 'redis.rdb' # use e.g. /var/lib/redis.rdb for global stuff. Look it up in your redis config
856
+
857
+ CPEE::redis_connect opts, 'Server Main'
621
858
 
622
859
  Proc.new do
623
- on resource do
860
+ interface 'events' do
861
+ run StatReceive, opts[:redis], opts[:stat_receivers] if post 'event'
862
+ end
863
+ interface 'implementation' do
624
864
  run GetList, :main, opts[:views], opts[:models] if get 'stage'
625
865
  run GetListFull, opts[:views], opts[:models] if get 'full'
626
866
  run GetStages, opts[:themes] if get 'stages'
627
- run Create, :main, :cre, opts[:views], opts[:connections], opts[:templates], opts[:models] if post 'item'
628
- run Create, :main, :dup, opts[:views], opts[:connections], opts[:templates], opts[:models] if post 'duplicate'
629
- run CreateDir, opts[:connections], opts[:models] if post 'dir'
630
- run Active, opts[:connections] if sse
867
+ run Create, :main, :cre, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'item'
868
+ run Create, :main, :dup, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'duplicate'
869
+ run CreateDir, opts[:management_receivers], opts[:models] if post 'dir'
870
+ run ManagementSend, opts[:management_receivers] if sse
631
871
  on resource '[a-zA-Z0-9öäüÖÄÜ _-]+\.dir' do
632
872
  run GetList, :sub, opts[:views], opts[:models] if get 'stage'
633
- run Create, :sub, :cre, opts[:views], opts[:connections], opts[:templates], opts[:models] if post 'item'
634
- run Create, :sub, :dup, opts[:views], opts[:connections], opts[:templates], opts[:models] if post 'duplicate'
635
- run DeleteDir, opts[:connections], opts[:models] if delete
636
- run RenameDir, opts[:connections], opts[:models] if put 'name'
873
+ run Create, :sub, :cre, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'item'
874
+ run Create, :sub, :dup, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'duplicate'
875
+ run DeleteDir, opts[:management_receivers], opts[:models] if delete
876
+ run RenameDir, opts[:management_receivers], opts[:models] if put 'name'
637
877
  on resource '[a-zA-Z0-9öäüÖÄÜ _-]+\.xml' do
638
- run DeleteItem, :sub, opts[:connections], opts[:models] if delete
878
+ run DeleteItem, :sub, opts[:management_receivers], opts[:models] if delete
639
879
  run GetItem, :sub, opts[:models] if get
640
- run PutItem, :sub, opts[:connections], opts[:models] if put 'content'
641
- run RenameItem, :sub, opts[:connections], opts[:models] if put 'name'
642
- run MoveItem, :sub, opts[:connections], opts[:models] if put 'dirname'
643
- run ShiftItem, :sub, opts[:connections], opts[:themes], opts[:models] if put 'newstage'
880
+ run PutItem, :sub, opts[:management_receivers], opts[:models] if put 'content'
881
+ run RenameItem, :sub, opts[:management_receivers], opts[:models] if put 'name'
882
+ run MoveItem, :sub, opts[:management_receivers], opts[:models] if put 'dirname'
883
+ run ShiftItem, :sub, opts[:management_receivers], opts[:themes], opts[:models] if put 'newstage'
644
884
  on resource 'open' do
645
885
  run OpenItem, :sub, opts[:instantiate], opts[:cockpit], opts[:views], false, opts[:models] if get 'stage'
646
886
  end
@@ -650,12 +890,12 @@ module CPEE
650
890
  end
651
891
  end
652
892
  on resource '[a-zA-Z0-9öäüÖÄÜ _-]+\.xml' do
653
- run DeleteItem, :main, opts[:connections], opts[:models] if delete
893
+ run DeleteItem, :main, opts[:management_receivers], opts[:models] if delete
654
894
  run GetItem, :main, opts[:models] if get
655
- run PutItem, :main, opts[:connections], opts[:models] if put 'content'
656
- run RenameItem, :main, opts[:connections], opts[:models] if put 'name'
657
- run MoveItem, :main, opts[:connections], opts[:models] if put 'dirname'
658
- run ShiftItem, :main, opts[:connections], opts[:themes], opts[:models] if put 'newstage'
895
+ run PutItem, :main, opts[:management_receivers], opts[:models] if put 'content'
896
+ run RenameItem, :main, opts[:management_receivers], opts[:models] if put 'name'
897
+ run MoveItem, :main, opts[:management_receivers], opts[:models] if put 'dirname'
898
+ run ShiftItem, :main, opts[:management_receivers], opts[:themes], opts[:models] if put 'newstage'
659
899
  on resource 'open' do
660
900
  run OpenItem, :main, opts[:instantiate], opts[:cockpit], opts[:views], false, opts[:models] if get 'stage'
661
901
  end
@@ -663,6 +903,26 @@ module CPEE
663
903
  run OpenItem, :main, opts[:instantiate], opts[:cockpit], opts[:views], true, opts[:models] if get 'stage'
664
904
  end
665
905
  end
906
+ on resource 'dash' do
907
+ on resource 'show' do
908
+ run ShowUrl, opts[:show] if get 'url'
909
+ end
910
+ on resource 'abandon' do
911
+ run AbandonUrl if put 'url'
912
+ end
913
+ on resource 'events' do
914
+ run StatSend, opts[:stat_receivers] if sse
915
+ end
916
+ on resource 'instances' do
917
+ run InstancesGet, opts[:redis] if get 'engine'
918
+ on resource do
919
+ run InstanceGet, opts[:redis] if get 'engine'
920
+ end
921
+ end
922
+ on resource 'stats' do
923
+ run StatGet, opts[:redis] if get 'engine'
924
+ end
925
+ end
666
926
  end
667
927
  end
668
928
  end
@@ -0,0 +1,133 @@
1
+ <description xmlns="http://riddl.org/ns/description/1.0" xmlns:ann="http://riddl.org/ns/annotation/1.0" xmlns:xi="http://www.w3.org/2001/XInclude" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
+ <message name="url">
3
+ <parameter name="url" type="string"/>
4
+ </message>
5
+ <message name="engine">
6
+ <parameter name="engine" type="string"/>
7
+ </message>
8
+ <message name="stats">
9
+ <parameter name="stats" mimetype="application/json"/>
10
+ </message>
11
+ <message name="tree">
12
+ <parameter name="tree" mimetype="text/xml"/>
13
+ </message>
14
+ <message name="instance">
15
+ <parameter name="instance" mimetype="application/json"/>
16
+ </message>
17
+ <message name="item">
18
+ <parameter name="stage" type="string">
19
+ <xi:include href="stages"/>
20
+ </parameter>
21
+ <parameter name="new" type="string">
22
+ <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
23
+ </parameter>
24
+ </message>
25
+ <message name="name">
26
+ <parameter name="new" type="string">
27
+ <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
28
+ </parameter>
29
+ </message>
30
+ <message name="dir">
31
+ <parameter name="dir" type="string">
32
+ <param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)|</param>
33
+ </parameter>
34
+ </message>
35
+ <message name="dirname">
36
+ <parameter name="dir" type="string">
37
+ <param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir|</param>
38
+ </parameter>
39
+ </message>
40
+ <message name="duplicate">
41
+ <parameter name="new" type="string">
42
+ <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
43
+ </parameter>
44
+ <parameter name="old" type="string">
45
+ <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+\.xml</param>
46
+ </parameter>
47
+ </message>
48
+ <message name="stages">
49
+ <parameter name="stages" type="string"/>
50
+ </message>
51
+ <message name="newstage">
52
+ <parameter name="stage" type="string">
53
+ <xi:include href="stages"/>
54
+ </parameter>
55
+ </message>
56
+ <message name="stage">
57
+ <optional>
58
+ <parameter name="stage" type="string">
59
+ <xi:include href="stages"/>
60
+ </parameter>
61
+ </optional>
62
+ </message>
63
+ <message name="full">
64
+ <parameter name="full" type="string"/>
65
+ <optional>
66
+ <parameter name="stage" type="string">
67
+ <xi:include href="stages"/>
68
+ </parameter>
69
+ </optional>
70
+ </message>
71
+ <message name="list">
72
+ <parameter name="list" mimetype="application/json"/>
73
+ </message>
74
+ <message name="content">
75
+ <parameter name="content" mimetype="application/xml"/>
76
+ </message>
77
+ <resource>
78
+ <post in="item"/>
79
+ <post in="dir"/>
80
+ <post in="duplicate"/>
81
+ <get in="stage" out="list"/>
82
+ <get in="full" out="list"/>
83
+ <get in="stages" out="list"/>
84
+ <sse/>
85
+ <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.dir">
86
+ <post in="item"/>
87
+ <post in="duplicate"/>
88
+ <get in="stage" out="list"/>
89
+ <delete/>
90
+ <put in="name"/> <!-- rename -->
91
+ <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.xml">
92
+ <get out='content'/>
93
+ <delete/>
94
+ <put in="content"/>
95
+ <put in="name"/> <!-- rename -->
96
+ <put in="dirname"/> <!-- move -->
97
+ <put in="newstage"/> <!-- shift -->
98
+ <resource relative="open"><get in="stage"/></resource>
99
+ <resource relative="open-new"><get in="stage"/></resource>
100
+ </resource>
101
+ </resource>
102
+ <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.xml">
103
+ <get out='content'/>
104
+ <delete/>
105
+ <put in="content"/>
106
+ <put in="name"/> <!-- rename -->
107
+ <put in="dirname"/> <!-- move -->
108
+ <put in="newstage"/> <!-- shift -->
109
+ <resource relative="open"><get in="stage"/></resource>
110
+ <resource relative="open-new"><get in="stage"/></resource>
111
+ </resource>
112
+ <resource relative="dash">
113
+ <resource relative="show">
114
+ <get in="url"/>
115
+ </resource>
116
+ <resource relative="abandon">
117
+ <put in="url"/>
118
+ </resource>
119
+ <resource relative="events">
120
+ <sse/>
121
+ </resource>
122
+ <resource relative="instances">
123
+ <get in="engine" out="tree"/>
124
+ <resource>
125
+ <get in="engine" out="instance"/>
126
+ </resource>
127
+ </resource>
128
+ <resource relative="stats">
129
+ <get in="engine" out="stats"/>
130
+ </resource>
131
+ </resource>
132
+ </resource>
133
+ </description>
@@ -1,98 +1,19 @@
1
- <description xmlns="http://riddl.org/ns/description/1.0" xmlns:ann="http://riddl.org/ns/annotation/1.0" xmlns:xi="http://www.w3.org/2001/XInclude" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
- <message name="item">
3
- <parameter name="stage" type="string">
4
- <xi:include href="stages"/>
5
- </parameter>
6
- <parameter name="new" type="string">
7
- <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
8
- </parameter>
9
- </message>
10
- <message name="name">
11
- <parameter name="new" type="string">
12
- <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
13
- </parameter>
14
- </message>
15
- <message name="dir">
16
- <parameter name="dir" type="string">
17
- <param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)|</param>
18
- </parameter>
19
- </message>
20
- <message name="dirname">
21
- <parameter name="dir" type="string">
22
- <param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir|</param>
23
- </parameter>
24
- </message>
25
- <message name="duplicate">
26
- <parameter name="new" type="string">
27
- <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+</param>
28
- </parameter>
29
- <parameter name="old" type="string">
30
- <param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+\.xml</param>
31
- </parameter>
32
- </message>
33
- <message name="stages">
34
- <parameter name="stages" type="string"/>
35
- </message>
36
- <message name="newstage">
37
- <parameter name="stage" type="string">
38
- <xi:include href="stages"/>
39
- </parameter>
40
- </message>
41
- <message name="stage">
42
- <optional>
43
- <parameter name="stage" type="string">
44
- <xi:include href="stages"/>
45
- </parameter>
46
- </optional>
47
- </message>
48
- <message name="full">
49
- <parameter name="full" type="string"/>
50
- <optional>
51
- <parameter name="stage" type="string">
52
- <xi:include href="stages"/>
53
- </parameter>
54
- </optional>
55
- </message>
56
- <message name="list">
57
- <parameter name="list" mimetype="application/json"/>
58
- </message>
59
- <message name="content">
60
- <parameter name="content" mimetype="application/xml"/>
61
- </message>
62
- <resource>
63
- <post in="item"/>
64
- <post in="dir"/>
65
- <post in="duplicate"/>
66
- <get in="stage" out="list"/>
67
- <get in="full" out="list"/>
68
- <get in="stages" out="list"/>
69
- <sse/>
70
- <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.dir">
71
- <post in="item"/>
72
- <post in="duplicate"/>
73
- <get in="stage" out="list"/>
74
- <delete/>
75
- <put in="name"/> <!-- rename -->
76
- <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.xml">
77
- <get out='content'/>
78
- <delete/>
79
- <put in="content"/>
80
- <put in="name"/> <!-- rename -->
81
- <put in="dirname"/> <!-- move -->
82
- <put in="newstage"/> <!-- shift -->
83
- <resource relative="open"><get in="stage"/></resource>
84
- <resource relative="open-new"><get in="stage"/></resource>
85
- </resource>
86
- </resource>
87
- <resource relative="[a-zA-Z0-9&#xF6;&#xE4;&#xFC;&#xD6;&#xC4;&#xDC; _-]+\.xml">
88
- <get out='content'/>
89
- <delete/>
90
- <put in="content"/>
91
- <put in="name"/> <!-- rename -->
92
- <put in="dirname"/> <!-- move -->
93
- <put in="newstage"/> <!-- shift -->
94
- <resource relative="open"><get in="stage"/></resource>
95
- <resource relative="open-new"><get in="stage"/></resource>
96
- </resource>
97
- </resource>
98
- </description>
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
+ <interface name="events">
6
+ <xi:include href="http://www.riddl.org/ns/common-patterns/notifications-consumer/2.0/consumer.xml"/>
7
+ </interface>
8
+
9
+ <facade>
10
+ <tile>
11
+ <layer name="implementation">
12
+ <apply-to>/</apply-to>
13
+ </layer>
14
+ <layer name="events">
15
+ <apply-to>/dash/events</apply-to>
16
+ </layer>
17
+ </tile>
18
+ </facade>
19
+ </declaration>
data/server/moma.conf CHANGED
@@ -2,6 +2,7 @@
2
2
  :models: models
3
3
  :location: https://cpee.org/design/server/
4
4
  :instantiate: https://cpee.org/flow/start/
5
+ :show: https://cpee.org/flow/index.html?monitor=
5
6
  :cockpit:
6
7
  draft: https://cpee.org/flow/model.html?monitor=
7
8
  development: https://cpee.org/flow/edit.html?monitor=