OSDN Git Service

fix the bug (#372)
[bytom/vapor.git] / docker / vapord / deploy.sh
1 #!/bin/bash
2
3 set -e
4
5 usage() {
6 cat << EOF
7 bash deploy.sh operation [options]
8 operation
9     --build=num : build node images only
10     
11     --run=image1,image2,...: run selected node images
12     
13     --run-all: run all node images
14     
15     --scale=num: build and run multiple node images
16
17     --list: list all node images
18
19     --remove=image1,image2,...: remove selected node images
20
21     --remove-all: remove all node images
22
23     --help: print usage message
24 EOF
25 }
26
27 get_pubkey() {
28    docker run --rm -it --entrypoint cat $1 /usr/local/vapord/node_pubkey.txt 
29 }
30
31 # text colors
32 RED='\033[0;31m'
33 GREEN='\033[0;32m'
34 CYAN='\033[0;36m'
35 NC='\033[0m' # No Color
36
37 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
38 DOCKER_DIR=~/vapord
39
40 mkdir -p ${DOCKER_DIR}
41
42 # node and image names are PREFIX-pubkey[0:6]
43 NODE_PREFIX=vapord
44 IMG_PREFIX=vapord_test
45 WALLET_PORT_BEGIN=9889
46
47 ############## process commandline options ###############
48 # num of nodes
49 scale=1
50 # operation: build, run, run-all, all, list, remove, remove-all help
51 op="all"
52
53 for i in "$@"
54 do
55 case $i in
56     --scale=*)
57         op="all"
58         scale="${i#*=}"
59         shift # past argument=value
60         ;;
61     --build=*)
62         op="build"
63         scale="${i#*=}"
64         shift # past argument=value
65         ;;
66     --run=*)
67         op="run"
68         op_arg="${i#*=}"
69         shift # past argument=value
70         ;;
71     --run-all)
72         op="run-all"
73         shift
74         ;;
75     --rm=*)
76         op="remove"
77         op_arg="${i#*=}"
78         shift # past argument=value
79         ;;
80     --rm-all)
81         op="remove-all"
82         shift
83         ;;
84     --list)
85         op="list"
86         shift
87         ;;
88     --down)
89         op="down"
90         shift
91         ;;
92     --help)
93         op="help"
94         shift # past argument with no value
95         ;;
96     *)
97         echo "unknown option $i"
98         usage
99         exit 1
100         ;;
101 esac
102 done
103
104 echo "options: scale:${scale}, op:${op} op_arg:${op_arg}"
105
106 if [ "${op}" == "help" ]; then
107     usage
108     exit
109 fi
110
111 if [ "${op}" == "down" ]; then
112     docker-compose -f ${DOCKER_DIR}/docker-compose.yml down
113     exit
114 fi
115
116 if [ -z "${scale}" ]; then
117     echo "please specify number of nodes to spawn."
118     usage
119     exit 1
120 elif [ "${scale}" -lt 1 ]; then
121     echo "number of nodes must be greater than 0"
122     usage
123     exit 1
124 fi
125
126 key_array=()
127 node_array=()
128 img_array=()
129
130 ############## remove images ################
131 if [ "${op}" == "remove-all" ]; then
132     echo -e "${GREEN}removing all node images${NC}"
133     docker rmi $(docker images --filter=reference="${IMG_PREFIX}-*:*" -q)
134     exit
135 elif [ "${op}" == "remove" ]; then
136     if [ -z "${op_arg}" ]; then
137         echo -e "${RED}must specify which image(s) to remove${NC}"
138         exit 1
139     fi
140     IFS=',' read -r -a img_array <<< "${op_arg}"
141     for img in "${img_array[@]}"; do
142         if [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
143             echo -e "${GREEN}removing image ${img}${NC}"
144             docker rmi $img
145         else
146             echo -e "${RED}invalid image name ${img}${NC}"
147         fi
148     done
149     exit
150 fi
151
152 ############### list images ################
153 if [ "${op}" == "list" ]; then
154     echo -e "${GREEN}list all node images${NC}"
155     docker images --filter=reference="${IMG_PREFIX}-*:*"
156     echo
157     printf "${CYAN}image name\t\tpublic key${NC}\n"
158     img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
159     for img in "${img_array[@]}"; do
160         pubkey=$( get_pubkey ${img} )
161         if [ -z "${pubkey}" ]; then
162             echo -e "${RED}failed to get public key${NC} for node ${img}"
163             exit
164         fi
165         printf "${img}\t${pubkey}\n"
166     done
167     exit
168 fi
169
170 ############### build images ################
171 if [[ "${op}" == "build" || "${op}" == "all" ]]; then
172 for ((i = 1 ; i <= ${scale} ; i++)); do
173     echo -e "${GREEN}building docker image for node #${i}${NC}"
174     docker build --rm -t vapord_tmp . -f ${SCRIPT_DIR}/vapord.Dockerfile
175     # /usr/local/vapord/node_pubkey.txt is the location storing pub_key of node defined in dockerfile
176     pubkey=$( get_pubkey vapord_tmp )
177     if [ -z "${pubkey}" ]; then
178         echo -e "${RED}failed to get public key${NC} for node ${i}"
179         exit
180     fi
181     node_tag=`echo "${pubkey}" | cut -c1-6`
182     img=${IMG_PREFIX}-${node_tag}
183     docker tag vapord_tmp ${img}:latest
184     docker rmi vapord_tmp
185     docker image prune -f --filter label=stage=vapord_builder > /dev/null
186     key_array+=(${pubkey})
187     node_array+=(${NODE_PREFIX}-${node_tag})
188     img_array+=(${img})
189 done
190 fi
191
192 ############### generate docker-compose.yml for the network ###############
193 if [ "${op}" == "run" ]; then
194     if [ -z "${op_arg}" ]; then
195         echo -e "${RED}must specify which image(s) to run${NC}"
196         exit 1
197     fi
198     img_array=()
199     node_array=()
200     IFS=',' read -r -a img_array <<< "${op_arg}"
201     for img in "${img_array[@]}"; do
202         if ! [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
203             echo -e "${RED}invalid image name ${img}${NC}"
204             exit 1
205         fi
206         if [[ "$(docker images -q ${img}:latest 2> /dev/null)" == "" ]]; then
207             echo -e "${RED}image ${img}:latest does not exist${NC}"
208             exit 1
209         fi
210         hash=`echo ${img} | cut -d- -f 2`
211         node_array+=(${NODE_PREFIX}-${hash})
212     
213         pubkey=$( get_pubkey ${img} )
214         if [ -z "${pubkey}" ]; then
215             echo -e "${RED}failed to get public key${NC} for node ${img}"
216             exit
217         fi
218         key_array+=(${pubkey})
219     done
220 elif [ "${op}" == "run-all" ]; then
221     img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
222     for img in "${img_array[@]}"; do
223         hash=`echo ${img} | cut -d- -f 2`
224         node_array+=(${NODE_PREFIX}-${hash})
225         
226         pubkey=$( get_pubkey ${img} )
227         if [ -z "${pubkey}" ]; then
228             echo -e "${RED}failed to get public key${NC} for node ${img}"
229             exit
230         fi
231         key_array+=(${pubkey})
232     done
233 fi
234
235 printf "${CYAN}image name\t\tnode name\tpublic key${NC}\n"
236
237 for id in "${!img_array[@]}"; do
238     node=${node_array[id]}
239     img=${img_array[id]}
240     pubkey=${key_array[id]}
241     printf "${img}\t${node}\t${pubkey}\n"
242 done
243
244 if [ "${op}" == "build" ]; then
245     exit
246 fi
247
248 echo "### DO NOT MODIFY. THIS FILE IS AUTO GEN FROM deploy.sh ###" > ${DOCKER_DIR}/docker-compose.yml 
249 echo "version: '2'" >> ${DOCKER_DIR}/docker-compose.yml
250 echo "services:" >> ${DOCKER_DIR}/docker-compose.yml
251
252 for id in "${!img_array[@]}"; do
253     node=${node_array[id]}
254     img=${img_array[id]}
255     echo -e "${GREEN}setup service for node ${node}${NC}"
256     name=${node} image=${img}:latest port=$(( id + WALLET_PORT_BEGIN )) envsubst '${name} ${image} ${port}' < ${SCRIPT_DIR}/docker-compose.yml.tpl >> ${DOCKER_DIR}/docker-compose.yml
257     echo >> ${DOCKER_DIR}/docker-compose.yml 
258 done
259
260 ############### start network ###############
261 echo -e "${GREEN}network up...${NC}"
262 docker-compose -f ${DOCKER_DIR}/docker-compose.yml up -d