opennebula-cli 6.8.2 → 6.9.80.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/oneflow +23 -3
- data/bin/oneflow-template +19 -1
- data/bin/oneimage +13 -94
- data/bin/onemarketapp +2 -13
- data/bin/onevm +48 -4
- data/bin/onezone +1 -5
- data/lib/one_helper/onegroup_helper.rb +1 -1
- data/lib/one_helper/oneimage_helper.rb +2 -3
- data/lib/one_helper/onequota_helper.rb +75 -0
- data/lib/one_helper/oneuser_helper.rb +1 -1
- data/lib/one_helper/onevm_helper.rb +2 -1
- data/lib/one_helper/onezone_helper.rb +2 -2
- data/lib/one_helper.rb +3 -3
- data/share/schemas/xsd/host.xsd +15 -2
- data/share/schemas/xsd/image.xsd +5 -21
- data/share/schemas/xsd/opennebula_configuration.xsd +0 -2
- data/share/schemas/xsd/vm_pool.xsd +24 -2
- metadata +27 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38482e5c20e3b6bd22fe7b91b7d24bf7d7663fc1c43d8ea53d592c36395c652c
|
4
|
+
data.tar.gz: 143fa13eee00b3e666b0a8105e021c71062d668db57630b39d9c3b221e329101
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5b689b4788e3122e7a80407ff2846c87d56ba903e9254c4e70add4dae6f8c55e573996e75867c8f9de1aa64a592aa133861edee4e009205b46f700bdec7eb8a
|
7
|
+
data.tar.gz: 9704f4990ac5c7243cad58ffbe59e9f3f323acd8ea23b142059bdb21c6fe510587f8ad5eab05514e8abae6c1ce55c6bf713e7c1acc316c8b4cfe81b62c6137da
|
data/bin/oneflow
CHANGED
@@ -61,6 +61,21 @@ USER_AGENT = 'CLI'
|
|
61
61
|
# Base Path representing the resource to be used in the requests
|
62
62
|
RESOURCE_PATH = '/service'
|
63
63
|
|
64
|
+
RESOURCE_DOCUMENT_TYPE = '100'
|
65
|
+
|
66
|
+
def check_document_type(response)
|
67
|
+
if CloudClient.is_error?(response)
|
68
|
+
return if response.code == '500' # could be wrong document_type; skip this id
|
69
|
+
|
70
|
+
exit_with_code response.code.to_i, response.to_s
|
71
|
+
else
|
72
|
+
document_type = JSON.parse(response.body)['DOCUMENT']['TYPE']
|
73
|
+
if document_type == RESOURCE_DOCUMENT_TYPE
|
74
|
+
yield
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
64
79
|
CommandParser::CmdParser.new(ARGV) do
|
65
80
|
usage '`oneflow` <command> [<args>] [<options>]'
|
66
81
|
version OpenNebulaHelper::ONE_VERSION
|
@@ -168,9 +183,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
168
183
|
|
169
184
|
command :delete, delete_desc, [:range, :service_id_list] do
|
170
185
|
client = helper.client(options)
|
171
|
-
|
172
186
|
Service.perform_actions(args[0]) do |service_id|
|
173
|
-
client.
|
187
|
+
response = client.get("#{RESOURCE_PATH}/#{service_id}")
|
188
|
+
check_document_type response do
|
189
|
+
client.delete("#{RESOURCE_PATH}/#{service_id}")
|
190
|
+
end
|
174
191
|
end
|
175
192
|
end
|
176
193
|
|
@@ -197,7 +214,10 @@ CommandParser::CmdParser.new(ARGV) do
|
|
197
214
|
|
198
215
|
json = Service.build_json_action('recover', params)
|
199
216
|
|
200
|
-
client.
|
217
|
+
response = client.get("#{RESOURCE_PATH}/#{service_id}")
|
218
|
+
check_document_type response do
|
219
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
220
|
+
end
|
201
221
|
end
|
202
222
|
end
|
203
223
|
|
data/bin/oneflow-template
CHANGED
@@ -68,6 +68,21 @@ USER_AGENT = 'CLI'
|
|
68
68
|
# Base Path representing the resource to be used in the requests
|
69
69
|
RESOURCE_PATH = '/service_template'
|
70
70
|
|
71
|
+
RESOURCE_DOCUMENT_TYPE = '101'
|
72
|
+
|
73
|
+
def check_document_type(response)
|
74
|
+
if CloudClient.is_error?(response)
|
75
|
+
return if response.code == '500' # could be wrong document_type; skip this id
|
76
|
+
|
77
|
+
exit_with_code response.code.to_i, response.to_s
|
78
|
+
else
|
79
|
+
document_type = JSON.parse(response.body)['DOCUMENT']['TYPE']
|
80
|
+
if document_type == RESOURCE_DOCUMENT_TYPE
|
81
|
+
yield
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
71
86
|
CommandParser::CmdParser.new(ARGV) do
|
72
87
|
MULTIPLE = {
|
73
88
|
:name => 'multiple',
|
@@ -240,7 +255,10 @@ CommandParser::CmdParser.new(ARGV) do
|
|
240
255
|
body['delete_type'] = delete
|
241
256
|
|
242
257
|
Service.perform_actions(args[0]) do |template_id|
|
243
|
-
client.
|
258
|
+
response = client.get("#{RESOURCE_PATH}/#{template_id}")
|
259
|
+
check_document_type response do
|
260
|
+
client.delete("#{RESOURCE_PATH}/#{template_id}", body.to_json)
|
261
|
+
end
|
244
262
|
end
|
245
263
|
end
|
246
264
|
|
data/bin/oneimage
CHANGED
@@ -88,12 +88,6 @@ CommandParser::CmdParser.new(ARGV) do
|
|
88
88
|
:description => 'lock all actions'
|
89
89
|
}
|
90
90
|
|
91
|
-
NO_CONTEXT = {
|
92
|
-
:name => 'no_context',
|
93
|
-
:large => '--no-context',
|
94
|
-
:description => 'Do not add context when building from Dockerfile'
|
95
|
-
}
|
96
|
-
|
97
91
|
NO_IP = {
|
98
92
|
:name => 'no_ip',
|
99
93
|
:large => '--no_ip',
|
@@ -121,6 +115,13 @@ CommandParser::CmdParser.new(ARGV) do
|
|
121
115
|
:description => 'Name of the new image'
|
122
116
|
}
|
123
117
|
|
118
|
+
DISK_ID = {
|
119
|
+
:name => 'disk_id',
|
120
|
+
:large => '--disk-id disk_id',
|
121
|
+
:format => Integer,
|
122
|
+
:description => 'Restore only selected disk ID'
|
123
|
+
}
|
124
|
+
|
124
125
|
########################################################################
|
125
126
|
# Global Options
|
126
127
|
########################################################################
|
@@ -134,8 +135,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
134
135
|
|
135
136
|
CREATE_OPTIONS = [OneDatastoreHelper::DATASTORE,
|
136
137
|
OneImageHelper::IMAGE,
|
137
|
-
NAME
|
138
|
-
NO_CONTEXT]
|
138
|
+
NAME]
|
139
139
|
|
140
140
|
########################################################################
|
141
141
|
# Formatters for arguments
|
@@ -210,11 +210,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
210
210
|
exit(-1)
|
211
211
|
end
|
212
212
|
|
213
|
-
|
214
|
-
check_capacity = false
|
215
|
-
else
|
216
|
-
check_capacity = true
|
217
|
-
end
|
213
|
+
no_check_capacity = !options[:no_check_capacity].nil?
|
218
214
|
|
219
215
|
conflicting_opts = []
|
220
216
|
if (args[0] || !(stdin = OpenNebulaHelper.read_stdin).empty?) &&
|
@@ -226,15 +222,6 @@ CommandParser::CmdParser.new(ARGV) do
|
|
226
222
|
next -1
|
227
223
|
end
|
228
224
|
|
229
|
-
# Add context information when building image (just working on Docker)
|
230
|
-
if (options.key? :no_context) && options[:path]
|
231
|
-
if options[:path].include?('?')
|
232
|
-
options[:path] << '&context=no'
|
233
|
-
else
|
234
|
-
options[:path] << '?context=no'
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
225
|
helper.create_resource(options) do |image|
|
239
226
|
begin
|
240
227
|
if args[0]
|
@@ -257,7 +244,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
257
244
|
exit 0
|
258
245
|
end
|
259
246
|
|
260
|
-
image.allocate(template, options[:datastore],
|
247
|
+
image.allocate(template, options[:datastore], no_check_capacity)
|
261
248
|
rescue StandardError => e
|
262
249
|
STDERR.puts e.message
|
263
250
|
exit(-1)
|
@@ -457,7 +444,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
457
444
|
command :restore,
|
458
445
|
restore_desc,
|
459
446
|
:imageid,
|
460
|
-
:options => [OneDatastoreHelper::DATASTORE, NO_NIC, NO_IP, NAME, INCREMENT] do
|
447
|
+
:options => [OneDatastoreHelper::DATASTORE, NO_NIC, NO_IP, NAME, INCREMENT, DISK_ID] do
|
461
448
|
helper.perform_action(args[0], options, 'vm backup restored') do |o|
|
462
449
|
if options[:datastore].nil?
|
463
450
|
STDERR.puts 'Datastore to restore the backup is mandatory: '
|
@@ -471,13 +458,14 @@ CommandParser::CmdParser.new(ARGV) do
|
|
471
458
|
restore_opts << "NO_IP=\"YES\"\n" if options[:no_ip]
|
472
459
|
restore_opts << "NAME=\"#{options[:name]}\"\n" if options[:name]
|
473
460
|
restore_opts << "INCREMENT_ID=\"#{options[:increment]}\"\n" if options[:increment]
|
461
|
+
restore_opts << "DISK_ID=\"#{options[:disk_id]}\"\n" if options[:disk_id]
|
474
462
|
|
475
463
|
rc = o.restore(options[:datastore].to_i, restore_opts)
|
476
464
|
|
477
465
|
if !OpenNebula.is_error?(rc)
|
478
466
|
ids = rc.split(' ')
|
479
467
|
|
480
|
-
puts "VM Template: #{ids[0]}" if ids[0]
|
468
|
+
puts "VM Template: #{ids[0]}" if ids[0] && ids[0] != '-1'
|
481
469
|
puts "Images: #{ids[1..-1].join(' ')}" if ids.length > 1
|
482
470
|
else
|
483
471
|
puts rc.message
|
@@ -569,73 +557,4 @@ CommandParser::CmdParser.new(ARGV) do
|
|
569
557
|
|
570
558
|
return 0
|
571
559
|
end
|
572
|
-
|
573
|
-
dockerfile_desc = <<-EOT.unindent
|
574
|
-
Create an image based on a Dockerfile
|
575
|
-
EOT
|
576
|
-
|
577
|
-
command :dockerfile,
|
578
|
-
dockerfile_desc,
|
579
|
-
:options => CREATE_OPTIONS +
|
580
|
-
OneImageHelper::TEMPLATE_OPTIONS do
|
581
|
-
# Check user options
|
582
|
-
unless options[:datastore]
|
583
|
-
STDERR.puts 'Datastore to save the image is mandatory: '
|
584
|
-
STDERR.puts "\t -d datastore_id"
|
585
|
-
exit(-1)
|
586
|
-
end
|
587
|
-
|
588
|
-
unless options[:name]
|
589
|
-
STDERR.puts 'No name provided'
|
590
|
-
exit(-1)
|
591
|
-
end
|
592
|
-
|
593
|
-
unless options[:size]
|
594
|
-
STDERR.puts 'No size given'
|
595
|
-
exit(-1)
|
596
|
-
end
|
597
|
-
|
598
|
-
# Prepare editor
|
599
|
-
tmp = Tempfile.new('dockerfile')
|
600
|
-
|
601
|
-
if ENV['EDITOR']
|
602
|
-
editor_path = ENV['EDITOR']
|
603
|
-
else
|
604
|
-
editor_path = EDITOR_PATH
|
605
|
-
end
|
606
|
-
|
607
|
-
system("#{editor_path} #{tmp.path}")
|
608
|
-
|
609
|
-
unless $CHILD_STATUS.exitstatus.zero?
|
610
|
-
STDERR.puts('Editor not defined')
|
611
|
-
exit(-1)
|
612
|
-
end
|
613
|
-
|
614
|
-
tmp.close
|
615
|
-
|
616
|
-
# Create image
|
617
|
-
helper.create_resource(options) do |image|
|
618
|
-
begin
|
619
|
-
b64 = Base64.strict_encode64(File.read(tmp.path))
|
620
|
-
options[:path] = "dockerfile:///?fileb64=#{b64}&" \
|
621
|
-
"size=#{options[:size]}"
|
622
|
-
|
623
|
-
options[:path] << '&context=no' if options.key?(:no_context)
|
624
|
-
|
625
|
-
res = OneImageHelper.create_image_template(options)
|
626
|
-
|
627
|
-
if res.first != 0
|
628
|
-
STDERR.puts res.last
|
629
|
-
next -1
|
630
|
-
end
|
631
|
-
|
632
|
-
template = res.last
|
633
|
-
|
634
|
-
image.allocate(template, options[:datastore], false)
|
635
|
-
rescue StandardError => e
|
636
|
-
STDERR.puts e.message
|
637
|
-
exit(-1)
|
638
|
-
end
|
639
|
-
end
|
640
|
-
end
|
641
560
|
end
|
data/bin/onemarketapp
CHANGED
@@ -90,13 +90,6 @@ CommandParser::CmdParser.new(ARGV) do
|
|
90
90
|
:description => 'lock all actions'
|
91
91
|
}
|
92
92
|
|
93
|
-
TAG = {
|
94
|
-
:name => 'tag',
|
95
|
-
:large => '--tag tag',
|
96
|
-
:format => String,
|
97
|
-
:description => 'DockerHub image tag (default latest)'
|
98
|
-
}
|
99
|
-
|
100
93
|
YES = {
|
101
94
|
:name => 'yes',
|
102
95
|
:large => '--yes',
|
@@ -143,7 +136,6 @@ CommandParser::CmdParser.new(ARGV) do
|
|
143
136
|
EXPORT_OPTIONS = [OneDatastoreHelper::DATASTORE,
|
144
137
|
OneDatastoreHelper::FILE_DATASTORE,
|
145
138
|
OneMarketPlaceAppHelper::VMNAME,
|
146
|
-
TAG,
|
147
139
|
NO,
|
148
140
|
TEMPLATE]
|
149
141
|
IMPORT_OPTIONS = [YES, NO, MARKET, OneMarketPlaceAppHelper::VMNAME]
|
@@ -291,17 +283,14 @@ CommandParser::CmdParser.new(ARGV) do
|
|
291
283
|
|
292
284
|
command :export, export_desc, :appid, :name, :options => EXPORT_OPTIONS do
|
293
285
|
helper.perform_action(args[0], options, 'exporting') do |obj|
|
294
|
-
tag ="tag=#{options[:tag]}" if options[:tag]
|
295
|
-
|
296
286
|
obj.extend(MarketPlaceAppExt)
|
297
287
|
|
298
288
|
rc = obj.export(
|
299
289
|
:dsid => options[:datastore],
|
300
290
|
:name => args[1],
|
301
291
|
:vmtemplate_name => options[:vmname],
|
302
|
-
:
|
303
|
-
:
|
304
|
-
:template => options[:template]
|
292
|
+
:notemplate => options[:no] == 'no',
|
293
|
+
:template => options[:template]
|
305
294
|
)
|
306
295
|
|
307
296
|
if OpenNebula.is_error?(rc)
|
data/bin/onevm
CHANGED
@@ -257,6 +257,21 @@ CommandParser::CmdParser.new(ARGV) do
|
|
257
257
|
:description => 'Creates a new backup image, from a new full backup (only for incremental)'
|
258
258
|
}
|
259
259
|
|
260
|
+
INCREMENT = {
|
261
|
+
:name => 'increment',
|
262
|
+
:large => '--increment increment_id',
|
263
|
+
:format => Integer,
|
264
|
+
:description => 'Use the given increment ID to restore the backup.'\
|
265
|
+
' If not provided the last one will be used'
|
266
|
+
}
|
267
|
+
|
268
|
+
DISK_ID = {
|
269
|
+
:name => 'disk_id',
|
270
|
+
:large => '--disk-id disk_id',
|
271
|
+
:format => Integer,
|
272
|
+
:description => 'Use only selected disk ID'
|
273
|
+
}
|
274
|
+
|
260
275
|
OpenNebulaHelper::TEMPLATE_OPTIONS_VM.delete_if do |v|
|
261
276
|
['as_gid', 'as_uid'].include?(v[:name])
|
262
277
|
end
|
@@ -281,6 +296,10 @@ CommandParser::CmdParser.new(ARGV) do
|
|
281
296
|
OpenNebulaHelper.rname_to_id(arg, 'USER')
|
282
297
|
end
|
283
298
|
|
299
|
+
set :format, :imageid, OpenNebulaHelper.rname_to_id_desc('IMAGE') do |arg|
|
300
|
+
OpenNebulaHelper.rname_to_id(arg, 'IMAGE')
|
301
|
+
end
|
302
|
+
|
284
303
|
set :format,
|
285
304
|
:datastoreid,
|
286
305
|
OpenNebulaHelper.rname_to_id_desc('DATASTORE') do |arg|
|
@@ -720,7 +739,7 @@ CommandParser::CmdParser.new(ARGV) do
|
|
720
739
|
States for success/failure recovers: Any ACTIVE state.
|
721
740
|
States for a retry recover: Any *FAILURE state
|
722
741
|
States for delete: Any
|
723
|
-
States for recreate: Any but DONE
|
742
|
+
States for recreate: Any but DONE
|
724
743
|
States for delete-db: Any
|
725
744
|
EOT
|
726
745
|
|
@@ -1240,6 +1259,10 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1240
1259
|
|
1241
1260
|
if options[:xml]
|
1242
1261
|
puts pool.to_xml
|
1262
|
+
elsif options[:json]
|
1263
|
+
puts JSON.pretty_generate(pool.to_hash)
|
1264
|
+
elsif options[:yaml]
|
1265
|
+
puts pool.to_hash.to_yaml
|
1243
1266
|
else
|
1244
1267
|
table.show(pool.to_hash, options)
|
1245
1268
|
end
|
@@ -1357,15 +1380,15 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1357
1380
|
|
1358
1381
|
The full list of configuration attributes are:
|
1359
1382
|
|
1360
|
-
OS = ["ARCH", "MACHINE", "KERNEL", "INITRD", "BOOTLOADER", "BOOT", "UUID"]
|
1383
|
+
OS = ["ARCH", "MACHINE", "KERNEL", "INITRD", "BOOTLOADER", "BOOT", "KERNEL_CMD", "ROOT", "SD_DISK_BUS", "UUID", "FIRMWARE"]
|
1361
1384
|
FEATURES = ["ACPI", "PAE", "APIC", "LOCALTIME", "HYPERV", "GUEST_AGENT", "VIRTIO_SCSI_QUEUES", "VIRTIO_BLK_QUEUES", "IOTHREADS"]
|
1362
1385
|
INPUT = ["TYPE", "BUS"]
|
1363
|
-
GRAPHICS = ["TYPE", "LISTEN", "PASSWD", "KEYMAP" ]
|
1386
|
+
GRAPHICS = ["TYPE", "LISTEN", "PASSWD", "KEYMAP", "COMMAND"]
|
1364
1387
|
VIDEO = ["TYPE", "IOMMU", "ATS", "VRAM", "RESOLUTION"]
|
1365
1388
|
RAW = ["DATA", "DATA_VMX", "TYPE", "VALIDATE"]
|
1366
1389
|
CPU_MODEL = ["MODEL"]
|
1367
1390
|
BACKUP_CONFIG = ["FS_FREEZE", "KEEP_LAST", "BACKUP_VOLATILE", "MODE", "INCREMENT_MODE"]
|
1368
|
-
CONTEXT (any value, **variable substitution will be made**)
|
1391
|
+
CONTEXT (any value, except ETH*, **variable substitution will be made**)
|
1369
1392
|
EOT
|
1370
1393
|
|
1371
1394
|
command :updateconf, updateconf_desc, :vmid, [:file, nil],
|
@@ -1767,6 +1790,27 @@ CommandParser::CmdParser.new(ARGV) do
|
|
1767
1790
|
end
|
1768
1791
|
end
|
1769
1792
|
|
1793
|
+
restore_desc = <<-EOT.unindent
|
1794
|
+
Restore the Virtual Machine from the backup Image. The VM must be in poweroff state.
|
1795
|
+
EOT
|
1796
|
+
|
1797
|
+
command :restore, restore_desc, :vmid, :imageid, :options => [DISK_ID, INCREMENT] do
|
1798
|
+
helper.perform_action(args[0], options, 'Restoring VM from backup') do |vm|
|
1799
|
+
disk_id = options[:disk_id]
|
1800
|
+
disk_id ||= -1 # All disks by default
|
1801
|
+
|
1802
|
+
inc_id = options[:increment]
|
1803
|
+
inc_id ||= -1 # Last increment by default
|
1804
|
+
|
1805
|
+
rc = vm.restore(args[1], inc_id, disk_id)
|
1806
|
+
|
1807
|
+
if OpenNebula.is_error?(rc)
|
1808
|
+
STDERR.puts "Error restoring: #{rc.message}"
|
1809
|
+
exit(-1)
|
1810
|
+
end
|
1811
|
+
end
|
1812
|
+
end
|
1813
|
+
|
1770
1814
|
# Deprecated commands, remove these commands in release 8.x
|
1771
1815
|
|
1772
1816
|
deprecated_command(:'delete-chart', 'sched-delete')
|
data/bin/onezone
CHANGED
@@ -253,15 +253,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
253
253
|
|
254
254
|
command :serversync, sync_desc, :server, :options => [DATABASE] do
|
255
255
|
begin
|
256
|
-
# Suppress augeas require warning message
|
257
|
-
$VERBOSE = nil
|
258
|
-
|
259
|
-
gem 'augeas', '~> 0.6'
|
260
256
|
require 'augeas'
|
261
257
|
rescue Gem::LoadError
|
262
258
|
STDERR.puts(
|
263
259
|
'Augeas gem is not installed, run `gem install ' \
|
264
|
-
'augeas
|
260
|
+
'opennebula-augeas` to install it'
|
265
261
|
)
|
266
262
|
exit(-1)
|
267
263
|
end
|
@@ -22,7 +22,7 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
22
22
|
|
23
23
|
# This list contains prefixes that should skip adding user home to the path
|
24
24
|
# This must have the same content as the case $FROM in downloader.sh
|
25
|
-
PREFIXES = ['http', 'https', 'ssh', 's3', 'rbd', 'vcenter', 'lxd'
|
25
|
+
PREFIXES = ['http', 'https', 'ssh', 's3', 'rbd', 'vcenter', 'lxd']
|
26
26
|
|
27
27
|
TEMPLATE_OPTIONS=[
|
28
28
|
{
|
@@ -169,8 +169,7 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
169
169
|
:name => 'no_check_capacity',
|
170
170
|
:large => '--no_check_capacity',
|
171
171
|
:description =>
|
172
|
-
'
|
173
|
-
:format => String
|
172
|
+
'Do not check Datastore capacity, only for admins.'
|
174
173
|
}
|
175
174
|
|
176
175
|
FILTERS = [
|
@@ -75,6 +75,10 @@ class OneQuotaHelper
|
|
75
75
|
#-----------------------------------------------------------------------
|
76
76
|
EOT
|
77
77
|
|
78
|
+
def initialize(client = nil)
|
79
|
+
@client=client
|
80
|
+
end
|
81
|
+
|
78
82
|
# Edits the quota template of a resource
|
79
83
|
# @param [XMLElement] resource to get the current info from
|
80
84
|
# @param [String] path to the new contents. If nil a editor will be
|
@@ -207,6 +211,8 @@ class OneQuotaHelper
|
|
207
211
|
|
208
212
|
vm_quotas = [qh['VM_QUOTA']['VM']].flatten
|
209
213
|
|
214
|
+
generic_quotas = get_generic_quotas
|
215
|
+
|
210
216
|
# This initializes the VM quotas for users/groups that don't have any
|
211
217
|
# resource usage yet. It not applied to oneamdin
|
212
218
|
if vm_quotas[0].nil? && resource_id.to_i != 0
|
@@ -228,6 +234,13 @@ class OneQuotaHelper
|
|
228
234
|
"SYSTEM_DISK_SIZE" => limit,
|
229
235
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
230
236
|
}]
|
237
|
+
|
238
|
+
generic_quotas.each do |q|
|
239
|
+
vm_quotas[0][q] = limit
|
240
|
+
vm_quotas[0]["#{q}_USED"] = "0"
|
241
|
+
vm_quotas[0]["RUNNING_#{q}"] = limit
|
242
|
+
vm_quotas[0]["RUNNING_#{q}_USED"] = "0"
|
243
|
+
end
|
231
244
|
end
|
232
245
|
|
233
246
|
if !vm_quotas[0].nil?
|
@@ -378,6 +391,55 @@ class OneQuotaHelper
|
|
378
391
|
puts
|
379
392
|
end
|
380
393
|
|
394
|
+
if !generic_quotas.empty? && !vm_quotas[0].nil?
|
395
|
+
CLIHelper.print_header(str_h1 % "VMS GENERIC QUOTAS",false)
|
396
|
+
size = [80 / generic_quotas.length - 1, 18].min
|
397
|
+
|
398
|
+
CLIHelper::ShowTable.new(nil, self) do
|
399
|
+
generic_quotas.each do |elem|
|
400
|
+
column elem.to_sym, "", :right, :size=>size do |d|
|
401
|
+
if !d.nil?
|
402
|
+
limit = d[elem]
|
403
|
+
limit = helper.get_default_limit(
|
404
|
+
limit, "VM_QUOTA/VM/#{elem}")
|
405
|
+
|
406
|
+
if limit == LIMIT_UNLIMITED
|
407
|
+
"%6s / -" % [d["#{elem}_USED"]]
|
408
|
+
else
|
409
|
+
"%6s / %6s" % [d["#{elem}_USED"], limit]
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end.show(vm_quotas, {})
|
415
|
+
|
416
|
+
puts
|
417
|
+
|
418
|
+
CLIHelper.print_header(str_h1 % "VMS GENERIC RUNNING QUOTAS",false)
|
419
|
+
size = [80 / generic_quotas.length - 1, 18].min
|
420
|
+
|
421
|
+
CLIHelper::ShowTable.new(nil, self) do
|
422
|
+
generic_quotas.each do |q|
|
423
|
+
elem = "RUNNING_#{q}"
|
424
|
+
column elem.to_sym, "", :right, :size=>size do |d|
|
425
|
+
if !d.nil?
|
426
|
+
limit = d[elem]
|
427
|
+
limit = helper.get_default_limit(
|
428
|
+
limit, "VM_QUOTA/VM/#{elem}")
|
429
|
+
|
430
|
+
if limit == LIMIT_UNLIMITED
|
431
|
+
"%6s / -" % [d["#{elem}_USED"]]
|
432
|
+
else
|
433
|
+
"%6s / %6s" % [d["#{elem}_USED"], limit]
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end.show(vm_quotas, {})
|
439
|
+
|
440
|
+
puts
|
441
|
+
end
|
442
|
+
|
381
443
|
CLIHelper.print_header(str_h1 % "DATASTORE USAGE & QUOTAS",false)
|
382
444
|
|
383
445
|
puts
|
@@ -503,4 +565,17 @@ class OneQuotaHelper
|
|
503
565
|
|
504
566
|
return limit
|
505
567
|
end
|
568
|
+
|
569
|
+
private
|
570
|
+
|
571
|
+
def get_generic_quotas
|
572
|
+
conf = OpenNebula::System.new(@client).get_configuration
|
573
|
+
|
574
|
+
return [] if OpenNebula.is_error?(conf)
|
575
|
+
|
576
|
+
conf.retrieve_elements('/OPENNEBULA_CONFIGURATION/QUOTA_VM_ATTRIBUTE') || []
|
577
|
+
rescue StandardError
|
578
|
+
[]
|
579
|
+
end
|
580
|
+
|
506
581
|
end
|
@@ -160,7 +160,8 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
160
160
|
SEARCH = {
|
161
161
|
:name => 'search',
|
162
162
|
:large => '--search search',
|
163
|
-
:description => '
|
163
|
+
:description => 'Query in PATH=VALUE format. For example: ' \
|
164
|
+
'onevm list --search "VM.NAME=abc&VM.TEMPLATE.DISK[*].IMAGE=db1"',
|
164
165
|
:format => String
|
165
166
|
}
|
166
167
|
|
@@ -135,7 +135,7 @@ class Replicator
|
|
135
135
|
def fetch_db_config(configs)
|
136
136
|
configs.store(:backend, configs[:raw]['/OPENNEBULA_CONFIGURATION/DB/BACKEND'])
|
137
137
|
|
138
|
-
if configs[:backend] == 'mysql'
|
138
|
+
if configs[:backend] == 'mysql'
|
139
139
|
configs.store(:server, configs[:raw]['/OPENNEBULA_CONFIGURATION/DB/SERVER'])
|
140
140
|
configs.store(:user, configs[:raw]['/OPENNEBULA_CONFIGURATION/DB/USER'])
|
141
141
|
configs.store(:password, configs[:raw]['/OPENNEBULA_CONFIGURATION/DB/PASSWD'])
|
@@ -143,7 +143,7 @@ class Replicator
|
|
143
143
|
configs.store(:port, configs[:raw]['/OPENNEBULA_CONFIGURATION/DB/PORT'])
|
144
144
|
configs[:port] = '3306' if configs[:port] == '0'
|
145
145
|
else
|
146
|
-
STDERR.puts 'No mysql
|
146
|
+
STDERR.puts 'No mysql backend configuration found'
|
147
147
|
exit(-1)
|
148
148
|
end
|
149
149
|
end
|
data/lib/one_helper.rb
CHANGED
@@ -379,7 +379,7 @@ Bash symbols must be escaped on STDIN passing'
|
|
379
379
|
:name => 'context',
|
380
380
|
:large => '--context line1,line2,line3',
|
381
381
|
:format => Array,
|
382
|
-
:description => '
|
382
|
+
:description => 'Replaces the context section with the specified lines'
|
383
383
|
},
|
384
384
|
{
|
385
385
|
:name => 'boot',
|
@@ -1078,12 +1078,12 @@ Bash symbols must be escaped on STDIN passing'
|
|
1078
1078
|
elsif options[:xml]
|
1079
1079
|
return list_pool_xml(pool, options, filter_flag)
|
1080
1080
|
elsif options[:json]
|
1081
|
-
list_pool_format(pool, options, filter_flag) do |pool|
|
1081
|
+
return list_pool_format(pool, options, filter_flag) do |pool|
|
1082
1082
|
hash = check_resource_xsd(pool, pname)
|
1083
1083
|
puts ::JSON.pretty_generate(hash)
|
1084
1084
|
end
|
1085
1085
|
elsif options[:yaml]
|
1086
|
-
list_pool_format(pool, options, filter_flag) do |pool|
|
1086
|
+
return list_pool_format(pool, options, filter_flag) do |pool|
|
1087
1087
|
hash = check_resource_xsd(pool, pname)
|
1088
1088
|
puts hash.to_yaml(:indent => 4)
|
1089
1089
|
end
|
data/share/schemas/xsd/host.xsd
CHANGED
@@ -42,12 +42,25 @@
|
|
42
42
|
<xs:element name="VMS_THREAD" type="xs:integer"/>
|
43
43
|
<xs:element name="DATASTORES">
|
44
44
|
<xs:complexType>
|
45
|
-
<xs:
|
45
|
+
<xs:sequence>
|
46
46
|
<xs:element name="DISK_USAGE" type="xs:integer"/>
|
47
|
+
<xs:element name="DS" minOccurs="0" maxOccurs="unbounded">
|
48
|
+
<xs:complexType>
|
49
|
+
<xs:sequence>
|
50
|
+
<xs:element name="FREE_MB" type="xs:integer"/>
|
51
|
+
<xs:element name="ID" type="xs:integer"/>
|
52
|
+
<xs:element name="TOTAL_MB" type="xs:integer"/>
|
53
|
+
<xs:element name="USED_MB" type="xs:integer"/>
|
54
|
+
<xs:element name="REPLICA_CACHE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
55
|
+
<xs:element name="REPLICA_CACHE_SIZE" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
56
|
+
<xs:element name="REPLICA_IMAGES" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
57
|
+
</xs:sequence>
|
58
|
+
</xs:complexType>
|
59
|
+
</xs:element>
|
47
60
|
<xs:element name="FREE_DISK" type="xs:integer"/>
|
48
61
|
<xs:element name="MAX_DISK" type="xs:integer"/>
|
49
62
|
<xs:element name="USED_DISK" type="xs:integer"/>
|
50
|
-
</xs:
|
63
|
+
</xs:sequence>
|
51
64
|
</xs:complexType>
|
52
65
|
</xs:element>
|
53
66
|
<xs:element name="PCI_DEVICES">
|
data/share/schemas/xsd/image.xsd
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://opennebula.org/XMLSchema" elementFormDefault="qualified" targetNamespace="http://opennebula.org/XMLSchema">
|
3
|
+
<xs:include schemaLocation="shared.xsd"/>
|
3
4
|
<xs:element name="IMAGE">
|
4
5
|
<xs:complexType>
|
5
6
|
<xs:sequence>
|
@@ -65,27 +66,9 @@
|
|
65
66
|
<xs:element name="TARGET_SNAPSHOT" type="xs:integer"/>
|
66
67
|
<xs:element name="DATASTORE_ID" type="xs:integer"/>
|
67
68
|
<xs:element name="DATASTORE" type="xs:string"/>
|
68
|
-
<xs:element name="VMS"
|
69
|
-
|
70
|
-
|
71
|
-
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
72
|
-
</xs:sequence>
|
73
|
-
</xs:complexType>
|
74
|
-
</xs:element>
|
75
|
-
<xs:element name="CLONES">
|
76
|
-
<xs:complexType>
|
77
|
-
<xs:sequence>
|
78
|
-
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
79
|
-
</xs:sequence>
|
80
|
-
</xs:complexType>
|
81
|
-
</xs:element>
|
82
|
-
<xs:element name="APP_CLONES">
|
83
|
-
<xs:complexType>
|
84
|
-
<xs:sequence>
|
85
|
-
<xs:element name="ID" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
86
|
-
</xs:sequence>
|
87
|
-
</xs:complexType>
|
88
|
-
</xs:element>
|
69
|
+
<xs:element name="VMS" type="IDS"/>
|
70
|
+
<xs:element name="CLONES" type="IDS"/>
|
71
|
+
<xs:element name="APP_CLONES" type="IDS"/>
|
89
72
|
<xs:element name="TEMPLATE">
|
90
73
|
<xs:complexType>
|
91
74
|
<xs:sequence>
|
@@ -135,6 +118,7 @@
|
|
135
118
|
</xs:sequence>
|
136
119
|
</xs:complexType>
|
137
120
|
</xs:element>
|
121
|
+
<xs:element name="BACKUP_DISK_IDS" type="IDS" minOccurs="0" maxOccurs="1"/>
|
138
122
|
</xs:sequence>
|
139
123
|
</xs:complexType>
|
140
124
|
</xs:element>
|
@@ -50,7 +50,6 @@
|
|
50
50
|
<xs:element name="BACKEND" minOccurs="0" maxOccurs="1" >
|
51
51
|
<xs:simpleType>
|
52
52
|
<xs:restriction base="xs:string">
|
53
|
-
<xs:enumeration value="postgresql"/>
|
54
53
|
<xs:enumeration value="mysql"/>
|
55
54
|
<xs:enumeration value="sqlite"/>
|
56
55
|
</xs:restriction>
|
@@ -250,7 +249,6 @@
|
|
250
249
|
<xs:element name="MAX_CONN_BACKLOG" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
251
250
|
<xs:element name="MESSAGE_SIZE" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
252
251
|
<xs:element name="MONITORING_INTERVAL_DATASTORE" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
253
|
-
<xs:element name="MONITORING_INTERVAL_DB_UPDATE" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
254
252
|
<xs:element name="MONITORING_INTERVAL_HOST" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
255
253
|
<xs:element name="MONITORING_INTERVAL_MARKET" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
256
254
|
<xs:element name="MONITORING_INTERVAL_VM" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
|
3
|
-
|
2
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://opennebula.org/XMLSchema"
|
3
|
+
xmlns="http://opennebula.org/XMLSchema">
|
4
4
|
<xs:element name="VM_POOL">
|
5
5
|
<xs:complexType>
|
6
6
|
<xs:sequence>
|
@@ -60,6 +60,28 @@
|
|
60
60
|
<xs:element name="USER_TEMPLATE">
|
61
61
|
<xs:complexType>
|
62
62
|
<xs:sequence>
|
63
|
+
<xs:element name="LABELS" type="xs:string" minOccurs="0"/>
|
64
|
+
<xs:element name="ERROR" type="xs:string" minOccurs="0"/>
|
65
|
+
<xs:element name="SCHED_MESSAGE" type="xs:string" minOccurs="0"/>
|
66
|
+
<xs:element name="SCHED_RANK" type="xs:string" minOccurs="0"/>
|
67
|
+
<xs:element name="SCHED_DS_RANK" type="xs:string" minOccurs="0"/>
|
68
|
+
<xs:element name="SCHED_REQUIREMENTS" type="xs:string" minOccurs="0"/>
|
69
|
+
<xs:element name="SCHED_DS_REQUIREMENTS" type="xs:string" minOccurs="0"/>
|
70
|
+
<xs:element name="USER_PRIORITY" type="xs:string" minOccurs="0"/>
|
71
|
+
<xs:element name="PUBLIC_CLOUD" minOccurs="0" maxOccurs="unbounded">
|
72
|
+
<xs:complexType>
|
73
|
+
<xs:sequence>
|
74
|
+
<xs:any processContents="skip"/>
|
75
|
+
</xs:sequence>
|
76
|
+
</xs:complexType>
|
77
|
+
</xs:element>
|
78
|
+
<xs:element name="SCHED_ACTION" minOccurs="0" maxOccurs="unbounded">
|
79
|
+
<xs:complexType>
|
80
|
+
<xs:sequence>
|
81
|
+
<xs:any processContents="skip"/>
|
82
|
+
</xs:sequence>
|
83
|
+
</xs:complexType>
|
84
|
+
</xs:element>
|
63
85
|
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
|
64
86
|
</xs:sequence>
|
65
87
|
</xs:complexType>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opennebula-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.9.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: 2024-
|
11
|
+
date: 2024-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opennebula
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.
|
19
|
+
version: 6.9.80.pre
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.
|
26
|
+
version: 6.9.80.pre
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -41,33 +41,33 @@ dependencies:
|
|
41
41
|
description: Commands used to talk to OpenNebula
|
42
42
|
email: contact@opennebula.io
|
43
43
|
executables:
|
44
|
-
-
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
-
|
44
|
+
- oneacct
|
45
|
+
- oneacl
|
46
|
+
- onebackupjob
|
47
|
+
- onecluster
|
48
|
+
- onedatastore
|
49
|
+
- oneflow
|
50
|
+
- oneflow-template
|
49
51
|
- onegroup
|
50
52
|
- onehook
|
51
|
-
-
|
52
|
-
-
|
53
|
+
- onehost
|
54
|
+
- oneimage
|
53
55
|
- oneirb
|
54
|
-
- oneflow-template
|
55
|
-
- onevrouter
|
56
|
-
- oneshowback
|
57
|
-
- oneuser
|
58
|
-
- oneacct
|
59
|
-
- onesecgroup
|
60
|
-
- onecluster
|
61
56
|
- onelog
|
57
|
+
- onemarket
|
62
58
|
- onemarketapp
|
59
|
+
- onesecgroup
|
60
|
+
- oneshowback
|
63
61
|
- onetemplate
|
64
|
-
-
|
65
|
-
-
|
66
|
-
-
|
67
|
-
- oneflow
|
68
|
-
- onedatastore
|
69
|
-
- onebackupjob
|
62
|
+
- oneuser
|
63
|
+
- onevcenter
|
64
|
+
- onevdc
|
70
65
|
- onevm
|
66
|
+
- onevmgroup
|
67
|
+
- onevnet
|
68
|
+
- onevntemplate
|
69
|
+
- onevrouter
|
70
|
+
- onezone
|
71
71
|
extensions: []
|
72
72
|
extra_rdoc_files: []
|
73
73
|
files:
|
@@ -195,11 +195,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
195
|
version: '0'
|
196
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
197
|
requirements:
|
198
|
-
- - "
|
198
|
+
- - ">"
|
199
199
|
- !ruby/object:Gem::Version
|
200
|
-
version:
|
200
|
+
version: 1.3.1
|
201
201
|
requirements: []
|
202
|
-
rubygems_version: 3.
|
202
|
+
rubygems_version: 3.3.5
|
203
203
|
signing_key:
|
204
204
|
specification_version: 4
|
205
205
|
summary: OpenNebula Command Line Interface
|