occi 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/.gitignore +9 -0
  2. data/.project +32 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +1 -0
  6. data/AUTHORS +8 -0
  7. data/Gemfile +35 -14
  8. data/Gemfile.lock +89 -32
  9. data/LICENSE +13 -4
  10. data/README.md +70 -21
  11. data/Rakefile +25 -21
  12. data/lib/OpenNebula/Acl.rb +256 -0
  13. data/lib/OpenNebula/AclPool.rb +53 -0
  14. data/lib/OpenNebula/Group.rb +147 -0
  15. data/lib/OpenNebula/GroupPool.rb +54 -0
  16. data/lib/OpenNebula/Host.rb +143 -0
  17. data/lib/OpenNebula/HostPool.rb +55 -0
  18. data/lib/OpenNebula/Image.rb +256 -0
  19. data/lib/OpenNebula/ImagePool.rb +74 -0
  20. data/lib/OpenNebula/OpenNebula.rb +137 -0
  21. data/lib/OpenNebula/Pool.rb +285 -0
  22. data/lib/OpenNebula/Template.rb +173 -0
  23. data/lib/OpenNebula/TemplatePool.rb +74 -0
  24. data/lib/OpenNebula/User.rb +157 -0
  25. data/lib/OpenNebula/UserPool.rb +53 -0
  26. data/lib/OpenNebula/VirtualMachine.rb +319 -0
  27. data/lib/OpenNebula/VirtualMachinePool.rb +120 -0
  28. data/lib/OpenNebula/VirtualNetwork.rb +229 -0
  29. data/lib/OpenNebula/VirtualNetworkPool.rb +74 -0
  30. data/lib/OpenNebula/XMLUtils.rb +337 -0
  31. data/lib/occi/antlr/.gitignore +18 -0
  32. data/lib/occi/antlr/OCCI.g +164 -0
  33. data/lib/occi/antlr/OCCI.tokens +75 -0
  34. data/lib/occi/antlr/OCCILexer.rb +1532 -0
  35. data/lib/occi/antlr/OCCIParser.rb +2472 -0
  36. data/lib/occi/antlr/README.md +2 -0
  37. data/lib/occi/backend/dummy.rb +232 -0
  38. data/lib/occi/backend/ec2/Compute.rb +310 -0
  39. data/lib/occi/backend/ec2/compute.rb +310 -0
  40. data/lib/occi/backend/ec2/ec2.rb +215 -0
  41. data/lib/occi/backend/manager.rb +131 -0
  42. data/lib/occi/backend/opennebula/compute.rb +360 -0
  43. data/lib/occi/backend/opennebula/network.rb +143 -0
  44. data/lib/occi/backend/opennebula/opennebula.rb +188 -0
  45. data/lib/occi/backend/opennebula/storage.rb +175 -0
  46. data/lib/occi/configuration.rb +118 -0
  47. data/lib/occi/core/action.rb +29 -0
  48. data/lib/occi/core/attribute_properties.rb +54 -0
  49. data/lib/occi/core/attributes.rb +40 -0
  50. data/lib/occi/core/category.rb +62 -0
  51. data/lib/occi/core/collection.rb +27 -0
  52. data/lib/occi/core/entity.rb +135 -0
  53. data/lib/occi/core/kind.rb +55 -0
  54. data/lib/occi/core/link.rb +88 -0
  55. data/lib/occi/core/mixin.rb +43 -0
  56. data/lib/occi/core/resource.rb +73 -0
  57. data/lib/occi/exceptions.rb +59 -0
  58. data/lib/occi/extensions/monitoring/cpu.rb +51 -0
  59. data/lib/occi/extensions/monitoring/memory.rb +49 -0
  60. data/lib/occi/extensions/monitoring/metric.rb +54 -0
  61. data/lib/occi/extensions/monitoring/netrx.rb +49 -0
  62. data/lib/occi/extensions/monitoring/nettx.rb +55 -0
  63. data/lib/occi/extensions/one/VNC.rb +58 -0
  64. data/lib/occi/extensions/one/vnc.rb +58 -0
  65. data/lib/occi/log.rb +47 -0
  66. data/lib/occi/parse.rb +164 -0
  67. data/lib/occi/registry.rb +87 -0
  68. data/lib/occi/server.rb +594 -0
  69. data/lib/occi/version.rb +3 -0
  70. data/occi.gemspec +18 -96
  71. data/spec/occi/antlr/parser_spec.rb +82 -0
  72. data/spec/spec_helper.rb +6 -0
  73. metadata +100 -208
  74. data/.autotest +0 -21
  75. data/.rvmrc +0 -1
  76. data/VERSION +0 -1
  77. data/lib/occi.rb +0 -1
  78. data/lib/occi/client.rb +0 -36
  79. data/lib/occi/compute.rb +0 -4
  80. data/lib/occi/network.rb +0 -4
  81. data/lib/occi/resource.rb +0 -59
  82. data/lib/occi/storage.rb +0 -7
  83. data/test/fixtures/cassettes/compute_all.yml +0 -28
  84. data/test/fixtures/cassettes/compute_create.yml +0 -45
  85. data/test/fixtures/cassettes/compute_destroy.yml +0 -22
  86. data/test/fixtures/cassettes/compute_find.yml +0 -28
  87. data/test/fixtures/cassettes/compute_update.yml +0 -35
  88. data/test/fixtures/cassettes/network_all.yml +0 -28
  89. data/test/fixtures/cassettes/network_create.yml +0 -37
  90. data/test/fixtures/cassettes/network_destroy.yml +0 -22
  91. data/test/fixtures/cassettes/network_find.yml +0 -28
  92. data/test/fixtures/cassettes/storage_all.yml +0 -28
  93. data/test/fixtures/cassettes/storage_create.yml +0 -50
  94. data/test/fixtures/cassettes/storage_destroy.yml +0 -22
  95. data/test/fixtures/cassettes/storage_find.yml +0 -28
  96. data/test/lib/occi/compute_test.rb +0 -91
  97. data/test/lib/occi/network_test.rb +0 -57
  98. data/test/lib/occi/storage_test.rb +0 -67
  99. 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