opennebula-cli 6.4.2 → 6.5.80.pre
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/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:
|