blob: b54acc33531d6d6287b508aefe1bcd50d270250c [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)
Naoki Shiota9a1e6d12014-04-03 14:47:12 -07006# $ONOS_CONF : path of ONOS node config file (~/ONOS/conf/onos_node.`hostname`.conf or onos_node.conf)
Naoki Shiota590c18d2014-03-31 17:52:59 -07007# $ONOS_PROPS : path of ONOS properties file (~/ONOS/conf/onos.properties)
8# $ONOS_LOGBACK : path of logback config file (~/ONOS/conf/logback.`hostname`.xml)
Naoki Shiotad8ea71a2014-04-23 17:04:51 -07009# $ONOS_LOGDIR : path of log output directory (~/ONOS/onos-logs)
10# $ONOS_LOGBASE : base name of log output file (onos.`hostname`)
Naoki Shiota590c18d2014-03-31 17:52:59 -070011# $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 Shiotad8ea71a2014-04-23 17:04:51 -070015# $ZK_LOG_DIR : path of ZooKeeper log output directory (~/ONOS/onos-logs/zk-`hostname`)
Naoki Shiota590c18d2014-03-31 17:52:59 -070016# $JVM_OPTS : JVM options ONOS starts with
Naoki Shiotab7eb55d2014-04-21 18:21:36 -070017# $ZK_CONF : path of ZooKeeper config file (~/ONOS/conf/zoo.cfg)
18# $HC_CONF : path of Hazelcast config file (~/ONOS/conf/hazelcast.xml)
19# $RAMCLOUD_CONF : path of RAMCloud config file (~/ONOS/conf/ramcloud.conf)
Naoki Shiota590c18d2014-03-31 17:52:59 -070020#####################################################
21
Naoki Shiota590c18d2014-03-31 17:52:59 -070022ONOS_HOME=${ONOS_HOME:-$(cd `dirname $0`; pwd)}
Naoki Shiota9df15d32014-03-27 14:26:20 -070023ONOS_CONF_DIR=${ONOS_CONF_DIR:-${ONOS_HOME}/conf}
Naoki Shiota9a1e6d12014-04-03 14:47:12 -070024ONOS_CONF=${ONOS_CONF:-${ONOS_CONF_DIR}/onos_node.`hostname`.conf}
Naoki Shiota590c18d2014-03-31 17:52:59 -070025
Naoki Shiotab7eb55d2014-04-21 18:21:36 -070026source ${ONOS_HOME}/scripts/common/utils.sh
27
Naoki Shiota590c18d2014-03-31 17:52:59 -070028if [ ! -f ${ONOS_CONF} ]; then
Naoki Shiota9a1e6d12014-04-03 14:47:12 -070029 # falling back to default config file
30 ONOS_CONF=${ONOS_CONF_DIR}/onos_node.conf
31 if [ ! -f ${ONOS_CONF} ]; then
32 echo "${ONOS_CONF} not found."
33 exit 1
34 fi
Naoki Shiota590c18d2014-03-31 17:52:59 -070035fi
Naoki Shiota4e928512014-04-03 15:49:35 -070036
37
38### Variables read from ONOS config file ###
39ONOS_HOST_NAME=$(read-conf ${ONOS_CONF} host.name `hostname`)
40ONOS_HOST_IP=$(read-conf ${ONOS_CONF} host.ip)
41ONOS_HOST_ROLE=$(read-conf ${ONOS_CONF} host.role)
42ONOS_HOST_BACKEND=$(read-conf ${ONOS_CONF} host.backend)
43ZK_HOSTS=$(read-conf ${ONOS_CONF} zookeeper.hosts ${ONOS_HOST_NAME})
44RC_COORD_PROTOCOL=$(read-conf ${ONOS_CONF} ramcloud.coordinator.protocol "fast+udp")
45RC_COORD_IP=$(read-conf ${ONOS_CONF} ramcloud.coordinator.ip ${ONOS_HOST_IP})
46RC_COORD_PORT=$(read-conf ${ONOS_CONF} ramcloud.coordinator.port 12246)
47RC_SERVER_PROTOCOL=$(read-conf ${ONOS_CONF} ramcloud.server.protocol "fast+udp")
48RC_SERVER_IP=$(read-conf ${ONOS_CONF} ramcloud.server.ip ${ONOS_HOST_IP})
49RC_SERVER_PORT=$(read-conf ${ONOS_CONF} ramcloud.server.port 12242)
Naoki Shiotab7eb55d2014-04-21 18:21:36 -070050HC_HOST_PORT=$(read-conf ${ONOS_CONF} hazelcast.host.port 5701)
Naoki Shiota4e928512014-04-03 15:49:35 -070051HC_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 Shiotab7eb55d2014-04-21 18:21:36 -070063ZK_CONF=${ZK_CONF:-${ONOS_CONF_DIR}/zoo.cfg}
Naoki Shiota4e928512014-04-03 15:49:35 -070064ZK_CONF_TEMPLATE=${ONOS_TEMPLATE_DIR}/zoo.cfg.template
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -070065# Adding ONOS_HOST_NAME dir since file name (zookeeper.out) cannot be controlled.
Naoki Shiotad8ea71a2014-04-23 17:04:51 -070066ZK_LOG_DIR=${ZK_LOG_DIR:-${ONOS_HOME}/onos-logs/zk-${ONOS_HOST_NAME}}
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 Shiotab7eb55d2014-04-21 18:21:36 -070070HC_CONF=${HC_CONF:-${ONOS_CONF_DIR}/hazelcast.xml}
Naoki Shiota4e928512014-04-03 15:49:35 -070071HC_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}
Naoki Shiotab7eb55d2014-04-21 18:21:36 -070077RAMCLOUD_CONF=${RAMCLOUD_CONF:-${ONOS_CONF_DIR}/ramcloud.conf}
Naoki Shiota4e463182014-03-21 15:13:24 -070078
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -070079export LD_LIBRARY_PATH=${ONOS_HOME}/lib:${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}:$LD_LIBRARY_PATH
Naoki Shiota4e463182014-03-21 15:13:24 -070080
81## 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 -070082ONOS_LOGBACK=${ONOS_LOGBACK:-${ONOS_CONF_DIR}/logback.${ONOS_HOST_NAME}.xml}
Naoki Shiota9df15d32014-03-27 14:26:20 -070083ONOS_LOGBACK_BACKUP=${ONOS_LOGBACK}.bak
Naoki Shiota4e928512014-04-03 15:49:35 -070084ONOS_LOGBACK_TEMPLATE=${ONOS_TEMPLATE_DIR}/logback.xml.template
Naoki Shiota4e463182014-03-21 15:13:24 -070085LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
Naoki Shiota590c18d2014-03-31 17:52:59 -070086LOGBASE=${ONOS_LOGBASE:-onos.${ONOS_HOST_NAME}}
Naoki Shiota4e463182014-03-21 15:13:24 -070087ONOS_LOG="${LOGDIR}/${LOGBASE}.log"
88PCAP_LOG="${LOGDIR}/${LOGBASE}.pcap"
89LOGS="$ONOS_LOG $PCAP_LOG"
90
Naoki Shiota9df15d32014-03-27 14:26:20 -070091ONOS_PROPS=${ONOS_PROPS:-${ONOS_CONF_DIR}/onos.properties}
Naoki Shiota4e463182014-03-21 15:13:24 -070092JMX_PORT=${JMX_PORT:-7189}
93
94# Set JVM options
95JVM_OPTS="${JVM_OPTS:-}"
Naoki Shiota4e463182014-03-21 15:13:24 -070096JVM_OPTS="$JVM_OPTS -server -d64"
97#JVM_OPTS="$JVM_OPTS -XX:+TieredCompilation -XX:InitialCodeCacheSize=512m -XX:ReservedCodeCacheSize=512m"
Yuta HIGUCHI18354592014-04-01 13:53:42 -070098
99# Uncomment or specify appropriate value as JVM_OPTS environment variables.
100#JVM_OPTS="$JVM_OPTS -Xmx4g -Xms4g -Xmn800m"
Naoki Shiota4e463182014-03-21 15:13:24 -0700101#JVM_OPTS="$JVM_OPTS -Xmx2g -Xms2g -Xmn800m"
102#JVM_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn800m"
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700103
104#JVM_OPTS="$JVM_OPTS -XX:+UseParallelGC"
105JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
106JVM_OPTS="$JVM_OPTS -XX:+AggressiveOpts"
107
108# We may want to remove UseFastAccessorMethods option: http://bugs.java.com/view_bug.do?bug_id=6385687
109JVM_OPTS="$JVM_OPTS -XX:+UseFastAccessorMethods"
110
111JVM_OPTS="$JVM_OPTS -XX:MaxInlineSize=8192"
112JVM_OPTS="$JVM_OPTS -XX:FreqInlineSize=8192"
113JVM_OPTS="$JVM_OPTS -XX:CompileThreshold=1500"
114
Naoki Shiota4e463182014-03-21 15:13:24 -0700115JVM_OPTS="$JVM_OPTS -XX:OnError=crash-logger" ;# For dumping core
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700116
117# Workaround for Thread Priority http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html
118JVM_OPTS="$JVM_OPTS -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42"
119
120JVM_OPTS="$JVM_OPTS -XX:+UseCompressedOops"
121
122JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT"
123JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
124JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
125
Naoki Shiota4e463182014-03-21 15:13:24 -0700126JVM_OPTS="$JVM_OPTS -Dhazelcast.logging.type=slf4j"
127
Naoki Shiotad8ea71a2014-04-23 17:04:51 -0700128JVM_OPTS="${JVM_OPTS} -Dnet.onrc.onos.core.datagrid.HazelcastDatagrid.datagridConfig=${HC_CONF}"
129
Yuta HIGUCHI18354592014-04-01 13:53:42 -0700130# Uncomment to dump final JVM flags to stdout
131#JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"
132
Naoki Shiota4e463182014-03-21 15:13:24 -0700133# Set ONOS core main class
Jonathan Hart51f6f5b2014-04-03 10:32:10 -0700134MAIN_CLASS="net.onrc.onos.core.main.Main"
Naoki Shiota4e463182014-03-21 15:13:24 -0700135
136MVN=${MVN:-mvn -o}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700137############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700138
Naoki Shiota9df15d32014-03-27 14:26:20 -0700139
Naoki Shiota590c18d2014-03-31 17:52:59 -0700140############# Common functions #############
141function print_usage {
Naoki Shiota05721b32014-04-29 14:41:12 -0700142 local scriptname=`basename $0`
Naoki Shiota590c18d2014-03-31 17:52:59 -0700143 local filename=`basename ${ONOS_CONF}`
144 local usage="Usage: setup/start/stop ONOS on this server.
Naoki Shiota05721b32014-04-29 14:41:12 -0700145 \$ ${scriptname} setup [-f]
Pavlin Radoslavovd8f30d92014-04-18 13:03:09 -0700146 Set up ONOS node using ${ONOS_CONF} .
Naoki Shiota590c18d2014-03-31 17:52:59 -0700147 - generate and replace config file of ZooKeeper.
148 - create myid in ZooKeeper datadir.
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700149 - generate and replace config file for Hazelcast.
150 - generate and replace config file for RAMCloud.
Naoki Shiota590c18d2014-03-31 17:52:59 -0700151 - generate and replace logback.${ONOS_HOST_NAME}.xml
152 If -f option is used, all existing files will be overwritten without confirmation.
Naoki Shiota05721b32014-04-29 14:41:12 -0700153 \$ ${scriptname} start [single-node|coord-node|server-node|coord-and-server-node]
Naoki Shiota590c18d2014-03-31 17:52:59 -0700154 Start ONOS node with specific RAMCloud entities
155 - single-node: start ONOS with stand-alone RAMCloud
156 - coord-node : start ONOS with RAMCloud coordinator
157 - server-node: start ONOS with RAMCloud server
158 - coord-and-server-node: start ONOS with RAMCloud coordinator and server
159 * Default behavior can be defined by ${filename}
Naoki Shiota05721b32014-04-29 14:41:12 -0700160 \$ ${scriptname} stop
Naoki Shiota590c18d2014-03-31 17:52:59 -0700161 Stop all ONOS-related processes
Naoki Shiota05721b32014-04-29 14:41:12 -0700162 \$ ${scriptname} restart
Naoki Shiota590c18d2014-03-31 17:52:59 -0700163 Stop and start currently running ONOS-related processes
Naoki Shiota05721b32014-04-29 14:41:12 -0700164 \$ ${scriptname} status
Naoki Shiota590c18d2014-03-31 17:52:59 -0700165 Show status of ONOS-related processes
Naoki Shiota05721b32014-04-29 14:41:12 -0700166 \$ ${scriptname} {zk|rc-coord|rc-server|core} {start|stop|restart|status}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700167 Control specific ONOS-related process"
168
169 echo "${usage}"
Naoki Shiota4e463182014-03-21 15:13:24 -0700170}
171
172function rotate-log {
Naoki Shiota4e928512014-04-03 15:49:35 -0700173 local logfile=$1
174 local nr_max=${2:-10}
175 if [ -f $logfile ]; then
176 for i in `seq $(expr $nr_max - 1) -1 1`; do
177 if [ -f ${logfile}.${i} ]; then
178 mv -f ${logfile}.${i} ${logfile}.`expr $i + 1`
179 fi
180 done
181 mv $logfile $logfile.1
182 fi
Naoki Shiota4e463182014-03-21 15:13:24 -0700183}
184
185# kill-processes {module-name} {array of pids}
186function kill-processes {
187 # Kill the existing processes
188 local pids=$2
Naoki Shiota9df15d32014-03-27 14:26:20 -0700189 if [ ! -z "$pids" ]; then
Naoki Shiota4e463182014-03-21 15:13:24 -0700190 echo -n "Stopping $1 ... "
191 fi
192 for p in ${pids}; do
193 if [ x$p != "x" ]; then
194 kill -KILL $p
195 echo "Killed existing process (pid: $p)"
196 fi
197 done
198}
199
Naoki Shiota9a1e6d12014-04-03 14:47:12 -0700200function handle-error {
201 set -e
202
203 revert-confs
204
205 set +e
206
207 exit 1
208}
209
Naoki Shiota4e928512014-04-03 15:49:35 -0700210# revert-confs [error message]
211function revert-confs {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700212 echo -n "ERROR occurred ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700213
Naoki Shiota4e928512014-04-03 15:49:35 -0700214 revert-file `basename ${ZK_CONF}`
215 revert-file `basename ${HC_CONF}`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700216
217 echo "EXIT"
218
219 if [ ! -z "$1" ]; then
220 echo $1
221 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700222}
223
Naoki Shiota590c18d2014-03-31 17:52:59 -0700224function create-zk-conf {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700225 echo -n "Creating ${ZK_CONF} ... "
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700226
Pavlin Radoslavovd8f30d92014-04-18 13:03:09 -0700227 # Create the ZooKeeper lib directory
228 if [ ! -d ${ZK_LIB_DIR} ]; then
229 local SUDO=${SUDO:-}
230 local whoami=`whoami`
231 {
232 ${SUDO} mkdir ${ZK_LIB_DIR}
233 ${SUDO} chown ${whoami} ${ZK_LIB_DIR}
234 } || {
235 echo "FAILED"
236 echo "[ERROR] Failed to create directory ${ZK_LIB_DIR}."
237 echo "[ERROR] Please retry after setting \"env SUDO=sudo\""
238 exit 1
239 }
240 fi
241
242 # creation of ZooKeeper config
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700243 local temp_zk=`begin-conf-creation ${ZK_CONF}`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700244
Naoki Shiota4e928512014-04-03 15:49:35 -0700245 hostarr=`echo ${ZK_HOSTS} | tr "," " "`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700246
247 local i=1
248 local myid=
249 for host in ${hostarr}; do
Naoki Shiota9a1e6d12014-04-03 14:47:12 -0700250 if [ "${host}" = "${ONOS_HOST_NAME}" -o "${host}" = "${ONOS_HOST_IP}" ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700251 myid=$i
252 break
253 fi
254 i=`expr $i + 1`
255 done
256
257 if [ -z "${myid}" ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700258 local filename=`basename ${ONOS_CONF}`
Naoki Shiota35f8d5c2014-04-08 11:13:18 -0700259 revert-confs "[ERROR] In ${filename}, zookeeper.hosts must have hostname \"${ONOS_HOST_NAME}\" or IP address"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700260 fi
261
Yuta HIGUCHI69450892014-04-16 09:10:55 -0700262 if [ -f "${ZK_MY_ID}" ]; then
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700263 # sudo will be needed if ZK_MY_ID is already created by other (old) script
Yuta HIGUCHI69450892014-04-16 09:10:55 -0700264 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}."
Pavlin Radoslavovd8f30d92014-04-18 13:03:09 -0700270 echo "[ERROR] Please retry after setting \"env SUDO=sudo\""
Yuta HIGUCHI69450892014-04-16 09:10:55 -0700271 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"
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700285 echo $hostline
Naoki Shiota9df15d32014-03-27 14:26:20 -0700286 i=`expr $i + 1`
287 done
288 elif [[ $line =~ __DATADIR__ ]]; then
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700289 echo $line | sed -e "s|__DATADIR__|${ZK_LIB_DIR}|"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700290 else
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700291 echo $line
Naoki Shiota9df15d32014-03-27 14:26:20 -0700292 fi
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700293 done < ${ZK_CONF_TEMPLATE} > ${temp_zk}
294
295 end-conf-creation ${ZK_CONF}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700296
297 echo "DONE"
Naoki Shiota590c18d2014-03-31 17:52:59 -0700298}
Naoki Shiota9df15d32014-03-27 14:26:20 -0700299
Naoki Shiota4e928512014-04-03 15:49:35 -0700300function create-hazelcast-conf {
301 echo -n "Creating ${HC_CONF} ... "
302
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700303 local temp_hc=`begin-conf-creation ${HC_CONF}`
Naoki Shiota4e928512014-04-03 15:49:35 -0700304
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
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700327 elif [[ $line =~ __HC_PORT__ ]]; then
328 echo $line | sed -e "s|__HC_PORT__|${HC_HOST_PORT}|"
Naoki Shiota4e928512014-04-03 15:49:35 -0700329 else
330 echo "${line}"
331 fi
332 done < ${HC_CONF_TEMPLATE} > ${temp_hc}
333
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700334 end-conf-creation ${HC_CONF}
Naoki Shiota4e928512014-04-03 15:49:35 -0700335
336 echo "DONE"
337}
338
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700339function create-ramcloud-conf {
340 echo -n "Creating ${RAMCLOUD_CONF} ... "
341
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700342 local temp_rc=`begin-conf-creation ${RAMCLOUD_CONF}`
343
344 echo "ramcloud.coordinatorIp=${RC_COORD_PROTOCOL}:host=${RC_COORD_IP}" > ${temp_rc}
345 echo "ramcloud.coordinatorPort=port=${RC_COORD_PORT}" >> ${temp_rc}
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700346
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700347 end-conf-creation ${RAMCLOUD_CONF}
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700348
349 echo "DONE"
350}
351
Naoki Shiota590c18d2014-03-31 17:52:59 -0700352function create-logback-conf {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700353 echo -n "Creating ${ONOS_LOGBACK} ... "
Naoki Shiota590c18d2014-03-31 17:52:59 -0700354
Naoki Shiota9df15d32014-03-27 14:26:20 -0700355 # creation of logback config
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700356 local temp_lb=`begin-conf-creation ${ONOS_LOGBACK}`
357
358 sed -e "s|__FILENAME__|${ONOS_LOG}|" ${ONOS_LOGBACK_TEMPLATE} > ${temp_lb}
359
360 end-conf-creation ${ONOS_LOGBACK}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700361
Naoki Shiota9df15d32014-03-27 14:26:20 -0700362 echo "DONE"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700363}
364
Naoki Shiota4e928512014-04-03 15:49:35 -0700365function create-confs {
366 local key
367 local filename
368
Naoki Shiota9a1e6d12014-04-03 14:47:12 -0700369 trap handle-error ERR
Naoki Shiota4e928512014-04-03 15:49:35 -0700370
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700371 echo "Config file : ${ONOS_CONF}"
372
Naoki Shiota4e928512014-04-03 15:49:35 -0700373 if [ "$1" == "-f" ]; then
374 create-zk-conf
375 create-hazelcast-conf
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700376 create-ramcloud-conf
Naoki Shiota4e928512014-04-03 15:49:35 -0700377 create-logback-conf
378 else
379 create-conf-interactive ${ZK_CONF} create-zk-conf
380 create-conf-interactive ${HC_CONF} create-hazelcast-conf
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700381 create-conf-interactive ${RAMCLOUD_CONF} create-ramcloud-conf
Naoki Shiota4e928512014-04-03 15:49:35 -0700382 create-conf-interactive ${ONOS_LOGBACK} create-logback-conf
383 fi
Naoki Shiota590c18d2014-03-31 17:52:59 -0700384
385 trap - ERR
386}
387############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700388
Naoki Shiota590c18d2014-03-31 17:52:59 -0700389
390###### Functions related to ZooKeeper ######
Naoki Shiota4e463182014-03-21 15:13:24 -0700391function zk {
392 case "$1" in
393 start)
394 start-zk
395 ;;
396 stop)
397 stop-zk
398 ;;
399 stat*) # <- status
400 status-zk
401 ;;
402 re*) # <- restart
403 stop-zk
404 start-zk
405 ;;
406 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700407 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700408 exit 1
409 esac
410}
411
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700412function load-zk-cfg {
413 if [ -f "${ZK_CONF}" ]; then
414 local filename=`basename ${ZK_CONF}`
415 local dirname=`dirname ${ZK_CONF}`
416
417 # Run ZooKeeper with our configuration
418 export ZOOCFG=${filename}
419 export ZOOCFGDIR=${dirname}
420 fi
421}
422
Naoki Shiota4e463182014-03-21 15:13:24 -0700423function start-zk {
Pavlin Radoslavovd8f30d92014-04-18 13:03:09 -0700424 echo -n "Starting ZooKeeper ... "
Naoki Shiota9df15d32014-03-27 14:26:20 -0700425
Naoki Shiota4e928512014-04-03 15:49:35 -0700426 export ZOO_LOG_DIR=${ZK_LOG_DIR}
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700427 mkdir -p ${ZK_LOG_DIR}
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700428
429 load-zk-cfg
Naoki Shiota9df15d32014-03-27 14:26:20 -0700430
Naoki Shiota72209722014-04-08 14:32:17 -0700431 ${ZK_HOME}/bin/zkServer.sh start
Naoki Shiota4e463182014-03-21 15:13:24 -0700432}
433
434function stop-zk {
435 kill-processes "ZooKeeper" `jps -l | grep org.apache.zookeeper.server | awk '{print $1}'`
436}
437
438function status-zk {
Naoki Shiotab7eb55d2014-04-21 18:21:36 -0700439 load-zk-cfg
Naoki Shiota9df15d32014-03-27 14:26:20 -0700440
Naoki Shiota72209722014-04-08 14:32:17 -0700441 ${ZK_HOME}/bin/zkServer.sh status
Naoki Shiota4e463182014-03-21 15:13:24 -0700442}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700443############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700444
445
Naoki Shiota590c18d2014-03-31 17:52:59 -0700446####### Functions related to RAMCloud ######
Naoki Shiota9df15d32014-03-27 14:26:20 -0700447function start-backend {
448 if [ "${ONOS_HOST_BACKEND}" = "ramcloud" ]; then
Naoki Shiota590c18d2014-03-31 17:52:59 -0700449 if [ $1 == "coord" ]; then
450 rc-coord startifdown
451 elif [ $1 == "server" ]; then
452 rc-server startifdown
453 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700454 fi
455}
456
457function stop-backend {
458 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
459 if [ $rcsn != 0 ]; then
460 rc-server stop
461 fi
462
Naoki Shiota590c18d2014-03-31 17:52:59 -0700463 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700464 if [ $rccn != 0 ]; then
465 rc-coord stop
466 fi
467}
468
Naoki Shiota590c18d2014-03-31 17:52:59 -0700469function deldb {
470# TODO: implement
471 return
472}
473
474
Naoki Shiota4e463182014-03-21 15:13:24 -0700475### Functions related to RAMCloud coordinator
Naoki Shiota9df15d32014-03-27 14:26:20 -0700476function rc-coord-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700477 echo "${RC_COORD_PROTOCOL}:host=${RC_COORD_IP},port=${RC_COORD_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700478}
479
480function rc-server-addr {
Naoki Shiota4e928512014-04-03 15:49:35 -0700481 echo "${RC_SERVER_PROTOCOL}:host=${RC_SERVER_IP},port=${RC_SERVER_PORT}"
Naoki Shiota9df15d32014-03-27 14:26:20 -0700482}
483
Naoki Shiota4e463182014-03-21 15:13:24 -0700484function rc-coord {
485 case "$1" in
486 start)
487 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700488 stop-coord
489 start-coord
490 ;;
491 startifdown)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700492 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700493 if [ $n == 0 ]; then
494 start-coord
495 else
496 echo "$n instance of RAMCloud coordinator running"
497 fi
498 ;;
499 stop)
500 stop-coord
501 ;;
502 stat*) # <- status
503 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
504 echo "$n RAMCloud coordinator running"
505 ;;
506 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700507 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700508 exit 1
509 esac
510}
511
512function start-coord {
513 if [ ! -d ${LOGDIR} ]; then
514 mkdir -p ${LOGDIR}
515 fi
516 if [ -f $RAMCLOUD_COORD_LOG ]; then
517 rotate-log $RAMCLOUD_COORD_LOG
518 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700519
520 local coord_addr=`rc-coord-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700521
522 # Run ramcloud
523 echo -n "Starting RAMCloud coordinator ... "
Naoki Shiota72209722014-04-08 14:32:17 -0700524 ${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}/coordinator -L ${coord_addr} > $RAMCLOUD_COORD_LOG 2>&1 &
Naoki Shiota4e463182014-03-21 15:13:24 -0700525 echo "STARTED"
526}
527
528
529function stop-coord {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700530 kill-processes "RAMCloud coordinator" `pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator`
Naoki Shiota4e463182014-03-21 15:13:24 -0700531}
532
Naoki Shiota4e463182014-03-21 15:13:24 -0700533### Functions related to RAMCloud server
534function rc-server {
535 case "$1" in
536 start)
537 deldb
Naoki Shiota4e463182014-03-21 15:13:24 -0700538 stop-server
539 start-server
540 ;;
541 startifdown)
542 local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
543 if [ $n == 0 ]; then
544 start-server
545 else
546 echo "$n instance of RAMCloud server running"
547 fi
548 ;;
549 stop)
550 stop-server
551 ;;
552# deldb)
553# deldb
554# ;;
555 stat*) # <- status
556 n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
557 echo "$n RAMCloud server running"
558 ;;
559 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700560 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700561 exit 1
562 esac
563}
564
565function start-server {
566 if [ ! -d ${LOGDIR} ]; then
567 mkdir -p ${LOGDIR}
568 fi
569 if [ -f $RAMCLOUD_SERVER_LOG ]; then
570 rotate-log $RAMCLOUD_SERVER_LOG
571 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700572
573 local coord_addr=`rc-coord-addr`
574 local server_addr=`rc-server-addr`
Naoki Shiota4e463182014-03-21 15:13:24 -0700575
Yuta HIGUCHI45bc3cf2014-04-19 18:12:15 -0700576 local masterServiceThreads=$(read-conf ${ONOS_CONF} ramcloud.masterServiceThreads 5)
577 local logCleanerThreads=$(read-conf ${ONOS_CONF} ramcloud.logCleanerThreads 1)
578 local detectFailures=$(read-conf ${ONOS_CONF} ramcloud.detectFailures 0)
579
Naoki Shiota4e463182014-03-21 15:13:24 -0700580 # Run ramcloud
581 echo -n "Starting RAMCloud server ... "
Yuta HIGUCHI45bc3cf2014-04-19 18:12:15 -0700582 ${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}/server -M -L ${server_addr} -C ${coord_addr} --masterServiceThreads ${masterServiceThreads} --logCleanerThreads ${logCleanerThreads} --detectFailures ${detectFailures} > $RAMCLOUD_SERVER_LOG 2>&1 &
Naoki Shiota4e463182014-03-21 15:13:24 -0700583 echo "STARTED"
584}
585
586function stop-server {
Naoki Shiota9df15d32014-03-27 14:26:20 -0700587 kill-processes "RAMCloud server" `pgrep -f obj.${RAMCLOUD_BRANCH}/server`
Naoki Shiota4e463182014-03-21 15:13:24 -0700588}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700589############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700590
591
Naoki Shiota590c18d2014-03-31 17:52:59 -0700592## Functions related to ONOS core process ##
Naoki Shiota4e463182014-03-21 15:13:24 -0700593function onos {
Naoki Shiota590c18d2014-03-31 17:52:59 -0700594 CPFILE=${ONOS_HOME}/.javacp.${ONOS_HOST_NAME}
Naoki Shiota4e463182014-03-21 15:13:24 -0700595 if [ ! -f ${CPFILE} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700596 echo "ONOS core needs to be built"
Naoki Shiota4e463182014-03-21 15:13:24 -0700597 ${MVN} -f ${ONOS_HOME}/pom.xml compile
598 fi
599 JAVA_CP=`cat ${CPFILE}`
600 JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
601
602 case "$1" in
603 start)
604 stop-onos
605 start-onos
606 ;;
607 startnokill)
608 start-onos
609 ;;
610 startifdown)
611 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
612 if [ $n == 0 ]; then
613 start-onos
614 else
615 echo "$n instance of onos running"
616 fi
617 ;;
618 stop)
619 stop-onos
620 ;;
621 stat*) # <- status
622 n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
623 echo "$n instance of onos running"
624 ;;
625 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700626 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700627 exit 1
628 esac
629}
630
631function start-onos {
632 if [ ! -d ${LOGDIR} ]; then
633 mkdir -p ${LOGDIR}
634 fi
635 # Backup log files
636 for log in ${LOGS}; do
637 if [ -f ${log} ]; then
638 rotate-log ${log}
639 fi
640 done
Naoki Shiota9df15d32014-03-27 14:26:20 -0700641
Naoki Shiota4e463182014-03-21 15:13:24 -0700642 if [ ! -f ${ONOS_LOGBACK} ]; then
Naoki Shiota9df15d32014-03-27 14:26:20 -0700643 echo "[WARNING] ${ONOS_LOGBACK} not found."
644 echo " Run \"\$ $0 setup\" to create."
645 exit 1
Naoki Shiota4e463182014-03-21 15:13:24 -0700646 fi
Naoki Shiota9df15d32014-03-27 14:26:20 -0700647
Jonathan Hartef3dc1a2014-04-03 11:39:50 -0700648 JVM_OPTS="${JVM_OPTS} -Dnet.onrc.onos.core.datastore.backend=${ONOS_HOST_BACKEND}"
Yuta HIGUCHI13d1dbf2014-04-17 20:51:38 -0700649 if [ "${ONOS_HOST_BACKEND}" = "ramcloud" ]; then
650 JVM_OPTS="${JVM_OPTS} -Dramcloud.config.path=${RAMCLOUD_CONF}"
651 fi
652
Naoki Shiota9df15d32014-03-27 14:26:20 -0700653 # Run ONOS
Yuta HIGUCHIcce4f622014-04-18 16:48:53 -0700654
655 # Need to cd ONOS_HOME. onos.properties currently specify hazelcast config path relative to CWD
656 cd ${ONOS_HOME}
657
Naoki Shiota9df15d32014-03-27 14:26:20 -0700658 echo -n "Starting ONOS controller ..."
Naoki Shiota4e463182014-03-21 15:13:24 -0700659 java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_PROPS} > ${LOGDIR}/${LOGBASE}.stdout 2>${LOGDIR}/${LOGBASE}.stderr &
660
661 # We need to wait a bit to find out whether starting the ONOS process succeeded
662 sleep 1
663
664 n=`jps -l |grep "${MAIN_CLASS}" | wc -l`
Naoki Shiota9df15d32014-03-27 14:26:20 -0700665 if [ $n -ge 1 ]; then
Naoki Shiota4e463182014-03-21 15:13:24 -0700666 echo " STARTED"
667 else
668 echo " FAILED"
669 fi
670
671# echo "java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ./onos.properties > /dev/null 2>&1 &"
672# sudo -b /usr/sbin/tcpdump -n -i eth0 -s0 -w ${PCAP_LOG} 'tcp port 6633' > /dev/null 2>&1
673}
674
675function stop-onos {
676 kill-processes "ONOS controller" `jps -l | grep ${MAIN_CLASS} | awk '{print $1}'`
677# kill-processes "tcpdump" `ps -edalf |grep tcpdump |grep ${PCAP_LOG} | awk '{print $4}'`
678}
Naoki Shiota590c18d2014-03-31 17:52:59 -0700679############################################
Naoki Shiota4e463182014-03-21 15:13:24 -0700680
681
Naoki Shiota590c18d2014-03-31 17:52:59 -0700682################## Main ####################
Naoki Shiota4e463182014-03-21 15:13:24 -0700683case "$1" in
Naoki Shiota9df15d32014-03-27 14:26:20 -0700684 setup)
Naoki Shiota4e928512014-04-03 15:49:35 -0700685 create-confs $2
Naoki Shiota9df15d32014-03-27 14:26:20 -0700686 ;;
Naoki Shiota4e463182014-03-21 15:13:24 -0700687 start)
Naoki Shiota9df15d32014-03-27 14:26:20 -0700688 mode_parameter=${ONOS_HOST_ROLE}
689 if [ ! -z "$2" ]; then
690 mode_parameter=$2
691 fi
692
693 case "${mode_parameter}" in
Naoki Shiota4e463182014-03-21 15:13:24 -0700694 single-node)
695 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700696 start-backend coord
697 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700698 onos startifdown
699 ;;
700 coord-node)
701 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700702 start-backend coord
Naoki Shiota4e463182014-03-21 15:13:24 -0700703 onos startifdown
704 ;;
705 server-node)
706 zk start
Naoki Shiota590c18d2014-03-31 17:52:59 -0700707 start-backend server
708 onos startifdown
709 ;;
710 coord-and-server-node)
711 zk start
712 start-backend coord
713 start-backend server
Naoki Shiota4e463182014-03-21 15:13:24 -0700714 onos startifdown
715 ;;
716 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700717 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700718 ;;
719 esac
720 echo
721 ;;
722 stop)
723 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
724 if [ $on != 0 ]; then
725 onos stop
726 fi
727
Naoki Shiota9df15d32014-03-27 14:26:20 -0700728 stop-backend
Naoki Shiota4e463182014-03-21 15:13:24 -0700729
730 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
731 if [ $zkn != 0 ]; then
732 zk stop
733 fi
734 echo
735 ;;
736 restart)
737 on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
738 if [ $on != 0 ]; then
739 onos stop
740 fi
741
742 rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
743 if [ $rcsn != 0 ]; then
744 rc-server stop
745 fi
746
Naoki Shiota590c18d2014-03-31 17:52:59 -0700747 rccn=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
Naoki Shiota4e463182014-03-21 15:13:24 -0700748 if [ $rccn != 0 ]; then
749 rc-coord stop
750 fi
751
752 zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
753 if [ $zkn != 0 ]; then
754 zk restart
755 fi
756
757 if [ $rccn != 0 ]; then
758 rc-coord startifdown
759 fi
760
761 if [ $rcsn != 0 ]; then
762 rc-server startifdown
763 fi
764
765 if [ $on != 0 ]; then
766 onos startifdown
767 fi
768 echo
769 ;;
770 stat*) # <- status
771 echo '[ZooKeeper]'
772 zk status
773 echo
774 echo '[RAMCloud coordinator]'
775 rc-coord status
776 echo
777 echo '[RAMCloud server]'
778 rc-server status
779 echo
780 echo '[ONOS core]'
781 onos status
782 echo
783 ;;
784 zk)
785 zk $2
786 ;;
787 rc-c*) # <- rc-coordinator
788 rc-coord $2
789 ;;
790 rc-s*) # <- rc-server
791 rc-server $2
792 ;;
793 core)
794 onos $2
795 ;;
796 *)
Naoki Shiota590c18d2014-03-31 17:52:59 -0700797 print_usage
Naoki Shiota4e463182014-03-21 15:13:24 -0700798 exit 1
799esac
Naoki Shiota590c18d2014-03-31 17:52:59 -0700800