opennebula 5.8.0 → 5.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cloud/CloudClient.rb +1 -1
- data/lib/opennebula.rb +1 -1
- data/lib/opennebula/client.rb +1 -1
- data/lib/opennebula/marketplaceapp.rb +104 -77
- data/lib/opennebula/pool.rb +15 -4
- data/lib/opennebula/virtual_machine_pool.rb +72 -55
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1806ffa746e5ae8534ea0bc1cd08afb5e0724c3
|
4
|
+
data.tar.gz: a483faf5b0133eec5e50190d642ba42a2a07def8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05939c12f4cf7689a9c81bcf1dbc99b805b4509505d25fec3d3193e0aeba98169042d7874b781aa2e02382a14d360ccd6893fcb644b85416ddf9256303e7ad58
|
7
|
+
data.tar.gz: 54d34d8da90fa155e030eab67093da2148a3a18b3d5fcf7e52711fda19b25b465e443ee38fababdb9d459094ba833b37e6ea70bafccfc0db60d4158fa7c5eb75
|
data/lib/cloud/CloudClient.rb
CHANGED
data/lib/opennebula.rb
CHANGED
data/lib/opennebula/client.rb
CHANGED
@@ -17,42 +17,45 @@
|
|
17
17
|
require 'opennebula/pool_element'
|
18
18
|
|
19
19
|
module OpenNebula
|
20
|
+
|
20
21
|
class MarketPlaceApp < PoolElement
|
22
|
+
|
21
23
|
#######################################################################
|
22
24
|
# Constants and Class Methods
|
23
25
|
#######################################################################
|
24
26
|
|
25
27
|
MARKETPLACEAPP_METHODS = {
|
26
|
-
:info =>
|
27
|
-
:allocate =>
|
28
|
-
:delete =>
|
29
|
-
:update =>
|
30
|
-
:chown =>
|
31
|
-
:chmod =>
|
32
|
-
:rename =>
|
33
|
-
:enable =>
|
34
|
-
:lock =>
|
35
|
-
:unlock =>
|
28
|
+
:info => 'marketapp.info',
|
29
|
+
:allocate => 'marketapp.allocate',
|
30
|
+
:delete => 'marketapp.delete',
|
31
|
+
:update => 'marketapp.update',
|
32
|
+
:chown => 'marketapp.chown',
|
33
|
+
:chmod => 'marketapp.chmod',
|
34
|
+
:rename => 'marketapp.rename',
|
35
|
+
:enable => 'marketapp.enable',
|
36
|
+
:lock => 'marketapp.lock',
|
37
|
+
:unlock => 'marketapp.unlock'
|
36
38
|
}
|
37
39
|
|
38
|
-
MARKETPLACEAPP_STATES
|
40
|
+
MARKETPLACEAPP_STATES = %w{INIT READY LOCKED ERROR DISABLED}
|
39
41
|
|
40
42
|
SHORT_MARKETPLACEAPP_STATES={
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
'INIT' => 'ini',
|
44
|
+
'READY' => 'rdy',
|
45
|
+
'LOCKED' => 'lck',
|
46
|
+
'ERROR' => 'err',
|
47
|
+
'DISABLED' => 'dis'
|
46
48
|
}
|
47
49
|
|
48
|
-
MARKETPLACEAPP_TYPES
|
50
|
+
MARKETPLACEAPP_TYPES = %w{UNKNOWN IMAGE VMTEMPLATE SERVICE_TEMPLATE}
|
49
51
|
|
50
52
|
SHORT_MARKETPLACEAPP_TYPES = {
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
'UNKNOWN' => 'unk',
|
54
|
+
'IMAGE' => 'img',
|
55
|
+
'VMTEMPLATE' => 'tpl',
|
56
|
+
'SERVICE_TEMPLATE' => 'srv'
|
55
57
|
}
|
58
|
+
|
56
59
|
# Creates a MarketPlace description with just its identifier
|
57
60
|
# this method should be used to create plain MarketPlace objects.
|
58
61
|
# +id+ the id of the user
|
@@ -60,14 +63,14 @@ module OpenNebula
|
|
60
63
|
# Example:
|
61
64
|
# app = MarketPlaceApp.new(MarketPlace.build_xml(3),rpc_client)
|
62
65
|
#
|
63
|
-
def MarketPlaceApp.build_xml(pe_id=nil)
|
66
|
+
def MarketPlaceApp.build_xml(pe_id = nil)
|
64
67
|
if pe_id
|
65
68
|
app_xml = "<MARKETPLACEAPP><ID>#{pe_id}</ID></MARKETPLACEAPP>"
|
66
69
|
else
|
67
|
-
app_xml =
|
70
|
+
app_xml = '<MARKETPLACEAPP></MARKETPLACEAPP>'
|
68
71
|
end
|
69
72
|
|
70
|
-
XMLElement.build_xml(app_xml,'MARKETPLACEAPP')
|
73
|
+
XMLElement.build_xml(app_xml, 'MARKETPLACEAPP')
|
71
74
|
end
|
72
75
|
|
73
76
|
# Class constructor
|
@@ -80,7 +83,7 @@ module OpenNebula
|
|
80
83
|
#######################################################################
|
81
84
|
|
82
85
|
# Retrieves the information of the given marketplace app
|
83
|
-
def info
|
86
|
+
def info
|
84
87
|
super(MARKETPLACEAPP_METHODS[:info], 'MARKETPLACEAPP')
|
85
88
|
end
|
86
89
|
|
@@ -98,7 +101,7 @@ module OpenNebula
|
|
98
101
|
end
|
99
102
|
|
100
103
|
# Deletes the marketplace app
|
101
|
-
def delete
|
104
|
+
def delete
|
102
105
|
super(MARKETPLACEAPP_METHODS[:delete])
|
103
106
|
end
|
104
107
|
|
@@ -110,7 +113,7 @@ module OpenNebula
|
|
110
113
|
#
|
111
114
|
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
112
115
|
# otherwise
|
113
|
-
def update(new_template, append=false)
|
116
|
+
def update(new_template, append = false)
|
114
117
|
super(MARKETPLACEAPP_METHODS[:update], new_template, append ? 1 : 0)
|
115
118
|
end
|
116
119
|
|
@@ -152,7 +155,7 @@ module OpenNebula
|
|
152
155
|
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
153
156
|
# otherwise
|
154
157
|
def rename(name)
|
155
|
-
|
158
|
+
call(MARKETPLACEAPP_METHODS[:rename], @pe_id, name)
|
156
159
|
end
|
157
160
|
|
158
161
|
# Exports this app to a suitable OpenNebula object
|
@@ -168,79 +171,80 @@ module OpenNebula
|
|
168
171
|
# { :vm => [ vm ids/OpenNebula::Error ],
|
169
172
|
# :vmtemplate => [ vmtemplates ids/OpenNebula::Error ],
|
170
173
|
# :image => [ vm ids/OpenNebula::Error ] }
|
171
|
-
def export(options={})
|
172
|
-
|
173
|
-
return Error.new("Missing name to export app") if options[:name].nil?
|
174
|
-
|
175
|
-
rc = info
|
174
|
+
def export(options = {})
|
175
|
+
rc = info
|
176
176
|
return rc if OpenNebula.is_error?(rc)
|
177
|
-
return Error.new(
|
177
|
+
return Error.new('App is not READY') if state_str != 'READY'
|
178
178
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
tmpl=Base64::decode64(self['APPTEMPLATE64'])
|
183
|
-
else
|
184
|
-
tmpl=""
|
185
|
-
end
|
179
|
+
if options[:dsid].nil? && type_str != 'VMTEMPLATE'
|
180
|
+
return Error.new('Missing datastore id')
|
181
|
+
end
|
186
182
|
|
187
|
-
|
183
|
+
return Error.new('Missing name to export app') if options[:name].nil?
|
188
184
|
|
189
|
-
|
190
|
-
tmpl
|
191
|
-
|
185
|
+
if !self['APPTEMPLATE64'].nil?
|
186
|
+
tmpl = Base64.decode64(self['APPTEMPLATE64'])
|
187
|
+
else
|
188
|
+
tmpl = ''
|
189
|
+
end
|
190
|
+
|
191
|
+
name = options[:name] || "marketapp-#{id}"
|
192
|
+
options[:vmtemplate_name] = name unless options[:vmtemplate_name]
|
192
193
|
|
194
|
+
tmpl << "\n"
|
195
|
+
tmpl << "NAME=\"" << name << "\"\n"
|
196
|
+
tmpl << "FROM_APP=\"" << self['ID'] << "\"\n"
|
197
|
+
|
198
|
+
case type_str
|
199
|
+
when 'IMAGE'
|
193
200
|
image = Image.new(Image.build_xml, @client)
|
194
201
|
rc = image.allocate(tmpl, options[:dsid])
|
195
202
|
|
196
203
|
ds = OpenNebula::Datastore.new_with_id(options[:dsid], @client)
|
197
|
-
image.info
|
198
|
-
ds.info
|
199
|
-
|
200
|
-
xpath = 'TEMPLATE/DRIVER'
|
201
|
-
if ds[xpath] == 'vcenter' && self['FORMAT'] != 'iso' && self['FORMAT'] != 'vmdk'
|
202
|
-
image.replace({'FORMAT' => 'vmdk'})
|
203
|
-
elsif ds[xpath] && ds[xpath] != 'vcenter' && self['FORMAT'] == 'vmdk'
|
204
|
-
image.replace({'FORMAT' => ds[xpath] })
|
205
|
-
end
|
206
204
|
|
207
|
-
|
205
|
+
rc_image = image.info
|
206
|
+
rc_ds = ds.info
|
208
207
|
|
209
|
-
|
210
|
-
|
208
|
+
image_error = OpenNebula.is_error?(rc_image)
|
209
|
+
ds_error = OpenNebula.is_error?(rc_ds)
|
211
210
|
|
212
|
-
|
213
|
-
|
211
|
+
xpath = 'TEMPLATE/DRIVER'
|
212
|
+
format = self['FORMAT']
|
213
|
+
type = ds[xpath]
|
214
214
|
|
215
|
-
|
215
|
+
if !image_error && !ds_error
|
216
|
+
if type == 'vcenter' && format != 'iso' && format != 'vmdk'
|
217
|
+
image.replace('FORMAT' => 'vmdk')
|
218
|
+
elsif type && type != 'vcenter' && format == 'vmdk'
|
219
|
+
image.replace('FORMAT' => type)
|
220
|
+
end
|
221
|
+
end
|
216
222
|
|
217
|
-
|
218
|
-
tmpl << "DISK=[ IMAGE_ID = #{image.id} ]\n"
|
223
|
+
return { :image => [rc] } if OpenNebula.is_error?(rc)
|
219
224
|
|
220
|
-
|
221
|
-
rc = vmtpl.allocate(tmpl)
|
225
|
+
vmtpl_id = create_vmtemplate(options, image.id)
|
222
226
|
|
223
|
-
|
224
|
-
return { :image => [image_id], :vmtemplate => [rc] }
|
225
|
-
end
|
227
|
+
return { :image => [image.id], :vmtemplate => [vmtpl_id] }
|
226
228
|
|
227
|
-
|
228
|
-
|
229
|
+
when 'VMTEMPLATE'
|
230
|
+
# TODO import all the images associated to a VMTEMPLATE app
|
231
|
+
# current version only support no-image based apps (e.g. hybrid)
|
232
|
+
vmtpl_id = create_vmtemplate(options)
|
229
233
|
|
230
|
-
return { :image => [
|
234
|
+
return { :image => [], :vmtemplate => [vmtpl_id] }
|
231
235
|
else
|
232
|
-
return Error.new("App type #{
|
236
|
+
return Error.new("App type #{type_str} not supported")
|
233
237
|
end
|
234
238
|
end
|
235
239
|
|
236
240
|
# Enables this app
|
237
241
|
def enable
|
238
|
-
|
242
|
+
call(MARKETPLACEAPP_METHODS[:enable], @pe_id, true)
|
239
243
|
end
|
240
244
|
|
241
245
|
# Enables this app
|
242
246
|
def disable
|
243
|
-
|
247
|
+
call(MARKETPLACEAPP_METHODS[:enable], @pe_id, false)
|
244
248
|
end
|
245
249
|
|
246
250
|
# ---------------------------------------------------------------------
|
@@ -277,14 +281,37 @@ module OpenNebula
|
|
277
281
|
SHORT_MARKETPLACEAPP_STATES[state_str]
|
278
282
|
end
|
279
283
|
|
280
|
-
#Locked a MarketplaceApp
|
284
|
+
# Locked a MarketplaceApp
|
281
285
|
def lock(level)
|
282
|
-
|
286
|
+
call(MARKETPLACEAPP_METHODS[:lock], @pe_id, level)
|
283
287
|
end
|
284
288
|
|
285
|
-
#Unlocked a MarketplaceApp
|
289
|
+
# Unlocked a MarketplaceApp
|
286
290
|
def unlock()
|
287
|
-
|
291
|
+
call(MARKETPLACEAPP_METHODS[:unlock], @pe_id)
|
288
292
|
end
|
293
|
+
|
294
|
+
private
|
295
|
+
|
296
|
+
# Creates a VM template based on the VMTEMPLATE64 attribute
|
297
|
+
# @return [Integer, OpenNebula::Error] template id or error
|
298
|
+
# TODO this method needs to be extended to support [image_ids]
|
299
|
+
def create_vmtemplate(options, image_id = nil)
|
300
|
+
return -1 if self['TEMPLATE/VMTEMPLATE64'].nil?
|
301
|
+
|
302
|
+
tmpl = Base64.decode64(self['TEMPLATE/VMTEMPLATE64'])
|
303
|
+
|
304
|
+
tmpl << "\nNAME=\"#{options[:vmtemplate_name]}\"\n"
|
305
|
+
tmpl << "DISK=[ IMAGE_ID = #{image_id} ]\n" if image_id
|
306
|
+
|
307
|
+
vmtpl = Template.new(Template.build_xml, @client)
|
308
|
+
rc = vmtpl.allocate(tmpl)
|
309
|
+
|
310
|
+
return rc if OpenNebula.is_error?(rc)
|
311
|
+
|
312
|
+
vmtpl.id
|
313
|
+
end
|
314
|
+
|
289
315
|
end
|
316
|
+
|
290
317
|
end
|
data/lib/opennebula/pool.rb
CHANGED
@@ -64,6 +64,10 @@ module OpenNebula
|
|
64
64
|
|
65
65
|
alias_method :info!, :info
|
66
66
|
|
67
|
+
def info_extended(xml_method)
|
68
|
+
return xmlrpc_info(xml_info)
|
69
|
+
end
|
70
|
+
|
67
71
|
def info_all(xml_method, *args)
|
68
72
|
return xmlrpc_info(xml_method, INFO_ALL, -1, -1, *args)
|
69
73
|
end
|
@@ -232,13 +236,20 @@ module OpenNebula
|
|
232
236
|
# > 0 => page size
|
233
237
|
# current first element of the page
|
234
238
|
# hash:: return page as a hash
|
235
|
-
def get_page(size, current)
|
239
|
+
def get_page(size, current, extended = false)
|
236
240
|
rc = nil
|
237
241
|
|
238
|
-
if PAGINATED_POOLS.include?(@pool_name)
|
242
|
+
if PAGINATED_POOLS.include?(@pool_name)
|
243
|
+
pool_name = @pool_name.delete('_').downcase
|
244
|
+
|
245
|
+
if extended && pool_name == "vmpool"
|
246
|
+
method = "#{pool_name}.infoextended"
|
247
|
+
else
|
248
|
+
method = "#{pool_name}.info"
|
249
|
+
end
|
250
|
+
|
239
251
|
size = OpenNebula.pool_page_size if (!size || size == 0)
|
240
|
-
rc = @client.call(
|
241
|
-
@user_id, current, -size, -1)
|
252
|
+
rc = @client.call(method, @user_id, current, -size, -1)
|
242
253
|
|
243
254
|
initialize_xml(rc, @pool_name)
|
244
255
|
else
|
@@ -26,6 +26,7 @@ module OpenNebula
|
|
26
26
|
|
27
27
|
VM_POOL_METHODS = {
|
28
28
|
:info => "vmpool.info",
|
29
|
+
:info_extended => "vmpool.infoextended",
|
29
30
|
:monitoring => "vmpool.monitoring",
|
30
31
|
:accounting => "vmpool.accounting",
|
31
32
|
:showback => "vmpool.showback",
|
@@ -62,57 +63,70 @@ module OpenNebula
|
|
62
63
|
# No arguments, returns the not-in-done VMs for the user
|
63
64
|
# [user_id, start_id, end_id]
|
64
65
|
# [user_id, start_id, end_id, state]
|
66
|
+
alias_method :info!, :info
|
67
|
+
|
65
68
|
def info(*args)
|
66
69
|
case args.size
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
70
|
+
when 0
|
71
|
+
info_filter(VM_POOL_METHODS[:info],
|
72
|
+
@user_id,
|
73
|
+
-1,
|
74
|
+
-1,
|
75
|
+
INFO_NOT_DONE)
|
76
|
+
when 1
|
77
|
+
info_filter(VM_POOL_METHODS[:info],
|
78
|
+
args[0],
|
79
|
+
-1,
|
80
|
+
-1,
|
81
|
+
INFO_NOT_DONE)
|
82
|
+
when 3
|
83
|
+
info_filter(VM_POOL_METHODS[:info],
|
84
|
+
args[0],
|
85
|
+
args[1],
|
86
|
+
args[2],
|
87
|
+
INFO_NOT_DONE)
|
88
|
+
when 4
|
89
|
+
info_filter(VM_POOL_METHODS[:info],
|
90
|
+
args[0],
|
91
|
+
args[1],
|
92
|
+
args[2],
|
93
|
+
args[3])
|
91
94
|
end
|
92
95
|
end
|
93
96
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
# Define info methods shortcuts for different filters
|
98
|
+
# info_all()
|
99
|
+
# info_all!()
|
100
|
+
# info_all_extended
|
101
|
+
# info_all_extended!()
|
102
|
+
# info_mine()
|
103
|
+
# info_mine!()
|
104
|
+
# info_mine_extended
|
105
|
+
# info_mine_extended!()
|
106
|
+
# info_group()
|
107
|
+
# info_group!()
|
108
|
+
# info_group_extended
|
109
|
+
# info_group_extended!()
|
110
|
+
# info_primary_group()
|
111
|
+
# info_primary_group!()
|
112
|
+
# info_primary_group_extended
|
113
|
+
# info_primary_group_extended!()
|
114
|
+
%w[mine all group primary_group].each do |ifilter|
|
115
|
+
const_name = "OpenNebula::Pool::INFO_#{ifilter.upcase}"
|
116
|
+
|
117
|
+
define_method("info_#{ifilter}") do
|
118
|
+
info_filter(VM_POOL_METHODS[:info],
|
119
|
+
Object.const_get(const_name), -1, -1,INFO_NOT_DONE)
|
120
|
+
end
|
101
121
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
INFO_NOT_DONE)
|
108
|
-
end
|
122
|
+
define_method("info_#{ifilter}_extended") do
|
123
|
+
info_filter(VM_POOL_METHODS[:info_extended],
|
124
|
+
Object.const_get(const_name), -1, -1,
|
125
|
+
INFO_NOT_DONE)
|
126
|
+
end
|
109
127
|
|
110
|
-
|
111
|
-
|
112
|
-
INFO_GROUP,
|
113
|
-
-1,
|
114
|
-
-1,
|
115
|
-
INFO_NOT_DONE)
|
128
|
+
alias_method "info_#{ifilter}!".to_sym, "info_#{ifilter}".to_sym
|
129
|
+
alias_method "info_#{ifilter}_extended!".to_sym, "info_#{ifilter}_extended".to_sym
|
116
130
|
end
|
117
131
|
|
118
132
|
def info_search(args = {})
|
@@ -121,21 +135,24 @@ module OpenNebula
|
|
121
135
|
:start_id => -1,
|
122
136
|
:end_id => -1,
|
123
137
|
:state => INFO_NOT_DONE,
|
124
|
-
:query => ""
|
138
|
+
:query => "",
|
139
|
+
:extended => false
|
125
140
|
}.merge!(args)
|
126
141
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
142
|
+
if args[:extended]
|
143
|
+
method = VM_POOL_METHODS[:info_extended]
|
144
|
+
else
|
145
|
+
method = VM_POOL_METHODS[:info]
|
146
|
+
end
|
147
|
+
|
148
|
+
info_filter(method,
|
149
|
+
default_args[:who],
|
150
|
+
default_args[:start_id],
|
151
|
+
default_args[:end_id],
|
152
|
+
default_args[:state],
|
153
|
+
default_args[:query])
|
133
154
|
end
|
134
155
|
|
135
|
-
alias_method :info!, :info
|
136
|
-
alias_method :info_all!, :info_all
|
137
|
-
alias_method :info_mine!, :info_mine
|
138
|
-
alias_method :info_group!, :info_group
|
139
156
|
|
140
157
|
# Retrieves the monitoring data for all the VMs in the pool
|
141
158
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opennebula
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.8.
|
4
|
+
version: 5.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|