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.
- data/.gitignore +24 -0
- data/Gemfile +6 -0
- data/README.md +211 -0
- data/Rakefile +23 -0
- data/bin/parse_rspec.rb +167 -0
- data/etc/omf-sfa/omf-sfa-am.yaml +12 -0
- data/examples/exogeni5nodemanifest.rspec +105 -0
- data/examples/instageni5nodemanifest.rspec +150 -0
- data/lib/omf-sfa/am/am-rest/REST_API.md +301 -0
- data/lib/omf-sfa/am/am-rest/account_handler.rb +145 -0
- data/lib/omf-sfa/am/am-rest/am_rest_server.rb +255 -0
- data/lib/omf-sfa/am/am-rest/api_template.html +48 -0
- data/lib/omf-sfa/am/am-rest/config.ru +110 -0
- data/lib/omf-sfa/am/am-rest/resource_handler.rb +178 -0
- data/lib/omf-sfa/am/am-rest/rest_handler.rb +573 -0
- data/lib/omf-sfa/am/am-rest/session_authenticator.rb +130 -0
- data/lib/omf-sfa/am/am-rpc/abstract_rpc_service.rb +60 -0
- data/lib/omf-sfa/am/am-rpc/am_authorizer.rb +161 -0
- data/lib/omf-sfa/am/am-rpc/am_rpc_api.rb +450 -0
- data/lib/omf-sfa/am/am-rpc/am_rpc_service.rb +402 -0
- data/lib/omf-sfa/am/am_liaison.rb +93 -0
- data/lib/omf-sfa/am/am_manager.rb +859 -0
- data/lib/omf-sfa/am/am_runner.rb +108 -0
- data/lib/omf-sfa/am/am_scheduler.rb +146 -0
- data/lib/omf-sfa/am/am_server.rb +194 -0
- data/lib/omf-sfa/am/config.ru +122 -0
- data/lib/omf-sfa/am/credential.rb +145 -0
- data/lib/omf-sfa/am/default_authorizer.rb +44 -0
- data/lib/omf-sfa/am/privilege_credential.rb +76 -0
- data/lib/omf-sfa/am/signature.rb +37 -0
- data/lib/omf-sfa/am/user_credential.rb +56 -0
- data/lib/omf-sfa/am.rb +7 -0
- data/lib/omf-sfa/model/abstract_prop_description.rb +87 -0
- data/lib/omf-sfa/model/model_class_description.rb +145 -0
- data/lib/omf-sfa/model/model_data_prop_description.rb +28 -0
- data/lib/omf-sfa/model/model_obj_prop_description.rb +49 -0
- data/lib/omf-sfa/model/ontology.rb +169 -0
- data/lib/omf-sfa/resource/README.md +24 -0
- data/lib/omf-sfa/resource/channel.rb +49 -0
- data/lib/omf-sfa/resource/comp_group.rb +41 -0
- data/lib/omf-sfa/resource/component_lease.rb +10 -0
- data/lib/omf-sfa/resource/constants.rb +24 -0
- data/lib/omf-sfa/resource/group_component.rb +35 -0
- data/lib/omf-sfa/resource/group_membership.rb +17 -0
- data/lib/omf-sfa/resource/gurn.rb +187 -0
- data/lib/omf-sfa/resource/interface.rb +78 -0
- data/lib/omf-sfa/resource/ip.rb +48 -0
- data/lib/omf-sfa/resource/link.rb +29 -0
- data/lib/omf-sfa/resource/node.rb +75 -0
- data/lib/omf-sfa/resource/oaccount.rb +94 -0
- data/lib/omf-sfa/resource/ocomponent.rb +134 -0
- data/lib/omf-sfa/resource/ogroup.rb +106 -0
- data/lib/omf-sfa/resource/olease.rb +61 -0
- data/lib/omf-sfa/resource/oproperty.rb +178 -0
- data/lib/omf-sfa/resource/oreference.rb +15 -0
- data/lib/omf-sfa/resource/oresource.rb +491 -0
- data/lib/omf-sfa/resource/project.rb +28 -0
- data/lib/omf-sfa/resource/project_membership.rb +13 -0
- data/lib/omf-sfa/resource/sfa_base.rb +544 -0
- data/lib/omf-sfa/resource/user.rb +25 -0
- data/lib/omf-sfa/resource.rb +20 -0
- data/lib/omf-sfa/util/create_sample_testbed.rb +68 -0
- data/lib/omf-sfa/util/load_from_sfa_xml.rb +65 -0
- data/lib/omf-sfa/version.rb +4 -0
- data/lib/omf_sfa.rb +5 -0
- data/omf_sfa.gemspec +46 -0
- data/owl/README +3 -0
- data/owl/ben-6509.rdf +1377 -0
- data/owl/ben-dell.rdf +586 -0
- data/owl/ben-dtn.rdf +1698 -0
- data/owl/ben.rdf +1335 -0
- data/owl/collections.owl +309 -0
- data/owl/compute.owl +1486 -0
- data/owl/domain.owl +444 -0
- data/owl/dtn.owl +1165 -0
- data/owl/ec2.owl +385 -0
- data/owl/ethernet.owl +466 -0
- data/owl/eucalyptus.owl +431 -0
- data/owl/id-mp-Request1.rdf +247 -0
- data/owl/itu-grid.owl +147 -0
- data/owl/kansei.owl +511 -0
- data/owl/layer.owl +645 -0
- data/owl/location.owl +117 -0
- data/owl/mass.rdf +608 -0
- data/owl/nlr.rdf +901 -0
- data/owl/orca.owl +181 -0
- data/owl/planetlab.owl +124 -0
- data/owl/protogeni.owl +467 -0
- data/owl/request-6509-2.rdf +150 -0
- data/owl/request-6509-3.rdf +158 -0
- data/owl/request-6509.rdf +199 -0
- data/owl/request.owl +222 -0
- data/owl/storage.owl +511 -0
- data/owl/topology.owl +608 -0
- data/schema/rspec-v3/ad-common.xsd +269 -0
- data/schema/rspec-v3/ad-reservation.rnc +12 -0
- data/schema/rspec-v3/ad-reservation.rng +28 -0
- data/schema/rspec-v3/ad-reservation.xsd +13 -0
- data/schema/rspec-v3/ad.rnc +151 -0
- data/schema/rspec-v3/ad.xsd +77 -0
- data/schema/rspec-v3/any-extension-schema.xsd +38 -0
- data/schema/rspec-v3/any-extension.rnc +30 -0
- data/schema/rspec-v3/common.rnc +185 -0
- data/schema/rspec-v3/manifest-common.xsd +244 -0
- data/schema/rspec-v3/manifest-request.xsd +95 -0
- data/schema/rspec-v3/manifest.rnc +62 -0
- data/schema/rspec-v3/manifest.xsd +34 -0
- data/schema/rspec-v3/request-common.xsd +219 -0
- data/schema/rspec-v3/request-reservation.rnc +12 -0
- data/schema/rspec-v3/request-reservation.xsd +13 -0
- data/schema/rspec-v3/request.rnc +118 -0
- data/schema/rspec-v3/request.xsd +94 -0
- data/share/assets/css/default.css +147 -0
- data/share/assets/css/rest_api.css +0 -0
- data/share/assets/network.html +28 -0
- data/share/assets/network.js +82 -0
- data/spec/am/am-rest/common.rb +29 -0
- data/spec/am/am-rest/resource_group_handler_XspecX.rb +97 -0
- data/spec/am/am-rest/resource_handler_spec.rb +204 -0
- data/spec/am/am-rpc/sfa_methods_spec.rb +150 -0
- data/spec/am/am_manager_spec.rb +307 -0
- data/spec/am/am_scheduler_spec.rb +57 -0
- data/spec/am/common.rb +24 -0
- data/spec/resource/common.rb +31 -0
- data/spec/resource/node_spec.rb +171 -0
- data/spec/resource/oaccount_spec.rb +92 -0
- data/spec/resource/ocomponent_spec.rb +225 -0
- data/spec/resource/ogroup_spec.rb +93 -0
- data/spec/resource/oresource_spec.rb +208 -0
- data/spec/resource_and_leases_spec.rb +377 -0
- data/test/OLD_FILES/assertion1.xml +117 -0
- data/test/OLD_FILES/greeter_spec.rb +15 -0
- data/test/OLD_FILES/mongo_test.rb +45 -0
- data/test/OLD_FILES/req-sfa-2.xml +6 -0
- data/test/OLD_FILES/req-sfa-g.xml +8 -0
- data/test/OLD_FILES/req-sfa-g2.xml +10 -0
- data/test/OLD_FILES/req-sfa-g3.xml +14 -0
- data/test/OLD_FILES/req-sfa.xml +6 -0
- data/test/OLD_FILES/req1.xml +22 -0
- data/test/OLD_FILES/req1b.xml +15 -0
- data/test/OLD_FILES/rspec-test.xml +1867 -0
- data/test/OLD_FILES/test.rb +67 -0
- data/test/OLD_FILES/test2.rb +32 -0
- data/test/am/am_manager_rspec_tests.rb +378 -0
- data/test/am/am_manager_tests.rb +518 -0
- data/test/am/am_scheduler_tests.rb +173 -0
- data/test/resource/olease_test.rb +74 -0
- data/test/sfa_requests/request.xml +5 -0
- data/test/sfa_requests/request1.xml +5 -0
- data/test/sfa_requests/request2.xml +5 -0
- data/test/sfa_requests/request3.xml +5 -0
- 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
|