opennebula-cli 5.6.0 → 5.6.1
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/onevcenter +28 -2
- data/bin/onezone +14 -2
- data/lib/cli_helper.rb +18 -5
- data/lib/command_parser.rb +5 -2
- data/lib/one_helper.rb +240 -30
- data/lib/one_helper/onegroup_helper.rb +36 -18
- data/lib/one_helper/onehost_helper.rb +3 -0
- data/lib/one_helper/onequota_helper.rb +104 -11
- data/lib/one_helper/oneuser_helper.rb +36 -18
- data/lib/one_helper/onevcenter_helper.rb +2 -0
- data/lib/one_helper/onezone_helper.rb +19 -16
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7898ac99cecd152ea743a52a93477038ee82ba80
|
4
|
+
data.tar.gz: 51743bf968d7d071faf589feaf5ebab16fef8b39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c7d8725c0fd499f613584bd1b04985049196a6d132bde5257c861f3e3166808849f9be4de8323a5be7f094756373b307691ed1159a787708679070026b442da
|
7
|
+
data.tar.gz: 747442104db1ef7dfbfd0c8adf19f9a9deab687fec3f9fe5c09f16f24dbad18a563c74b3199e5f0c7127dbd0025f72bb82e07b05ada3fb3b90d7754a183662b6
|
data/bin/onevcenter
CHANGED
@@ -51,7 +51,7 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
51
51
|
:short => "-o object",
|
52
52
|
:large => "--object object ",
|
53
53
|
:format => String,
|
54
|
-
:description => "vCenter object"
|
54
|
+
:description => "vCenter object: [datastores, templates, networks, datastores, images]"
|
55
55
|
}
|
56
56
|
|
57
57
|
HOST = {
|
@@ -128,8 +128,16 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
128
128
|
############################################################################
|
129
129
|
list_desc = <<-EOT.unindent
|
130
130
|
Show a list with unimported vCenter objects
|
131
|
-
EOT
|
132
131
|
|
132
|
+
Examples:
|
133
|
+
- listing available templates:
|
134
|
+
|
135
|
+
onevcenter list -o templates -h <host_id>
|
136
|
+
|
137
|
+
- listing available images:
|
138
|
+
|
139
|
+
onevcenter list -o datastores -h <host_id> -d <ds-img_id>
|
140
|
+
EOT
|
133
141
|
command :list, list_desc, :options=>[ OBJECT, HOST, DATASTORE, VCENTER, USER, PASS ] do
|
134
142
|
begin
|
135
143
|
args = helper.parse_opts(options)
|
@@ -148,6 +156,19 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
148
156
|
|
149
157
|
import_desc = <<-EOT.unindent
|
150
158
|
Import the the desired vCenter object
|
159
|
+
|
160
|
+
Examples:
|
161
|
+
- importing first datastore
|
162
|
+
|
163
|
+
onevcenter list -o templates -h <host_id>
|
164
|
+
|
165
|
+
- importing 2 concrete templates:
|
166
|
+
|
167
|
+
onevcenter import "vm-1252, vm-553, vm-1248" -o templates -h <host_id>
|
168
|
+
|
169
|
+
- importing a image range:
|
170
|
+
|
171
|
+
onevcenter import 0..10 -o images -h <host_id> -d <ds-img_id>
|
151
172
|
EOT
|
152
173
|
|
153
174
|
command :import, import_desc, [:oid, nil], :options=>[ OBJECT, HOST, DATASTORE ] do
|
@@ -194,6 +215,11 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
194
215
|
############################################################################
|
195
216
|
host_desc = <<-EOT.unindent
|
196
217
|
Import vCenter clusters as OpenNebula hosts
|
218
|
+
|
219
|
+
Example:
|
220
|
+
- Get available clusters:
|
221
|
+
|
222
|
+
onevcenter hosts --vcenter <vcenter> --vuser <vcenter_user> --vpass <password>
|
197
223
|
EOT
|
198
224
|
command :hosts, host_desc, :options=>[ VCENTER, USER, PASS, USE_DEFAULTS ] do
|
199
225
|
con_ops = helper.connection_options("Hosts", options)
|
data/bin/onezone
CHANGED
@@ -36,6 +36,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
36
36
|
|
37
37
|
helper = OneZoneHelper.new
|
38
38
|
|
39
|
+
ENDPOINT = {
|
40
|
+
:name => "keep",
|
41
|
+
:short => "-k",
|
42
|
+
:large => "--keep",
|
43
|
+
:description => "Don't overwrite endpoint file located in home folder, use it as a temporary zone.",
|
44
|
+
:format => String
|
45
|
+
}
|
46
|
+
|
39
47
|
before_proc do
|
40
48
|
helper.set_client(options)
|
41
49
|
end
|
@@ -191,7 +199,11 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
|
191
199
|
Set shell session access point for the CLI to the given Zone
|
192
200
|
EOT
|
193
201
|
|
194
|
-
command :set, set_desc,:zoneid do
|
195
|
-
|
202
|
+
command :set, set_desc,:zoneid, :options=>ENDPOINT do
|
203
|
+
if options.has_key? :keep
|
204
|
+
helper.set_zone(args[0], true)
|
205
|
+
else
|
206
|
+
helper.set_zone(args[0], false)
|
207
|
+
end
|
196
208
|
end
|
197
209
|
end
|
data/lib/cli_helper.rb
CHANGED
@@ -132,16 +132,21 @@ module CLIHelper
|
|
132
132
|
# Print header
|
133
133
|
def CLIHelper.print_header(str, underline=true)
|
134
134
|
if $stdout.tty?
|
135
|
-
|
136
|
-
scr_underline if underline
|
137
|
-
print str
|
138
|
-
scr_restore
|
135
|
+
print_tty_header(str, underline)
|
139
136
|
else
|
140
137
|
print str
|
141
138
|
end
|
142
139
|
puts
|
143
140
|
end
|
144
141
|
|
142
|
+
# Pretty print header
|
143
|
+
def CLIHelper.print_tty_header(str, underline=true)
|
144
|
+
scr_bold
|
145
|
+
scr_underline if underline
|
146
|
+
print str
|
147
|
+
scr_restore
|
148
|
+
end
|
149
|
+
|
145
150
|
module HashWithSearch
|
146
151
|
def dsearch(path)
|
147
152
|
stems=path.split('/')
|
@@ -256,10 +261,18 @@ module CLIHelper
|
|
256
261
|
end
|
257
262
|
end
|
258
263
|
|
264
|
+
def print_tty_header
|
265
|
+
CLIHelper.print_tty_header(header_str)
|
266
|
+
puts
|
267
|
+
end
|
268
|
+
|
259
269
|
private
|
260
270
|
|
261
271
|
def print_table(data, options)
|
262
|
-
|
272
|
+
if !options[:csv] && !options[:noheader]
|
273
|
+
CLIHelper.print_header(header_str)
|
274
|
+
end
|
275
|
+
|
263
276
|
data ? print_data(data, options) : puts
|
264
277
|
end
|
265
278
|
|
data/lib/command_parser.rb
CHANGED
@@ -575,8 +575,11 @@ module CommandParser
|
|
575
575
|
}
|
576
576
|
|
577
577
|
unless argument
|
578
|
-
|
579
|
-
|
578
|
+
if error_msg
|
579
|
+
puts error_msg
|
580
|
+
else
|
581
|
+
puts "command #{name}: argument #{id} must be one of #{format.join(', ')}"
|
582
|
+
end
|
580
583
|
exit -1
|
581
584
|
end
|
582
585
|
|
data/lib/one_helper.rb
CHANGED
@@ -16,6 +16,9 @@
|
|
16
16
|
|
17
17
|
require 'cli_helper'
|
18
18
|
|
19
|
+
require 'open3'
|
20
|
+
require 'io/console'
|
21
|
+
|
19
22
|
begin
|
20
23
|
require 'opennebula'
|
21
24
|
rescue Exception => e
|
@@ -505,51 +508,255 @@ EOT
|
|
505
508
|
end
|
506
509
|
end
|
507
510
|
|
511
|
+
#-----------------------------------------------------------------------
|
512
|
+
# List pool functions
|
513
|
+
#-----------------------------------------------------------------------
|
514
|
+
def start_pager
|
515
|
+
pager = ENV['ONE_PAGER'] || 'less'
|
508
516
|
|
509
|
-
|
510
|
-
|
511
|
-
table = format_pool(options)
|
517
|
+
# Start pager, defaults to less
|
518
|
+
p_r, p_w = IO.pipe
|
512
519
|
|
513
|
-
|
514
|
-
|
520
|
+
lpid = fork do
|
521
|
+
$stdin.reopen(p_r)
|
522
|
+
|
523
|
+
p_r.close
|
524
|
+
p_w.close
|
525
|
+
|
526
|
+
Kernel.select [$stdin]
|
527
|
+
|
528
|
+
exec([pager, pager])
|
515
529
|
end
|
530
|
+
|
531
|
+
# Send listing to pager pipe
|
532
|
+
$stdout.close
|
533
|
+
$stdout = p_w.dup
|
516
534
|
|
517
|
-
|
535
|
+
p_w.close
|
536
|
+
p_r.close
|
537
|
+
|
538
|
+
return lpid
|
539
|
+
end
|
518
540
|
|
519
|
-
|
541
|
+
def stop_pager(lpid)
|
542
|
+
$stdout.close
|
543
|
+
|
544
|
+
begin
|
545
|
+
Process.wait(lpid)
|
546
|
+
rescue Errno::ECHILD
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
def print_page(pool, options)
|
551
|
+
page = nil
|
520
552
|
|
521
553
|
if options[:xml]
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
554
|
+
elements = 0
|
555
|
+
page = ""
|
556
|
+
|
557
|
+
pool.each {|e|
|
558
|
+
elements += 1
|
559
|
+
page << e.to_xml(true) << "\n"
|
560
|
+
}
|
526
561
|
else
|
527
|
-
|
562
|
+
|
563
|
+
pname = pool.pool_name
|
564
|
+
ename = pool.element_name
|
528
565
|
|
529
|
-
|
530
|
-
|
531
|
-
array=pool.get_hash
|
532
|
-
return -1, array.message if OpenNebula.is_error?(array)
|
566
|
+
page = pool.to_hash
|
567
|
+
elems = page["#{pname}"]["#{ename}"]
|
533
568
|
|
534
|
-
|
535
|
-
|
569
|
+
if elems.class == Array
|
570
|
+
elements = elems.length
|
536
571
|
else
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
572
|
+
elements = 1
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
return elements, page
|
577
|
+
end
|
578
|
+
|
579
|
+
#-----------------------------------------------------------------------
|
580
|
+
# List the pool in table form, it uses pagination for interactive
|
581
|
+
# output
|
582
|
+
#-----------------------------------------------------------------------
|
583
|
+
def list_pool_table(table, pool, options, filter_flag)
|
584
|
+
if $stdout.isatty
|
585
|
+
size = $stdout.winsize[0] - 1
|
586
|
+
|
587
|
+
# ----------- First page, check if pager is needed -------------
|
588
|
+
rc = pool.get_page(size, 0)
|
589
|
+
ps = ""
|
590
|
+
|
591
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
592
|
+
|
593
|
+
elements, hash = print_page(pool, options)
|
594
|
+
|
595
|
+
ppid = -1
|
596
|
+
|
597
|
+
if elements >= size
|
598
|
+
ppid = start_pager
|
599
|
+
end
|
600
|
+
|
601
|
+
table.show(hash, options)
|
602
|
+
|
603
|
+
if elements < size
|
604
|
+
return 0
|
605
|
+
elsif !pool.is_paginated?
|
606
|
+
stop_pager(ppid)
|
607
|
+
return 0
|
608
|
+
end
|
609
|
+
|
610
|
+
# ------- Rest of the pages in the pool, piped to pager --------
|
611
|
+
current = size
|
612
|
+
|
613
|
+
options[:noheader] = true
|
614
|
+
|
615
|
+
loop do
|
616
|
+
rc = pool.get_page(size, current)
|
617
|
+
|
618
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
619
|
+
|
620
|
+
current += size
|
621
|
+
|
622
|
+
begin
|
623
|
+
Process.waitpid(ppid, Process::WNOHANG)
|
624
|
+
rescue Errno::ECHILD
|
625
|
+
break
|
546
626
|
end
|
547
627
|
|
548
|
-
|
628
|
+
elements, hash = print_page(pool, options)
|
629
|
+
|
630
|
+
table.show(hash, options)
|
631
|
+
|
632
|
+
$stdout.flush
|
633
|
+
|
634
|
+
break if elements < size
|
635
|
+
end
|
636
|
+
|
637
|
+
stop_pager(ppid)
|
638
|
+
else
|
639
|
+
array = pool.get_hash
|
640
|
+
return -1, array.message if OpenNebula.is_error?(array)
|
641
|
+
|
642
|
+
rname = self.class.rname
|
643
|
+
elements = array["#{rname}_POOL"][rname]
|
644
|
+
|
645
|
+
if options[:ids] && elements
|
646
|
+
elements.reject! do |element|
|
647
|
+
!options[:ids].include?(element['ID'].to_i)
|
648
|
+
end
|
649
|
+
end
|
650
|
+
|
651
|
+
table.show(array, options)
|
652
|
+
end
|
653
|
+
|
654
|
+
return 0
|
655
|
+
end
|
656
|
+
|
657
|
+
#-----------------------------------------------------------------------
|
658
|
+
# List pool in XML format, pagination is used in interactive output
|
659
|
+
#-----------------------------------------------------------------------
|
660
|
+
def list_pool_xml(pool, options, filter_flag)
|
661
|
+
if $stdout.isatty
|
662
|
+
size = $stdout.winsize[0] - 1
|
663
|
+
|
664
|
+
# ----------- First page, check if pager is needed -------------
|
665
|
+
rc = pool.get_page(size, 0)
|
666
|
+
ps = ""
|
667
|
+
|
668
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
669
|
+
|
670
|
+
pname = pool.pool_name
|
671
|
+
|
672
|
+
elements, page = print_page(pool, options)
|
673
|
+
|
674
|
+
ppid = -1
|
675
|
+
|
676
|
+
if elements >= size
|
677
|
+
ppid = start_pager
|
678
|
+
end
|
679
|
+
|
680
|
+
puts "<#{pname}>"
|
681
|
+
|
682
|
+
puts page
|
683
|
+
|
684
|
+
if elements < size
|
685
|
+
puts "</#{pname}>"
|
686
|
+
return 0
|
549
687
|
end
|
550
688
|
|
689
|
+
# ------- Rest of the pages in the pool, piped to pager --------
|
690
|
+
current = size
|
691
|
+
|
692
|
+
loop do
|
693
|
+
rc = pool.get_page(size, current)
|
694
|
+
|
695
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
696
|
+
|
697
|
+
current += size
|
698
|
+
|
699
|
+
elements, page = print_page(pool, options)
|
700
|
+
|
701
|
+
puts page
|
702
|
+
|
703
|
+
$stdout.flush
|
704
|
+
|
705
|
+
break if elements < size
|
706
|
+
end
|
707
|
+
|
708
|
+
puts "</#{pname}>"
|
709
|
+
|
710
|
+
stop_pager(ppid)
|
711
|
+
else
|
712
|
+
rc = pool.info
|
713
|
+
|
714
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
715
|
+
|
716
|
+
puts pool.to_xml(true)
|
717
|
+
end
|
718
|
+
|
719
|
+
return 0
|
720
|
+
end
|
721
|
+
|
722
|
+
#-----------------------------------------------------------------------
|
723
|
+
# List pool table in top-like form
|
724
|
+
#-----------------------------------------------------------------------
|
725
|
+
def list_pool_top(table, pool, options)
|
726
|
+
table.top(options) {
|
727
|
+
array = pool.get_hash
|
728
|
+
|
729
|
+
return -1, array.message if OpenNebula.is_error?(array)
|
730
|
+
|
731
|
+
array
|
732
|
+
}
|
733
|
+
|
734
|
+
return 0
|
735
|
+
end
|
736
|
+
|
737
|
+
|
738
|
+
def list_pool(options, top=false, filter_flag=nil)
|
739
|
+
table = format_pool(options)
|
740
|
+
|
741
|
+
if options[:describe]
|
742
|
+
table.describe_columns
|
743
|
+
|
551
744
|
return 0
|
552
745
|
end
|
746
|
+
|
747
|
+
filter_flag ||= OpenNebula::Pool::INFO_ALL
|
748
|
+
|
749
|
+
pool = factory_pool(filter_flag)
|
750
|
+
|
751
|
+
if top
|
752
|
+
return list_pool_top(table, pool, options)
|
753
|
+
elsif options[:xml]
|
754
|
+
return list_pool_xml(pool, options, filter_flag)
|
755
|
+
else
|
756
|
+
return list_pool_table(table, pool, options, filter_flag)
|
757
|
+
end
|
758
|
+
|
759
|
+
return 0
|
553
760
|
end
|
554
761
|
|
555
762
|
def show_resource(id, options)
|
@@ -834,8 +1041,11 @@ EOT
|
|
834
1041
|
end
|
835
1042
|
end
|
836
1043
|
|
837
|
-
def OpenNebulaHelper.time_to_str(time, print_seconds=true,
|
838
|
-
|
1044
|
+
def OpenNebulaHelper.time_to_str(time, print_seconds=true,
|
1045
|
+
print_hours=true, print_years=false)
|
1046
|
+
|
1047
|
+
value = time.to_i
|
1048
|
+
|
839
1049
|
if value==0
|
840
1050
|
value='-'
|
841
1051
|
else
|
@@ -111,12 +111,18 @@ class OneGroupHelper < OpenNebulaHelper::OneHelper
|
|
111
111
|
|
112
112
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
113
113
|
q['VM_QUOTA']['VM'] = {
|
114
|
-
"VMS"
|
115
|
-
"VMS_USED"
|
116
|
-
"CPU"
|
117
|
-
"CPU_USED"
|
118
|
-
"MEMORY"
|
119
|
-
"MEMORY_USED"
|
114
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
115
|
+
"VMS_USED" => "0",
|
116
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
117
|
+
"CPU_USED" => "0",
|
118
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
119
|
+
"MEMORY_USED" => "0",
|
120
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
121
|
+
"RUNNING_VMS_USED" => "0",
|
122
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
123
|
+
"RUNNING_CPU_USED" => "0",
|
124
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
125
|
+
"RUNNING_MEMORY_USED" => "0",
|
120
126
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
121
127
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
122
128
|
}
|
@@ -148,12 +154,18 @@ class OneGroupHelper < OpenNebulaHelper::OneHelper
|
|
148
154
|
|
149
155
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
150
156
|
q['VM_QUOTA']['VM'] = {
|
151
|
-
"VMS"
|
152
|
-
"VMS_USED"
|
153
|
-
"CPU"
|
154
|
-
"CPU_USED"
|
155
|
-
"MEMORY"
|
156
|
-
"MEMORY_USED"
|
157
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
158
|
+
"VMS_USED" => "0",
|
159
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
160
|
+
"CPU_USED" => "0",
|
161
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
162
|
+
"MEMORY_USED" => "0",
|
163
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
164
|
+
"RUNNING_VMS_USED" => "0",
|
165
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
166
|
+
"RUNNING_CPU_USED" => "0",
|
167
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
168
|
+
"RUNNING_MEMORY_USED" => "0",
|
157
169
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
158
170
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
159
171
|
}
|
@@ -188,12 +200,18 @@ class OneGroupHelper < OpenNebulaHelper::OneHelper
|
|
188
200
|
|
189
201
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
190
202
|
q['VM_QUOTA']['VM'] = {
|
191
|
-
"VMS"
|
192
|
-
"VMS_USED"
|
193
|
-
"CPU"
|
194
|
-
"CPU_USED"
|
195
|
-
"MEMORY"
|
196
|
-
"MEMORY_USED"
|
203
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
204
|
+
"VMS_USED" => "0",
|
205
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
206
|
+
"CPU_USED" => "0",
|
207
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
208
|
+
"MEMORY_USED" => "0",
|
209
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
210
|
+
"RUNNING_VMS_USED" => "0",
|
211
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
212
|
+
"RUNNING_CPU_USED" => "0",
|
213
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
214
|
+
"RUNNING_MEMORY_USED" => "0",
|
197
215
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
198
216
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
199
217
|
}
|
@@ -296,6 +296,9 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
296
296
|
# Skip this host from remote syncing if it's OFFLINE
|
297
297
|
next if Host::HOST_STATES[state.to_i] == 'OFFLINE'
|
298
298
|
|
299
|
+
# Skip this host if it is a vCenter cluster
|
300
|
+
next if vm_mad == "vcenter"
|
301
|
+
|
299
302
|
host_version=host['TEMPLATE/VERSION']
|
300
303
|
|
301
304
|
begin
|
@@ -35,8 +35,11 @@ class OneQuotaHelper
|
|
35
35
|
#
|
36
36
|
# VM = [
|
37
37
|
# VMS = <Max. number of VMs>
|
38
|
+
# RUNNING_VMS = <Max. number of running VMs>
|
38
39
|
# MEMORY = <Max. allocated memory (MB)>
|
40
|
+
# RUNNING_MEMORY = <Max. running memory (MB)>
|
39
41
|
# CPU = <Max. allocated CPU>
|
42
|
+
# RUNNING_CPU = <Max. running CPU>
|
40
43
|
# SYSTEM_DISK_SIZE = <Max. allocated system disk (MB)>
|
41
44
|
# ]
|
42
45
|
#
|
@@ -196,7 +199,7 @@ class OneQuotaHelper
|
|
196
199
|
|
197
200
|
puts
|
198
201
|
|
199
|
-
CLIHelper.print_header(str_h1 % "
|
202
|
+
CLIHelper.print_header(str_h1 % "VMS USAGE & QUOTAS",false)
|
200
203
|
|
201
204
|
puts
|
202
205
|
|
@@ -210,12 +213,18 @@ class OneQuotaHelper
|
|
210
213
|
limit = LIMIT_DEFAULT
|
211
214
|
|
212
215
|
vm_quotas = [{
|
213
|
-
"VMS"
|
214
|
-
"VMS_USED"
|
215
|
-
"CPU"
|
216
|
-
"CPU_USED"
|
217
|
-
"MEMORY"
|
218
|
-
"MEMORY_USED"
|
216
|
+
"VMS" => limit,
|
217
|
+
"VMS_USED" => "0",
|
218
|
+
"CPU" => limit,
|
219
|
+
"CPU_USED" => "0",
|
220
|
+
"MEMORY" => limit,
|
221
|
+
"MEMORY_USED" => "0",
|
222
|
+
"RUNNING_VMS" => limit,
|
223
|
+
"RUNNING_VMS_USED" => "0",
|
224
|
+
"RUNNING_CPU" => limit,
|
225
|
+
"RUNNING_CPU_USED" => "0",
|
226
|
+
"RUNNING_MEMORY" => limit,
|
227
|
+
"RUNNING_MEMORY_USED" => "0",
|
219
228
|
"SYSTEM_DISK_SIZE" => limit,
|
220
229
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
221
230
|
}]
|
@@ -223,7 +232,7 @@ class OneQuotaHelper
|
|
223
232
|
|
224
233
|
if !vm_quotas[0].nil?
|
225
234
|
CLIHelper::ShowTable.new(nil, self) do
|
226
|
-
column :"
|
235
|
+
column :"VMS", "", :right, :size=>17 do |d|
|
227
236
|
if !d.nil?
|
228
237
|
elem = 'VMS'
|
229
238
|
limit = d[elem]
|
@@ -297,11 +306,87 @@ class OneQuotaHelper
|
|
297
306
|
puts
|
298
307
|
end
|
299
308
|
|
309
|
+
CLIHelper.print_header(str_h1 % "VMS USAGE & QUOTAS - RUNNING",false)
|
310
|
+
|
311
|
+
puts
|
312
|
+
|
313
|
+
if !vm_quotas[0].nil?
|
314
|
+
CLIHelper::ShowTable.new(nil, self) do
|
315
|
+
column :"RUNNING VMS", "", :right, :size=>17 do |d|
|
316
|
+
if !d.nil?
|
317
|
+
elem = 'RUNNING_VMS'
|
318
|
+
limit = d[elem] || LIMIT_UNLIMITED
|
319
|
+
limit = helper.get_default_limit(
|
320
|
+
limit, "VM_QUOTA/VM/#{elem}")
|
321
|
+
|
322
|
+
if d["RUNNING_VMS_USED"].nil?
|
323
|
+
d["RUNNING_VMS_USED"] = 0
|
324
|
+
end
|
325
|
+
|
326
|
+
if limit == LIMIT_UNLIMITED
|
327
|
+
"%7d / -" % [d["RUNNING_VMS_USED"]]
|
328
|
+
else
|
329
|
+
"%7d / %7d" % [d["RUNNING_VMS_USED"], limit]
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
column :"RUNNING MEMORY", "", :right, :size=>20 do |d|
|
335
|
+
if !d.nil?
|
336
|
+
elem = 'RUNNING_MEMORY'
|
337
|
+
limit = d[elem] || LIMIT_UNLIMITED
|
338
|
+
limit = helper.get_default_limit(
|
339
|
+
limit, "VM_QUOTA/VM/#{elem}")
|
340
|
+
|
341
|
+
if d["RUNNING_MEMORY_USED"].nil?
|
342
|
+
d["RUNNING_MEMORY_USED"] = 0
|
343
|
+
end
|
344
|
+
|
345
|
+
if limit == LIMIT_UNLIMITED
|
346
|
+
"%8s / -" % [
|
347
|
+
OpenNebulaHelper.unit_to_str(d["RUNNING_MEMORY_USED"].to_i,{},"M")
|
348
|
+
]
|
349
|
+
else
|
350
|
+
"%8s / %8s" % [
|
351
|
+
OpenNebulaHelper.unit_to_str(d["RUNNING_MEMORY_USED"].to_i,{},"M"),
|
352
|
+
OpenNebulaHelper.unit_to_str(limit.to_i,{},"M")
|
353
|
+
]
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
column :"RUNNING CPU", "", :right, :size=>20 do |d|
|
359
|
+
if !d.nil?
|
360
|
+
elem = 'RUNNING_CPU'
|
361
|
+
limit = d[elem] || LIMIT_UNLIMITED
|
362
|
+
limit = helper.get_default_limit(
|
363
|
+
limit, "VM_QUOTA/VM/#{elem}")
|
364
|
+
|
365
|
+
if d["RUNNING_CPU_USED"].nil?
|
366
|
+
d["RUNNING_CPU_USED"] = 0
|
367
|
+
end
|
368
|
+
|
369
|
+
if limit == LIMIT_UNLIMITED
|
370
|
+
"%8.2f / -" % [d["RUNNING_CPU_USED"]]
|
371
|
+
else
|
372
|
+
"%8.2f / %8.2f" % [d["RUNNING_CPU_USED"], limit]
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end.show(vm_quotas, {})
|
377
|
+
|
378
|
+
puts
|
379
|
+
end
|
380
|
+
|
381
|
+
CLIHelper.print_header(str_h1 % "DATASTORE USAGE & QUOTAS",false)
|
382
|
+
|
383
|
+
puts
|
384
|
+
|
300
385
|
ds_quotas = [qh['DATASTORE_QUOTA']['DATASTORE']].flatten
|
301
386
|
|
302
387
|
if !ds_quotas[0].nil?
|
303
388
|
CLIHelper::ShowTable.new(nil, self) do
|
304
|
-
column :"
|
389
|
+
column :"ID", "", :size=>12 do |d|
|
305
390
|
d["ID"] if !d.nil?
|
306
391
|
end
|
307
392
|
|
@@ -344,11 +429,15 @@ class OneQuotaHelper
|
|
344
429
|
puts
|
345
430
|
end
|
346
431
|
|
432
|
+
CLIHelper.print_header(str_h1 % "NETWORK USAGE & QUOTAS",false)
|
433
|
+
|
434
|
+
puts
|
435
|
+
|
347
436
|
net_quotas = [qh['NETWORK_QUOTA']['NETWORK']].flatten
|
348
437
|
|
349
438
|
if !net_quotas[0].nil?
|
350
439
|
CLIHelper::ShowTable.new(nil, self) do
|
351
|
-
column :"
|
440
|
+
column :"ID", "", :size=>12 do |d|
|
352
441
|
d["ID"] if !d.nil?
|
353
442
|
end
|
354
443
|
|
@@ -371,11 +460,15 @@ class OneQuotaHelper
|
|
371
460
|
puts
|
372
461
|
end
|
373
462
|
|
463
|
+
CLIHelper.print_header(str_h1 % "IMAGE USAGE & QUOTAS",false)
|
464
|
+
|
465
|
+
puts
|
466
|
+
|
374
467
|
image_quotas = [qh['IMAGE_QUOTA']['IMAGE']].flatten
|
375
468
|
|
376
469
|
if !image_quotas[0].nil?
|
377
470
|
CLIHelper::ShowTable.new(nil, self) do
|
378
|
-
column :"
|
471
|
+
column :"ID", "", :size=>12 do |d|
|
379
472
|
d["ID"] if !d.nil?
|
380
473
|
end
|
381
474
|
|
@@ -294,12 +294,18 @@ class OneUserHelper < OpenNebulaHelper::OneHelper
|
|
294
294
|
|
295
295
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
296
296
|
q['VM_QUOTA']['VM'] = {
|
297
|
-
"VMS"
|
298
|
-
"VMS_USED"
|
299
|
-
"CPU"
|
300
|
-
"CPU_USED"
|
301
|
-
"MEMORY"
|
302
|
-
"MEMORY_USED"
|
297
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
298
|
+
"VMS_USED" => "0",
|
299
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
300
|
+
"CPU_USED" => "0",
|
301
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
302
|
+
"MEMORY_USED" => "0",
|
303
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
304
|
+
"RUNNING_VMS_USED" => "0",
|
305
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
306
|
+
"RUNNING_CPU_USED" => "0",
|
307
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
308
|
+
"RUNNING_MEMORY_USED" => "0",
|
303
309
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
304
310
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
305
311
|
}
|
@@ -333,12 +339,18 @@ class OneUserHelper < OpenNebulaHelper::OneHelper
|
|
333
339
|
|
334
340
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
335
341
|
q['VM_QUOTA']['VM'] = {
|
336
|
-
"VMS"
|
337
|
-
"VMS_USED"
|
338
|
-
"CPU"
|
339
|
-
"CPU_USED"
|
340
|
-
"MEMORY"
|
341
|
-
"MEMORY_USED"
|
342
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
343
|
+
"VMS_USED" => "0",
|
344
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
345
|
+
"CPU_USED" => "0",
|
346
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
347
|
+
"MEMORY_USED" => "0",
|
348
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
349
|
+
"RUNNING_VMS_USED" => "0",
|
350
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
351
|
+
"RUNNING_CPU_USED" => "0",
|
352
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
353
|
+
"RUNNING_MEMORY_USED" => "0",
|
342
354
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
343
355
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
344
356
|
}
|
@@ -375,12 +387,18 @@ class OneUserHelper < OpenNebulaHelper::OneHelper
|
|
375
387
|
|
376
388
|
if q['VM_QUOTA']['VM'].nil? && d["ID"].to_i != 0
|
377
389
|
q['VM_QUOTA']['VM'] = {
|
378
|
-
"VMS"
|
379
|
-
"VMS_USED"
|
380
|
-
"CPU"
|
381
|
-
"CPU_USED"
|
382
|
-
"MEMORY"
|
383
|
-
"MEMORY_USED"
|
390
|
+
"VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
391
|
+
"VMS_USED" => "0",
|
392
|
+
"CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
393
|
+
"CPU_USED" => "0",
|
394
|
+
"MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
395
|
+
"MEMORY_USED" => "0",
|
396
|
+
"RUNNING_VMS" => OneQuotaHelper::LIMIT_DEFAULT,
|
397
|
+
"RUNNING_VMS_USED" => "0",
|
398
|
+
"RUNNING_CPU" => OneQuotaHelper::LIMIT_DEFAULT,
|
399
|
+
"RUNNING_CPU_USED" => "0",
|
400
|
+
"RUNNING_MEMORY" => OneQuotaHelper::LIMIT_DEFAULT,
|
401
|
+
"RUNNING_MEMORY_USED" => "0",
|
384
402
|
"SYSTEM_DISK_SIZE" => OneQuotaHelper::LIMIT_DEFAULT,
|
385
403
|
"SYSTEM_DISK_SIZE_USED" => "0"
|
386
404
|
}
|
@@ -120,6 +120,8 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
|
|
120
120
|
# @param type [String] String representing the vCenter resource
|
121
121
|
#
|
122
122
|
def set_object(type)
|
123
|
+
raise "you need to use -o option!" unless type
|
124
|
+
|
123
125
|
type = type.downcase
|
124
126
|
if (type == "datastores")
|
125
127
|
@vobject = VOBJECT::DATASTORE
|
@@ -83,25 +83,28 @@ class OneZoneHelper < OpenNebulaHelper::OneHelper
|
|
83
83
|
table
|
84
84
|
end
|
85
85
|
|
86
|
-
def set_zone(zone_id)
|
87
|
-
|
88
|
-
|
86
|
+
def set_zone(zone_id, temporary_zone)
|
87
|
+
zone = factory(zone_id)
|
88
|
+
rc = zone.info
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if !zone['TEMPLATE/ENDPOINT']
|
95
|
-
return -1, "No Endpoint defined for Zone #{zone_id}"
|
96
|
-
end
|
90
|
+
if OpenNebula.is_error?(rc)
|
91
|
+
return -1, rc.message
|
92
|
+
end
|
97
93
|
|
98
|
-
|
99
|
-
|
100
|
-
|
94
|
+
if !zone['TEMPLATE/ENDPOINT']
|
95
|
+
return -1, "No Endpoint defined for Zone #{zone_id}"
|
96
|
+
end
|
101
97
|
|
102
|
-
|
103
|
-
|
104
|
-
|
98
|
+
if temporary_zone
|
99
|
+
puts "Type: export ONE_XMLRPC=#{zone['TEMPLATE/ENDPOINT']}"
|
100
|
+
else
|
101
|
+
File.open(ENV['HOME']+"/.one/one_endpoint", 'w'){|f|
|
102
|
+
f.puts zone['TEMPLATE/ENDPOINT']
|
103
|
+
}
|
104
|
+
puts "Endpoint changed to \"#{zone['TEMPLATE/ENDPOINT']}\" in " <<
|
105
|
+
"#{ENV['HOME']}/.one/one_endpoint"
|
106
|
+
end
|
107
|
+
return 0
|
105
108
|
end
|
106
109
|
|
107
110
|
private
|
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: 5.6.
|
4
|
+
version: 5.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-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: 5.6.
|
19
|
+
version: 5.6.1
|
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: 5.6.
|
26
|
+
version: 5.6.1
|
27
27
|
description: Commands used to talk to OpenNebula
|
28
28
|
email: contact@opennebula.org
|
29
29
|
executables:
|