5607767eed05a299abf1d45f4363638a0547196c
[integration/distribution.git] / opendaylight / src / main / assembly / bin / configure_cluster.sh
1 #!/bin/bash
2 #
3 # Copyright (c) 2015 Brocade Communications Systems, Inc. and others.  All rights reserved.
4 #
5 # This program and the accompanying materials are made available under the
6 # terms of the Eclipse Public License v1.0 which accompanies this distribution,
7 # and is available at http://www.eclipse.org/legal/epl-v10.html
8 #
9
10
11 function usage()
12 {
13     # Print any error messages
14     test "$1" != "" && echo " ERROR: $1"
15
16     # Print standard usage help
17     cat << EOF
18  This script is used to configure cluster parameters on this
19  controller. The user should restart controller to apply changes.
20
21  Usage: $0 <index> <seed_nodes_list>
22   - index: Integer within 1..N, where N is the number of seed nodes.
23   - seed_nodes_list: List of seed nodes, separated by comma or space.
24
25  The address at the provided index should belong this controller.
26  When running this script on multiple seed nodes, keep the
27  seed_node_list same, and vary the index from 1 through N.
28
29  Optionally, shards can be configured in a more granular way by
30  modifying the file "custom_shard_configs.txt" in the same folder
31  as this tool.  Please see that file for more details
32
33 EOF
34
35     exit 1
36 }
37
38
39 function start_banner
40 {
41 cat <<EOF
42 ################################################
43 ##             Configure Cluster              ##
44 ################################################
45 EOF
46 }
47
48 function end_banner
49 {
50 cat <<EOF
51 ################################################
52 ##   NOTE: Manually restart controller to     ##
53 ##         apply configuration.               ##
54 ################################################
55 EOF
56 }
57
58 # Utility function for joining strings.
59 function join {
60     delim=',\n\t\t\t\t'
61     final=$1; shift
62
63     for str in $* ; do
64         final=${final}${delim}${str}
65     done
66
67     echo ${final}
68 }
69
70 function create_strings
71 {
72     # Using a list of controller IPs, create the strings for data
73     # and rpc seed nodes, as well as the list of members.
74
75     # First create an arrays with one string per controller.
76     # Then merge the array using the join utility defined above.
77     count=1
78     for ip in ${CONTROLLERIPS[@]} ; do
79         ds[$count]=\\\"akka.tcp:\\/\\/opendaylight-cluster-data@${ip}:2550\\\"
80         rpc[$count]=\\\"akka.tcp:\\/\\/odl-cluster-rpc@${ip}:2551\\\"
81         members[$count]=\\\"member-${count}\\\"
82         count=$[count + 1]
83     done
84
85     DATA_SEED_LIST=$(join ${ds[@]})
86     RPC_SEED_LIST=$(join ${rpc[@]})
87     MEMBER_NAME_LIST=$(join ${members[@]})
88 }
89
90 function module_shards_builder
91 {
92
93     module_shards_string="module-shards = [\n\t{\n\t\tname = \"default\"\n\t\tshards = [\n\t\t\t{\n\t\t\t\tname = \"default\"\n\t\t\t\treplicas = []\n\t\t\t}\n\t\t]\n\t}"
94     for name in ${FRIENDLY_MODULE_NAMES[@]} ; do
95         module_shards_string="${module_shards_string},\n\t{\n\t\tname = \"${name}\"\n\t\tshards = [\n\t\t\t{\n\t\t\t\tname=\"${name}\"\n\t\t\t\treplicas = []\n\t\t\t}\n\t\t]\n\t}"
96     done
97
98     echo -e ${module_shards_string}"\n]"
99 }
100
101 function modules_builder
102 {
103
104     modules_string="modules = [\n\t"
105     count=1
106     for name in ${FRIENDLY_MODULE_NAMES[@]} ; do
107         modules_string="${modules_string}\n\t{\n\t\tname = \"${name}\"\n\t\tnamespace = \"${MODULE_NAMESPACES[${count}]}\"\n\t\tshard-strategy = \"module\"\n\t},"
108         count=$[count + 1]
109     done
110
111     # using ::-1 below to remove the extra comma we get from the above loop
112     echo -e ${modules_string::-1}"\n]"
113 }
114
115 function get_cli_params
116 {
117     # Check if params have been supplied
118     test $# -eq 0 && usage
119
120     # First param is index, and rest are controller list
121     INDEX=$1; shift
122     CONTROLLER_LIST=$*
123
124     # Verify we have controller list
125     test "${CONTROLLER_LIST}" == "" && usage "Missing controller list"
126
127     # Create the list of controllers from the CONTROLLER_LIST variable
128     CONTROLLERIPS=( ${CONTROLLER_LIST//,/ } )
129
130     test ${INDEX} -le 0 -o ${INDEX} -gt ${#CONTROLLERIPS[@]} && \
131         usage "Invalid index"
132
133     CONTROLLER_ID="member-${INDEX}"
134     CONTROLLER_IP="${CONTROLLERIPS[((${INDEX} - 1))]}"
135 }
136
137
138 function modify_conf_files
139 {
140     BIN_DIR=`dirname $0`
141     CUSTOM_SHARD_CONFIG_FILE=${BIN_DIR}'/custom_shard_config.txt'
142     echo "Configuring unique name in akka.conf"
143     sed -i -e "/roles[ ]*=/ { :loop1 /.*\]/ b done1; N; b loop1; :done1 s/roles.*\]/roles = [\"${CONTROLLER_ID}\"]/}" ${AKKACONF}
144
145     echo "Configuring hostname in akka.conf"
146     sed -i -e "s/hostname[ ]*=.*\"/hostname = \"${CONTROLLER_IP}\"/" ${AKKACONF}
147
148     echo "Configuring data and rpc seed nodes in akka.conf"
149     sed -i -e "/seed-nodes[ ]*=/ { :loop2 /.*\]/ b done2; N; b loop2; :done2 s/seed-nodes.*opendaylight-cluster-data.*\]/seed-nodes = [${DATA_SEED_LIST}]/; s/seed-nodes.*odl-cluster-rpc.*\]/seed-nodes = [${RPC_SEED_LIST}]/}" ${AKKACONF}
150
151     if [ -f ${CUSTOM_SHARD_CONFIG_FILE} ]; then
152         source ${CUSTOM_SHARD_CONFIG_FILE}
153         if [ "${#FRIENDLY_MODULE_NAMES[@]}" -ne "${#MODULE_NAMESPACES[@]}" ]; then
154             echo -e "\ncustom shard config file \"${CUSTOM_SHARD_CONFIG_FILE}\" does not have the same number of FRIENDLY_MODULE_NAMES[] and MODULE_NAMESPACES[]\n"
155             exit 1
156         fi
157         module_shards_builder > ${MODULESHARDSCONF}
158         modules_builder > ${MODULESCONF}
159         cat ${MODULESCONF}
160     fi
161
162     echo "Configuring replication type in module-shards.conf"
163     sed -i -e "/^[^#].*replicas[ ]*=/ { :loop /.*\]/ b done; N; b loop; :done s/replicas.*\]/replicas = [${MEMBER_NAME_LIST}]/}" ${MODULESHARDSCONF}
164 }
165
166
167 function verify_configuration_files
168 {
169     # Constants
170     BIN_DIR=`dirname $0`
171     test ${BIN_DIR} == '.' && BIN_DIR=${PWD}
172     CONTROLLER_DIR=`dirname ${BIN_DIR}`
173     CONF_DIR=${CONTROLLER_DIR}/configuration/initial
174     AKKACONF=${CONF_DIR}/akka.conf
175     MODULESCONF=${CONF_DIR}/modules.conf
176     MODULESHARDSCONF=${CONF_DIR}/module-shards.conf
177
178     # Verify configuration files are present in expected location.
179     if [ ! -f ${AKKACONF} -o ! -f ${MODULESHARDSCONF} ]; then
180         # Check if the configuration files exist in the system
181         # directory, then copy them over.
182         ORIG_CONF_DIR=${CONTROLLER_DIR}/system/org/opendaylight/controller/sal-clustering-config
183         version=$(sed -n -e 's/.*<version>\(.*\)<\/version>/\1/p' ${ORIG_CONF_DIR}/maven-metadata-local.xml)
184         ORIG_CONF_DIR=${ORIG_CONF_DIR}/${version}
185         ORIG_AKKA_CONF=sal-clustering-config-${version}-akkaconf.xml
186         ORIG_MODULES_CONF=sal-clustering-config-${version}-moduleconf.xml
187         ORIG_MODULESHARDS_CONF=sal-clustering-config-${version}-moduleshardconf.xml
188
189         if [ -f ${ORIG_CONF_DIR}/${ORIG_AKKA_CONF} -a \
190              -f ${ORIG_CONF_DIR}/${ORIG_MODULES_CONF} -a \
191              -f ${ORIG_CONF_DIR}/${ORIG_MODULESHARDS_CONF} ]; then
192             cat <<EOF
193  NOTE: Cluster configuration files not found. Copying from
194  ${ORIG_CONF_DIR}
195 EOF
196             mkdir -p ${CONF_DIR}
197             cp ${ORIG_CONF_DIR}/${ORIG_AKKA_CONF} ${AKKACONF}
198             cp ${ORIG_CONF_DIR}/${ORIG_MODULES_CONF} ${MODULESCONF}
199             cp ${ORIG_CONF_DIR}/${ORIG_MODULESHARDS_CONF} ${MODULESHARDSCONF}
200
201         else
202             cat << EOF
203  ERROR: Cluster configurations files not found. Please\
204  configure clustering feature.
205 EOF
206             exit 1
207         fi
208     fi
209 }
210
211 function main
212 {
213     get_cli_params $*
214     start_banner
215     verify_configuration_files
216     create_strings
217     modify_conf_files
218     end_banner
219 }
220
221 main $*
222
223 # vim: ts=4 sw=4 sts=4 et ft=sh :