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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e72258e445621b7bb43729bce0ef5f95f4a0debd990f3983bd8845fa19eebc0
4
- data.tar.gz: 4776aa4b2f7e59f114dee073504b2029f37cbf99ca544be0924af26a3f969a5c
3
+ metadata.gz: fcdc66bd05f8d1764a49ddc05846af9544aec14538d28361836286a637db4762
4
+ data.tar.gz: c29bd48679f35bd2ad33535cb6c89c6d960eb79b9e16c19d4294c0f1646a8b77
5
5
  SHA512:
6
- metadata.gz: 8293cbaf48c76f3601a0dd2d06b63aa3ff52bbbbb4c2fd510578224a4555cee0b0c9b6fae7486de1bc922d9cbc2a9844a4bac06e8b394ebea1b145dc6bae2718
7
- data.tar.gz: e42b6fc85a88aa97ca9be7d1f464b048993ca443c9119121cae800018ef1f27a90899e2d0cbcd18e72ac142b7bd8aac2568bcf1997933e42388f7896f96bd289
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] do
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
@@ -63,7 +63,6 @@ require 'json'
63
63
  require 'nokogiri'
64
64
  require 'openssl'
65
65
  require 'ox'
66
- require 'pp'
67
66
  require 'set'
68
67
  require 'socket'
69
68
  require 'sqlite3'
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 running VM. When using --file add only one
857
- NIC instance.
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] do
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 = options[:ip]
882
- nic_alias = options[:alias]
883
- nic_name = options[:nic_name]
884
-
885
- if ip
886
- if !nic_alias && !nic_name
887
- template = "NIC = [ NETWORK_ID = #{network_id}, \
888
- IP = #{ip} ]"
889
- elsif !nic_alias && nic_name
890
- template = "NIC = [ NETWORK_ID = #{network_id},
891
- IP = #{ip},
892
- NAME = #{nic_name} ]"
893
- else
894
- template = "NIC_ALIAS = \
895
- [ NETWORK_ID = #{network_id},\
896
- IP = #{ip},\
897
- PARENT = #{nic_alias} ]"
898
- end
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
- if !nic_alias && !nic_name
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 immediately,
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 and stores it in the marketplace
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 => [LOGGER, KEEP, ONESHOT, MARKET] do
1507
- require 'logger'
1508
-
1509
- if options.key?(:oneshot) && !options.key?(:market)
1510
- STDERR.puts 'ERROR: no market given'
1511
- exit(-1)
1512
- end
1513
-
1514
- helper.perform_action(args[0], options, 'Backup') do |vm|
1515
- vm.extend(OpenNebula::VirtualMachineExt)
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
- helper.perform_action(args[0], options, 'Restore') do |vm|
1578
- vm.extend(OpenNebula::VirtualMachineExt)
1577
+ reset = options[:reset] == true
1579
1578
 
1580
- # If logger is specified use it, if not use STDOUT
1581
- options[:logger].nil? ? log_to = STDOUT : log_to = options[:logger]
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
- logger.formatter = proc do |severity, datetime, _p, msg|
1586
- "#{datetime.strftime(format)} #{severity.ljust(5)} : #{msg}\n"
1587
- end
1582
+ helper.schedule_actions([args[0]], options, @comm_name)
1583
+ else
1588
1584
 
1589
- begin
1590
- rc = vm.restore(options[:datastore], logger)
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/failure recovers: LOCK_CREATE, LOCK_DELETE state.
460
- States for a retry recover: LOCK_CREATE, LOCK_DELETE state
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
- remote_dir = conf['SCRIPTS_REMOTE_DIR']
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
- `#{sync_cmd} 2>/dev/null`
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 $CHILD_STATUS.nil? || !$CHILD_STATUS.success?
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
- vms.map! {|e| e.to_i }
360
- onevm_helper=OneVMHelper.new
361
- onevm_helper.client=@client
362
- onevm_helper.list_pool({ :ids=>vms, :no_pager => true }, false)
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 => Time
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
- perform_actions(
412
- ids, options,
413
- "#{action} scheduled at #{options[:schedule]}"
414
- ) do |vm|
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 = #{sched}"
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
- column :DONE, '', :adjust => true do |d|
1347
- OpenNebulaHelper.time_to_str(d['DONE'], false) \
1348
- unless d.nil?
1349
- end
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
- show = 'Already done'
1374
- end
1375
-
1376
- wrn = d['WARNING']
1377
- if !wrn.nil? && (t1 - vm['STIME'].to_i).to_i > wrn.to_i
1378
- "#{show} *"
1379
- else
1380
- show
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
@@ -424,7 +424,7 @@ EOT
424
424
  FORCE={
425
425
  :name => 'force',
426
426
  :large => '--force',
427
- :description => 'Overwrite the file'
427
+ :description => 'Ignore errors (if possible)'
428
428
  }
429
429
 
430
430
  EXTENDED={
@@ -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 Host) is included here -->
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>
@@ -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"/>
@@ -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>
@@ -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.2
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-10-14 00:00:00.000000000 Z
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.4.2
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.4.2
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: '0'
194
+ version: 1.3.1
195
195
  requirements: []
196
196
  rubygems_version: 3.1.2
197
197
  signing_key: