opennebula 5.0.2 → 5.1.80.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/CommandManager.rb +69 -29
- data/lib/DriverExecHelper.rb +5 -8
- data/lib/OpenNebulaDriver.rb +18 -8
- data/lib/VirtualMachineDriver.rb +3 -17
- data/lib/cloud/CloudClient.rb +1 -1
- data/lib/opennebula.rb +1 -1
- data/lib/opennebula/user.rb +10 -4
- data/lib/opennebula/virtual_machine.rb +21 -0
- data/lib/vcenter_driver.rb +70 -65
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bce5ec2f4c8ec1633421f1998e9a659a3b712fe2
|
4
|
+
data.tar.gz: 75718ab515a32acc13a5f931836a7a77a02c6ce4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c69828852d920460e330c553ce20fd3f71e9450d5702576e4e800bbf12fbde0d273b8d7d03e4dd62c34971ba0c131d6e3fea21afc550de6a71794796f00d97d7
|
7
|
+
data.tar.gz: 23be93fa25689ce1d05d920a420cd3f766a47594a7f60d152539b3f013b953444357f8ebd01cdb8c6f0bbaa79c1186ad9beec04cea773c2ca4ee9b00b5c4a495
|
data/lib/CommandManager.rb
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
require 'pp'
|
18
18
|
require 'open3'
|
19
19
|
require 'stringio'
|
20
|
+
require 'timeout'
|
20
21
|
|
21
22
|
# Generic command executor that holds the code shared by all the command
|
22
23
|
# executors.
|
@@ -42,11 +43,14 @@ require 'stringio'
|
|
42
43
|
|
43
44
|
|
44
45
|
class GenericCommand
|
46
|
+
ERROR_OPEN = "ERROR MESSAGE --8<------"
|
47
|
+
ERROR_CLOSE = "ERROR MESSAGE ------>8--"
|
48
|
+
|
45
49
|
attr_reader :code, :stdout, :stderr, :command
|
46
50
|
|
47
51
|
# Creates a command and runs it
|
48
|
-
def self.run(command, logger=nil, stdin=nil)
|
49
|
-
cmd = self.new(command, logger, stdin)
|
52
|
+
def self.run(command, logger=nil, stdin=nil, timeout=nil)
|
53
|
+
cmd = self.new(command, logger, stdin, timeout)
|
50
54
|
cmd.run
|
51
55
|
cmd
|
52
56
|
end
|
@@ -54,39 +58,72 @@ class GenericCommand
|
|
54
58
|
# Creates the new command:
|
55
59
|
# +command+: string with the command to be executed
|
56
60
|
# +logger+: proc that takes a message parameter and logs it
|
57
|
-
def initialize(command, logger=nil, stdin=nil)
|
61
|
+
def initialize(command, logger=nil, stdin=nil, timeout=nil)
|
58
62
|
@command = command
|
59
63
|
@logger = logger
|
60
64
|
@stdin = stdin
|
65
|
+
@timeout = timeout
|
61
66
|
end
|
62
67
|
|
63
68
|
# Sends a log message to the logger proc
|
64
|
-
def log(message)
|
65
|
-
@logger.call(message) if @logger
|
69
|
+
def log(message, all=true)
|
70
|
+
@logger.call(message, all) if @logger
|
71
|
+
end
|
72
|
+
|
73
|
+
def kill(pid)
|
74
|
+
# executed processes now have its own process group to be able
|
75
|
+
# to kill all children
|
76
|
+
pgid = Process.getpgid(pid)
|
77
|
+
|
78
|
+
# Kill all processes belonging to process group
|
79
|
+
Process.kill("HUP", pgid * -1)
|
66
80
|
end
|
67
81
|
|
68
82
|
# Runs the command
|
69
83
|
def run
|
70
|
-
std =
|
84
|
+
std = nil
|
85
|
+
process = Proc.new do
|
86
|
+
std = execute
|
87
|
+
|
88
|
+
# Close standard IO descriptors
|
89
|
+
if @stdin
|
90
|
+
std[0] << @stdin
|
91
|
+
std[0].flush
|
92
|
+
end
|
93
|
+
std[0].close if !std[0].closed?
|
71
94
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
std[
|
95
|
+
@stdout=std[1].read
|
96
|
+
std[1].close if !std[1].closed?
|
97
|
+
|
98
|
+
@stderr=std[2].read
|
99
|
+
std[2].close if !std[2].closed?
|
100
|
+
|
101
|
+
@code=get_exit_code(@stderr)
|
102
|
+
|
103
|
+
if @code!=0
|
104
|
+
log("Command execution fail: #{command}")
|
105
|
+
log(@stderr)
|
106
|
+
end
|
76
107
|
end
|
77
|
-
std[0].close if !std[0].closed?
|
78
108
|
|
79
|
-
|
80
|
-
|
109
|
+
begin
|
110
|
+
if @timeout
|
111
|
+
Timeout.timeout(@timeout, nil, &process)
|
112
|
+
else
|
113
|
+
process.call
|
114
|
+
end
|
115
|
+
rescue Timeout::Error
|
116
|
+
error_message = "Timeout executing #{command}"
|
117
|
+
log(error_message)
|
118
|
+
|
119
|
+
@stderr = ERROR_OPEN + "\n" + error_message + "\n" + ERROR_CLOSE
|
81
120
|
|
82
|
-
|
83
|
-
std[2].close if !std[2].closed?
|
121
|
+
3.times {|n| std[n].close if !std[n].closed? }
|
84
122
|
|
85
|
-
|
123
|
+
pid = std[-1].pid
|
124
|
+
self.kill(pid)
|
86
125
|
|
87
|
-
|
88
|
-
log("Command execution fail: #{command}")
|
89
|
-
log(@stderr)
|
126
|
+
@code = 255
|
90
127
|
end
|
91
128
|
|
92
129
|
return @code
|
@@ -94,7 +131,7 @@ class GenericCommand
|
|
94
131
|
|
95
132
|
# Parses error message from +stderr+ output
|
96
133
|
def get_error_message
|
97
|
-
tmp=@stderr.scan(
|
134
|
+
tmp=@stderr.scan(/^#{ERROR_OPEN}\n(.*?)#{ERROR_CLOSE}$/m)
|
98
135
|
return "-" if !tmp[0]
|
99
136
|
tmp[0].join(' ').strip
|
100
137
|
end
|
@@ -124,7 +161,8 @@ class LocalCommand < GenericCommand
|
|
124
161
|
private
|
125
162
|
|
126
163
|
def execute
|
127
|
-
Open3.popen3("#{command} ; echo ExitCode: $? 1>&2"
|
164
|
+
Open3.popen3("#{command} ; echo ExitCode: $? 1>&2",
|
165
|
+
:pgroup => true)
|
128
166
|
end
|
129
167
|
end
|
130
168
|
|
@@ -134,26 +172,28 @@ class SSHCommand < GenericCommand
|
|
134
172
|
attr_accessor :host
|
135
173
|
|
136
174
|
# Creates a command and runs it
|
137
|
-
def self.run(command, host, logger=nil, stdin=nil)
|
138
|
-
cmd=self.new(command, host, logger, stdin)
|
175
|
+
def self.run(command, host, logger=nil, stdin=nil, timeout=nil)
|
176
|
+
cmd=self.new(command, host, logger, stdin, timeout)
|
139
177
|
cmd.run
|
140
178
|
cmd
|
141
179
|
end
|
142
180
|
|
143
181
|
# This one takes another parameter. +host+ is the machine
|
144
182
|
# where the command is going to be executed
|
145
|
-
def initialize(command, host, logger=nil, stdin=nil)
|
183
|
+
def initialize(command, host, logger=nil, stdin=nil, timeout=nil)
|
146
184
|
@host=host
|
147
|
-
super(command, logger, stdin)
|
185
|
+
super(command, logger, stdin, timeout)
|
148
186
|
end
|
149
187
|
|
150
188
|
private
|
151
189
|
|
152
190
|
def execute
|
153
191
|
if @stdin
|
154
|
-
Open3.popen3("ssh #{@host} #{@command} ; echo ExitCode: $? 1>&2"
|
192
|
+
Open3.popen3("ssh #{@host} #{@command} ; echo ExitCode: $? 1>&2",
|
193
|
+
:pgroup => true)
|
155
194
|
else
|
156
|
-
Open3.popen3("ssh -n #{@host} #{@command} ; echo ExitCode: $? 1>&2"
|
195
|
+
Open3.popen3("ssh -n #{@host} #{@command} ; echo ExitCode: $? 1>&2",
|
196
|
+
:pgroup => true)
|
157
197
|
end
|
158
198
|
end
|
159
199
|
end
|
@@ -161,13 +201,13 @@ end
|
|
161
201
|
class RemotesCommand < SSHCommand
|
162
202
|
|
163
203
|
# Creates a command and runs it
|
164
|
-
def self.run(command, host, remote_dir, logger=nil, stdin=nil, retries=0)
|
204
|
+
def self.run(command, host, remote_dir, logger=nil, stdin=nil, retries=0, timeout=nil)
|
165
205
|
cmd_file = command.split(' ')[0]
|
166
206
|
|
167
207
|
cmd_string = "'if [ -x \"#{cmd_file}\" ]; then #{command}; else\
|
168
208
|
exit #{MAGIC_RC}; fi'"
|
169
209
|
|
170
|
-
cmd = self.new(cmd_string, host, logger, stdin)
|
210
|
+
cmd = self.new(cmd_string, host, logger, stdin, timeout)
|
171
211
|
cmd.run
|
172
212
|
|
173
213
|
while cmd.code != 0 and retries != 0
|
data/lib/DriverExecHelper.rb
CHANGED
@@ -108,12 +108,11 @@ module DriverExecHelper
|
|
108
108
|
|
109
109
|
# Sends a log message to ONE. The +message+ can be multiline, it will
|
110
110
|
# be automatically splitted by lines.
|
111
|
-
def log(number, message)
|
111
|
+
def log(number, message, all=true)
|
112
112
|
in_error_message=false
|
113
113
|
msg=message.strip
|
114
114
|
msg.each_line {|line|
|
115
|
-
severity='I'
|
116
|
-
|
115
|
+
severity=all ? 'I' : nil
|
117
116
|
l=line.strip
|
118
117
|
|
119
118
|
if l=='ERROR MESSAGE --8<------'
|
@@ -134,21 +133,19 @@ module DriverExecHelper
|
|
134
133
|
severity='D'
|
135
134
|
when 'INFO'
|
136
135
|
severity='I'
|
137
|
-
else
|
138
|
-
severity='I'
|
139
136
|
end
|
140
137
|
end
|
141
138
|
end
|
142
139
|
|
143
|
-
send_message("LOG", severity, number, line.strip)
|
140
|
+
send_message("LOG", severity, number, line.strip) if severity
|
144
141
|
}
|
145
142
|
end
|
146
143
|
|
147
144
|
# Generates a proc with that calls log with a hardcoded number. It will
|
148
145
|
# be used to add loging to command actions
|
149
146
|
def log_method(num)
|
150
|
-
lambda {|message|
|
151
|
-
log(num, message)
|
147
|
+
lambda {|message, all=true|
|
148
|
+
log(num, message, all)
|
152
149
|
}
|
153
150
|
end
|
154
151
|
|
data/lib/OpenNebulaDriver.rb
CHANGED
@@ -53,12 +53,14 @@ class OpenNebulaDriver < ActionManager
|
|
53
53
|
:concurrency => 10,
|
54
54
|
:threaded => true,
|
55
55
|
:retries => 0,
|
56
|
-
:local_actions => {}
|
56
|
+
:local_actions => {},
|
57
|
+
:timeout => nil
|
57
58
|
}.merge!(options)
|
58
59
|
|
59
60
|
super(@options[:concurrency], @options[:threaded])
|
60
61
|
|
61
62
|
@retries = @options[:retries]
|
63
|
+
@timeout = @options[:timeout]
|
62
64
|
|
63
65
|
#Set default values
|
64
66
|
initialize_helper(directory, @options)
|
@@ -94,7 +96,11 @@ class OpenNebulaDriver < ActionManager
|
|
94
96
|
command = action_command_line(aname, params, options[:script_name])
|
95
97
|
|
96
98
|
if action_is_local?(aname)
|
97
|
-
|
99
|
+
stdin = Base64::encode64(options[:stdin].to_s.gsub("\n",""))
|
100
|
+
execution = LocalCommand.run(command,
|
101
|
+
log_method(id),
|
102
|
+
stdin,
|
103
|
+
@timeout)
|
98
104
|
elsif options[:ssh_stream]
|
99
105
|
if options[:stdin]
|
100
106
|
cmdin = "cat << EOT | #{command}"
|
@@ -104,15 +110,19 @@ class OpenNebulaDriver < ActionManager
|
|
104
110
|
stdin = nil
|
105
111
|
end
|
106
112
|
|
107
|
-
execution = options[:ssh_stream].run(cmdin,
|
113
|
+
execution = options[:ssh_stream].run(cmdin,
|
114
|
+
stdin,
|
115
|
+
command,
|
116
|
+
@timeout)
|
108
117
|
|
109
118
|
else
|
110
119
|
execution = RemotesCommand.run(command,
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
120
|
+
host,
|
121
|
+
@remote_scripts_base_path,
|
122
|
+
log_method(id),
|
123
|
+
options[:stdin],
|
124
|
+
@retries,
|
125
|
+
@timeout)
|
116
126
|
end
|
117
127
|
|
118
128
|
result, info = get_info_from_execution(execution)
|
data/lib/VirtualMachineDriver.rb
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
# See the License for the specific language governing permissions and #
|
14
14
|
# limitations under the License. #
|
15
15
|
#--------------------------------------------------------------------------- #
|
16
|
+
require 'opennebula'
|
16
17
|
require "OpenNebulaDriver"
|
17
18
|
require "CommandManager"
|
18
19
|
require 'base64'
|
@@ -52,23 +53,8 @@ class VirtualMachineDriver < OpenNebulaDriver
|
|
52
53
|
:update_sg => "UPDATESG"
|
53
54
|
}
|
54
55
|
|
55
|
-
POLL_ATTRIBUTE =
|
56
|
-
|
57
|
-
:cpu => "CPU",
|
58
|
-
:nettx => "NETTX",
|
59
|
-
:netrx => "NETRX",
|
60
|
-
:state => "STATE",
|
61
|
-
:disk_size => "DISK_SIZE",
|
62
|
-
:snapshot_size => "SNAPSHOT_SIZE"
|
63
|
-
}
|
64
|
-
|
65
|
-
VM_STATE = {
|
66
|
-
:active => 'a',
|
67
|
-
:paused => 'p',
|
68
|
-
:error => 'e',
|
69
|
-
:deleted => 'd',
|
70
|
-
:unknown => '-'
|
71
|
-
}
|
56
|
+
POLL_ATTRIBUTE = OpenNebula::VirtualMachine::Driver::POLL_ATTRIBUTE
|
57
|
+
VM_STATE = OpenNebula::VirtualMachine::Driver::VM_STATE
|
72
58
|
|
73
59
|
HOST_ARG = 1
|
74
60
|
|
data/lib/cloud/CloudClient.rb
CHANGED
data/lib/opennebula.rb
CHANGED
data/lib/opennebula/user.rb
CHANGED
@@ -54,6 +54,10 @@ module OpenNebula
|
|
54
54
|
# Driver name for x509 proxy authentication
|
55
55
|
X509_PROXY_AUTH = "x509_proxy"
|
56
56
|
|
57
|
+
# Same as User.cc
|
58
|
+
INVALID_NAME_CHARS = [" ", ":", "\t", "\n", "\v", "\f", "\r"]
|
59
|
+
INVALID_PASS_CHARS = [" ", "\t", "\n", "\v", "\f", "\r"]
|
60
|
+
|
57
61
|
# Creates a User description with just its identifier
|
58
62
|
# this method should be used to create plain User objects.
|
59
63
|
# +id+ the id of the user
|
@@ -188,15 +192,17 @@ module OpenNebula
|
|
188
192
|
|
189
193
|
# Sets the LOGIN_TOKEN for the user
|
190
194
|
#
|
191
|
-
# @param
|
195
|
+
# @param uname [String] of the user
|
192
196
|
# @param token [String] the login token, if empty OpenNebula will
|
193
197
|
# generate one
|
194
|
-
# @param expire [String] valid period of the token in secs. If
|
198
|
+
# @param expire [String] valid period of the token in secs. If == 0
|
195
199
|
# the token will be reset
|
200
|
+
# @param egid [Integer] Effective GID to use with this token. To use
|
201
|
+
# the current GID and user groups set it to -1
|
196
202
|
# @return [String, OpenNebula::Error] token in case of success, Error
|
197
203
|
# otherwise
|
198
|
-
def login(
|
199
|
-
return @client.call(USER_METHODS[:login],
|
204
|
+
def login(uname, token, expire, egid = -1)
|
205
|
+
return @client.call(USER_METHODS[:login], uname, token, expire, egid)
|
200
206
|
end
|
201
207
|
|
202
208
|
#######################################################################
|
@@ -218,6 +218,27 @@ module OpenNebula
|
|
218
218
|
'SL_PRIMARYIPADDRESS'
|
219
219
|
]
|
220
220
|
|
221
|
+
# VirtualMachineDriver constants
|
222
|
+
module Driver
|
223
|
+
POLL_ATTRIBUTE = {
|
224
|
+
:memory => "MEMORY",
|
225
|
+
:cpu => "CPU",
|
226
|
+
:nettx => "NETTX",
|
227
|
+
:netrx => "NETRX",
|
228
|
+
:state => "STATE",
|
229
|
+
:disk_size => "DISK_SIZE",
|
230
|
+
:snapshot_size => "SNAPSHOT_SIZE"
|
231
|
+
}
|
232
|
+
|
233
|
+
VM_STATE = {
|
234
|
+
:active => 'a',
|
235
|
+
:paused => 'p',
|
236
|
+
:error => 'e',
|
237
|
+
:deleted => 'd',
|
238
|
+
:unknown => '-'
|
239
|
+
}
|
240
|
+
end
|
241
|
+
|
221
242
|
# Creates a VirtualMachine description with just its identifier
|
222
243
|
# this method should be used to create plain VirtualMachine objects.
|
223
244
|
# +id+ the id of the vm
|
data/lib/vcenter_driver.rb
CHANGED
@@ -42,7 +42,6 @@ require 'yaml'
|
|
42
42
|
require 'opennebula'
|
43
43
|
require 'base64'
|
44
44
|
require 'openssl'
|
45
|
-
require 'VirtualMachineDriver'
|
46
45
|
|
47
46
|
################################################################################
|
48
47
|
# Monkey patch rbvmomi library with some extra functions
|
@@ -310,18 +309,22 @@ class VIClient
|
|
310
309
|
def find_vm_template(uuid)
|
311
310
|
version = @vim.serviceContent.about.version
|
312
311
|
|
312
|
+
found_vm = nil
|
313
|
+
|
313
314
|
if version.split(".").first.to_i >= 6
|
314
|
-
|
315
|
-
|
316
|
-
vms = VIClient.get_entities(@dc.vmFolder, 'VirtualMachine')
|
315
|
+
found_vm = @dc.vmFolder.findByUuid(uuid, RbVmomi::VIM::VirtualMachine, @dc)
|
316
|
+
end
|
317
317
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
318
|
+
return found_vm if found_vm
|
319
|
+
|
320
|
+
vms = VIClient.get_entities(@dc.vmFolder, 'VirtualMachine')
|
321
|
+
|
322
|
+
return vms.find do |v|
|
323
|
+
begin
|
324
|
+
v.config && v.config.uuid == uuid
|
325
|
+
rescue RbVmomi::VIM::ManagedObjectNotFound
|
326
|
+
false
|
327
|
+
end
|
325
328
|
end
|
326
329
|
end
|
327
330
|
|
@@ -1357,8 +1360,8 @@ end
|
|
1357
1360
|
class VCenterVm
|
1358
1361
|
attr_reader :vm
|
1359
1362
|
|
1360
|
-
POLL_ATTRIBUTE =
|
1361
|
-
VM_STATE =
|
1363
|
+
POLL_ATTRIBUTE = OpenNebula::VirtualMachine::Driver::POLL_ATTRIBUTE
|
1364
|
+
VM_STATE = OpenNebula::VirtualMachine::Driver::VM_STATE
|
1362
1365
|
|
1363
1366
|
############################################################################
|
1364
1367
|
# Creates a new VIVm using a RbVmomi::VirtualMachine object
|
@@ -2272,10 +2275,14 @@ private
|
|
2272
2275
|
vmid = xml.root.elements["/VM/ID"].text
|
2273
2276
|
context = xml.root.elements["/VM/TEMPLATE/CONTEXT"]
|
2274
2277
|
|
2275
|
-
|
2276
|
-
|
2277
|
-
|
2278
|
-
|
2278
|
+
token = vm.config.extraConfig.select do |val|
|
2279
|
+
val[:key] == "opennebula.token"
|
2280
|
+
end
|
2281
|
+
|
2282
|
+
if token && !token.empty?
|
2283
|
+
token = token.first[:value]
|
2284
|
+
else
|
2285
|
+
token = nil
|
2279
2286
|
end
|
2280
2287
|
|
2281
2288
|
# Add VMID to VM's extraConfig
|
@@ -2313,60 +2320,56 @@ private
|
|
2313
2320
|
|
2314
2321
|
# OneGate
|
2315
2322
|
onegate_token_flag = xml.root.elements["/VM/TEMPLATE/CONTEXT/TOKEN"]
|
2316
|
-
if onegate_token_flag and
|
2317
|
-
onegate_token_flag.text == "YES" and
|
2318
|
-
!newvm
|
2319
|
-
# Create the OneGate token string
|
2320
|
-
vmid_str = xml.root.elements["/VM/ID"].text
|
2321
|
-
stime_str = xml.root.elements["/VM/STIME"].text
|
2322
|
-
str_to_encrypt = "#{vmid_str}:#{stime_str}"
|
2323
|
-
|
2324
|
-
user_id = xml.root.elements['//CREATED_BY'].text
|
2325
|
-
|
2326
|
-
if user_id.nil?
|
2327
|
-
STDERR.puts {"VMID:#{vmid} CREATED_BY not present" \
|
2328
|
-
" in the VM TEMPLATE"}
|
2329
|
-
return nil
|
2330
|
-
end
|
2331
2323
|
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2324
|
+
if onegate_token_flag and onegate_token_flag.text == "YES"
|
2325
|
+
if token
|
2326
|
+
onegate_token_64 = token
|
2327
|
+
else
|
2328
|
+
# Create the OneGate token string
|
2329
|
+
vmid_str = xml.root.elements["/VM/ID"].text
|
2330
|
+
stime_str = xml.root.elements["/VM/STIME"].text
|
2331
|
+
str_to_encrypt = "#{vmid_str}:#{stime_str}"
|
2335
2332
|
|
2336
|
-
|
2337
|
-
STDERR.puts {"VMID:#{vmid} user.info" \
|
2338
|
-
" error: #{rc.message}"}
|
2339
|
-
return nil
|
2340
|
-
end
|
2333
|
+
user_id = xml.root.elements['//CREATED_BY'].text
|
2341
2334
|
|
2342
|
-
|
2335
|
+
if user_id.nil?
|
2336
|
+
STDERR.puts {"VMID:#{vmid} CREATED_BY not present" \
|
2337
|
+
" in the VM TEMPLATE"}
|
2338
|
+
return nil
|
2339
|
+
end
|
2343
2340
|
|
2344
|
-
|
2345
|
-
|
2346
|
-
|
2347
|
-
return nil
|
2348
|
-
end
|
2341
|
+
user = OpenNebula::User.new_with_id(user_id,
|
2342
|
+
OpenNebula::Client.new)
|
2343
|
+
rc = user.info
|
2349
2344
|
|
2350
|
-
|
2351
|
-
|
2352
|
-
|
2353
|
-
|
2354
|
-
|
2345
|
+
if OpenNebula.is_error?(rc)
|
2346
|
+
STDERR.puts {"VMID:#{vmid} user.info" \
|
2347
|
+
" error: #{rc.message}"}
|
2348
|
+
return nil
|
2349
|
+
end
|
2355
2350
|
|
2356
|
-
|
2351
|
+
token_password = user['TEMPLATE/TOKEN_PASSWORD']
|
2357
2352
|
|
2358
|
-
|
2359
|
-
|
2353
|
+
if token_password.nil?
|
2354
|
+
STDERR.puts {"VMID:#{vmid} TOKEN_PASSWORD not present"\
|
2355
|
+
" in the USER:#{user_id} TEMPLATE"}
|
2356
|
+
return nil
|
2357
|
+
end
|
2360
2358
|
|
2361
|
-
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
2365
|
-
|
2359
|
+
cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
|
2360
|
+
cipher.encrypt
|
2361
|
+
cipher.key = token_password
|
2362
|
+
onegate_token = cipher.update(str_to_encrypt)
|
2363
|
+
onegate_token << cipher.final
|
2366
2364
|
|
2367
|
-
|
2368
|
-
|
2365
|
+
onegate_token_64 = Base64.encode64(onegate_token).chop
|
2366
|
+
config_array << {
|
2367
|
+
:key => 'opennebula.token',
|
2368
|
+
:value => onegate_token_64
|
2369
|
+
}
|
2369
2370
|
end
|
2371
|
+
|
2372
|
+
context_text += "ONEGATE_TOKEN='#{onegate_token_64}'\n"
|
2370
2373
|
end
|
2371
2374
|
|
2372
2375
|
context_text = Base64.encode64(context_text.chop)
|
@@ -2423,7 +2426,8 @@ private
|
|
2423
2426
|
vm.config.hardware.device.select { |d|
|
2424
2427
|
if is_disk?(d)
|
2425
2428
|
disks.each{|disk|
|
2426
|
-
if
|
2429
|
+
if d.backing.respond_to?(:fileName) &&
|
2430
|
+
disk.elements["SOURCE"].text == d.backing.fileName &&
|
2427
2431
|
disks.delete(disk)
|
2428
2432
|
end
|
2429
2433
|
}
|
@@ -2581,13 +2585,13 @@ private
|
|
2581
2585
|
end
|
2582
2586
|
|
2583
2587
|
controller = nil
|
2584
|
-
|
2588
|
+
|
2585
2589
|
vm.config.hardware.device.each { |device|
|
2586
2590
|
(controller = device ; break) if device.deviceInfo.label == available_controller_label
|
2587
2591
|
}
|
2588
|
-
|
2592
|
+
|
2589
2593
|
new_unit_number = available_numbers.sort[0]
|
2590
|
-
|
2594
|
+
|
2591
2595
|
return controller, new_unit_number
|
2592
2596
|
end
|
2593
2597
|
|
@@ -2707,6 +2711,7 @@ private
|
|
2707
2711
|
disks.each{ |disk|
|
2708
2712
|
ds_and_img_name = "[#{disk['DATASTORE']}] #{disk['SOURCE']}"
|
2709
2713
|
vcenter_disk = vm.config.hardware.device.select { |d| is_disk?(d) &&
|
2714
|
+
d.backing.respond_to?(:fileName) &&
|
2710
2715
|
d.backing.fileName == ds_and_img_name }[0]
|
2711
2716
|
spec[:deviceChange] << {
|
2712
2717
|
:operation => :remove,
|
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.
|
4
|
+
version: 5.1.80.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -134,9 +134,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
134
|
version: '0'
|
135
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- - "
|
137
|
+
- - ">"
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version:
|
139
|
+
version: 1.3.1
|
140
140
|
requirements: []
|
141
141
|
rubyforge_project:
|
142
142
|
rubygems_version: 2.5.1
|