blob: d10f907031ad06ccc5f689fe8aca0329de027e9c [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
Yuta HIGUCHI69450892014-04-16 09:10:55 -0700263 if [ -f "${ZK_MY_ID}" ]; then
264 local SUDO=${SUDO:-}
265 {
266 ${SUDO} mv -f ${ZK_MY_ID} ${ZK_MY_ID}.old
267 } || {
268 echo "FAILED"
269 echo "[ERROR] Failed to rename ${ZK_MY_ID}."
270 echo "[ERROR] Please retry after setting \"export SUDO=sudo\""
271 exit 1
272 }
273 fi
274
Naoki Shiota9df15d32014-03-27 14:26:20 -0700275 echo ${myid} > ${ZK_MY_ID}
276
277 echo -n "myid is assigned to ${myid} ... "
278
279 while read line; do
280 if [[ $line =~ ^__HOSTS__$ ]]; then
281 i=1
282 for host in ${hostarr}; do
283 # TODO: ports might be configurable
284 local hostline="server.${i}=${host}:2888:3888"
285 echo $hostline >> "${temp_zk}"
286 i=`expr $i + 1`
287 done
288 elif [[ $line =~ __DATADIR__ ]]; then
289 echo $line | sed -e "s|__DATADIR__|${ZK_LIB_DIR}|" >> ${temp_zk}
290 else
291 echo $line >> ${temp_zk}
292 fi
293 done < ${ZK_CONF_TEMPLATE}
294 mv ${temp_zk} ${ZK_CONF}
295
296 echo "DONE"
Naoki Shiota590c18d2014-03-31 17:52:59 -0700297}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700298
Naoki Shiota4e928512014-04-03 15:49:35 -0700299function create-hazelcast-conf {
300 echo -n "Creating ${HC_CONF} ... "
301
302 local temp_hc="${HC_CONF}.tmp"
303 if [ -f ${temp_hc} ]; then
304 rm ${temp_hc}
305 fi
306 touch ${temp_hc}
307
308 if [ -f ${HC_CONF} ]; then
309 mv ${HC_CONF} ${HC_CONF}.bak
310 local filename=`basename ${HC_CONF}`
311 echo -n "backup old file to ${filename}.bak ... "
312 fi
313
314 # To keep indent of XML file, change IFS
315 local IFS=''
316 while read line; do
317 if [[ $line =~ __HC_NETWORK__ ]]; then
318 if [ ! -z "${HC_TCPIP_MEMBERS}" ]; then
319 # temporary change
320 IFS=' '
321 local memberarr=`echo ${HC_TCPIP_MEMBERS} | tr "," " "`
322 echo '<multicast enabled="false" />'
323 echo '<tcp-ip enabled="true">'
324 for member in ${memberarr}; do
325 echo " <member>${member}</member>"
326 done
327 echo '</tcp-ip>'
328 IFS=''
329 else
330 echo '<multicast enabled="true">'
331 echo " <multicast-group>${HC_MULTICAST_GROUP}</multicast-group>"
332 echo " <multicast-port>${HC_MULTICAST_PORT}</multicast-port>"
333 echo '</multicast>'
334 echo '<tcp-ip enabled="false" />'
335 fi
336 else
337 echo "${line}"
338 fi
339 done < ${HC_CONF_TEMPLATE} > ${temp_hc}
340
341 mv ${temp_hc} ${HC_CONF}
342
343 echo "DONE"
344}
345
Naoki Shiota590c18d2014-03-31 17:52:59 -0700346function create-logback-conf {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700347 echo -n "Creating ${ONOS_LOGBACK} ... "
Naoki Shiota590c18d2014-03-31 17:52:59 -0700348
Naoki Shiota9df15d32014-03-27 14:26:20 -0700349 # creation of logback config
350 if [ -f $ONOS_LOGBACK ]; then
351 local logback_file=`basename ${ONOS_LOGBACK}`
Naoki Shiota4e928512014-04-03 15:49:35 -0700352 mv ${ONOS_LOGBACK} ${ONOS_LOGBACK}.bak
353 local filename=`basename ${ONOS_LOGBACK}`
354 echo -n "backup old file to ${filename}.bak ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700355 fi
356 sed -e "s|__FILENAME__|${ONOS_LOG}|" ${ONOS_LOGBACK_TEMPLATE} > ${ONOS_LOGBACK}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700357
Naoki Shiota9df15d32014-03-27 14:26:20 -0700358 echo "DONE"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700359}
360
Naoki Shiota4e928512014-04-03 15:49:35 -0700361# create-conf-interactive {filename} {function to create conf}
362function create-conf-interactive {
363 local filepath=$1
364 local filename=`basename ${filepath}`
365 local func=$2
Naoki Shiota590c18d2014-03-31 17:52:59 -0700366
Naoki Shiota4e928512014-04-03 15:49:35 -0700367 if [ -f ${filepath} ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700368 # confirmation to overwrite existing config file
Naoki Shiota590c18d2014-03-31 17:52:59 -0700369 echo -n "Overwriting ${filename} [Y/n]? "
370 while [ 1 ]; do
371 read key
372 if [ -z "${key}" -o "${key}" == "Y" ]; then
Naoki Shiota4e928512014-04-03 15:49:35 -0700373 ${func}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700374 break
375 elif [ "${key}" == "n" ]; then
376 break
377 fi
378 echo "[Y/n]?"
379 done
380 else
Naoki Shiota4e928512014-04-03 15:49:35 -0700381 ${func}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700382 fi
Naoki Shiota4e928512014-04-03 15:49:35 -0700383}
384
385function create-confs {
386 local key
387 local filename
388
389 trap revert-confs ERR
390
391 if [ "$1" == "-f" ]; then
392 create-zk-conf
393 create-hazelcast-conf
394 create-logback-conf
395 else
396 create-conf-interactive ${ZK_CONF} create-zk-conf
397 create-conf-interactive ${HC_CONF} create-hazelcast-conf
398 create-conf-interactive ${ONOS_LOGBACK} create-logback-conf
399 fi
400
Naoki Shiota590c18d2014-03-31 17:52:59 -0700401
402 trap - ERR
403}
404############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700405
Naoki Shiota590c18d2014-03-31 17:52:59 -0700406
407###### Functions related to ZooKeeper ######
Naoki Shiota4e463182014-03-21 15:13:24 -0700408function zk {
409 case "$1" in
410 start)
411 start-zk
412 ;;
413 stop)
414 stop-zk
415 ;;
416 stat*) # <- status
417 status-zk
418 ;;
419 re*) # <- restart
420 stop-zk
421 start-zk
422 ;;
423 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700424 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700425 exit 1
426 esac
427}
428
429function start-zk {
Naoki Shiota4e463182014-03-21 15:13:24 -0700430 echo -n "Starting Zookeeper ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700431
Naoki Shiota4e928512014-04-03 15:49:35 -0700432 export ZOO_LOG_DIR=${ZK_LOG_DIR}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700433 if [ -f "${ZK_CONF}" ]; then
434 # Run Zookeeper with our configuration
435 export ZOOCFG=${ZK_CONF_FILE}
436 export ZOOCFGDIR=${ONOS_CONF_DIR}
437 fi
438
Naoki Shiota72209722014-04-08 14:32:17 -0700439 ${ZK_HOME}/bin/zkServer.sh start
Naoki Shiota4e463182014-03-21 15:13:24 -0700440}
441
442function stop-zk {
443 kill-processes "ZooKeeper" `jps -l | grep org.apache.zookeeper.server | awk '{print $1}'`
444}
445
446function status-zk {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700447 if [ -f ${ZK_CONF} ]; then
448 export ZOOCFG=${ZK_CONF_FILE}
449 export ZOOCFGDIR=${ONOS_CONF_DIR}
450 fi
451
Naoki Shiota72209722014-04-08 14:32:17 -0700452 ${ZK_HOME}/bin/zkServer.sh status
Naoki Shiota4e463182014-03-21 15:13:24 -0700453}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700454############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700455
456
Naoki Shiota590c18d2014-03-31 17:52:59 -0700457####### Functions related to RAMCloud ######
Naoki Shiota9df15d32014-03-27 14:26:20 -0700458function start-backend {
459 if [ "${ONOS_HOST_BACKEND}" = "ramcloud" ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700460 if [ $1 == "coord" ]; then
461 rc-coord startifdown
462 elif [ $1 == "server" ]; then
463 rc-server startifdown
464 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700465 fi
466}
467
468function stop-backend {
469 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
470 if [ $rcsn != 0 ]; then
471 rc-server stop
472 fi
473
Naoki Shiota590c18d2014-03-31 17:52:59 -0700474 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700475 if [ $rccn != 0 ]; then
476 rc-coord stop
477 fi
478}
479
Naoki Shiota590c18d2014-03-31 17:52:59 -0700480function deldb {
481# TODO: implement
482 return
483}
484
485
Naoki Shiota4e463182014-03-21 15:13:24 -0700486### Functions related to RAMCloud coordinator
Naoki Shiota9df15d32014-03-27 14:26:20 -0700487function rc-coord-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700488 echo "${RC_COORD_PROTOCOL}:host=${RC_COORD_IP},port=${RC_COORD_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700489}
490
491function rc-server-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700492 echo "${RC_SERVER_PROTOCOL}:host=${RC_SERVER_IP},port=${RC_SERVER_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700493}
494
Naoki Shiota4e463182014-03-21 15:13:24 -0700495function rc-coord {
496 case "$1" in
497 start)
498 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700499 stop-coord
500 start-coord
501 ;;
502 startifdown)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700503 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700504 if [ $n == 0 ]; then
505 start-coord
506 else
507 echo "$n instance of RAMCloud coordinator running"
508 fi
509 ;;
510 stop)
511 stop-coord
512 ;;
513 stat*) # <- status
514 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
515 echo "$n RAMCloud coordinator running"
516 ;;
517 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700518 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700519 exit 1
520 esac
521}
522
523function start-coord {
524 if [ ! -d ${LOGDIR} ]; then
525 mkdir -p ${LOGDIR}
526 fi
527 if [ -f $RAMCLOUD_COORD_LOG ]; then
528 rotate-log $RAMCLOUD_COORD_LOG
529 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700530
531 local coord_addr=`rc-coord-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700532
533 # Run ramcloud
534 echo -n "Starting RAMCloud coordinator ... "
Naoki Shiota72209722014-04-08 14:32:17 -0700535 ${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}/coordinator -L ${coord_addr} > $RAMCLOUD_COORD_LOG 2>&1 &
Naoki Shiota4e463182014-03-21 15:13:24 -0700536 echo "STARTED"
537}
538
539
540function stop-coord {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700541 kill-processes "RAMCloud coordinator" `pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator`
Naoki Shiota4e463182014-03-21 15:13:24 -0700542}
543
Naoki Shiota4e463182014-03-21 15:13:24 -0700544### Functions related to RAMCloud server
545function rc-server {
546 case "$1" in
547 start)
548 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700549 stop-server
550 start-server
551 ;;
552 startifdown)
553 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
554 if [ $n == 0 ]; then
555 start-server
556 else
557 echo "$n instance of RAMCloud server running"
558 fi
559 ;;
560 stop)
561 stop-server
562 ;;
563# deldb)
564# deldb
565# ;;
566 stat*) # <- status
567 n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
568 echo "$n RAMCloud server running"
569 ;;
570 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700571 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700572 exit 1
573 esac
574}
575
576function start-server {
577 if [ ! -d ${LOGDIR} ]; then
578 mkdir -p ${LOGDIR}
579 fi
580 if [ -f $RAMCLOUD_SERVER_LOG ]; then
581 rotate-log $RAMCLOUD_SERVER_LOG
582 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700583
584 local coord_addr=`rc-coord-addr`
585 local server_addr=`rc-server-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700586
587 # Run ramcloud
588 echo -n "Starting RAMCloud server ... "
Naoki Shiota72209722014-04-08 14:32:17 -0700589 ${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 -0700590 echo "STARTED"
591}
592
593function stop-server {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700594 kill-processes "RAMCloud server" `pgrep -f obj.${RAMCLOUD_BRANCH}/server`
Naoki Shiota4e463182014-03-21 15:13:24 -0700595}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700596############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700597
598
Naoki Shiota590c18d2014-03-31 17:52:59 -0700599## Functions related to ONOS core process ##
Naoki Shiota4e463182014-03-21 15:13:24 -0700600function onos {
Naoki Shiota590c18d2014-03-31 17:52:59 -0700601 CPFILE=${ONOS_HOME}/.javacp.${ONOS_HOST_NAME}
Naoki Shiota4e463182014-03-21 15:13:24 -0700602 if [ ! -f ${CPFILE} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700603 echo "ONOS core needs to be built"
Naoki Shiota4e463182014-03-21 15:13:24 -0700604 ${MVN} -f ${ONOS_HOME}/pom.xml compile
605 fi
606 JAVA_CP=`cat ${CPFILE}`
607 JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
608
609 case "$1" in
610 start)
611 stop-onos
612 start-onos
613 ;;
614 startnokill)
615 start-onos
616 ;;
617 startifdown)
618 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
619 if [ $n == 0 ]; then
620 start-onos
621 else
622 echo "$n instance of onos running"
623 fi
624 ;;
625 stop)
626 stop-onos
627 ;;
628 stat*) # <- status
629 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
630 echo "$n instance of onos running"
631 ;;
632 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700633 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700634 exit 1
635 esac
636}
637
638function start-onos {
639 if [ ! -d ${LOGDIR} ]; then
640 mkdir -p ${LOGDIR}
641 fi
642 # Backup log files
643 for log in ${LOGS}; do
644 if [ -f ${log} ]; then
645 rotate-log ${log}
646 fi
647 done
Naoki Shiota9df15d32014-03-27 14:26:20 -0700648
Naoki Shiota4e463182014-03-21 15:13:24 -0700649 if [ ! -f ${ONOS_LOGBACK} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700650 echo "[WARNING] ${ONOS_LOGBACK} not found."
651 echo " Run \"\$ $0 setup\" to create."
652 exit 1
Naoki Shiota4e463182014-03-21 15:13:24 -0700653 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700654
Jonathan Hartef3dc1a2014-04-03 11:39:50 -0700655 JVM_OPTS="${JVM_OPTS} -Dnet.onrc.onos.core.datastore.backend=${ONOS_HOST_BACKEND}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700656
657 # Run ONOS
658
659 echo -n "Starting ONOS controller ..."
Naoki Shiota4e463182014-03-21 15:13:24 -0700660 java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_PROPS} > ${LOGDIR}/${LOGBASE}.stdout 2>${LOGDIR}/${LOGBASE}.stderr &
661
662 # We need to wait a bit to find out whether starting the ONOS process succeeded
663 sleep 1
664
665 n=`jps -l |grep "${MAIN_CLASS}" | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700666 if [ $n -ge 1 ]; then
Naoki Shiota4e463182014-03-21 15:13:24 -0700667 echo " STARTED"
668 else
669 echo " FAILED"
670 fi
671
672# echo "java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ./onos.properties > /dev/null 2>&1 &"
673# sudo -b /usr/sbin/tcpdump -n -i eth0 -s0 -w ${PCAP_LOG} 'tcp port 6633' > /dev/null 2>&1
674}
675
676function stop-onos {
677 kill-processes "ONOS controller" `jps -l | grep ${MAIN_CLASS} | awk '{print $1}'`
678# kill-processes "tcpdump" `ps -edalf |grep tcpdump |grep ${PCAP_LOG} | awk '{print $4}'`
679}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700680############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700681
682
Naoki Shiota590c18d2014-03-31 17:52:59 -0700683################## Main ####################
Naoki Shiota4e463182014-03-21 15:13:24 -0700684case "$1" in
Naoki Shiota9df15d32014-03-27 14:26:20 -0700685 setup)
Naoki Shiota4e928512014-04-03 15:49:35 -0700686 create-confs $2
Naoki Shiota9df15d32014-03-27 14:26:20 -0700687 ;;
Naoki Shiota4e463182014-03-21 15:13:24 -0700688 start)
Naoki Shiota9df15d32014-03-27 14:26:20 -0700689 mode_parameter=${ONOS_HOST_ROLE}
690 if [ ! -z "$2" ]; then
691 mode_parameter=$2
692 fi
693
694 case "${mode_parameter}" in
Naoki Shiota4e463182014-03-21 15:13:24 -0700695 single-node)
696 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700697 start-backend coord
698 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700699 onos startifdown
700 ;;
701 coord-node)
702 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700703 start-backend coord
Naoki Shiota4e463182014-03-21 15:13:24 -0700704 onos startifdown
705 ;;
706 server-node)
707 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700708 start-backend server
709 onos startifdown
710 ;;
711 coord-and-server-node)
712 zk start
713 start-backend coord
714 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700715 onos startifdown
716 ;;
717 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700718 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700719 ;;
720 esac
721 echo
722 ;;
723 stop)
724 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
725 if [ $on != 0 ]; then
726 onos stop
727 fi
728
Naoki Shiota9df15d32014-03-27 14:26:20 -0700729 stop-backend
Naoki Shiota4e463182014-03-21 15:13:24 -0700730
731 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
732 if [ $zkn != 0 ]; then
733 zk stop
734 fi
735 echo
736 ;;
737 restart)
738 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
739 if [ $on != 0 ]; then
740 onos stop
741 fi
742
743 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
744 if [ $rcsn != 0 ]; then
745 rc-server stop
746 fi
747
Naoki Shiota590c18d2014-03-31 17:52:59 -0700748 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700749 if [ $rccn != 0 ]; then
750 rc-coord stop
751 fi
752
753 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
754 if [ $zkn != 0 ]; then
755 zk restart
756 fi
757
758 if [ $rccn != 0 ]; then
759 rc-coord startifdown
760 fi
761
762 if [ $rcsn != 0 ]; then
763 rc-server startifdown
764 fi
765
766 if [ $on != 0 ]; then
767 onos startifdown
768 fi
769 echo
770 ;;
771 stat*) # <- status
772 echo '[ZooKeeper]'
773 zk status
774 echo
775 echo '[RAMCloud coordinator]'
776 rc-coord status
777 echo
778 echo '[RAMCloud server]'
779 rc-server status
780 echo
781 echo '[ONOS core]'
782 onos status
783 echo
784 ;;
785 zk)
786 zk $2
787 ;;
788 rc-c*) # <- rc-coordinator
789 rc-coord $2
790 ;;
791 rc-s*) # <- rc-server
792 rc-server $2
793 ;;
794 core)
795 onos $2
796 ;;
797 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700798 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700799 exit 1
800esac
Naoki Shiota590c18d2014-03-31 17:52:59 -0700801