Browse code

Add zsh completion for 'docker node' commands

Signed-off-by: Steve Durrheimer <s.durrheimer@gmail.com>

Steve Durrheimer authored on 2016/07/03 04:17:01
Showing 1 changed files
... ...
@@ -630,6 +630,224 @@ __docker_network_subcommand() {
630 630
     return ret
631 631
 }
632 632
 
633
+# BO node
634
+
635
+__docker_node_complete_ls_filters() {
636
+    [[ $PREFIX = -* ]] && return 1
637
+    integer ret=1
638
+
639
+    if compset -P '*='; then
640
+        case "${${words[-1]%=*}#*=}" in
641
+            (id)
642
+                __docker_complete_nodes_ids && ret=0
643
+                ;;
644
+            (membership)
645
+                membership_opts=('accepted' 'pending' 'rejected')
646
+                _describe -t membership-opts "membership options" membership_opts && ret=0
647
+                ;;
648
+            (name)
649
+                __docker_complete_nodes_names && ret=0
650
+                ;;
651
+            (role)
652
+                role_opts=('manager' 'worker')
653
+                _describe -t role-opts "role options" role_opts && ret=0
654
+                ;;
655
+            *)
656
+                _message 'value' && ret=0
657
+                ;;
658
+        esac
659
+    else
660
+        opts=('id' 'label' 'membership' 'name' 'role')
661
+        _describe -t filter-opts "filter options" opts -qS "=" && ret=0
662
+    fi
663
+
664
+    return ret
665
+}
666
+
667
+__docker_node_complete_tasks_filters() {
668
+    [[ $PREFIX = -* ]] && return 1
669
+    integer ret=1
670
+
671
+    if compset -P '*='; then
672
+        case "${${words[-1]%=*}#*=}" in
673
+            (desired-state)
674
+                state_opts=('accepted' 'running')
675
+                _describe -t state-opts "desired state options" state_opts && ret=0
676
+                ;;
677
+            *)
678
+                _message 'value' && ret=0
679
+                ;;
680
+        esac
681
+    else
682
+        opts=('desired-state' 'id' 'label' 'name')
683
+        _describe -t filter-opts "filter options" opts -qS "=" && ret=0
684
+    fi
685
+
686
+    return ret
687
+}
688
+
689
+__docker_nodes() {
690
+    [[ $PREFIX = -* ]] && return 1
691
+    integer ret=1
692
+    local line s
693
+    declare -a lines nodes args
694
+
695
+    type=$1; shift
696
+    filter=$1; shift
697
+    [[ $filter != "none") ]] && args=("-f $filter")
698
+
699
+    lines=(${(f)"$(_call_program commands docker $docker_options node ls $args)"})
700
+
701
+    # Parse header line to find columns
702
+    local i=1 j=1 k header=${lines[1]}
703
+    declare -A begin end
704
+    while (( j < ${#header} - 1 )); do
705
+        i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
706
+        j=$(( i + ${${header[$i,-1]}[(i)  ]} - 1 ))
707
+        k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
708
+        begin[${header[$i,$((j-1))]}]=$i
709
+        end[${header[$i,$((j-1))]}]=$k
710
+    done
711
+    end[${header[$i,$((j-1))]}]=-1
712
+    lines=(${lines[2,-1]})
713
+
714
+    # Node ID
715
+    if [[ $type = (ids|all) ]]; then
716
+        for line in $lines; do
717
+            s="${line[${begin[ID]},${end[ID]}]%% ##}"
718
+            nodes=($nodes $s)
719
+        done
720
+    fi
721
+
722
+    # Names
723
+    if [[ $type = (names|all) ]]; then
724
+        for line in $lines; do
725
+            s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
726
+            nodes=($nodes $s)
727
+        done
728
+    fi
729
+
730
+    _describe -t nodes-list "nodes" nodes "$@" && ret=0
731
+    return ret
732
+}
733
+
734
+__docker_complete_nodes() {
735
+    [[ $PREFIX = -* ]] && return 1
736
+    __docker_nodes all none "$@"
737
+}
738
+
739
+__docker_complete_nodes_ids() {
740
+    [[ $PREFIX = -* ]] && return 1
741
+    __docker_nodes ids none "$@"
742
+}
743
+
744
+__docker_complete_nodes_names() {
745
+    [[ $PREFIX = -* ]] && return 1
746
+    __docker_nodes names none "$@"
747
+}
748
+
749
+__docker_complete_pending_nodes() {
750
+    [[ $PREFIX = -* ]] && return 1
751
+    __docker_nodes all "membership=pending" "$@"
752
+}
753
+
754
+__docker_complete_manager_nodes() {
755
+    [[ $PREFIX = -* ]] && return 1
756
+    __docker_nodes all "role=manager" "$@"
757
+}
758
+
759
+__docker_complete_worker_nodes() {
760
+    [[ $PREFIX = -* ]] && return 1
761
+    __docker_nodes all "role=worker" "$@"
762
+}
763
+
764
+__docker_node_commands() {
765
+    local -a _docker_node_subcommands
766
+    _docker_node_subcommands=(
767
+        "accept:Accept a node in the swarm"
768
+        "demote:Demote a node as manager in the swarm"
769
+        "inspect:Display detailed information on one or more nodes"
770
+        "ls:List nodes in the swarm"
771
+        "promote:Promote a node as manager in the swarm"
772
+        "rm:Remove a node from the swarm"
773
+        "tasks:List tasks running on a node"
774
+        "update:Update a node"
775
+    )
776
+    _describe -t docker-node-commands "docker node command" _docker_node_subcommands
777
+}
778
+
779
+__docker_node_subcommand() {
780
+    local -a _command_args opts_help
781
+    local expl help="--help"
782
+    integer ret=1
783
+
784
+    opts_help=("(: -)--help[Print usage]")
785
+
786
+    case "$words[1]" in
787
+        (accept|rm|remove)
788
+             _arguments $(__docker_arguments) \
789
+                $opts_help \
790
+                "($help -)*:node:__docker_complete_pending_nodes" && ret=0
791
+            ;;
792
+        (demote)
793
+             _arguments $(__docker_arguments) \
794
+                $opts_help \
795
+                "($help -)*:node:__docker_complete_manager_nodes" && ret=0
796
+            ;;
797
+        (inspect)
798
+            _arguments $(__docker_arguments) \
799
+                $opts_help \
800
+                "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
801
+                "($help -p --pretty)"{-p,--pretty}"[Print the information in a human friendly format]" \
802
+                "($help -)*:node:__docker_complete_nodes" && ret=0
803
+            ;;
804
+        (ls|list)
805
+            _arguments $(__docker_arguments) \
806
+                $opts_help \
807
+                "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \
808
+                "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
809
+            case $state in
810
+                (filter-options)
811
+                    __docker_node_complete_ls_filters && ret=0
812
+                    ;;
813
+            esac
814
+            ;;
815
+        (promote)
816
+             _arguments $(__docker_arguments) \
817
+                $opts_help \
818
+                "($help -)*:node:__docker_complete_worker_nodes" && ret=0
819
+            ;;
820
+        (tasks)
821
+            _arguments $(__docker_arguments) \
822
+                $opts_help \
823
+                "($help -a --all)"{-a,--all}"[Display all instances]" \
824
+                "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \
825
+                "($help -n --no-resolve)"{-n,--no-resolve}"[Do not map IDs to Names]" \
826
+                "($help -)1:node:__docker_complete_nodes" && ret=0
827
+            case $state in
828
+                (filter-options)
829
+                    __docker_node_complete_tasks_filters && ret=0
830
+                    ;;
831
+            esac
832
+            ;;
833
+        (update)
834
+            _arguments $(__docker_arguments) \
835
+                $opts_help \
836
+                "($help)--availability=[Availability of the node]:availability:(active pause drain)" \
837
+                "($help)--membership=[Membership of the node]:membership:(accepted rejected)" \
838
+                "($help)--role=[Role of the node]:role:(manager worker)" \
839
+                "($help -)1:node:__docker_complete_nodes" && ret=0
840
+            ;;
841
+        (help)
842
+            _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0
843
+            ;;
844
+    esac
845
+
846
+    return ret
847
+}
848
+
849
+# EO node
850
+
633 851
 __docker_volume_complete_ls_filters() {
634 852
     [[ $PREFIX = -* ]] && return 1
635 853
     integer ret=1
... ...
@@ -1162,6 +1380,23 @@ __docker_subcommand() {
1162 1162
                     ;;
1163 1163
             esac
1164 1164
             ;;
1165
+        (node)
1166
+            local curcontext="$curcontext" state
1167
+            _arguments $(__docker_arguments) \
1168
+                $opts_help \
1169
+                "($help -): :->command" \
1170
+                "($help -)*:: :->option-or-argument" && ret=0
1171
+
1172
+            case $state in
1173
+                (command)
1174
+                    __docker_node_commands && ret=0
1175
+                    ;;
1176
+                (option-or-argument)
1177
+                    curcontext=${curcontext%:*:*}:docker-${words[-1]}:
1178
+                    __docker_node_subcommand && ret=0
1179
+                    ;;
1180
+            esac
1181
+            ;;
1165 1182
         (pause|unpause)
1166 1183
             _arguments $(__docker_arguments) \
1167 1184
                 $opts_help \