blob: 9ab7f9130513b4d6698af32d63e1df2dae3fd9e4 [file] [log] [blame]
Naoki Shiota4e463182014-03-21 15:13:24 -07001#!/bin/bash
Naoki Shiota4e463182014-03-21 15:13:24 -07002
Naoki Shiota590c18d2014-03-31 17:52:59 -07003### Env vars used by this script. (default value) ###
4# $ONOS_HOME : path of root directory of ONOS repository (this script's dir)
5# $ONOS_CONF_DIR : path of ONOS config directory (~/ONOS/conf)
6# $ONOS_CONF : path of ONOS node config file (~/ONOS/conf/onos_node.conf)
7# $ONOS_PROPS : path of ONOS properties file (~/ONOS/conf/onos.properties)
8# $ONOS_LOGBACK : path of logback config file (~/ONOS/conf/logback.`hostname`.xml)
9# $LOGDIR : path of log output directory (~/ONOS/onos-logs)
10# $LOGBASE : base name of log output file (onos.`hostname`)
11# $RAMCLOUD_HOME : path of root directory of RAMCloud repository (~/ramcloud)
12# $RAMCLOUD_BRANCH : branch name of RAMCloud to use (master)
Naoki Shiota72209722014-04-08 14:32:17 -070013# $ZK_HOME : path of root directory of ZooKeeper (~/zookeeper-3.4.5)
14# $ZK_LIB_DIR : path of ZooKeeper library (/var/lib/zookeeper)
Naoki Shiota590c18d2014-03-31 17:52:59 -070015# $JVM_OPTS : JVM options ONOS starts with
16#####################################################
17
18
Naoki Shiota4e928512014-04-03 15:49:35 -070019# read-conf {filename} {parameter name} [default value]
20function read-conf {
21 local value=`grep ^${2} ${1} | cut -d "=" -f 2 | sed -e 's/^[ \t]*//'`
22 if [ -z "${value}" ]; then
23 echo $3
24 else
25 echo ${value}
26 fi
27}
28
Naoki Shiota590c18d2014-03-31 17:52:59 -070029ONOS_HOME=${ONOS_HOME:-$(cd `dirname $0`; pwd)}
Naoki Shiota9df15d32014-03-27 14:26:20 -070030ONOS_CONF_DIR=${ONOS_CONF_DIR:-${ONOS_HOME}/conf}
Naoki Shiota590c18d2014-03-31 17:52:59 -070031ONOS_CONF=${ONOS_CONF:-${ONOS_CONF_DIR}/onos_node.conf}
32
33if [ ! -f ${ONOS_CONF} ]; then
34 echo "${ONOS_CONF} not found."
35 exit 1
36fi
Naoki Shiota4e928512014-04-03 15:49:35 -070037
38
39### Variables read from ONOS config file ###
40ONOS_HOST_NAME=$(read-conf ${ONOS_CONF} host.name `hostname`)
41ONOS_HOST_IP=$(read-conf ${ONOS_CONF} host.ip)
42ONOS_HOST_ROLE=$(read-conf ${ONOS_CONF} host.role)
43ONOS_HOST_BACKEND=$(read-conf ${ONOS_CONF} host.backend)
44ZK_HOSTS=$(read-conf ${ONOS_CONF} zookeeper.hosts ${ONOS_HOST_NAME})
45RC_COORD_PROTOCOL=$(read-conf ${ONOS_CONF} ramcloud.coordinator.protocol "fast+udp")
46RC_COORD_IP=$(read-conf ${ONOS_CONF} ramcloud.coordinator.ip ${ONOS_HOST_IP})
47RC_COORD_PORT=$(read-conf ${ONOS_CONF} ramcloud.coordinator.port 12246)
48RC_SERVER_PROTOCOL=$(read-conf ${ONOS_CONF} ramcloud.server.protocol "fast+udp")
49RC_SERVER_IP=$(read-conf ${ONOS_CONF} ramcloud.server.ip ${ONOS_HOST_IP})
50RC_SERVER_PORT=$(read-conf ${ONOS_CONF} ramcloud.server.port 12242)
51HC_TCPIP_MEMBERS=$(read-conf ${ONOS_CONF} hazelcast.tcp-ip.members)
52HC_MULTICAST_GROUP=$(read-conf ${ONOS_CONF} hazelcast.multicast.group "224.2.2.3")
53HC_MULTICAST_PORT=$(read-conf ${ONOS_CONF} hazelcast.multicast.port 54327)
Naoki Shiota590c18d2014-03-31 17:52:59 -070054############################################
55
56
57############## Other variables #############
Naoki Shiota4e928512014-04-03 15:49:35 -070058ONOS_TEMPLATE_DIR=${ONOS_CONF_DIR}/template
59
Naoki Shiota4e463182014-03-21 15:13:24 -070060LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
61
Naoki Shiota72209722014-04-08 14:32:17 -070062ZK_HOME=${ZK_HOME:-~/zookeeper-3.4.5}
Naoki Shiota9df15d32014-03-27 14:26:20 -070063ZK_CONF_FILE=zoo.cfg
64ZK_CONF=${ONOS_CONF_DIR}/${ZK_CONF_FILE}
Naoki Shiota4e928512014-04-03 15:49:35 -070065ZK_CONF_TEMPLATE=${ONOS_TEMPLATE_DIR}/zoo.cfg.template
66ZK_LOG_DIR=${ONOS_HOME}/onos-logs
Naoki Shiota72209722014-04-08 14:32:17 -070067ZK_LIB_DIR=${ZK_LIB_DIR:-/var/lib/zookeeper}
Naoki Shiota9df15d32014-03-27 14:26:20 -070068ZK_MY_ID=${ZK_LIB_DIR}/myid
Naoki Shiota4e463182014-03-21 15:13:24 -070069
Naoki Shiota4e928512014-04-03 15:49:35 -070070HC_CONF=${ONOS_CONF_DIR}/hazelcast.xml
71HC_CONF_TEMPLATE=${ONOS_TEMPLATE_DIR}/hazelcast.xml.template
72
Naoki Shiota4e463182014-03-21 15:13:24 -070073RAMCLOUD_HOME=${RAMCLOUD_HOME:-~/ramcloud}
Naoki Shiota590c18d2014-03-31 17:52:59 -070074RAMCLOUD_COORD_LOG=${LOGDIR}/ramcloud.coordinator.${ONOS_HOST_NAME}.log
75RAMCLOUD_SERVER_LOG=${LOGDIR}/ramcloud.server.${ONOS_HOST_NAME}.log
Naoki Shiota4e463182014-03-21 15:13:24 -070076RAMCLOUD_BRANCH=${RAMCLOUD_BRANCH:-master}
77
78export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${ONOS_HOME}/lib:${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}
79
80## Because the script change dir to $ONOS_HOME, we can set ONOS_LOGBACK and LOGDIR relative to $ONOS_HOME
Naoki Shiota590c18d2014-03-31 17:52:59 -070081ONOS_LOGBACK=${ONOS_LOGBACK:-${ONOS_CONF_DIR}/logback.${ONOS_HOST_NAME}.xml}
Naoki Shiota9df15d32014-03-27 14:26:20 -070082ONOS_LOGBACK_BACKUP=${ONOS_LOGBACK}.bak
Naoki Shiota4e928512014-04-03 15:49:35 -070083ONOS_LOGBACK_TEMPLATE=${ONOS_TEMPLATE_DIR}/logback.xml.template
Naoki Shiota4e463182014-03-21 15:13:24 -070084LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
Naoki Shiota590c18d2014-03-31 17:52:59 -070085LOGBASE=${ONOS_LOGBASE:-onos.${ONOS_HOST_NAME}}
Naoki Shiota4e463182014-03-21 15:13:24 -070086ONOS_LOG="${LOGDIR}/${LOGBASE}.log"
87PCAP_LOG="${LOGDIR}/${LOGBASE}.pcap"
88LOGS="$ONOS_LOG $PCAP_LOG"
89
Naoki Shiota9df15d32014-03-27 14:26:20 -070090ONOS_PROPS=${ONOS_PROPS:-${ONOS_CONF_DIR}/onos.properties}
Naoki Shiota4e463182014-03-21 15:13:24 -070091JMX_PORT=${JMX_PORT:-7189}
92
93# Set JVM options
94JVM_OPTS="${JVM_OPTS:-}"
Naoki Shiota4e463182014-03-21 15:13:24 -070095JVM_OPTS="$JVM_OPTS -server -d64"
96#JVM_OPTS="$JVM_OPTS -XX:+TieredCompilation -XX:InitialCodeCacheSize=512m -XX:ReservedCodeCacheSize=512m"
Yuta HIGUCHI18354592014-04-01 13:53:42 -070097
98# Uncomment or specify appropriate value as JVM_OPTS environment variables.
99#JVM_OPTS="$JVM_OPTS -Xmx4g -Xms4g -Xmn800m"
Naoki Shiota4e463182014-03-21 15:13:24 -0700100#JVM_OPTS="$JVM_OPTS -Xmx2g -Xms2g -Xmn800m"
101#JVM_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn800m"
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700102
103#JVM_OPTS="$JVM_OPTS -XX:+UseParallelGC"
104JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
105JVM_OPTS="$JVM_OPTS -XX:+AggressiveOpts"
106
107# We may want to remove UseFastAccessorMethods option: http://bugs.java.com/view_bug.do?bug_id=6385687
108JVM_OPTS="$JVM_OPTS -XX:+UseFastAccessorMethods"
109
110JVM_OPTS="$JVM_OPTS -XX:MaxInlineSize=8192"
111JVM_OPTS="$JVM_OPTS -XX:FreqInlineSize=8192"
112JVM_OPTS="$JVM_OPTS -XX:CompileThreshold=1500"
113
Naoki Shiota4e463182014-03-21 15:13:24 -0700114JVM_OPTS="$JVM_OPTS -XX:OnError=crash-logger" ;# For dumping core
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700115
116# Workaround for Thread Priority http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html
117JVM_OPTS="$JVM_OPTS -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42"
118
119JVM_OPTS="$JVM_OPTS -XX:+UseCompressedOops"
120
121JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT"
122JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
123JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
124
Naoki Shiota4e463182014-03-21 15:13:24 -0700125JVM_OPTS="$JVM_OPTS -Dhazelcast.logging.type=slf4j"
126
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700127# Uncomment to dump final JVM flags to stdout
128#JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"
129
Naoki Shiota4e463182014-03-21 15:13:24 -0700130# Set ONOS core main class
Jonathan Hart51f6f5b2014-04-03 10:32:10 -0700131MAIN_CLASS="net.onrc.onos.core.main.Main"
Naoki Shiota4e463182014-03-21 15:13:24 -0700132
133MVN=${MVN:-mvn -o}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700134############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700135
Naoki Shiota9df15d32014-03-27 14:26:20 -0700136
Naoki Shiota590c18d2014-03-31 17:52:59 -0700137############# Common functions #############
138function print_usage {
139 local filename=`basename ${ONOS_CONF}`
140 local usage="Usage: setup/start/stop ONOS on this server.
141 \$ $0 setup [-f]
142 Set up ONOS node using ${filename}.
143 - generate and replace config file of ZooKeeper.
144 - create myid in ZooKeeper datadir.
145 - generate and replace logback.${ONOS_HOST_NAME}.xml
146 If -f option is used, all existing files will be overwritten without confirmation.
147 \$ $0 start [single-node|coord-node|server-node|coord-and-server-node]
148 Start ONOS node with specific RAMCloud entities
149 - single-node: start ONOS with stand-alone RAMCloud
150 - coord-node : start ONOS with RAMCloud coordinator
151 - server-node: start ONOS with RAMCloud server
152 - coord-and-server-node: start ONOS with RAMCloud coordinator and server
153 * Default behavior can be defined by ${filename}
154 \$ $0 stop
155 Stop all ONOS-related processes
156 \$ $0 restart
157 Stop and start currently running ONOS-related processes
158 \$$0 status
159 Show status of ONOS-related processes
160 \$ $0 {zk|rc-coord|rc-server|core} {start|stop|restart|status}
161 Control specific ONOS-related process"
162
163 echo "${usage}"
Naoki Shiota4e463182014-03-21 15:13:24 -0700164}
165
166function rotate-log {
Naoki Shiota4e928512014-04-03 15:49:35 -0700167 local logfile=$1
168 local nr_max=${2:-10}
169 if [ -f $logfile ]; then
170 for i in `seq $(expr $nr_max - 1) -1 1`; do
171 if [ -f ${logfile}.${i} ]; then
172 mv -f ${logfile}.${i} ${logfile}.`expr $i + 1`
173 fi
174 done
175 mv $logfile $logfile.1
176 fi
Naoki Shiota4e463182014-03-21 15:13:24 -0700177}
178
179# kill-processes {module-name} {array of pids}
180function kill-processes {
181 # Kill the existing processes
182 local pids=$2
Naoki Shiota9df15d32014-03-27 14:26:20 -0700183 if [ ! -z "$pids" ]; then
Naoki Shiota4e463182014-03-21 15:13:24 -0700184 echo -n "Stopping $1 ... "
185 fi
186 for p in ${pids}; do
187 if [ x$p != "x" ]; then
188 kill -KILL $p
189 echo "Killed existing process (pid: $p)"
190 fi
191 done
192}
193
Naoki Shiota4e928512014-04-03 15:49:35 -0700194# revert-file {filename}
195# revert "filename" from "filename.bak" if "filename.tmp" exists.
196function revert-file {
197 local filename=$1
198 local temp="${filename}.tmp"
199 local backup="${filename}.bak"
200
201 if [ -f "${temp}" ]; then
202 echo -n "reverting ${filename} ... "
203 mv ${backup} ${filename}
204 rm ${temp}
205 echo "DONE"
206 fi
207}
208
209# revert-confs [error message]
210function revert-confs {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700211 set -e
212
213 echo -n "ERROR occurred ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700214
Naoki Shiota4e928512014-04-03 15:49:35 -0700215 revert-file `basename ${ZK_CONF}`
216 revert-file `basename ${HC_CONF}`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700217
218 echo "EXIT"
219
220 if [ ! -z "$1" ]; then
221 echo $1
222 fi
223
224 set +e
225
226 exit 1
227}
228
Naoki Shiota590c18d2014-03-31 17:52:59 -0700229function create-zk-conf {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700230 echo -n "Creating ${ZK_CONF} ... "
231
Naoki Shiota590c18d2014-03-31 17:52:59 -0700232 # creation of zookeeper config
Naoki Shiota9df15d32014-03-27 14:26:20 -0700233
Naoki Shiota590c18d2014-03-31 17:52:59 -0700234 local temp_zk="${ZK_CONF}.tmp"
Naoki Shiota4e928512014-04-03 15:49:35 -0700235 if [ -f ${temp_zk} ]; then
236 rm ${temp_zk}
237 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700238 touch ${temp_zk}
Naoki Shiota4e928512014-04-03 15:49:35 -0700239
Naoki Shiota9df15d32014-03-27 14:26:20 -0700240 if [ -f ${ZK_CONF} ]; then
Naoki Shiota4e928512014-04-03 15:49:35 -0700241 mv ${ZK_CONF} ${ZK_CONF}.bak
242 local filename=`basename ${ZK_CONF}`
243 echo -n "backup old file to ${filename}.bak ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700244 fi
245
Naoki Shiota4e928512014-04-03 15:49:35 -0700246 hostarr=`echo ${ZK_HOSTS} | tr "," " "`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700247
248 local i=1
249 local myid=
250 for host in ${hostarr}; do
251 if [ ${host} = ${ONOS_HOST_NAME} ]; then
252 myid=$i
253 break
254 fi
255 i=`expr $i + 1`
256 done
257
258 if [ -z "${myid}" ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700259 local filename=`basename ${ONOS_CONF}`
Naoki Shiota4e928512014-04-03 15:49:35 -0700260 revert-confs "[ERROR in ${filename}] zookeeper.hosts must have hostname \"${ONOS_HOST_NAME}\""
Naoki Shiota9df15d32014-03-27 14:26:20 -0700261 fi
262
263 # TODO: Remove sudo.
264 # This is temporary code for the sake of compatibility with old code (which creates myid with root user).
265 sudo mv ${ZK_MY_ID} ${ZK_MY_ID}.old
266 echo ${myid} > ${ZK_MY_ID}
267
268 echo -n "myid is assigned to ${myid} ... "
269
270 while read line; do
271 if [[ $line =~ ^__HOSTS__$ ]]; then
272 i=1
273 for host in ${hostarr}; do
274 # TODO: ports might be configurable
275 local hostline="server.${i}=${host}:2888:3888"
276 echo $hostline >> "${temp_zk}"
277 i=`expr $i + 1`
278 done
279 elif [[ $line =~ __DATADIR__ ]]; then
280 echo $line | sed -e "s|__DATADIR__|${ZK_LIB_DIR}|" >> ${temp_zk}
281 else
282 echo $line >> ${temp_zk}
283 fi
284 done < ${ZK_CONF_TEMPLATE}
285 mv ${temp_zk} ${ZK_CONF}
286
287 echo "DONE"
Naoki Shiota590c18d2014-03-31 17:52:59 -0700288}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700289
Naoki Shiota4e928512014-04-03 15:49:35 -0700290function create-hazelcast-conf {
291 echo -n "Creating ${HC_CONF} ... "
292
293 local temp_hc="${HC_CONF}.tmp"
294 if [ -f ${temp_hc} ]; then
295 rm ${temp_hc}
296 fi
297 touch ${temp_hc}
298
299 if [ -f ${HC_CONF} ]; then
300 mv ${HC_CONF} ${HC_CONF}.bak
301 local filename=`basename ${HC_CONF}`
302 echo -n "backup old file to ${filename}.bak ... "
303 fi
304
305 # To keep indent of XML file, change IFS
306 local IFS=''
307 while read line; do
308 if [[ $line =~ __HC_NETWORK__ ]]; then
309 if [ ! -z "${HC_TCPIP_MEMBERS}" ]; then
310 # temporary change
311 IFS=' '
312 local memberarr=`echo ${HC_TCPIP_MEMBERS} | tr "," " "`
313 echo '<multicast enabled="false" />'
314 echo '<tcp-ip enabled="true">'
315 for member in ${memberarr}; do
316 echo " <member>${member}</member>"
317 done
318 echo '</tcp-ip>'
319 IFS=''
320 else
321 echo '<multicast enabled="true">'
322 echo " <multicast-group>${HC_MULTICAST_GROUP}</multicast-group>"
323 echo " <multicast-port>${HC_MULTICAST_PORT}</multicast-port>"
324 echo '</multicast>'
325 echo '<tcp-ip enabled="false" />'
326 fi
327 else
328 echo "${line}"
329 fi
330 done < ${HC_CONF_TEMPLATE} > ${temp_hc}
331
332 mv ${temp_hc} ${HC_CONF}
333
334 echo "DONE"
335}
336
Naoki Shiota590c18d2014-03-31 17:52:59 -0700337function create-logback-conf {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700338 echo -n "Creating ${ONOS_LOGBACK} ... "
Naoki Shiota590c18d2014-03-31 17:52:59 -0700339
Naoki Shiota9df15d32014-03-27 14:26:20 -0700340 # creation of logback config
341 if [ -f $ONOS_LOGBACK ]; then
342 local logback_file=`basename ${ONOS_LOGBACK}`
Naoki Shiota4e928512014-04-03 15:49:35 -0700343 mv ${ONOS_LOGBACK} ${ONOS_LOGBACK}.bak
344 local filename=`basename ${ONOS_LOGBACK}`
345 echo -n "backup old file to ${filename}.bak ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700346 fi
347 sed -e "s|__FILENAME__|${ONOS_LOG}|" ${ONOS_LOGBACK_TEMPLATE} > ${ONOS_LOGBACK}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700348
Naoki Shiota9df15d32014-03-27 14:26:20 -0700349 echo "DONE"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700350}
351
Naoki Shiota4e928512014-04-03 15:49:35 -0700352# create-conf-interactive {filename} {function to create conf}
353function create-conf-interactive {
354 local filepath=$1
355 local filename=`basename ${filepath}`
356 local func=$2
Naoki Shiota590c18d2014-03-31 17:52:59 -0700357
Naoki Shiota4e928512014-04-03 15:49:35 -0700358 if [ -f ${filepath} ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700359 # confirmation to overwrite existing config file
Naoki Shiota590c18d2014-03-31 17:52:59 -0700360 echo -n "Overwriting ${filename} [Y/n]? "
361 while [ 1 ]; do
362 read key
363 if [ -z "${key}" -o "${key}" == "Y" ]; then
Naoki Shiota4e928512014-04-03 15:49:35 -0700364 ${func}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700365 break
366 elif [ "${key}" == "n" ]; then
367 break
368 fi
369 echo "[Y/n]?"
370 done
371 else
Naoki Shiota4e928512014-04-03 15:49:35 -0700372 ${func}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700373 fi
Naoki Shiota4e928512014-04-03 15:49:35 -0700374}
375
376function create-confs {
377 local key
378 local filename
379
380 trap revert-confs ERR
381
382 if [ "$1" == "-f" ]; then
383 create-zk-conf
384 create-hazelcast-conf
385 create-logback-conf
386 else
387 create-conf-interactive ${ZK_CONF} create-zk-conf
388 create-conf-interactive ${HC_CONF} create-hazelcast-conf
389 create-conf-interactive ${ONOS_LOGBACK} create-logback-conf
390 fi
391
Naoki Shiota590c18d2014-03-31 17:52:59 -0700392
393 trap - ERR
394}
395############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700396
Naoki Shiota590c18d2014-03-31 17:52:59 -0700397
398###### Functions related to ZooKeeper ######
Naoki Shiota4e463182014-03-21 15:13:24 -0700399function zk {
400 case "$1" in
401 start)
402 start-zk
403 ;;
404 stop)
405 stop-zk
406 ;;
407 stat*) # <- status
408 status-zk
409 ;;
410 re*) # <- restart
411 stop-zk
412 start-zk
413 ;;
414 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700415 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700416 exit 1
417 esac
418}
419
420function start-zk {
Naoki Shiota4e463182014-03-21 15:13:24 -0700421 echo -n "Starting Zookeeper ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700422
Naoki Shiota4e928512014-04-03 15:49:35 -0700423 export ZOO_LOG_DIR=${ZK_LOG_DIR}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700424 if [ -f "${ZK_CONF}" ]; then
425 # Run Zookeeper with our configuration
426 export ZOOCFG=${ZK_CONF_FILE}
427 export ZOOCFGDIR=${ONOS_CONF_DIR}
428 fi
429
Naoki Shiota72209722014-04-08 14:32:17 -0700430 ${ZK_HOME}/bin/zkServer.sh start
Naoki Shiota4e463182014-03-21 15:13:24 -0700431}
432
433function stop-zk {
434 kill-processes "ZooKeeper" `jps -l | grep org.apache.zookeeper.server | awk '{print $1}'`
435}
436
437function status-zk {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700438 if [ -f ${ZK_CONF} ]; then
439 export ZOOCFG=${ZK_CONF_FILE}
440 export ZOOCFGDIR=${ONOS_CONF_DIR}
441 fi
442
Naoki Shiota72209722014-04-08 14:32:17 -0700443 ${ZK_HOME}/bin/zkServer.sh status
Naoki Shiota4e463182014-03-21 15:13:24 -0700444}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700445############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700446
447
Naoki Shiota590c18d2014-03-31 17:52:59 -0700448####### Functions related to RAMCloud ######
Naoki Shiota9df15d32014-03-27 14:26:20 -0700449function start-backend {
450 if [ "${ONOS_HOST_BACKEND}" = "ramcloud" ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700451 if [ $1 == "coord" ]; then
452 rc-coord startifdown
453 elif [ $1 == "server" ]; then
454 rc-server startifdown
455 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700456 fi
457}
458
459function stop-backend {
460 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
461 if [ $rcsn != 0 ]; then
462 rc-server stop
463 fi
464
Naoki Shiota590c18d2014-03-31 17:52:59 -0700465 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700466 if [ $rccn != 0 ]; then
467 rc-coord stop
468 fi
469}
470
Naoki Shiota590c18d2014-03-31 17:52:59 -0700471function deldb {
472# TODO: implement
473 return
474}
475
476
Naoki Shiota4e463182014-03-21 15:13:24 -0700477### Functions related to RAMCloud coordinator
Naoki Shiota9df15d32014-03-27 14:26:20 -0700478function rc-coord-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700479 echo "${RC_COORD_PROTOCOL}:host=${RC_COORD_IP},port=${RC_COORD_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700480}
481
482function rc-server-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700483 echo "${RC_SERVER_PROTOCOL}:host=${RC_SERVER_IP},port=${RC_SERVER_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700484}
485
Naoki Shiota4e463182014-03-21 15:13:24 -0700486function rc-coord {
487 case "$1" in
488 start)
489 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700490 stop-coord
491 start-coord
492 ;;
493 startifdown)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700494 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700495 if [ $n == 0 ]; then
496 start-coord
497 else
498 echo "$n instance of RAMCloud coordinator running"
499 fi
500 ;;
501 stop)
502 stop-coord
503 ;;
504 stat*) # <- status
505 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
506 echo "$n RAMCloud coordinator running"
507 ;;
508 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700509 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700510 exit 1
511 esac
512}
513
514function start-coord {
515 if [ ! -d ${LOGDIR} ]; then
516 mkdir -p ${LOGDIR}
517 fi
518 if [ -f $RAMCLOUD_COORD_LOG ]; then
519 rotate-log $RAMCLOUD_COORD_LOG
520 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700521
522 local coord_addr=`rc-coord-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700523
524 # Run ramcloud
525 echo -n "Starting RAMCloud coordinator ... "
Naoki Shiota72209722014-04-08 14:32:17 -0700526 ${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}/coordinator -L ${coord_addr} > $RAMCLOUD_COORD_LOG 2>&1 &
Naoki Shiota4e463182014-03-21 15:13:24 -0700527 echo "STARTED"
528}
529
530
531function stop-coord {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700532 kill-processes "RAMCloud coordinator" `pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator`
Naoki Shiota4e463182014-03-21 15:13:24 -0700533}
534
Naoki Shiota4e463182014-03-21 15:13:24 -0700535### Functions related to RAMCloud server
536function rc-server {
537 case "$1" in
538 start)
539 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700540 stop-server
541 start-server
542 ;;
543 startifdown)
544 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
545 if [ $n == 0 ]; then
546 start-server
547 else
548 echo "$n instance of RAMCloud server running"
549 fi
550 ;;
551 stop)
552 stop-server
553 ;;
554# deldb)
555# deldb
556# ;;
557 stat*) # <- status
558 n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
559 echo "$n RAMCloud server running"
560 ;;
561 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700562 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700563 exit 1
564 esac
565}
566
567function start-server {
568 if [ ! -d ${LOGDIR} ]; then
569 mkdir -p ${LOGDIR}
570 fi
571 if [ -f $RAMCLOUD_SERVER_LOG ]; then
572 rotate-log $RAMCLOUD_SERVER_LOG
573 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700574
575 local coord_addr=`rc-coord-addr`
576 local server_addr=`rc-server-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700577
578 # Run ramcloud
579 echo -n "Starting RAMCloud server ... "
Naoki Shiota72209722014-04-08 14:32:17 -0700580 ${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}/server -M -L ${server_addr} -C ${coord_addr} --masterServiceThreads 1 --logCleanerThreads 1 --detectFailures 0 > $RAMCLOUD_SERVER_LOG 2>&1 &
Naoki Shiota4e463182014-03-21 15:13:24 -0700581 echo "STARTED"
582}
583
584function stop-server {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700585 kill-processes "RAMCloud server" `pgrep -f obj.${RAMCLOUD_BRANCH}/server`
Naoki Shiota4e463182014-03-21 15:13:24 -0700586}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700587############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700588
589
Naoki Shiota590c18d2014-03-31 17:52:59 -0700590## Functions related to ONOS core process ##
Naoki Shiota4e463182014-03-21 15:13:24 -0700591function onos {
Naoki Shiota590c18d2014-03-31 17:52:59 -0700592 CPFILE=${ONOS_HOME}/.javacp.${ONOS_HOST_NAME}
Naoki Shiota4e463182014-03-21 15:13:24 -0700593 if [ ! -f ${CPFILE} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700594 echo "ONOS core needs to be built"
Naoki Shiota4e463182014-03-21 15:13:24 -0700595 ${MVN} -f ${ONOS_HOME}/pom.xml compile
596 fi
597 JAVA_CP=`cat ${CPFILE}`
598 JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
599
600 case "$1" in
601 start)
602 stop-onos
603 start-onos
604 ;;
605 startnokill)
606 start-onos
607 ;;
608 startifdown)
609 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
610 if [ $n == 0 ]; then
611 start-onos
612 else
613 echo "$n instance of onos running"
614 fi
615 ;;
616 stop)
617 stop-onos
618 ;;
619 stat*) # <- status
620 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
621 echo "$n instance of onos running"
622 ;;
623 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700624 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700625 exit 1
626 esac
627}
628
629function start-onos {
630 if [ ! -d ${LOGDIR} ]; then
631 mkdir -p ${LOGDIR}
632 fi
633 # Backup log files
634 for log in ${LOGS}; do
635 if [ -f ${log} ]; then
636 rotate-log ${log}
637 fi
638 done
Naoki Shiota9df15d32014-03-27 14:26:20 -0700639
Naoki Shiota4e463182014-03-21 15:13:24 -0700640 if [ ! -f ${ONOS_LOGBACK} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700641 echo "[WARNING] ${ONOS_LOGBACK} not found."
642 echo " Run \"\$ $0 setup\" to create."
643 exit 1
Naoki Shiota4e463182014-03-21 15:13:24 -0700644 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700645
Jonathan Hartef3dc1a2014-04-03 11:39:50 -0700646 JVM_OPTS="${JVM_OPTS} -Dnet.onrc.onos.core.datastore.backend=${ONOS_HOST_BACKEND}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700647
648 # Run ONOS
649
650 echo -n "Starting ONOS controller ..."
Naoki Shiota4e463182014-03-21 15:13:24 -0700651 java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_PROPS} > ${LOGDIR}/${LOGBASE}.stdout 2>${LOGDIR}/${LOGBASE}.stderr &
652
653 # We need to wait a bit to find out whether starting the ONOS process succeeded
654 sleep 1
655
656 n=`jps -l |grep "${MAIN_CLASS}" | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700657 if [ $n -ge 1 ]; then
Naoki Shiota4e463182014-03-21 15:13:24 -0700658 echo " STARTED"
659 else
660 echo " FAILED"
661 fi
662
663# echo "java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ./onos.properties > /dev/null 2>&1 &"
664# sudo -b /usr/sbin/tcpdump -n -i eth0 -s0 -w ${PCAP_LOG} 'tcp port 6633' > /dev/null 2>&1
665}
666
667function stop-onos {
668 kill-processes "ONOS controller" `jps -l | grep ${MAIN_CLASS} | awk '{print $1}'`
669# kill-processes "tcpdump" `ps -edalf |grep tcpdump |grep ${PCAP_LOG} | awk '{print $4}'`
670}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700671############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700672
673
Naoki Shiota590c18d2014-03-31 17:52:59 -0700674################## Main ####################
Naoki Shiota4e463182014-03-21 15:13:24 -0700675case "$1" in
Naoki Shiota9df15d32014-03-27 14:26:20 -0700676 setup)
Naoki Shiota4e928512014-04-03 15:49:35 -0700677 create-confs $2
Naoki Shiota9df15d32014-03-27 14:26:20 -0700678 ;;
Naoki Shiota4e463182014-03-21 15:13:24 -0700679 start)
Naoki Shiota9df15d32014-03-27 14:26:20 -0700680 mode_parameter=${ONOS_HOST_ROLE}
681 if [ ! -z "$2" ]; then
682 mode_parameter=$2
683 fi
684
685 case "${mode_parameter}" in
Naoki Shiota4e463182014-03-21 15:13:24 -0700686 single-node)
687 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700688 start-backend coord
689 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700690 onos startifdown
691 ;;
692 coord-node)
693 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700694 start-backend coord
Naoki Shiota4e463182014-03-21 15:13:24 -0700695 onos startifdown
696 ;;
697 server-node)
698 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700699 start-backend server
700 onos startifdown
701 ;;
702 coord-and-server-node)
703 zk start
704 start-backend coord
705 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700706 onos startifdown
707 ;;
708 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700709 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700710 ;;
711 esac
712 echo
713 ;;
714 stop)
715 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
716 if [ $on != 0 ]; then
717 onos stop
718 fi
719
Naoki Shiota9df15d32014-03-27 14:26:20 -0700720 stop-backend
Naoki Shiota4e463182014-03-21 15:13:24 -0700721
722 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
723 if [ $zkn != 0 ]; then
724 zk stop
725 fi
726 echo
727 ;;
728 restart)
729 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
730 if [ $on != 0 ]; then
731 onos stop
732 fi
733
734 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
735 if [ $rcsn != 0 ]; then
736 rc-server stop
737 fi
738
Naoki Shiota590c18d2014-03-31 17:52:59 -0700739 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700740 if [ $rccn != 0 ]; then
741 rc-coord stop
742 fi
743
744 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
745 if [ $zkn != 0 ]; then
746 zk restart
747 fi
748
749 if [ $rccn != 0 ]; then
750 rc-coord startifdown
751 fi
752
753 if [ $rcsn != 0 ]; then
754 rc-server startifdown
755 fi
756
757 if [ $on != 0 ]; then
758 onos startifdown
759 fi
760 echo
761 ;;
762 stat*) # <- status
763 echo '[ZooKeeper]'
764 zk status
765 echo
766 echo '[RAMCloud coordinator]'
767 rc-coord status
768 echo
769 echo '[RAMCloud server]'
770 rc-server status
771 echo
772 echo '[ONOS core]'
773 onos status
774 echo
775 ;;
776 zk)
777 zk $2
778 ;;
779 rc-c*) # <- rc-coordinator
780 rc-coord $2
781 ;;
782 rc-s*) # <- rc-server
783 rc-server $2
784 ;;
785 core)
786 onos $2
787 ;;
788 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700789 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700790 exit 1
791esac
Naoki Shiota590c18d2014-03-31 17:52:59 -0700792