occi 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,143 +0,0 @@
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
- require 'ipaddr'
25
-
26
- module OCCI
27
- module Backend
28
- module OpenNebula
29
-
30
- # ---------------------------------------------------------------------------------------------------------------------
31
- module Network
32
-
33
- TEMPLATENETWORKRAWFILE = 'network.erb'
34
-
35
- # ---------------------------------------------------------------------------------------------------------------------
36
- # private
37
- # ---------------------------------------------------------------------------------------------------------------------
38
-
39
- # ---------------------------------------------------------------------------------------------------------------------
40
- def network_parse_backend_object(backend_object)
41
-
42
- # get information on storage object from OpenNebula backend
43
- backend_object.info
44
-
45
- network_kind = OCCI::Registry.get_by_id("http://schemas.ogf.org/occi/infrastructure#network")
46
-
47
- network = Hashie::Mash.new
48
-
49
- network.kind = storage_kind.type_identifier
50
- network.mixins = %w|http://opennebula.org/occi/infrastructure#network http://schemas.ogf.org/occi/infrastructure#ipnetwork|
51
- network.id = self.generate_occi_id(network_kind, backend_object.id.to_s)
52
- network.title = backend_object['NAME']
53
- network.summary = backend_object['TEMPLATE/DESCRIPTION'] if backend_object['TEMPLATE/DESCRIPTION']
54
-
55
- network.attributes!.occi!.network!.address = backend_object['TEMPLATE/NETWORK_ADDRESS'] if backend_object['TEMPLATE/NETWORK_ADDRESS']
56
- network.attributes!.occi!.network!.gateway = backend_object['TEMPLATE/GATEWAY'] if backend_object['TEMPLATE/GATEWAY']
57
- network.attributes!.occi!.network!.vlan = backend_object['TEMPLATE/VLAN_ID'] if backend_object['TEMPLATE/VLAN_ID']
58
- network.attributes!.occi!.network!.allocation = "static" if backend_object['TEMPLATE/TYPE'].downcase == "fixed"
59
- network.attributes!.occi!.network!.allocation = "dynamic" if backend_object['TEMPLATE/TYPE'].downcase == "ranged"
60
-
61
- network.attributes!.org!.opennebula!.network!.vlan = backend_object['TEMPLATE/VLAN'] if backend_object['TEMPLATE/VLAN']
62
- network.attributes!.org!.opennebula!.network!.phydev = backend_object['TEMPLATE/PHYDEV'] if backend_object['TEMPLATE/PHYDEV']
63
- network.attributes!.org!.opennebula!.network!.bridge = backend_object['TEMPLATE/BRIDGE'] if backend_object['TEMPLATE/BRIDGE']
64
-
65
- network.attributes!.org!.opennebula!.network!.ip_start = backend_object['TEMPLATE/IP_START'] if backend_object['TEMPLATE/IP_START']
66
- network.attributes!.org!.opennebula!.network!.ip_end = backend_object['TEMPLATE/IP_END'] if backend_object['TEMPLATE/IP_END']
67
-
68
- network = OCCI::Core::Resource.new(network)
69
-
70
- network_set_state(backend_object, network)
71
-
72
- network_kind.entities << network
73
- end
74
-
75
- # ---------------------------------------------------------------------------------------------------------------------
76
- public
77
- # ---------------------------------------------------------------------------------------------------------------------
78
-
79
- # ---------------------------------------------------------------------------------------------------------------------
80
- def network_deploy(network)
81
-
82
- backend_object = VirtualNetwork.new(VirtualNetwork.build_xml(), @one_client)
83
-
84
- template_location = OCCI::Server.config["TEMPLATE_LOCATION"] + TEMPLATENETWORKRAWFILE
85
- template = Erubis::Eruby.new(File.read(template_raw)).evaluate(network)
86
-
87
- OCCI::Log.debug("Parsed template #{template}")
88
- rc = backend_object.allocate(template)
89
- check_rc(rc)
90
-
91
- backend_object.info
92
- network.id = self.generate_occi_id(OCCI::Registry.get_by_id(network.kind), backend_object['ID'].to_s)
93
-
94
- network_set_state(backend_object, network)
95
-
96
- OCCI::Log.debug("OpenNebula ID of virtual network: #{network.backend[:id]}")
97
- end
98
-
99
- # ---------------------------------------------------------------------------------------------------------------------
100
- def network_set_state(backend_object, network)
101
- network.attributes!.occi!.network!.state = "active"
102
- end
103
-
104
- # ---------------------------------------------------------------------------------------------------------------------
105
- def network_delete(network)
106
- backend_object = VirtualNetwork.new(VirtualNetwork.build_xml(network.backend[:id]), @one_client)
107
- rc = backend_object.delete
108
- check_rc(rc)
109
- end
110
-
111
- # ---------------------------------------------------------------------------------------------------------------------
112
- def network_register_all_instances
113
- occi_objects = []
114
- backend_object_pool=VirtualNetworkPool.new(@one_client, OCCI::Backend::OpenNebula::OpenNebula::INFO_ACL)
115
- backend_object_pool.info
116
- backend_object_pool.each { |backend_object| network_parse_backend_object(backend_object) }
117
- end
118
-
119
- # ---------------------------------------------------------------------------------------------------------------------
120
- # STORAGE ACTIONS
121
- # ---------------------------------------------------------------------------------------------------------------------
122
-
123
- # ---------------------------------------------------------------------------------------------------------------------
124
- def network_action_dummy(network, parameters)
125
- end
126
-
127
- # ---------------------------------------------------------------------------------------------------------------------
128
- def network_up(network, parameters)
129
- backend_object = VirtualNetwork.new(VirtualNetwork.build_xml(network.backend[:id]), @one_client)
130
- # not implemented in OpenNebula
131
- end
132
-
133
- # ---------------------------------------------------------------------------------------------------------------------
134
- def network_down(network, parameters)
135
- backend_object = VirtualNetwork.new(VirtualNetwork.build_xml(network.backend[:id]), @one_client)
136
- # not implemented in OpenNebula
137
- end
138
-
139
- end
140
-
141
- end
142
- end
143
- end
@@ -1,188 +0,0 @@
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
- require 'uuidtools'
24
- require 'OpenNebula/OpenNebula'
25
- require 'occi/registry'
26
-
27
- # OpenNebula backend
28
- require 'occi/backend/opennebula/compute'
29
- require 'occi/backend/opennebula/network'
30
- require 'occi/backend/opennebula/storage'
31
-
32
- # OpenNebula backend based mixins
33
- #require 'occi/extensions/one/Image'
34
- #require 'occi/extensions/one/Network'
35
- #require 'occi/extensions/one/VirtualMachine'
36
- #require 'occi/extensions/one/VNC'
37
-
38
- #require 'occi/extensions/Reservation'
39
-
40
- require 'occi/log'
41
-
42
- include OpenNebula
43
-
44
- module OCCI
45
- module Backend
46
- module OpenNebula
47
-
48
- # ---------------------------------------------------------------------------------------------------------------------
49
- class OpenNebula
50
-
51
- # The ACL level to be used when querying resource in OpenNebula:
52
- # - INFO_ALL returns all resources and works only when running under the oneadmin account
53
- # - INFO_GROUP returns the resources of the account + his group (= default)
54
- # - INFO_MINE returns only the resources of the account
55
- INFO_ACL = OpenNebula::Pool::INFO_GROUP
56
-
57
- include Compute
58
- include Network
59
- include Storage
60
-
61
-
62
- # Operation mappings
63
-
64
- OPERATIONS = {}
65
-
66
- OPERATIONS["http://schemas.ogf.org/occi/infrastructure#compute"] = {
67
-
68
- # Generic resource operations
69
- :deploy => :compute_deploy,
70
- :update_state => :compute_update_state,
71
- :delete => :compute_delete,
72
-
73
- # Compute specific resource operations
74
- :start => :compute_start,
75
- :stop => :compute_stop,
76
- :restart => :compute_restart,
77
- :suspend => :compute_suspend
78
- }
79
-
80
- OPERATIONS["http://schemas.ogf.org/occi/infrastructure#network"] = {
81
-
82
- # Generic resource operations
83
- :deploy => :network_deploy,
84
- :update_state => :network_update_state,
85
- :delete => :network_delete,
86
-
87
- # Network specific resource operations
88
- :up => :network_up,
89
- :down => :network_down
90
- }
91
-
92
- OPERATIONS["http://schemas.ogf.org/occi/infrastructure#storage"] = {
93
-
94
- # Generic resource operations
95
- :deploy => :storage_deploy,
96
- :update_state => :storage_update_state,
97
- :delete => :storage_delete,
98
-
99
- # Network specific resource operations
100
- :online => :storage_online,
101
- :offline => :storage_offline,
102
- :backup => :storage_backup,
103
- :snapshot => :storage_snapshot,
104
- :resize => :storage_resize
105
- }
106
-
107
- # ---------------------------------------------------------------------------------------------------------------------
108
- # Register backend specific mixins
109
- begin
110
- #OCCI::CategoryRegistry.register(OCCI::Backend::ONE::Image::MIXIN)
111
- #OCCI::CategoryRegistry.register(OCCI::Backend::ONE::Network::MIXIN)
112
- #OCCI::CategoryRegistry.register(OCCI::Backend::ONE::VirtualMachine::MIXIN)
113
- #OCCI::CategoryRegistry.register(OCCI::Mixins::Reservation::MIXIN)
114
- end
115
-
116
- # ---------------------------------------------------------------------------------------------------------------------
117
- # private
118
- # ---------------------------------------------------------------------------------------------------------------------
119
-
120
- # ---------------------------------------------------------------------------------------------------------------------
121
- def check_rc(rc)
122
- if rc.class == Error
123
- raise OCCI::BackendError, "Error message from OpenNebula: #{rc.to_str}"
124
- # TODO: return failed!
125
- end
126
- end
127
-
128
- # ---------------------------------------------------------------------------------------------------------------------
129
- # Generate a new occi id for resources created directly in OpenNebula using a seed id and the kind identifier
130
- def generate_occi_id(kind, seed_id)
131
- # Use strings as kind ids
132
- kind = kind.type_identifier if kind.kind_of?(OCCI::Core::Kind)
133
- return UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, "#{kind}:#{seed_id}").to_s
134
- end
135
-
136
- # ---------------------------------------------------------------------------------------------------------------------
137
- public
138
- # ---------------------------------------------------------------------------------------------------------------------
139
-
140
- # ---------------------------------------------------------------------------------------------------------------------
141
- def initialize(user, password)
142
-
143
- # TODO: create mixins from existing templates
144
-
145
- # initialize OpenNebula connection
146
- OCCI::Log.debug("### Initializing connection with OpenNebula")
147
-
148
- # TODO: check for error!
149
- # @one_client = Client.new(OCCI::Server.config['one_user'] + ':' + OCCI::Server.config['one_password'], OCCI::Server.config['one_xmlrpc'])
150
- @one_client = Client.new(user + ':' + password, OCCI::Server.config['one_xmlrpc'])
151
-
152
- end
153
-
154
- # ---------------------------------------------------------------------------------------------------------------------
155
- def register_existing_resources
156
- # get all compute objects
157
- resource_template_register
158
- os_template_register
159
- compute_register_all_instances
160
- network_register_all_instances
161
- storage_register_all_instances
162
- end
163
-
164
- # ---------------------------------------------------------------------------------------------------------------------
165
- def resource_template_register
166
- # currently not directly supported by OpenNebula
167
- end
168
-
169
- # ---------------------------------------------------------------------------------------------------------------------
170
- def os_template_register
171
- backend_object_pool=TemplatePool.new(@one_client, INFO_ACL)
172
- backend_object_pool.info
173
- backend_object_pool.each do |backend_object|
174
- related = OCCI::Registry.get_by_id('http://schemas.ogf.org/occi/infrastructure#os_tpl')
175
- term = backend_object['NAME'].downcase.chomp.gsub(/\W/, '_')
176
- # TODO: implement correct schema for service provider
177
- scheme = "http://schemas.opennebula.org/occi/infrastructure/os_tpl#"
178
- title = backend_object['NAME']
179
- mixin = OCCI::Core::Mixin.new(:related => related, :term=>term, :scheme=>scheme,:title=>title)
180
- OCCI::CategoryRegistry.register(mixin)
181
- end
182
- end
183
-
184
- end
185
-
186
- end
187
- end
188
- end
@@ -1,175 +0,0 @@
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 Storage
31
-
32
- TEMPLATESTORAGERAWFILE = 'storage.erb'
33
-
34
- # ---------------------------------------------------------------------------------------------------------------------
35
- # private
36
- # ---------------------------------------------------------------------------------------------------------------------
37
-
38
- # ---------------------------------------------------------------------------------------------------------------------
39
- def storage_parse_backend_object(backend_object)
40
-
41
- # get information on storage object from OpenNebula backend
42
- backend_object.info
43
-
44
- storage_kind = OCCI::Registry.get_by_id("http://schemas.ogf.org/occi/infrastructure#storage")
45
-
46
- storage = Hashie::Mash.new
47
-
48
- storage.kind = storage_kind.type_identifier
49
- storage.mixins = %w|http://opennebula.org/occi/infrastructure#storage|
50
- storage.id = self.generate_occi_id(storage_kind, backend_object.id.to_s)
51
- storage.title = backend_object['NAME']
52
- storage.summary = backend_object['TEMPLATE/DESCRIPTION'] if backend_object['TEMPLATE/DESCRIPTION']
53
-
54
- storage.attributes!.occi!.storage!.size = backend_object['TEMPLATE/SIZE'].to_f/1000 if backend_object['TEMPLATE/SIZE']
55
-
56
- storage.attributes!.org!.opennebula!.storage!.type = backend_object['TEMPLATE/TYPE'] if backend_object['TEMPLATE/TYPE']
57
- storage.attributes!.org!.opennebula!.storage!.persistent = backend_object['TEMPLATE/PERSISTENT'] if backend_object['TEMPLATE/PERSISTENT']
58
- storage.attributes!.org!.opennebula!.storage!.dev_prefix = backend_object['TEMPLATE/DEV_PREFIX'] if backend_object['TEMPLATE/DEV_PREFIX']
59
- storage.attributes!.org!.opennebula!.storage!.bus = backend_object['TEMPLATE/BUS'] if backend_object['TEMPLATE/BUS']
60
- storage.attributes!.org!.opennebula!.storage!.driver = backend_object['TEMPLATE/DRIVER'] if backend_object['TEMPLATE/DRIVER']
61
-
62
- storage = OCCI::Core::Resource.new(storage)
63
-
64
- storage_set_state(backend_object, storage)
65
-
66
- storage_kind.entities << storage
67
- end
68
-
69
- # ---------------------------------------------------------------------------------------------------------------------
70
- public
71
- # ---------------------------------------------------------------------------------------------------------------------
72
-
73
- # ---------------------------------------------------------------------------------------------------------------------
74
- def storage_deploy(storage)
75
-
76
- backend_object = Image.new(Image.build_xml, @one_client)
77
-
78
- template_location = OCCI::Server.config["TEMPLATE_LOCATION"] + TEMPLATESTORAGERAWFILE
79
- template = Erubis::Eruby.new(File.read(template_raw)).evaluate(storage)
80
-
81
- OCCI::Log.debug("Parsed template #{template}")
82
- rc = backend_object.allocate(template)
83
- check_rc(rc)
84
- OCCI::Log.debug("OpenNebula ID of image: #{storage.backend[:id]}")
85
-
86
- backend_object.info
87
- storage.id = self.generate_occi_id(OCCI::Registry.get_by_id(storage.kind), backend_object['ID'].to_s)
88
-
89
- storage_set_state(backend_object, storage)
90
- end
91
-
92
- # ---------------------------------------------------------------------------------------------------------------------
93
- def storage_set_state(backend_object, storage)
94
- OCCI::Log.debug("current Image state is: #{backend_object.state_str}")
95
- storage.links = []
96
- case backend_object.state_str
97
- when "READY", "USED", "LOCKED" then
98
- storage.attributes!.occi!.storage!.state = "online"
99
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=offline',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#offline')
100
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=backup',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#backup')
101
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=snapshot',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#snapshot')
102
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=resize',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#resize')
103
- when "ERROR" then
104
- storage.attributes!.occi!.storage!.state = "degraded"
105
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=online',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#online')
106
- else
107
- storage.attributes!.occi!.storage!.state = "offline"
108
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=online',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#online')
109
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=backup',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#backup')
110
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=snapshot',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#snapshot')
111
- storage.links << OCCI::Core::Link.new(:target=>storage.location + '?action=resize',:rel=>'http://schemas.ogf.org/occi/infrastructure/storage/action#resize')
112
- end
113
- end
114
-
115
- # ---------------------------------------------------------------------------------------------------------------------
116
- def storage_delete(storage)
117
- backend_object = Image.new(Image.build_xml(storage.backend.id), @one_client)
118
- rc = backend_object.delete
119
- check_rc(rc)
120
- end
121
-
122
- # ---------------------------------------------------------------------------------------------------------------------
123
- def storage_register_all_instances
124
- occi_objects = []
125
- backend_object_pool=ImagePool.new(@one_client, OCCI::Backend::OpenNebula::OpenNebula::INFO_ACL)
126
- backend_object_pool.info
127
- backend_object_pool.each { |backend_object| storage_parse_backend_object(backend_object) }
128
- end
129
-
130
- # ---------------------------------------------------------------------------------------------------------------------
131
- # STORAGE ACTIONS
132
- # ---------------------------------------------------------------------------------------------------------------------
133
-
134
- # ---------------------------------------------------------------------------------------------------------------------
135
- def storage_action_dummy(storage, parameters)
136
- end
137
-
138
- # ---------------------------------------------------------------------------------------------------------------------
139
- # Action online
140
- def storage_online(network, parameters)
141
- backend_object = Image.new(Image.build_xml(network.backend.id), @one_client)
142
- rc = backend_object.enable
143
- check_rc(rc)
144
- end
145
-
146
- # ---------------------------------------------------------------------------------------------------------------------
147
- # Action offline
148
- def storage_offline(network, parameters)
149
- backend_object = Image.new(Image.build_xml(network.backend.id), @one_client)
150
- rc = backend_object.disable
151
- check_rc(rc)
152
- end
153
-
154
- # ---------------------------------------------------------------------------------------------------------------------
155
- # Action backup
156
- def storage_backup(network, parameters)
157
- OCCI::Log.debug("not yet implemented")
158
- end
159
-
160
- # ---------------------------------------------------------------------------------------------------------------------
161
- # Action snapshot
162
- def storage_snapshot(network, parameters)
163
- OCCI::Log.debug("not yet implemented")
164
- end
165
-
166
- # ---------------------------------------------------------------------------------------------------------------------
167
- # Action resize
168
- def storage_resize(network, parameters)
169
- OCCI::Log.debug("not yet implemented")
170
- end
171
-
172
- end
173
- end
174
- end
175
- end