opennebula-cli 6.8.0 → 6.8.2

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: 67cef3295aa89ae688e917b2f9586251ad2c1ef2a965cccd75103a8a987ea980
4
- data.tar.gz: 6959a48ef8b61e696c4d68b6d6fd5fcb225a62a451ec4e455354abd21aa75b7b
3
+ metadata.gz: 15c54d3ad1c7f151f8f8c85761c9e7d807ebaf3b60e11c8ba722f9efa55b5e36
4
+ data.tar.gz: 2162024e4c15e1fe2fcd811adb3a10d84e33943f5f6a67d930a93d2b3734b859
5
5
  SHA512:
6
- metadata.gz: 1dc2353d7f82ad36dedad8979b1071483f01306e5ec6aedcbd81aa9142f60b2cbdb260a2ce2a9289293ad9851b169ac942c1587054067e9416a0e03b2941a410
7
- data.tar.gz: c11031e925a29e9cc260117a17c6cf4ac956f381502124ea7a7e0c9aba360a704f59f71a8eabff0b527121a2ca7e179d6df2143f357a347fd26e5e3c1e2b75fc
6
+ metadata.gz: ca211f3593bc2262afaacf6ee1872c00335f7edb86ca52d532fe2abbdfd16d89ba8d4f1b26607c3e44e3bb31e0ed14f33aeefb0cd9cf62b986c0fc8429eb870c
7
+ data.tar.gz: 708bf45d47a6755eb71bba7df087025ee4c2ff016a4d0cb4acff390ff7d3373b3695045e9c63ed5d880011c9520bde7ddc5fc00d20b04d0f8ab3402fb4e96c87
data/bin/oneacct CHANGED
@@ -75,7 +75,7 @@ CommandParser::CmdParser.new(ARGV) do
75
75
  exit(0)
76
76
  end
77
77
 
78
- filter_flag = (options[:userfilter] || VirtualMachinePool::INFO_ALL)
78
+ filter_flag = options[:userfilter] || VirtualMachinePool::INFO_ALL
79
79
  if options[:start_time]
80
80
  start_time = options[:start_time].to_i
81
81
  else
data/bin/onebackupjob CHANGED
@@ -130,6 +130,10 @@ CommandParser::CmdParser.new(ARGV) do
130
130
  - using a template description file:
131
131
 
132
132
  onebackupjob create weekly_backup.tmpl
133
+
134
+ - using a template description via stdin:
135
+
136
+ cat $bj_template | onebackupjob create
133
137
  EOT
134
138
 
135
139
  command :create,
@@ -143,6 +147,8 @@ CommandParser::CmdParser.new(ARGV) do
143
147
  begin
144
148
  if args[0]
145
149
  template = File.read(args[0])
150
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
151
+ template = stdin
146
152
  else
147
153
  template = OneBackupJobHelper.create_backupjob_template(options)
148
154
  end
data/bin/onedatastore CHANGED
@@ -113,8 +113,11 @@ CommandParser::CmdParser.new(ARGV) do
113
113
 
114
114
  helper.create_resource(options) do |datastore|
115
115
  begin
116
- template = File.read(args[0]) if args[0]
117
- template = STDIN.read if STDIN.wait_readable(0)
116
+ if args[0]
117
+ template = File.read(args[0])
118
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
119
+ template = stdin
120
+ end
118
121
  datastore.allocate(template, cid)
119
122
  rescue StandardError => e
120
123
  STDERR.puts e.message
data/bin/oneflow CHANGED
@@ -79,7 +79,7 @@ CommandParser::CmdParser.new(ARGV) do
79
79
  DELETE = {
80
80
  :name => 'delete',
81
81
  :large => '--delete',
82
- :description => 'Force flow necover delete'
82
+ :description => 'Force flow recover delete'
83
83
  }
84
84
 
85
85
  APPEND = {
@@ -130,7 +130,8 @@ CommandParser::CmdParser.new(ARGV) do
130
130
  List the available services
131
131
  EOT
132
132
 
133
- command :list, list_desc, :options => FORMAT do
133
+ command :list, list_desc,
134
+ :options => FORMAT + CLIHelper::OPTIONS + [OpenNebulaHelper::DESCRIBE] do
134
135
  helper.list_service_pool(helper.client(options), options)
135
136
  end
136
137
 
@@ -162,6 +163,7 @@ CommandParser::CmdParser.new(ARGV) do
162
163
 
163
164
  delete_desc = <<-EOT.unindent
164
165
  Delete a given service
166
+ To force service removal please use 'oneflow recover --delete <service_id>' command
165
167
  EOT
166
168
 
167
169
  command :delete, delete_desc, [:range, :service_id_list] do
data/bin/oneflow-template CHANGED
@@ -143,7 +143,8 @@ CommandParser::CmdParser.new(ARGV) do
143
143
  List the available Service Templates
144
144
  EOT
145
145
 
146
- command :list, list_desc, :options => FORMAT do
146
+ command :list, list_desc,
147
+ :options => FORMAT + CLIHelper::OPTIONS + [OpenNebulaHelper::DESCRIBE] do
147
148
  helper.list_service_template_pool(helper.client(options), options)
148
149
  end
149
150
 
@@ -186,11 +187,13 @@ CommandParser::CmdParser.new(ARGV) do
186
187
  command :create, create_desc, [:file, nil], :options => Service::JSON_FORMAT do
187
188
  client = helper.client(options)
188
189
 
189
- template = nil
190
- template = File.read(args[0]) if args[0]
191
- template = STDIN.read if STDIN.wait_readable(0)
190
+ if args[0]
191
+ template = File.read(args[0])
192
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
193
+ template = stdin
194
+ end
192
195
 
193
- if template.nil?
196
+ if !template
194
197
  STDERR.puts 'A template must be provided'
195
198
  exit(-1)
196
199
  end
@@ -257,38 +260,40 @@ CommandParser::CmdParser.new(ARGV) do
257
260
  rc = 0
258
261
  client = helper.client(options)
259
262
 
260
- number.times do
261
- template = nil
262
- template = File.read(args[1]) if args[1]
263
- template = STDIN.read if STDIN.wait_readable(0)
263
+ if args[1]
264
+ template = File.read(args[1])
265
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
266
+ template = stdin
267
+ end
268
+ params['merge_template'] = JSON.parse(template) if template
264
269
 
265
- params['merge_template'] = JSON.parse(template) if template
270
+ unless params['merge_template']
271
+ response = client.get("#{RESOURCE_PATH}/#{args[0]}")
266
272
 
267
- unless params['merge_template']
268
- response = client.get("#{RESOURCE_PATH}/#{args[0]}")
273
+ if CloudClient.is_error?(response)
274
+ rc = [response.code.to_i, response.to_s]
275
+ break
276
+ end
269
277
 
270
- if CloudClient.is_error?(response)
271
- rc = [response.code.to_i, response.to_s]
272
- break
273
- end
278
+ params['merge_template'] = {}
279
+ body = JSON.parse(response.body)['DOCUMENT']['TEMPLATE']['BODY']
274
280
 
275
- params['merge_template'] = {}
276
- body = JSON.parse(response.body)['DOCUMENT']['TEMPLATE']['BODY']
281
+ # Check global custom attributes
282
+ custom_attrs = helper.custom_attrs(body['custom_attrs'])
283
+ params['merge_template'].merge!(custom_attrs) unless custom_attrs.nil?
277
284
 
278
- # Check global custom attributes
279
- custom_attrs = helper.custom_attrs(body['custom_attrs'])
280
- params['merge_template'].merge!(custom_attrs) unless custom_attrs.nil?
285
+ # Check role level custom attributes
286
+ custom_role_attrs = helper.custom_role_attrs(body['roles'])
287
+ params['merge_template'].merge!(custom_role_attrs) unless custom_role_attrs.nil?
281
288
 
282
- # Check role level custom attributes
283
- custom_role_attrs = helper.custom_role_attrs(body['roles'])
284
- params['merge_template'].merge!(custom_role_attrs) unless custom_role_attrs.nil?
289
+ # Check vnets attributes
290
+ vnets = helper.networks(body['networks'])
291
+ params['merge_template'].merge!(vnets) unless vnets.nil?
292
+ end
285
293
 
286
- # Check vnets attributes
287
- vnets = helper.networks(body['networks'])
288
- params['merge_template'].merge!(vnets) unless vnets.nil?
289
- end
294
+ json = Service.build_json_action('instantiate', params)
290
295
 
291
- json = Service.build_json_action('instantiate', params)
296
+ number.times do
292
297
  response = client.post("#{RESOURCE_PATH}/#{args[0]}/action", json)
293
298
 
294
299
  if CloudClient.is_error?(response)
data/bin/onehook CHANGED
@@ -164,6 +164,10 @@ CommandParser::CmdParser.new(ARGV) do
164
164
 
165
165
  onehook create hook.tmpl
166
166
 
167
+ - using a Hook description file via stdin:
168
+
169
+ cat $hook_template | onehook create
170
+
167
171
  EOT
168
172
 
169
173
  command :create, create_desc, :file, :options =>
@@ -172,6 +176,11 @@ CommandParser::CmdParser.new(ARGV) do
172
176
  begin
173
177
  if args[0]
174
178
  template = File.read(args[0])
179
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
180
+ template = stdin
181
+ else
182
+ STDERR.puts 'No hook template provided'
183
+ exit(-1)
175
184
  end
176
185
 
177
186
  if options[:dry]
data/bin/oneimage CHANGED
@@ -130,6 +130,7 @@ CommandParser::CmdParser.new(ARGV) do
130
130
  list_options += OpenNebulaHelper::FORMAT
131
131
  list_options << OpenNebulaHelper::NUMERIC
132
132
  list_options << OpenNebulaHelper::DESCRIBE
133
+ list_options << OneImageHelper::FILTERS
133
134
 
134
135
  CREATE_OPTIONS = [OneDatastoreHelper::DATASTORE,
135
136
  OneImageHelper::IMAGE,
@@ -215,10 +216,13 @@ CommandParser::CmdParser.new(ARGV) do
215
216
  check_capacity = true
216
217
  end
217
218
 
218
- if (args[0] || STDIN.wait_readable(0)) &&
219
- OpenNebulaHelper.create_template_options_used?(options)
219
+ conflicting_opts = []
220
+ if (args[0] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
221
+ OneImageHelper.create_template_options_used?(options, conflicting_opts)
222
+
223
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
224
+ "conflicting options: #{conflicting_opts.join(', ')}."
220
225
 
221
- STDERR.puts 'You cannot use both template and template creation options.'
222
226
  next -1
223
227
  end
224
228
 
@@ -235,8 +239,8 @@ CommandParser::CmdParser.new(ARGV) do
235
239
  begin
236
240
  if args[0]
237
241
  template = File.read(args[0])
238
- elsif STDIN.wait_readable(0)
239
- template = STDIN.read
242
+ elsif !stdin.empty?
243
+ template = stdin
240
244
  else
241
245
  res = OneImageHelper.create_image_template(options)
242
246
 
@@ -487,6 +491,16 @@ CommandParser::CmdParser.new(ARGV) do
487
491
  EOT
488
492
 
489
493
  command :list, list_desc, [:filterflag, nil], :options => list_options do
494
+ if options.key?(:backup)
495
+ filter = 'TYPE=BK'
496
+
497
+ if options[:filter]
498
+ options[:filter] << filter
499
+ else
500
+ options[:filter] = [filter]
501
+ end
502
+ options.delete(:backup)
503
+ end
490
504
  helper.list_pool(options, false, args[0])
491
505
  end
492
506
 
data/bin/onemarket CHANGED
@@ -105,8 +105,11 @@ CommandParser::CmdParser.new(ARGV) do
105
105
  command :create, create_desc, [:file, nil] do
106
106
  helper.create_resource(options) do |marketplace|
107
107
  begin
108
- template = File.read(args[0]) if args[0]
109
- template = STDIN.read if STDIN.wait_readable(0)
108
+ if args[0]
109
+ template = File.read(args[0])
110
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
111
+ template = stdin
112
+ end
110
113
  marketplace.allocate(template)
111
114
  rescue StandardError => e
112
115
  STDERR.puts e.message
data/bin/onemarketapp CHANGED
@@ -191,10 +191,12 @@ CommandParser::CmdParser.new(ARGV) do
191
191
  exit(-1)
192
192
  end
193
193
 
194
- if (args[0] || STDIN.wait_readable(0)) &&
195
- OneMarketPlaceAppHelper.create_template_options_used?(options)
196
- STDERR.puts 'You can not use both template file and template'\
197
- ' creation options.'
194
+ conflicting_opts = []
195
+ if (args[0] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
196
+ OneMarketPlaceAppHelper.create_template_options_used?(options, conflicting_opts)
197
+
198
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
199
+ "conflicting options: #{conflicting_opts.join(', ')}."
198
200
  next -1
199
201
  end
200
202
 
@@ -202,8 +204,8 @@ CommandParser::CmdParser.new(ARGV) do
202
204
  begin
203
205
  if args[0]
204
206
  template = File.read(args[0])
205
- elsif STDIN.wait_readable(0)
206
- template = STDIN.read
207
+ elsif !stdin.empty?
208
+ template = stdin
207
209
  else
208
210
  res = OneMarketPlaceAppHelper
209
211
  .create_datastore_template(options)
data/bin/onesecgroup CHANGED
@@ -110,7 +110,14 @@ CommandParser::CmdParser.new(ARGV) do
110
110
  command :create, create_desc, :file do
111
111
  helper.create_resource(options) do |obj|
112
112
  begin
113
- template = File.read(args[0])
113
+ if args[0]
114
+ template = File.read(args[0])
115
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
116
+ template = stdin
117
+ else
118
+ STDERR.puts 'No Security Group description provided'
119
+ exit(-1)
120
+ end
114
121
 
115
122
  obj.allocate(template)
116
123
  rescue StandardError => e
data/bin/oneshowback CHANGED
@@ -77,7 +77,7 @@ CommandParser::CmdParser.new(ARGV) do
77
77
  exit(0)
78
78
  end
79
79
 
80
- filter_flag = (options[:userfilter] || VirtualMachinePool::INFO_ALL)
80
+ filter_flag = options[:userfilter] || VirtualMachinePool::INFO_ALL
81
81
 
82
82
  start_month = -1
83
83
  start_year = -1
data/bin/onetemplate CHANGED
@@ -166,10 +166,13 @@ CommandParser::CmdParser.new(ARGV) do
166
166
  command :create, create_desc, [:file, nil], :options =>
167
167
  [OneTemplateHelper::VM_NAME] + OpenNebulaHelper::TEMPLATE_OPTIONS +
168
168
  [OpenNebulaHelper::DRY] do
169
- if (args[0] || STDIN.wait_readable(0)) &&
170
- OpenNebulaHelper.create_template_options_used?(options)
169
+ conflicting_opts = []
170
+ if (args[0] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
171
+ OpenNebulaHelper.create_template_options_used?(options, conflicting_opts)
172
+
173
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
174
+ "conflicting options: #{conflicting_opts.join(', ')}."
171
175
 
172
- STDERR.puts 'You can not use both template file and template creation options.'
173
176
  next -1
174
177
  end
175
178
 
@@ -177,8 +180,8 @@ CommandParser::CmdParser.new(ARGV) do
177
180
  begin
178
181
  if args[0]
179
182
  template = File.read(args[0])
180
- elsif STDIN.wait_readable(0)
181
- template = STDIN.read
183
+ elsif !stdin.empty?
184
+ template = stdin
182
185
  else
183
186
  res = OpenNebulaHelper.create_template(options)
184
187
 
@@ -255,11 +258,13 @@ CommandParser::CmdParser.new(ARGV) do
255
258
  command :instantiate, instantiate_desc, :templateid, [:file, nil],
256
259
  :options => instantiate_options + OpenNebulaHelper::TEMPLATE_OPTIONS do
257
260
  exit_code = 0
261
+ conflicting_opts = []
262
+ if (args[1] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
263
+ OpenNebulaHelper.create_template_options_used?(options, conflicting_opts)
258
264
 
259
- if (args[1] || STDIN.wait_readable(0)) &&
260
- OpenNebulaHelper.create_template_options_used?(options)
265
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
266
+ "conflicting options: #{conflicting_opts.join(', ')}."
261
267
 
262
- STDERR.puts 'You cannot use both template and template creation options.'
263
268
  next -1
264
269
  end
265
270
 
@@ -305,8 +310,8 @@ CommandParser::CmdParser.new(ARGV) do
305
310
 
306
311
  if args[1]
307
312
  extra_template = File.read(args[1])
308
- elsif STDIN.wait_readable(0)
309
- extra_template = STDIN.read
313
+ elsif !stdin.empty?
314
+ extra_template = stdin
310
315
  else
311
316
  res = OpenNebulaHelper.create_template(options, t)
312
317
 
data/bin/oneuser CHANGED
@@ -621,7 +621,7 @@ CommandParser::CmdParser.new(ARGV) do
621
621
  Example, request a valid token for a generic driver (e.g. core auth, LDAP...):
622
622
  oneuser token-create my_user --time 3600
623
623
 
624
- Example, request a group spefici token (new resources will be created in that
624
+ Example, request a group specific token (new resources will be created in that
625
625
  group and only resources that belong to that group will be listed):
626
626
  oneuser token-create my_user --group <id|group>
627
627
 
data/bin/onevcenter CHANGED
@@ -261,7 +261,7 @@ CommandParser::CmdParser.new(ARGV) do
261
261
  Examples:
262
262
  - importing first datastore
263
263
 
264
- onevcenter list -o templates -h <host_id>
264
+ onevcenter import -o templates -h <host_id>
265
265
 
266
266
  - importing 2 concrete templates:
267
267
 
data/bin/onevm CHANGED
@@ -349,19 +349,21 @@ CommandParser::CmdParser.new(ARGV) do
349
349
  number = options[:multiple] || 1
350
350
  exit_code = nil
351
351
 
352
- if (args[0] || STDIN.wait_readable(0)) &&
353
- OpenNebulaHelper.create_template_options_used?(options)
352
+ conflicting_opts = []
353
+ if (args[0] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
354
+ OpenNebulaHelper.create_template_options_used?(options, conflicting_opts)
355
+
356
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
357
+ "conflicting options: #{conflicting_opts.join(', ')}."
354
358
 
355
- STDERR.puts 'You can not use both template file and template'\
356
- ' creation options.'
357
359
  exit(-1)
358
360
  end
359
361
 
360
362
  begin
361
363
  if args[0]
362
364
  template = File.read(args[0])
363
- elsif STDIN.wait_readable(0)
364
- template = STDIN.read
365
+ elsif !stdin.empty?
366
+ template = stdin
365
367
  else
366
368
  res = OpenNebulaHelper.create_template(options)
367
369
 
@@ -615,8 +617,8 @@ CommandParser::CmdParser.new(ARGV) do
615
617
 
616
618
  if options[:file]
617
619
  extra_template = File.read(options[:file])
618
- elsif STDIN.wait_readable(0)
619
- extra_template = STDIN.read
620
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
621
+ extra_template = stdin
620
622
  end
621
623
 
622
624
  helper.perform_actions(args[0], options, verbose) do |vm|
@@ -689,7 +691,7 @@ CommandParser::CmdParser.new(ARGV) do
689
691
  end
690
692
 
691
693
  resume_desc = <<-EOT.unindent
692
- Resumes the execution of the a saved VM
694
+ Resumes the execution of a saved VM
693
695
 
694
696
  States: STOPPED, SUSPENDED, UNDEPLOYED, POWEROFF, UNKNOWN
695
697
  EOT
@@ -718,7 +720,7 @@ CommandParser::CmdParser.new(ARGV) do
718
720
  States for success/failure recovers: Any ACTIVE state.
719
721
  States for a retry recover: Any *FAILURE state
720
722
  States for delete: Any
721
- States for delete-recreate: Any but STOP/UNDEPLOYED
723
+ States for recreate: Any but DONE/POWEROFF/SUSPENDED
722
724
  States for delete-db: Any
723
725
  EOT
724
726
 
@@ -774,8 +776,8 @@ CommandParser::CmdParser.new(ARGV) do
774
776
  TARGET, CACHE, DISCARD, PREFIX] do
775
777
  if options[:file]
776
778
  template = File.read(options[:file])
777
- elsif STDIN.wait_readable(0)
778
- template = STDIN.read
779
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
780
+ template = stdin
779
781
  elsif options[:image]
780
782
  image_id = options[:image]
781
783
  target = options[:target]
@@ -851,8 +853,8 @@ CommandParser::CmdParser.new(ARGV) do
851
853
  ] do
852
854
  if options[:file]
853
855
  template = File.read(options[:file])
854
- elsif STDIN.wait_readable(0)
855
- template = STDIN.read
856
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
857
+ template = stdin
856
858
  elsif options[:network]
857
859
  network_id = options[:network]
858
860
  ip = options[:ip]
@@ -1267,8 +1269,7 @@ CommandParser::CmdParser.new(ARGV) do
1267
1269
  end
1268
1270
 
1269
1271
  resize_desc = <<-EOT.unindent
1270
- Resizes the capacity of a Virtual Machine (offline, the VM cannot be
1271
- RUNNING)
1272
+ Resizes the capacity of a Virtual Machine
1272
1273
 
1273
1274
  #{OpenNebulaHelper::TEMPLATE_INPUT}
1274
1275
  EOT
@@ -1277,8 +1278,8 @@ CommandParser::CmdParser.new(ARGV) do
1277
1278
  :options => OpenNebulaHelper::CAPACITY_OPTIONS_VM + [ENFORCE, OpenNebulaHelper::FILE] do
1278
1279
  if options[:file]
1279
1280
  template = File.read(options[:file])
1280
- elsif STDIN.wait_readable(0)
1281
- template = STDIN.read
1281
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
1282
+ template = stdin
1282
1283
  else
1283
1284
  template = ''
1284
1285
 
@@ -1325,6 +1326,26 @@ CommandParser::CmdParser.new(ARGV) do
1325
1326
  end
1326
1327
  end
1327
1328
 
1329
+ backupmode_set_desc = <<-EOT.unindent
1330
+ Updates the backup mode of a VM. Can be #{OpenNebulaHelper::BACKUP_MODES.join('|')}
1331
+ EOT
1332
+
1333
+ command :backupmode, backupmode_set_desc, :vmid, :mode do
1334
+ vm_ref = args[0]
1335
+ backup_mode = args[1]
1336
+
1337
+ if !helper.backup_mode_valid?(backup_mode)
1338
+ err_msg = "Invalid backup mode: #{backup_mode}\n"
1339
+ err_msg << "Valid backup modes are: #{OpenNebulaHelper::BACKUP_MODES.join(',')}"
1340
+
1341
+ STDERR.puts err_msg
1342
+ exit(-1)
1343
+ end
1344
+
1345
+ # TODO: Ensure other BACKUP_CONFIG is not overwritten
1346
+ helper.set_backup_mode(vm_ref, backup_mode)
1347
+ end
1348
+
1328
1349
  updateconf_desc = <<-EOT.unindent
1329
1350
  Updates the configuration of a VM. Valid states are: running, pending,
1330
1351
  failure, poweroff, undeploy, hold or cloning.
@@ -1337,13 +1358,13 @@ CommandParser::CmdParser.new(ARGV) do
1337
1358
  The full list of configuration attributes are:
1338
1359
 
1339
1360
  OS = ["ARCH", "MACHINE", "KERNEL", "INITRD", "BOOTLOADER", "BOOT", "UUID"]
1340
- FEATURES = ["ACPI", "PAE", "APIC", "LOCALTIME", "HYPERV", "GUEST_AGENT", "IOTHREADS"]
1361
+ FEATURES = ["ACPI", "PAE", "APIC", "LOCALTIME", "HYPERV", "GUEST_AGENT", "VIRTIO_SCSI_QUEUES", "VIRTIO_BLK_QUEUES", "IOTHREADS"]
1341
1362
  INPUT = ["TYPE", "BUS"]
1342
1363
  GRAPHICS = ["TYPE", "LISTEN", "PASSWD", "KEYMAP" ]
1343
1364
  VIDEO = ["TYPE", "IOMMU", "ATS", "VRAM", "RESOLUTION"]
1344
1365
  RAW = ["DATA", "DATA_VMX", "TYPE", "VALIDATE"]
1345
1366
  CPU_MODEL = ["MODEL"]
1346
- BACKUP_CONFIG = ["FS_FREEZE", "KEEP_LAST", "BACKUP_VOLATILE", "MODE"]
1367
+ BACKUP_CONFIG = ["FS_FREEZE", "KEEP_LAST", "BACKUP_VOLATILE", "MODE", "INCREMENT_MODE"]
1347
1368
  CONTEXT (any value, **variable substitution will be made**)
1348
1369
  EOT
1349
1370
 
@@ -1352,15 +1373,17 @@ CommandParser::CmdParser.new(ARGV) do
1352
1373
  template = ''
1353
1374
 
1354
1375
  begin
1355
- template = File.read(args[1]) if args[1]
1356
- template = STDIN.read if STDIN.wait_readable(0)
1376
+ if args[1]
1377
+ template = File.read(args[1])
1378
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
1379
+ template = stdin
1380
+ end
1357
1381
  rescue StandardError => e
1358
1382
  STDERR.puts "Error reading template: #{e.message}."
1359
1383
  exit(-1)
1360
1384
  end
1361
1385
 
1362
- helper.perform_action(args[0], options,
1363
- 'Updating VM configuration') do |vm|
1386
+ helper.perform_action(args[0], options, 'Updating VM configuration') do |vm|
1364
1387
  if template.empty?
1365
1388
  rc = vm.info
1366
1389
 
@@ -1587,6 +1610,68 @@ CommandParser::CmdParser.new(ARGV) do
1587
1610
  '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
1588
1611
  EOT
1589
1612
 
1613
+ pci_attach_desc = <<-EOT.unindent
1614
+ Attaches a PCI to a VM.
1615
+
1616
+ You can specify the PCI device with --pci (short_address) or
1617
+ --pci_device (device ID), --pci_class (class ID) and/or --pci_vendor (vendor ID).
1618
+
1619
+ States: POWEROFF
1620
+ EOT
1621
+
1622
+ command :"pci-attach", pci_attach_desc, :vmid,
1623
+ :options => [
1624
+ OpenNebulaHelper::FILE,
1625
+ PCI,
1626
+ PCI_CLASS,
1627
+ PCI_VENDOR,
1628
+ PCI_DEVICE
1629
+ ] do
1630
+ pci_attrs = [:pci, :pci_device, :pci_vendor, :pci_class].any? do |o|
1631
+ !options[o].nil?
1632
+ end
1633
+
1634
+ if options[:file]
1635
+ template = File.read(options[:file])
1636
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
1637
+ template = stdin
1638
+ elsif pci_attrs
1639
+ pcia = options[:pci]
1640
+ pcid = options[:pci_device]
1641
+ pcic = options[:pci_class]
1642
+ pciv = options[:pci_vendor]
1643
+
1644
+ pcis = []
1645
+ pcis << "SHORT_ADDRESS = \"#{pcia}\"" if pcia
1646
+ pcis << "DEVICE = \"#{pcid}\"" if pcid
1647
+ pcis << "CLASS = \"#{pcic}\"" if pcic
1648
+ pcis << "VENDOR = \"#{pciv}\"" if pciv
1649
+
1650
+ template = "PCI = [ #{pcis.join(',')} ]"
1651
+ else
1652
+ STDERR.puts 'Provide a PCI description file with --file or the relevant pci options:'
1653
+ exit(-1)
1654
+ end
1655
+
1656
+ helper.perform_action(args[0], options, 'Attaching PCI device') do |vm|
1657
+ vm.pci_attach(template)
1658
+ end
1659
+ end
1660
+
1661
+ pci_detach_desc = <<-EOT.unindent
1662
+ Detaches a PCI device from a VM
1663
+
1664
+ States: POWEROFF
1665
+ EOT
1666
+
1667
+ command :"pci-detach", pci_detach_desc, :vmid, :pciid do
1668
+ pciid = args[1].to_i
1669
+
1670
+ helper.perform_action(args[0], options, 'Detaching PCI') do |vm|
1671
+ vm.pci_detach(pciid)
1672
+ end
1673
+ end
1674
+
1590
1675
  command :ssh,
1591
1676
  ssh_desc,
1592
1677
  :vmid,
data/bin/onevmgroup CHANGED
@@ -136,7 +136,14 @@ CommandParser::CmdParser.new(ARGV) do
136
136
  command :create, create_desc, :file do
137
137
  helper.create_resource(options) do |obj|
138
138
  begin
139
- template = File.read(args[0])
139
+ if args[0]
140
+ template = File.read(args[0])
141
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
142
+ template = stdin
143
+ else
144
+ STDERR.puts 'No VM Group description provided'
145
+ exit(-1)
146
+ end
140
147
 
141
148
  obj.allocate(template)
142
149
  rescue StandardError => e
@@ -283,8 +290,11 @@ CommandParser::CmdParser.new(ARGV) do
283
290
 
284
291
  command :"role-add", role_add_desc, :vmgroupid, [:file, nil] do
285
292
  begin
286
- template = File.read(args[1]) if args[1]
287
- template = STDIN.read if STDIN.wait_readable(0)
293
+ if args[1]
294
+ template = File.read(args[1])
295
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
296
+ template = stdin
297
+ end
288
298
  rescue StandardError => e
289
299
  STDERR.puts "Error reading template: #{e.message}."
290
300
  exit(-1)
data/bin/onevnet CHANGED
@@ -171,8 +171,11 @@ CommandParser::CmdParser.new(ARGV) do
171
171
 
172
172
  helper.create_resource(options) do |vn|
173
173
  begin
174
- template = File.read(args[0]) if args[0]
175
- template = STDIN.read if STDIN.wait_readable(0)
174
+ if args[0]
175
+ template = File.read(args[0])
176
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
177
+ template = stdin
178
+ end
176
179
  vn.allocate(template, cid)
177
180
  rescue StandardError => e
178
181
  STDERR.puts "Error creating network: #{e.message}"
@@ -200,6 +203,8 @@ CommandParser::CmdParser.new(ARGV) do
200
203
  helper.perform_action(args[0], options, 'address range added') do |vn|
201
204
  if args[1]
202
205
  ar = File.read(args[1])
206
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
207
+ ar = stdin
203
208
  else
204
209
  ar = OpenNebulaHelper.create_ar(options)
205
210
  end
@@ -474,7 +479,7 @@ CommandParser::CmdParser.new(ARGV) do
474
479
  States for delete: Any but READY
475
480
  EOT
476
481
 
477
- command :recover, recover_desc, [:range, :vmid_list],
482
+ command :recover, recover_desc, [:range, :vnetid_list],
478
483
  :options => [SUCCESS, FAILURE, DELETE, RETRY] do
479
484
  if !options[:success].nil?
480
485
  result = 1
data/bin/onevntemplate CHANGED
@@ -149,6 +149,10 @@ CommandParser::CmdParser.new(ARGV) do
149
149
 
150
150
  onevntemplate create vn_description.tmpl
151
151
 
152
+ - using a Virtual Network Template description file via stdin:
153
+
154
+ cat $vn_template | onevntemplate create
155
+
152
156
  EOT
153
157
 
154
158
  command :create, create_desc, [:file, nil], :options =>
@@ -157,6 +161,8 @@ CommandParser::CmdParser.new(ARGV) do
157
161
  begin
158
162
  if args[0]
159
163
  template = File.read(args[0])
164
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
165
+ template = stdin
160
166
  end
161
167
 
162
168
  if options[:dry]
@@ -250,6 +256,8 @@ CommandParser::CmdParser.new(ARGV) do
250
256
 
251
257
  if args[1]
252
258
  extra_template = File.read(args[1])
259
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
260
+ extra_template = stdin
253
261
  else
254
262
  res = OpenNebulaHelper.create_template(options, t)
255
263
 
data/bin/onevrouter CHANGED
@@ -140,8 +140,11 @@ CommandParser::CmdParser.new(ARGV) do
140
140
  command :create, create_desc, [:file, nil] do
141
141
  helper.create_resource(options) do |obj|
142
142
  begin
143
- template = File.read(args[0]) if args[0]
144
- template = STDIN.read if STDIN.wait_readable(0)
143
+ if args[0]
144
+ template = File.read(args[0])
145
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
146
+ template = stdin
147
+ end
145
148
  obj.allocate(template)
146
149
  rescue StandardError => e
147
150
  STDERR.puts e.message
@@ -171,10 +174,12 @@ CommandParser::CmdParser.new(ARGV) do
171
174
  :vrouterid, :templateid, [:file, nil],
172
175
  :options => instantiate_options +
173
176
  OpenNebulaHelper::TEMPLATE_OPTIONS do
174
- if (args[2] || STDIN.wait_readable(0)) &&
175
- OpenNebulaHelper.create_template_options_used?(options)
177
+ conflicting_opts = []
178
+ if (args[2] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
179
+ OpenNebulaHelper.create_template_options_used?(options, conflicting_opts)
176
180
 
177
- STDERR.puts 'You cannot use both template and template creation options.'
181
+ STDERR.puts 'You cannot pass template on STDIN and use template creation options, ' <<
182
+ "conflicting options: #{conflicting_opts.join(', ')}."
178
183
  exit(-1)
179
184
  end
180
185
 
@@ -198,8 +203,8 @@ CommandParser::CmdParser.new(ARGV) do
198
203
 
199
204
  if args[2]
200
205
  extra_template = File.read(args[2])
201
- elsif STDIN.wait_readable(0)
202
- extra_template = STDIN.read
206
+ elsif !stdin.empty?
207
+ extra_template = stdin
203
208
  else
204
209
  res = OpenNebulaHelper.create_template(options, t)
205
210
 
@@ -304,8 +309,8 @@ CommandParser::CmdParser.new(ARGV) do
304
309
  OneVirtualRouterHelper::FLOAT] do
305
310
  if options[:file]
306
311
  template = File.read(options[:file])
307
- elsif STDIN.wait_readable(0)
308
- template = STDIN.read
312
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
313
+ template = stdin
309
314
  elsif options[:network]
310
315
  network_id = options[:network]
311
316
  ip = options[:ip]
data/bin/onezone CHANGED
@@ -109,7 +109,14 @@ CommandParser::CmdParser.new(ARGV) do
109
109
  command :create, create_desc, :file do
110
110
  helper.create_resource(options) do |zone|
111
111
  begin
112
- template = File.read(args[0])
112
+ if args[0]
113
+ template = File.read(args[0])
114
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
115
+ template = stdin
116
+ else
117
+ STDERR.puts 'No zone template provided'
118
+ exit(-1)
119
+ end
113
120
  zone.allocate(template)
114
121
  rescue StandardError => e
115
122
  STDERR.puts e.message
@@ -155,6 +155,8 @@ class OneBackupJobHelper < OpenNebulaHelper::OneHelper
155
155
  # Get user information
156
156
  if file
157
157
  str = File.read(file)
158
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
159
+ str = stdin
158
160
  else
159
161
  str = OpenNebulaHelper.update_template(id, bj, nil, xpath)
160
162
  end
@@ -105,7 +105,10 @@ class OneFlowHelper < OpenNebulaHelper::OneHelper
105
105
  elsif options[:yaml]
106
106
  [0, array_list.to_yaml(:indent => 4)]
107
107
  else
108
- format_service_pool.show(array_list)
108
+ table = format_service_pool
109
+
110
+ table.show(array_list, options)
111
+ table.describe_columns if options[:describe]
109
112
 
110
113
  0
111
114
  end
@@ -85,8 +85,11 @@ class OneFlowTemplateHelper < OpenNebulaHelper::OneHelper
85
85
  elsif options[:yaml]
86
86
  [0, JSON.parse(response.body).to_yaml(:indent => 4)]
87
87
  else
88
+ table = format_service_template_pool
88
89
  documents = JSON.parse(response.body)['DOCUMENT_POOL']
89
- format_service_template_pool.show(documents['DOCUMENT'])
90
+
91
+ table.show(documents['DOCUMENT'], options)
92
+ table.describe_columns if options[:describe]
90
93
 
91
94
  0
92
95
  end
@@ -794,6 +794,8 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
794
794
  numa_nodes.each do |node|
795
795
  mon_node = monitoring.find {|x| x['NODE_ID'] == node['NODE_ID'] }
796
796
 
797
+ next if mon_node.nil?
798
+
797
799
  node['MEMORY']['FREE'] = mon_node['MEMORY']['FREE']
798
800
  node['MEMORY']['USED'] = mon_node['MEMORY']['USED']
799
801
 
@@ -173,6 +173,15 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
173
173
  :format => String
174
174
  }
175
175
 
176
+ FILTERS = [
177
+ {
178
+ :name => 'backup',
179
+ :large => '--backup',
180
+ :description => 'Show only backup type images',
181
+ :format => String
182
+ }
183
+ ]
184
+
176
185
  def self.rname
177
186
  'IMAGE'
178
187
  end
@@ -263,13 +272,13 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
263
272
  tmpl_pool.info
264
273
 
265
274
  pool.each do |img|
275
+ next if img['TYPE'].to_i == 6 # skip backup images
276
+
266
277
  attrs = { :id => img['ID'],
267
278
  :name => img['NAME'],
268
279
  :uname => img['UNAME'] }
269
280
 
270
- orphans << img['ID'] if check_orphan(tmpl_pool,
271
- xpath,
272
- 'IMAGE', attrs)
281
+ orphans << img['ID'] if check_orphan(tmpl_pool, xpath, 'IMAGE', attrs)
273
282
  end
274
283
 
275
284
  orphans
@@ -509,6 +518,18 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
509
518
  [0, template]
510
519
  end
511
520
 
521
+ def create_template_options_used?(options, conflicting_opts)
522
+ # Get the template options names as symbols, options hash uses symbols
523
+ template_options=TEMPLATE_OPTIONS.map do |o|
524
+ o[:name].to_sym
525
+ end
526
+
527
+ # Check if one at least one of the template options is in options hash
528
+ conflicting_opts.replace(options.keys & template_options)
529
+
530
+ !conflicting_opts.empty?
531
+ end
532
+
512
533
  end
513
534
 
514
535
  end
@@ -129,16 +129,17 @@ class OneMarketPlaceAppHelper < OpenNebulaHelper::OneHelper
129
129
  end
130
130
  end
131
131
 
132
- def self.create_template_options_used?(options)
132
+ def self.create_template_options_used?(options, conflicting_opts)
133
133
  # Get the template options names as symbols. options hash
134
134
  # uses symbols
135
135
  template_options=self::TEMPLATE_OPTIONS.map do |o|
136
136
  o[:name].to_sym
137
137
  end
138
138
 
139
- # Check if one at least one of the template options is
140
- # in options hash
141
- (template_options-options.keys)!=template_options
139
+ # Check if at least one of the template options is in options hash
140
+ conflicting_opts.replace(options.keys & template_options)
141
+
142
+ !conflicting_opts.empty?
142
143
  end
143
144
 
144
145
  # Import object into marketplace
@@ -397,6 +397,8 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
397
397
  # Get user information
398
398
  if file
399
399
  str = File.read(file)
400
+ elsif !(stdin = OpenNebulaHelper.read_stdin).empty?
401
+ str = stdin
400
402
  else
401
403
  str = OpenNebulaHelper.update_template(vm_id, vm, nil, xpath)
402
404
  end
@@ -637,6 +639,21 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
637
639
  # rubocop:enable Style/SpecialGlobalVars
638
640
  end
639
641
 
642
+ def get_backup_mode(vm_id)
643
+ vm = retrieve_resource(vm_id)
644
+
645
+ if vm.has_elements?('/VM/BACKUPS/BACKUP_CONFIG')
646
+ vm.template_like_str('BACKUPS/BACKUP_CONFIG/MODE')
647
+ else
648
+ nil
649
+ end
650
+ end
651
+
652
+ def set_backup_mode(vm_ref, backup_mode)
653
+ vm = retrieve_resource(vm_ref)
654
+ vm.updateconf("BACKUP_CONFIG = [\"MODE\"=\"#{backup_mode}\"]")
655
+ end
656
+
640
657
  private
641
658
 
642
659
  def factory(id = nil)
@@ -1449,7 +1466,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
1449
1466
  vm_snapshots.each do |disk|
1450
1467
  disk_id = disk['DISK_ID']
1451
1468
 
1452
- sshots = [disk['SNAPSHOT']].flatten
1469
+ sshots = [disk['SNAPSHOT'] || []].flatten
1453
1470
  sshots.each do |snapshot|
1454
1471
  data = snapshot.merge('DISK_ID' => disk_id)
1455
1472
  snapshots << data
data/lib/one_helper.rb CHANGED
@@ -593,6 +593,8 @@ Bash symbols must be escaped on STDIN passing'
593
593
 
594
594
  OPTIONS = FORMAT, EXTENDED, NUMERIC, KILOBYTES
595
595
 
596
+ BACKUP_MODES = ['FULL', 'INCREMENT']
597
+
596
598
  class OneHelper
597
599
 
598
600
  attr_accessor :client
@@ -717,6 +719,14 @@ Bash symbols must be escaped on STDIN passing'
717
719
  end
718
720
  end
719
721
 
722
+ def backup_mode_valid?(sus_backup_mode)
723
+ BACKUP_MODES.each do |backup_mode|
724
+ return true if backup_mode.casecmp?(sus_backup_mode)
725
+ end
726
+
727
+ false
728
+ end
729
+
720
730
  #-----------------------------------------------------------------------
721
731
  # List pool functions
722
732
  #-----------------------------------------------------------------------
@@ -1702,8 +1712,8 @@ Bash symbols must be escaped on STDIN passing'
1702
1712
  def self.update_template_helper(append, _id, resource, path, xpath, update = true)
1703
1713
  if path
1704
1714
  File.read(path)
1705
- elsif STDIN.wait_readable(0)
1706
- STDIN.read
1715
+ elsif !(stdin = self.read_stdin).empty?
1716
+ stdin
1707
1717
  elsif append
1708
1718
  editor_input
1709
1719
  else
@@ -2085,16 +2095,17 @@ Bash symbols must be escaped on STDIN passing'
2085
2095
  ar << ']'
2086
2096
  end
2087
2097
 
2088
- def self.create_template_options_used?(options)
2098
+ def self.create_template_options_used?(options, conflicting_opts)
2089
2099
  # Get the template options names as symbols. options hash
2090
2100
  # uses symbols
2091
2101
  template_options=OpenNebulaHelper::TEMPLATE_OPTIONS.map do |o|
2092
2102
  o[:name].to_sym
2093
2103
  end
2094
2104
 
2095
- # Check if one at least one of the template options is
2096
- # in options hash
2097
- (template_options-options.keys)!=template_options
2105
+ # Check if at least one of the template options is in options hash
2106
+ conflicting_opts.replace(options.keys & template_options)
2107
+
2108
+ !conflicting_opts.empty?
2098
2109
  end
2099
2110
 
2100
2111
  def self.sunstone_url
@@ -2313,7 +2324,7 @@ Bash symbols must be escaped on STDIN passing'
2313
2324
  answer = STDIN.readline.chop
2314
2325
 
2315
2326
  answer = initial if answer == ''
2316
- noanswer = ((answer == '') && optional)
2327
+ noanswer = (answer == '') && optional
2317
2328
  end while !noanswer && (answer =~ exp).nil?
2318
2329
 
2319
2330
  if noanswer
@@ -2379,7 +2390,7 @@ Bash symbols must be escaped on STDIN passing'
2379
2390
  answer = options[answer.to_i]
2380
2391
  end
2381
2392
 
2382
- noanswer = ((answer == '') && optional)
2393
+ noanswer = (answer == '') && optional
2383
2394
  end while !noanswer && !options.include?(answer)
2384
2395
 
2385
2396
  if noanswer
@@ -2650,4 +2661,11 @@ Bash symbols must be escaped on STDIN passing'
2650
2661
  end
2651
2662
  end
2652
2663
 
2664
+ def self.read_stdin
2665
+ if STDIN.wait_readable(0)
2666
+ STDIN.read()
2667
+ else
2668
+ ''
2669
+ end
2670
+ end
2653
2671
  end
@@ -162,6 +162,7 @@
162
162
  <xs:element name="BACKUP_VOLATILE" type="xs:string" minOccurs="0" maxOccurs="1"/>
163
163
  <xs:element name="FS_FREEZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
164
164
  <xs:element name="INCREMENTAL_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
165
+ <xs:element name="INCREMENT_MODE" type="xs:string" minOccurs="0" maxOccurs="1"/>
165
166
  <xs:element name="KEEP_LAST" type="xs:string" minOccurs="0" maxOccurs="1"/>
166
167
  <xs:element name="LAST_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
167
168
  <xs:element name="LAST_BACKUP_SIZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
@@ -27,6 +27,7 @@
27
27
  <xs:element name="BACKUP_VMS" type="xs:string"/>
28
28
  <xs:element name="BACKUP_VOLATILE" type="xs:string" minOccurs="0" maxOccurs="1"/>
29
29
  <xs:element name="DATASTORE_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
30
+ <xs:element name="ERROR" type="xs:string" minOccurs="0" maxOccurs="1"/>
30
31
  <xs:element name="EXECUTION" type="xs:string" minOccurs="0" maxOccurs="1"/>
31
32
  <xs:element name="FS_FREEZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
32
33
  <xs:element name="KEEP_LAST" type="xs:integer" minOccurs="0" maxOccurs="1"/>
@@ -299,6 +299,7 @@
299
299
  <xs:element name="BACKUP_VOLATILE" type="xs:string" minOccurs="0" maxOccurs="1"/>
300
300
  <xs:element name="FS_FREEZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
301
301
  <xs:element name="INCREMENTAL_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
302
+ <xs:element name="INCREMENT_MODE" type="xs:string" minOccurs="0" maxOccurs="1"/>
302
303
  <xs:element name="KEEP_LAST" type="xs:string" minOccurs="0" maxOccurs="1"/>
303
304
  <xs:element name="LAST_BACKUP_ID" type="xs:string" minOccurs="0" maxOccurs="1"/>
304
305
  <xs:element name="LAST_BACKUP_SIZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
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.8.0
4
+ version: 6.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenNebula
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-17 00:00:00.000000000 Z
11
+ date: 2024-02-20 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.8.0
19
+ version: 6.8.2
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.8.0
26
+ version: 6.8.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement