|
1 |
_gnt_backup()
|
|
2 |
{
|
|
3 |
local cur prev base_cmd cmds ilist nlist
|
|
4 |
COMPREPLY=()
|
|
5 |
cur="$2"
|
|
6 |
prev="$3"
|
|
7 |
#
|
|
8 |
# The basic options we'll complete.
|
|
9 |
#
|
|
10 |
cmds="export import list remove"
|
|
11 |
|
|
12 |
# default completion is empty
|
|
13 |
COMPREPLY=()
|
|
14 |
|
|
15 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
16 |
# cluster not initialized
|
|
17 |
return 0
|
|
18 |
fi
|
|
19 |
|
|
20 |
ilist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_instance_list")
|
|
21 |
nlist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_node_list")
|
|
22 |
|
|
23 |
case "$COMP_CWORD" in
|
|
24 |
1)
|
|
25 |
# complete the command name
|
|
26 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
27 |
;;
|
|
28 |
*)
|
|
29 |
# we're doing options to commands
|
|
30 |
base_cmd="${COMP_WORDS[1]}"
|
|
31 |
case "${base_cmd}" in
|
|
32 |
export)
|
|
33 |
case "$COMP_CWORD" in
|
|
34 |
2)
|
|
35 |
# options or instances
|
|
36 |
COMPREPLY=( $(compgen -W "--no-shutdown -n $ilist" -- ${cur}) )
|
|
37 |
;;
|
|
38 |
3)
|
|
39 |
# if previous was option, we allow instance
|
|
40 |
case "$prev" in
|
|
41 |
-*)
|
|
42 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
43 |
;;
|
|
44 |
esac
|
|
45 |
esac
|
|
46 |
;;
|
|
47 |
import)
|
|
48 |
case "$prev" in
|
|
49 |
-t)
|
|
50 |
COMPREPLY=( $(compgen -W "diskless file plain drbd" -- ${cur}) )
|
|
51 |
;;
|
|
52 |
--src-node)
|
|
53 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
54 |
;;
|
|
55 |
--file-driver)
|
|
56 |
COMPREPLY=( $(compgen -W "loop blktap" -- ${cur}) )
|
|
57 |
;;
|
|
58 |
-*)
|
|
59 |
# arguments to other options, we don't have completion yet
|
|
60 |
;;
|
|
61 |
*)
|
|
62 |
COMPREPLY=( $(compgen -W "-t -n -B -H -s --disks --net \
|
|
63 |
--no-nics --no-start --no-ip-check -I \
|
|
64 |
--src-node --src-dir --file-driver \
|
|
65 |
--file-storage-dir" -- ${cur}) )
|
|
66 |
;;
|
|
67 |
esac
|
|
68 |
;;
|
|
69 |
remove)
|
|
70 |
if [[ "$COMP_CWORD" -eq 2 ]]; then
|
|
71 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
72 |
fi
|
|
73 |
;;
|
|
74 |
esac
|
|
75 |
esac
|
|
76 |
|
|
77 |
return 0
|
|
78 |
}
|
|
79 |
|
|
80 |
complete -F _gnt_backup gnt-backup
|
|
81 |
|
|
82 |
_gnt_cluster()
|
|
83 |
{
|
|
84 |
local cur prev cmds
|
|
85 |
cur="$2"
|
|
86 |
prev="$3"
|
|
87 |
#
|
|
88 |
# The basic options we'll complete.
|
|
89 |
#
|
|
90 |
if [[ -e "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
91 |
cmds="add-tags command copyfile destroy getmaster info list-tags \
|
|
92 |
masterfailover modify queue redist-conf remove-tags rename \
|
|
93 |
search-tags verify verify-disks version"
|
|
94 |
else
|
|
95 |
cmds="init"
|
|
96 |
fi
|
|
97 |
|
|
98 |
# default completion is empty
|
|
99 |
COMPREPLY=()
|
|
100 |
case "$COMP_CWORD" in
|
|
101 |
1)
|
|
102 |
# complete the command name
|
|
103 |
COMPREPLY=($(compgen -W "$cmds" -- ${cur}))
|
|
104 |
;;
|
|
105 |
2)
|
|
106 |
# complete arguments to the command
|
|
107 |
case "$prev" in
|
|
108 |
"queue")
|
|
109 |
COMPREPLY=( $(compgen -W "drain undrain info" -- ${cur}) )
|
|
110 |
;;
|
|
111 |
*)
|
|
112 |
;;
|
|
113 |
esac
|
|
114 |
esac
|
|
115 |
|
|
116 |
return 0
|
|
117 |
}
|
|
118 |
|
|
119 |
complete -F _gnt_cluster gnt-cluster
|
|
120 |
|
|
121 |
_gnt_debug()
|
|
122 |
{
|
|
123 |
local cur prev cmds
|
|
124 |
cur="$2"
|
|
125 |
prev="$3"
|
|
126 |
|
|
127 |
cmds="allocator delay submit-job"
|
|
128 |
|
|
129 |
# default completion is empty
|
|
130 |
COMPREPLY=()
|
|
131 |
|
|
132 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
133 |
# cluster not initialized
|
|
134 |
return 0
|
|
135 |
fi
|
|
136 |
|
|
137 |
case "$COMP_CWORD" in
|
|
138 |
1)
|
|
139 |
# complete the command name
|
|
140 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
141 |
;;
|
|
142 |
*)
|
|
143 |
# we're doing options to commands
|
|
144 |
base_cmd="${COMP_WORDS[1]}"
|
|
145 |
case "${base_cmd}" in
|
|
146 |
delay)
|
|
147 |
if [[ "$prev" != -* ]]; then
|
|
148 |
COMPREPLY=( $(compgen -W "--no-master -n" -- ${cur}) )
|
|
149 |
fi
|
|
150 |
;;
|
|
151 |
submit-job)
|
|
152 |
if [[ "$COMP_CWORD" -eq 2 ]]; then
|
|
153 |
COMPREPLY=( $(compgen -f -- ${cur}) )
|
|
154 |
fi
|
|
155 |
;;
|
|
156 |
esac
|
|
157 |
esac
|
|
158 |
|
|
159 |
return 0
|
|
160 |
}
|
|
161 |
|
|
162 |
complete -F _gnt_debug gnt-debug
|
|
163 |
|
|
164 |
_gnt_instance()
|
|
165 |
{
|
|
166 |
local cur prev base_cmd cmds ilist nlist
|
|
167 |
COMPREPLY=()
|
|
168 |
cur="$2"
|
|
169 |
prev="$3"
|
|
170 |
#
|
|
171 |
# The basic options we'll complete.
|
|
172 |
#
|
|
173 |
cmds="activate-disks add add-tags batch-create console deactivate-disks \
|
|
174 |
failover grow-disk info list list-tags migrate modify reboot \
|
|
175 |
reinstall remove remove-tags rename replace-disks shutdown startup"
|
|
176 |
|
|
177 |
# default completion is empty
|
|
178 |
COMPREPLY=()
|
|
179 |
|
|
180 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
181 |
# cluster not initialized
|
|
182 |
return 0
|
|
183 |
fi
|
|
184 |
|
|
185 |
ilist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_instance_list")
|
|
186 |
nlist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_node_list")
|
|
187 |
|
|
188 |
case "$COMP_CWORD" in
|
|
189 |
1)
|
|
190 |
# complete the command name
|
|
191 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
192 |
;;
|
|
193 |
*)
|
|
194 |
# we're doing options to commands
|
|
195 |
base_cmd="${COMP_WORDS[1]}"
|
|
196 |
case "${base_cmd}" in
|
|
197 |
# first, rules for multiple commands
|
|
198 |
activate-disks|console|deactivate-disks|list-tags|rename|remove)
|
|
199 |
# commands with only one instance argument, nothing else
|
|
200 |
if [[ "$COMP_CWORD" -eq 2 ]]; then
|
|
201 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
202 |
fi
|
|
203 |
;;
|
|
204 |
info)
|
|
205 |
# commands with more than one instance
|
|
206 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
207 |
;;
|
|
208 |
add-tags|grow-disk|reinstall|remove-tags|replace-disks)
|
|
209 |
# not very well handled
|
|
210 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
211 |
;;
|
|
212 |
startup|start|shutdown|stop|reboot)
|
|
213 |
COMPREPLY=( $(compgen -W "--force-multiple --node --primary \
|
|
214 |
--secondary --all --submit $ilist" -- ${cur}) )
|
|
215 |
;;
|
|
216 |
# individual commands
|
|
217 |
add)
|
|
218 |
case "$prev" in
|
|
219 |
-t)
|
|
220 |
COMPREPLY=( $(compgen -W "diskless file plain drbd" -- ${cur}) )
|
|
221 |
;;
|
|
222 |
--file-driver)
|
|
223 |
COMPREPLY=( $(compgen -W "loop blktap" -- ${cur}) )
|
|
224 |
;;
|
|
225 |
-*)
|
|
226 |
# arguments to other options, we don't have completion yet
|
|
227 |
;;
|
|
228 |
*)
|
|
229 |
COMPREPLY=( $(compgen -W "-t -n -o -B -H -s --disks --net \
|
|
230 |
--no-nics --no-start --no-ip-check -I \
|
|
231 |
--file-driver --file-storage-dir --submit" \
|
|
232 |
-- ${cur}) )
|
|
233 |
;;
|
|
234 |
esac
|
|
235 |
;;
|
|
236 |
batch-create)
|
|
237 |
# this only takes one file name
|
|
238 |
COMPREPLY=( $(compgen -A file -- ${cur}) )
|
|
239 |
;;
|
|
240 |
failover)
|
|
241 |
case "$COMP_CWORD" in
|
|
242 |
2)
|
|
243 |
# options or instances
|
|
244 |
COMPREPLY=( $(compgen -W "--ignore-failures $ilist" -- ${cur}) )
|
|
245 |
;;
|
|
246 |
3)
|
|
247 |
# if previous was option, we allow instance
|
|
248 |
case "$prev" in
|
|
249 |
-*)
|
|
250 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
251 |
;;
|
|
252 |
esac
|
|
253 |
esac
|
|
254 |
;;
|
|
255 |
list)
|
|
256 |
COMPREPLY=( $(compgen -W "--no-headers --separator --units -o \
|
|
257 |
--sync $ilist" -- ${cur}) )
|
|
258 |
;;
|
|
259 |
modify)
|
|
260 |
COMPREPLY=( $(compgen -W "-H -B --disk --net $ilist" -- ${cur}) )
|
|
261 |
;;
|
|
262 |
migrate)
|
|
263 |
case "$COMP_CWORD" in
|
|
264 |
2)
|
|
265 |
# options or instances
|
|
266 |
COMPREPLY=( $(compgen -W "--non-live --cleanup $ilist" -- \
|
|
267 |
${cur}) )
|
|
268 |
;;
|
|
269 |
3)
|
|
270 |
# if previous was option, we allow instance
|
|
271 |
case "$prev" in
|
|
272 |
-*)
|
|
273 |
COMPREPLY=( $(compgen -W "$ilist" -- ${cur}) )
|
|
274 |
;;
|
|
275 |
esac
|
|
276 |
esac
|
|
277 |
esac
|
|
278 |
esac
|
|
279 |
|
|
280 |
return 0
|
|
281 |
}
|
|
282 |
|
|
283 |
complete -F _gnt_instance gnt-instance
|
|
284 |
|
|
285 |
_gnt_job()
|
|
286 |
{
|
|
287 |
local cur prev cmds
|
|
288 |
cur="$2"
|
|
289 |
prev="$3"
|
|
290 |
|
|
291 |
cmds="archive autoarchive cancel info list"
|
|
292 |
|
|
293 |
# default completion is empty
|
|
294 |
COMPREPLY=()
|
|
295 |
|
|
296 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
297 |
# cluster not initialized
|
|
298 |
return 0
|
|
299 |
fi
|
|
300 |
|
|
301 |
case "$COMP_CWORD" in
|
|
302 |
1)
|
|
303 |
# complete the command name
|
|
304 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
305 |
;;
|
|
306 |
*)
|
|
307 |
# we're doing options to commands
|
|
308 |
base_cmd="${COMP_WORDS[1]}"
|
|
309 |
case "${base_cmd}" in
|
|
310 |
archive|cancel|info)
|
|
311 |
# FIXME: this is really going into the internals of the job queue
|
|
312 |
jlist=$( cd @LOCALSTATEDIR@/lib/ganeti/queue; echo job-*)
|
|
313 |
jlist=${jlist//job-/}
|
|
314 |
COMPREPLY=( $(compgen -W "$jlist" -- ${cur}) )
|
|
315 |
;;
|
|
316 |
list)
|
|
317 |
COMPREPLY=( $(compgen -W "--no-headers --separator -o" -- ${cur}) )
|
|
318 |
;;
|
|
319 |
|
|
320 |
esac
|
|
321 |
esac
|
|
322 |
|
|
323 |
return 0
|
|
324 |
}
|
|
325 |
|
|
326 |
complete -F _gnt_job gnt-job
|
|
327 |
|
|
328 |
_gnt_os()
|
|
329 |
{
|
|
330 |
local cur prev cmds
|
|
331 |
cur="$2"
|
|
332 |
prev="$3"
|
|
333 |
|
|
334 |
cmds="list diagnose"
|
|
335 |
|
|
336 |
# default completion is empty
|
|
337 |
COMPREPLY=()
|
|
338 |
|
|
339 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
340 |
# cluster not initialized
|
|
341 |
return 0
|
|
342 |
fi
|
|
343 |
|
|
344 |
case "$COMP_CWORD" in
|
|
345 |
1)
|
|
346 |
# complete the command name
|
|
347 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
348 |
;;
|
|
349 |
*)
|
|
350 |
# we're doing options to commands
|
|
351 |
base_cmd="${COMP_WORDS[1]}"
|
|
352 |
case "${base_cmd}" in
|
|
353 |
list)
|
|
354 |
if [[ "$COMP_CWORD" -eq 2 ]]; then
|
|
355 |
COMPREPLY=( $(compgen -W "--no-headers" -- ${cur}) )
|
|
356 |
fi
|
|
357 |
;;
|
|
358 |
esac
|
|
359 |
esac
|
|
360 |
|
|
361 |
return 0
|
|
362 |
}
|
|
363 |
|
|
364 |
complete -F _gnt_os gnt-os
|
|
365 |
|
|
366 |
_gnt_node()
|
|
367 |
{
|
|
368 |
local cur prev cmds base_cmd
|
|
369 |
cur="$2"
|
|
370 |
prev="$3"
|
|
371 |
|
|
372 |
cmds="add add-tags evacuate failover info list list-tags migrate modify \
|
|
373 |
remove remove-tags volumes"
|
|
374 |
|
|
375 |
# default completion is empty
|
|
376 |
COMPREPLY=()
|
|
377 |
|
|
378 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
379 |
# cluster not initialized
|
|
380 |
return 0
|
|
381 |
fi
|
|
382 |
|
|
383 |
nlist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_node_list")
|
|
384 |
|
|
385 |
case "$COMP_CWORD" in
|
|
386 |
1)
|
|
387 |
# complete the command name
|
|
388 |
COMPREPLY=( $(compgen -W "$cmds" -- ${cur}) )
|
|
389 |
;;
|
|
390 |
*)
|
|
391 |
# we're doing options to commands
|
|
392 |
base_cmd="${COMP_WORDS[1]}"
|
|
393 |
case "${base_cmd}" in
|
|
394 |
# first rules for multiple commands
|
|
395 |
list-tags|remove)
|
|
396 |
# commands with only one instance argument, nothing else
|
|
397 |
if [[ "$COMP_CWORD" -eq 2 ]]; then
|
|
398 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
399 |
fi
|
|
400 |
;;
|
|
401 |
add-tags|info|remove-tags|volumes)
|
|
402 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
403 |
;;
|
|
404 |
# individual commands
|
|
405 |
add)
|
|
406 |
# options or instances
|
|
407 |
COMPREPLY=( $(compgen -W "-s --readd --no-ssh-key-check" -- ${cur}) )
|
|
408 |
;;
|
|
409 |
evacuate)
|
|
410 |
case "$COMP_CWORD" in
|
|
411 |
2)
|
|
412 |
# options or instances
|
|
413 |
COMPREPLY=( $(compgen -W "-n -I $nlist" -- ${cur}) )
|
|
414 |
;;
|
|
415 |
3)
|
|
416 |
# if previous was option, we allow node
|
|
417 |
case "$prev" in
|
|
418 |
-*)
|
|
419 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
420 |
;;
|
|
421 |
esac
|
|
422 |
esac
|
|
423 |
;;
|
|
424 |
failover)
|
|
425 |
case "$COMP_CWORD" in
|
|
426 |
2)
|
|
427 |
# options or instances
|
|
428 |
COMPREPLY=( $(compgen -W "--ignore-failures $nlist" -- ${cur}) )
|
|
429 |
;;
|
|
430 |
3)
|
|
431 |
# if previous was option, we allow node
|
|
432 |
case "$prev" in
|
|
433 |
-*)
|
|
434 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
435 |
;;
|
|
436 |
esac
|
|
437 |
esac
|
|
438 |
;;
|
|
439 |
list)
|
|
440 |
COMPREPLY=( $(compgen -W "--no-headers --separator --units -o \
|
|
441 |
--sync $nlist" -- ${cur}) )
|
|
442 |
;;
|
|
443 |
modify)
|
|
444 |
# TODO: after a non-option, don't allow options
|
|
445 |
if [[ "$COMP_CWORD" -eq 2 || "$prev" != -* ]]; then
|
|
446 |
COMPREPLY=( $(compgen -W "-C -O -D $nlist" -- ${cur}) )
|
|
447 |
elif [[ "$prev" == -* ]]; then
|
|
448 |
COMPREPLY=( $(compgen -W "yes no" -- ${cur}) )
|
|
449 |
fi
|
|
450 |
;;
|
|
451 |
migrate)
|
|
452 |
case "$COMP_CWORD" in
|
|
453 |
2)
|
|
454 |
# options or nodes
|
|
455 |
COMPREPLY=( $(compgen -W "--non-live $nlist" -- ${cur}) )
|
|
456 |
;;
|
|
457 |
3)
|
|
458 |
# if previous was option, we allow node
|
|
459 |
case "$prev" in
|
|
460 |
-*)
|
|
461 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
462 |
;;
|
|
463 |
esac
|
|
464 |
esac
|
|
465 |
esac
|
|
466 |
esac
|
|
467 |
|
|
468 |
return 0
|
|
469 |
}
|
|
470 |
|
|
471 |
complete -F _gnt_node gnt-node
|
|
472 |
|
|
473 |
# other tools
|
|
474 |
|
|
475 |
_gnt_tool_burnin()
|
|
476 |
{
|
|
477 |
local cur prev
|
|
478 |
cur="$2"
|
|
479 |
prev="$3"
|
|
480 |
|
|
481 |
# default completion is empty
|
|
482 |
COMPREPLY=()
|
|
483 |
|
|
484 |
if [[ ! -f "@LOCALSTATEDIR@/lib/ganeti/ssconf_cluster_name" ]]; then
|
|
485 |
# cluster not initialized
|
|
486 |
return 0
|
|
487 |
fi
|
|
488 |
|
|
489 |
nlist=$(< "@LOCALSTATEDIR@/lib/ganeti/ssconf_node_list")
|
|
490 |
|
|
491 |
case "$prev" in
|
|
492 |
-t)
|
|
493 |
COMPREPLY=( $(compgen -W "diskless file plain drbd" -- ${cur}) )
|
|
494 |
;;
|
|
495 |
--rename)
|
|
496 |
# this needs an unused host name, so we don't complete it
|
|
497 |
;;
|
|
498 |
-n|--nodes)
|
|
499 |
# nodes from the cluster, comma separated
|
|
500 |
# FIXME: make completion work for comma-separated values
|
|
501 |
COMPREPLY=( $(compgen -W "$nlist" -- ${cur}) )
|
|
502 |
;;
|
|
503 |
-o|--os)
|
|
504 |
# the os list
|
|
505 |
COMPREPLY=( $(compgen -W "$(gnt-os list --no-headers)" -- ${cur}) )
|
|
506 |
;;
|
|
507 |
--disk-size|--disk-growth)
|
|
508 |
# these take a number or unit, we can't really autocomplete, but
|
|
509 |
# we show a couple of examples
|
|
510 |
COMPREPLY=( $(compgen -W "128M 512M 1G 4G 1G,256M 4G,1G,1G 10G" -- \
|
|
511 |
${cur}) )
|
|
512 |
;;
|
|
513 |
--mem-size)
|
|
514 |
# this takes a number or unit, we can't really autocomplete, but
|
|
515 |
# we show a couple of examples
|
|
516 |
COMPREPLY=( $(compgen -W "128M 256M 512M 1G 4G 8G 12G 16G" -- ${cur}) )
|
|
517 |
;;
|
|
518 |
--net-timeout)
|
|
519 |
# this takes a number in seconds; again, we can't really complete
|
|
520 |
COMPREPLY=( $(compgen -W "15 60 300 900" -- ${cur}) )
|
|
521 |
;;
|
|
522 |
*)
|
|
523 |
# all other, we just list the whole options
|
|
524 |
COMPREPLY=( $(compgen -W "-o --disk-size --disk-growth --mem-size \
|
|
525 |
-v --verbose --no-replace1 --no-replace2 --no-failover \
|
|
526 |
--no-migrate --no-importexport --no-startstop \
|
|
527 |
--no-reinstall --no-reboot --no-activate-disks \
|
|
528 |
--no-add-disks --no-add-nics --no-nics \
|
|
529 |
--rename -t -n --nodes -I --iallocator -p --parallel \
|
|
530 |
--net-timeout -C --http-check -K --keep-instances" \
|
|
531 |
-- ${cur}) )
|
|
532 |
esac
|
|
533 |
|
|
534 |
return 0
|
|
535 |
}
|
|
536 |
|
|
537 |
complete -F _gnt_tool_burnin @PREFIX@/lib/ganeti/tools/burnin
|