occi-core 4.1.3 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +8 -0
- data/README.md +49 -17
- data/lib/occi/collection.rb +37 -21
- data/lib/occi/core/action.rb +5 -5
- data/lib/occi/core/action_instance.rb +45 -3
- data/lib/occi/core/actions.rb +2 -1
- data/lib/occi/core/attributes.rb +253 -73
- data/lib/occi/core/categories.rb +1 -0
- data/lib/occi/core/category.rb +25 -8
- data/lib/occi/core/entities.rb +1 -0
- data/lib/occi/core/entity.rb +51 -74
- data/lib/occi/core/kind.rb +15 -11
- data/lib/occi/core/kinds.rb +1 -1
- data/lib/occi/core/link.rb +14 -15
- data/lib/occi/core/links.rb +1 -1
- data/lib/occi/core/mixin.rb +5 -5
- data/lib/occi/core/mixins.rb +2 -2
- data/lib/occi/core/properties.rb +90 -12
- data/lib/occi/core/resource.rb +7 -3
- data/lib/occi/core/resources.rb +2 -2
- data/lib/occi/errors/attribute_definitions_converted_error.rb +5 -0
- data/lib/occi/errors/attribute_missing_error.rb +5 -0
- data/lib/occi/errors/attribute_name_invalid_error.rb +5 -0
- data/lib/occi/errors/attribute_not_defined_error.rb +5 -0
- data/lib/occi/errors/attribute_property_type_error.rb +5 -0
- data/lib/occi/errors/attribute_type_error.rb +5 -0
- data/lib/occi/errors/kind_not_defined_error.rb +5 -0
- data/lib/occi/errors/parser_input_error.rb +5 -0
- data/lib/occi/errors/parser_type_error.rb +5 -0
- data/lib/occi/errors.rb +1 -0
- data/lib/occi/extensions/hashie.rb +25 -0
- data/lib/occi/helpers/comparators/action_instance.rb +22 -0
- data/lib/occi/helpers/comparators/attributes.rb +22 -0
- data/lib/occi/helpers/comparators/categories.rb +22 -0
- data/lib/occi/helpers/comparators/category.rb +22 -0
- data/lib/occi/helpers/comparators/collection.rb +40 -0
- data/lib/occi/helpers/comparators/entities.rb +22 -0
- data/lib/occi/helpers/comparators/entity.rb +22 -0
- data/lib/occi/helpers/comparators/properties.rb +26 -0
- data/lib/occi/helpers/comparators.rb +1 -0
- data/lib/occi/infrastructure/compute.rb +11 -9
- data/lib/occi/infrastructure/network.rb +27 -27
- data/lib/occi/infrastructure/networkinterface.rb +22 -23
- data/lib/occi/infrastructure/os_tpl.rb +1 -1
- data/lib/occi/infrastructure/resource_tpl.rb +1 -1
- data/lib/occi/infrastructure/storage.rb +7 -6
- data/lib/occi/infrastructure/storagelink.rb +4 -4
- data/lib/occi/log.rb +13 -10
- data/lib/occi/model.rb +9 -8
- data/lib/occi/parser/json.rb +11 -9
- data/lib/occi/parser/ova.rb +12 -6
- data/lib/occi/parser/ovf.rb +173 -116
- data/lib/occi/parser/text/constants.rb +87 -0
- data/lib/occi/parser/text.rb +161 -200
- data/lib/occi/parser/xml.rb +10 -8
- data/lib/occi/parser.rb +100 -50
- data/lib/occi/settings.rb +2 -1
- data/lib/occi/version.rb +1 -1
- data/lib/occi-core.rb +6 -4
- data/occi-core.gemspec +0 -7
- data/spec/occi/collection_samples/collection1.json +1 -0
- data/spec/occi/collection_samples/directory2/collection2.json +1 -0
- data/spec/occi/collection_spec.rb +961 -31
- data/spec/occi/core/action_instance_spec.rb +317 -0
- data/spec/occi/core/action_spec.rb +71 -0
- data/spec/occi/core/attributes_spec.rb +582 -27
- data/spec/occi/core/category_spec.rb +194 -18
- data/spec/occi/core/entities_spec.rb +96 -0
- data/spec/occi/core/entity_spec.rb +317 -28
- data/spec/occi/core/kind_spec.rb +127 -16
- data/spec/occi/core/link_spec.rb +35 -0
- data/spec/occi/core/links_spec.rb +130 -0
- data/spec/occi/core/mixins_spec.rb +107 -0
- data/spec/occi/core/properties_spec.rb +167 -0
- data/spec/occi/core/resource_spec.rb +23 -9
- data/spec/occi/core_spec.rb +12 -0
- data/spec/occi/infrastructure/compute_spec.rb +218 -18
- data/spec/occi/infrastructure/network_spec.rb +96 -0
- data/spec/occi/infrastructure/networkinterface_spec.rb +96 -0
- data/spec/occi/infrastructure/storage_spec.rb +33 -0
- data/spec/occi/infrastructure/storagelink_spec.rb +45 -0
- data/spec/occi/log_spec.rb +104 -1
- data/spec/occi/model_spec.rb +251 -39
- data/spec/occi/{test.json → parser/json_samples/test.json} +0 -0
- data/spec/occi/parser/ova_samples/test.dump +0 -0
- data/spec/occi/{test.ova → parser/ova_samples/test.ova} +0 -0
- data/spec/occi/parser/ovf_samples/test.dump +0 -0
- data/spec/occi/{test.ovf → parser/ovf_samples/test.ovf} +0 -0
- data/spec/occi/parser/text_samples/occi_categories.dump +0 -0
- data/spec/occi/parser/text_samples/occi_categories.text +2 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.text +10 -0
- data/spec/occi/parser/text_samples/occi_link_resource_instance.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_resource_instance.text +7 -0
- data/spec/occi/parser/text_samples/occi_link_simple.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_simple.link_string.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_simple.text +1 -0
- data/spec/occi/parser/text_samples/occi_link_w_attributes.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_w_attributes.text +7 -0
- data/spec/occi/parser/text_samples/occi_link_w_category.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_w_category.text +3 -0
- data/spec/occi/parser/text_samples/occi_model_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_model_rocci_server.text +51 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.text +11 -0
- data/spec/occi/parser/text_samples/occi_resource_w_attributes.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_attributes.text +11 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links.text +16 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.text +13 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.text +9 -0
- data/spec/occi/parser/text_spec.rb +274 -78
- data/spec/occi/parser/xml_samples/test.xml +352 -0
- data/spec/occi/parser_spec.rb +255 -104
- data/spec/occi-core_spec.rb +31 -0
- data/spec/spec_helper.rb +6 -2
- metadata +110 -111
- checksums.yaml +0 -7
- data/spec/occi/core/attribute_spec.rb +0 -0
@@ -4,94 +4,290 @@ module Occi
|
|
4
4
|
module Parser
|
5
5
|
describe Text do
|
6
6
|
|
7
|
-
|
7
|
+
context '.category' do
|
8
8
|
|
9
|
-
it 'parses a string
|
9
|
+
it 'parses a string describing an OCCI Category' do
|
10
10
|
category_string = 'Category: a_a1-_;scheme="http://a.a/a#";class="kind";title="aA1!\"§$%&/()=?`´ß+*#-_.:,;<>";rel="http://a.a/b#a";location="/a1-A/";attributes="a_1-_.a1-_a a-1.a.b";actions="http://a.a/a1#a1 http://a.b1/b1#b2"'
|
11
11
|
|
12
12
|
category = Occi::Parser::Text.category category_string
|
13
|
-
|
14
|
-
|
15
|
-
category.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
category
|
22
|
-
category.
|
23
|
-
|
24
|
-
|
25
|
-
|
13
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\va_a1-_\x06;\aT:\v@titleI\"%aA1!\\\"\xC2\xA7$%&/()=?`\xC2\xB4\xC3\x9F+*#-_.:,;<>\x06;\aT:\x10@attributesC:\eOcci::Core::Attributes{\aI\"\na_1-_\x06;\aTC;\v{\x06I\"\na1-_a\x06;\aTo:\eOcci::Core::Properties\v:\r@default0:\n@typeI\"\vstring\x06;\aF:\x0E@requiredF:\r@mutableF:\r@patternI\"\a.*\x06;\aF:\x11@description0I\"\ba-1\x06;\aTC;\v{\x06I\"\x06a\x06;\aTC;\v{\x06I\"\x06b\x06;\aTo;\f\v;\r0;\x0EI\"\vstring\x06;\aF;\x0FF;\x10F;\x11I\"\a.*\x06;\aF;\x120:\f@parentI\"\x13http://a.a/b#a\x06;\aT:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\ao:\x17Occi::Core::Action\t;\x06I\"\x13http://a.a/a1#\x06;\aT;\bI\"\aa1\x06;\aT;\t0;\nC;\v{\x00To;\x17\t;\x06I\"\x14http://a.b1/b1#\x06;\aT;\bI\"\ab2\x06;\aT;\t0;\nC;\v{\x00T:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x16{\x00:\x0E@locationI\"\v/a1-A/\x06;\aT")
|
14
|
+
|
15
|
+
expect(category).to eql expected
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'parses a string describing an OCCI Category with unquoted class value' do
|
19
|
+
category_string = 'Category: a_a1-_;scheme="http://a.a/a#";class=kind'
|
20
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\va_a1-_\x06;\aT:\v@title0:\x10@attributesC:\eOcci::Core::Attributes{\x00:\f@parent0:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\x00:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x0F{\x00:\x0E@locationI\"\r/a_a1-_/\x06;\aF")
|
21
|
+
category = Occi::Parser::Text.category category_string
|
22
|
+
expect(category).to eql expected
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'parses a string describing an OCCI Category with uppercase term' do
|
26
|
+
category_string = 'Category: TERM;scheme="http://a.a/a#";class=kind'
|
27
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\tterm\x06;\aT:\v@title0:\x10@attributesC:\eOcci::Core::Attributes{\x00:\f@parent0:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\x00:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x0F{\x00:\x0E@locationI\"\v/term/\x06;\aF")
|
28
|
+
category = Occi::Parser::Text.category category_string
|
29
|
+
expect(category).to eql expected
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
it 'parses attributes correctly' do
|
34
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_resource_w_attributes.text", "rb").read
|
35
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_resource_w_attributes.dump", "rb"))
|
36
|
+
collection = Occi::Parser::Text.category resource_string
|
37
|
+
expect(collection).to eql expected
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'parses inline links correctly' do
|
41
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_resource_w_inline_links_only.text", "rb").read
|
42
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_resource_w_inline_links_only.dump", "rb"))
|
43
|
+
collection = Occi::Parser::Text.category resource_string
|
44
|
+
expect(collection).to eql expected
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'parses inline Links and Mixins correctly' do
|
48
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_resource_w_inline_links.text", "rb").read
|
49
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_resource_w_inline_links.dump", "rb"))
|
50
|
+
collection = Occi::Parser::Text.category resource_string
|
51
|
+
expect(collection).to eql expected
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'parses action correctly' do
|
55
|
+
category_string = 'Category: restart;scheme="http://schemas.ogf.org/occi/infrastructure/compute/action#";class="action";title="Restart Compute instance";attributes="method"'
|
56
|
+
category = Occi::Parser::Text.category category_string
|
57
|
+
expected = Marshal.restore("\x04\bo:\x17Occi::Core::Action\t:\f@schemeI\"?http://schemas.ogf.org/occi/infrastructure/compute/action#\x06:\x06ET:\n@termI\"\frestart\x06;\aT:\v@titleI\"\x1DRestart Compute instance\x06;\aT:\x10@attributesC:\eOcci::Core::Attributes{\x06I\"\vmethod\x06;\aTo:\eOcci::Core::Properties\v:\r@default0:\n@typeI\"\vstring\x06;\aF:\x0E@requiredF:\r@mutableF:\r@patternI\"\a.*\x06;\aF:\x11@description0")
|
58
|
+
|
59
|
+
expect(category).to eql expected
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'parses network resource from rOCCI server' do
|
63
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_network_rocci_server.text", "rb").read
|
64
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_network_rocci_server.dump", "rb"))
|
65
|
+
collection = Occi::Parser::Text.category resource_string
|
66
|
+
expect(collection).to eql expected
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'parses storage resource from rOCCI server' do
|
70
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_storage_rocci_server.text", "rb").read
|
71
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_storage_rocci_server.dump", "rb"))
|
72
|
+
collection = Occi::Parser::Text.category resource_string
|
73
|
+
expect(collection).to eql expected
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'parses compute resource from rOCCI server' do
|
77
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_compute_rocci_server.text", "rb").read
|
78
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_compute_rocci_server.dump", "rb"))
|
79
|
+
collection = Occi::Parser::Text.category resource_string
|
80
|
+
expect(collection).to eql expected
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'parses model from rOCCI server' do
|
84
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_model_rocci_server.text", "rb").read
|
85
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_model_rocci_server.dump", "rb"))
|
86
|
+
collection = Occi::Parser::Text.category resource_string
|
87
|
+
expect(collection).to eql expected
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'raises error for obviously nonsensical class' do
|
91
|
+
category_string = 'Category: restart;scheme="http://schemas.ogf.org/occi/infrastructure/compute/action#";class="actions";title="Restart Compute instance";attributes="method"'
|
92
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'raises error for cleverly nonsensical class' do
|
96
|
+
category_string = 'Category: restart;scheme="http://schemas.ogf.org/occi/infrastructure/compute/action#";class="action|mixin";title="Restart Compute instance";attributes="method"'
|
97
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'raises error for a nonsensical class even with lenient regexp' do
|
101
|
+
category_string = 'Category: restart;scheme="http://schemas.ogf.org/occi/infrastructure/compute/action#";class="invalid";title="Restart Compute instance";attributes="method"'
|
102
|
+
|
103
|
+
regexp_category = Occi::Parser::Text::Constants.const_get('REGEXP_CATEGORY')
|
104
|
+
regexp_category_alt = regexp_category
|
105
|
+
regexp_category_alt['action'] = 'invalid'
|
106
|
+
|
107
|
+
Occi::Parser::Text::Constants.const_set('REGEXP_CATEGORY', regexp_category_alt)
|
108
|
+
|
109
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
110
|
+
Occi::Parser::Text.const_set('REGEXP_CATEGORY', regexp_category)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
context '.resource' do
|
114
|
+
it 'parses network resource from rOCCI server' do
|
115
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_network_rocci_server.text", "rb").read
|
116
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump", "rb"))
|
117
|
+
resource = Occi::Parser::Text.resource resource_string
|
118
|
+
expect(resource).to eql expected
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'parses storage resource from rOCCI server' do
|
122
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_storage_rocci_server.text", "rb").read
|
123
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_storage_rocci_server.resource.dump", "rb"))
|
124
|
+
resource = Occi::Parser::Text.resource resource_string
|
125
|
+
expect(resource).to eql expected
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'parses compute resource from rOCCI server' do
|
129
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_compute_rocci_server.text", "rb").read
|
130
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_compute_rocci_server.resource.dump", "rb"))
|
131
|
+
resource = Occi::Parser::Text.resource resource_string
|
132
|
+
expect(resource).to eql expected
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'types parsed compute resource from rOCCI server as Occi::Infrastructure::Compute' do
|
136
|
+
resource_string = File.open("spec/occi/parser/text_samples/occi_compute_rocci_server.text", "rb").read
|
137
|
+
expected_class = Occi::Infrastructure::Compute
|
138
|
+
resource_class = Occi::Parser::Text.resource(resource_string).resources.first.class
|
139
|
+
expect(resource_class).to eql expected_class
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context '.categories' do
|
144
|
+
it 'parses strings describing OCCI Categories' do
|
145
|
+
categories_string = File.open("spec/occi/parser/text_samples/occi_categories.text", "rb").read
|
146
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_categories.dump", "rb"))
|
147
|
+
categories = Occi::Parser::Text.categories categories_string
|
148
|
+
expect(categories).to eql expected
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'parses strings describing OCCI Categories, skipping unparseable additions' do
|
152
|
+
categories_string = File.open("spec/occi/parser/text_samples/occi_categories.text", "rb").read
|
153
|
+
categories_string["\n"] = "\n\n&*$this won't parse\n"
|
154
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_categories.dump", "rb"))
|
155
|
+
categories = Occi::Parser::Text.categories categories_string
|
156
|
+
expect(categories).to eql expected
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'does not fail on unparseable input' do
|
160
|
+
categories_string = "\n\n&*$this won't parse\n"
|
161
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_categories.dump", "rb"))
|
162
|
+
categories = Occi::Parser::Text.categories categories_string
|
163
|
+
expect(categories.blank?).to eql true
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
context '.link' do
|
169
|
+
it 'parses link resource instance' do
|
170
|
+
link_string = File.open("spec/occi/parser/text_samples/occi_link_resource_instance.text", "rb").read
|
171
|
+
link = Occi::Parser::Text.link link_string
|
172
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_link_resource_instance.dump", "rb"))
|
173
|
+
expected.links.each { |exp| exp.id = 'emptied' }
|
174
|
+
link.links.each { |lnk| lnk.id = 'emptied' }
|
175
|
+
expect(link).to eql expected
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
context '.location' do
|
181
|
+
it 'parses single location' do
|
182
|
+
location_string = "X-OCCI-Location: http://example.com:8090/a/b/vm1"
|
183
|
+
location = Occi::Parser::Text.location location_string
|
184
|
+
expected = "http://example.com:8090/a/b/vm1"
|
185
|
+
expect(location).to eql expected
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context '.locations' do
|
190
|
+
let(:locations_string){ "X-OCCI-Location: http://example.com:8090/a/b/vm1\nX-OCCI-Location: http://example.com:8090/a/b/vm2" }
|
191
|
+
let(:expected){ ["http://example.com:8090/a/b/vm1", "http://example.com:8090/a/b/vm2"] }
|
192
|
+
|
193
|
+
it 'parses multiple locations' do
|
194
|
+
locations = Occi::Parser::Text.locations locations_string
|
195
|
+
expect(locations).to eql expected
|
26
196
|
end
|
27
197
|
|
198
|
+
it 'parses multiple locations, skipping unparseable additions' do
|
199
|
+
locations_string["\n"] = "\n\n&*$this won't parse\n"
|
200
|
+
locations = Occi::Parser::Text.locations locations_string
|
201
|
+
expect(locations).to eql expected
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
context '.attribute' do
|
28
206
|
end
|
29
207
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
resource_string << %Q|\nX-OCCI-Attribute: org.opennebula.compute.cpu=1.0|
|
44
|
-
|
45
|
-
collection = Occi::Parser::Text.resource resource_string.lines
|
46
|
-
collection.resources.first.attributes['occi.compute.cores'].should eq(1)
|
47
|
-
collection.resources.first.attributes['org.opennebula.compute.cpu'].should eq(1.0)
|
48
|
-
collection.resources.first.attributes['occi.compute.architecture'].should eq("x86")
|
49
|
-
collection.resources.first.attributes['occi.compute.memory'].should eq(1.7)
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'parses a string with an OCCI Resource including inline OCCI Link definitions' do
|
53
|
-
resource_string = %Q|Category: compute;scheme="http://schemas.ogf.org/occi/infrastructure#";class="kind"\nCategory: compute;scheme="http://opennebula.org/occi/infrastructure#";class="mixin"|
|
54
|
-
resource_string << %Q|\nCategory: monitoring;scheme="https://occi.carach5.ics.muni.cz/occi/infrastructure/os_tpl#";class="mixin"|
|
55
|
-
resource_string << %Q|\nCategory: small;scheme="https://occi.carach5.ics.muni.cz/occi/infrastructure/resource_tpl#";class="mixin"|
|
56
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.core.id="ee13808d-7708-4341-a4ba-0e42e4818218"|
|
57
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.core.title="TestVM"|
|
58
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.compute.cores=1|
|
59
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.compute.memory=1.7|
|
60
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.compute.architecture="x86"|
|
61
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.compute.speed=1|
|
62
|
-
resource_string << %Q|\nX-OCCI-Attribute: occi.compute.state="active"|
|
63
|
-
resource_string << %Q|\nX-OCCI-Attribute: org.opennebula.compute.cpu=1.0|
|
64
|
-
resource_string << %Q|\nLink: </storage/e60aa2b8-0c86-5973-b93e-30c5c46d6eac>;rel="http://schemas.ogf.org/occi/infrastructure#storage";self="/storagelink/b2f7f1de-c60c-5b08-879c-81f52429c4ef";category="http://schemas.ogf.org/occi/infrastructure#storagelink";occi.core.id="b2f7f1de-c60c-5b08-879c-81f52429c4ef" occi.core.title="link to storage" occi.storagelink.deviceid="xvda" occi.storagelink.state="inactive" org.opennebula.storagelink.bus="ide" org.opennebula.storagelink.driver="tap2:tapdisk:aio:"|
|
65
|
-
resource_string << %Q|\nLink: </network/e4bd81c4-adda-5626-840d-39bb7959db97>;rel="http://schemas.ogf.org/occi/infrastructure#network";self="/networkinterface/e75ab249-9325-511c-82b8-a7e4430381e3";category="http://schemas.ogf.org/occi/infrastructure#networkinterface";occi.core.id="e75ab249-9325-511c-82b8-a7e4430381e3" occi.core.title="link to network interface" occi.networkinterface.address="192.168.254.8" occi.networkinterface.mac="02:00:c0:a8:fe:08" occi.networkinterface.state="inactive" org.opennebula.networkinterface.bridge="xenbr0"|
|
66
|
-
|
67
|
-
collection = Occi::Parser::Text.resource resource_string.lines
|
68
|
-
collection.resources.should have(1).resource
|
69
|
-
collection.links.should have(2).links
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'parses a string with an OCCI Resource including inline OCCI Link definitions and OCCI Mixins' do
|
73
|
-
resource_string = %Q|Category: compute; scheme="http://schemas.ogf.org/occi/infrastructure#"; class="kind"; title="Compute Resource"; rel="http://schemas.ogf.org/occi/core#resource"; location="https://egi-cloud.zam.kfa-juelich.de:8787/compute/"; attributes="occi.compute.architecture occi.compute.state{immutable} occi.compute.speed occi.compute.memory occi.compute.cores occi.compute.hostname"; 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"
|
74
|
-
Category: os_vms; scheme="http://schemas.openstack.org/compute/instance#"; class="mixin"; location="https://egi-cloud.zam.kfa-juelich.de:8787/os_vms/"; attributes="org.openstack.compute.console.vnc{immutable} org.openstack.compute.state{immutable}"; actions="http://schemas.openstack.org/instance/action#chg_pwd http://schemas.openstack.org/instance/action#create_image"
|
75
|
-
Link: </compute/04106bce-87eb-4f8f-a665-2f624e54ba46?action=stop>; rel="http://schemas.ogf.org/occi/infrastructure/compute/action#stop"
|
76
|
-
Link: </compute/04106bce-87eb-4f8f-a665-2f624e54ba46?action=suspend>; rel="http://schemas.ogf.org/occi/infrastructure/compute/action#suspend"
|
77
|
-
Link: </compute/04106bce-87eb-4f8f-a665-2f624e54ba46?action=restart>; rel="http://schemas.ogf.org/occi/infrastructure/compute/action#restart"
|
78
|
-
Link: </network/public>; rel="http://schemas.ogf.org/occi/infrastructure#network"; self="/network/interface/6a7a9446-a146-4faf-a961-52f66d2808df"; category="http://schemas.ogf.org/occi/infrastructure#networkinterface http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface"; occi.networkinterface.gateway="0.0.0.0"; occi.networkinterface.mac="aa:bb:cc:dd:ee:ff"; occi.networkinterface.interface="eth0"; occi.networkinterface.state="active"; occi.networkinterface.allocation="static"; occi.networkinterface.address="134.94.32.154"; occi.core.source="/compute/04106bce-87eb-4f8f-a665-2f624e54ba46"; occi.core.target="/network/public"; occi.core.id="/network/interface/6a7a9446-a146-4faf-a961-52f66d2808df"
|
79
|
-
Link: </network/admin>; rel="http://schemas.ogf.org/occi/infrastructure#network"; self="/network/interface/02b630f6-087e-4969-b04c-1e22d9480dec"; category="http://schemas.ogf.org/occi/infrastructure#networkinterface http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface"; occi.networkinterface.gateway="192.168.16.1"; occi.networkinterface.mac="fa:16:3e:45:1c:26"; occi.networkinterface.interface="eth0"; occi.networkinterface.state="active"; occi.networkinterface.allocation="static"; occi.networkinterface.address="192.168.16.103"; occi.core.source="/compute/04106bce-87eb-4f8f-a665-2f624e54ba46"; occi.core.target="/network/admin"; occi.core.id="/network/interface/02b630f6-087e-4969-b04c-1e22d9480dec"
|
80
|
-
X-OCCI-Attribute: org.openstack.compute.console.vnc="http://134.94.32.4:6080/vnc_auto.html?token=9923dc1b-eca0-4c62-81a8-a0dd6848341a"
|
81
|
-
X-OCCI-Attribute: occi.compute.architecture="x86"
|
82
|
-
X-OCCI-Attribute: occi.compute.state="active"
|
83
|
-
X-OCCI-Attribute: occi.compute.speed="0.0"
|
84
|
-
X-OCCI-Attribute: occi.compute.cores="1"
|
85
|
-
X-OCCI-Attribute: occi.compute.memory="1.0"
|
86
|
-
X-OCCI-Attribute: org.openstack.compute.state="active"
|
87
|
-
X-OCCI-Attribute: occi.compute.hostname="openmodeller-test-bjoernh"
|
88
|
-
X-OCCI-Attribute: occi.core.id="04106bce-87eb-4f8f-a665-2f624e54ba46"|
|
89
|
-
|
90
|
-
collection = Occi::Parser::Text.resource resource_string.lines
|
91
|
-
collection.resources.should have(1).resource
|
92
|
-
collection.links.should have(5).links
|
208
|
+
context '.link_string' do
|
209
|
+
it 'parses string with category set' do
|
210
|
+
link_string = File.open("spec/occi/parser/text_samples/occi_link_simple.text", "rb").read
|
211
|
+
link = Occi::Parser::Text.link_string link_string, nil
|
212
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_link_simple.link_string.dump", "rb"))
|
213
|
+
expect(link).to eql expected
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'parses link with category' do
|
217
|
+
link_string = File.open("spec/occi/parser/text_samples/occi_link_w_category.text", "rb").read
|
218
|
+
link = Occi::Parser::Text.link_string link_string, nil
|
219
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_link_w_category.dump", "rb"))
|
220
|
+
expect(link).to eql expected
|
93
221
|
end
|
94
222
|
|
223
|
+
it 'parses link with attributes' do
|
224
|
+
link_string = File.open("spec/occi/parser/text_samples/occi_link_w_attributes.text", "rb").read
|
225
|
+
link = Occi::Parser::Text.link_string link_string, nil
|
226
|
+
expected = Marshal.load(File.open("spec/occi/parser/text_samples/occi_link_w_attributes.dump", "rb"))
|
227
|
+
expect(link).to eql expected
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'parses string with category unset' do
|
231
|
+
link_string = 'Link: </compute/04106bce-87eb-4f8f-a665-2f624e54ba46?action=restart>; rel="http://schemas.ogf.org/occi/infrastructure/compute/action#restart"'
|
232
|
+
link = Occi::Parser::Text.link_string(link_string, "source")
|
233
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Link\x0E:\n@kindo:\x15Occi::Core::Kind\r:\f@schemeI\"&http://schemas.ogf.org/occi/core#\x06:\x06EF:\n@termI\"\tlink\x06;\tF:\v@titleI\"\tlink\x06;\tF:\x10@attributesC:\eOcci::Core::Attributes{\x06I\"\tocci\x06;\tFC;\r{\x06I\"\tcore\x06;\tFC;\r{\rI\"\aid\x06;\tFo:\eOcci::Core::Properties\v:\r@default0:\n@typeI\"\vstring\x06;\tF:\x0E@requiredF:\r@mutableF:\r@patternI\"A[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\x06;\tF:\x11@description0I\"\b_id\x06;\tFo;\x0E\v;\x0F0;\x10@\x11;\x11F;\x12F;\x13@\x12;\x140I\"\ntitle\x06;\tFo;\x0E\v;\x0F0;\x10I\"\vstring\x06;\tF;\x11F;\x12T;\x13I\"\a.*\x06;\tF;\x140I\"\v_title\x06;\tFo;\x0E\v;\x0F0;\x10@\x17;\x11F;\x12T;\x13@\x18;\x140I\"\vtarget\x06;\tFo;\x0E\v;\x0F0;\x10I\"\vstring\x06;\tF;\x11F;\x12T;\x13I\"\a.*\x06;\tF;\x140I\"\f_target\x06;\tFo;\x0E\v;\x0F0;\x10@\x1D;\x11F;\x12T;\x13@\x1E;\x140I\"\vsource\x06;\tFo;\x0E\v;\x0F0;\x10I\"\vstring\x06;\tF;\x11F;\x12T;\x13I\"\a.*\x06;\tF;\x140I\"\f_source\x06;\tFo;\x0E\v;\x0F0;\x10@#;\x11F;\x12T;\x13@$;\x140:\f@parento;\a\r;\bI\"&http://schemas.ogf.org/occi/core#\x06;\tF;\nI\"\ventity\x06;\tF;\vI\"\ventity\x06;\tF;\fC;\r{\x06@\vC;\r{\x06@\rC;\r{\t@\x0F@\x10@\x13@\x14@\x15@\x16@\x19@\x1A;\x150:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\x00:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x18{\x00:\x0E@locationI\"\r/entity/\x06;\tF;\x16o;\x17\x06;\x18{\x00;\x19o;\x1A\x06;\x18{\x00;\eI\"\v/link/\x06;\tF:\f@mixinso:\x17Occi::Core::Mixins\a;\x18{\x00:\f@entity@\x00;\fIC;\r{\x06@\vIC;\r{\x06@\rIC;\r{\r@\x0F0@\x13@\x14@\x150@\x19@\x1A@\e0@\x1F@ @!0@%@&\x06:\x0F@convertedT\x06;\x1FT\x06;\x1FT;\x16o;\x17\x06;\x18{\x00;\e0:\t@relo;\a\r;\bI\"?http://schemas.ogf.org/occi/infrastructure/compute/action#\x06;\tT;\nI\"\frestart\x06;\tT;\v0;\fC;\r{\x00;\x15@';\x16o;\x17\x06;\x18{\x00;\x19o;\x1A\x06;\x18{\x00;\eI\"\x0E/restart/\x06;\tF:\f@sourceI\"\vsource\x06;\tT:\f@targetI\"A/compute/04106bce-87eb-4f8f-a665-2f624e54ba46?action=restart\x06;\tT:\b@id0")
|
234
|
+
expected.id = 'epmtied'
|
235
|
+
link.id = 'epmtied'
|
236
|
+
expect(link).to eql expected
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'compatibility' do
|
241
|
+
after(:each) { Occi::Settings.reload! }
|
242
|
+
context 'terms' do
|
243
|
+
it 'parses uppercase term, compatibility on' do
|
244
|
+
Occi::Settings['compatibility']=true
|
245
|
+
category_string = 'Category: TERM;scheme="http://a.a/a#";class=kind'
|
246
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\tterm\x06;\aT:\v@title0:\x10@attributesC:\eOcci::Core::Attributes{\x00:\f@parent0:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\x00:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x0F{\x00:\x0E@locationI\"\v/term/\x06;\aF")
|
247
|
+
category = Occi::Parser::Text.category category_string
|
248
|
+
expect(category).to eql expected
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'refuses uppercase term, compatibility off' do
|
252
|
+
Occi::Settings['compatibility']=false
|
253
|
+
category_string = 'Category: TERM;scheme="http://a.a/a#";class=kind'
|
254
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'parses term starting with number, compatibility on' do
|
258
|
+
Occi::Settings['compatibility']=true
|
259
|
+
category_string = 'Category: 1TERM;scheme="http://a.a/a#";class=kind'
|
260
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\n1term\x06;\aT:\v@title0:\x10@attributesC:\eOcci::Core::Attributes{\x00:\f@parent0:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\x00:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x0F{\x00:\x0E@locationI\"\f/1term/\x06;\aF")
|
261
|
+
category = Occi::Parser::Text.category category_string
|
262
|
+
expect(category).to eql expected
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'refuses term starting with number, compatibility off' do
|
266
|
+
Occi::Settings['compatibility']=false
|
267
|
+
category_string = 'Category: 1TERM;scheme="http://a.a/a#";class=kind'
|
268
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
269
|
+
end
|
270
|
+
|
271
|
+
end
|
272
|
+
context 'schemes' do
|
273
|
+
it 'parses a Category, compatibility on' do
|
274
|
+
Occi::Settings['compatibility']=true
|
275
|
+
category_string = 'Category: a_a1-_;scheme="http://a.a/a#a_a1-_";class="kind";title="aA1!\"§$%&/()=?`´ß+*#-_.:,;<>";rel="http://a.a/b#a";location="/a1-A/";attributes="a_1-_.a1-_a a-1.a.b";actions="http://a.a/a1#a1 http://a.b1/b1#b2"'
|
276
|
+
category = Occi::Parser::Text.category category_string
|
277
|
+
expected = Marshal.restore("\x04\bo:\x15Occi::Core::Kind\r:\f@schemeI\"\x12http://a.a/a#\x06:\x06ET:\n@termI\"\va_a1-_\x06;\aT:\v@titleI\"%aA1!\\\"\xC2\xA7$%&/()=?`\xC2\xB4\xC3\x9F+*#-_.:,;<>\x06;\aT:\x10@attributesC:\eOcci::Core::Attributes{\aI\"\na_1-_\x06;\aTC;\v{\x06I\"\na1-_a\x06;\aTo:\eOcci::Core::Properties\v:\r@default0:\n@typeI\"\vstring\x06;\aF:\x0E@requiredF:\r@mutableF:\r@patternI\"\a.*\x06;\aF:\x11@description0I\"\ba-1\x06;\aTC;\v{\x06I\"\x06a\x06;\aTC;\v{\x06I\"\x06b\x06;\aTo;\f\v;\r0;\x0EI\"\vstring\x06;\aF;\x0FF;\x10F;\x11I\"\a.*\x06;\aF;\x120:\f@parentI\"\x13http://a.a/b#a\x06;\aT:\r@actionso:\x18Occi::Core::Actions\x06:\n@hash{\ao:\x17Occi::Core::Action\t;\x06I\"\x13http://a.a/a1#\x06;\aT;\bI\"\aa1\x06;\aT;\t0;\nC;\v{\x00To;\x17\t;\x06I\"\x14http://a.b1/b1#\x06;\aT;\bI\"\ab2\x06;\aT;\t0;\nC;\v{\x00T:\x0E@entitieso:\x19Occi::Core::Entities\x06;\x16{\x00:\x0E@locationI\"\v/a1-A/\x06;\aT")
|
278
|
+
expect(category).to eql expected
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'parses a Category, compatibility off' do
|
282
|
+
Occi::Settings['compatibility']=false
|
283
|
+
category_string = 'Category: a_a1-_;scheme="http://a.a/a#a_a1-_";class="kind";title="aA1!\"§$%&/()=?`´ß+*#-_.:,;<>";rel="http://a.a/b#a";location="/a1-A/";attributes="a_1-_.a1-_a a-1.a.b";actions="http://a.a/a1#a1 http://a.b1/b1#b2"'
|
284
|
+
expect{ category = Occi::Parser::Text.category category_string }.to raise_error(Occi::Errors::ParserInputError)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
context 'other OCCI implementations' do
|
290
|
+
it 'renders correctly OCCI from other sources'
|
95
291
|
end
|
96
292
|
|
97
293
|
end
|