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 +4 -4
- data/cpee-model-management.gemspec +1 -1
- data/lib/cpee-model-management/implementation.rb +282 -22
- data/lib/cpee-model-management/implementation.xml +133 -0
- data/lib/cpee-model-management/moma.xml +19 -98
- data/server/moma.conf +1 -0
- data/tools/cpee-moma +60 -1
- data/ui/css/design.css +5 -0
- data/ui/css/stats.css +55 -0
- data/ui/css/stats_standalone.css +7 -0
- data/ui/index.html +68 -10
- data/ui/instances.html +89 -0
- data/ui/instances_view.html +89 -0
- data/ui/js/design.js +5 -5
- data/ui/js/stats.js +227 -0
- data/ui/resources.html +96 -0
- metadata +10 -4
- data/ui/design.js +0 -239
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fc783f8350eac7d65fbda35f275d4ea319878f2265e5d3e02eaf234eb0d4fd1
|
4
|
+
data.tar.gz: c16ceedc6068a9d0114ddc5456625f55a8a7072770d2e3af28479198a988282c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12fe97b8aa17301c3863fb983d0527efae7aacecfb313d5963a0a0d19aa30d73c00ff2b85275a1a0d50a48010d4185df3ff7fd9c4eae15c467ee230b8cc35154
|
7
|
+
data.tar.gz: 3a657a24d96ebde89e77378f35aed645e3548148c5c33ba28b064362030c5f9b35394e7704cf64b818d5d85b083ab0da84790575f1e8e601d25ae2e6ed0967d2
|
@@ -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 =
|
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
|
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[:
|
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
|
-
|
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[:
|
628
|
-
run Create, :main, :dup, opts[:views], opts[:
|
629
|
-
run CreateDir, opts[:
|
630
|
-
run
|
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[:
|
634
|
-
run Create, :sub, :dup, opts[:views], opts[:
|
635
|
-
run DeleteDir, opts[:
|
636
|
-
run RenameDir, opts[:
|
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[:
|
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[:
|
641
|
-
run RenameItem, :sub, opts[:
|
642
|
-
run MoveItem, :sub, opts[:
|
643
|
-
run ShiftItem, :sub, opts[:
|
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[:
|
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[:
|
656
|
-
run RenameItem, :main, opts[:
|
657
|
-
run MoveItem, :main, opts[:
|
658
|
-
run ShiftItem, :main, opts[:
|
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öäüÖÄÜ _-]+\.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öäüÖÄÜ _-]+\.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öäüÖÄÜ _-]+\.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
|
-
<
|
2
|
-
<
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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öäüÖÄÜ _-]+\.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öäüÖÄÜ _-]+\.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öäüÖÄÜ _-]+\.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=
|