occi 1.2.1 → 2.0.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 +9 -0
- data/.project +32 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/.yardopts +1 -0
- data/AUTHORS +8 -0
- data/Gemfile +35 -14
- data/Gemfile.lock +89 -32
- data/LICENSE +13 -4
- data/README.md +70 -21
- data/Rakefile +25 -21
- data/lib/OpenNebula/Acl.rb +256 -0
- data/lib/OpenNebula/AclPool.rb +53 -0
- data/lib/OpenNebula/Group.rb +147 -0
- data/lib/OpenNebula/GroupPool.rb +54 -0
- data/lib/OpenNebula/Host.rb +143 -0
- data/lib/OpenNebula/HostPool.rb +55 -0
- data/lib/OpenNebula/Image.rb +256 -0
- data/lib/OpenNebula/ImagePool.rb +74 -0
- data/lib/OpenNebula/OpenNebula.rb +137 -0
- data/lib/OpenNebula/Pool.rb +285 -0
- data/lib/OpenNebula/Template.rb +173 -0
- data/lib/OpenNebula/TemplatePool.rb +74 -0
- data/lib/OpenNebula/User.rb +157 -0
- data/lib/OpenNebula/UserPool.rb +53 -0
- data/lib/OpenNebula/VirtualMachine.rb +319 -0
- data/lib/OpenNebula/VirtualMachinePool.rb +120 -0
- data/lib/OpenNebula/VirtualNetwork.rb +229 -0
- data/lib/OpenNebula/VirtualNetworkPool.rb +74 -0
- data/lib/OpenNebula/XMLUtils.rb +337 -0
- data/lib/occi/antlr/.gitignore +18 -0
- data/lib/occi/antlr/OCCI.g +164 -0
- data/lib/occi/antlr/OCCI.tokens +75 -0
- data/lib/occi/antlr/OCCILexer.rb +1532 -0
- data/lib/occi/antlr/OCCIParser.rb +2472 -0
- data/lib/occi/antlr/README.md +2 -0
- data/lib/occi/backend/dummy.rb +232 -0
- data/lib/occi/backend/ec2/Compute.rb +310 -0
- data/lib/occi/backend/ec2/compute.rb +310 -0
- data/lib/occi/backend/ec2/ec2.rb +215 -0
- data/lib/occi/backend/manager.rb +131 -0
- data/lib/occi/backend/opennebula/compute.rb +360 -0
- data/lib/occi/backend/opennebula/network.rb +143 -0
- data/lib/occi/backend/opennebula/opennebula.rb +188 -0
- data/lib/occi/backend/opennebula/storage.rb +175 -0
- data/lib/occi/configuration.rb +118 -0
- data/lib/occi/core/action.rb +29 -0
- data/lib/occi/core/attribute_properties.rb +54 -0
- data/lib/occi/core/attributes.rb +40 -0
- data/lib/occi/core/category.rb +62 -0
- data/lib/occi/core/collection.rb +27 -0
- data/lib/occi/core/entity.rb +135 -0
- data/lib/occi/core/kind.rb +55 -0
- data/lib/occi/core/link.rb +88 -0
- data/lib/occi/core/mixin.rb +43 -0
- data/lib/occi/core/resource.rb +73 -0
- data/lib/occi/exceptions.rb +59 -0
- data/lib/occi/extensions/monitoring/cpu.rb +51 -0
- data/lib/occi/extensions/monitoring/memory.rb +49 -0
- data/lib/occi/extensions/monitoring/metric.rb +54 -0
- data/lib/occi/extensions/monitoring/netrx.rb +49 -0
- data/lib/occi/extensions/monitoring/nettx.rb +55 -0
- data/lib/occi/extensions/one/VNC.rb +58 -0
- data/lib/occi/extensions/one/vnc.rb +58 -0
- data/lib/occi/log.rb +47 -0
- data/lib/occi/parse.rb +164 -0
- data/lib/occi/registry.rb +87 -0
- data/lib/occi/server.rb +594 -0
- data/lib/occi/version.rb +3 -0
- data/occi.gemspec +18 -96
- data/spec/occi/antlr/parser_spec.rb +82 -0
- data/spec/spec_helper.rb +6 -0
- metadata +100 -208
- data/.autotest +0 -21
- data/.rvmrc +0 -1
- data/VERSION +0 -1
- data/lib/occi.rb +0 -1
- data/lib/occi/client.rb +0 -36
- data/lib/occi/compute.rb +0 -4
- data/lib/occi/network.rb +0 -4
- data/lib/occi/resource.rb +0 -59
- data/lib/occi/storage.rb +0 -7
- data/test/fixtures/cassettes/compute_all.yml +0 -28
- data/test/fixtures/cassettes/compute_create.yml +0 -45
- data/test/fixtures/cassettes/compute_destroy.yml +0 -22
- data/test/fixtures/cassettes/compute_find.yml +0 -28
- data/test/fixtures/cassettes/compute_update.yml +0 -35
- data/test/fixtures/cassettes/network_all.yml +0 -28
- data/test/fixtures/cassettes/network_create.yml +0 -37
- data/test/fixtures/cassettes/network_destroy.yml +0 -22
- data/test/fixtures/cassettes/network_find.yml +0 -28
- data/test/fixtures/cassettes/storage_all.yml +0 -28
- data/test/fixtures/cassettes/storage_create.yml +0 -50
- data/test/fixtures/cassettes/storage_destroy.yml +0 -22
- data/test/fixtures/cassettes/storage_find.yml +0 -28
- data/test/lib/occi/compute_test.rb +0 -91
- data/test/lib/occi/network_test.rb +0 -57
- data/test/lib/occi/storage_test.rb +0 -67
- data/test/test_helper.rb +0 -48
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2012 GWDG
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: OCCI monitoring VM Network reception
|
|
19
|
+
# Author(s): Ali Imran Jehangiri, Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'singleton'
|
|
23
|
+
require 'occi/core/mixin'
|
|
24
|
+
|
|
25
|
+
module OCCI
|
|
26
|
+
module Monitor
|
|
27
|
+
class Nettx < OCCI::Core::Mixin
|
|
28
|
+
|
|
29
|
+
# Define appropriate mixin
|
|
30
|
+
begin
|
|
31
|
+
# Define actions
|
|
32
|
+
actions = []
|
|
33
|
+
|
|
34
|
+
related = [OCCI::Monitor::Metric::MIXIN]
|
|
35
|
+
entities = []
|
|
36
|
+
|
|
37
|
+
term = "net_rx"
|
|
38
|
+
scheme = "http://example.com/occi/infrastructure/metric/compute#"
|
|
39
|
+
title = "compute.net_rx"
|
|
40
|
+
|
|
41
|
+
attributes = OCCI::Core::Attributes.new()
|
|
42
|
+
MIXIN = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
|
|
43
|
+
OCCI::CategoryRegistry.register(MIXIN)
|
|
44
|
+
OCCI::Rendering::HTTP::LocationRegistry.register('/metric/compute/net_rx', MIXIN)
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2012 GWDG
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: OCCI monitoring VM Network transmission
|
|
19
|
+
# Author(s): Ali Imran Jehangiri, Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'singleton'
|
|
23
|
+
require 'occi/core/mixin'
|
|
24
|
+
|
|
25
|
+
module OCCI
|
|
26
|
+
module Monitor
|
|
27
|
+
class Nettx < OCCI::Core::Mixin
|
|
28
|
+
|
|
29
|
+
# Define appropriate mixin
|
|
30
|
+
begin
|
|
31
|
+
# Define actions
|
|
32
|
+
actions = []
|
|
33
|
+
|
|
34
|
+
related = [OCCI::Monitor::Metric::MIXIN]
|
|
35
|
+
entities = []
|
|
36
|
+
|
|
37
|
+
term = "net_tx"
|
|
38
|
+
scheme = "http://example.com/occi/infrastructure/metric/compute#"
|
|
39
|
+
title = "compute.net_tx"
|
|
40
|
+
|
|
41
|
+
attributes = OCCI::Core::Attributes.new()
|
|
42
|
+
# attributes << OCCI::Core::Attribute.new(name = 'compute.net_tx.value', mutable = false, mandatory = true, unique = true)
|
|
43
|
+
# attributes << OCCI::Core::Attribute.new(name = 'compute.net_tx.timestamp', mutable = false, mandatory = true, unique = true)
|
|
44
|
+
# attributes << OCCI::Core::Attribute.new(name = 'compute.net_tx.samplerate', mutable = true, mandatory = false, unique = true)
|
|
45
|
+
# attributes << OCCI::Core::Attribute.new(name = 'compute.net_tx.resolution', mutable = true, mandatory = false, unique = true)
|
|
46
|
+
# attributes << OCCI::Core::Attribute.new(name = 'compute.net_tx.unit', mutable = false, mandatory = true, unique = true)
|
|
47
|
+
MIXIN = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
|
|
48
|
+
|
|
49
|
+
OCCI::CategoryRegistry.register(MIXIN)
|
|
50
|
+
OCCI::Rendering::HTTP::LocationRegistry.register('/metric/compute/net_tx', MIXIN)
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2011 Service Computing group, TU Dortmund
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: OCCI Mixin to support OpenNebula specific virtual machine parameters
|
|
19
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'occi/core/mixin'
|
|
23
|
+
require 'occi/core/attribute'
|
|
24
|
+
require 'occi/core/attributes'
|
|
25
|
+
require 'singleton'
|
|
26
|
+
|
|
27
|
+
module OCCI
|
|
28
|
+
module Backend
|
|
29
|
+
module ONE
|
|
30
|
+
class VNC < OCCI::Core::Mixin
|
|
31
|
+
|
|
32
|
+
# Define appropriate mixin
|
|
33
|
+
begin
|
|
34
|
+
# Define actions
|
|
35
|
+
actions = []
|
|
36
|
+
|
|
37
|
+
related = []
|
|
38
|
+
entities = []
|
|
39
|
+
|
|
40
|
+
term = "vnc"
|
|
41
|
+
scheme = "http://schemas.opennebula.org/occi/infrastructure#"
|
|
42
|
+
title = "OpenNebula VNC Mixin"
|
|
43
|
+
|
|
44
|
+
attributes = OCCI::Core::Attributes.new()
|
|
45
|
+
attributes << OCCI::Core::Attribute.new(name = 'opennebula.vm.vnc', mutable = true, required = false, type = "string", range = "", default = "")
|
|
46
|
+
attributes << OCCI::Core::Attribute.new(name = 'opennebula.vm.web_vnc', mutable = true, required = false, type = "string", range = "", default = "")
|
|
47
|
+
|
|
48
|
+
MIXIN = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize(term, scheme, title, attributes, actions, related, entities)
|
|
52
|
+
super(term, scheme, title, attributes, actions, related, entities)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2011 Service Computing group, TU Dortmund
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: OCCI Mixin to support OpenNebula specific virtual machine parameters
|
|
19
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'occi/core/mixin'
|
|
23
|
+
require 'occi/core/attribute'
|
|
24
|
+
require 'occi/core/attributes'
|
|
25
|
+
require 'singleton'
|
|
26
|
+
|
|
27
|
+
module OCCI
|
|
28
|
+
module Backend
|
|
29
|
+
module ONE
|
|
30
|
+
class VNC < OCCI::Core::Mixin
|
|
31
|
+
|
|
32
|
+
# Define appropriate mixin
|
|
33
|
+
begin
|
|
34
|
+
# Define actions
|
|
35
|
+
actions = []
|
|
36
|
+
|
|
37
|
+
related = []
|
|
38
|
+
entities = []
|
|
39
|
+
|
|
40
|
+
term = "vnc"
|
|
41
|
+
scheme = "http://schemas.opennebula.org/occi/infrastructure#"
|
|
42
|
+
title = "OpenNebula VNC Mixin"
|
|
43
|
+
|
|
44
|
+
attributes = OCCI::Core::Attributes.new()
|
|
45
|
+
attributes << OCCI::Core::Attribute.new(name = 'opennebula.vm.vnc', mutable = true, required = false, type = "string", range = "", default = "")
|
|
46
|
+
attributes << OCCI::Core::Attribute.new(name = 'opennebula.vm.web_vnc', mutable = true, required = false, type = "string", range = "", default = "")
|
|
47
|
+
|
|
48
|
+
MIXIN = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize(term, scheme, title, attributes, actions, related, entities)
|
|
52
|
+
super(term, scheme, title, attributes, actions, related, entities)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/occi/log.rb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2011 Service Computing group, TU Dortmund
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: OCCI logger
|
|
19
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'logger'
|
|
23
|
+
|
|
24
|
+
module OCCI
|
|
25
|
+
class Log
|
|
26
|
+
|
|
27
|
+
def self.debug(message)
|
|
28
|
+
ActiveSupport::Notifications.instrument("log",:level=>Logger::DEBUG,:message=>message)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.info(message)
|
|
32
|
+
ActiveSupport::Notifications.instrument("log", :level => Logger::INFO, :message => message)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.warn(message)
|
|
36
|
+
ActiveSupport::Notifications.instrument("log", :level => Logger::WARN, :message => message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.error(message)
|
|
40
|
+
ActiveSupport::Notifications.instrument("log", :level => Logger::ERROR, :message => message)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.fatal(message)
|
|
44
|
+
ActiveSupport::Notifications.instrument("log", :level => Logger::FATAL, :message => message)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
data/lib/occi/parse.rb
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2011 Service Computing group, TU Dortmund
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# @note OCCI RESTful Web Service
|
|
19
|
+
# @author Florian Feldhaus, Piotr Kasprzak
|
|
20
|
+
##############################################################################
|
|
21
|
+
|
|
22
|
+
require 'json'
|
|
23
|
+
#require 'nokogiri'
|
|
24
|
+
require 'occi/core/collection'
|
|
25
|
+
require 'occi/log'
|
|
26
|
+
require 'occi/antlr/OCCIParser'
|
|
27
|
+
|
|
28
|
+
module OCCI
|
|
29
|
+
class Parse
|
|
30
|
+
|
|
31
|
+
=begin
|
|
32
|
+
if content_type.includes?('multipart')
|
|
33
|
+
# TODO: implement multipart handling
|
|
34
|
+
# handle file upload
|
|
35
|
+
if params['file'] != nil
|
|
36
|
+
OCCI::Log.debug("Location of Image #{params['file'][:tempfile].path}")
|
|
37
|
+
$image_path = OCCI::Server.config[:one_image_tmp_dir] + '/' + params['file'][:filename]
|
|
38
|
+
FileUtils.cp(params['file'][:tempfile].path, $image_path)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# handle file upload in multipart requests
|
|
42
|
+
request.POST.values.each do |body|
|
|
43
|
+
if body.kind_of?(String)
|
|
44
|
+
parse_text(body)
|
|
45
|
+
elsif body.kind_of?(Hash)
|
|
46
|
+
if body['type'].include?('application/json')
|
|
47
|
+
# try to parse body as JSON object
|
|
48
|
+
parse_json(body.read)
|
|
49
|
+
elsif body['type'].include?('text/plain') # text/plain
|
|
50
|
+
parse_text(body.read)
|
|
51
|
+
end unless body['type'].nil?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
=end
|
|
56
|
+
|
|
57
|
+
def self.header_locations(header)
|
|
58
|
+
x_occi_location_strings = header['HTTP_X_OCCI_LOCATION'].to_s.split(',')
|
|
59
|
+
x_occi_location_strings.collect { |loc| OCCI::Parser.new('X-OCCI-Location: ' + loc).x_occi_location }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.header_categories(header)
|
|
63
|
+
collection = OCCI::Core::Collection.new
|
|
64
|
+
category_strings = header['HTTP_CATEGORY'].to_s.split(',')
|
|
65
|
+
category_strings.each do |cat|
|
|
66
|
+
category = OCCI::Parser.new('Category: ' + cat).category
|
|
67
|
+
collection.kinds.concat category.kinds.collect { |kind| OCCI::Core::Kind.new(kind) }
|
|
68
|
+
collection.mixins.concat category.mixins.collect { |mixin| OCCI::Core::Mixin.new(mixin) }
|
|
69
|
+
collection.actions.concat category.actions.collect { |action| OCCI::Core::Action.new(action) }
|
|
70
|
+
end
|
|
71
|
+
collection
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def self.header_entity(header)
|
|
75
|
+
collection = OCCI::Core::Collection.new
|
|
76
|
+
entity = Hashie::Mash.new
|
|
77
|
+
category_strings = header['HTTP_CATEGORY'].to_s.split(',')
|
|
78
|
+
return collection if category_strings.empty?
|
|
79
|
+
attribute_strings = header['HTTP_X_OCCI_ATTRIBUTE'].to_s.split(',')
|
|
80
|
+
categories = Hashie::Mash.new({:kinds => [], :mixins => [], :actions => []})
|
|
81
|
+
category_strings.each { |cat| categories.merge!(OCCI::Parser.new('Category: ' + cat).category) }
|
|
82
|
+
return collection if categories.kinds.empty?
|
|
83
|
+
entity.kind = categories.kinds.first.scheme + categories.kinds.first.term
|
|
84
|
+
entity.mixins = categories.mixins.collect { |mixin| mixin.scheme + mixin.term } if categories.mixins.any?
|
|
85
|
+
attribute_strings.each { |attr| entity.attributes!.merge!(OCCI::Parser.new('X-OCCI-Attribute: ' + attr).x_occi_attribute) }
|
|
86
|
+
kind = OCCI::Registry.get_by_id(entity.kind)
|
|
87
|
+
# TODO: error handling
|
|
88
|
+
return collection if kind.nil?
|
|
89
|
+
if kind.entity_type == OCCI::Core::Link.name
|
|
90
|
+
entity.target = link.attributes.occi!.core!.target
|
|
91
|
+
entity.source = link.attributes.occi!.core!.source
|
|
92
|
+
collection.links << OCCI::Core::Link.new(entity)
|
|
93
|
+
elsif kind.entity_type == OCCI::Core::Resource.name
|
|
94
|
+
link_strings = header['HTTP_LINK'].to_s.split(',')
|
|
95
|
+
link_strings.each { |link| entity.links << OCCI::Parser.new('Link: ' + link).link }
|
|
96
|
+
collection.resources << OCCI::Core::Resource.new(entity)
|
|
97
|
+
end
|
|
98
|
+
collection
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.text_locations(text)
|
|
102
|
+
text.lines.collect { |line| OCCI::Parser.new(line).x_occi_location if line.include? 'X-OCCI-Location' }.compact
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.text_categories(text)
|
|
106
|
+
collection = OCCI::Core::Collection.new
|
|
107
|
+
text.each_line do |line|
|
|
108
|
+
category = OCCI::Parser.new(line).category
|
|
109
|
+
collection.kinds.concat category.kinds.collect { |kind| OCCI::Core::Kind.new(kind) }
|
|
110
|
+
collection.mixins.concat category.mixins.collect { |mixin| OCCI::Core::Mixin.new(mixin) }
|
|
111
|
+
collection.actions.concat category.actions.collect { |action| OCCI::Core::Action.new(action) }
|
|
112
|
+
end
|
|
113
|
+
collection
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def self.text_entity(text)
|
|
117
|
+
collection = OCCI::Core::Collection.new
|
|
118
|
+
entity = Hashie::Mash.new
|
|
119
|
+
links = []
|
|
120
|
+
categories = Hashie::Mash.new({:kinds => [], :mixins => [], :actions => []})
|
|
121
|
+
text.each_line do |line|
|
|
122
|
+
categories.merge!(OCCI::Parser.new(line).category) if line.include? 'Category'
|
|
123
|
+
entity.attributes!.merge!(OCCI::Parser.new(line).x_occi_attribute) if line.include? 'X-OCCI-Attribute'
|
|
124
|
+
links << OCCI::Parser.new(line).link if line.include? 'Link'
|
|
125
|
+
end
|
|
126
|
+
entity.kind = categories.kinds.first.scheme + categories.kinds.first.term if categories.kinds.first
|
|
127
|
+
entity.mixins = categories.mixins.collect { |mixin| mixin.scheme + mixin.term } if entity.mixins
|
|
128
|
+
kind = OCCI::Registry.get_by_id(entity.kind)
|
|
129
|
+
# TODO: error handling
|
|
130
|
+
return collection if kind.nil?
|
|
131
|
+
if OCCI::Registry.get_by_id(entity.kind).entity_type == OCCI::Core::Link.name
|
|
132
|
+
entity.target = links.first.attributes.occi!.core!.target
|
|
133
|
+
entity.source = links.first.attributes.occi!.core!.source
|
|
134
|
+
collection.links << OCCI::Core::Link.new(entity)
|
|
135
|
+
elsif OCCI::Registry.get_by_id(entity.kind).entity_type == OCCI::Core::Resource.name
|
|
136
|
+
entity.links = links
|
|
137
|
+
collection.resources << OCCI::Core::Resource.new(entity)
|
|
138
|
+
end unless entity.kind.nil?
|
|
139
|
+
collection
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def self.json(json)
|
|
143
|
+
collection = OCCI::Core::Collection.new
|
|
144
|
+
hash = Hashie::Mash.new(JSON.parse(json))
|
|
145
|
+
collection.kinds.concat hash.kinds.collect { |kind| OCCI::Core::Kind.new(kind) } if hash.kinds
|
|
146
|
+
collection.mixins.concat hash.mixins.collect { |mixin| OCCI::Core::Mixin.new(mixin) } if hash.mixins
|
|
147
|
+
collection.resources.concat hash.resources.collect { |resource| OCCI::Core::Resource.new(resource) } if hash.resources
|
|
148
|
+
collection.links.concat hash.links.collect { |link| OCCI::Core::Link.new(link) } if hash.links
|
|
149
|
+
collection
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#def self.xml(xml)
|
|
153
|
+
# collection = OCCI::Core::Collection.new
|
|
154
|
+
# hash = Hashie::Mash.new(Hash.from_xml(Nokogiri::XML(xml)))
|
|
155
|
+
# collection.kinds.concat hash.kinds.collect { |kind| OCCI::Core::Kind.new(kind) } if hash.kinds
|
|
156
|
+
# collection.mixins.concat hash.mixins.collect { |mixin| OCCI::Core::Mixin.new(mixin) } if hash.mixins
|
|
157
|
+
# collection.resources.concat hash.resources.collect { |resource| OCCI::Core::Resource.new(resource) } if hash.resources
|
|
158
|
+
# collection.links.concat hash.links.collect { |link| OCCI::Core::Link.new(link) } if hash.links
|
|
159
|
+
# collection
|
|
160
|
+
#end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
# Copyright 2011 Service Computing group, TU Dortmund
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
##############################################################################
|
|
16
|
+
|
|
17
|
+
##############################################################################
|
|
18
|
+
# Description: registry for all Category/Kind/Mixin instances currently
|
|
19
|
+
# known to the OCCI server
|
|
20
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
|
21
|
+
##############################################################################
|
|
22
|
+
|
|
23
|
+
require 'occi/log'
|
|
24
|
+
|
|
25
|
+
module OCCI
|
|
26
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
|
27
|
+
module Registry
|
|
28
|
+
|
|
29
|
+
@@categories = {}
|
|
30
|
+
@@locations = {}
|
|
31
|
+
|
|
32
|
+
def self.reset()
|
|
33
|
+
@@categories.each_value.each {|category| category.entities = [] if category.entities}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
|
37
|
+
def self.register(category)
|
|
38
|
+
OCCI::Log.debug("### Registering category #{category.type_identifier}")
|
|
39
|
+
@@categories[category.type_identifier] = category
|
|
40
|
+
@@locations[category.location] = category.type_identifier unless category.kind_of?(OCCI::Core::Action)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
|
44
|
+
def self.unregister(category)
|
|
45
|
+
OCCI::Log.debug("### Unregistering category #{category.type_identifier}")
|
|
46
|
+
@@categories.delete(category.type_identifier)
|
|
47
|
+
@@locations.delete(category.location) unless category.kind_of?(OCCI :Core::Action)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Returns the category corresponding to a given type identifier
|
|
51
|
+
#
|
|
52
|
+
# @param [URI] type identifier of a category
|
|
53
|
+
def self.get_by_id(id)
|
|
54
|
+
@@categories.fetch(id) { OCCI::Log.debug("Category with id #{id} not found"); nil }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns the category corresponding to a given location
|
|
58
|
+
#
|
|
59
|
+
# @param [URI] Location of a category
|
|
60
|
+
def self.get_by_location(location)
|
|
61
|
+
id = @@locations.fetch(location) { OCCI::Log.debug("Category with location #{location} not found"); nil }
|
|
62
|
+
self.get_by_id(id)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Return all categories from category registry. If filter is present, return only the categories specified by filter
|
|
66
|
+
#
|
|
67
|
+
# @param [Hashie:Hash] filter
|
|
68
|
+
# @return [Hashie::Mash] collection
|
|
69
|
+
def self.get(filter = [])
|
|
70
|
+
collection = Hashie::Mash.new({:kinds => [], :mixins => [], :actions => []})
|
|
71
|
+
filter.each do |cat|
|
|
72
|
+
category = get_by_id(cat.type_identifier)
|
|
73
|
+
collection.kinds << category if category.kind_of?(OCCI::Core::Kind)
|
|
74
|
+
collection.mixins << category if category.kind_of?(OCCI::Core::Mixin)
|
|
75
|
+
collection.actions << category if category.kind_of?(OCCI::Core::Action)
|
|
76
|
+
end
|
|
77
|
+
if filter.empty?
|
|
78
|
+
@@categories.each_value do |category|
|
|
79
|
+
collection.kinds << category if category.kind_of? OCCI::Core::Kind
|
|
80
|
+
collection.mixins << category if category.kind_of? OCCI::Core::Mixin
|
|
81
|
+
collection.actions << category if category.kind_of? OCCI::Core::Action
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
return collection
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|