opennebula-cli 5.13.80.pre → 6.0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/oneacct +13 -2
- data/bin/oneacl +13 -2
- data/bin/onecluster +13 -2
- data/bin/onedatastore +13 -2
- data/bin/oneflow +13 -2
- data/bin/oneflow-template +13 -2
- data/bin/onegroup +13 -2
- data/bin/onehook +17 -6
- data/bin/onehost +15 -4
- data/bin/oneimage +19 -8
- data/bin/onemarket +13 -2
- data/bin/onemarketapp +23 -16
- data/bin/onesecgroup +13 -2
- data/bin/oneshowback +13 -2
- data/bin/onetemplate +28 -8
- data/bin/oneuser +13 -2
- data/bin/onevcenter +22 -6
- data/bin/onevdc +13 -2
- data/bin/onevm +180 -18
- data/bin/onevmgroup +17 -6
- data/bin/onevnet +17 -6
- data/bin/onevntemplate +17 -6
- data/bin/onevrouter +17 -6
- data/bin/onezone +15 -4
- data/lib/cli_helper.rb +13 -2
- data/lib/command_parser.rb +16 -13
- data/lib/one_helper.rb +4 -3
- data/lib/one_helper/oneacct_helper.rb +1 -3
- data/lib/one_helper/onecluster_helper.rb +75 -42
- data/lib/one_helper/oneimage_helper.rb +6 -0
- data/lib/one_helper/onemarketapp_helper.rb +12 -6
- data/lib/one_helper/onevm_helper.rb +20 -0
- data/lib/one_helper/onevnet_helper.rb +173 -151
- data/lib/one_helper/onezone_helper.rb +25 -21
- data/share/schemas/xsd/index.xsd +1 -0
- data/share/schemas/xsd/monitoring_data.xsd +41 -0
- data/share/schemas/xsd/opennebula_configuration.xsd +1 -0
- data/share/schemas/xsd/vnet.xsd +2 -0
- metadata +9 -8
data/bin/onesecgroup
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
data/bin/oneshowback
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
data/bin/onetemplate
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
@@ -214,8 +225,17 @@ CommandParser::CmdParser.new(ARGV) do
|
|
214
225
|
Creates a new VM instance from the given Template. This VM can be
|
215
226
|
managed with the 'onevm' command.
|
216
227
|
|
217
|
-
The source Template can be modified
|
218
|
-
|
228
|
+
The source Template can be modified by replacing existing attributes; or
|
229
|
+
adding new DISK or NIC elements. The new attributes can be specified with the
|
230
|
+
command options or the file argument.
|
231
|
+
|
232
|
+
Example:
|
233
|
+
|
234
|
+
- Instantiate a template and add a new NIC
|
235
|
+
onetemplate instantiate 23 --nic private_net
|
236
|
+
|
237
|
+
- Instantiate a template and replace CONTEXT with a new one
|
238
|
+
onetemplate instantiate 23 --startscript /path/to/my/start_script
|
219
239
|
EOT
|
220
240
|
|
221
241
|
command :instantiate, instantiate_desc, :templateid, [:file, nil],
|
@@ -395,9 +415,9 @@ CommandParser::CmdParser.new(ARGV) do
|
|
395
415
|
[Admin]: locks only Admin actions.
|
396
416
|
EOT
|
397
417
|
|
398
|
-
command :lock, lock_desc, :
|
418
|
+
command :lock, lock_desc, [:range, :templateid_list],
|
399
419
|
:options => [USE, MANAGE, ADMIN, ALL] do
|
400
|
-
helper.
|
420
|
+
helper.perform_actions(args[0], options, 'Template locked') do |t|
|
401
421
|
if !options[:use].nil?
|
402
422
|
level = 1
|
403
423
|
elsif !options[:manage].nil?
|
@@ -418,8 +438,8 @@ CommandParser::CmdParser.new(ARGV) do
|
|
418
438
|
Valid states are: All.
|
419
439
|
EOT
|
420
440
|
|
421
|
-
command :unlock, unlock_desc, :
|
422
|
-
helper.
|
441
|
+
command :unlock, unlock_desc, [:range, :templateid_list] do
|
442
|
+
helper.perform_actions(args[0], options, 'Template unlocked') do |t|
|
423
443
|
t.unlock
|
424
444
|
end
|
425
445
|
end
|
data/bin/oneuser
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
data/bin/onevcenter
CHANGED
@@ -28,14 +28,25 @@ else
|
|
28
28
|
REMOTES_LOCATION = ONE_LOCATION + '/var/remotes/'
|
29
29
|
end
|
30
30
|
|
31
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
31
32
|
if File.directory?(GEMS_LOCATION)
|
32
33
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
33
34
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
34
35
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
35
|
-
|
36
|
-
|
36
|
+
|
37
|
+
# Suppress warnings from Rubygems
|
38
|
+
# https://github.com/OpenNebula/one/issues/5379
|
39
|
+
begin
|
40
|
+
verb = $VERBOSE
|
41
|
+
$VERBOSE = nil
|
42
|
+
require 'rubygems'
|
43
|
+
Gem.use_paths(real_gems_path)
|
44
|
+
ensure
|
45
|
+
$VERBOSE = verb
|
46
|
+
end
|
37
47
|
end
|
38
48
|
end
|
49
|
+
# %%RUBYGEMS_SETUP_END%%
|
39
50
|
|
40
51
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
41
52
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
@@ -239,7 +250,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
239
250
|
" this input: #{args.first}"
|
240
251
|
end
|
241
252
|
|
242
|
-
importer.process_import(indexes) do |object_info|
|
253
|
+
importer.process_import(indexes, options) do |object_info|
|
243
254
|
helper.cli_dialogue(object_info)
|
244
255
|
end
|
245
256
|
|
@@ -260,10 +271,15 @@ CommandParser::CmdParser.new(ARGV) do
|
|
260
271
|
importer = VCenterDriver::VcImporter.new_child(helper.client,
|
261
272
|
vi_client,
|
262
273
|
options[:object])
|
263
|
-
importer.retrieve_resources(helper.parse_opts(options))
|
264
|
-
indexes = importer.get_indexes(args.first)
|
265
274
|
|
266
|
-
|
275
|
+
if options[:object] == 'networks' && !args.first.nil?
|
276
|
+
indexes = args.first
|
277
|
+
else
|
278
|
+
importer.retrieve_resources(helper.parse_opts(options))
|
279
|
+
indexes = importer.get_indexes(args.first)
|
280
|
+
end
|
281
|
+
|
282
|
+
importer.process_import(indexes, options)
|
267
283
|
|
268
284
|
importer.stdout
|
269
285
|
rescue StandardError => e
|
data/bin/onevdc
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
data/bin/onevm
CHANGED
@@ -26,14 +26,25 @@ else
|
|
26
26
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
27
|
end
|
28
28
|
|
29
|
+
# %%RUBYGEMS_SETUP_BEGIN%%
|
29
30
|
if File.directory?(GEMS_LOCATION)
|
30
31
|
real_gems_path = File.realpath(GEMS_LOCATION)
|
31
32
|
if !defined?(Gem) || Gem.path != [real_gems_path]
|
32
33
|
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
-
|
34
|
-
|
34
|
+
|
35
|
+
# Suppress warnings from Rubygems
|
36
|
+
# https://github.com/OpenNebula/one/issues/5379
|
37
|
+
begin
|
38
|
+
verb = $VERBOSE
|
39
|
+
$VERBOSE = nil
|
40
|
+
require 'rubygems'
|
41
|
+
Gem.use_paths(real_gems_path)
|
42
|
+
ensure
|
43
|
+
$VERBOSE = verb
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
47
|
+
# %%RUBYGEMS_SETUP_END%%
|
37
48
|
|
38
49
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
39
50
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
@@ -207,6 +218,27 @@ CommandParser::CmdParser.new(ARGV) do
|
|
207
218
|
:description => 'Market to save oneshot'
|
208
219
|
}
|
209
220
|
|
221
|
+
NIC_ID = {
|
222
|
+
:name => 'nic_id',
|
223
|
+
:large => '--nic-id nic_id',
|
224
|
+
:format => String,
|
225
|
+
:description => 'NIC to use when SSH'
|
226
|
+
}
|
227
|
+
|
228
|
+
CMD = {
|
229
|
+
:name => 'cmd',
|
230
|
+
:large => '--cmd cmd',
|
231
|
+
:format => String,
|
232
|
+
:description => 'CMD to run when SSH'
|
233
|
+
}
|
234
|
+
|
235
|
+
SSH_OPTS = {
|
236
|
+
:name => 'ssh_opts',
|
237
|
+
:large => '--ssh-options options',
|
238
|
+
:format => String,
|
239
|
+
:description => 'SSH options to use'
|
240
|
+
}
|
241
|
+
|
210
242
|
########################################################################
|
211
243
|
# Global Options
|
212
244
|
########################################################################
|
@@ -1310,9 +1342,9 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1310
1342
|
Valid states are: All.
|
1311
1343
|
EOT
|
1312
1344
|
|
1313
|
-
command :lock, lock_desc, :
|
1345
|
+
command :lock, lock_desc, [:range, :vmid_list],
|
1314
1346
|
:options => [USE, MANAGE, ADMIN, ALL] do
|
1315
|
-
helper.
|
1347
|
+
helper.perform_actions(args[0], options, 'VM locked') do |vm|
|
1316
1348
|
if !options[:use].nil?
|
1317
1349
|
level = 1
|
1318
1350
|
elsif !options[:manage].nil?
|
@@ -1333,8 +1365,8 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1333
1365
|
Valid states are: All.
|
1334
1366
|
EOT
|
1335
1367
|
|
1336
|
-
command :unlock, unlock_desc, :
|
1337
|
-
helper.
|
1368
|
+
command :unlock, unlock_desc, [:range, :vmid_list] do
|
1369
|
+
helper.perform_actions(args[0], options, 'VM unlocked') do |vm|
|
1338
1370
|
vm.unlock
|
1339
1371
|
end
|
1340
1372
|
end
|
@@ -1347,7 +1379,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1347
1379
|
You can configure the actions in /etc/one/cli/onevm.yaml
|
1348
1380
|
EOT
|
1349
1381
|
|
1350
|
-
command :'create-chart', create_chart_desc,
|
1382
|
+
command :'create-chart', create_chart_desc, :vmid do
|
1351
1383
|
charters = helper.get_charters
|
1352
1384
|
|
1353
1385
|
if charters.nil?
|
@@ -1361,7 +1393,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1361
1393
|
charters.each do |action, time|
|
1362
1394
|
sched = "+#{time[:time].to_i + acc_t}"
|
1363
1395
|
|
1364
|
-
helper.schedule_actions(args[0],
|
1396
|
+
helper.schedule_actions([args[0]].flatten,
|
1365
1397
|
{ :schedule => sched },
|
1366
1398
|
action.to_s,
|
1367
1399
|
time[:warning][:time] + acc_w)
|
@@ -1437,25 +1469,33 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1437
1469
|
helper.perform_action(args[0], options, 'Backup') do |vm|
|
1438
1470
|
vm.extend(OpenNebula::VirtualMachineExt)
|
1439
1471
|
|
1440
|
-
# If logger is specified use it, if not use STDOUT
|
1441
|
-
options[:logger].nil? ? log_to = STDOUT : log_to = options[:logger]
|
1442
|
-
|
1443
1472
|
# Read user options
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1473
|
+
if options[:verbose]
|
1474
|
+
log_to = STDOUT
|
1475
|
+
elsif !options[:logger].nil?
|
1476
|
+
log_to = options[:logger]
|
1477
|
+
end
|
1447
1478
|
|
1448
|
-
|
1449
|
-
|
1479
|
+
keep = options.key?(:keep)
|
1480
|
+
|
1481
|
+
if log_to
|
1482
|
+
logger = Logger.new(log_to)
|
1483
|
+
format = '%Y-%m-%d %H:%M:%S'
|
1484
|
+
|
1485
|
+
logger.formatter = proc do |severity, datetime, _p, msg|
|
1486
|
+
"#{datetime.strftime(format)} " \
|
1487
|
+
"#{severity.ljust(5)} : #{msg}\n"
|
1488
|
+
end
|
1450
1489
|
end
|
1451
1490
|
|
1491
|
+
binfo = {}
|
1492
|
+
binfo[:market] = options[:market]
|
1493
|
+
|
1452
1494
|
if options.key?(:oneshot)
|
1453
|
-
binfo = {}
|
1454
1495
|
binfo[:name] = "VM #{vm.id} BACKUP - " \
|
1455
1496
|
"#{Time.now.strftime('%Y%m%d_%k%M')}"
|
1456
1497
|
binfo[:freq] = 1
|
1457
1498
|
binfo[:last] = Time.now.to_i - 100
|
1458
|
-
binfo[:market] = options[:market]
|
1459
1499
|
end
|
1460
1500
|
|
1461
1501
|
begin
|
@@ -1518,6 +1558,128 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1518
1558
|
end
|
1519
1559
|
end
|
1520
1560
|
|
1561
|
+
ssh_desc = <<-EOT.unindent
|
1562
|
+
SSH into VM
|
1563
|
+
|
1564
|
+
Options example:
|
1565
|
+
|
1566
|
+
'-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
|
1567
|
+
EOT
|
1568
|
+
|
1569
|
+
command :ssh,
|
1570
|
+
ssh_desc,
|
1571
|
+
:vmid,
|
1572
|
+
[:login, nil],
|
1573
|
+
:options => [NIC_ID, CMD, SSH_OPTS] do
|
1574
|
+
helper.perform_action(args[0], options, 'SSH') do |vm|
|
1575
|
+
rc = vm.info
|
1576
|
+
|
1577
|
+
if OpenNebula.is_error?(rc)
|
1578
|
+
STDERR.puts rc.message
|
1579
|
+
exit(-1)
|
1580
|
+
end
|
1581
|
+
|
1582
|
+
# Get user to login
|
1583
|
+
args[1].nil? ? login = 'root' : login = args[1]
|
1584
|
+
|
1585
|
+
# Get CMD to run
|
1586
|
+
options[:cmd].nil? ? cmd = '' : cmd = options[:cmd]
|
1587
|
+
|
1588
|
+
# Get NIC to connect
|
1589
|
+
if options[:nic_id]
|
1590
|
+
nic = vm.retrieve_xmlelements(
|
1591
|
+
"//TEMPLATE/NIC[NIC_ID=\"#{options[:nic_id]}\"]"
|
1592
|
+
)[0]
|
1593
|
+
else
|
1594
|
+
nic = vm.retrieve_xmlelements('//TEMPLATE/NIC[SSH="YES"]')[0]
|
1595
|
+
end
|
1596
|
+
|
1597
|
+
nic = vm.retrieve_xmlelements('//TEMPLATE/NIC[1]')[0] if nic.nil?
|
1598
|
+
|
1599
|
+
if nic.nil?
|
1600
|
+
STDERR.puts 'No NIC found'
|
1601
|
+
exit(-1)
|
1602
|
+
end
|
1603
|
+
|
1604
|
+
# If there is node port
|
1605
|
+
if nic['EXTERNAL_PORT_RANGE']
|
1606
|
+
ip = vm.to_hash['VM']['HISTORY_RECORDS']['HISTORY']
|
1607
|
+
ip = [ip].flatten[-1]['HOSTNAME']
|
1608
|
+
port = Integer(nic['EXTERNAL_PORT_RANGE'].split(':')[0]) + 21
|
1609
|
+
else
|
1610
|
+
ip = nic['IP']
|
1611
|
+
port = 22
|
1612
|
+
end
|
1613
|
+
|
1614
|
+
options[:ssh_opts].nil? ? opts = '' : opts = options[:ssh_opts]
|
1615
|
+
|
1616
|
+
system("ssh #{opts} #{login}@#{ip} -p #{port} #{cmd}")
|
1617
|
+
end
|
1618
|
+
|
1619
|
+
$?.exitstatus
|
1620
|
+
end
|
1621
|
+
|
1622
|
+
port_desc = <<-EOT.unindent
|
1623
|
+
Get port forwarding from a NIC, e.g:
|
1624
|
+
|
1625
|
+
1.2.3.4@4000 -> 1, means that to connect to VM port 1, you need to
|
1626
|
+
connect to IP 1.2.3.4 in port 4000
|
1627
|
+
EOT
|
1628
|
+
|
1629
|
+
command :'port-forward',
|
1630
|
+
port_desc,
|
1631
|
+
:vmid,
|
1632
|
+
[:port, nil],
|
1633
|
+
:options => NIC_ID do
|
1634
|
+
helper.perform_action(args[0], options, 'Port Forward') do |vm|
|
1635
|
+
rc = vm.info
|
1636
|
+
|
1637
|
+
if OpenNebula.is_error?(rc)
|
1638
|
+
STDERR.puts rc.message
|
1639
|
+
exit(-1)
|
1640
|
+
end
|
1641
|
+
|
1642
|
+
if options[:nic_id]
|
1643
|
+
nic = vm.retrieve_xmlelements(
|
1644
|
+
"//TEMPLATE/NIC[NIC_ID=\"#{options[:nic_id]}\"]"
|
1645
|
+
)[0]
|
1646
|
+
else
|
1647
|
+
nic = vm.retrieve_xmlelements('//TEMPLATE/NIC[SSH="YES"]')[0]
|
1648
|
+
end
|
1649
|
+
|
1650
|
+
nic = vm.retrieve_xmlelements('//TEMPLATE/NIC[1]')[0] if nic.nil?
|
1651
|
+
|
1652
|
+
if nic.nil?
|
1653
|
+
STDERR.puts 'No NIC found'
|
1654
|
+
exit(-1)
|
1655
|
+
end
|
1656
|
+
|
1657
|
+
if nic['EXTERNAL_PORT_RANGE'].nil?
|
1658
|
+
STDERR.puts 'No PORT_RANGE found'
|
1659
|
+
exit(-1)
|
1660
|
+
end
|
1661
|
+
|
1662
|
+
ip = vm.to_hash['VM']['HISTORY_RECORDS']['HISTORY'][-1]['HOSTNAME']
|
1663
|
+
|
1664
|
+
e_range = nic['EXTERNAL_PORT_RANGE'].split(':')
|
1665
|
+
e_start_p = Integer(e_range[0])
|
1666
|
+
e_end_p = Integer(e_range[1])
|
1667
|
+
|
1668
|
+
i_range = nic['INTERNAL_PORT_RANGE'].split('-')
|
1669
|
+
i_start_p = Integer(i_range[0])
|
1670
|
+
i_end_p = Integer(i_range[1].split('/')[0])
|
1671
|
+
|
1672
|
+
if args[1].nil?
|
1673
|
+
[*e_start_p..e_end_p].zip([*i_start_p..i_end_p]) do |p1, p2|
|
1674
|
+
puts "#{ip}@#{p1} -> #{p2}"
|
1675
|
+
end
|
1676
|
+
else
|
1677
|
+
puts "#{ip}@#{e_start_p + Integer(args[1]) - 1} -> #{args[1]}"
|
1678
|
+
end
|
1679
|
+
end
|
1680
|
+
|
1681
|
+
end
|
1682
|
+
|
1521
1683
|
# Deprecated commands
|
1522
1684
|
|
1523
1685
|
deprecated_command(:shutdown, 'terminate')
|