opennebula-cli 6.8.2 → 6.9.80.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|