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