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,67 @@
1
+ require 'rubygems'
2
+ require 'dm-core'
3
+
4
+
5
+ DataMapper::Logger.new($stdout, :debug)
6
+ DataMapper.setup(:default, :adapter => :in_memory)
7
+ #DataMapper.setup(:default, :adapter => 'yaml', :path => '/tmp/test_yaml')
8
+
9
+ # DataMapper::Model.append_extensions(Pagination::ClassMethods)
10
+ # DataMapper::Model.append_inclusions(Pagination::InstanceMethods)
11
+
12
+ require 'omf-sfa/resource'
13
+ include OMF::SFA::Resource
14
+
15
+ DataMapper.finalize
16
+
17
+
18
+
19
+ #include OMF::SFA::Resource
20
+
21
+ # GURN.default_prefix = "urn:publicid:IDN+mytestbed.net"
22
+ # Component.default_domain = "norbit.nicta.com.au"
23
+ # Component.default_component_manager_id = "authority+am"
24
+
25
+ def create_node()
26
+ n = OMF::SFA::Resource::Node.create(#:component_name => 'foo'
27
+ :name => 'foo' # GURN.sfa_create('foo', n)
28
+ )
29
+ end
30
+
31
+ def create_link()
32
+ l = Link.create()
33
+
34
+ n = Node.first
35
+ i1 = Interface.create(:node => n, :network => l)
36
+ i2 = Interface.create(:node => n, :network => l)
37
+ l
38
+ end
39
+
40
+ def create_network()
41
+ nw = Network.create()
42
+
43
+ n = Node.first
44
+ i1 = Interface.create(:node => n, :network => nw)
45
+ i2 = Interface.create(:node => n, :network => nw)
46
+ i3 = Interface.create(:node => n, :network => nw)
47
+ nw
48
+ end
49
+
50
+ create_node
51
+ create_link
52
+ #create_network
53
+
54
+ n = Node.first
55
+
56
+ #puts (n.methods - Object.new.methods).sort.inspect
57
+ #puts Interface.first.node.inspect
58
+
59
+ i = Interface.first
60
+ #puts i
61
+ #puts Component.sfa_advertisement_xml([i])
62
+ #puts Node.first.interfaces
63
+ puts Component.sfa_advertisement_xml([Node.all, Network.all])
64
+
65
+ #puts Component.all
66
+ #puts Node.first.interfaces
67
+
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'dm-core'
3
+
4
+ #include DataMapper::Types
5
+
6
+ class Root
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :name, String
11
+ property :type, Discriminator
12
+ end
13
+
14
+ class Branch < Root
15
+ property :value, Integer
16
+ property :flag, Boolean
17
+ end
18
+
19
+ #DataMapper.setup(:default, {:adapter => 'sqlite3', :database => 'test.db'})
20
+ DataMapper.setup(:default, :adapter => 'yaml', :path => '/tmp/test.yaml')
21
+ #DataMapper.auto_migrate!
22
+
23
+ branch_one = Branch.new
24
+ branch_one.name = "branch one"
25
+ branch_one.value = 42
26
+
27
+ branch_one.save
28
+
29
+ entities = Root.all
30
+
31
+ p entities
32
+ p entities[0].send(:flag)
@@ -0,0 +1,378 @@
1
+ require 'rubygems'
2
+ gem 'minitest' # ensures you're using the gem, and not the built in MT
3
+ require 'minitest/autorun'
4
+ require 'minitest/pride'
5
+ require 'omf-sfa/am/am_manager'
6
+ require 'dm-migrations'
7
+ require 'omf_common/load_yaml'
8
+ require 'active_support/inflector'
9
+ require 'uuid'
10
+
11
+ include OMF::SFA::AM
12
+
13
+ def init_dm
14
+ # setup database
15
+ DataMapper::Logger.new($stdout, :info)
16
+
17
+ DataMapper.setup(:default, 'sqlite::memory:')
18
+ #DataMapper.setup(:default, 'sqlite:///tmp/am_test.db')
19
+ DataMapper::Model.raise_on_save_failure = true
20
+ DataMapper.finalize
21
+
22
+ DataMapper.auto_migrate!
23
+ end
24
+
25
+ def init_logger
26
+ OMF::Base::Loggable.init_log 'am_manager', :searchPath => File.join(File.dirname(__FILE__), 'am_manager')
27
+ @config = OMF::Base::YAML.load('omf-sfa-am', :path => [File.dirname(__FILE__) + '/../../etc/omf-sfa'])[:omf_sfa_am]
28
+ end
29
+
30
+ describe AMManager do
31
+
32
+ init_logger
33
+
34
+ init_dm
35
+
36
+ before do
37
+ DataMapper.auto_migrate! # reset database
38
+ end
39
+
40
+ let (:scheduler) do
41
+ scheduler = Class.new do
42
+ def self.get_nil_account
43
+ nil
44
+ end
45
+ def self.create_resource(resource_descr, type_to_create, oproperties, auth)
46
+ resource_descr[:resource_type] = type_to_create
47
+ #resource_descr[:account] = auth.account
48
+ type = type_to_create.camelize
49
+ resource = eval("OMF::SFA::Resource::#{type}").create(resource_descr)
50
+ if type_to_create.eql?('OLease')
51
+ resource.valid_from = oproperties[:valid_from]
52
+ resource.valid_until = oproperties[:valid_until]
53
+ resource.save
54
+ end
55
+ return resource
56
+ end
57
+ def self.release_resource(resource, authorizer)
58
+ resource.destroy
59
+ end
60
+ def self.lease_component(lease, component)
61
+ component.leases << lease
62
+ component.save
63
+ end
64
+ end
65
+ scheduler
66
+ end
67
+
68
+ let (:manager) { AMManager.new(scheduler) }
69
+
70
+
71
+ OMF::SFA::Resource::OAccount.create({:name => 'a'})
72
+ account = OMF::SFA::Resource::OAccount.first({:name => 'a'})
73
+
74
+ describe 'nodes and leases' do
75
+
76
+ it 'will create a node with a lease attached to it' do
77
+ authorizer = Minitest::Mock.new
78
+ rspec = %{
79
+ <?xml version="1.0" ?>
80
+ <rspec type="request" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/sfa/rspec/1/request-reservation.xsd">
81
+ <ol:lease id="l1" valid_from="2013-01-08T19:00:00Z" valid_until="2013-01-08T20:00:00Z"/>
82
+ <node component_id="urn:publicid:IDN+omf:nitos+node+node1" component_manager_id="urn:publicid:IDN+omf:nitos+authority+am" component_name="node1" client_id="omf" exclusive="true">
83
+ <ol:lease_ref id_ref="l1"/>
84
+ </node>
85
+ </rspec>
86
+ }
87
+ req = Nokogiri.XML(rspec)
88
+
89
+ authorizer.expect(:can_create_resource?, true, [Hash, String])
90
+ authorizer.expect(:can_create_resource?, true, [Hash, String])
91
+ 2.times {authorizer.expect(:account, account)}
92
+
93
+ r = manager.update_resources_from_rspec(req.root, false, authorizer)
94
+
95
+ node = r.first
96
+ node.must_be_kind_of(OMF::SFA::Resource::Node)
97
+ node.name.must_equal('node1')
98
+ node.resource_type.must_equal('node')
99
+
100
+ a = node.account
101
+ a.name.must_equal('a')
102
+
103
+ lease = node.leases.first
104
+ lease.must_be_kind_of(OMF::SFA::Resource::OLease)
105
+ lease.name.must_equal(a.name)
106
+ lease.valid_from.must_equal(Time.parse('2013-01-08T19:00:00Z'))
107
+ lease.valid_until.must_equal(Time.parse('2013-01-08T20:00:00Z'))
108
+ lease.components.first.must_be_kind_of(OMF::SFA::Resource::Node)
109
+
110
+ authorizer.verify
111
+ end
112
+
113
+
114
+ it 'will create a node with an already known lease attached to it' do
115
+ authorizer = Minitest::Mock.new
116
+ l = OMF::SFA::Resource::OLease.new({ :name => account.name})
117
+ valid_from = Time.parse('2013-01-08T19:00:00Z')
118
+ valid_until = Time.parse('2013-01-08T20:00:00Z')
119
+ l.valid_from = valid_from
120
+ l.valid_until = valid_until
121
+ l.save
122
+ rspec = %{
123
+ <?xml version="1.0" ?>
124
+ <rspec type="request" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/sfa/rspec/1/request-reservation.xsd">
125
+ <ol:lease id="#{l.uuid}" valid_from="2013-01-08T19:00:00Z" valid_until="2013-01-08T20:00:00Z"/>
126
+ <node component_id="urn:publicid:IDN+omf:nitos+node+node1" component_manager_id="urn:publicid:IDN+omf:nitos+authority+am" component_name="node1" client_id="omf" exclusive="true">
127
+ <ol:lease_ref id_ref="#{l.uuid}"/>
128
+ </node>
129
+ </rspec>
130
+ }
131
+ req = Nokogiri.XML(rspec)
132
+
133
+ authorizer.expect(:can_view_lease?, true, [OMF::SFA::Resource::OLease])
134
+ 2.times {authorizer.expect(:can_create_resource?, true, [Hash, String])}
135
+ 2.times {authorizer.expect(:account, account)}
136
+
137
+ r = manager.update_resources_from_rspec(req.root, false, authorizer)
138
+
139
+ node = r.first
140
+ node.must_be_kind_of(OMF::SFA::Resource::Node)
141
+ node.name.must_equal('node1')
142
+ node.resource_type.must_equal('node')
143
+
144
+ a = node.account
145
+ a.name.must_equal('a')
146
+
147
+ lease = node.leases.first
148
+ lease.must_be_kind_of(OMF::SFA::Resource::OLease)
149
+ lease.must_equal(l)
150
+ lease.name.must_equal(a.name)
151
+ lease.valid_from.must_equal(valid_from)
152
+ lease.valid_until.must_equal(valid_until)
153
+ lease.components.first.must_be_kind_of(OMF::SFA::Resource::Node)
154
+
155
+ authorizer.verify
156
+ end
157
+
158
+ #it 'will create a node with an already known lease attached to it (included in rspecs)' do
159
+ # authorizer = Minitest::Mock.new
160
+ # l = OMF::SFA::Resource::OLease.new({ :name => account.name })
161
+ # l.valid_from = '2013-01-08T19:00:00Z'
162
+ # l.valid_until = '2013-01-08T20:00:00Z'
163
+ # l.save
164
+
165
+ # rspec = %{
166
+ # <rspec xmlns="http://www.protogeni.net/resources/rspec/2" xmlns:omf="http://schema.mytestbed.net/sfa/rspec/1" xmlns:ol="http://schema.ict-openlab.eu/sfa/rspec/1" type="request">
167
+ # <node component_id="urn:publicid:IDN+openlab+node+node1" component_name="node1" component_manager_id="urn:publicid:IDN+openlab+authority+am">
168
+ # <ol:lease uuid="#{l.uuid}" ol:valid_from="2013-01-08T19:00:00Z" ol:valid_until="2013-01-08T20:00:00Z"/>
169
+ # </node>
170
+ # </rspec>
171
+ # }
172
+ # req = Nokogiri.XML(rspec)
173
+
174
+ # authorizer.expect(:can_view_lease?, true, [OMF::SFA::Resource::OLease])
175
+ # authorizer.expect(:can_modify_lease?, true, [OMF::SFA::Resource::OLease])
176
+ # authorizer.expect(:can_create_resource?, true, [Hash, String])
177
+ # authorizer.expect(:account, account)
178
+
179
+ # r = manager.update_resources_from_rspec(req.root, false, authorizer)
180
+
181
+ # node = r.first
182
+ # node.must_be_kind_of(OMF::SFA::Resource::Node)
183
+ # node.name.must_equal('node1')
184
+ # node.resource_type.must_equal('node')
185
+
186
+ # a = node.account
187
+ # a.name.must_equal('a')
188
+
189
+ # lease = node.leases.first
190
+ # lease.must_be_kind_of(OMF::SFA::Resource::OLease)
191
+ # lease.name.must_equal(a.name)
192
+ # lease.valid_from.must_equal(Time.parse('2013-01-08T19:00:00Z'))
193
+ # lease.valid_until.must_equal(Time.parse('2013-01-08T20:00:00Z'))
194
+ # lease.components.first.must_be_kind_of(OMF::SFA::Resource::Node)
195
+
196
+ # authorizer.verify
197
+ #end
198
+
199
+ it 'will attach 2 leases(1 new and 1 old) to 2 nodes' do
200
+ authorizer = Minitest::Mock.new
201
+ l1 = OMF::SFA::Resource::OLease.new({ :name => account.name})
202
+ l1.valid_from = Time.parse('2013-01-08T19:00:00Z')
203
+ l1.valid_until = Time.parse('2013-01-08T20:00:00Z')
204
+ l1.save
205
+
206
+ rspec = %{
207
+ <?xml version="1.0" ?>
208
+ <rspec type="request" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/sfa/rspec/1/request-reservation.xsd">
209
+ <ol:lease id="#{l1.uuid}" valid_from="2013-01-08T19:00:00Z" valid_until="2013-01-08T20:00:00Z"/>
210
+ <ol:lease id="l2" valid_from="2013-01-08T12:00:00Z" valid_until="2013-01-08T14:00:00Z"/>
211
+ <node component_id="urn:publicid:IDN+omf:nitos+node+node1" component_manager_id="urn:publicid:IDN+omf:nitos+authority+am" component_name="node1" client_id="omf" exclusive="true">
212
+ <ol:lease_ref id_ref="#{l1.uuid}"/>
213
+ </node>
214
+ <node component_id="urn:publicid:IDN+omf:nitos+node+node2" component_manager_id="urn:publicid:IDN+omf:nitos+authority+am" component_name="node2" client_id="omf" exclusive="true">
215
+ <ol:lease_ref id_ref="l2"/>
216
+ </node>
217
+ </rspec>
218
+ }
219
+ req = Nokogiri.XML(rspec)
220
+
221
+ 3.times { authorizer.expect(:can_view_lease?, true, [OMF::SFA::Resource::OLease]) }
222
+ 3.times { authorizer.expect(:can_create_resource?, true, [Hash, String]) }
223
+ 4.times {authorizer.expect(:account, account)}
224
+
225
+ r = manager.update_resources_from_rspec(req.root, false, authorizer)
226
+
227
+ node = r.first
228
+ node.must_be_kind_of(OMF::SFA::Resource::Node)
229
+ node.name.must_equal('node1')
230
+ node.resource_type.must_equal('node')
231
+
232
+ a = node.account
233
+ a.name.must_equal('a')
234
+
235
+ lease = node.leases.first
236
+ lease.must_be_kind_of(OMF::SFA::Resource::OLease)
237
+ lease.name.must_equal(a.name)
238
+ lease.valid_from.must_equal(Time.parse('2013-01-08T19:00:00Z'))
239
+ lease.valid_until.must_equal(Time.parse('2013-01-08T20:00:00Z'))
240
+ lease.components.first.must_be_kind_of(OMF::SFA::Resource::Node)
241
+
242
+ node = r[1]
243
+ node.must_be_kind_of(OMF::SFA::Resource::Node)
244
+ node.name.must_equal('node2')
245
+ node.resource_type.must_equal('node')
246
+
247
+ a = node.account
248
+ a.name.must_equal('a')
249
+
250
+ lease = node.leases.first
251
+ lease.must_be_kind_of(OMF::SFA::Resource::OLease)
252
+ lease.name.must_equal(a.name)
253
+ lease.valid_from.must_equal(Time.parse('2013-01-08T12:00:00Z'))
254
+ lease.valid_until.must_equal(Time.parse('2013-01-08T14:00:00Z'))
255
+ lease.components.first.must_be_kind_of(OMF::SFA::Resource::Node)
256
+
257
+ authorizer.verify
258
+ end
259
+ end # nodes and leases
260
+
261
+ describe 'clean state flag' do
262
+
263
+ it 'will create a new node and lease without deleting the previous records' do
264
+ authorizer = Minitest::Mock.new
265
+ l = OMF::SFA::Resource::OLease.create({ :name => account.name, :account => account})
266
+ l.valid_from = '2013-01-08T19:00:00Z'
267
+ l.valid_until = '2013-01-08T20:00:00Z'
268
+ l.save
269
+
270
+ r = OMF::SFA::Resource::Node.create({:name => 'node1', :account => account})
271
+ r.leases << l
272
+ r.save
273
+
274
+ rspec = %{
275
+ <?xml version="1.0" ?>
276
+ <rspec type="request" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/sfa/rspec/1/request-reservation.xsd">
277
+ <ol:lease id="l1" valid_from="2013-01-08T12:00:00Z" valid_until="2013-01-08T14:00:00Z"/>
278
+ <node component_id="urn:publicid:IDN+omf:nitos+node+node2" component_manager_id="urn:publicid:IDN+omf:nitos+authority+am" component_name="node2" client_id="omf" exclusive="true">
279
+ <ol:lease_ref id_ref="l1"/>
280
+ </node>
281
+ </rspec>
282
+ }
283
+ req = Nokogiri.XML(rspec)
284
+
285
+ authorizer.expect(:can_create_resource?, true, [Hash, String])
286
+ authorizer.expect(:can_create_resource?, true, [Hash, String])
287
+ 2.times { authorizer.expect(:account, account) }
288
+
289
+ res = manager.update_resources_from_rspec(req.root, false, authorizer)
290
+
291
+ res.length.must_equal 1
292
+ r1 = res.first
293
+ r1.name.must_equal('node2')
294
+ r1.leases.first.name.must_equal(account.name)
295
+
296
+ node = OMF::SFA::Resource::Node.first(:name => 'node1')
297
+ node.wont_be_nil
298
+ node.leases.first.wont_be_nil
299
+
300
+ authorizer.verify
301
+ end
302
+
303
+ it 'will unlink a node from a lease and release both' do
304
+ authorizer = Minitest::Mock.new
305
+ l = OMF::SFA::Resource::OLease.create({:name => 'l1', :account => account})
306
+ l.valid_from = '2013-01-08T19:00:00Z'
307
+ l.valid_until = '2013-01-08T20:00:00Z'
308
+ l.save
309
+
310
+ r = OMF::SFA::Resource::Node.create({:name => 'node1', :account => account})
311
+ r.leases << l
312
+ r.save
313
+
314
+ rspec = %{
315
+ <?xml version="1.0" ?>
316
+ <rspec type="request" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/sfa/rspec/1/request-reservation.xsd">
317
+ </rspec>
318
+ }
319
+
320
+ req = Nokogiri.XML(rspec)
321
+
322
+ authorizer.expect(:can_view_resource?, true, [OMF::SFA::Resource::Node])
323
+ authorizer.expect(:can_view_lease?, true, [OMF::SFA::Resource::OLease])
324
+ authorizer.expect(:can_release_lease?, true, [OMF::SFA::Resource::OLease])
325
+ authorizer.expect(:can_release_resource?, true, [OMF::SFA::Resource::Node])
326
+ 2.times {authorizer.expect(:account, account)}
327
+
328
+ r = manager.update_resources_from_rspec(req.root, true, authorizer)
329
+ r.must_be_empty
330
+
331
+ OMF::SFA::Resource::Node.first(:name => 'node1').must_be_nil
332
+
333
+ l.reload
334
+ l.components.first.must_be_nil
335
+
336
+ OMF::SFA::Resource::OLease.first(:name => 'l1').wont_be_nil
337
+ OMF::SFA::Resource::OLease.first(:name => 'l1').status.must_equal("cancelled")
338
+
339
+ authorizer.verify
340
+ end
341
+
342
+ #it 'will release a node and a lease' do
343
+ # authorizer = Minitest::Mock.new
344
+ # l = OMF::SFA::Resource::OLease.create({:name => 'l1', :account => account})
345
+ # l.valid_from = '2013-01-08T19:00:00Z'
346
+ # l.valid_until = '2013-01-08T20:00:00Z'
347
+ # l.save
348
+
349
+ # r = OMF::SFA::Resource::Node.create({:name => 'node1', :account => account})
350
+ # r.leases << l
351
+ # r.save
352
+
353
+ # l.components.first.must_equal(r)
354
+
355
+ # rspec = %{
356
+ # <rspec xmlns="http://www.protogeni.net/resources/rspec/2" xmlns:omf="http://schema.mytestbed.net/sfa/rspec/1" xmlns:ol="http://schema.ict-openlab.eu/sfa/rspec/1" type="request">
357
+ # </rspec>
358
+ # }
359
+ # req = Nokogiri.XML(rspec)
360
+
361
+ # authorizer.expect(:can_view_resource?, true, [OMF::SFA::Resource::Node])
362
+ # authorizer.expect(:can_view_lease?, true, [OMF::SFA::Resource::OLease])
363
+ # authorizer.expect(:can_release_lease?, true, [OMF::SFA::Resource::OLease])
364
+ # authorizer.expect(:can_release_resource?, true, [OMF::SFA::Resource::Node])
365
+ # authorizer.expect(:account, account)
366
+ # authorizer.expect(:account, account)
367
+
368
+ # r = manager.update_resources_from_rspec(req.root, true, authorizer)
369
+
370
+ # r.must_be_empty
371
+ # OMF::SFA::Resource::Node.first(:name => 'node1').must_be_nil
372
+ # OMF::SFA::Resource::OLease.first(:name => 'l1').status.must_equal('cancelled')
373
+ #
374
+ # authorizer.verify
375
+ #end
376
+ end # clean state flag
377
+
378
+ end