opennebula-cli 4.4.0 → 4.5.80.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NOTICE +1 -1
- data/bin/oneacct +28 -4
- data/bin/oneacl +3 -3
- data/bin/onecluster +1 -1
- data/bin/onedatastore +1 -1
- data/bin/oneflow +1 -1
- data/bin/oneflow-template +1 -1
- data/bin/onegroup +103 -5
- data/bin/onehost +2 -2
- data/bin/oneimage +1 -1
- data/bin/onetemplate +1 -1
- data/bin/oneuser +2 -2
- data/bin/onevm +1 -1
- data/bin/onevnet +1 -1
- data/bin/onezone +145 -0
- data/lib/cli_helper.rb +73 -17
- data/lib/command_parser.rb +1 -1
- data/lib/one_helper.rb +136 -21
- data/lib/one_helper/oneacct_helper.rb +7 -3
- data/lib/one_helper/oneacl_helper.rb +11 -5
- data/lib/one_helper/onecluster_helper.rb +1 -1
- data/lib/one_helper/onedatastore_helper.rb +1 -1
- data/lib/one_helper/onegroup_helper.rb +114 -25
- data/lib/one_helper/onehost_helper.rb +2 -2
- data/lib/one_helper/oneimage_helper.rb +1 -1
- data/lib/one_helper/onequota_helper.rb +1 -1
- data/lib/one_helper/onetemplate_helper.rb +1 -1
- data/lib/one_helper/oneuser_helper.rb +44 -22
- data/lib/one_helper/onevm_helper.rb +1 -1
- data/lib/one_helper/onevnet_helper.rb +1 -1
- data/lib/one_helper/onezone_helper.rb +104 -0
- metadata +14 -10
data/lib/cli_helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
2
|
-
# Copyright 2002-
|
2
|
+
# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
|
3
3
|
# #
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -14,6 +14,8 @@
|
|
14
14
|
# limitations under the License. #
|
15
15
|
#--------------------------------------------------------------------------- #
|
16
16
|
|
17
|
+
require 'csv'
|
18
|
+
|
17
19
|
module CLIHelper
|
18
20
|
LIST = {
|
19
21
|
:name => "list",
|
@@ -23,6 +25,12 @@ module CLIHelper
|
|
23
25
|
:description => "Selects columns to display with list command"
|
24
26
|
}
|
25
27
|
|
28
|
+
CSV = {
|
29
|
+
:name => "csv",
|
30
|
+
:large => "--csv",
|
31
|
+
:description => "Write table in csv format"
|
32
|
+
}
|
33
|
+
|
26
34
|
#ORDER = {
|
27
35
|
# :name => "order",
|
28
36
|
# :short => "-o x,y,z",
|
@@ -56,7 +64,7 @@ module CLIHelper
|
|
56
64
|
}
|
57
65
|
|
58
66
|
#OPTIONS = [LIST, ORDER, FILTER, HEADER, DELAY]
|
59
|
-
OPTIONS = [LIST, DELAY, FILTER]
|
67
|
+
OPTIONS = [LIST, DELAY, FILTER, CSV]
|
60
68
|
|
61
69
|
# Sets bold font
|
62
70
|
def CLIHelper.scr_bold
|
@@ -126,9 +134,36 @@ module CLIHelper
|
|
126
134
|
puts
|
127
135
|
end
|
128
136
|
|
137
|
+
module HashWithSearch
|
138
|
+
def dsearch(path)
|
139
|
+
stems=path.split('/')
|
140
|
+
hash=self
|
141
|
+
|
142
|
+
stems.delete_if {|s| s.nil? || s.empty? }
|
143
|
+
|
144
|
+
stems.each do |stem|
|
145
|
+
if Hash===hash
|
146
|
+
if hash[stem]
|
147
|
+
hash=hash[stem]
|
148
|
+
else
|
149
|
+
hash=nil
|
150
|
+
break
|
151
|
+
end
|
152
|
+
else
|
153
|
+
hash=nil
|
154
|
+
break
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
hash
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
129
162
|
class ShowTable
|
130
163
|
require 'yaml'
|
131
164
|
|
165
|
+
attr_reader :default_columns
|
166
|
+
|
132
167
|
def initialize(conf=nil, ext=nil, &block)
|
133
168
|
@columns = Hash.new
|
134
169
|
@default_columns = Array.new
|
@@ -168,7 +203,23 @@ module CLIHelper
|
|
168
203
|
|
169
204
|
def show(data, options={})
|
170
205
|
update_columns(options)
|
171
|
-
|
206
|
+
|
207
|
+
if Hash===data
|
208
|
+
@data=data
|
209
|
+
@data.extend(HashWithSearch)
|
210
|
+
|
211
|
+
pool=@data.keys.first
|
212
|
+
return print_table(nil, options) if !pool
|
213
|
+
|
214
|
+
element=pool.split('_').first
|
215
|
+
|
216
|
+
pool_data=@data.dsearch("#{pool}/#{element}")
|
217
|
+
pool_data=[pool_data].flatten if pool_data
|
218
|
+
|
219
|
+
print_table(pool_data, options)
|
220
|
+
else
|
221
|
+
print_table(data, options)
|
222
|
+
end
|
172
223
|
end
|
173
224
|
|
174
225
|
def top(options={}, &block)
|
@@ -176,11 +227,11 @@ module CLIHelper
|
|
176
227
|
|
177
228
|
begin
|
178
229
|
while true
|
230
|
+
data = block.call
|
231
|
+
|
179
232
|
CLIHelper.scr_cls
|
180
233
|
CLIHelper.scr_move(0,0)
|
181
234
|
|
182
|
-
data = block.call
|
183
|
-
|
184
235
|
show(data, options)
|
185
236
|
sleep delay
|
186
237
|
end
|
@@ -200,7 +251,7 @@ module CLIHelper
|
|
200
251
|
private
|
201
252
|
|
202
253
|
def print_table(data, options)
|
203
|
-
CLIHelper.print_header(header_str)
|
254
|
+
CLIHelper.print_header(header_str) if !options[:csv]
|
204
255
|
data ? print_data(data, options) : puts
|
205
256
|
end
|
206
257
|
|
@@ -216,21 +267,26 @@ module CLIHelper
|
|
216
267
|
end
|
217
268
|
|
218
269
|
begin
|
219
|
-
|
220
|
-
(
|
221
|
-
|
222
|
-
|
270
|
+
if options[:csv]
|
271
|
+
CSV($stdout, :write_headers => true,
|
272
|
+
:headers => @default_columns) do |csv|
|
273
|
+
res_data.each {|l| csv << l }
|
274
|
+
end
|
275
|
+
else
|
276
|
+
res_data.each{|l|
|
277
|
+
puts (0..ncolumns-1).collect{ |i|
|
278
|
+
dat=l[i]
|
279
|
+
col=@default_columns[i]
|
223
280
|
|
224
|
-
|
225
|
-
|
281
|
+
str=format_str(col, dat)
|
282
|
+
str=CLIHelper.color_state(str) if i==stat_column
|
226
283
|
|
227
|
-
|
228
|
-
|
229
|
-
|
284
|
+
str
|
285
|
+
}.join(' ').rstrip
|
286
|
+
}
|
287
|
+
end
|
230
288
|
rescue Errno::EPIPE
|
231
289
|
end
|
232
|
-
|
233
|
-
puts
|
234
290
|
end
|
235
291
|
|
236
292
|
def data_array(data, options)
|
data/lib/command_parser.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
2
|
-
# Copyright 2002-
|
2
|
+
# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
|
3
3
|
# #
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
data/lib/one_helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
2
|
-
# Copyright 2002-
|
2
|
+
# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
|
3
3
|
# #
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -16,13 +16,19 @@
|
|
16
16
|
|
17
17
|
require 'cli_helper'
|
18
18
|
|
19
|
-
|
19
|
+
begin
|
20
|
+
require 'opennebula'
|
21
|
+
rescue Exception => e
|
22
|
+
puts "Error: "+e.message.to_s
|
23
|
+
exit(-1)
|
24
|
+
end
|
25
|
+
|
20
26
|
include OpenNebula
|
21
27
|
|
22
28
|
module OpenNebulaHelper
|
23
29
|
ONE_VERSION=<<-EOT
|
24
30
|
OpenNebula #{OpenNebula::VERSION}
|
25
|
-
Copyright 2002-
|
31
|
+
Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs
|
26
32
|
|
27
33
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
28
34
|
not use this file except in compliance with the License. You may obtain
|
@@ -94,18 +100,91 @@ EOT
|
|
94
100
|
:name => 'user',
|
95
101
|
:large => '--user name',
|
96
102
|
:description => 'User name used to connect to OpenNebula',
|
97
|
-
:format => String
|
103
|
+
:format => String,
|
104
|
+
:proc => lambda do |o, options|
|
105
|
+
OneHelper.set_user(o)
|
106
|
+
[0, o]
|
107
|
+
end
|
98
108
|
},
|
99
109
|
{
|
100
110
|
:name => 'password',
|
101
111
|
:large => '--password password',
|
102
112
|
:description => 'Password to authenticate with OpenNebula',
|
103
|
-
:format => String
|
113
|
+
:format => String,
|
114
|
+
:proc => lambda do |o, options|
|
115
|
+
OneHelper.set_password(o)
|
116
|
+
[0, o]
|
117
|
+
end
|
104
118
|
},
|
105
119
|
{
|
106
120
|
:name => 'endpoint',
|
107
121
|
:large => '--endpoint endpoint',
|
108
122
|
:description => 'URL of OpenNebula xmlrpc frontend',
|
123
|
+
:format => String,
|
124
|
+
:proc => lambda do |o, options|
|
125
|
+
OneHelper.set_endpoint(o)
|
126
|
+
[0, o]
|
127
|
+
end
|
128
|
+
}
|
129
|
+
]
|
130
|
+
|
131
|
+
GROUP_OPTIONS=[
|
132
|
+
{
|
133
|
+
:name => 'name',
|
134
|
+
:large => '--name name',
|
135
|
+
:short => "-n",
|
136
|
+
:description =>
|
137
|
+
'Name for the new group',
|
138
|
+
:format => String
|
139
|
+
},
|
140
|
+
{
|
141
|
+
:name => 'admin_group',
|
142
|
+
:large => '--admin_group name',
|
143
|
+
:short => "-a",
|
144
|
+
:description =>
|
145
|
+
'Creates an admin group with name',
|
146
|
+
:format => String
|
147
|
+
},
|
148
|
+
{
|
149
|
+
:name => 'admin_user',
|
150
|
+
:large => '--admin_user name',
|
151
|
+
:short => "-u",
|
152
|
+
:description =>
|
153
|
+
'Creates an admin user for the group with name',
|
154
|
+
:format => String
|
155
|
+
},
|
156
|
+
{
|
157
|
+
:name => 'admin_password',
|
158
|
+
:large => '--admin_password password',
|
159
|
+
:short => "-p",
|
160
|
+
:description =>
|
161
|
+
'Password for the admin user of the group',
|
162
|
+
:format => String
|
163
|
+
},
|
164
|
+
{
|
165
|
+
:name => 'admin_driver',
|
166
|
+
:large => '--admin_driver auth_driver',
|
167
|
+
:short => "-d",
|
168
|
+
:description =>
|
169
|
+
'Auth driver for the admin user of the group',
|
170
|
+
:format => String
|
171
|
+
},
|
172
|
+
{
|
173
|
+
:name => 'resources',
|
174
|
+
:large => '--resources resources_str',
|
175
|
+
:short => "-r",
|
176
|
+
:description =>
|
177
|
+
'Which resources can be created by group users "\
|
178
|
+
"(VM+NET+IMAGE+TEMPLATE by default)',
|
179
|
+
:format => String
|
180
|
+
},
|
181
|
+
{
|
182
|
+
:name => 'admin_resources',
|
183
|
+
:large => '--admin_resources resources_str',
|
184
|
+
:short => "-o",
|
185
|
+
:description =>
|
186
|
+
'Which resources can be created by group users "\
|
187
|
+
"(VM+NET+IMAGE+TEMPLATE by default)',
|
109
188
|
:format => String
|
110
189
|
}
|
111
190
|
]
|
@@ -273,18 +352,31 @@ EOT
|
|
273
352
|
class OneHelper
|
274
353
|
attr_accessor :client
|
275
354
|
|
276
|
-
def self.get_client(options)
|
277
|
-
if defined?(@@client)
|
355
|
+
def self.get_client(options={}, force=false)
|
356
|
+
if !force && defined?(@@client)
|
278
357
|
@@client
|
279
358
|
else
|
359
|
+
|
280
360
|
secret=nil
|
281
|
-
|
361
|
+
password=nil
|
362
|
+
|
363
|
+
if defined?(@@user)
|
364
|
+
user=@@user
|
365
|
+
password=@@password if defined?(@@password)
|
366
|
+
else
|
367
|
+
user=options[:user]
|
368
|
+
end
|
369
|
+
|
282
370
|
if user
|
283
|
-
password=options[:password]||self.get_password
|
371
|
+
password=password||options[:password]||self.get_password
|
284
372
|
secret="#{user}:#{password}"
|
285
373
|
end
|
286
374
|
|
287
|
-
endpoint
|
375
|
+
if defined?(@@endpoint)
|
376
|
+
endpoint=@@endpoint
|
377
|
+
else
|
378
|
+
endpoint=options[:endpoint]
|
379
|
+
end
|
288
380
|
|
289
381
|
@@client=OpenNebula::Client.new(secret, endpoint)
|
290
382
|
end
|
@@ -294,10 +386,22 @@ EOT
|
|
294
386
|
if defined?(@@client)
|
295
387
|
@@client
|
296
388
|
else
|
297
|
-
self.get_client
|
389
|
+
self.get_client
|
298
390
|
end
|
299
391
|
end
|
300
392
|
|
393
|
+
def self.set_user(user)
|
394
|
+
@@user=user
|
395
|
+
end
|
396
|
+
|
397
|
+
def self.set_password(password)
|
398
|
+
@@password=password
|
399
|
+
end
|
400
|
+
|
401
|
+
def self.set_endpoint(endpoint)
|
402
|
+
@@endpoint=endpoint
|
403
|
+
end
|
404
|
+
|
301
405
|
if RUBY_VERSION>="1.9.3"
|
302
406
|
require 'io/console'
|
303
407
|
def self.get_password
|
@@ -307,6 +411,7 @@ EOT
|
|
307
411
|
puts
|
308
412
|
|
309
413
|
pass.chop! if pass
|
414
|
+
@@password=pass
|
310
415
|
pass
|
311
416
|
end
|
312
417
|
else
|
@@ -314,8 +419,9 @@ EOT
|
|
314
419
|
def self.get_password
|
315
420
|
print "Password: "
|
316
421
|
system("stty", "-echo")
|
422
|
+
@@password=gets.chop
|
317
423
|
begin
|
318
|
-
return
|
424
|
+
return @@password
|
319
425
|
ensure
|
320
426
|
system("stty", "echo")
|
321
427
|
print "\n"
|
@@ -330,7 +436,7 @@ EOT
|
|
330
436
|
end
|
331
437
|
|
332
438
|
def set_client(options)
|
333
|
-
@client=OpenNebulaHelper::OneHelper.get_client(options)
|
439
|
+
@client=OpenNebulaHelper::OneHelper.get_client(options, true)
|
334
440
|
end
|
335
441
|
|
336
442
|
def create_resource(options, &block)
|
@@ -357,25 +463,29 @@ EOT
|
|
357
463
|
|
358
464
|
pool = factory_pool(filter_flag)
|
359
465
|
|
360
|
-
rc = pool.info
|
361
|
-
return -1, rc.message if OpenNebula.is_error?(rc)
|
362
|
-
|
363
466
|
if options[:xml]
|
467
|
+
# TODO: use paginated functions
|
468
|
+
rc=pool.info
|
469
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
364
470
|
return 0, pool.to_xml(true)
|
365
471
|
else
|
366
472
|
table = format_pool(options)
|
367
473
|
|
368
474
|
if top
|
369
475
|
table.top(options) {
|
370
|
-
pool.
|
371
|
-
|
476
|
+
array=pool.get_hash
|
477
|
+
return -1, array.message if OpenNebula.is_error?(array)
|
478
|
+
|
479
|
+
array
|
372
480
|
}
|
373
481
|
else
|
374
|
-
array=
|
482
|
+
array=pool.get_hash
|
483
|
+
return -1, array.message if OpenNebula.is_error?(array)
|
375
484
|
|
376
485
|
if options[:ids]
|
377
|
-
|
378
|
-
|
486
|
+
rname=self.class.rname
|
487
|
+
array["#{rname}_POOL"][rname].reject! do |element|
|
488
|
+
!options[:ids].include?(element['ID'].to_i)
|
379
489
|
end
|
380
490
|
end
|
381
491
|
|
@@ -495,6 +605,10 @@ EOT
|
|
495
605
|
end
|
496
606
|
|
497
607
|
def self.name_to_id(name, pool, ename)
|
608
|
+
if ename=="CLUSTER" and name.upcase=="ALL"
|
609
|
+
return 0, "ALL"
|
610
|
+
end
|
611
|
+
|
498
612
|
objects=pool.select {|object| object.name==name }
|
499
613
|
|
500
614
|
if objects.length>0
|
@@ -610,6 +724,7 @@ EOT
|
|
610
724
|
when "IMAGE" then OpenNebula::ImagePool.new(client)
|
611
725
|
when "VMTEMPLATE" then OpenNebula::TemplatePool.new(client)
|
612
726
|
when "VM" then OpenNebula::VirtualMachinePool.new(client)
|
727
|
+
when "ZONE" then OpenNebula::ZonePool.new(client)
|
613
728
|
end
|
614
729
|
|
615
730
|
rc = pool.info
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
2
|
-
# Copyright 2002-
|
2
|
+
# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
|
3
3
|
# #
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -87,7 +87,7 @@ class AcctHelper < OpenNebulaHelper::OneHelper
|
|
87
87
|
:name => "json",
|
88
88
|
:short => "-j",
|
89
89
|
:large => "--json",
|
90
|
-
:description => "Show the resource in
|
90
|
+
:description => "Show the resource in json format"
|
91
91
|
}
|
92
92
|
|
93
93
|
SPLIT={
|
@@ -100,6 +100,10 @@ class AcctHelper < OpenNebulaHelper::OneHelper
|
|
100
100
|
|
101
101
|
|
102
102
|
ACCT_TABLE = CLIHelper::ShowTable.new("oneacct.yaml", nil) do
|
103
|
+
column :UID, "User ID", :size=>4 do |d|
|
104
|
+
d["UID"]
|
105
|
+
end
|
106
|
+
|
103
107
|
column :VID, "Virtual Machine ID", :size=>4 do |d|
|
104
108
|
d["OID"]
|
105
109
|
end
|
@@ -181,4 +185,4 @@ class AcctHelper < OpenNebulaHelper::OneHelper
|
|
181
185
|
CLIHelper.scr_restore
|
182
186
|
puts
|
183
187
|
end
|
184
|
-
end
|
188
|
+
end
|