occi-core 4.1.3 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +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
|