occi-core 4.2.14 → 4.2.15

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 97bfbcd8727b44c08e826dbbe76a6f7c05034a5c
4
- data.tar.gz: b549d11e985dc2ef189b17fe6e51d02b26fdb75b
3
+ metadata.gz: 3e3409b60570656c2f8e0b3ec71f6d55ae1ecc82
4
+ data.tar.gz: 6de77b6298980b43be27ee89b727e4ba48149141
5
5
  SHA512:
6
- metadata.gz: b48367de96eccf0689868a85e72fb3eadc0576f2bbc7e9cf3248538aa5a21e943cc66e6aeeb3dd679be635b6613453df410330efb731aa92606e649c52f3ba75
7
- data.tar.gz: d735235babe4e5405902d583504957ee15a0235037566f7adb4cc152aa74da33c8525236b92c723687951541da5480031c1787a2e4a6f3d7e70a6336552e3164
6
+ metadata.gz: c9f6afb503d3d7f42be2d6630a3ffe2dfb493228072c8afe48a30d70468ace5b0b1ed93869f36ad651a64753e79dae586687afe78e011935385f5ca45b63cd14
7
+ data.tar.gz: 41456629fbb35cfc23d881a7b132c719466c9991cde17fd94b6ad7ef60f7afc34e49f218bcc601e4f8a6d08510ba94f88d5e555f564376c24b6e822ffbaad20d
@@ -130,7 +130,7 @@ module Occi
130
130
  # @return [String]
131
131
  def to_string
132
132
  attributes = ';'
133
- attributes << to_header.gsub(',', ';')
133
+ attributes << to_array.join(';')
134
134
 
135
135
  attributes == ';' ? '' : attributes
136
136
  end
@@ -159,9 +159,10 @@ module Occi
159
159
  text
160
160
  end
161
161
 
162
- # @return [String] of attributes put in an array and then concatenated into a string
163
- def to_header
162
+ # @return [Array] of attributes put in an array
163
+ def to_array
164
164
  attributes = []
165
+
165
166
  names.each_pair do |name, value|
166
167
  # TODO: find a better way to skip properties
167
168
  next if name.include? '._'
@@ -175,7 +176,12 @@ module Occi
175
176
  end
176
177
  end
177
178
 
178
- attributes.join(',')
179
+ attributes
180
+ end
181
+
182
+ # @return [String] of attributes put in an array and then concatenated into a string
183
+ def to_header
184
+ to_array.join(',')
179
185
  end
180
186
 
181
187
  def to_json(*a)
data/lib/occi/parser.rb CHANGED
@@ -114,9 +114,19 @@ module Occi
114
114
  def headers_to_arys(header)
115
115
  # remove the HTTP_ prefix if present and capitalize keys
116
116
  header = Hash[header.map { |k, v| [k.gsub('HTTP_', '').capitalize, v] }]
117
- header['X-OCCI-Location'] = header['X-occi-location'] if header['X-occi-location']
118
- header['X-OCCI-Attribute'] = header['X-occi-attribute'] if header['X-occi-attribute']
119
117
 
118
+ # normalize different header-passing mechanisms and representations
119
+ if header['X-OCCI-Location'].blank?
120
+ header['X-OCCI-Location'] = header['X_occi_location'] unless header['X_occi_location'].blank?
121
+ header['X-OCCI-Location'] = header['X-occi-location'] unless header['X-occi-location'].blank?
122
+ end
123
+
124
+ if header['X-OCCI-Attribute'].blank?
125
+ header['X-OCCI-Attribute'] = header['X_occi_attribute'] unless header['X_occi_attribute'].blank?
126
+ header['X-OCCI-Attribute'] = header['X-occi-attribute'] unless header['X-occi-attribute'].blank?
127
+ end
128
+
129
+ # clean-up
120
130
  header.delete_if { |k, v| v.blank? || !OCCI_HEADERS.include?(k) }
121
131
 
122
132
  header = header.map do |k, v|
@@ -125,7 +135,7 @@ module Occi
125
135
  v.to_s.split(',').collect { |w| "#{k}: #{w}".strip }
126
136
  end
127
137
 
128
- header.flatten
138
+ header.flatten.sort
129
139
  end
130
140
 
131
141
  end
data/lib/occi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Occi
2
- VERSION = "4.2.14" unless defined?(::Occi::VERSION)
2
+ VERSION = "4.2.15" unless defined?(::Occi::VERSION)
3
3
  end
@@ -41,7 +41,7 @@ module Occi
41
41
  end
42
42
 
43
43
  it 'does not fail without attributes' do
44
- expect { Occi::Core::ActionInstance.new action, nil }.not_to raise_error(ArgumentError)
44
+ expect { Occi::Core::ActionInstance.new action, nil }.not_to raise_error
45
45
  end
46
46
 
47
47
  it 'does not fail with an Occi::Core::Action instance' do
@@ -61,7 +61,7 @@ module Occi
61
61
  end
62
62
 
63
63
  it 'does not fail with un-convertable attribute values' do
64
- expect { Occi::Core::ActionInstance.new action, attributes_unconvertable}.not_to raise_error(ArgumentError)
64
+ expect { Occi::Core::ActionInstance.new action, attributes_unconvertable}.not_to raise_error
65
65
  end
66
66
  end
67
67
 
@@ -292,14 +292,14 @@ X-OCCI-Attribute: org.opennebula.network.id=1|
292
292
  context '#empty?' do
293
293
 
294
294
  it 'returns false for a new instance with defaults' do
295
- expect(ai.empty?).to be_false
295
+ expect(ai.empty?).to be false
296
296
  end
297
297
 
298
298
  it 'returns true for an instance without an action' do
299
299
  ai_changed = ai.clone
300
300
  ai_changed.action = nil
301
301
 
302
- expect(ai_changed.empty?).to be_true
302
+ expect(ai_changed.empty?).to be true
303
303
  end
304
304
 
305
305
  it 'returns true for an instance with an empty action' do
@@ -307,7 +307,7 @@ X-OCCI-Attribute: org.opennebula.network.id=1|
307
307
  ai_changed.action = Occi::Core::Action.new
308
308
  ai_changed.action.term = nil
309
309
 
310
- expect(ai_changed.empty?).to be_true
310
+ expect(ai_changed.empty?).to be true
311
311
  end
312
312
 
313
313
  end
@@ -19,7 +19,7 @@ module Occi
19
19
  end
20
20
 
21
21
  it 'accepts keys with underscores in other positions' do
22
- expect{ attributes['t_est']={} }.to_not raise_error(Occi::Errors::AttributeNameInvalidError)
22
+ expect{ attributes['t_est']={} }.to_not raise_error
23
23
  end
24
24
  end
25
25
 
@@ -90,7 +90,7 @@ module Occi
90
90
  it 'matches a clone' do
91
91
  expect(attrs==clone).to eql true
92
92
  end
93
-
93
+
94
94
  it 'matches a new instance with the same content' do
95
95
  expect(attrs==newattrs).to eql true
96
96
  end
@@ -112,7 +112,7 @@ module Occi
112
112
  it 'matches a clone' do
113
113
  expect(attrs.eql?(clone)).to eql true
114
114
  end
115
-
115
+
116
116
  it 'matches a new instance with the same content' do
117
117
  expect(attrs.eql?(newattrs)).to eql true
118
118
  end
@@ -171,7 +171,7 @@ module Occi
171
171
 
172
172
 
173
173
  context 'rendering' do
174
- let(:attrs){ attrs = Occi::Core::Attributes.new
174
+ let(:attrs){ attrs = Occi::Core::Attributes.new
175
175
  attrs['numbertype'] = { :type => 'number', :default => 42, :mutable => true, :pattern => '^[0-9]+' }
176
176
  attrs['stringtype'] = { :type => 'string', :pattern => '[adefltuv]+', :default => 'defaultvalue', :mutable => true }
177
177
  attrs['booleantype'] = { :type => 'boolean', :default => true, :mutable => true}
@@ -227,6 +227,12 @@ module Occi
227
227
  expected = ""
228
228
  expect(empty.to_string).to eql expected
229
229
  end
230
+
231
+ it 'copes with attribute values containing commas' do
232
+ attrs['stringtype'] = "flute,magic"
233
+ expected = ";numbertype=42;stringtype=\"flute,magic\";booleantype=true;booleantypefalse=false;booleantypepattern=true;nest.nested=11;properties=\"prop\";category=\"http://schemas.ogf.org/occi/core#category\";entity=\"/entity/testid\""
234
+ expect(attrs.to_string).to eql expected
235
+ end
230
236
  end
231
237
 
232
238
  context '#to_string_short' do
@@ -278,6 +284,17 @@ module Occi
278
284
  end
279
285
  end
280
286
 
287
+ context '#to_array' do
288
+ it 'renders attributes correctly' do
289
+ expected = ["numbertype=42","stringtype=\"flute\"","booleantype=true","booleantypefalse=false","booleantypepattern=true","nest.nested=11","properties=\"prop\"","category=\"http://schemas.ogf.org/occi/core#category\"","entity=\"/entity/testid\""]
290
+ expect(attrs.to_array).to eql expected
291
+ end
292
+
293
+ it 'copes with empty attributes' do
294
+ expect(empty.to_array).to be_empty
295
+ end
296
+ end
297
+
281
298
  context '#to_json' do
282
299
  it 'renders attributes correctly' do
283
300
  expected = '{"numbertype":42,"stringtype":"flute","booleantype":true,"booleantypefalse":false,"booleantypepattern":true,"nest":{"nested":11},"properties":"prop","category":"http://schemas.ogf.org/occi/core#category","entity":"/entity/testid"}'
@@ -301,7 +318,7 @@ module Occi
301
318
  expected.nest!.nested = 11
302
319
  expected["category"] = "http://schemas.ogf.org/occi/core#category"
303
320
  expected["properties"] = "prop"
304
- expected["entity"] = "/entity/testid"
321
+ expected["entity"] = "/entity/testid"
305
322
 
306
323
  expect(attrs.as_json).to eql expected
307
324
  end
@@ -324,16 +341,16 @@ module Occi
324
341
  :pattern => '^[0-9]+' }
325
342
  defs['stringtype'] = { :type => 'string',
326
343
  :pattern => '[adefltuv]+',
327
- :default => 'defaultvalue',
344
+ :default => 'defaultvalue',
328
345
  :mutable => true }
329
346
  defs['booleantype'] = { :type => 'boolean',
330
- :default => true,
347
+ :default => true,
331
348
  :mutable => true}
332
349
  defs['booleantypefalse'] = { :type => 'boolean', #Regression test
333
- :default => false,
350
+ :default => false,
334
351
  :mutable => true }
335
352
  defs['booleantypepattern'] = { :type => 'boolean',
336
- :default => true,
353
+ :default => true,
337
354
  :mutable => true,
338
355
  :pattern => true }
339
356
  defs['nonmandatory'] = { :type => 'string',
@@ -342,7 +359,7 @@ module Occi
342
359
  defs }
343
360
 
344
361
  context 'unsupported types and attributes' do
345
- before(:each){ Occi::Settings['compatibility']=false
362
+ before(:each){ Occi::Settings['compatibility']=false
346
363
  Occi::Settings['verify_attribute_pattern']=true }
347
364
  after(:each) { Occi::Settings.reload! }
348
365
  it 'refuses undefined attribute' do
@@ -405,7 +422,7 @@ module Occi
405
422
  end
406
423
 
407
424
  context 'defaults' do
408
- before(:each){ Occi::Settings['compatibility']=false
425
+ before(:each){ Occi::Settings['compatibility']=false
409
426
  Occi::Settings['verify_attribute_pattern']=true }
410
427
  after(:each) { Occi::Settings.reload! }
411
428
 
@@ -540,7 +557,7 @@ module Occi
540
557
  attrs['numbertype'] = inattrs['numbertype']
541
558
  expect(attrs).to eql inattrs
542
559
  end
543
-
560
+
544
561
  it 'correctly accepts Occi::Core::Properties' do
545
562
  attrs['properties'] = Occi::Core::Properties.new
546
563
 
@@ -550,7 +567,7 @@ module Occi
550
567
 
551
568
  expect(attrs).to eql expected
552
569
  end
553
-
570
+
554
571
  it 'correctly accepts Hash' do
555
572
  attrs['hash'] = { :type => 'string', :pattern => '.*', :mutable => false, :required => false }
556
573
 
@@ -190,21 +190,21 @@ module Occi
190
190
  context '#empty?' do
191
191
 
192
192
  it 'returns false for a new instance with defaults' do
193
- expect(category.empty?).to be_false
193
+ expect(category.empty?).to be false
194
194
  end
195
195
 
196
196
  it 'returns true for an instance without a term' do
197
197
  cat = category.clone
198
198
  cat.term = nil
199
199
 
200
- expect(cat.empty?).to be_true
200
+ expect(cat.empty?).to be true
201
201
  end
202
202
 
203
203
  it 'returns true for an instance without a scheme' do
204
204
  cat = category.clone
205
205
  cat.scheme = nil
206
206
 
207
- expect(cat.empty?).to be_true
207
+ expect(cat.empty?).to be true
208
208
  end
209
209
 
210
210
  end
@@ -350,21 +350,21 @@ Link: </TestLoc/1?action=testaction>;rel="http://schemas.ogf.org/occi/core/entit
350
350
  context '#empty?' do
351
351
 
352
352
  it 'returns false for a new instance with defaults' do
353
- expect(entity.empty?).to be_false
353
+ expect(entity.empty?).to be false
354
354
  end
355
355
 
356
356
  it 'returns true for an instance without a kind' do
357
357
  ent = entity.clone
358
358
  ent.kind = nil
359
359
 
360
- expect(ent.empty?).to be_true
360
+ expect(ent.empty?).to be true
361
361
  end
362
362
 
363
363
  it 'returns true for an instance without an identifier' do
364
364
  ent = entity.clone
365
365
  ent.id = nil
366
366
 
367
- expect(ent.empty?).to be_true
367
+ expect(ent.empty?).to be true
368
368
  end
369
369
 
370
370
  end
@@ -9,7 +9,7 @@ module Occi
9
9
 
10
10
  context '#link' do
11
11
  it "creates the appropriate No. of links" do
12
- expect(resource.links).to have(1).link
12
+ expect(resource.links.count).to eq 1
13
13
  end
14
14
 
15
15
  it "has the correct kind" do
@@ -17,7 +17,7 @@ module Occi
17
17
  context '#storagelink' do
18
18
  it "creates a single storagelink" do
19
19
  compute.storagelink target
20
- expect(compute.links).to have(1).link
20
+ expect(compute.links.count).to eq 1
21
21
  end
22
22
 
23
23
  it "creates a storagelink to a storage resource" do
@@ -70,7 +70,7 @@ module Occi
70
70
  context '#networkinterface' do
71
71
  it "creates a single networkinterface" do
72
72
  compute.networkinterface target
73
- expect(compute.links).to have(1).link
73
+ expect(compute.links.count).to eq 1
74
74
  end
75
75
 
76
76
  it "creates a networkinterface to a storage resource" do
@@ -33,10 +33,10 @@ module Occi
33
33
  category_string = 'Category: restart;scheme="http://schemas.ogf.org/occi/infrastructure/compute/action#";class="action";title="Restart Compute instance";attributes="method{required} test{immutable}"'
34
34
  category = Occi::Parser::Text.category category_string
35
35
 
36
- expect(category.attributes['method'].required).to be_true
37
- expect(category.attributes['method'].mutable).to be_true
38
- expect(category.attributes['test'].required).to be_false
39
- expect(category.attributes['test'].mutable).to be_false
36
+ expect(category.attributes['method'].required).to be true
37
+ expect(category.attributes['method'].mutable).to be true
38
+ expect(category.attributes['test'].required).to be false
39
+ expect(category.attributes['test'].mutable).to be false
40
40
  end
41
41
 
42
42
  it 'parses attributes correctly' do
@@ -40,7 +40,7 @@ module Occi
40
40
  context 'resources from OCCI messages with text/occi MIME type' do
41
41
  let(:rendered_collection){ collection.to_header }
42
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/\""]}
43
+ {"Category" => "compute;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/compute/\",console;scheme=\"http://schemas.ogf.org/occi/infrastructure/compute#\";class=\"kind\";location=\"/console/\",entity;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/entity/\",link;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/link/\",network;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/network/\",networkinterface;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/networkinterface/\",resource;scheme=\"http://schemas.ogf.org/occi/core#\";class=\"kind\";location=\"/resource/\",storage;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/storage/\",storagelink;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\";location=\"/storagelink/\",compute;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/compute/\",extra_large;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/extra_large/\",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/\",large;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/large/\",medium;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/medium/\",network;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/network/\",networkinterface;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/networkinterface/\",os_tpl;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/os_tpl/\",public_key;scheme=\"http://schemas.openstack.org/instance/credentials#\";class=\"mixin\";location=\"/mixin/public_key/\",resource_tpl;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/resource_tpl/\",small;scheme=\"http://sitespecific.cesnet.cz/occi/infrastructure/resource_tpl#\";class=\"mixin\";location=\"/mixin/small/\",storage;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/storage/\",storagelink;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\";location=\"/mixin/storagelink/\",user_data;scheme=\"http://schemas.openstack.org/compute/instance#\";class=\"mixin\";location=\"/mixin/user_data/\",uuid_egi_compss_62;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_compss_62/\",uuid_egi_compss_cesnet_57;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_compss_cesnet_57/\",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/\",uuid_egi_sl6goldenimage_cesnet_50;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_sl6goldenimage_cesnet_50/\",uuid_egi_test_compss_69;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_egi_test_compss_69/\",uuid_esa_sl64_cesnet_58;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_esa_sl64_cesnet_58/\",uuid_generic_vm_54;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_generic_vm_54/\",uuid_generic_www_60;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_generic_www_60/\",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_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_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_monitoring_20;scheme=\"http://occi.localhost/occi/infrastructure/os_tpl#\";class=\"mixin\";location=\"/mixin/uuid_monitoring_20/\",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/\""}
44
44
  }
45
45
 
46
46
  it 'parses self-generated collection with resources' do
@@ -54,17 +54,19 @@ module Occi
54
54
  end
55
55
 
56
56
  it 'parses self-generated collection with added mixin' do
57
- resource.mixins << Occi::Core::Mixin.new
57
+ resource.mixins << Occi::Core::Mixin.new('http://schemas.ogf.org/occi/mymixins#', 'test')
58
58
  expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
59
59
  end
60
60
 
61
61
  it 'parses self-generated collection with added link' do
62
62
  collection << link
63
- expect(Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection).to_header).to eql rendered_collection
63
+ parsed = Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rendered_collection)
64
+ expect(parsed.to_header).to eql rendered_collection
65
+ expect(parsed.resources.first.links).not_to be_empty
64
66
  end
65
67
 
66
68
  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 })
69
+ expect(Occi::Parser.parse('text/occi', '', true, Occi::Core::Resource, real_world_example_model).to_header.to_hash).to eql(real_world_example_model)
68
70
  end
69
71
  end
70
72
 
@@ -110,6 +112,20 @@ module Occi
110
112
  end
111
113
 
112
114
  context '.parse_headers' do
115
+ let(:resource_in_headers) do
116
+ resource = {}
117
+ resource['Category'] = "network;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"kind\",network;scheme=\"http://opennebula.org/occi/infrastructure#\";class=\"mixin\",ipnetwork;scheme=\"http://schemas.ogf.org/occi/infrastructure#\";class=\"mixin\""
118
+ resource['X-OCCI-Attribute'] = "occi.core.id=\"e4bd81c4-adda-5626-840d-39bb7959db97\",occi.core.title=\"monitoring\",occi.network.address=\"192.168.254.0\",occi.network.allocation=\"dynamic\",occi.network.state=\"active\",org.opennebula.network.id=\"6\",org.opennebula.network.bridge=\"xenbr0\",org.opennebula.network.vlan=\"NO\""
119
+ resource
120
+ end
121
+
122
+ let(:rack_resource_in_headers) do
123
+ resource = {}
124
+ resource['HTTP_CATEGORY'] = resource_in_headers['Category']
125
+ resource['HTTP_X_OCCI_ATTRIBUTE'] = resource_in_headers['X-OCCI-Attribute']
126
+ resource
127
+ end
128
+
113
129
  it 'parses categories' do
114
130
  categories_string = File.open("spec/occi/parser/text_samples/occi_categories.text", "rb").read
115
131
  expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_categories.dump", "rb"))
@@ -117,10 +133,15 @@ module Occi
117
133
  expect(categories).to eql expected
118
134
  end
119
135
 
120
- it 'parses resources' do
121
- resource_string = File.open("spec/occi/parser/text_samples/occi_network_rocci_server.text", "rb").read
136
+ it 'parses resources from headers' do
122
137
  expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump", "rb"))
123
- resource = Occi::Parser.parse('text/plain', resource_string, false, Occi::Core::Resource)
138
+ resource = Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, resource_in_headers)
139
+ expect(resource).to eql expected
140
+ end
141
+
142
+ it 'parses resources from rack-compliant headers' do
143
+ expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump", "rb"))
144
+ resource = Occi::Parser.parse('text/occi', '', false, Occi::Core::Resource, rack_resource_in_headers)
124
145
  expect(resource).to eql expected
125
146
  end
126
147
 
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.14
4
+ version: 4.2.15
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-04-28 00:00:00.000000000 Z
13
+ date: 2014-06-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json