opennebula-cli 6.4.2 → 6.5.80.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/oneimage +51 -2
- data/bin/oneirb +0 -1
- data/bin/onevm +136 -146
- data/bin/onevnet +15 -3
- data/lib/one_helper/onehost_helper.rb +7 -15
- data/lib/one_helper/oneimage_helper.rb +69 -8
- data/lib/one_helper/onevm_helper.rb +66 -50
- data/lib/one_helper/onevnet_helper.rb +35 -1
- data/lib/one_helper.rb +1 -1
- data/share/schemas/xsd/acct.xsd +28 -0
- data/share/schemas/xsd/hook_message_state.xsd +5 -1
- data/share/schemas/xsd/image.xsd +18 -0
- data/share/schemas/xsd/opennebula_configuration.xsd +2 -0
- data/share/schemas/xsd/vm.xsd +30 -0
- data/share/schemas/xsd/vnet.xsd +28 -0
- data/share/schemas/xsd/vnet_pool.xsd +28 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fcdc66bd05f8d1764a49ddc05846af9544aec14538d28361836286a637db4762
|
4
|
+
data.tar.gz: c29bd48679f35bd2ad33535cb6c89c6d960eb79b9e16c19d4294c0f1646a8b77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9dffa57c55ca6b21db509f772754baea08f83e8313d58c76b2655a1cce55e824ef24245b971a04fa77c304ce649e5da7b9cc80e241b5d3e01a2ba22db2e6698
|
7
|
+
data.tar.gz: 3e77e5c5e2b9622c54c60e7bda07767092ab72d33a7563fb164d6da99f7befd398f19ce28b0c92281bda54a795cad5fb34222842e43c37b2d6f4f298518a8e42
|
data/bin/oneimage
CHANGED
@@ -94,6 +94,18 @@ CommandParser::CmdParser.new(ARGV) do
|
|
94
94
|
:description => 'Do not add context when building from Dockerfile'
|
95
95
|
}
|
96
96
|
|
97
|
+
NO_IP = {
|
98
|
+
:name => 'no_ip',
|
99
|
+
:large => '--no_ip',
|
100
|
+
:description => 'Do not keep NIC addresses (MAC, IP and IP6)'
|
101
|
+
}
|
102
|
+
|
103
|
+
NO_NIC = {
|
104
|
+
:name => 'no_nic',
|
105
|
+
:large => '--no_nic',
|
106
|
+
:description => 'Do not keep network mappings'
|
107
|
+
}
|
108
|
+
|
97
109
|
########################################################################
|
98
110
|
# Global Options
|
99
111
|
########################################################################
|
@@ -251,9 +263,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
251
263
|
Deletes the given Image
|
252
264
|
EOT
|
253
265
|
|
254
|
-
command :delete, delete_desc, [:range, :imageid_list]
|
266
|
+
command :delete, delete_desc, [:range, :imageid_list],
|
267
|
+
:options => [OpenNebulaHelper::FORCE] do
|
268
|
+
force = (options[:force] == true)
|
255
269
|
helper.perform_actions(args[0], options, 'deleting') do |image|
|
256
|
-
image.delete
|
270
|
+
image.delete(force)
|
257
271
|
end
|
258
272
|
end
|
259
273
|
|
@@ -410,6 +424,41 @@ CommandParser::CmdParser.new(ARGV) do
|
|
410
424
|
end
|
411
425
|
end
|
412
426
|
|
427
|
+
restore_desc = <<-EOT.unindent
|
428
|
+
Restore a backup image. It will restore the associated VM template to the VM template pool and
|
429
|
+
the disk images to the selected image datastore.
|
430
|
+
EOT
|
431
|
+
|
432
|
+
command :restore,
|
433
|
+
restore_desc,
|
434
|
+
:imageid,
|
435
|
+
:options => [OneDatastoreHelper::DATASTORE, NO_NIC, NO_IP] do
|
436
|
+
helper.perform_action(args[0], options, 'vm backup restored') do |o|
|
437
|
+
if options[:datastore].nil?
|
438
|
+
STDERR.puts 'Datastore to restore the backup is mandatory: '
|
439
|
+
STDERR.puts "\t -d datastore_id | name"
|
440
|
+
exit(-1)
|
441
|
+
end
|
442
|
+
|
443
|
+
restore_opts = ''
|
444
|
+
|
445
|
+
restore_opts << "NO_NIC=\"YES\"\n" if options[:no_nic]
|
446
|
+
restore_opts << "NO_IP=\"YES\"\n" if options[:no_ip]
|
447
|
+
|
448
|
+
rc = o.restore(options[:datastore].to_i, restore_opts)
|
449
|
+
|
450
|
+
if !OpenNebula.is_error?(rc)
|
451
|
+
ids = rc.split(' ')
|
452
|
+
|
453
|
+
puts "VM Template: #{ids[0]}" if ids[0]
|
454
|
+
puts "Images: #{ids[1..-1].join(' ')}" if ids.length > 1
|
455
|
+
else
|
456
|
+
puts rc.message
|
457
|
+
exit(-1)
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
413
462
|
list_desc = <<-EOT.unindent
|
414
463
|
Lists Images in the pool
|
415
464
|
EOT
|
data/bin/oneirb
CHANGED
data/bin/onevm
CHANGED
@@ -195,32 +195,6 @@ CommandParser::CmdParser.new(ARGV) do
|
|
195
195
|
:description => 'lock all actions'
|
196
196
|
}
|
197
197
|
|
198
|
-
LOGGER = {
|
199
|
-
:name => 'logger',
|
200
|
-
:large => '--logger logger',
|
201
|
-
:format => String,
|
202
|
-
:description => 'Set logger to STDOUT or FILE'
|
203
|
-
}
|
204
|
-
|
205
|
-
KEEP = {
|
206
|
-
:name => 'keep',
|
207
|
-
:large => '--keep-backup',
|
208
|
-
:description => 'Keep previous backup when creating a new one'
|
209
|
-
}
|
210
|
-
|
211
|
-
ONESHOT = {
|
212
|
-
:name => 'oneshot',
|
213
|
-
:large => '--oneshot',
|
214
|
-
:description => 'Take an snapshot of the VM without saving backup info'
|
215
|
-
}
|
216
|
-
|
217
|
-
MARKET = {
|
218
|
-
:name => 'market',
|
219
|
-
:large => '--market market_id',
|
220
|
-
:format => Integer,
|
221
|
-
:description => 'Market to save oneshot'
|
222
|
-
}
|
223
|
-
|
224
198
|
NIC_ID = {
|
225
199
|
:name => 'nic_id',
|
226
200
|
:large => '--nic-id nic_id',
|
@@ -249,6 +223,40 @@ CommandParser::CmdParser.new(ARGV) do
|
|
249
223
|
:description => 'VNC client to use'
|
250
224
|
}
|
251
225
|
|
226
|
+
PCI = {
|
227
|
+
:name => 'pci',
|
228
|
+
:large => '--pci short_address',
|
229
|
+
:format => String,
|
230
|
+
:description => 'Select PCI device by its short address'
|
231
|
+
}
|
232
|
+
|
233
|
+
PCI_DEVICE = {
|
234
|
+
:name => 'pci_device',
|
235
|
+
:large => '--pci_device device ID',
|
236
|
+
:format => String,
|
237
|
+
:description => 'Select PCI device by its device ID'
|
238
|
+
}
|
239
|
+
|
240
|
+
PCI_VENDOR = {
|
241
|
+
:name => 'pci_vendor',
|
242
|
+
:large => '--pci_vendor vendor ID',
|
243
|
+
:format => String,
|
244
|
+
:description => 'Select PCI device by its vendor ID'
|
245
|
+
}
|
246
|
+
|
247
|
+
PCI_CLASS = {
|
248
|
+
:name => 'pci_class',
|
249
|
+
:large => '--pci_class class ID',
|
250
|
+
:format => String,
|
251
|
+
:description => 'Select PCI device by its class ID'
|
252
|
+
}
|
253
|
+
|
254
|
+
RESET_BACKUP = {
|
255
|
+
:name => 'reset',
|
256
|
+
:large => '--reset',
|
257
|
+
:description => 'Creates a new backup image, from a new full backup (only for incremental)'
|
258
|
+
}
|
259
|
+
|
252
260
|
OpenNebulaHelper::TEMPLATE_OPTIONS_VM.delete_if do |v|
|
253
261
|
%w[as_gid as_uid].include?(v[:name])
|
254
262
|
end
|
@@ -853,8 +861,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
853
861
|
end
|
854
862
|
|
855
863
|
nic_attach_desc = <<-EOT.unindent
|
856
|
-
Attaches a NIC to a
|
857
|
-
|
864
|
+
Attaches a NIC to a VM. When using --file add only one NIC instance.
|
865
|
+
|
866
|
+
To hotplug a PCI device and use it as a NIC interface in the VM select
|
867
|
+
it with --pci (short_address) or --pci_device (device ID),
|
868
|
+
--pci_class (class ID) and/or --pci_vendor (vendor ID).
|
858
869
|
|
859
870
|
To attach a nic alias, use --file or --alias option.
|
860
871
|
|
@@ -866,7 +877,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
866
877
|
OneVMHelper::NETWORK,
|
867
878
|
OneVMHelper::IP,
|
868
879
|
OneVMHelper::ALIAS,
|
869
|
-
OneVMHelper::NIC_NAME
|
880
|
+
OneVMHelper::NIC_NAME,
|
881
|
+
PCI,
|
882
|
+
PCI_CLASS,
|
883
|
+
PCI_VENDOR,
|
884
|
+
PCI_DEVICE] do
|
870
885
|
if options[:file].nil? && options[:network].nil?
|
871
886
|
STDERR.puts 'Provide a template file or a network:'
|
872
887
|
STDERR.puts "\t--file <file>"
|
@@ -878,36 +893,36 @@ CommandParser::CmdParser.new(ARGV) do
|
|
878
893
|
template = File.read(options[:file])
|
879
894
|
else
|
880
895
|
network_id = options[:network]
|
881
|
-
ip
|
882
|
-
nic_alias
|
883
|
-
nic_name
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
896
|
+
ip = options[:ip]
|
897
|
+
nic_alias = options[:alias]
|
898
|
+
nic_name = options[:nic_name]
|
899
|
+
|
900
|
+
is_pci = [:pci, :pci_device, :pci_vendor, :pci_class].any? do |o|
|
901
|
+
!options[o].nil?
|
902
|
+
end
|
903
|
+
|
904
|
+
if is_pci
|
905
|
+
pcia = options[:pci]
|
906
|
+
pcid = options[:pci_device]
|
907
|
+
pcic = options[:pci_class]
|
908
|
+
pciv = options[:pci_vendor]
|
909
|
+
|
910
|
+
template = 'PCI = [ TYPE = NIC'
|
911
|
+
template << ", NETWORK_ID = #{network_id}"
|
912
|
+
template << ", SHORT_ADDRESS = \"#{pcia}\"" if pcia
|
913
|
+
template << ", DEVICE = \"#{pcid}\"" if pcid
|
914
|
+
template << ", CLASS = \"#{pcic}\"" if pcic
|
915
|
+
template << ", VENDOR = \"#{pciv}\"" if pciv
|
916
|
+
elsif nic_alias
|
917
|
+
template = "NIC_ALIAS = [ PARENT = #{nic_alias}"
|
918
|
+
template << ", NETWORK_ID = #{network_id}"
|
899
919
|
else
|
900
|
-
|
901
|
-
template = "NIC = [ NETWORK_ID = #{network_id} ]"
|
902
|
-
elsif !nic_alias && nic_name
|
903
|
-
template = "NIC = [ NETWORK_ID = #{network_id},
|
904
|
-
NAME = #{nic_name} ]"
|
905
|
-
else
|
906
|
-
template = "NIC_ALIAS = \
|
907
|
-
[ NETWORK_ID = #{network_id},\
|
908
|
-
PARENT = #{nic_alias} ]"
|
909
|
-
end
|
920
|
+
template = "NIC = [ NETWORK_ID = #{network_id}"
|
910
921
|
end
|
922
|
+
|
923
|
+
template << ", IP = #{ip}" if ip
|
924
|
+
template << ", NAME = #{nic_name}" if nic_name
|
925
|
+
template << ']'
|
911
926
|
end
|
912
927
|
|
913
928
|
helper.perform_action(args[0], options, 'Attaching NIC') do |vm|
|
@@ -929,6 +944,40 @@ CommandParser::CmdParser.new(ARGV) do
|
|
929
944
|
end
|
930
945
|
end
|
931
946
|
|
947
|
+
nic_update_desc = <<-EOT.unindent
|
948
|
+
Updates a NIC for a VM. In case the VM is running, trigger NIC update on the host.
|
949
|
+
|
950
|
+
States: Almost all, except BOOT*, MIGRATE and HOTPLUG-NIC
|
951
|
+
EOT
|
952
|
+
|
953
|
+
command :"nic-update", nic_update_desc, :vmid, :nicid,
|
954
|
+
[:file, nil], :options => OpenNebulaHelper::APPEND do
|
955
|
+
vm_id = args[0].to_i
|
956
|
+
nic_id = args[1].to_i
|
957
|
+
file = args[2]
|
958
|
+
helper.perform_action(vm_id, options, 'Updating VM NIC') do |obj|
|
959
|
+
if options[:append]
|
960
|
+
str = OpenNebulaHelper
|
961
|
+
.append_template(vm_id, obj, file,
|
962
|
+
"TEMPLATE/NIC[NIC_ID=#{nic_id}]")
|
963
|
+
else
|
964
|
+
str = OpenNebulaHelper
|
965
|
+
.update_template(vm_id, obj, file,
|
966
|
+
"TEMPLATE/NIC[NIC_ID=#{nic_id}]")
|
967
|
+
end
|
968
|
+
|
969
|
+
# Ensure the updated attributes are in NIC section
|
970
|
+
unless str.gsub(' ', '').match(/NIC=\[/)
|
971
|
+
str = "NIC=[\n#{str.split("\n").join(",\n")}]"
|
972
|
+
end
|
973
|
+
|
974
|
+
helper.set_client(options)
|
975
|
+
obj = helper.retrieve_resource(obj.id)
|
976
|
+
|
977
|
+
obj.nic_update(nic_id, str, options[:append])
|
978
|
+
end
|
979
|
+
end
|
980
|
+
|
932
981
|
sg_attach_desc = <<-EOT.unindent
|
933
982
|
Attaches a Security Group to a VM.
|
934
983
|
|
@@ -1340,8 +1389,8 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1340
1389
|
updateconf_desc = <<-EOT.unindent
|
1341
1390
|
Updates the configuration of a VM. Valid states are: running, pending,
|
1342
1391
|
failure, poweroff, undeploy, hold or cloning.
|
1343
|
-
In running state only changes in CONTEXT take effect
|
1344
|
-
other values may need a VM restart.
|
1392
|
+
In running state only changes in CONTEXT and BACKUP_CONFIG take effect
|
1393
|
+
immediately, other values may need a VM restart.
|
1345
1394
|
|
1346
1395
|
This command accepts a template file or opens an editor, the full list of
|
1347
1396
|
configuration attributes are:
|
@@ -1352,6 +1401,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1352
1401
|
GRAPHICS = ["TYPE", "LISTEN", "PASSWD", "KEYMAP" ]
|
1353
1402
|
RAW = ["DATA", "DATA_VMX", "TYPE", "VALIDATE"]
|
1354
1403
|
CPU_MODEL = ["MODEL"]
|
1404
|
+
BACKUP_CONFIG = ["FS_FREEZE", "KEEP_LAST", "BACKUP_VOLATILE", "MODE"]
|
1355
1405
|
CONTEXT (any value, **variable substitution will be made**)
|
1356
1406
|
EOT
|
1357
1407
|
|
@@ -1376,10 +1426,15 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1376
1426
|
exit(-1)
|
1377
1427
|
end
|
1378
1428
|
|
1429
|
+
backup = vm.template_like_str('BACKUPS', true,
|
1430
|
+
'BACKUP_CONFIG')
|
1379
1431
|
template = vm.template_like_str('TEMPLATE', true,
|
1380
1432
|
'OS | FEATURES | INPUT | '\
|
1381
1433
|
'GRAPHICS | RAW | CONTEXT | '\
|
1382
1434
|
'CPU_MODEL')
|
1435
|
+
|
1436
|
+
template << "\n" << backup
|
1437
|
+
|
1383
1438
|
template = OpenNebulaHelper.editor_input(template)
|
1384
1439
|
end
|
1385
1440
|
|
@@ -1497,108 +1552,43 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1497
1552
|
end
|
1498
1553
|
|
1499
1554
|
backup_vm_desc = <<-EOT.unindent
|
1500
|
-
Creates a VM backup
|
1555
|
+
Creates a VM backup on the given datastore
|
1556
|
+
|
1557
|
+
States: RUNNING, POWEROFF
|
1501
1558
|
EOT
|
1502
1559
|
|
1503
1560
|
command :backup,
|
1504
1561
|
backup_vm_desc,
|
1505
1562
|
:vmid,
|
1506
|
-
:options => [
|
1507
|
-
|
1508
|
-
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
# Read user options
|
1518
|
-
if options[:verbose]
|
1519
|
-
log_to = STDOUT
|
1520
|
-
elsif !options[:logger].nil?
|
1521
|
-
log_to = options[:logger]
|
1522
|
-
end
|
1523
|
-
|
1524
|
-
keep = options.key?(:keep)
|
1525
|
-
|
1526
|
-
if log_to
|
1527
|
-
logger = Logger.new(log_to)
|
1528
|
-
format = '%Y-%m-%d %H:%M:%S'
|
1529
|
-
|
1530
|
-
logger.formatter = proc do |severity, datetime, _p, msg|
|
1531
|
-
"#{datetime.strftime(format)} " \
|
1532
|
-
"#{severity.ljust(5)} : #{msg}\n"
|
1533
|
-
end
|
1534
|
-
end
|
1535
|
-
|
1536
|
-
binfo = {}
|
1537
|
-
binfo[:market] = options[:market]
|
1538
|
-
|
1539
|
-
if options.key?(:oneshot)
|
1540
|
-
binfo[:name] = "VM #{vm.id} BACKUP - " \
|
1541
|
-
"#{Time.now.strftime('%Y%m%d_%k%M')}"
|
1542
|
-
binfo[:freq] = 1
|
1543
|
-
binfo[:last] = Time.now.to_i - 100
|
1544
|
-
end
|
1545
|
-
|
1546
|
-
begin
|
1547
|
-
rc = vm.backup(keep, logger, binfo)
|
1548
|
-
|
1549
|
-
if OpenNebula.is_error?(rc)
|
1550
|
-
STDERR.puts rc.message
|
1551
|
-
exit(-1)
|
1552
|
-
else
|
1553
|
-
0
|
1554
|
-
end
|
1555
|
-
rescue StandardError => e
|
1556
|
-
STDERR.puts e
|
1557
|
-
exit(-1)
|
1558
|
-
end
|
1559
|
-
end
|
1560
|
-
end
|
1561
|
-
|
1562
|
-
restore_vm_desc = <<-EOT.unindent
|
1563
|
-
Restores a VM from a previous backup
|
1564
|
-
EOT
|
1565
|
-
|
1566
|
-
command :restore,
|
1567
|
-
restore_vm_desc,
|
1568
|
-
:vmid,
|
1569
|
-
:options => [OneDatastoreHelper::DATASTORE, LOGGER] do
|
1570
|
-
require 'logger'
|
1571
|
-
|
1572
|
-
unless options[:datastore]
|
1573
|
-
STDERR.puts 'ERROR: no datastore given'
|
1563
|
+
:options => [RESET_BACKUP,
|
1564
|
+
OneDatastoreHelper::DATASTORE,
|
1565
|
+
OneVMHelper::SCHEDULE,
|
1566
|
+
OneVMHelper::WEEKLY,
|
1567
|
+
OneVMHelper::MONTHLY,
|
1568
|
+
OneVMHelper::YEARLY,
|
1569
|
+
OneVMHelper::HOURLY,
|
1570
|
+
OneVMHelper::END_TIME] do
|
1571
|
+
if options[:datastore].nil?
|
1572
|
+
STDERR.puts 'Datastore to save the backup is mandatory: '
|
1573
|
+
STDERR.puts "\t -d datastore_id | name"
|
1574
1574
|
exit(-1)
|
1575
1575
|
end
|
1576
1576
|
|
1577
|
-
|
1578
|
-
vm.extend(OpenNebula::VirtualMachineExt)
|
1577
|
+
reset = options[:reset] == true
|
1579
1578
|
|
1580
|
-
|
1581
|
-
options[:
|
1582
|
-
logger = Logger.new(log_to)
|
1583
|
-
format = '%Y-%m-%d %H:%M:%S'
|
1579
|
+
if !options[:schedule].nil?
|
1580
|
+
options[:args] = options[:datastore]
|
1584
1581
|
|
1585
|
-
|
1586
|
-
|
1587
|
-
end
|
1582
|
+
helper.schedule_actions([args[0]], options, @comm_name)
|
1583
|
+
else
|
1588
1584
|
|
1589
|
-
|
1590
|
-
rc = vm.
|
1585
|
+
helper.perform_action(args[0], options, 'Backup') do |vm|
|
1586
|
+
rc = vm.backup(options[:datastore], reset)
|
1591
1587
|
|
1592
1588
|
if OpenNebula.is_error?(rc)
|
1593
|
-
STDERR.puts rc.message
|
1589
|
+
STDERR.puts "Error creating VM backup: #{rc.message}"
|
1594
1590
|
exit(-1)
|
1595
|
-
else
|
1596
|
-
puts "ID: #{rc}"
|
1597
|
-
0
|
1598
1591
|
end
|
1599
|
-
rescue StandardError => e
|
1600
|
-
STDERR.puts e
|
1601
|
-
exit(-1)
|
1602
1592
|
end
|
1603
1593
|
end
|
1604
1594
|
end
|
data/bin/onevnet
CHANGED
@@ -114,6 +114,13 @@ CommandParser::CmdParser.new(ARGV) do
|
|
114
114
|
:description => 'No recover action possible, delete the Virtual Network'
|
115
115
|
}
|
116
116
|
|
117
|
+
RETRY = {
|
118
|
+
:name => 'retry',
|
119
|
+
:large => '--retry',
|
120
|
+
:description => 'Recover a Virtual Network by retrying the last ' \
|
121
|
+
'failed action'
|
122
|
+
}
|
123
|
+
|
117
124
|
########################################################################
|
118
125
|
# Global Options
|
119
126
|
########################################################################
|
@@ -363,6 +370,8 @@ CommandParser::CmdParser.new(ARGV) do
|
|
363
370
|
update_desc = <<-EOT.unindent
|
364
371
|
Update the template contents. If a path is not provided the editor will
|
365
372
|
be launched to modify the current content.
|
373
|
+
|
374
|
+
Note: Triggers Virtual Machine updates for used leases.
|
366
375
|
EOT
|
367
376
|
|
368
377
|
command :update, update_desc, :vnetid, [:file, nil],
|
@@ -456,19 +465,22 @@ CommandParser::CmdParser.new(ARGV) do
|
|
456
465
|
YOU NEED TO MANUALLY CHECK THE VN STATUS, to decide if the
|
457
466
|
operation was successful or not, or if it can be retried.
|
458
467
|
|
459
|
-
States for success
|
460
|
-
States for
|
468
|
+
States for success recovers: LOCK_CREATE, LOCK_DELETE, UPDATE_FAILURE state.
|
469
|
+
States for failure recovers: LOCK_CREATE, LOCK_DELETE state.
|
470
|
+
States for a retry recover: UPDATE_FAILURE
|
461
471
|
States for delete: Any but READY
|
462
472
|
EOT
|
463
473
|
|
464
474
|
command :recover, recover_desc, [:range, :vmid_list],
|
465
|
-
:options => [SUCCESS, FAILURE, DELETE] do
|
475
|
+
:options => [SUCCESS, FAILURE, DELETE, RETRY] do
|
466
476
|
if !options[:success].nil?
|
467
477
|
result = 1
|
468
478
|
elsif !options[:failure].nil?
|
469
479
|
result = 0
|
470
480
|
elsif !options[:delete].nil?
|
471
481
|
result = 2
|
482
|
+
elsif !options[:retry].nil?
|
483
|
+
result = 3
|
472
484
|
else
|
473
485
|
error_message = <<-EOT.unindent
|
474
486
|
Need to specify the result of the pending action.
|
@@ -14,6 +14,7 @@
|
|
14
14
|
# limitations under the License. #
|
15
15
|
#--------------------------------------------------------------------------- #
|
16
16
|
|
17
|
+
require 'HostSyncManager'
|
17
18
|
require 'one_helper'
|
18
19
|
require 'one_helper/onevm_helper'
|
19
20
|
require 'rubygems'
|
@@ -268,12 +269,11 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
268
269
|
|
269
270
|
cluster_id = options[:cluster]
|
270
271
|
|
271
|
-
# Get remote_dir (implies oneadmin group)
|
272
272
|
rc = OpenNebula::System.new(@client).get_configuration
|
273
273
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
274
274
|
|
275
275
|
conf = rc
|
276
|
-
|
276
|
+
sync_manager = HostSyncManager.new(conf)
|
277
277
|
|
278
278
|
# Verify the existence of REMOTES_LOCATION
|
279
279
|
if !File.directory? REMOTES_LOCATION
|
@@ -363,21 +363,13 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
363
363
|
|
364
364
|
print_update_info(total - size, total, host['NAME'])
|
365
365
|
|
366
|
-
if options[:ssh]
|
367
|
-
sync_cmd = "ssh #{host['NAME']}" \
|
368
|
-
" rm -rf '#{remote_dir}' 2>/dev/null;" \
|
369
|
-
" mkdir -p '#{remote_dir}' 2>/dev/null &&" \
|
370
|
-
" scp -rp #{REMOTES_LOCATION}/*" \
|
371
|
-
" #{host['NAME']}:#{remote_dir} 2> /dev/null"
|
372
|
-
else
|
373
|
-
sync_cmd = "rsync -Laz --delete #{REMOTES_LOCATION}/" \
|
374
|
-
" #{host['NAME']}:#{remote_dir}/"
|
375
|
-
end
|
376
|
-
|
377
366
|
retries = 3
|
378
367
|
|
379
368
|
begin
|
380
|
-
|
369
|
+
copy_method = options[:ssh] ? :ssh : :rsync
|
370
|
+
rc = sync_manager.update_remotes(host['NAME'],
|
371
|
+
nil,
|
372
|
+
copy_method)
|
381
373
|
rescue IOError
|
382
374
|
# Workaround for broken Ruby 2.5
|
383
375
|
# https://github.com/OpenNebula/one/issues/3229
|
@@ -387,7 +379,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
387
379
|
end
|
388
380
|
end
|
389
381
|
|
390
|
-
if
|
382
|
+
if rc != 0
|
391
383
|
error_lock.synchronize do
|
392
384
|
host_errors << host['NAME']
|
393
385
|
end
|
@@ -348,18 +348,36 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
348
348
|
CLIHelper.print_header(str_h1 % 'IMAGE TEMPLATE', false)
|
349
349
|
puts image.template_str
|
350
350
|
|
351
|
-
puts
|
352
|
-
CLIHelper.print_header('VIRTUAL MACHINES', false)
|
353
|
-
puts
|
354
|
-
|
355
351
|
vms=image.retrieve_elements('VMS/ID')
|
356
352
|
|
357
353
|
return unless vms
|
358
354
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
355
|
+
if image.type_str.casecmp('backup').zero?
|
356
|
+
CLIHelper.print_header(str_h1 % 'BACKUP INFORMATION', false)
|
357
|
+
puts format(str, 'VM', vms[0])
|
358
|
+
|
359
|
+
if image.has_elements?('/IMAGE/BACKUP_INCREMENTS/INCREMENT')
|
360
|
+
puts format(str, 'TYPE', 'INCREMENTAL')
|
361
|
+
|
362
|
+
puts
|
363
|
+
|
364
|
+
CLIHelper.print_header('BACKUP INCREMENTS', false)
|
365
|
+
format_backup_increments(image)
|
366
|
+
else
|
367
|
+
puts format(str, 'TYPE', 'FULL')
|
368
|
+
end
|
369
|
+
else
|
370
|
+
puts
|
371
|
+
CLIHelper.print_header('VIRTUAL MACHINES', false)
|
372
|
+
puts
|
373
|
+
|
374
|
+
vms.map! {|e| e.to_i }
|
375
|
+
onevm_helper=OneVMHelper.new
|
376
|
+
onevm_helper.client=@client
|
377
|
+
onevm_helper.list_pool({ :ids=>vms, :no_pager => true },
|
378
|
+
false)
|
379
|
+
|
380
|
+
end
|
363
381
|
end
|
364
382
|
|
365
383
|
def format_snapshots(image)
|
@@ -412,6 +430,49 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
412
430
|
table.show(image_snapshots)
|
413
431
|
end
|
414
432
|
|
433
|
+
def format_backup_increments(image)
|
434
|
+
table=CLIHelper::ShowTable.new(nil, self) do
|
435
|
+
column :ID, 'Increment ID', :size=>3 do |d|
|
436
|
+
d['ID']
|
437
|
+
end
|
438
|
+
|
439
|
+
column :PID, 'Parent increment ID', :size=>3 do |d|
|
440
|
+
d['PARENT_ID']
|
441
|
+
end
|
442
|
+
|
443
|
+
column :TYPE, 'T', :size=>1 do |d|
|
444
|
+
d['TYPE'][0]
|
445
|
+
end
|
446
|
+
|
447
|
+
column :SIZE, '', :left, :size=>8 do |d|
|
448
|
+
if d['SIZE']
|
449
|
+
OpenNebulaHelper.unit_to_str(
|
450
|
+
d['SIZE'].to_i,
|
451
|
+
{},
|
452
|
+
'M'
|
453
|
+
)
|
454
|
+
else
|
455
|
+
'-'
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
column :DATE, 'Creation date', :size=>15 do |d|
|
460
|
+
OpenNebulaHelper.time_to_str(d['DATE'])
|
461
|
+
end
|
462
|
+
|
463
|
+
column :SOURCE, 'Backup source', :left, :size=>37 do |d|
|
464
|
+
d['SOURCE']
|
465
|
+
end
|
466
|
+
|
467
|
+
default :ID, :PID, :TYPE, :SIZE, :DATE, :SOURCE
|
468
|
+
end
|
469
|
+
|
470
|
+
ihash = image.to_hash
|
471
|
+
increments = [ihash['IMAGE']['BACKUP_INCREMENTS']['INCREMENT']].flatten
|
472
|
+
|
473
|
+
table.show(increments)
|
474
|
+
end
|
475
|
+
|
415
476
|
class << self
|
416
477
|
|
417
478
|
def create_image_variables(options, name)
|
@@ -117,7 +117,21 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
117
117
|
:large => '--schedule TIME',
|
118
118
|
:description => 'Schedules this action to be executed after' \
|
119
119
|
'the given time. For example: onevm resume 0 --schedule "09/23 14:15"',
|
120
|
-
:format =>
|
120
|
+
:format => String,
|
121
|
+
:proc => lambda {|o, options|
|
122
|
+
if o[0] == '+'
|
123
|
+
options[:schedule] = o
|
124
|
+
elsif o == 'now'
|
125
|
+
options[:schedule] = Time.now.to_i
|
126
|
+
else
|
127
|
+
begin
|
128
|
+
options[:schedule] = Time.parse(o).to_i
|
129
|
+
rescue StandardError
|
130
|
+
STDERR.puts "Error parsing time spec: #{o}"
|
131
|
+
exit(-1)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
}
|
121
135
|
}
|
122
136
|
|
123
137
|
WEEKLY = {
|
@@ -408,10 +422,13 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
408
422
|
# Verbose by default
|
409
423
|
options[:verbose] = true
|
410
424
|
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
425
|
+
message = if options[:schedule].class == Integer
|
426
|
+
"#{action} scheduled at #{Time.at(options[:schedule])}"
|
427
|
+
else
|
428
|
+
"#{action} scheduled after #{options[:schedule]}s from start"
|
429
|
+
end
|
430
|
+
|
431
|
+
perform_actions( ids, options, message) do |vm|
|
415
432
|
|
416
433
|
str_periodic = ''
|
417
434
|
|
@@ -440,20 +457,11 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
440
457
|
str_periodic << ', END_TYPE = 0'
|
441
458
|
end
|
442
459
|
|
443
|
-
sched = options[:schedule]
|
444
|
-
|
445
|
-
# If the action is set to be executed from VM start to an specific
|
446
|
-
# amount of time later, we should preserve the + symbol
|
447
|
-
if ((sched.is_a? String) && !sched.include?('+')) ||
|
448
|
-
!(sched.is_a? String)
|
449
|
-
sched = sched.to_i
|
450
|
-
end
|
451
|
-
|
452
460
|
tmp_str = "SCHED_ACTION = ["
|
453
461
|
tmp_str << "ACTION = #{action}, "
|
454
462
|
tmp_str << "WARNING = #{warning}," if warning
|
455
463
|
tmp_str << "ARGS = \"#{options[:args]}\"," if options[:args]
|
456
|
-
tmp_str << "TIME = #{
|
464
|
+
tmp_str << "TIME = #{options[:schedule]}"
|
457
465
|
tmp_str << str_periodic << ']'
|
458
466
|
|
459
467
|
vm.sched_action_add(tmp_str)
|
@@ -1342,42 +1350,31 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1342
1350
|
end
|
1343
1351
|
str_end unless d.nil?
|
1344
1352
|
end
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
column :MESSAGE, '', :size => 35 do |d|
|
1352
|
-
d['MESSAGE'] ? d['MESSAGE'] : '-'
|
1353
|
-
end
|
1354
|
-
|
1355
|
-
column :CHARTER, '', :left, :adjust, :size => 15 do |d|
|
1356
|
-
t1 = Time.now
|
1357
|
-
t2 = d['TIME'].to_i
|
1358
|
-
t2 += vm['STIME'].to_i unless d['TIME'] =~ /^[0-9].*/
|
1359
|
-
|
1360
|
-
t2 = Time.at(t2)
|
1361
|
-
|
1362
|
-
days = ((t2 - t1) / (24 * 3600)).round(2)
|
1363
|
-
hours = ((t2 - t1) / 3600).round(2)
|
1364
|
-
minutes = ((t2 - t1) / 60).round(2)
|
1365
|
-
|
1366
|
-
if days > 1
|
1367
|
-
show = "In #{days} days"
|
1368
|
-
elsif days <= 1 && hours > 1
|
1369
|
-
show = "In #{hours} hours"
|
1370
|
-
elsif minutes > 0
|
1371
|
-
show = "In #{minutes} minutes"
|
1353
|
+
column :STATUS, '', :left, :size => 50 do |d|
|
1354
|
+
if d['DONE'] && !d['REPEAT']
|
1355
|
+
"Done on #{OpenNebulaHelper.time_to_str(d['DONE'], false)}"
|
1356
|
+
elsif d['MESSAGE']
|
1357
|
+
"Error! #{d['MESSAGE']}"
|
1372
1358
|
else
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1359
|
+
t1 = Time.now
|
1360
|
+
t2 = d['TIME'].to_i
|
1361
|
+
t2 += vm['STIME'].to_i unless d['TIME'] =~ /^[0-9].*/
|
1362
|
+
|
1363
|
+
t2 = Time.at(t2)
|
1364
|
+
|
1365
|
+
days = ((t2 - t1) / (24 * 3600)).round(2)
|
1366
|
+
hours = ((t2 - t1) / 3600).round(2)
|
1367
|
+
minutes = ((t2 - t1) / 60).round(2)
|
1368
|
+
|
1369
|
+
if days > 1
|
1370
|
+
"Next in #{days} days"
|
1371
|
+
elsif days <= 1 && hours > 1
|
1372
|
+
"Next in #{hours} hours"
|
1373
|
+
elsif minutes > 0
|
1374
|
+
"Next in #{minutes} minutes"
|
1375
|
+
else
|
1376
|
+
"Overdue!"
|
1377
|
+
end
|
1381
1378
|
end
|
1382
1379
|
end
|
1383
1380
|
end.show([vm_hash['VM']['TEMPLATE']['SCHED_ACTION']].flatten,
|
@@ -1388,6 +1385,8 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1388
1385
|
vm.delete_element('/VM/TEMPLATE/SCHED_ACTION')
|
1389
1386
|
end
|
1390
1387
|
|
1388
|
+
print_backups(vm, vm_hash)
|
1389
|
+
|
1391
1390
|
if vm.has_elements?('/VM/USER_TEMPLATE')
|
1392
1391
|
puts
|
1393
1392
|
|
@@ -1421,6 +1420,23 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1421
1420
|
puts vm.template_str
|
1422
1421
|
end
|
1423
1422
|
|
1423
|
+
def print_backups(vm, vm_hash)
|
1424
|
+
if vm.has_elements?('/VM/BACKUPS/BACKUP_CONFIG')
|
1425
|
+
puts
|
1426
|
+
CLIHelper.print_header('%-80s' % 'BACKUP CONFIGURATION', false)
|
1427
|
+
puts vm.template_like_str('BACKUPS/BACKUP_CONFIG')
|
1428
|
+
end
|
1429
|
+
|
1430
|
+
if vm.has_elements?('/VM/BACKUPS/BACKUP_IDS')
|
1431
|
+
puts
|
1432
|
+
CLIHelper.print_header('%-80s' % 'VM BACKUPS', false)
|
1433
|
+
|
1434
|
+
ids = [vm_hash['VM']['BACKUPS']['BACKUP_IDS']['ID']].flatten
|
1435
|
+
|
1436
|
+
puts format('IMAGE IDS: %s', ids.join(','))
|
1437
|
+
end
|
1438
|
+
end
|
1439
|
+
|
1424
1440
|
def print_numa_nodes(numa_nodes)
|
1425
1441
|
puts
|
1426
1442
|
CLIHelper.print_header('NUMA NODES', false)
|
@@ -186,8 +186,32 @@ class OneVNetHelper < OpenNebulaHelper::OneHelper
|
|
186
186
|
d['USED_LEASES']
|
187
187
|
end
|
188
188
|
|
189
|
+
column :UPDATED, 'Number of VMs with updated VN attributes', :size=>4 do |d|
|
190
|
+
if d['UPDATED_VMS']['ID'].nil?
|
191
|
+
'0'
|
192
|
+
else
|
193
|
+
[d['UPDATED_VMS']['ID']].flatten.size
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
column :OUTDATED, 'Number of VMs with outdated VN attributes', :size=>4 do |d|
|
198
|
+
if d['OUTDATED_VMS']['ID'].nil?
|
199
|
+
'0'
|
200
|
+
else
|
201
|
+
[d['OUTDATED_VMS']['ID']].flatten.size
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
column :ERROR, 'Number of VMs that failed to update VN attributes', :size=>4 do |d|
|
206
|
+
if d['ERROR_VMS']['ID'].nil?
|
207
|
+
'0'
|
208
|
+
else
|
209
|
+
[d['ERROR_VMS']['ID']].flatten.size
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
189
213
|
default :ID, :USER, :GROUP, :NAME, :CLUSTERS, :BRIDGE, :STATE,
|
190
|
-
:LEASES
|
214
|
+
:LEASES, :OUTDATED, :ERROR
|
191
215
|
end
|
192
216
|
end
|
193
217
|
|
@@ -474,6 +498,16 @@ class OneVNetHelper < OpenNebulaHelper::OneHelper
|
|
474
498
|
puts format('%-15s', id)
|
475
499
|
end
|
476
500
|
|
501
|
+
puts
|
502
|
+
|
503
|
+
CLIHelper.print_header(str_h1 % 'VIRTUAL MACHINES', false)
|
504
|
+
|
505
|
+
updated, outdated, error = vn.vm_ids
|
506
|
+
|
507
|
+
puts format(str, 'UPDATED', updated.join(','))
|
508
|
+
puts format(str, 'OUTDATED', outdated.join(','))
|
509
|
+
puts format(str, 'ERROR', error.join(','))
|
510
|
+
|
477
511
|
return unless options[:show_ar]
|
478
512
|
|
479
513
|
ar_list.each do |ar_id|
|
data/lib/one_helper.rb
CHANGED
data/share/schemas/xsd/acct.xsd
CHANGED
@@ -170,6 +170,34 @@
|
|
170
170
|
</xs:sequence>
|
171
171
|
</xs:complexType>
|
172
172
|
</xs:element>
|
173
|
+
<xs:element name="BACKUPS">
|
174
|
+
<xs:complexType>
|
175
|
+
<xs:sequence>
|
176
|
+
<xs:element name="BACKUP_CONFIG" minOccurs="1" maxOccurs="1">
|
177
|
+
<xs:complexType>
|
178
|
+
<xs:sequence>
|
179
|
+
<xs:element name="BACKUP_VOLATILE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
180
|
+
<xs:element name="FS_FREEZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
181
|
+
<xs:element name="INCREMENTAL_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
182
|
+
<xs:element name="KEEP_LAST" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
183
|
+
<xs:element name="LAST_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
184
|
+
<xs:element name="LAST_BACKUP_SIZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
185
|
+
<xs:element name="LAST_DATASTORE_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
186
|
+
<xs:element name="LAST_INCREMENT_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
187
|
+
<xs:element name="MODE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
188
|
+
</xs:sequence>
|
189
|
+
</xs:complexType>
|
190
|
+
</xs:element>
|
191
|
+
<xs:element name="BACKUP_IDS" minOccurs="1" maxOccurs="1">
|
192
|
+
<xs:complexType>
|
193
|
+
<xs:sequence>
|
194
|
+
<xs:element name="ID" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
195
|
+
</xs:sequence>
|
196
|
+
</xs:complexType>
|
197
|
+
</xs:element>
|
198
|
+
</xs:sequence>
|
199
|
+
</xs:complexType>
|
200
|
+
</xs:element>
|
173
201
|
</xs:sequence>
|
174
202
|
</xs:complexType>
|
175
203
|
</xs:element>
|
@@ -10,15 +10,19 @@
|
|
10
10
|
<xs:restriction base="xs:string">
|
11
11
|
<xs:enumeration value="VM"/>
|
12
12
|
<xs:enumeration value="HOST"/>
|
13
|
+
<xs:enumeration value="IMAGE"/>
|
14
|
+
<xs:enumeration value="VNET"/>
|
13
15
|
</xs:restriction>
|
14
16
|
</xs:simpleType>
|
15
17
|
</xs:element>
|
16
18
|
<xs:element name="STATE" type="xs:string"/>
|
17
19
|
<xs:element name="LCM_STATE" type="xs:string" maxOccurs="1" minOccurs="0"/>
|
18
20
|
<xs:element name="REMOTE_HOST" type="xs:string" maxOccurs="1" minOccurs="0"/>
|
19
|
-
<!-- The template of the resource (VM or
|
21
|
+
<!-- The template of the resource (VM, Host, Image or VNet) is included here -->
|
20
22
|
<xs:element ref="HOST" maxOccurs="1" minOccurs="0"/>
|
21
23
|
<xs:element ref="VM" maxOccurs="1" minOccurs="0"/>
|
24
|
+
<xs:element ref="IMAGE" maxOccurs="1" minOccurs="0"/>
|
25
|
+
<xs:element ref="VNET" maxOccurs="1" minOccurs="0"/>
|
22
26
|
</xs:sequence>
|
23
27
|
</xs:complexType>
|
24
28
|
</xs:element>
|
data/share/schemas/xsd/image.xsd
CHANGED
@@ -117,6 +117,24 @@
|
|
117
117
|
</xs:sequence>
|
118
118
|
</xs:complexType>
|
119
119
|
</xs:element>
|
120
|
+
<xs:element name="BACKUP_INCREMENTS">
|
121
|
+
<xs:complexType>
|
122
|
+
<xs:sequence>
|
123
|
+
<xs:element name="INCREMENT" minOccurs="0" maxOccurs="unbounded">
|
124
|
+
<xs:complexType>
|
125
|
+
<xs:sequence>
|
126
|
+
<xs:element name="DATE" type="xs:string"/>
|
127
|
+
<xs:element name="ID" type="xs:string"/>
|
128
|
+
<xs:element name="PARENT_ID" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
129
|
+
<xs:element name="SIZE" type="xs:string"/>
|
130
|
+
<xs:element name="SOURCE" type="xs:string"/>
|
131
|
+
<xs:element name="TYPE" type="xs:string"/>
|
132
|
+
</xs:sequence>
|
133
|
+
</xs:complexType>
|
134
|
+
</xs:element>
|
135
|
+
</xs:sequence>
|
136
|
+
</xs:complexType>
|
137
|
+
</xs:element>
|
120
138
|
</xs:sequence>
|
121
139
|
</xs:complexType>
|
122
140
|
</xs:element>
|
@@ -28,6 +28,8 @@
|
|
28
28
|
</xs:element>
|
29
29
|
|
30
30
|
<xs:element name="CLUSTER_ENCRYPTED_ATTR" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
31
|
+
<xs:element name="CONTEXT_RESTRICTED_DIRS" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
32
|
+
<xs:element name="CONTEXT_SAFE_DIRS" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
31
33
|
<xs:element name="DATASTORE_CAPACITY_CHECK" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
32
34
|
<xs:element name="DATASTORE_ENCRYPTED_ATTR" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
33
35
|
<xs:element name="DATASTORE_LOCATION" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
data/share/schemas/xsd/vm.xsd
CHANGED
@@ -121,6 +121,8 @@
|
|
121
121
|
<xs:element name="MEMORY" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
122
122
|
<xs:element name="MEMORY_COST" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
123
123
|
<xs:element name="MEMORY_MAX" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
124
|
+
<xs:element name="MEMORY_SLOTS" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
125
|
+
<xs:element name="MEMORY_RESIZE_MODE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
124
126
|
<xs:element name="NIC" minOccurs="0" maxOccurs="unbounded">
|
125
127
|
<xs:complexType>
|
126
128
|
<xs:sequence>
|
@@ -311,6 +313,34 @@
|
|
311
313
|
</xs:sequence>
|
312
314
|
</xs:complexType>
|
313
315
|
</xs:element>
|
316
|
+
<xs:element name="BACKUPS">
|
317
|
+
<xs:complexType>
|
318
|
+
<xs:sequence>
|
319
|
+
<xs:element name="BACKUP_CONFIG" minOccurs="1" maxOccurs="1">
|
320
|
+
<xs:complexType>
|
321
|
+
<xs:sequence>
|
322
|
+
<xs:element name="BACKUP_VOLATILE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
323
|
+
<xs:element name="FS_FREEZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
324
|
+
<xs:element name="INCREMENTAL_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
325
|
+
<xs:element name="KEEP_LAST" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
326
|
+
<xs:element name="LAST_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
327
|
+
<xs:element name="LAST_BACKUP_SIZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
328
|
+
<xs:element name="LAST_DATASTORE_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
329
|
+
<xs:element name="LAST_INCREMENT_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
330
|
+
<xs:element name="MODE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
331
|
+
</xs:sequence>
|
332
|
+
</xs:complexType>
|
333
|
+
</xs:element>
|
334
|
+
<xs:element name="BACKUP_IDS" minOccurs="1" maxOccurs="1">
|
335
|
+
<xs:complexType>
|
336
|
+
<xs:sequence>
|
337
|
+
<xs:element name="ID" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
338
|
+
</xs:sequence>
|
339
|
+
</xs:complexType>
|
340
|
+
</xs:element>
|
341
|
+
</xs:sequence>
|
342
|
+
</xs:complexType>
|
343
|
+
</xs:element>
|
314
344
|
</xs:sequence>
|
315
345
|
</xs:complexType>
|
316
346
|
</xs:element>
|
data/share/schemas/xsd/vnet.xsd
CHANGED
@@ -61,6 +61,34 @@
|
|
61
61
|
</xs:sequence>
|
62
62
|
</xs:complexType>
|
63
63
|
</xs:element>
|
64
|
+
<xs:element name="UPDATED_VMS">
|
65
|
+
<xs:complexType>
|
66
|
+
<xs:sequence>
|
67
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
68
|
+
</xs:sequence>
|
69
|
+
</xs:complexType>
|
70
|
+
</xs:element>
|
71
|
+
<xs:element name="OUTDATED_VMS">
|
72
|
+
<xs:complexType>
|
73
|
+
<xs:sequence>
|
74
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
75
|
+
</xs:sequence>
|
76
|
+
</xs:complexType>
|
77
|
+
</xs:element>
|
78
|
+
<xs:element name="UPDATING_VMS">
|
79
|
+
<xs:complexType>
|
80
|
+
<xs:sequence>
|
81
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
82
|
+
</xs:sequence>
|
83
|
+
</xs:complexType>
|
84
|
+
</xs:element>
|
85
|
+
<xs:element name="ERROR_VMS">
|
86
|
+
<xs:complexType>
|
87
|
+
<xs:sequence>
|
88
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
89
|
+
</xs:sequence>
|
90
|
+
</xs:complexType>
|
91
|
+
</xs:element>
|
64
92
|
<xs:element name="TEMPLATE">
|
65
93
|
<xs:complexType>
|
66
94
|
<xs:sequence>
|
@@ -55,6 +55,34 @@
|
|
55
55
|
</xs:sequence>
|
56
56
|
</xs:complexType>
|
57
57
|
</xs:element>
|
58
|
+
<xs:element name="UPDATED_VMS">
|
59
|
+
<xs:complexType>
|
60
|
+
<xs:sequence>
|
61
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
62
|
+
</xs:sequence>
|
63
|
+
</xs:complexType>
|
64
|
+
</xs:element>
|
65
|
+
<xs:element name="OUTDATED_VMS">
|
66
|
+
<xs:complexType>
|
67
|
+
<xs:sequence>
|
68
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
69
|
+
</xs:sequence>
|
70
|
+
</xs:complexType>
|
71
|
+
</xs:element>
|
72
|
+
<xs:element name="UPDATING_VMS">
|
73
|
+
<xs:complexType>
|
74
|
+
<xs:sequence>
|
75
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
76
|
+
</xs:sequence>
|
77
|
+
</xs:complexType>
|
78
|
+
</xs:element>
|
79
|
+
<xs:element name="ERROR_VMS">
|
80
|
+
<xs:complexType>
|
81
|
+
<xs:sequence>
|
82
|
+
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
83
|
+
</xs:sequence>
|
84
|
+
</xs:complexType>
|
85
|
+
</xs:element>
|
58
86
|
<xs:element name="TEMPLATE" type="xs:anyType"/>
|
59
87
|
<xs:element name="AR_POOL">
|
60
88
|
<xs:complexType>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opennebula-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.5.80.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opennebula
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.
|
19
|
+
version: 6.5.80.pre
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.
|
26
|
+
version: 6.5.80.pre
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,9 +189,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
189
189
|
version: '0'
|
190
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- - "
|
192
|
+
- - ">"
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
194
|
+
version: 1.3.1
|
195
195
|
requirements: []
|
196
196
|
rubygems_version: 3.1.2
|
197
197
|
signing_key:
|