omf_sfa 0.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.
Files changed (152) hide show
  1. data/.gitignore +24 -0
  2. data/Gemfile +6 -0
  3. data/README.md +211 -0
  4. data/Rakefile +23 -0
  5. data/bin/parse_rspec.rb +167 -0
  6. data/etc/omf-sfa/omf-sfa-am.yaml +12 -0
  7. data/examples/exogeni5nodemanifest.rspec +105 -0
  8. data/examples/instageni5nodemanifest.rspec +150 -0
  9. data/lib/omf-sfa/am/am-rest/REST_API.md +301 -0
  10. data/lib/omf-sfa/am/am-rest/account_handler.rb +145 -0
  11. data/lib/omf-sfa/am/am-rest/am_rest_server.rb +255 -0
  12. data/lib/omf-sfa/am/am-rest/api_template.html +48 -0
  13. data/lib/omf-sfa/am/am-rest/config.ru +110 -0
  14. data/lib/omf-sfa/am/am-rest/resource_handler.rb +178 -0
  15. data/lib/omf-sfa/am/am-rest/rest_handler.rb +573 -0
  16. data/lib/omf-sfa/am/am-rest/session_authenticator.rb +130 -0
  17. data/lib/omf-sfa/am/am-rpc/abstract_rpc_service.rb +60 -0
  18. data/lib/omf-sfa/am/am-rpc/am_authorizer.rb +161 -0
  19. data/lib/omf-sfa/am/am-rpc/am_rpc_api.rb +450 -0
  20. data/lib/omf-sfa/am/am-rpc/am_rpc_service.rb +402 -0
  21. data/lib/omf-sfa/am/am_liaison.rb +93 -0
  22. data/lib/omf-sfa/am/am_manager.rb +859 -0
  23. data/lib/omf-sfa/am/am_runner.rb +108 -0
  24. data/lib/omf-sfa/am/am_scheduler.rb +146 -0
  25. data/lib/omf-sfa/am/am_server.rb +194 -0
  26. data/lib/omf-sfa/am/config.ru +122 -0
  27. data/lib/omf-sfa/am/credential.rb +145 -0
  28. data/lib/omf-sfa/am/default_authorizer.rb +44 -0
  29. data/lib/omf-sfa/am/privilege_credential.rb +76 -0
  30. data/lib/omf-sfa/am/signature.rb +37 -0
  31. data/lib/omf-sfa/am/user_credential.rb +56 -0
  32. data/lib/omf-sfa/am.rb +7 -0
  33. data/lib/omf-sfa/model/abstract_prop_description.rb +87 -0
  34. data/lib/omf-sfa/model/model_class_description.rb +145 -0
  35. data/lib/omf-sfa/model/model_data_prop_description.rb +28 -0
  36. data/lib/omf-sfa/model/model_obj_prop_description.rb +49 -0
  37. data/lib/omf-sfa/model/ontology.rb +169 -0
  38. data/lib/omf-sfa/resource/README.md +24 -0
  39. data/lib/omf-sfa/resource/channel.rb +49 -0
  40. data/lib/omf-sfa/resource/comp_group.rb +41 -0
  41. data/lib/omf-sfa/resource/component_lease.rb +10 -0
  42. data/lib/omf-sfa/resource/constants.rb +24 -0
  43. data/lib/omf-sfa/resource/group_component.rb +35 -0
  44. data/lib/omf-sfa/resource/group_membership.rb +17 -0
  45. data/lib/omf-sfa/resource/gurn.rb +187 -0
  46. data/lib/omf-sfa/resource/interface.rb +78 -0
  47. data/lib/omf-sfa/resource/ip.rb +48 -0
  48. data/lib/omf-sfa/resource/link.rb +29 -0
  49. data/lib/omf-sfa/resource/node.rb +75 -0
  50. data/lib/omf-sfa/resource/oaccount.rb +94 -0
  51. data/lib/omf-sfa/resource/ocomponent.rb +134 -0
  52. data/lib/omf-sfa/resource/ogroup.rb +106 -0
  53. data/lib/omf-sfa/resource/olease.rb +61 -0
  54. data/lib/omf-sfa/resource/oproperty.rb +178 -0
  55. data/lib/omf-sfa/resource/oreference.rb +15 -0
  56. data/lib/omf-sfa/resource/oresource.rb +491 -0
  57. data/lib/omf-sfa/resource/project.rb +28 -0
  58. data/lib/omf-sfa/resource/project_membership.rb +13 -0
  59. data/lib/omf-sfa/resource/sfa_base.rb +544 -0
  60. data/lib/omf-sfa/resource/user.rb +25 -0
  61. data/lib/omf-sfa/resource.rb +20 -0
  62. data/lib/omf-sfa/util/create_sample_testbed.rb +68 -0
  63. data/lib/omf-sfa/util/load_from_sfa_xml.rb +65 -0
  64. data/lib/omf-sfa/version.rb +4 -0
  65. data/lib/omf_sfa.rb +5 -0
  66. data/omf_sfa.gemspec +46 -0
  67. data/owl/README +3 -0
  68. data/owl/ben-6509.rdf +1377 -0
  69. data/owl/ben-dell.rdf +586 -0
  70. data/owl/ben-dtn.rdf +1698 -0
  71. data/owl/ben.rdf +1335 -0
  72. data/owl/collections.owl +309 -0
  73. data/owl/compute.owl +1486 -0
  74. data/owl/domain.owl +444 -0
  75. data/owl/dtn.owl +1165 -0
  76. data/owl/ec2.owl +385 -0
  77. data/owl/ethernet.owl +466 -0
  78. data/owl/eucalyptus.owl +431 -0
  79. data/owl/id-mp-Request1.rdf +247 -0
  80. data/owl/itu-grid.owl +147 -0
  81. data/owl/kansei.owl +511 -0
  82. data/owl/layer.owl +645 -0
  83. data/owl/location.owl +117 -0
  84. data/owl/mass.rdf +608 -0
  85. data/owl/nlr.rdf +901 -0
  86. data/owl/orca.owl +181 -0
  87. data/owl/planetlab.owl +124 -0
  88. data/owl/protogeni.owl +467 -0
  89. data/owl/request-6509-2.rdf +150 -0
  90. data/owl/request-6509-3.rdf +158 -0
  91. data/owl/request-6509.rdf +199 -0
  92. data/owl/request.owl +222 -0
  93. data/owl/storage.owl +511 -0
  94. data/owl/topology.owl +608 -0
  95. data/schema/rspec-v3/ad-common.xsd +269 -0
  96. data/schema/rspec-v3/ad-reservation.rnc +12 -0
  97. data/schema/rspec-v3/ad-reservation.rng +28 -0
  98. data/schema/rspec-v3/ad-reservation.xsd +13 -0
  99. data/schema/rspec-v3/ad.rnc +151 -0
  100. data/schema/rspec-v3/ad.xsd +77 -0
  101. data/schema/rspec-v3/any-extension-schema.xsd +38 -0
  102. data/schema/rspec-v3/any-extension.rnc +30 -0
  103. data/schema/rspec-v3/common.rnc +185 -0
  104. data/schema/rspec-v3/manifest-common.xsd +244 -0
  105. data/schema/rspec-v3/manifest-request.xsd +95 -0
  106. data/schema/rspec-v3/manifest.rnc +62 -0
  107. data/schema/rspec-v3/manifest.xsd +34 -0
  108. data/schema/rspec-v3/request-common.xsd +219 -0
  109. data/schema/rspec-v3/request-reservation.rnc +12 -0
  110. data/schema/rspec-v3/request-reservation.xsd +13 -0
  111. data/schema/rspec-v3/request.rnc +118 -0
  112. data/schema/rspec-v3/request.xsd +94 -0
  113. data/share/assets/css/default.css +147 -0
  114. data/share/assets/css/rest_api.css +0 -0
  115. data/share/assets/network.html +28 -0
  116. data/share/assets/network.js +82 -0
  117. data/spec/am/am-rest/common.rb +29 -0
  118. data/spec/am/am-rest/resource_group_handler_XspecX.rb +97 -0
  119. data/spec/am/am-rest/resource_handler_spec.rb +204 -0
  120. data/spec/am/am-rpc/sfa_methods_spec.rb +150 -0
  121. data/spec/am/am_manager_spec.rb +307 -0
  122. data/spec/am/am_scheduler_spec.rb +57 -0
  123. data/spec/am/common.rb +24 -0
  124. data/spec/resource/common.rb +31 -0
  125. data/spec/resource/node_spec.rb +171 -0
  126. data/spec/resource/oaccount_spec.rb +92 -0
  127. data/spec/resource/ocomponent_spec.rb +225 -0
  128. data/spec/resource/ogroup_spec.rb +93 -0
  129. data/spec/resource/oresource_spec.rb +208 -0
  130. data/spec/resource_and_leases_spec.rb +377 -0
  131. data/test/OLD_FILES/assertion1.xml +117 -0
  132. data/test/OLD_FILES/greeter_spec.rb +15 -0
  133. data/test/OLD_FILES/mongo_test.rb +45 -0
  134. data/test/OLD_FILES/req-sfa-2.xml +6 -0
  135. data/test/OLD_FILES/req-sfa-g.xml +8 -0
  136. data/test/OLD_FILES/req-sfa-g2.xml +10 -0
  137. data/test/OLD_FILES/req-sfa-g3.xml +14 -0
  138. data/test/OLD_FILES/req-sfa.xml +6 -0
  139. data/test/OLD_FILES/req1.xml +22 -0
  140. data/test/OLD_FILES/req1b.xml +15 -0
  141. data/test/OLD_FILES/rspec-test.xml +1867 -0
  142. data/test/OLD_FILES/test.rb +67 -0
  143. data/test/OLD_FILES/test2.rb +32 -0
  144. data/test/am/am_manager_rspec_tests.rb +378 -0
  145. data/test/am/am_manager_tests.rb +518 -0
  146. data/test/am/am_scheduler_tests.rb +173 -0
  147. data/test/resource/olease_test.rb +74 -0
  148. data/test/sfa_requests/request.xml +5 -0
  149. data/test/sfa_requests/request1.xml +5 -0
  150. data/test/sfa_requests/request2.xml +5 -0
  151. data/test/sfa_requests/request3.xml +5 -0
  152. metadata +601 -0
@@ -0,0 +1,255 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+
4
+ require 'rack'
5
+ require 'rack/showexceptions'
6
+ require 'thin'
7
+ require 'data_mapper'
8
+ require 'omf_base/lobject'
9
+ require 'omf_base/load_yaml'
10
+
11
+ require 'omf-sfa/am/am_runner'
12
+ #require 'omf-sfa/am/am_manager'
13
+ #require 'omf-sfa/am/am_scheduler'
14
+
15
+ require 'omf_base/lobject'
16
+
17
+ module OMF::SFA::AM::Rest
18
+
19
+ class Server
20
+ # Don't use LObject as we haveb't initialized the logging system yet. Happens in 'init_logger'
21
+ include OMF::Base::Loggable
22
+ extend OMF::Base::Loggable
23
+
24
+ def init_logger
25
+ OMF::Base::Loggable.init_log 'server', :searchPath => File.join(File.dirname(__FILE__), 'server')
26
+
27
+ #@config = OMF::Base::YAML.load('config', :path => [File.dirname(__FILE__) + '/../../../etc/gimi-exp-service'])[:gimi_exp_service]
28
+ end
29
+
30
+ def init_data_mapper(options)
31
+ #@logger = OMF::Base::Loggable::_logger('am_server')
32
+ #OMF::Base::Loggable.debug "options: #{options}"
33
+ debug "options: #{options}"
34
+
35
+ # Configure the data store
36
+ #
37
+ DataMapper::Logger.new(options[:dm_log] || $stdout, :info)
38
+ #DataMapper::Logger.new($stdout, :info)
39
+
40
+ #DataMapper.setup(:default, config[:data_mapper] || {:adapter => 'yaml', :path => '/tmp/am_test2'})
41
+ DataMapper.setup(:default, options[:dm_db])
42
+
43
+ require 'omf-sfa/resource'
44
+ DataMapper::Model.raise_on_save_failure = true
45
+ DataMapper.finalize
46
+
47
+ # require 'dm-migrations'
48
+ # DataMapper.auto_migrate!
49
+
50
+ DataMapper.auto_upgrade! if options[:dm_auto_upgrade]
51
+ end
52
+
53
+
54
+ def load_test_state(options)
55
+ require 'omf-sfa/am/am-rest/rest_handler'
56
+ OMF::SFA::AM::Rest::RestHandler.set_service_name("OMF Test AM")
57
+
58
+ require 'dm-migrations'
59
+ DataMapper.auto_migrate!
60
+
61
+ am = nil
62
+
63
+ require 'omf-sfa/resource/oaccount'
64
+ #account = am.find_or_create_account(:name => 'foo')
65
+ account = OMF::SFA::Resource::OAccount.create(:name => 'system')
66
+ slice1 = OMF::SFA::Resource::OAccount.create(
67
+ :name => 'slice1',
68
+ :uuid => UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, 'slice1')
69
+ )
70
+
71
+ require 'omf-sfa/resource/node'
72
+ nodes = []
73
+ 3.times do |i|
74
+ name = "n#{i}"
75
+ uuid = UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, name)
76
+ nodes << (n = OMF::SFA::Resource::Node.create(:name => name, :uuid => uuid, :account => slice1))
77
+ am.manage_resource(n) if am
78
+ n.save
79
+ #puts ">>>> #{n.inspect}"
80
+ end
81
+ end
82
+
83
+ def run(opts)
84
+ opts[:handlers] = {
85
+ # Should be done in a better way
86
+ :pre_rackup => lambda {
87
+ },
88
+ :pre_parse => lambda do |p, options|
89
+ p.on("--test-load-am", "Load an initial state for testing") do |n| options[:load_test_state] = true end
90
+ p.separator ""
91
+ p.separator "Datamapper options:"
92
+ p.on("--dm-db URL", "Datamapper database [#{options[:dm_db]}]") do |u| options[:dm_db] = u end
93
+ p.on("--dm-log FILE", "Datamapper log file [#{options[:dm_log]}]") do |n| options[:dm_log] = n end
94
+ p.on("--dm-auto-upgrade", "Run Datamapper's auto upgrade") do |n| options[:dm_auto_upgrade] = true end
95
+ p.separator ""
96
+ end,
97
+ :pre_run => lambda do |opts|
98
+ init_logger()
99
+ init_data_mapper(opts)
100
+ load_test_state(opts) if opts[:load_test_state]
101
+ end
102
+ }
103
+
104
+
105
+ #Thin::Logging.debug = true
106
+ require 'omf_base/thin/runner'
107
+ OMF::Base::Thin::Runner.new(ARGV, opts).run!
108
+ end
109
+ end # class
110
+ end # module
111
+
112
+ if __FILE__ == $0
113
+ opts = {
114
+ :app_name => 'am_rest_server',
115
+ :port => 8004,
116
+ # :am => {
117
+ # :manager => lambda { OMF::SFA::AM::AMManager.new(OMF::SFA::AM::AMScheduler.new) }
118
+ # },
119
+ :ssl => {
120
+ :cert_file => File.expand_path("~/.gcf/am-cert.pem"),
121
+ :key_file => File.expand_path("~/.gcf/am-key.pem"),
122
+ :verify_peer => true
123
+ #:verify_peer => false
124
+ },
125
+ #:log => '/tmp/am_server.log',
126
+ :dm_db => 'sqlite:///tmp/am_test.db',
127
+ :dm_log => '/tmp/am_test-dm.log',
128
+ :rackup => File.dirname(__FILE__) + '/config.ru',
129
+
130
+ }
131
+ OMF::SFA::AM::Rest::Server.new.run(opts)
132
+
133
+ end
134
+
135
+ ######################
136
+
137
+ # require 'rubygems'
138
+ # require 'rack'
139
+ # require 'rack/showexceptions'
140
+ # require 'thin'
141
+ # require 'data_mapper'
142
+ # require 'omf_base/lobject'
143
+ # require 'omf_base/load_yaml'
144
+ # require 'uuidtools'
145
+ # require 'omf-sfa/am/am_manager'
146
+ #
147
+ # OMF::Base::Loggable.init_log 'am_server'
148
+ # config = OMF::Base::YAML.load('omf-sfa-am', :path => [File.dirname(__FILE__) + '/../../../../etc/omf-sfa'])[:omf_sfa_am]
149
+ #
150
+ # class MyRunner < Thin::Runner
151
+ # @@instance = nil
152
+ #
153
+ # def self.instance
154
+ # @@instance
155
+ # end
156
+ #
157
+ # def initialize(argv, opts = {})
158
+ # raise "SINGLETON" if @@instance
159
+ #
160
+ # @argv = argv
161
+ #
162
+ # # Default options values
163
+ # @options = {
164
+ # :chdir => Dir.pwd,
165
+ # :environment => 'development',
166
+ # :address => '0.0.0.0',
167
+ # :port => Thin::Server::DEFAULT_PORT,
168
+ # :timeout => Thin::Server::DEFAULT_TIMEOUT,
169
+ # :log => 'log/thin.log',
170
+ # :pid => 'tmp/pids/thin.pid',
171
+ # :max_conns => Thin::Server::DEFAULT_MAXIMUM_CONNECTIONS,
172
+ # :max_persistent_conns => Thin::Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS,
173
+ # :require => [],
174
+ # :wait => Thin::Controllers::Cluster::DEFAULT_WAIT_TIME
175
+ # }.merge(opts)
176
+ #
177
+ # p = parser
178
+ # p.separator ""
179
+ # p.separator "Datamapper options:"
180
+ # p.on("--dm-db URL", "Datamapper database [#{@options[:dm_db]}]") do |u| @options[:dm_db] = u end
181
+ # p.on("--dm-log FILE", "Datamapper log file [#{@options[:dm_log]}]") do |n| @options[:dm_log] = n end
182
+ # p.on("--dm-auto-upgrade", "Run Datamapper's auto upgrade") do |n| @options[:dm_auto_upgrade] = true end
183
+ # p.separator ""
184
+ # p.separator "Testing options:"
185
+ # p.on("--test-load-am", "Load an AM configuration for testing") do |n| @options[:load_test_am] = true end
186
+ # p.separator ""
187
+ # p.separator "Common options:"
188
+ #
189
+ # parse!
190
+ # @@instance = self
191
+ # end
192
+ #
193
+ # def init_data_mapper
194
+ #
195
+ # # Configure the data store
196
+ # #
197
+ # DataMapper::Logger.new(@options[:dm_log] || $stdout, :debug)
198
+ #
199
+ # #DataMapper.setup(:default, config[:data_mapper] || {:adapter => 'yaml', :path => '/tmp/am_test2'})
200
+ # dm = DataMapper.setup(:default, @options[:dm_db])
201
+ # DataMapper::Model.raise_on_save_failure = true
202
+ #
203
+ # require 'omf-sfa/resource'
204
+ # DataMapper.finalize
205
+ #
206
+ # DataMapper.auto_upgrade! if @options[:dm_auto_upgrade]
207
+ #
208
+ # load_test_am if @options[:load_test_am]
209
+ # end
210
+ # end
211
+ #
212
+ # def load_test_am
213
+ # require 'dm-migrations'
214
+ # DataMapper.auto_migrate!
215
+ #
216
+ # am = @options[:am_mgr]
217
+ #
218
+ # require 'omf-sfa/resource/oaccount'
219
+ # account = am.find_or_create_account(:name => 'foo')
220
+ #
221
+ # require 'omf-sfa/resource/node'
222
+ # nodes = []
223
+ # 3.times do |i|
224
+ # name = "n#{i}"
225
+ # uuid = UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, name)
226
+ # nodes << (n = OMF::SFA::Resource::Node.create(:name => name, :uuid => uuid))
227
+ # am.manage_resource(n) if am
228
+ # end
229
+ # # am.find_resource 'n1', :requester_account => account
230
+ #
231
+ # end
232
+ #
233
+ # # Configure the web server
234
+ # #
235
+ # opts = {
236
+ # :port => 8001,
237
+ # :am => {
238
+ # #:manager => OMF::SFA::AM::AMManager.new
239
+ # },
240
+ # :sslX => {
241
+ # :cert_chain_file => File.expand_path("~/.gcf/am-cert.pem"),
242
+ # :private_key_file => File.expand_path("~/.gcf/am-key.pem"),
243
+ # #:verify_peer => true
244
+ # :verify_peer => true
245
+ # },
246
+ # :log => '/tmp/am_server.log',
247
+ # :dm_db => 'sqlite::memory:', # 'sqlite:///tmp/am_test.db',
248
+ # :dm_log => '/tmp/am_server-dm.log',
249
+ # :rackup => File.dirname(__FILE__) + '/config.ru'
250
+ #
251
+ # }
252
+ #
253
+ #
254
+ # Thin::Logging.debug = true
255
+ # MyRunner.new(ARGV, opts).run!
@@ -0,0 +1,48 @@
1
+ <html>
2
+ <head>
3
+ <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
4
+ <link href="http://netdna.bootstrapcdn.com/bootswatch/2.3.2/journal/bootstrap.min.css" rel="stylesheet">
5
+ <style>
6
+ body {
7
+ padding-top: 80px; /* 60px to make the container go all the way to the bottom of the topbar */
8
+ font-size: 16px;
9
+ }
10
+ a, a:hover, a:focus {
11
+ color: blue;
12
+ }
13
+ span.key {
14
+ font-weight: bold;
15
+ }
16
+ span.empty {
17
+ font-style: italic;
18
+ }
19
+
20
+ h2 {
21
+ margin-bottom: 30px;
22
+ }
23
+ li {
24
+ line-height: 140%;
25
+ }
26
+ </style>
27
+ <link href="/assets/css/rest_api.css" rel="stylesheet">
28
+ </head>
29
+ <body>
30
+ <div class="navbar navbar-inverse navbar-fixed-top">
31
+ <div class="navbar-inner">
32
+ <div class="container">
33
+ <a class="brand" href="/">##TITLE##</a>
34
+ </div>
35
+ </div>
36
+ </div>
37
+
38
+ <div class="container">
39
+ <h2>##SERVICE##</h2>
40
+
41
+ ##CONTENT##
42
+
43
+ <!--##FOOTER##-->
44
+ </div>
45
+
46
+ <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
47
+ </body>
48
+ </html>
@@ -0,0 +1,110 @@
1
+
2
+ REQUIRE_LOGIN = false
3
+
4
+ #MyRunner.instance.init_data_mapper
5
+
6
+ require 'rack/file'
7
+ class MyFile < Rack::File
8
+ def call(env)
9
+ c, h, b = super
10
+ #h['Access-Control-Allow-Origin'] = '*'
11
+ [c, h, b]
12
+ end
13
+ end
14
+
15
+ opts = OMF::Base::Thin::Runner.instance.options
16
+
17
+ require 'omf-sfa/am/am-rest/session_authenticator'
18
+ use OMF::SFA::AM::Rest::SessionAuthenticator, #:expire_after => 10,
19
+ :login_url => (REQUIRE_LOGIN ? '/login' : nil),
20
+ :no_session => ['^/$', '^/login', '^/logout', '^/readme', '^/assets']
21
+
22
+ #use ::Rack::Lint
23
+
24
+ require 'omf-sfa/resource/oresource'
25
+ OMF::SFA::Resource::OResource.href_resolver do |res, o|
26
+ unless @http_prefix ||=
27
+ @http_prefix = "http://#{Thread.current[:http_host]}"
28
+ end
29
+ case res.resource_type.to_sym
30
+ when :account
31
+ "#@http_prefix/accounts/#{res.uuid}"
32
+ else
33
+ "#@http_prefix/resources/#{res.uuid}"
34
+ end
35
+ end
36
+
37
+ map '/accounts' do
38
+ require 'omf-sfa/am/am-rest/account_handler'
39
+ run OMF::SFA::AM::Rest::AccountHandler.new(opts)
40
+ end
41
+
42
+ map '/slices' do
43
+ require 'omf-sfa/am/am-rest/account_handler'
44
+ run opts[:account_handler]
45
+ end
46
+
47
+ map "/resources" do
48
+ require 'omf-sfa/am/am-rest/resource_handler'
49
+ #account = opts[:am_mgr].get_default_account()
50
+ run OMF::SFA::AM::Rest::ResourceHandler.new(opts)
51
+ end
52
+
53
+ map "/readme" do
54
+ require 'bluecloth'
55
+ s = File::read(File.dirname(__FILE__) + '/REST_API.md')
56
+ frag = BlueCloth.new(s).to_html
57
+ wrapper = %{
58
+ <html>
59
+ <head>
60
+ <title>AM REST API</title>
61
+ <link href="/assets/css/default.css" media="screen" rel="stylesheet" type="text/css">
62
+ <style type="text/css">
63
+ circle.node {
64
+ stroke: #fff;
65
+ stroke-width: 1.5px;
66
+ }
67
+
68
+ line.link {
69
+ stroke: #999;
70
+ stroke-opacity: .6;
71
+ stroke-width: 2px;
72
+
73
+ }
74
+ </style>
75
+ </head>
76
+ <body>
77
+ %s
78
+ </body>
79
+ </html>
80
+ }
81
+ p = lambda do |env|
82
+ return [200, {"Content-Type" => "text/html"}, wrapper % frag]
83
+ end
84
+ run p
85
+ end
86
+
87
+ map '/assets' do
88
+ run MyFile.new(File.dirname(__FILE__) + '/../../../../share/assets')
89
+ end
90
+
91
+ map "/" do
92
+ handler = Proc.new do |env|
93
+ req = ::Rack::Request.new(env)
94
+ case req.path_info
95
+ when '/'
96
+ http_prefix = "http://#{env["HTTP_HOST"]}"
97
+ toc = {}
98
+ ['README', :slices, :resources, :accounts].each do |s|
99
+ toc[s] = "#{http_prefix}/#{s.to_s.downcase}"
100
+ end
101
+ [200 ,{'Content-Type' => 'text/html'}, OMF::SFA::AM::Rest::RestHandler.convert_to_html(toc, env)]
102
+ when '/favicon.ico'
103
+ [301, {'Location' => '/assets/image/favicon.ico', "Content-Type" => ""}, ['Next window!']]
104
+ else
105
+ OMF::Base::Loggable.logger('rack').warn "Can't handle request '#{req.path_info}'"
106
+ [401, {"Content-Type" => ""}, "Sorry!"]
107
+ end
108
+ end
109
+ run handler
110
+ end
@@ -0,0 +1,178 @@
1
+
2
+ require 'omf-sfa/am/am-rest/rest_handler'
3
+
4
+ module OMF::SFA::AM::Rest
5
+
6
+ # Handles an individual resource
7
+ #
8
+ class ResourceHandler < RestHandler
9
+
10
+ def initialize(opts = {})
11
+ super
12
+ @resource_class = OMF::SFA::Resource::OComponent
13
+ # Define handlers
14
+ opts[:resource_handler] = self
15
+ # @coll_handlers = {
16
+ # projects: (opts[:project_handler] || ProjectHandler.new(opts))
17
+ # }
18
+ end
19
+ # SUPPORTING FUNCTIONS
20
+
21
+ def show_resource_list(opts)
22
+ authenticator = Thread.current["authenticator"]
23
+ prefix = about = opts[:req].path
24
+ # if project = opts[:context]
25
+ # users = project.users
26
+ # else
27
+ resources = OMF::SFA::Resource::OComponent.all()
28
+ # end
29
+ show_resources(resources, :resources, opts)
30
+ end
31
+
32
+ # def remove_resource_from_context(user, context)
33
+ # debug "REMOVE #{user} from #{context}"
34
+ # context.users.delete(user)
35
+ # context.save
36
+ # end
37
+ #
38
+ # def add_resource_to_context(user, context)
39
+ # debug "ADD #{user} to #{context}"
40
+ # context.users << user
41
+ # context.save
42
+ # end
43
+
44
+ # # Return the handler responsible for requests to +path+.
45
+ # # The default is 'self', but override if someone else
46
+ # # should take care of it
47
+ # #
48
+ # def find_handler(path, opts)
49
+ # #opts[:account] = @am_manager.get_default_account
50
+ # opts[:resource_uri] = path.join('/')
51
+ # debug "find_handler: path: '#{path}' opts: '#{opts.inspect}'"
52
+ # self
53
+ # end
54
+ #
55
+ #
56
+ # def on_get(resource_uri, opts)
57
+ # authenticator = Thread.current["authenticator"]
58
+ # unless resource_uri.empty?
59
+ # opts[:path] = opts[:req].path.split('/')[0 .. -2].join('/')
60
+ # resource = @am_manager.find_resource(resource_uri, authenticator)
61
+ # else
62
+ # resource = @am_manager.find_all_resources_for_account(opts[:account], authenticator)
63
+ # end
64
+ # show_resource(resource, opts)
65
+ # end
66
+ #
67
+ # def on_put(resource_uri, opts)
68
+ # resource = update_resource(resource_uri, true, opts)
69
+ # show_resource(resource, opts)
70
+ # end
71
+ #
72
+ # def on_post(resource_uri, opts)
73
+ # resource = update_resource(resource_uri, false, opts)
74
+ # show_resource(resource, opts)
75
+ # end
76
+ #
77
+ # def on_delete(resource_uri, opts)
78
+ # delete_resource(resource_uri, opts)
79
+ # show_resource(nil, opts)
80
+ # end
81
+ #
82
+ #
83
+ # # Update resource(s) referred to by +resource_uri+. If +clean_state+ is
84
+ # # true, reset any other state to it's default.
85
+ # #
86
+ # def update_resource(resource_uri, clean_state, opts)
87
+ # body, format = parse_body(opts)
88
+ # case format
89
+ # # when :empty
90
+ # # # do nothing
91
+ # when :xml
92
+ # puts ">>>>> #{body.inspect}"
93
+ # resource = @am_manager.update_resources_from_xml(body.root, clean_state, opts)
94
+ # else
95
+ # raise UnsupportedBodyFormatException.new(format)
96
+ # end
97
+ # resource
98
+ # end
99
+ #
100
+ #
101
+ # # This methods deletes components, or more broadly defined, removes them
102
+ # # from a slice.
103
+ # #
104
+ # # Currently, we simply transfer components to the +default_sliver+
105
+ # #
106
+ # def delete_resource(resource_uri, opts)
107
+ # @am_manager.delete_resource(resource_uri, opts)
108
+ # end
109
+ #
110
+ # # Update the state of +component+ according to inforamtion
111
+ # # in the http +req+.
112
+ # #
113
+ # #
114
+ # def update_component_xml(component, modifier_el, opts)
115
+ # end
116
+ #
117
+ # # Return the state of +component+
118
+ # #
119
+ # # +component+ - Component to display information about. !!! Can be nil - show only envelope
120
+ # #
121
+ # def show_resource(resource, opts)
122
+ # unless about = opts[:req].path
123
+ # throw "Missing 'path' declaration in request"
124
+ # end
125
+ # path = opts[:path] || about
126
+ #
127
+ # case opts[:format]
128
+ # when 'xml'
129
+ # show_resources_xml(resource, path, opts)
130
+ # else
131
+ # show_resources_json(resource, path, opts)
132
+ # end
133
+ # end
134
+ #
135
+ # def show_resources_xml(resource, path, opts)
136
+ # #debug "show_resources_xml: #{resource}"
137
+ # opts[:href_prefix] = path
138
+ # announcement = OMF::SFA::Resource::OComponent.sfa_advertisement_xml(resource, opts)
139
+ # ['text/xml', announcement.to_xml]
140
+ # end
141
+ #
142
+ # def show_resources_json(resources, path, opts)
143
+ # res = resources ? resource_to_json(resources, path, opts) : {}
144
+ # res[:about] = opts[:req].path
145
+ #
146
+ # ['application/json', JSON.pretty_generate({:resource_response => res}, :for_rest => true)]
147
+ # end
148
+ #
149
+ # def resource_to_json(resource, path, opts, already_described = {})
150
+ # debug "resource_to_json: resource: #{resource}, path: #{path}"
151
+ # if resource.kind_of? Enumerable
152
+ # res = []
153
+ # resource.each do |r|
154
+ # p = path
155
+ # res << resource_to_json(r, p, opts, already_described)[:resource]
156
+ # end
157
+ # res = {:resources => res}
158
+ # else
159
+ # #prefix = path.split('/')[0 .. -2].join('/') # + '/'
160
+ # prefix = path
161
+ # if resource.respond_to? :to_sfa_hashXXX
162
+ # debug "TO_SFA_HASH: #{resource}"
163
+ # res = {:resource => resource.to_sfa_hash(already_described, :href_prefix => prefix)}
164
+ # else
165
+ # rh = resource.to_hash(already_described, opts.merge(:href_prefix => prefix))
166
+ # # unless (account = resource.account) == @am_manager.get_default_account()
167
+ # # rh[:account] = {:uuid => account.uuid.to_s, :name => account.name}
168
+ # # end
169
+ # res = {:resource => rh}
170
+ # end
171
+ # end
172
+ # res
173
+ # end
174
+
175
+ protected
176
+
177
+ end # ResourceHandler
178
+ end # module