occi-core 4.2.12 → 4.2.13
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/LICENSE +9 -3
- data/Rakefile +3 -0
- data/lib/occi/collection.rb +6 -5
- data/lib/occi/core/entities.rb +2 -2
- data/lib/occi/core/entity.rb +9 -9
- data/lib/occi/parser.rb +7 -1
- data/lib/occi/parser/text.rb +8 -8
- data/lib/occi/version.rb +1 -1
- data/spec/occi/collection_spec.rb +40 -28
- data/spec/occi/core/entities_spec.rb +64 -0
- data/spec/occi/core/entity_spec.rb +11 -11
- data/spec/occi/parser_spec.rb +13 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b13e9998a9a2ccb704efa4c1cbb283ae7aa7d46
|
4
|
+
data.tar.gz: c8e5a5a2dfe2df264cd24c46e86f7ec3d28b10b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2093cc6c116bf9dc2e281a57ba5cfc2b05528e81da87695bc6a46c4078830c4575e9fde4aff0392edcea820b6c6f20e5c3a9232e83aacb54930f09d9701b9937
|
7
|
+
data.tar.gz: 01acb909e3a5942c83988de6966fb036827d07e7ac481b6862358356b99d06d79c0335de9151d9bdf3ab8f2d6fda5dbb38dba44a22eea40331568358ac069740
|
data/LICENSE
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
-
|
1
|
+
# @markup text
|
2
|
+
|
3
|
+
The work represented by this source file is partially or entirely funded
|
4
|
+
by the EGI-InSPIRE project through the European Commission's 7th Framework
|
5
|
+
Programme (contract # INFSO-RI-261323)
|
6
|
+
|
7
|
+
Copyright (c) 2012-2014 GWDG, CESNET
|
2
8
|
|
3
9
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
10
|
you may not use this file except in compliance with the License.
|
5
11
|
You may obtain a copy of the License at
|
6
12
|
|
7
|
-
|
13
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
14
|
|
9
15
|
Unless required by applicable law or agreed to in writing, software
|
10
16
|
distributed under the License is distributed on an "AS IS" BASIS,
|
11
17
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
18
|
See the License for the specific language governing permissions and
|
13
|
-
limitations under the License.
|
19
|
+
limitations under the License.
|
data/Rakefile
CHANGED
@@ -6,6 +6,9 @@ task :default => 'test'
|
|
6
6
|
desc "Run all tests; includes rspec and coverage reports"
|
7
7
|
task :test => 'rcov:all'
|
8
8
|
|
9
|
+
desc "Run all tests; includes rspec and coverage reports"
|
10
|
+
task :spec => 'test'
|
11
|
+
|
9
12
|
Gem::Tasks.new(:build => {:tar => true, :zip => true}, :sign => {:checksum => true, :pgp => false})
|
10
13
|
|
11
14
|
namespace :rcov do
|
data/lib/occi/collection.rb
CHANGED
@@ -65,11 +65,12 @@ module Occi
|
|
65
65
|
end
|
66
66
|
|
67
67
|
# @param incl_categories [Boolean] check every category against the model
|
68
|
+
# @param set_default_attrs [Boolean] set default attribute values for all entities
|
68
69
|
# @return [Boolean] result
|
69
|
-
def check(incl_categories = false)
|
70
|
-
@resources.check
|
71
|
-
@links.check
|
72
|
-
@action.check if @action
|
70
|
+
def check(incl_categories = false, set_default_attrs = false)
|
71
|
+
@resources.check(set_default_attrs)
|
72
|
+
@links.check(set_default_attrs)
|
73
|
+
@action.check(set_default_attrs) if @action
|
73
74
|
|
74
75
|
if incl_categories
|
75
76
|
@kinds.check
|
@@ -222,7 +223,7 @@ module Occi
|
|
222
223
|
elsif standalone_action_instance?
|
223
224
|
header = self.action.to_header
|
224
225
|
else
|
225
|
-
header['Category'] = self.categories.collect { |category| category.
|
226
|
+
header['Category'] = self.categories.collect { |category| category.to_string }.join(',') if self.categories.any?
|
226
227
|
raise "Only one resource allowed for rendering to text/occi!" if self.resources.size > 1
|
227
228
|
header = self.class.header_merge(header, self.resources.first.to_header) if self.resources.any?
|
228
229
|
header['Link'] = self.links.collect { |link| link.to_string }.join(',') if self.links.any?
|
data/lib/occi/core/entities.rb
CHANGED
data/lib/occi/core/entity.rb
CHANGED
@@ -171,22 +171,22 @@ module Occi
|
|
171
171
|
# @param [true,false] set default values for all empty attributes
|
172
172
|
def check(set_defaults = false)
|
173
173
|
raise ArgumentError, 'No model has been assigned to this entity' unless @model
|
174
|
-
|
174
|
+
|
175
175
|
kind = @model.get_by_id(@kind.to_s, true)
|
176
176
|
raise Occi::Errors::KindNotDefinedError,
|
177
177
|
"Kind not found for entity #{self.class.name}[#{self.to_s.inspect}]!" unless kind
|
178
|
-
|
178
|
+
|
179
179
|
definitions = Occi::Core::Attributes.new
|
180
180
|
definitions.merge! kind.attributes
|
181
|
-
|
181
|
+
|
182
182
|
@mixins.each do |mxn|
|
183
183
|
mixin = @model.get_by_id(mxn.to_s)
|
184
184
|
raise Occi::Errors::CategoryNotDefinedError,
|
185
185
|
"Mixin #{mxn.to_s.inspect} not declared in the model!" unless mixin && mixin.kind_of?(Occi::Core::Mixin)
|
186
|
-
|
186
|
+
|
187
187
|
definitions.merge!(mixin.attributes) if mixin.attributes
|
188
188
|
end if @mixins
|
189
|
-
|
189
|
+
|
190
190
|
@attributes.check!(definitions, set_defaults)
|
191
191
|
end
|
192
192
|
|
@@ -208,11 +208,11 @@ module Occi
|
|
208
208
|
|
209
209
|
# @return [String] text representation
|
210
210
|
def to_text
|
211
|
-
text = "Category: #{self.kind.term};scheme=#{self.kind.scheme.inspect};class=\"kind\";location=#{self.kind.location.inspect}"
|
211
|
+
text = "Category: #{self.kind.term};scheme=#{self.kind.scheme.inspect};class=\"kind\";location=#{self.kind.location.inspect};title=#{self.kind.title.inspect}"
|
212
212
|
@mixins.each do |mixin|
|
213
213
|
scheme, term = mixin.to_s.split('#')
|
214
214
|
scheme << '#'
|
215
|
-
text << "\nCategory: #{term};scheme=#{scheme.inspect};class=\"mixin\";location=#{mixin.location.inspect}"
|
215
|
+
text << "\nCategory: #{term};scheme=#{scheme.inspect};class=\"mixin\";location=#{mixin.location.inspect};title=#{mixin.title ? mixin.title.inspect : ''.inspect}"
|
216
216
|
end
|
217
217
|
|
218
218
|
text << @attributes.to_text
|
@@ -225,12 +225,12 @@ module Occi
|
|
225
225
|
# @return [Hash] hash containing the HTTP headers of the text/occi rendering
|
226
226
|
def to_header
|
227
227
|
header = Hashie::Mash.new
|
228
|
-
header['Category'] = "#{self.kind.term};scheme=#{self.kind.scheme.inspect};class=\"kind\";location=#{self.kind.location.inspect}"
|
228
|
+
header['Category'] = "#{self.kind.term};scheme=#{self.kind.scheme.inspect};class=\"kind\";location=#{self.kind.location.inspect};title=#{self.kind.title.inspect}"
|
229
229
|
|
230
230
|
@mixins.each do |mixin|
|
231
231
|
scheme, term = mixin.to_s.split('#')
|
232
232
|
scheme << '#'
|
233
|
-
header['Category'] << ",#{term};scheme=#{scheme.inspect};class=\"mixin\";location=#{mixin.location.inspect}"
|
233
|
+
header['Category'] << ",#{term};scheme=#{scheme.inspect};class=\"mixin\";location=#{mixin.location.inspect};title=#{mixin.title ? mixin.title.inspect : ''.inspect}"
|
234
234
|
end
|
235
235
|
|
236
236
|
attributes = @attributes.to_header
|
data/lib/occi/parser.rb
CHANGED
@@ -119,7 +119,13 @@ module Occi
|
|
119
119
|
|
120
120
|
header.delete_if { |k, v| v.blank? || !OCCI_HEADERS.include?(k) }
|
121
121
|
|
122
|
-
header.map
|
122
|
+
header = header.map do |k, v|
|
123
|
+
# sometimes header values arrive as single-value arrays!
|
124
|
+
v = v.first if v.kind_of?(Array)
|
125
|
+
v.to_s.split(',').collect { |w| "#{k}: #{w}".strip }
|
126
|
+
end
|
127
|
+
|
128
|
+
header.flatten
|
123
129
|
end
|
124
130
|
|
125
131
|
end
|
data/lib/occi/parser/text.rb
CHANGED
@@ -108,7 +108,7 @@ module Occi
|
|
108
108
|
# match string to regular expression
|
109
109
|
match = regexp.match string
|
110
110
|
|
111
|
-
raise Occi::Errors::ParserInputError, "Could not match #{string}" unless match
|
111
|
+
raise Occi::Errors::ParserInputError, "Could not match #{string.inspect}" unless match
|
112
112
|
|
113
113
|
term = match[:term].downcase
|
114
114
|
scheme = match[:scheme]
|
@@ -135,16 +135,16 @@ module Occi
|
|
135
135
|
|
136
136
|
case match[:class]
|
137
137
|
when 'kind'
|
138
|
-
Occi::Log.debug "[#{self}] class #{match[:class]} identified as kind"
|
138
|
+
Occi::Log.debug "[#{self}] class #{match[:class].inspect} identified as kind"
|
139
139
|
Occi::Core::Kind.new scheme, term, title, attributes, related, actions, location
|
140
140
|
when 'mixin'
|
141
|
-
Occi::Log.debug "[#{self}] class #{match[:class]} identified as mixin"
|
141
|
+
Occi::Log.debug "[#{self}] class #{match[:class].inspect} identified as mixin"
|
142
142
|
Occi::Core::Mixin.new scheme, term, title, attributes, related, actions, location
|
143
143
|
when 'action'
|
144
|
-
Occi::Log.debug "[#{self}] class #{match[:class]} identified as action"
|
144
|
+
Occi::Log.debug "[#{self}] class #{match[:class].inspect} identified as action"
|
145
145
|
Occi::Core::Action.new scheme, term, title, attributes
|
146
146
|
else
|
147
|
-
raise Occi::Errors::ParserInputError, "Category with class #{match[:class]} not recognized in string: #{string}"
|
147
|
+
raise Occi::Errors::ParserInputError, "Category with class #{match[:class].inspect} not recognized in string: #{string}"
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
@@ -155,7 +155,7 @@ module Occi
|
|
155
155
|
# match string to regular expression
|
156
156
|
match = regexp.match string
|
157
157
|
|
158
|
-
raise Occi::Errors::ParserInputError, "Could not match #{string}" unless match
|
158
|
+
raise Occi::Errors::ParserInputError, "Could not match #{string.inspect}" unless match
|
159
159
|
|
160
160
|
value = match[:string] if match[:string]
|
161
161
|
|
@@ -174,7 +174,7 @@ module Occi
|
|
174
174
|
# match string to regular expression
|
175
175
|
match = regexp.match string
|
176
176
|
|
177
|
-
raise Occi::Errors::ParserInputError, "Could not match #{string}" unless match
|
177
|
+
raise Occi::Errors::ParserInputError, "Could not match #{string.inspect}" unless match
|
178
178
|
|
179
179
|
if match[:uri].include?('?action=')
|
180
180
|
link_string_action match
|
@@ -223,7 +223,7 @@ module Occi
|
|
223
223
|
# match string to regular expression
|
224
224
|
match = regexp.match string
|
225
225
|
|
226
|
-
raise Occi::Errors::ParserInputError, "Could not match #{string}" unless match
|
226
|
+
raise Occi::Errors::ParserInputError, "Could not match #{string.inspect}" unless match
|
227
227
|
|
228
228
|
match[:location]
|
229
229
|
end
|
data/lib/occi/version.rb
CHANGED
@@ -3,7 +3,7 @@ module Occi
|
|
3
3
|
|
4
4
|
context 'initialization' do
|
5
5
|
let(:collection){ collection = Occi::Collection.new }
|
6
|
-
|
6
|
+
|
7
7
|
context 'with base objects' do
|
8
8
|
before(:each) {
|
9
9
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
@@ -39,14 +39,14 @@ module Occi
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
context '#model' do
|
44
44
|
let(:collection){ collection = Occi::Collection.new }
|
45
45
|
it 'registers a model' do
|
46
46
|
expect(collection.model).to be_kind_of Occi::Model
|
47
47
|
end
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
context '#resources' do
|
51
51
|
let(:collection){ collection = Occi::Collection.new }
|
52
52
|
it 'can create a new OCCI Resource' do
|
@@ -57,10 +57,22 @@ module Occi
|
|
57
57
|
|
58
58
|
context '#check' do
|
59
59
|
let(:collection){ collection = Occi::Collection.new }
|
60
|
+
|
60
61
|
it 'checks against model without failure' do
|
61
62
|
collection.resources.create 'http://schemas.ogf.org/occi/core#resource'
|
62
63
|
expect{ collection.check }.to_not raise_error
|
63
64
|
end
|
65
|
+
|
66
|
+
it 'does not raise an error for unknown categories by default' do
|
67
|
+
collection.kinds << Occi::Core::Kind.new('http://example.org/test/stuff#', 'here')
|
68
|
+
expect { collection.check }.to_not raise_error
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'raises an error for unknown categories when requested' do
|
72
|
+
collection.kinds << Occi::Core::Kind.new('http://example.org/test/stuff#', 'here')
|
73
|
+
expect { collection.check(true) }.to raise_error
|
74
|
+
end
|
75
|
+
|
64
76
|
end
|
65
77
|
|
66
78
|
context '#get_related_to' do
|
@@ -218,7 +230,7 @@ module Occi
|
|
218
230
|
it 'kept the correct number of mixins' do
|
219
231
|
expect(coll2.mixins.count).to eql 1
|
220
232
|
end
|
221
|
-
|
233
|
+
|
222
234
|
it 'kept the correct number of actions' do
|
223
235
|
expect(coll2.actions.count).to eql 1
|
224
236
|
end
|
@@ -247,7 +259,7 @@ module Occi
|
|
247
259
|
end
|
248
260
|
|
249
261
|
context '#merge!' do
|
250
|
-
let(:collection){ collection = Occi::Collection.new
|
262
|
+
let(:collection){ collection = Occi::Collection.new
|
251
263
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
252
264
|
collection.mixins << "http://example.com/occi/tags#my_mixin"
|
253
265
|
collection.actions << "http://schemas.ogf.org/occi/infrastructure/compute/action#start"
|
@@ -327,7 +339,7 @@ module Occi
|
|
327
339
|
it 'kept the correct number of mixins' do
|
328
340
|
expect(coll2.mixins.count).to eql 1
|
329
341
|
end
|
330
|
-
|
342
|
+
|
331
343
|
it 'kept the correct number of actions' do
|
332
344
|
expect(coll2.actions.count).to eql 1
|
333
345
|
end
|
@@ -500,7 +512,7 @@ module Occi
|
|
500
512
|
it 'kept the correct number of mixins' do
|
501
513
|
expect(coll2.mixins.count).to eql 2
|
502
514
|
end
|
503
|
-
|
515
|
+
|
504
516
|
it 'kept the correct number of actions' do
|
505
517
|
expect(coll2.actions.count).to eql 2
|
506
518
|
end
|
@@ -528,7 +540,7 @@ module Occi
|
|
528
540
|
end
|
529
541
|
context '#intersect!' do
|
530
542
|
let(:collection){
|
531
|
-
collection = Occi::Collection.new
|
543
|
+
collection = Occi::Collection.new
|
532
544
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
533
545
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#network"
|
534
546
|
collection.mixins << "http://example.com/occi/tags#my_mixin"
|
@@ -634,7 +646,7 @@ module Occi
|
|
634
646
|
it 'kept the correct number of mixins' do
|
635
647
|
expect(coll2.mixins.count).to eql 2
|
636
648
|
end
|
637
|
-
|
649
|
+
|
638
650
|
it 'kept the correct number of actions' do
|
639
651
|
expect(coll2.actions.count).to eql 2
|
640
652
|
end
|
@@ -652,7 +664,7 @@ module Occi
|
|
652
664
|
context 'collections with no intersection' do
|
653
665
|
let(:action){ Occi::Core::Action.new scheme='http://schemas.ogf.org/occi/core/entity/action#', term='testaction', title='testaction action' }
|
654
666
|
let(:uniq1) {
|
655
|
-
uniq1 = Occi::Collection.new
|
667
|
+
uniq1 = Occi::Collection.new
|
656
668
|
uniq1.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
657
669
|
uniq1.mixins << "http://example.com/occi/tags#my_mixin"
|
658
670
|
uniq1.actions << "http://schemas.ogf.org/occi/infrastructure/compute/action#start"
|
@@ -686,14 +698,14 @@ module Occi
|
|
686
698
|
|
687
699
|
it 'works with first collection empty' do
|
688
700
|
empty = Occi::Collection.new
|
689
|
-
|
701
|
+
|
690
702
|
uniq1.intersect!(empty)
|
691
703
|
expect(empty.empty?).to eql true
|
692
704
|
end
|
693
705
|
|
694
706
|
it 'works with second collection empty' do
|
695
707
|
empty = Occi::Collection.new
|
696
|
-
|
708
|
+
|
697
709
|
empty.intersect!(uniq2)
|
698
710
|
expect(empty.empty?).to eql true
|
699
711
|
end
|
@@ -701,7 +713,7 @@ module Occi
|
|
701
713
|
end
|
702
714
|
|
703
715
|
context '#get_by_...' do
|
704
|
-
let(:collection){ collection = Occi::Collection.new
|
716
|
+
let(:collection){ collection = Occi::Collection.new
|
705
717
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
706
718
|
collection.mixins << "http://example.com/occi/tags#my_mixin"
|
707
719
|
collection.actions << "http://schemas.ogf.org/occi/infrastructure/compute/action#start"
|
@@ -798,15 +810,15 @@ module Occi
|
|
798
810
|
collection.resources << Occi::Core::Resource.new
|
799
811
|
collection.links << Occi::Core::Link.new
|
800
812
|
expected = "{\"actions\":[{\"scheme\":\"http://schemas.ogf.org/occi/infrastructure/compute/action#\",\"term\":\"start\",\"attributes\":{}}],\"kinds\":[{\"parent\":\"http://schemas.ogf.org/occi/core#resource\",\"related\":[\"http://schemas.ogf.org/occi/core#resource\"],\"actions\":[\"http://schemas.ogf.org/occi/infrastructure/compute/action#start\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#stop\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#restart\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\"],\"location\":\"/compute/\",\"scheme\":\"http://schemas.ogf.org/occi/infrastructure#\",\"term\":\"compute\",\"title\":\"compute resource\",\"attributes\":{\"occi\":{\"core\":{\"id\":{\"type\":\"string\",\"required\":false,\"mutable\":false,\"pattern\":\"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\"},\"title\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"summary\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"}},\"compute\":{\"architecture\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\"x86|x64\"},\"cores\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"hostname\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\"(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*\"},\"memory\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"speed\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"state\":{\"default\":\"inactive\",\"type\":\"string\",\"required\":false,\"mutable\":false,\"pattern\":\"inactive|active|suspended|error\"}}}}}],\"links\":[{\"kind\":\"http://schemas.ogf.org/occi/core#link\",\"attributes\":{\"occi\":{\"core\":{\"id\":\"#{collection.links.first.id}\"}}},\"id\":\"#{collection.links.first.id}\",\"rel\":\"http://schemas.ogf.org/occi/core#link\"}],\"mixins\":[{\"location\":\"/mixin/my_mixin/\",\"scheme\":\"http://example.com/occi/tags#\",\"term\":\"my_mixin\",\"attributes\":{}}],\"resources\":[{\"kind\":\"http://schemas.ogf.org/occi/core#resource\",\"attributes\":{\"occi\":{\"core\":{\"id\":\"#{collection.resources.first.id}\"}}},\"id\":\"#{collection.resources.first.id}\"}]}"
|
801
|
-
|
813
|
+
|
802
814
|
hash=Hashie::Mash.new(JSON.parse(expected))
|
803
|
-
expect(collection.as_json).to eql(hash)
|
815
|
+
expect(collection.as_json).to eql(hash)
|
804
816
|
end
|
805
817
|
|
806
818
|
it 'renders JSON for an empty collection' do
|
807
819
|
collection = Occi::Collection.new
|
808
820
|
hash=Hashie::Mash.new
|
809
|
-
expect(collection.as_json).to eql(hash)
|
821
|
+
expect(collection.as_json).to eql(hash)
|
810
822
|
end
|
811
823
|
|
812
824
|
it 'renders JSON for a collection with no resources' do
|
@@ -817,9 +829,9 @@ module Occi
|
|
817
829
|
collection.action = Occi::Core::ActionInstance.new
|
818
830
|
collection.links << Occi::Core::Link.new
|
819
831
|
expected = "{\"actions\":[{\"scheme\":\"http://schemas.ogf.org/occi/infrastructure/compute/action#\",\"term\":\"start\",\"attributes\":{}}],\"kinds\":[{\"parent\":\"http://schemas.ogf.org/occi/core#resource\",\"related\":[\"http://schemas.ogf.org/occi/core#resource\"],\"actions\":[\"http://schemas.ogf.org/occi/infrastructure/compute/action#start\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#stop\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#restart\",\"http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\"],\"location\":\"/compute/\",\"scheme\":\"http://schemas.ogf.org/occi/infrastructure#\",\"term\":\"compute\",\"title\":\"compute resource\",\"attributes\":{\"occi\":{\"core\":{\"id\":{\"type\":\"string\",\"required\":false,\"mutable\":false,\"pattern\":\"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\"},\"title\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"summary\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"}},\"compute\":{\"architecture\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\"x86|x64\"},\"cores\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"hostname\":{\"type\":\"string\",\"required\":false,\"mutable\":true,\"pattern\":\"(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*\"},\"memory\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"speed\":{\"type\":\"number\",\"required\":false,\"mutable\":true,\"pattern\":\".*\"},\"state\":{\"default\":\"inactive\",\"type\":\"string\",\"required\":false,\"mutable\":false,\"pattern\":\"inactive|active|suspended|error\"}}}}}],\"links\":[{\"kind\":\"http://schemas.ogf.org/occi/core#link\",\"attributes\":{\"occi\":{\"core\":{\"id\":\"#{collection.links.first.id}\"}}},\"id\":\"#{collection.links.first.id}\",\"rel\":\"http://schemas.ogf.org/occi/core#link\"}],\"mixins\":[{\"location\":\"/mixin/my_mixin/\",\"scheme\":\"http://example.com/occi/tags#\",\"term\":\"my_mixin\",\"attributes\":{}}]}"
|
820
|
-
|
832
|
+
|
821
833
|
hash=Hashie::Mash.new(JSON.parse(expected))
|
822
|
-
expect(collection.as_json).to eql(hash)
|
834
|
+
expect(collection.as_json).to eql(hash)
|
823
835
|
end
|
824
836
|
end
|
825
837
|
|
@@ -833,7 +845,7 @@ module Occi
|
|
833
845
|
collection.resources << Occi::Core::Resource.new
|
834
846
|
collection.links << Occi::Core::Link.new
|
835
847
|
|
836
|
-
expected = "Category: compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";title=\"compute resource\";rel=\"http://schemas.ogf.org/occi/core#resource\";location=\"/compute/\";attributes=\"occi.core.id{immutable} occi.core.title occi.core.summary occi.compute.architecture occi.compute.cores occi.compute.hostname occi.compute.memory occi.compute.speed occi.compute.state{immutable}\";actions=\"http://schemas.ogf.org/occi/infrastructure/compute/action#start http://schemas.ogf.org/occi/infrastructure/compute/action#stop http://schemas.ogf.org/occi/infrastructure/compute/action#restart http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\"\nCategory: my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\";location=\"/mixin/my_mixin/\"\nCategory: start;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute/action#\";class=\"action\"\nCategory: resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.resources.first.id}\"Link: <>;rel=\"http://schemas.ogf.org/occi/core#link\";self=\"/link/#{collection.links.first.id}\";category=\"http://schemas.ogf.org/occi/core#link\";occi.core.id=\"#{collection.links.first.id}\"Category: action_instance;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"action\""
|
848
|
+
expected = "Category: compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";title=\"compute resource\";rel=\"http://schemas.ogf.org/occi/core#resource\";location=\"/compute/\";attributes=\"occi.core.id{immutable} occi.core.title occi.core.summary occi.compute.architecture occi.compute.cores occi.compute.hostname occi.compute.memory occi.compute.speed occi.compute.state{immutable}\";actions=\"http://schemas.ogf.org/occi/infrastructure/compute/action#start http://schemas.ogf.org/occi/infrastructure/compute/action#stop http://schemas.ogf.org/occi/infrastructure/compute/action#restart http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\"\nCategory: my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\";location=\"/mixin/my_mixin/\"\nCategory: start;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute/action#\";class=\"action\"\nCategory: resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\";title=\"resource\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.resources.first.id}\"Link: <>;rel=\"http://schemas.ogf.org/occi/core#link\";self=\"/link/#{collection.links.first.id}\";category=\"http://schemas.ogf.org/occi/core#link\";occi.core.id=\"#{collection.links.first.id}\"Category: action_instance;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"action\""
|
837
849
|
expect(collection.to_text).to eql(expected)
|
838
850
|
end
|
839
851
|
|
@@ -871,13 +883,13 @@ module Occi
|
|
871
883
|
|
872
884
|
it 'renders text correctly, resources only' do
|
873
885
|
collection.resources << Occi::Core::Resource.new
|
874
|
-
expected = "Category: resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.resources.first.id}\""
|
886
|
+
expected = "Category: resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\";title=\"resource\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.resources.first.id}\""
|
875
887
|
expect(collection.to_text).to eql(expected)
|
876
888
|
end
|
877
889
|
|
878
890
|
it 'renders text correctly, links only' do
|
879
891
|
collection.links << Occi::Core::Link.new
|
880
|
-
expected = "Category: link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.links.first.id}\""
|
892
|
+
expected = "Category: link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\";title=\"link\"\nX-OCCI-Attribute: occi.core.id=\"#{collection.links.first.id}\""
|
881
893
|
expect(collection.to_text).to eql(expected)
|
882
894
|
end
|
883
895
|
|
@@ -894,7 +906,7 @@ module Occi
|
|
894
906
|
collection.links << Occi::Core::Link.new
|
895
907
|
|
896
908
|
expected=Hashie::Mash.new
|
897
|
-
expected["Category"] = "compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\",my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\",start;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute/action#\";class=\"action\",resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\",action_instance;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"action\""
|
909
|
+
expected["Category"] = "compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";title=\"compute resource\";rel=\"http://schemas.ogf.org/occi/core#resource\";location=\"/compute/\";attributes=\"occi.core.id{immutable} occi.core.title occi.core.summary occi.compute.architecture occi.compute.cores occi.compute.hostname occi.compute.memory occi.compute.speed occi.compute.state{immutable}\";actions=\"http://schemas.ogf.org/occi/infrastructure/compute/action#start http://schemas.ogf.org/occi/infrastructure/compute/action#stop http://schemas.ogf.org/occi/infrastructure/compute/action#restart http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\",my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\";location=\"/mixin/my_mixin/\",start;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute/action#\";class=\"action\",resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\";title=\"resource\",action_instance;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"action\""
|
898
910
|
expected["Link"] = "<>;rel=\"http://schemas.ogf.org/occi/core#link\";self=\"/link/#{collection.links.first.id}\";category=\"http://schemas.ogf.org/occi/core#link\";occi.core.id=\"#{collection.links.first.id}\""
|
899
911
|
expected["X-OCCI-Attribute"] = "occi.core.id=\"#{collection.resources.first.id}\""
|
900
912
|
expect(collection.to_header).to eql(expected)
|
@@ -908,14 +920,14 @@ module Occi
|
|
908
920
|
it 'renders text correctly, kinds only' do
|
909
921
|
collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
|
910
922
|
expected=Hashie::Mash.new
|
911
|
-
expected["Category"] = "compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\""
|
923
|
+
expected["Category"] = "compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";title=\"compute resource\";rel=\"http://schemas.ogf.org/occi/core#resource\";location=\"/compute/\";attributes=\"occi.core.id{immutable} occi.core.title occi.core.summary occi.compute.architecture occi.compute.cores occi.compute.hostname occi.compute.memory occi.compute.speed occi.compute.state{immutable}\";actions=\"http://schemas.ogf.org/occi/infrastructure/compute/action#start http://schemas.ogf.org/occi/infrastructure/compute/action#stop http://schemas.ogf.org/occi/infrastructure/compute/action#restart http://schemas.ogf.org/occi/infrastructure/compute/action#suspend\""
|
912
924
|
expect(collection.to_header).to eql(expected)
|
913
925
|
end
|
914
926
|
|
915
927
|
it 'renders text correctly, mixins only' do
|
916
928
|
collection.mixins << "http://example.com/occi/tags#my_mixin"
|
917
929
|
expected=Hashie::Mash.new
|
918
|
-
expected["Category"] = "my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\""
|
930
|
+
expected["Category"] = "my_mixin;scheme=\"http://example.com/occi/tags#\";class=\"mixin\";location=\"/mixin/my_mixin/\""
|
919
931
|
expect(collection.to_header).to eql(expected)
|
920
932
|
end
|
921
933
|
|
@@ -939,7 +951,7 @@ module Occi
|
|
939
951
|
it 'renders text correctly, resources only' do
|
940
952
|
collection.resources << Occi::Core::Resource.new
|
941
953
|
expected=Hashie::Mash.new
|
942
|
-
expected["Category"] = "resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\""
|
954
|
+
expected["Category"] = "resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\";title=\"resource\""
|
943
955
|
expected["X-OCCI-Attribute"] = "occi.core.id=\"#{collection.resources.first.id}\""
|
944
956
|
expect(collection.to_header).to eql(expected)
|
945
957
|
end
|
@@ -947,7 +959,7 @@ module Occi
|
|
947
959
|
it 'renders text correctly, links only' do
|
948
960
|
collection.links << Occi::Core::Link.new
|
949
961
|
expected=Hashie::Mash.new
|
950
|
-
expected["Category"] = "link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\""
|
962
|
+
expected["Category"] = "link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\";title=\"link\""
|
951
963
|
expected["X-OCCI-Attribute"] = "occi.core.id=\"#{collection.links.first.id}\""
|
952
964
|
expect(collection.to_header).to eql(expected)
|
953
965
|
end
|
@@ -974,7 +986,7 @@ module Occi
|
|
974
986
|
expected['c'] = 'c'
|
975
987
|
expect(mash1).to eql expected
|
976
988
|
end
|
977
|
-
|
989
|
+
|
978
990
|
it 'merges two mashes correctly with custom separator' do
|
979
991
|
Occi::Collection.header_merge(mash1, second, ' : ')
|
980
992
|
|
@@ -984,7 +996,7 @@ module Occi
|
|
984
996
|
expected['c'] = 'c'
|
985
997
|
expect(mash1).to eql expected
|
986
998
|
end
|
987
|
-
|
999
|
+
|
988
1000
|
end
|
989
1001
|
|
990
1002
|
end
|
@@ -15,70 +15,86 @@ module Occi
|
|
15
15
|
it 'is created empty' do
|
16
16
|
expect(entities.count).to eq 0
|
17
17
|
end
|
18
|
+
|
18
19
|
it 'gets entity Nos. right, 1' do
|
19
20
|
entities << entity1
|
20
21
|
expect(entities.count).to eq 1
|
21
22
|
end
|
23
|
+
|
22
24
|
it 'gets entity Nos. right, 2' do
|
23
25
|
entities << entity1
|
24
26
|
entities << entity2
|
25
27
|
expect(entities.count).to eq 2
|
26
28
|
end
|
29
|
+
|
27
30
|
it 'gets correctly-typed elements' do
|
28
31
|
entities << entity1
|
29
32
|
entities << entity2
|
30
33
|
expect(entities.first).to be_an_instance_of(Occi::Core::Entity)
|
31
34
|
end
|
35
|
+
|
32
36
|
end
|
33
37
|
|
34
38
|
context '#model' do
|
39
|
+
|
35
40
|
it 'has no model by default' do
|
36
41
|
expect(entities.model).to be nil
|
37
42
|
end
|
43
|
+
|
38
44
|
it 'can be assigned model' do
|
39
45
|
modl = Occi::Model.new
|
40
46
|
entities.model = modl
|
41
47
|
expect(entities.model).to eql modl
|
42
48
|
end
|
49
|
+
|
43
50
|
it 'uses the assigned model for new members' do
|
44
51
|
modl = Occi::Model.new
|
45
52
|
entities.model = modl
|
46
53
|
entities << entity1
|
47
54
|
expect(entities.first.model).to eql modl
|
48
55
|
end
|
56
|
+
|
49
57
|
it 'uses the assigned model for existing members' do
|
50
58
|
entities << entity1
|
51
59
|
modl = Occi::Model.new
|
52
60
|
entities.model = modl
|
53
61
|
expect(entities.first.model).to eql modl
|
54
62
|
end
|
63
|
+
|
55
64
|
it 'does not use unassigned model' do
|
56
65
|
modl = Occi::Model.new
|
57
66
|
entities << entity1
|
58
67
|
expect(entities.first.model).to_not eql modl
|
59
68
|
end
|
69
|
+
|
60
70
|
end
|
61
71
|
|
62
72
|
context '#create' do
|
73
|
+
|
63
74
|
it 'creates a new element' do
|
64
75
|
entities.create
|
65
76
|
expect(entities.first).to be_instance_of(Occi::Core::Entity)
|
66
77
|
end
|
78
|
+
|
67
79
|
it 'accepts argument' do
|
68
80
|
entities.create 'http://example.com/testnamespace#test'
|
69
81
|
expect(entities.first).to be_kind_of 'Com::Example::Testnamespace::Test'.constantize
|
70
82
|
end
|
83
|
+
|
71
84
|
end
|
72
85
|
|
73
86
|
context '#join' do
|
87
|
+
|
74
88
|
it 'joins elements correctly' do
|
75
89
|
entities << entity1
|
76
90
|
entities << entity2
|
77
91
|
expect(entities.join('|')).to eq '/entity/e1testid|/entity2/e2testid'
|
78
92
|
end
|
93
|
+
|
79
94
|
end
|
80
95
|
|
81
96
|
context '#as_json' do
|
97
|
+
|
82
98
|
it 'renders elements with various attributes' do
|
83
99
|
entity2.actions << testaction
|
84
100
|
entities << entity1
|
@@ -90,6 +106,54 @@ module Occi
|
|
90
106
|
expected << hash2
|
91
107
|
expect(entities.as_json).to eql expected
|
92
108
|
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
context '#check' do
|
113
|
+
|
114
|
+
let(:attr_w_defaults) do
|
115
|
+
{ :type => 'string',
|
116
|
+
:pattern => '[adefltuv]+',
|
117
|
+
:default => 'defaultvalue',
|
118
|
+
:mutable => true }
|
119
|
+
end
|
120
|
+
let(:model) do
|
121
|
+
model = Occi::Model.new
|
122
|
+
model.kinds.first.attributes['string_attribute'] = attr_w_defaults
|
123
|
+
model
|
124
|
+
end
|
125
|
+
let(:entities_w_defaults) do
|
126
|
+
entities << Occi::Core::Entity.new
|
127
|
+
entities.model = model
|
128
|
+
entities
|
129
|
+
end
|
130
|
+
let(:entities_w_wrong_attrs) do
|
131
|
+
ent1 = Occi::Core::Entity.new
|
132
|
+
ent1.attributes['fake.attr.here'] = 1
|
133
|
+
entities << ent1
|
134
|
+
entities.model = model
|
135
|
+
entities
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'raises an error on undeclared attributes' do
|
139
|
+
expect { entities_w_wrong_attrs.check }.to raise_error
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'passes on an empty collection' do
|
143
|
+
expect { entities.check }.not_to raise_error
|
144
|
+
expect { entities.check(true) }.not_to raise_error
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'does not set attribute defaults by default' do
|
148
|
+
entities_w_defaults.check
|
149
|
+
expect(entities_w_defaults.first.attributes['string_attribute']).to be_blank
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'sets attributes default when requested' do
|
153
|
+
entities_w_defaults.check(true)
|
154
|
+
expect(entities_w_defaults.first.attributes['string_attribute']).to eq 'defaultvalue'
|
155
|
+
end
|
156
|
+
|
93
157
|
end
|
94
158
|
end
|
95
159
|
end
|
@@ -59,7 +59,7 @@ module Occi
|
|
59
59
|
end
|
60
60
|
|
61
61
|
context '#mixins' do
|
62
|
-
let(:mixin){ 'http://example.com/mynamespace#mymixin' }
|
62
|
+
let(:mixin){ 'http://example.com/mynamespace#mymixin' }
|
63
63
|
|
64
64
|
it "converts mixin type identifiers to objects if a mixin is added to the entities mixins" do
|
65
65
|
entity.mixins << mixin
|
@@ -91,9 +91,9 @@ module Occi
|
|
91
91
|
Occi::Settings['verify_attribute_pattern']=true
|
92
92
|
expect{ entity.id = 'id with spaces' }.to raise_error Occi::Errors::AttributeTypeError
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
context '#location' do
|
98
98
|
it 'can be set and read' do
|
99
99
|
entity.location = 'TestLoc'
|
@@ -150,7 +150,7 @@ module Occi
|
|
150
150
|
|
151
151
|
context '#to_text' do
|
152
152
|
it 'renders fresh instance in text correctly' do
|
153
|
-
expected = %Q|Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/"
|
153
|
+
expected = %Q|Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/";title="entity"
|
154
154
|
X-OCCI-Attribute: occi.core.id="baf1"|
|
155
155
|
expect(entity.to_text).to eq(expected)
|
156
156
|
end
|
@@ -161,8 +161,8 @@ X-OCCI-Attribute: occi.core.id="baf1"|
|
|
161
161
|
entity.location = '/TestLoc/1'
|
162
162
|
entity.mixins << 'http://example.com/mynamespace#mymixin'
|
163
163
|
|
164
|
-
expected = %Q|Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/"
|
165
|
-
Category: mymixin;scheme="http://example.com/mynamespace#";class="mixin";location="/mixin/mymixin/"
|
164
|
+
expected = %Q|Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/";title="entity"
|
165
|
+
Category: mymixin;scheme="http://example.com/mynamespace#";class="mixin";location="/mixin/mymixin/";title=""
|
166
166
|
X-OCCI-Attribute: occi.core.id="baf1"
|
167
167
|
X-OCCI-Attribute: occi.core.title="TestTitle"
|
168
168
|
Link: </TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entity/action#testaction"|
|
@@ -173,7 +173,7 @@ Link: </TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entit
|
|
173
173
|
context '#to_header' do
|
174
174
|
it 'renders fresh instance in HTTP Header correctly' do
|
175
175
|
expected = Hashie::Mash.new
|
176
|
-
expected['Category'] = 'entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/"'
|
176
|
+
expected['Category'] = 'entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/";title="entity"'
|
177
177
|
expected['X-OCCI-Attribute'] = 'occi.core.id="baf1"'
|
178
178
|
|
179
179
|
expect(entity.to_header).to eql(expected)
|
@@ -186,7 +186,7 @@ Link: </TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entit
|
|
186
186
|
entity.mixins << 'http://example.com/mynamespace#mymixin'
|
187
187
|
|
188
188
|
expected = Hashie::Mash.new
|
189
|
-
expected['Category'] = 'entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/",mymixin;scheme="http://example.com/mynamespace#";class="mixin";location="/mixin/mymixin/"'
|
189
|
+
expected['Category'] = 'entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/entity/";title="entity",mymixin;scheme="http://example.com/mynamespace#";class="mixin";location="/mixin/mymixin/";title=""'
|
190
190
|
expected['X-OCCI-Attribute'] = 'occi.core.id="baf1",occi.core.title="TestTitle"'
|
191
191
|
expected['Link'] = '</TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entity/action#testaction"'
|
192
192
|
|
@@ -245,9 +245,9 @@ Link: </TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entit
|
|
245
245
|
entity.model = model
|
246
246
|
entity.mixins << mixin
|
247
247
|
entity }
|
248
|
-
|
249
|
-
|
250
|
-
before(:each){ Occi::Settings['compatibility']=false
|
248
|
+
|
249
|
+
|
250
|
+
before(:each){ Occi::Settings['compatibility']=false
|
251
251
|
Occi::Settings['verify_attribute_pattern']=true }
|
252
252
|
after(:each) { Occi::Settings.reload! }
|
253
253
|
|
data/spec/occi/parser_spec.rb
CHANGED
@@ -39,25 +39,32 @@ module Occi
|
|
39
39
|
|
40
40
|
context 'resources from OCCI messages with text/occi MIME type' do
|
41
41
|
let(:rendered_collection){ collection.to_header }
|
42
|
+
let(:real_world_example_model) {
|
43
|
+
{"category"=>["entity;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/entity/\",resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\",link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\",compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/compute/\",storage;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/storage/\",network;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/network/\",networkinterface;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/networkinterface/\",storagelink;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/storagelink/\",console;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute#\";class=\"kind\";location=\"/console/\",resource_tpl;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/resource_tpl/\",os_tpl;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/os_tpl/\",ipnetwork;scheme=\"http://schemas.ogf.org/occi/infrastructure/network#\";class=\"mixin\";location=\"/mixin/ipnetwork/\",ipnetworkinterface;scheme=\"http://schemas.ogf.org/occi/infrastructure/networkinterface#\";class=\"mixin\";location=\"/mixin/ipnetworkinterface/\",networkinterface;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/networkinterface/\",compute;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/compute/\",storage;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/storage/\",public_key;scheme=\"http://schemas.openstack.org/instance/credentials#\";class=\"mixin\";location=\"/mixin/public_key/\",user_data;scheme=\"http://schemas.openstack.org/compute/instance#\";class=\"mixin\";location=\"/mixin/user_data/\",network;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/network/\",storagelink;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/storagelink/\",uuid_monitoring_20;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_monitoring_20/\",uuid_egi_sl6goldenimage_cesnet_50;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_sl6goldenimage_cesnet_50/\",uuid_generic_vm_54;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_generic_vm_54/\",uuid_octave_55;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_octave_55/\",uuid_r_56;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_r_56/\",uuid_egi_compss_cesnet_57;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_compss_cesnet_57/\",uuid_esa_sl64_cesnet_58;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_esa_sl64_cesnet_58/\",uuid_generic_www_60;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_generic_www_60/\",uuid_egi_compss_62;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_compss_62/\",uuid_egi_test_compss_69;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_test_compss_69/\",uuid_genericcloud_debian_7_0_x86_64_0001_cloud_dukan_71;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_genericcloud_debian_7_0_x86_64_0001_cloud_dukan_71/\",uuid_genericcloud_ubuntu_12_04_lts_x86_64_0001_cloud_dukan_72;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_genericcloud_ubuntu_12_04_lts_x86_64_0001_cloud_dukan_72/\",uuid_genericcloud_scilinux_6_5_x86_64_0001_cloud_dukan_73;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_genericcloud_scilinux_6_5_x86_64_0001_cloud_dukan_73/\",uuid_egi_compss_debian_7_0_x86_64_0001_cloud_dukan_74;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_compss_debian_7_0_x86_64_0001_cloud_dukan_74/\",extra_large;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/extra_large/\",medium;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/medium/\",small;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/small/\",large;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/large/\""]}
|
44
|
+
}
|
42
45
|
|
43
46
|
it 'parses self-generated collection with resources' do
|
44
|
-
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql
|
47
|
+
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
|
45
48
|
end
|
46
49
|
|
47
50
|
it 'parses self-generated collection with added attributes' do
|
48
51
|
resource.id = UUIDTools::UUID.random_create.to_s
|
49
52
|
resource.title = 'title'
|
50
|
-
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql
|
53
|
+
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
|
51
54
|
end
|
52
55
|
|
53
56
|
it 'parses self-generated collection with added mixin' do
|
54
57
|
resource.mixins << Occi::Core::Mixin.new
|
55
|
-
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql
|
58
|
+
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
|
56
59
|
end
|
57
60
|
|
58
61
|
it 'parses self-generated collection with added link' do
|
59
62
|
collection << link
|
60
|
-
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql
|
63
|
+
expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'parses a real-world example of the OCCI model' do
|
67
|
+
expect(Occi::Parser.parse('text/occi', '', true, Occi::Core::Resource, real_world_example_model).to_header.to_hash).to eql({ 'Category' => real_world_example_model['category'].first })
|
61
68
|
end
|
62
69
|
end
|
63
70
|
|
@@ -161,13 +168,13 @@ module Occi
|
|
161
168
|
locations_text = "http://example.com:8090/a/b/vm1\nhttp://example.com:8090/a/b/vm2"
|
162
169
|
location = Occi::Parser.locations("text/uri-list", locations_text, {})
|
163
170
|
expect(location).to eql expected
|
164
|
-
end
|
171
|
+
end
|
165
172
|
|
166
173
|
it 'parses multiple locations from plain text' do
|
167
174
|
locations_text = "X-OCCI-Location: http://example.com:8090/a/b/vm1\nX-OCCI-Location: http://example.com:8090/a/b/vm2"
|
168
175
|
location = Occi::Parser.locations("text/plain", locations_text, {})
|
169
176
|
expect(location).to eql expected
|
170
|
-
end
|
177
|
+
end
|
171
178
|
|
172
179
|
it 'copes with unmeaningful input' do
|
173
180
|
location = Occi::Parser.locations("nonexistent", "", {})
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: occi-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Feldhaus
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|