occi 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,131 @@
|
|
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: OpenNebula Backend
|
19
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
20
|
+
##############################################################################
|
21
|
+
|
22
|
+
require 'rubygems'
|
23
|
+
|
24
|
+
require 'occi/backend/opennebula/opennebula'
|
25
|
+
require 'occi/backend/ec2/ec2'
|
26
|
+
require 'occi/backend/dummy'
|
27
|
+
|
28
|
+
#require 'uuidtools'
|
29
|
+
#require 'OpenNebula/OpenNebula'
|
30
|
+
#require 'occi/CategoryRegistry'
|
31
|
+
#require 'occi/rendering/http/LocationRegistry'
|
32
|
+
|
33
|
+
# OpenNebula backend
|
34
|
+
#require 'occi/backend/opennebula/Compute'
|
35
|
+
#require 'occi/backend/opennebula/Network'
|
36
|
+
#require 'occi/backend/opennebula/Storage'
|
37
|
+
|
38
|
+
# OpenNebula backend based mixins
|
39
|
+
#require 'occi/extensions/one/Image'
|
40
|
+
#require 'occi/extensions/one/Network'
|
41
|
+
#require 'occi/extensions/one/VirtualMachine'
|
42
|
+
#require 'occi/extensions/one/VNC'
|
43
|
+
|
44
|
+
#require 'occi/extensions/Reservation'
|
45
|
+
|
46
|
+
#include OpenNebula
|
47
|
+
|
48
|
+
module OCCI
|
49
|
+
module Backend
|
50
|
+
|
51
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
52
|
+
RESOURCE_DEPLOY = :deploy
|
53
|
+
RESOURCE_UPDATE_STATE = :update_state
|
54
|
+
RESOURCE_DELETE = :delete
|
55
|
+
|
56
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
57
|
+
class Manager
|
58
|
+
|
59
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
60
|
+
private
|
61
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
62
|
+
|
63
|
+
@@backends_classes = {}
|
64
|
+
@@backends_operations = {}
|
65
|
+
|
66
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
67
|
+
public
|
68
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
69
|
+
|
70
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
71
|
+
def self.register_backend(backend_class, operations)
|
72
|
+
|
73
|
+
# Get ident of backend = class name downcased
|
74
|
+
# backend_ident = Object.const_get(backend_class).name.downcase
|
75
|
+
|
76
|
+
backend_ident = backend_class.name.downcase
|
77
|
+
|
78
|
+
@@backends_classes[backend_ident] = backend_class
|
79
|
+
@@backends_operations[backend_ident] = operations
|
80
|
+
end
|
81
|
+
|
82
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
83
|
+
def self.signal_resource(backend, operation, resource, operation_parameters = nil)
|
84
|
+
|
85
|
+
resource_type = resource.kind
|
86
|
+
backend_ident = backend.class.name.downcase
|
87
|
+
|
88
|
+
raise OCCI::BackendError, "Unknown backend: '#{backend_ident}'" unless @@backends_classes.has_key?(backend_ident)
|
89
|
+
|
90
|
+
operations = @@backends_operations[backend_ident]
|
91
|
+
|
92
|
+
raise OCCI::BackendError, "Resource type '#{resource_type}' not supported!" unless operations.has_key?(resource_type)
|
93
|
+
raise OCCI::BackendError, "Operation '#{operation}' not supported on resource category '#{resource_type}'!" unless operations[resource_type].has_key?(operation.to_sym)
|
94
|
+
|
95
|
+
# Delegate
|
96
|
+
|
97
|
+
if operations[resource_type][operation.to_sym].nil?
|
98
|
+
OCCI::Log.debug("No backend method configured => doing nothing...")
|
99
|
+
return
|
100
|
+
end
|
101
|
+
|
102
|
+
if operation_parameters.nil?
|
103
|
+
# Generic resource operation
|
104
|
+
backend.send(operations[resource_type][operation.to_sym], resource)
|
105
|
+
else
|
106
|
+
# Action related operation, we need to pass on the action parameters
|
107
|
+
backend.send(operations[resource_type][operation.to_sym], resource, operation_parameters)
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
113
|
+
def self.delegate_action(backend, action, parameters, resource)
|
114
|
+
|
115
|
+
OCCI::Log.debug("Delegating invocation of action [#{action}] on resource [#{resource}] with parameters [#{parameters}] to backend...")
|
116
|
+
|
117
|
+
# Use action term as ident
|
118
|
+
operation = action.term
|
119
|
+
|
120
|
+
begin
|
121
|
+
# TODO: define some convention for result handling!
|
122
|
+
signal_resource(backend, operation, resource, parameters)
|
123
|
+
|
124
|
+
rescue OCCI::BackendError
|
125
|
+
OCCI::Log.error("Action invocation failed!")
|
126
|
+
raise
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,360 @@
|
|
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: OpenNebula Backend
|
19
|
+
# Author(s): Hayati Bice, Florian Feldhaus, Piotr Kasprzak
|
20
|
+
##############################################################################
|
21
|
+
|
22
|
+
require 'occi/log'
|
23
|
+
require 'erubis'
|
24
|
+
|
25
|
+
module OCCI
|
26
|
+
module Backend
|
27
|
+
module OpenNebula
|
28
|
+
|
29
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
30
|
+
module Compute
|
31
|
+
|
32
|
+
TEMPLATECOMPUTERAWFILE = 'compute.erb'
|
33
|
+
|
34
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
35
|
+
# private
|
36
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
37
|
+
|
38
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
39
|
+
# PARSE OPENNEBULA COMPUTE OBJECT
|
40
|
+
def compute_parse_backend_object(backend_object)
|
41
|
+
|
42
|
+
# get information on compute object from OpenNebula backend
|
43
|
+
backend_object.info
|
44
|
+
|
45
|
+
compute_kind = OCCI::Registry.get_by_id("http://schemas.ogf.org/occi/infrastructure#compute")
|
46
|
+
|
47
|
+
compute = Hashie::Mash.new
|
48
|
+
|
49
|
+
compute.kind = compute_kind.type_identifier
|
50
|
+
compute.mixins = %w|http://opennebula.org/occi/infrastructure#compute|
|
51
|
+
compute.id = self.generate_occi_id(compute_kind, backend_object.id.to_s)
|
52
|
+
compute.title = backend_object['NAME']
|
53
|
+
compute.summary = backend_object['TEMPLATE/DESCRIPTION'] if backend_object['TEMPLATE/DESCRIPTION']
|
54
|
+
|
55
|
+
compute.attributes!.occi!.compute!.cores = backend_object['TEMPLATE/VCPU'].to_i if backend_object['TEMPLATE/VCPU']
|
56
|
+
compute.attributes!.occi!.compute!.architecture = "x64" if backend_object['TEMPLATE/ARCHITECTURE'] == "x86_64"
|
57
|
+
compute.attributes!.occi!.compute!.architecture = "x86" if backend_object['TEMPLATE/ARCHITECTURE'] == "i686"
|
58
|
+
compute.attributes!.occi!.compute!.memory = backend_object['TEMPLATE/MEMORY'].to_f/1000 if backend_object['TEMPLATE/MEMORY']
|
59
|
+
|
60
|
+
compute.attributes!.org!.opennebula!.compute!.cpu = backend_object['TEMPLATE/CPU'].to_f if backend_object['TEMPLATE/CPU']
|
61
|
+
compute.attributes!.org!.opennebula!.compute!.kernel = backend_object['TEMPLATE/KERNEL'] if backend_object['TEMPLATE/KERNEL']
|
62
|
+
compute.attributes!.org!.opennebula!.compute!.initrd = backend_object['TEMPLATE/INITRD'] if backend_object['TEMPLATE/INITRD']
|
63
|
+
compute.attributes!.org!.opennebula!.compute!.root = backend_object['TEMPLATE/ROOT'] if backend_object['TEMPLATE/ROOT']
|
64
|
+
compute.attributes!.org!.opennebula!.compute!.kernel_cmd = backend_object['TEMPLATE/KERNEL_CMD'] if backend_object['TEMPLATE/KERNEL_CMD']
|
65
|
+
compute.attributes!.org!.opennebula!.compute!.bootloader = backend_object['TEMPLATE/BOOTLOADER'] if backend_object['TEMPLATE/BOOTLOADER']
|
66
|
+
compute.attributes!.org!.opennebula!.compute!.boot = backend_object['TEMPLATE/BOOT'] if backend_object['TEMPLATE/BOOT']
|
67
|
+
|
68
|
+
compute = OCCI::Core::Resource.new(compute)
|
69
|
+
|
70
|
+
compute_set_state(backend_object, compute)
|
71
|
+
|
72
|
+
# TODO: refactor VNC handling
|
73
|
+
#if backend_object['TEMPLATE/GRAPHICS/TYPE'] == 'vnc' \
|
74
|
+
#and backend_object['HISTORY_RECORDS/HISTORY/HOSTNAME'] \
|
75
|
+
#and not OCCI::Server.config[:novnc_path].nil? \
|
76
|
+
#and not OCCI::Server.config[:vnc_proxy_base_port].nil?
|
77
|
+
#
|
78
|
+
# vnc_host = backend_object['HISTORY_RECORDS/HISTORY/HOSTNAME']
|
79
|
+
# vnc_port = backend_object['TEMPLATE/GRAPHICS/PORT']
|
80
|
+
#
|
81
|
+
# vnc_proxy_host = URI.parse(OCCI::Server.location).host
|
82
|
+
#
|
83
|
+
# # The noVNC proxy_port
|
84
|
+
# proxy_port = OCCI::Server.config[:vnc_proxy_base_port].to_i + vnc_port.to_i
|
85
|
+
#
|
86
|
+
# OCCI::Log.debug("NOVNC path: #{OCCI::Server.config[:novnc_path]}")
|
87
|
+
# OCCI::Log.debug("Graphics type: #{backend_object['TEMPLATE/GRAPHICS/TYPE']}")
|
88
|
+
# OCCI::Log.debug("VNC base port: #{OCCI::Server.config[:vnc_proxy_base_port]}")
|
89
|
+
# OCCI::Log.debug("VNC port: #{vnc_port}")
|
90
|
+
# OCCI::Log.debug("VNC host: #{vnc_host}")
|
91
|
+
#
|
92
|
+
# compute.mixins << OCCI::Registry.get_by_id("http://schemas.ogf.org/occi/infrastructure/compute#console")
|
93
|
+
#
|
94
|
+
# if occi_object.attributes['opennebula.vm.vnc'].nil? or occi_object.backend[:novnc_pipe].nil?
|
95
|
+
#
|
96
|
+
# # CREATE PROXY FOR VNC SERVER
|
97
|
+
# begin
|
98
|
+
# novnc_cmd = "#{OCCI::Server.config[:novnc_path]}/utils/websockify"
|
99
|
+
# pipe = IO.popen("#{novnc_cmd} --web #{OCCI::Server.config[:novnc_path]} #{proxy_port} #{vnc_host}:#{vnc_port}")
|
100
|
+
#
|
101
|
+
# if pipe
|
102
|
+
# vnc_url = OCCI::Server.config[:server].chomp('/') + ':' + vnc_port + '/vnc_auto.html?host=' + vnc_proxy_host + '&port=' + vnc_port
|
103
|
+
# OCCI::Log.debug("VNC URL: #{vnc_url}")
|
104
|
+
# occi_object.backend[:novnc_pipe] = pipe
|
105
|
+
# occi_object.attributes['opennebula.vm.vnc'] = vnc_host + ':' + vnc_port
|
106
|
+
# occi_object.attributes['opennebula.vm.web_vnc'] = vnc_url
|
107
|
+
# end
|
108
|
+
# rescue Exception => e
|
109
|
+
# OCCI::Log.error("Error in creating VNC proxy: #{e.message}")
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
# OCCI::Registry.get_by_id(kind).entities << compute
|
113
|
+
#end
|
114
|
+
|
115
|
+
compute_parse_links(compute, backend_object)
|
116
|
+
|
117
|
+
# register compute resource in entities of compute kind
|
118
|
+
compute_kind.entities << compute
|
119
|
+
end
|
120
|
+
|
121
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
122
|
+
# PARSE OPENNEBULA DEPENDENCIES TO E.G. STORAGE AND NETWORK LINKS
|
123
|
+
def compute_parse_links(compute, backend_object)
|
124
|
+
# create links for all storage instances
|
125
|
+
backend_object.each('TEMPLATE/DISK') do |disk|
|
126
|
+
OCCI::Log.debug("Storage Backend ID: #{disk['IMAGE_ID']}")
|
127
|
+
|
128
|
+
link = OCCI::Core::Link.new
|
129
|
+
storagelink_kind = OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure#storagelink')
|
130
|
+
link.kind = storagelink_kind.type_identifier
|
131
|
+
link.id = self.generate_occi_id(storagelink_kind, disk['IMAGE_ID'].to_s)
|
132
|
+
storage_kind = OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure#storage')
|
133
|
+
storage_id = self.generate_occi_id(storage_kind, disk['IMAGE_ID'].to_s)
|
134
|
+
target = storage_kind.entities.select { |entity| entity.id == storage_id }.first
|
135
|
+
if target.nil?
|
136
|
+
one_storage = Image.new(Image.build_xml(disk['IMAGE_ID']), @one_client)
|
137
|
+
self.storage_parse_backend_object(one_storage)
|
138
|
+
target = storage_kind.entities.select { |entity| entity.id == storage_id }.first
|
139
|
+
end
|
140
|
+
link.target = target.location
|
141
|
+
link.title = target.title
|
142
|
+
link.summary = target.summary
|
143
|
+
link.rel = storage_kind.type_identifier
|
144
|
+
link.source = compute.location
|
145
|
+
link.mixins << OCCI::Registry.get_by_id('http://opennebula.org/occi/infrastructure#storagelink')
|
146
|
+
link.attributes!.occi!.storagelink!.deviceid = disk['TARGET'] if disk['TARGET']
|
147
|
+
link.attributes!.org!.opennebula!.storagelink!.bus = disk['BUS'] if disk['BUS']
|
148
|
+
link.attributes!.org!.opennebula!.storagelink!.driver = disk['DRIVER'] if disk['TARGET']
|
149
|
+
|
150
|
+
# check link attributes against definition in kind and mixins
|
151
|
+
link.check
|
152
|
+
|
153
|
+
storagelink_kind.entities << link
|
154
|
+
end
|
155
|
+
|
156
|
+
#create links for all network instances
|
157
|
+
backend_object.each('TEMPLATE/NIC') do |nic|
|
158
|
+
OCCI::Log.debug("Network Backend ID: #{nic['NETWORK_ID']}")
|
159
|
+
|
160
|
+
link = OCCI::Core::Link.new
|
161
|
+
networkinterface_kind = OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure#networkinterface')
|
162
|
+
link.kind = networkinterface_kind.type_identifier
|
163
|
+
link.id = self.generate_occi_id(networkinterface_kind, nic['NETWORK_ID'].to_s)
|
164
|
+
network_kind = OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure#network')
|
165
|
+
network_id = self.generate_occi_id(network_kind, nic['NETWORK_ID'].to_s)
|
166
|
+
target = network_kind.entitis.select { |entity| entity.id == network_id }.first
|
167
|
+
if target.nil?
|
168
|
+
one_network = VirtualNetwork.new(VirtualNetwork.build_xml(nic['NETWORK_ID']), @one_client)
|
169
|
+
self.network_parse_backend_object(one_network)
|
170
|
+
target = network_kind.entities.select { |entity| entity.id == network_id }.first
|
171
|
+
end
|
172
|
+
link.target = target.location
|
173
|
+
link.title = target.title
|
174
|
+
link.summary = target.summary
|
175
|
+
link.rel = network_kind.type_identifier
|
176
|
+
link.source = compute.location
|
177
|
+
link.mixins << OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface')
|
178
|
+
link.mixins << OCCI::Registry.get_by_id('http://opennebula.org/occi/infrastructure#networkinterface')
|
179
|
+
link.attributes!.occi!.networkinterface!.address = nic['IP'] if nic['IP']
|
180
|
+
link.attributes!.occi!.networkinterface!.mac = nic['MAC'] if nic['MAC']
|
181
|
+
link.attributes!.occi!.networkinterface!.interface = nic['TARGET'] if nic['TARGET']
|
182
|
+
link.attributes!.org!.opennebula!.networkinterface!.bridge = nic['BRIDGE'] if nic['BRIDGE']
|
183
|
+
link.attributes!.org!.opennebula!.networkinterface!.script = nic['SCRIPT'] if nic['SCRIPT']
|
184
|
+
link.attributes!.org!.opennebula!.networkinterface!.white_ports_tcp = nic['WHITE_PORTS_TCP'] if nic['WHITE_PORTS_TCP']
|
185
|
+
link.attributes!.org!.opennebula!.networkinterface!.black_ports_tcp = nic['BLACK_PORTS_TCP'] if nic['BLACK_PORTS_TCP']
|
186
|
+
link.attributes!.org!.opennebula!.networkinterface!.white_ports_udp = nic['WHITE_PORTS_UDP'] if nic['WHITE_PORTS_UDP']
|
187
|
+
link.attributes!.org!.opennebula!.networkinterface!.black_ports_udp = nic['BLACK_PORTS_UDP'] if nic['BLACK_PORTS_UDP ']
|
188
|
+
link.attributes!.org!.opennebula!.networkinterface!.icmp = nic['ICMP'] if nic['ICMP ']
|
189
|
+
|
190
|
+
# check link attributes against definition in kind and mixins
|
191
|
+
link.check
|
192
|
+
|
193
|
+
networkinterface_kind.entities << link
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
198
|
+
public
|
199
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
200
|
+
|
201
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
202
|
+
def compute_deploy(compute)
|
203
|
+
os_tpl = compute.mixins!.select { |mixin| mixin.related_to?("http://schemas.ogf.org/occi/infrastructure#os_tpl") }.first
|
204
|
+
|
205
|
+
backend_object = nil
|
206
|
+
|
207
|
+
templates = TemplatePool.new(@one_client, OpenNebula::INFO_ACL)
|
208
|
+
templates.info
|
209
|
+
template = templates.select { |template| template['NAME'] == os_tpl.title }.first
|
210
|
+
if template
|
211
|
+
template.info
|
212
|
+
template['TEMPLATE/VCPU'] = compute.attributes.occi.compute.cores if compute.attributes!.occi!.compute!.cores
|
213
|
+
template['TEMPLATE/MEMORY'] = (compute.attributes.occi.compute.memory.to_f * 1000).to_s if compute.attributes!.occi!.compute!.memory
|
214
|
+
template['TEMPLATE/ARCHITECTURE'] = compute.attributes.occi.compute.architecture if compute.attributes!.occi!.compute!.architecture
|
215
|
+
template['TEMPLATE/CPU'] = compute.attributes.occi.compute.speed if compute.attributes!.occi!.compute!.speed
|
216
|
+
backend_object = template.instantiate
|
217
|
+
check_rc(backend_object)
|
218
|
+
else
|
219
|
+
backend_object = VirtualMachine.new(VirtualMachine.build_xml, @one_client)
|
220
|
+
|
221
|
+
template_location = OCCI::Server.config["TEMPLATE_LOCATION"] + TEMPLATECOMPUTERAWFILE
|
222
|
+
template = Erubis::Eruby.new(File.read(template_location)).evaluate(:compute => compute)
|
223
|
+
|
224
|
+
OCCI::Log.debug("Parsed template #{template}")
|
225
|
+
rc = backend_object.allocate(template)
|
226
|
+
check_rc(rc)
|
227
|
+
OCCI::Log.debug("Return code from OpenNebula #{rc}") if rc != nil
|
228
|
+
end
|
229
|
+
|
230
|
+
backend_object.info
|
231
|
+
compute.id = self.generate_occi_id(OCCI::Registry.get_by_id(compute.kind), backend_object['ID'].to_s)
|
232
|
+
|
233
|
+
compute_set_state(backend_object, compute)
|
234
|
+
|
235
|
+
OCCI::Log.debug("OpenNebula automatically triggers action start for Virtual Machines")
|
236
|
+
OCCI::Log.debug("Changing state to started")
|
237
|
+
end
|
238
|
+
|
239
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
240
|
+
def compute_set_state(backend_object, compute)
|
241
|
+
OCCI::Log.debug("current VM state is: #{backend_object.lcm_state_str}")
|
242
|
+
compute.links ||= []
|
243
|
+
case backend_object.lcm_state_str
|
244
|
+
when "RUNNING" then
|
245
|
+
compute.attributes!.occi!.compute!.state = "active"
|
246
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=stop',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#stop')
|
247
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=restart',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#restart')
|
248
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=suspend',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#suspend')
|
249
|
+
when "PROLOG", "BOOT", "SAVE_STOP", "SAVE_SUSPEND", "SAVE_MIGRATE", "MIGRATE", "PROLOG_MIGRATE", "PROLOG_RESUME" then
|
250
|
+
compute.attributes!.occi!.compute!.state = "inactive"
|
251
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=stop',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#stop')
|
252
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=restart',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#restart')
|
253
|
+
when "SUSPENDED" then
|
254
|
+
compute.attributes!.occi!.compute!.state = "suspended"
|
255
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=start',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#start')
|
256
|
+
when "FAIL" then
|
257
|
+
compute.attributes!.occi!.compute!.state = "error"
|
258
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=start',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#start')
|
259
|
+
else
|
260
|
+
compute.attributes!.occi!.compute!.state = "inactive"
|
261
|
+
compute.links << OCCI::Core::Link.new(:target=>compute.location + '?action=start',:rel=>'http://schemas.ogf.org/occi/infrastructure/compute/action#start')
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
266
|
+
def compute_delete(compute)
|
267
|
+
backend_object=VirtualMachine.new(VirtualMachine.build_xml(compute.backend[:id]), @one_client)
|
268
|
+
|
269
|
+
rc = backend_object.finalize
|
270
|
+
check_rc(rc)
|
271
|
+
# TODO: VNC
|
272
|
+
#OCCI::Log.debug("killing NoVNC pipe with pid #{compute.backend[:novnc_pipe].pid}") unless compute.backend[:novnc_pipe].nil?
|
273
|
+
#Process.kill 'INT', compute.backend[:novnc_pipe].pid unless compute.backend[:novnc_pipe].nil?
|
274
|
+
end
|
275
|
+
|
276
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
277
|
+
# GET ALL COMPUTE INSTANCES
|
278
|
+
def compute_register_all_instances
|
279
|
+
backend_object_pool = VirtualMachinePool.new(@one_client)
|
280
|
+
backend_object_pool.info(OCCI::Backend::OpenNebula::OpenNebula::INFO_ACL, -1, -1, OpenNebula::VirtualMachinePool::INFO_NOT_DONE)
|
281
|
+
compute_register_all_objects(backend_object_pool)
|
282
|
+
end
|
283
|
+
|
284
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
285
|
+
# GET ALL COMPUTE TEMPLATES
|
286
|
+
def compute_register_all_templates
|
287
|
+
backend_object_pool = TemplatePool.new(@one_client, INFO_ACL)
|
288
|
+
backend_object_pool.info
|
289
|
+
compute_register_all_objects(backend_object_pool, template = true)
|
290
|
+
end
|
291
|
+
|
292
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
293
|
+
# GET ALL COMPUTE OBJECTS
|
294
|
+
def compute_register_all_objects(backend_object_pool, template = false)
|
295
|
+
backend_object_pool.each { |backend_object| compute_parse_backend_object(backend_object) }
|
296
|
+
end
|
297
|
+
|
298
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
299
|
+
# COMPUTE ACTIONS
|
300
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
301
|
+
|
302
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
303
|
+
def compute_action_dummy(compute, parameters)
|
304
|
+
end
|
305
|
+
|
306
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
307
|
+
# COMPUTE Action start
|
308
|
+
def compute_start(compute, parameters)
|
309
|
+
backend_object = VirtualMachine.new(VirtualMachine.build_xml(compute.backend[:id]), @one_client)
|
310
|
+
rc = backend_object.resume
|
311
|
+
check_rc(rc)
|
312
|
+
end
|
313
|
+
|
314
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
315
|
+
# Action stop
|
316
|
+
def compute_stop(compute, parameters)
|
317
|
+
backend_object = VirtualMachine.new(VirtualMachine.build_xml(compute.backend[:id]), @one_client)
|
318
|
+
# TODO: implement parameters when available in OpenNebula
|
319
|
+
case parameters
|
320
|
+
when 'method="graceful"'
|
321
|
+
OCCI::Log.debug("Trying to stop VM graceful")
|
322
|
+
rc = backend_object.shutdown
|
323
|
+
when 'method="acpioff"'
|
324
|
+
OCCI::Log.debug("Trying to stop VM via ACPI off")
|
325
|
+
rc = backend_object.shutdown
|
326
|
+
else # method="poweroff" or no method specified
|
327
|
+
OCCI::Log.debug("Powering off VM")
|
328
|
+
rc = backend_object.shutdown
|
329
|
+
end
|
330
|
+
check_rc(rc)
|
331
|
+
end
|
332
|
+
|
333
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
334
|
+
# Action restart
|
335
|
+
def compute_restart(compute, parameters)
|
336
|
+
backend_object = VirtualMachine.new(VirtualMachine.build_xml(compute.backend[:id]), @one_client)
|
337
|
+
# TODO: implement parameters when available in OpenNebula
|
338
|
+
case parameters
|
339
|
+
when "graceful"
|
340
|
+
rc = vm.reboot
|
341
|
+
when "warm"
|
342
|
+
rc = vm.reboot
|
343
|
+
else # "cold" or no parameter specified
|
344
|
+
rc = vm.resubmit
|
345
|
+
end
|
346
|
+
check_rc(rc)
|
347
|
+
end
|
348
|
+
|
349
|
+
# ---------------------------------------------------------------------------------------------------------------------
|
350
|
+
# Action suspend
|
351
|
+
def compute_suspend(compute, parameters)
|
352
|
+
backend_object = VirtualMachine.new(VirtualMachine.build_xml(compute.backend[:id]), @one_client)
|
353
|
+
rc = vm.suspend
|
354
|
+
check_rc(rc)
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|