Browse code

Add zsh completion for 'docker service' commands

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

Steve Durrheimer authored on 2016/07/03 07:09:34
Showing 1 changed files
... ...
@@ -936,6 +936,238 @@ __docker_plugin_subcommand() {
936 936
 
937 937
 # EO plugin
938 938
 
939
+# BO service
940
+
941
+__docker_service_complete_ls_filters() {
942
+    [[ $PREFIX = -* ]] && return 1
943
+    integer ret=1
944
+
945
+    if compset -P '*='; then
946
+        case "${${words[-1]%=*}#*=}" in
947
+            (id)
948
+                __docker_complete_services_ids && ret=0
949
+                ;;
950
+            (name)
951
+                __docker_complete_services_names && ret=0
952
+                ;;
953
+            *)
954
+                _message 'value' && ret=0
955
+                ;;
956
+        esac
957
+    else
958
+        opts=('id' 'label' 'name')
959
+        _describe -t filter-opts "filter options" opts -qS "=" && ret=0
960
+    fi
961
+
962
+    return ret
963
+}
964
+
965
+__docker_service_complete_tasks_filters() {
966
+    [[ $PREFIX = -* ]] && return 1
967
+    integer ret=1
968
+
969
+    if compset -P '*='; then
970
+        case "${${words[-1]%=*}#*=}" in
971
+            (desired-state)
972
+                state_opts=('accepted' 'running')
973
+                _describe -t state-opts "desired state options" state_opts && ret=0
974
+                ;;
975
+            *)
976
+                _message 'value' && ret=0
977
+                ;;
978
+        esac
979
+    else
980
+        opts=('desired-state' 'id' 'label' 'name')
981
+        _describe -t filter-opts "filter options" opts -qS "=" && ret=0
982
+    fi
983
+
984
+    return ret
985
+}
986
+
987
+__docker_services() {
988
+    [[ $PREFIX = -* ]] && return 1
989
+    integer ret=1
990
+    local line s
991
+    declare -a lines services
992
+
993
+    type=$1; shift
994
+
995
+    lines=(${(f)"$(_call_program commands docker $docker_options service ls)"})
996
+
997
+    # Parse header line to find columns
998
+    local i=1 j=1 k header=${lines[1]}
999
+    declare -A begin end
1000
+    while (( j < ${#header} - 1 )); do
1001
+        i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1002
+        j=$(( i + ${${header[$i,-1]}[(i)  ]} - 1 ))
1003
+        k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1004
+        begin[${header[$i,$((j-1))]}]=$i
1005
+        end[${header[$i,$((j-1))]}]=$k
1006
+    done
1007
+    end[${header[$i,$((j-1))]}]=-1
1008
+    lines=(${lines[2,-1]})
1009
+
1010
+    # Service ID
1011
+    if [[ $type = (ids|all) ]]; then
1012
+        for line in $lines; do
1013
+            s="${line[${begin[ID]},${end[ID]}]%% ##}"
1014
+            s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
1015
+            services=($services $s)
1016
+        done
1017
+    fi
1018
+
1019
+    # Names
1020
+    if [[ $type = (names|all) ]]; then
1021
+        for line in $lines; do
1022
+            s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
1023
+            s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
1024
+            services=($services $s)
1025
+        done
1026
+    fi
1027
+
1028
+    _describe -t services-list "services" services "$@" && ret=0
1029
+    return ret
1030
+}
1031
+
1032
+__docker_complete_services() {
1033
+    [[ $PREFIX = -* ]] && return 1
1034
+    __docker_services all "$@"
1035
+}
1036
+
1037
+__docker_complete_services_ids() {
1038
+    [[ $PREFIX = -* ]] && return 1
1039
+    __docker_services ids "$@"
1040
+}
1041
+
1042
+__docker_complete_services_names() {
1043
+    [[ $PREFIX = -* ]] && return 1
1044
+    __docker_services names "$@"
1045
+}
1046
+
1047
+__docker_service_commands() {
1048
+    local -a _docker_service_subcommands
1049
+    _docker_service_subcommands=(
1050
+        "create:Create a new service"
1051
+        "inspect:Display detailed information on one or more services"
1052
+        "ls:List services"
1053
+        "rm:Remove a service"
1054
+        "scale:Scale one or multiple services"
1055
+        "tasks:List the tasks of a service"
1056
+        "update:Update a service"
1057
+    )
1058
+    _describe -t docker-service-commands "docker service command" _docker_service_subcommands
1059
+}
1060
+
1061
+__docker_service_subcommand() {
1062
+    local -a _command_args opts_help opts_create_update
1063
+    local expl help="--help"
1064
+    integer ret=1
1065
+
1066
+    opts_help=("(: -)--help[Print usage]")
1067
+    opts_create_update=(
1068
+        "($help)*--constraint=[Placement constraints]:constraint: "
1069
+        "($help)--endpoint-mode=[Placement constraints]:mode:(VIP DNSRR)"
1070
+        "($help)*"{-e=,--env=}"[Set environment variables]:env: "
1071
+        "($help)*--label=[Service labels]:label: "
1072
+        "($help)--limit-cpu=[Limit CPUs]:value: "
1073
+        "($help)--limit-memory=[Limit Memory]:value: "
1074
+        "($help)--mode=[Limit Memory]:mode:(global replicated)"
1075
+        "($help)*"{-m=,--mount=}"[Attach a mount to the service]:mount: "
1076
+        "($help)--name=[Service name]:name: "
1077
+        "($help)*--network=[Network attachments]:network: "
1078
+        "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: "
1079
+        "($help)--replicas=[Number of tasks]:replicas: "
1080
+        "($help)--reserve-cpu=[Reserve CPUs]:value: "
1081
+        "($help)--reserve-memory=[Reserve Memory]:value: "
1082
+        "($help)--restart-condition=[Restart when condition is met]:mode:(any none on_failure)"
1083
+        "($help)--restart-delay=[Delay between restart attempts]:delay: "
1084
+        "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: "
1085
+        "($help)--restart-window=[Window used to evaluate the restart policy]:window: "
1086
+        "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: "
1087
+        "($help)--update-delay=[Delay between updates]:delay: "
1088
+        "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: "
1089
+        "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
1090
+        "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
1091
+    )
1092
+
1093
+    case "$words[1]" in
1094
+        (create)
1095
+            _arguments $(__docker_arguments) \
1096
+                $opts_help \
1097
+                $opts_create_update \
1098
+                "($help -): :__docker_images" \
1099
+                "($help -):command: _command_names -e" \
1100
+                "($help -)*::arguments: _normal" && ret=0
1101
+            ;;
1102
+        (inspect)
1103
+            _arguments $(__docker_arguments) \
1104
+                $opts_help \
1105
+                "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
1106
+                "($help -p --pretty)"{-p,--pretty}"[Print the information in a human friendly format]" \
1107
+                "($help -)*:service:__docker_complete_services" && ret=0
1108
+            ;;
1109
+        (ls|list)
1110
+            _arguments $(__docker_arguments) \
1111
+                $opts_help \
1112
+                "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:->filter-options" \
1113
+                "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
1114
+            case $state in
1115
+                (filter-options)
1116
+                    __docker_service_complete_ls_filters && ret=0
1117
+                    ;;
1118
+            esac
1119
+            ;;
1120
+        (rm|remove)
1121
+            _arguments $(__docker_arguments) \
1122
+                $opts_help \
1123
+                "($help -)*:service:__docker_complete_services" && ret=0
1124
+            ;;
1125
+        (scale)
1126
+            _arguments $(__docker_arguments) \
1127
+                $opts_help \
1128
+                "($help -)*:service:->values" && ret=0
1129
+            case $state in
1130
+                (values)
1131
+                    if compset -P '*='; then
1132
+                        _message 'replicas' && ret=0
1133
+                    else
1134
+                        __docker_complete_services -qS "="
1135
+                    fi
1136
+                    ;;
1137
+            esac
1138
+            ;;
1139
+        (tasks)
1140
+            _arguments $(__docker_arguments) \
1141
+                $opts_help \
1142
+                "($help -a --all)"{-a,--all}"[Display all tasks]" \
1143
+                "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \
1144
+                "($help -n --no-resolve)"{-n,--no-resolve}"[Do not map IDs to Names]" \
1145
+                "($help -)1:service:__docker_complete_services" && ret=0
1146
+            case $state in
1147
+                (filter-options)
1148
+                    __docker_service_complete_tasks_filters && ret=0
1149
+                    ;;
1150
+            esac
1151
+            ;;
1152
+        (update)
1153
+            _arguments $(__docker_arguments) \
1154
+                $opts_help \
1155
+                $opts_create_update \
1156
+                "($help)--arg=[Service command args]:arguments: _normal" \
1157
+                "($help)--command=[Service command]:command: _command_names -e" \
1158
+                "($help)--image=[Service image tag]:image:__docker_repositories" \
1159
+                "($help -)1:service:__docker_complete_services" && ret=0
1160
+            ;;
1161
+        (help)
1162
+            _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0
1163
+            ;;
1164
+    esac
1165
+
1166
+    return ret
1167
+}
1168
+
1169
+# EO service
1170
+
939 1171
 # BO swarm
940 1172
 
941 1173
 __docker_swarm_commands() {
... ...
@@ -1707,6 +1939,23 @@ __docker_subcommand() {
1707 1707
                     ;;
1708 1708
             esac
1709 1709
             ;;
1710
+        (service)
1711
+            local curcontext="$curcontext" state
1712
+            _arguments $(__docker_arguments) \
1713
+                $opts_help \
1714
+                "($help -): :->command" \
1715
+                "($help -)*:: :->option-or-argument" && ret=0
1716
+
1717
+            case $state in
1718
+                (command)
1719
+                    __docker_service_commands && ret=0
1720
+                    ;;
1721
+                (option-or-argument)
1722
+                    curcontext=${curcontext%:*:*}:docker-${words[-1]}:
1723
+                    __docker_service_subcommand && ret=0
1724
+                    ;;
1725
+            esac
1726
+            ;;
1710 1727
         (start)
1711 1728
             _arguments $(__docker_arguments) \
1712 1729
                 $opts_help \