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 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: