cpee-model-management 1.0.17 → 1.1.1

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