opennebula 5.2.1 → 5.3.80.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/VirtualMachineDriver.rb +7 -0
- data/lib/cloud/CloudClient.rb +1 -1
- data/lib/opennebula/acl.rb +8 -3
- data/lib/opennebula/client.rb +1 -1
- data/lib/opennebula/error.rb +10 -2
- data/lib/opennebula/group.rb +37 -7
- data/lib/opennebula/host.rb +15 -4
- data/lib/opennebula/server_cipher_auth.rb +5 -3
- data/lib/opennebula/system.rb +13 -1
- data/lib/opennebula/virtual_machine.rb +31 -34
- data/lib/opennebula/virtual_network.rb +32 -15
- data/lib/opennebula/vm_group.rb +151 -0
- data/lib/opennebula/vm_group_pool.rb +78 -0
- data/lib/opennebula/xml_element.rb +18 -0
- data/lib/opennebula/zone.rb +24 -1
- data/lib/opennebula.rb +3 -1
- data/lib/vcenter_driver.rb +35 -3111
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 793beff44dc5a782c2aafcfc3049362b981f972b
|
4
|
+
data.tar.gz: ed04d3cf4814a0715471a99342cf04811ad86520
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c892fa6c7a0f2012185c432eae4b7954ed3500f35962e4b5d453279db3c702f716d27fed588ae653cf383d7d8eede5dd4ecb55534bbc62d1c46033b75b452161
|
7
|
+
data.tar.gz: e751d6869d55f43512f28746bf0f4d98b8e0cdb67576263b5577a676013823286e020a05bd45109937198f4209f5fe6240812d9790009f52bd291c4b6a22e56e
|
data/lib/VirtualMachineDriver.rb
CHANGED
@@ -50,6 +50,7 @@ class VirtualMachineDriver < OpenNebulaDriver
|
|
50
50
|
:attach_nic => "ATTACHNIC",
|
51
51
|
:detach_nic => "DETACHNIC",
|
52
52
|
:disk_snapshot_create => "DISKSNAPSHOTCREATE",
|
53
|
+
:resize_disk => "RESIZEDISK",
|
53
54
|
:update_sg => "UPDATESG"
|
54
55
|
}
|
55
56
|
|
@@ -93,6 +94,7 @@ class VirtualMachineDriver < OpenNebulaDriver
|
|
93
94
|
register_action(ACTION[:attach_nic].to_sym, method("attach_nic"))
|
94
95
|
register_action(ACTION[:detach_nic].to_sym, method("detach_nic"))
|
95
96
|
register_action(ACTION[:disk_snapshot_create].to_sym, method("disk_snapshot_create"))
|
97
|
+
register_action(ACTION[:resize_disk].to_sym, method("resize_disk"))
|
96
98
|
register_action(ACTION[:update_sg].to_sym, method("update_sg"))
|
97
99
|
end
|
98
100
|
|
@@ -203,6 +205,11 @@ class VirtualMachineDriver < OpenNebulaDriver
|
|
203
205
|
send_message(ACTION[:disk_snapshot_create],RESULT[:failure],id,error)
|
204
206
|
end
|
205
207
|
|
208
|
+
def resize_disk(id, drv_message)
|
209
|
+
error = "Action not implemented by driver #{self.class}"
|
210
|
+
send_message(ACTION[:resize_disk],RESULT[:failure],id,error)
|
211
|
+
end
|
212
|
+
|
206
213
|
def update_sg(id, drv_message)
|
207
214
|
error = "Action not implemented by driver #{self.class}"
|
208
215
|
send_message(ACTION[:update_sg],RESULT[:failure],id,error)
|
data/lib/cloud/CloudClient.rb
CHANGED
data/lib/opennebula/acl.rb
CHANGED
@@ -23,19 +23,23 @@ module OpenNebula
|
|
23
23
|
# @<num>
|
24
24
|
# ALL
|
25
25
|
# RESOURCE -> + separated list and "/{#,@,%}<num>|ALL"
|
26
|
-
# VM
|
26
|
+
# VM
|
27
27
|
# HOST
|
28
28
|
# NET
|
29
29
|
# IMAGE
|
30
30
|
# USER
|
31
31
|
# TEMPLATE
|
32
32
|
# GROUP
|
33
|
-
#
|
33
|
+
# DATASTORE
|
34
|
+
# CLUSTER
|
35
|
+
# DOCUMENT
|
36
|
+
# ZONE
|
34
37
|
# SECGROUP
|
35
38
|
# VDC
|
36
39
|
# VROUTER
|
37
40
|
# MARKETPLACE
|
38
41
|
# MARKETPLACEAPP
|
42
|
+
# VMGROUP
|
39
43
|
# RIGHTS -> + separated list
|
40
44
|
# USE
|
41
45
|
# MANAGE
|
@@ -67,7 +71,8 @@ module OpenNebula
|
|
67
71
|
"VDC" => 0x2000000000000,
|
68
72
|
"VROUTER" => 0x4000000000000,
|
69
73
|
"MARKETPLACE" => 0x8000000000000,
|
70
|
-
"MARKETPLACEAPP"=> 0x10000000000000
|
74
|
+
"MARKETPLACEAPP"=> 0x10000000000000,
|
75
|
+
"VMGROUP" => 0x20000000000000
|
71
76
|
}
|
72
77
|
|
73
78
|
RIGHTS =
|
data/lib/opennebula/client.rb
CHANGED
data/lib/opennebula/error.rb
CHANGED
@@ -28,8 +28,10 @@ module OpenNebula
|
|
28
28
|
EACTION = 0x0800
|
29
29
|
EXML_RPC_API = 0x1000
|
30
30
|
EINTERNAL = 0x2000
|
31
|
-
|
32
|
-
|
31
|
+
EALLOCATE = 0x4000
|
32
|
+
ENOTDEFINED = 0xF001
|
33
|
+
EXML_RPC_CALL = 0xF002
|
34
|
+
|
33
35
|
attr_reader :message, :errno
|
34
36
|
|
35
37
|
# +message+ Description of the error
|
@@ -42,6 +44,11 @@ module OpenNebula
|
|
42
44
|
def to_str()
|
43
45
|
@message
|
44
46
|
end
|
47
|
+
|
48
|
+
def is_exml_rpc_call?()
|
49
|
+
@errno == EXML_RPC_CALL
|
50
|
+
end
|
51
|
+
|
45
52
|
end
|
46
53
|
|
47
54
|
# Returns true if the object returned by a method of the OpenNebula
|
@@ -49,4 +56,5 @@ module OpenNebula
|
|
49
56
|
def self.is_error?(value)
|
50
57
|
value.class==OpenNebula::Error
|
51
58
|
end
|
59
|
+
|
52
60
|
end
|
data/lib/opennebula/group.rb
CHANGED
@@ -37,7 +37,7 @@ module OpenNebula
|
|
37
37
|
SELF = -1
|
38
38
|
|
39
39
|
# Default resource ACL's for group users (create)
|
40
|
-
GROUP_DEFAULT_ACLS = "VM+IMAGE+TEMPLATE+DOCUMENT+SECGROUP+VROUTER"
|
40
|
+
GROUP_DEFAULT_ACLS = "VM+IMAGE+TEMPLATE+DOCUMENT+SECGROUP+VROUTER+VMGROUP"
|
41
41
|
|
42
42
|
# The default view for group and group admins, must be defined in
|
43
43
|
# sunstone_views.yaml
|
@@ -104,14 +104,14 @@ module OpenNebula
|
|
104
104
|
end
|
105
105
|
|
106
106
|
# Allocate group
|
107
|
-
rc =
|
107
|
+
rc = allocate(group_hash[:name])
|
108
108
|
return rc if OpenNebula.is_error?(rc)
|
109
109
|
|
110
110
|
# Set group ACLs to create resources
|
111
111
|
rc, msg = create_default_acls(group_hash[:resources])
|
112
112
|
|
113
113
|
if OpenNebula.is_error?(rc)
|
114
|
-
|
114
|
+
delete
|
115
115
|
error_msg = "Error creating group ACL's: #{rc.message}"
|
116
116
|
return OpenNebula::Error.new(error_msg)
|
117
117
|
end
|
@@ -119,7 +119,7 @@ module OpenNebula
|
|
119
119
|
# Set group ACLs to share resources
|
120
120
|
if group_hash[:shared_resources]
|
121
121
|
acls = Array.new
|
122
|
-
acls << "@#{
|
122
|
+
acls << "@#{id} #{group_hash[:shared_resources]}/@#{id} USE"
|
123
123
|
|
124
124
|
rc, msg = create_group_acls(acls)
|
125
125
|
|
@@ -134,7 +134,7 @@ module OpenNebula
|
|
134
134
|
rc = create_admin_user(group_hash)
|
135
135
|
|
136
136
|
if OpenNebula.is_error?(rc)
|
137
|
-
|
137
|
+
delete
|
138
138
|
error_msg = "Error creating admin user: #{rc.message}"
|
139
139
|
return OpenNebula::Error.new(error_msg)
|
140
140
|
end
|
@@ -163,10 +163,40 @@ module OpenNebula
|
|
163
163
|
sunstone_attrs << "GROUP_ADMIN_DEFAULT_VIEW=#{GROUP_ADMIN_SUNSTONE_VIEWS}"
|
164
164
|
end
|
165
165
|
|
166
|
+
do_update = false
|
167
|
+
|
166
168
|
if sunstone_attrs.length > 0
|
167
|
-
|
169
|
+
do_update = true
|
170
|
+
|
171
|
+
update_str = "SUNSTONE=[#{sunstone_attrs.join(",\n")}]\n"
|
172
|
+
end
|
173
|
+
|
174
|
+
opennebula_attrs = []
|
175
|
+
|
176
|
+
# Persistency attributes for new images
|
177
|
+
if group_hash[:opennebula]
|
178
|
+
if group_hash[:opennebula][:default_image_persistent]
|
179
|
+
opennebula_attrs << "DEFAULT_IMAGE_PERSISTENT=\""\
|
180
|
+
"#{group_hash[:opennebula][:default_image_persistent]}\""
|
181
|
+
end
|
182
|
+
|
183
|
+
if group_hash[:opennebula][:default_image_persistent_new]
|
184
|
+
opennebula_attrs << "DEFAULT_IMAGE_PERSISTENT_NEW=\""\
|
185
|
+
"#{group_hash[:opennebula][:default_image_persistent_new]}\""
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
if opennebula_attrs.length > 0
|
190
|
+
do_update = true
|
191
|
+
|
192
|
+
update_str += "OPENNEBULA=[#{opennebula_attrs.join(",\n")}]\n"
|
193
|
+
end
|
194
|
+
|
195
|
+
if do_update
|
196
|
+
rc = update(update_str, true)
|
197
|
+
|
168
198
|
if OpenNebula.is_error?(rc)
|
169
|
-
|
199
|
+
delete
|
170
200
|
error_msg = "Error updating group template: #{rc.message}"
|
171
201
|
return OpenNebula::Error.new(error_msg)
|
172
202
|
end
|
data/lib/opennebula/host.rb
CHANGED
@@ -223,12 +223,23 @@ module OpenNebula
|
|
223
223
|
xml = OpenNebula::VirtualMachine.build_xml
|
224
224
|
vm = OpenNebula::VirtualMachine.new(xml, @client)
|
225
225
|
|
226
|
-
|
226
|
+
# vCenter wild VMs has a different process
|
227
|
+
# image and vnets objects representing existing nics and disks
|
228
|
+
# must be created and referenced
|
229
|
+
vcenter_wild_vm = wild.key? "VCENTER_TEMPLATE"
|
230
|
+
if vcenter_wild_vm
|
231
|
+
require 'vcenter_driver'
|
232
|
+
host_id = self["ID"]
|
233
|
+
vm_ref = wild["DEPLOY_ID"]
|
234
|
+
return VCenterDriver::Importer.import_wild(host_id, vm_ref, vm, template)
|
235
|
+
else
|
236
|
+
rc = vm.allocate(template)
|
227
237
|
|
228
|
-
|
238
|
+
return rc if OpenNebula.is_error?(rc)
|
229
239
|
|
230
|
-
|
231
|
-
|
240
|
+
vm.deploy(id, false)
|
241
|
+
return vm.id
|
242
|
+
end
|
232
243
|
end
|
233
244
|
|
234
245
|
#######################################################################
|
@@ -39,12 +39,13 @@ class OpenNebula::ServerCipherAuth
|
|
39
39
|
@srv_passwd = srv_passwd
|
40
40
|
|
41
41
|
if !srv_passwd.empty?
|
42
|
-
|
42
|
+
# truncate token to 32-bytes for Ruby >= 2.4
|
43
|
+
@key = Digest::SHA1.hexdigest(@srv_passwd)[0..31]
|
43
44
|
else
|
44
45
|
@key = ""
|
45
46
|
end
|
46
47
|
|
47
|
-
@cipher = OpenSSL::Cipher
|
48
|
+
@cipher = OpenSSL::Cipher.new(CIPHER)
|
48
49
|
end
|
49
50
|
|
50
51
|
###########################################################################
|
@@ -109,7 +110,8 @@ class OpenNebula::ServerCipherAuth
|
|
109
110
|
# auth method for auth_mad
|
110
111
|
def authenticate(srv_user,srv_pass, signed_text)
|
111
112
|
begin
|
112
|
-
|
113
|
+
# truncate token to 32-bytes for Ruby >= 2.4
|
114
|
+
@key = srv_pass[0..31]
|
113
115
|
|
114
116
|
s_user, t_user, expires = decrypt(signed_text).split(':')
|
115
117
|
|
data/lib/opennebula/system.rb
CHANGED
@@ -29,7 +29,8 @@ module OpenNebula
|
|
29
29
|
:groupquotainfo => "groupquota.info",
|
30
30
|
:groupquotaupdate => "groupquota.update",
|
31
31
|
:version => "system.version",
|
32
|
-
:config => "system.config"
|
32
|
+
:config => "system.config",
|
33
|
+
:sql => "system.sql"
|
33
34
|
}
|
34
35
|
|
35
36
|
#######################################################################
|
@@ -46,6 +47,17 @@ module OpenNebula
|
|
46
47
|
# XML-RPC Methods
|
47
48
|
#######################################################################
|
48
49
|
|
50
|
+
# Executes and replicates SQL commands on OpenNebula DB
|
51
|
+
# @param [String] Sql string
|
52
|
+
# @param [Boolean] True to replicate command on a federation. To
|
53
|
+
# operate on federated tables
|
54
|
+
# @return [Integer, OpenNebula::Error] Sql execution result in case
|
55
|
+
# of success, Error otherwise
|
56
|
+
def sql_command(sql, federate)
|
57
|
+
return @client.call(SYSTEM_METHODS[:sql], sql, federate)
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
49
61
|
# Gets the oned version
|
50
62
|
#
|
51
63
|
# @return [String, OpenNebula::Error] the oned version in case
|
@@ -47,6 +47,7 @@ module OpenNebula
|
|
47
47
|
:disksnapshotcreate => "vm.disksnapshotcreate",
|
48
48
|
:disksnapshotrevert => "vm.disksnapshotrevert",
|
49
49
|
:disksnapshotdelete => "vm.disksnapshotdelete",
|
50
|
+
:diskresize => "vm.diskresize",
|
50
51
|
:updateconf => "vm.updateconf"
|
51
52
|
}
|
52
53
|
|
@@ -116,6 +117,9 @@ module OpenNebula
|
|
116
117
|
DISK_SNAPSHOT_DELETE
|
117
118
|
PROLOG_MIGRATE_UNKNOWN
|
118
119
|
PROLOG_MIGRATE_UNKNOWN_FAILURE
|
120
|
+
DISK_RESIZE
|
121
|
+
DISK_RESIZE_POWEROFF
|
122
|
+
DISK_RESIZE_UNDEPLOYED
|
119
123
|
}
|
120
124
|
|
121
125
|
SHORT_VM_STATES={
|
@@ -193,26 +197,25 @@ module OpenNebula
|
|
193
197
|
"DISK_SNAPSHOT" => "snap",
|
194
198
|
"DISK_SNAPSHOT_DELETE" => "snap",
|
195
199
|
"PROLOG_MIGRATE_UNKNOWN" => "migr",
|
196
|
-
"PROLOG_MIGRATE_UNKNOWN_FAILURE" => "fail"
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
SHORT_MIGRATE_REASON={
|
202
|
-
"NONE" => "none",
|
203
|
-
"ERROR" => "erro",
|
204
|
-
"USER" => "user"
|
200
|
+
"PROLOG_MIGRATE_UNKNOWN_FAILURE" => "fail",
|
201
|
+
"DISK_RESIZE" => "drsz",
|
202
|
+
"DISK_RESIZE_POWEROFF" => "drsz",
|
203
|
+
"DISK_RESIZE_UNDEPLOYED" => "drsz"
|
205
204
|
}
|
206
205
|
|
207
206
|
HISTORY_ACTION=%w{none migrate live-migrate shutdown shutdown-hard
|
208
207
|
undeploy undeploy-hard hold release stop suspend resume boot delete
|
209
208
|
delete-recreate reboot reboot-hard resched unresched poweroff
|
210
209
|
poweroff-hard disk-attach disk-detach nic-attach nic-detach
|
211
|
-
|
210
|
+
disk-snapshot-create disk-snapshot-delete terminate terminate-hard
|
211
|
+
disk-resize deploy chown chmod updateconf rename resize update
|
212
|
+
snapshot-resize snapshot-delete snapshot-revert disk-saveas
|
213
|
+
disk-snapshot-revert recover retry monitor}
|
212
214
|
|
213
215
|
EXTERNAL_IP_ATTRS = [
|
214
216
|
'GUEST_IP',
|
215
217
|
'AWS_IP_ADDRESS',
|
218
|
+
'AWS_PUBLIC_IP_ADDRESS',
|
216
219
|
'AWS_PRIVATE_IP_ADDRESS',
|
217
220
|
'AZ_IPADDRESS',
|
218
221
|
'SL_PRIMARYIPADDRESS'
|
@@ -256,13 +259,6 @@ module OpenNebula
|
|
256
259
|
XMLElement.build_xml(vm_xml, 'VM')
|
257
260
|
end
|
258
261
|
|
259
|
-
def VirtualMachine.get_reason(reason)
|
260
|
-
reason=MIGRATE_REASON[reason.to_i]
|
261
|
-
reason_str=SHORT_MIGRATE_REASON[reason]
|
262
|
-
|
263
|
-
reason_str
|
264
|
-
end
|
265
|
-
|
266
262
|
def VirtualMachine.get_history_action(action)
|
267
263
|
return HISTORY_ACTION[action.to_i]
|
268
264
|
end
|
@@ -354,7 +350,7 @@ module OpenNebula
|
|
354
350
|
ds = OpenNebula::Datastore.new_with_id(ds_id, @client)
|
355
351
|
rc = ds.info
|
356
352
|
return rc if OpenNebula.is_error?(rc)
|
357
|
-
self.update("
|
353
|
+
self.update("VCENTER_DS_REF=#{ds['/DATASTORE/VCENTER_DS_REF']}", true)
|
358
354
|
end
|
359
355
|
|
360
356
|
return call(VM_METHODS[:deploy],
|
@@ -659,6 +655,16 @@ module OpenNebula
|
|
659
655
|
return call(VM_METHODS[:disksnapshotdelete], @pe_id, disk_id, snap_id)
|
660
656
|
end
|
661
657
|
|
658
|
+
# Changes the size of a disk
|
659
|
+
#
|
660
|
+
# @param disk_id [Integer] Id of the disk
|
661
|
+
# @param size [Integer] new size in MiB
|
662
|
+
#
|
663
|
+
# @return [nil, OpenNebula::Error] nil in case of success or error
|
664
|
+
def disk_resize(disk_id, size)
|
665
|
+
return call(VM_METHODS[:diskresize], @pe_id, disk_id, size.to_s)
|
666
|
+
end
|
667
|
+
|
662
668
|
# Recovers an ACTIVE VM
|
663
669
|
#
|
664
670
|
# @param result [Integer] Recover with failure (0), success (1),
|
@@ -739,13 +745,6 @@ module OpenNebula
|
|
739
745
|
self['DEPLOY_ID']
|
740
746
|
end
|
741
747
|
|
742
|
-
# Returns the deploy_id of the VirtualMachine (numeric value)
|
743
|
-
def keep_disks?
|
744
|
-
!self['USER_TEMPLATE/KEEP_DISKS_ON_DONE'].nil? &&
|
745
|
-
self['USER_TEMPLATE/KEEP_DISKS_ON_DONE'].downcase=="yes"
|
746
|
-
end
|
747
|
-
|
748
|
-
|
749
748
|
# Clones the VM's source Template, replacing the disks with live snapshots
|
750
749
|
# of the current disks. The VM capacity and NICs are also preserved
|
751
750
|
#
|
@@ -755,6 +754,7 @@ module OpenNebula
|
|
755
754
|
#
|
756
755
|
# @return [Integer, OpenNebula::Error] the new Template ID in case of
|
757
756
|
# success, error otherwise
|
757
|
+
REMOVE_VNET_ATTRS = %w{AR_ID BRIDGE CLUSTER_ID IP MAC TARGET NIC_ID NETWORK_ID VN_MAD SECURITY_GROUPS}
|
758
758
|
def save_as_template(name, persistent=nil)
|
759
759
|
img_ids = []
|
760
760
|
new_tid = nil
|
@@ -852,21 +852,18 @@ module OpenNebula
|
|
852
852
|
end
|
853
853
|
|
854
854
|
self.each('TEMPLATE/NIC') do |nic|
|
855
|
+
|
855
856
|
nic_id = nic["NIC_ID"]
|
856
857
|
if nic_id.nil? || nic_id.empty?
|
857
858
|
rc = Error.new('The NIC_ID is missing from the VM template')
|
858
859
|
raise
|
859
860
|
end
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
if !net_id.nil? && !net_id.empty?
|
864
|
-
replace << "NIC = [ NETWORK_ID = #{net_id} ]\n"
|
865
|
-
else
|
866
|
-
# This NIC does not use a Virtual Network
|
867
|
-
replace << self.template_like_str(
|
868
|
-
"TEMPLATE", true, "NIC[NIC_ID=#{nic_id}]") << "\n"
|
861
|
+
REMOVE_VNET_ATTRS.each do |attr|
|
862
|
+
nic.delete_element(attr)
|
869
863
|
end
|
864
|
+
|
865
|
+
replace << self.template_like_str(
|
866
|
+
"TEMPLATE", true, "NIC[#{nic}]") << "\n"
|
870
867
|
end
|
871
868
|
|
872
869
|
# Required by the Sunstone Cloud View
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
require 'opennebula/pool_element'
|
19
|
+
require 'ipaddr'
|
19
20
|
|
20
21
|
module OpenNebula
|
21
22
|
class VirtualNetwork < PoolElement
|
@@ -184,11 +185,9 @@ module OpenNebula
|
|
184
185
|
def hold(ip, ar_id=-1)
|
185
186
|
return Error.new('ID not defined') if !@pe_id
|
186
187
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
addr_name = "IP"
|
191
|
-
end
|
188
|
+
addr_name = address_type(ip)
|
189
|
+
|
190
|
+
return addr_name if OpenNebula.is_error?(addr_name)
|
192
191
|
|
193
192
|
lease_template = "LEASES = [ #{addr_name} = #{ip}"
|
194
193
|
lease_template << ", AR_ID = #{ar_id}" if ar_id != -1
|
@@ -207,11 +206,9 @@ module OpenNebula
|
|
207
206
|
def release(ip, ar_id=-1)
|
208
207
|
return Error.new('ID not defined') if !@pe_id
|
209
208
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
addr_name = "IP"
|
214
|
-
end
|
209
|
+
addr_name = address_type(ip)
|
210
|
+
|
211
|
+
return addr_name if OpenNebula.is_error?(addr_name)
|
215
212
|
|
216
213
|
lease_template = "LEASES = [ #{addr_name} = #{ip}"
|
217
214
|
lease_template << ", AR_ID = #{ar_id}" if ar_id != -1
|
@@ -243,11 +240,9 @@ module OpenNebula
|
|
243
240
|
rtmpl << "NETWORK_ID = #{vnet}\n" if !vnet.nil?
|
244
241
|
|
245
242
|
if !addr.nil?
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
addr_name = "IP"
|
250
|
-
end
|
243
|
+
addr_name = address_type(addr)
|
244
|
+
|
245
|
+
return addr_name if OpenNebula.is_error?(addr_name)
|
251
246
|
|
252
247
|
rtmpl << "#{addr_name} = #{addr}\n"
|
253
248
|
end
|
@@ -342,5 +337,27 @@ module OpenNebula
|
|
342
337
|
chmod(-1, -1, -1, group_u, -1, -1, -1, -1, -1)
|
343
338
|
end
|
344
339
|
|
340
|
+
# Returns the OpenNebula name of the address to use it in LEASE
|
341
|
+
# attributes. MAC, IP or IP6 is returned for MAC addresses in colon
|
342
|
+
# notation, ipv4 and ipv6 respectively
|
343
|
+
def address_type(addr)
|
344
|
+
begin
|
345
|
+
ipaddr = IPAddr.new addr
|
346
|
+
|
347
|
+
if ipaddr.ipv4?
|
348
|
+
return "IP"
|
349
|
+
elsif ipaddr.ipv6?
|
350
|
+
return "IP6"
|
351
|
+
else
|
352
|
+
return Error.new('Unknown IP type')
|
353
|
+
end
|
354
|
+
rescue
|
355
|
+
if /^(\h{2}:){5}\h{2}$/ =~ addr
|
356
|
+
return "MAC"
|
357
|
+
else
|
358
|
+
return Error.new('Unknown address type')
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
345
362
|
end
|
346
363
|
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# -------------------------------------------------------------------------- #
|
2
|
+
# Copyright 2002-2017, OpenNebula Project, OpenNebula Systems #
|
3
|
+
# #
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
|
+
# not use this file except in compliance with the License. You may obtain #
|
6
|
+
# 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
|
+
require 'opennebula/pool_element'
|
18
|
+
|
19
|
+
module OpenNebula
|
20
|
+
class VMGroup < PoolElement
|
21
|
+
#######################################################################
|
22
|
+
# Constants and Class Methods
|
23
|
+
#######################################################################
|
24
|
+
VMGROUP_METHODS = {
|
25
|
+
:allocate => "vmgroup.allocate",
|
26
|
+
:info => "vmgroup.info",
|
27
|
+
:update => "vmgroup.update",
|
28
|
+
:delete => "vmgroup.delete",
|
29
|
+
:chown => "vmgroup.chown",
|
30
|
+
:chmod => "vmgroup.chmod",
|
31
|
+
:rename => "vmgroup.rename"
|
32
|
+
}
|
33
|
+
|
34
|
+
# Creates a VMGroup description with just its identifier
|
35
|
+
# this method should be used to create plain VMGroup objects.
|
36
|
+
# @param pe_id [Integer] the id of the object
|
37
|
+
def VMGroup.build_xml(pe_id=nil)
|
38
|
+
if pe_id
|
39
|
+
obj_xml = "<VM_GROUP><ID>#{pe_id}</ID></VM_GROUP>"
|
40
|
+
else
|
41
|
+
obj_xml = "<VM_GROUP></VM_GROUP>"
|
42
|
+
end
|
43
|
+
|
44
|
+
XMLElement.build_xml(obj_xml,'VM_GROUP')
|
45
|
+
end
|
46
|
+
|
47
|
+
# Class constructor
|
48
|
+
def initialize(xml, client)
|
49
|
+
super(xml,client)
|
50
|
+
|
51
|
+
@client = client
|
52
|
+
end
|
53
|
+
|
54
|
+
#######################################################################
|
55
|
+
# XML-RPC Methods for the VMGroup Object
|
56
|
+
#######################################################################
|
57
|
+
|
58
|
+
# Retrieves the information of the VMGroup.
|
59
|
+
def info()
|
60
|
+
super(VMGROUP_METHODS[:info], 'VM_GROUP')
|
61
|
+
end
|
62
|
+
|
63
|
+
alias_method :info!, :info
|
64
|
+
|
65
|
+
# Allocates a new VMGroup in OpenNebula
|
66
|
+
#
|
67
|
+
# @param description [String] The contents of the VMGroup.
|
68
|
+
#
|
69
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
70
|
+
# otherwise
|
71
|
+
def allocate(description)
|
72
|
+
super(VMGROUP_METHODS[:allocate], description)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Deletes the SecurityGroup
|
76
|
+
def delete()
|
77
|
+
super(VMGROUP_METHODS[:delete])
|
78
|
+
end
|
79
|
+
|
80
|
+
# Replaces the vm group contents
|
81
|
+
#
|
82
|
+
# @param new_vmgroup [String] New vmgroup contents
|
83
|
+
# @param append [true, false] True to append new attributes instead of
|
84
|
+
# replace the whole securitygroup
|
85
|
+
#
|
86
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
87
|
+
# otherwise
|
88
|
+
def update(new_vmgroup, append=false)
|
89
|
+
super(VMGROUP_METHODS[:update], new_vmgroup, append ? 1 : 0)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Changes the owner/group
|
93
|
+
#
|
94
|
+
# @param uid [Integer] the new owner id. Set to -1 to leave the current one
|
95
|
+
# @param gid [Integer] the new group id. Set to -1 to leave the current one
|
96
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
97
|
+
# otherwise
|
98
|
+
def chown(uid, gid)
|
99
|
+
super(VMGROUP_METHODS[:chown], uid, gid)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Changes the SecurityGroup permissions.
|
103
|
+
#
|
104
|
+
# @param octet [String] Permissions octed , e.g. 640
|
105
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
106
|
+
# otherwise
|
107
|
+
def chmod_octet(octet)
|
108
|
+
super(VMGROUP_METHODS[:chmod], octet)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Changes the SecurityGroup permissions.
|
112
|
+
# Each [Integer] argument must be 1 to allow, 0 deny, -1 do not change
|
113
|
+
#
|
114
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
115
|
+
# otherwise
|
116
|
+
def chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u,
|
117
|
+
other_m, other_a)
|
118
|
+
super(VMGROUP_METHODS[:chmod], owner_u, owner_m, owner_a, group_u,
|
119
|
+
group_m, group_a, other_u, other_m, other_a)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Renames this VMGroup
|
123
|
+
#
|
124
|
+
# @param name [String] New name for the VMGroup.
|
125
|
+
#
|
126
|
+
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
127
|
+
# otherwise
|
128
|
+
def rename(name)
|
129
|
+
return call(VMGROUP_METHODS[:rename], @pe_id, name)
|
130
|
+
end
|
131
|
+
|
132
|
+
#######################################################################
|
133
|
+
# Helpers to get VMGroup information
|
134
|
+
#######################################################################
|
135
|
+
|
136
|
+
# Returns the group identifier
|
137
|
+
# [return] _Integer_ the element's group ID
|
138
|
+
def gid
|
139
|
+
self['GID'].to_i
|
140
|
+
end
|
141
|
+
|
142
|
+
def owner_id
|
143
|
+
self['UID'].to_i
|
144
|
+
end
|
145
|
+
|
146
|
+
# [return] _Array_ with the name of roles
|
147
|
+
def role_names
|
148
|
+
self.retrieve_elements('ROLES/ROLE/NAME')
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|