3 # Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
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
13 # Print any error messages
14 test "$1" != "" && echo " ERROR: $1"
16 # Print standard usage help
18 This script is used to configure cluster parameters on this
19 controller. The user should restart controller to apply changes.
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.
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.
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
42 ################################################
43 ## Configure Cluster ##
44 ################################################
51 ################################################
52 ## NOTE: Manually restart controller to ##
53 ## apply configuration. ##
54 ################################################
58 # Utility function for joining strings.
64 final=${final}${delim}${str}
70 function create_strings
72 # Using a list of controller IPs, create the strings for data
73 # and rpc seed nodes, as well as the list of members.
75 # First create an arrays with one string per controller.
76 # Then merge the array using the join utility defined above.
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}\\\"
85 DATA_SEED_LIST=$(join ${ds[@]})
86 RPC_SEED_LIST=$(join ${rpc[@]})
87 MEMBER_NAME_LIST=$(join ${members[@]})
90 function module_shards_builder
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}"
98 echo -e ${module_shards_string}"\n]"
101 function modules_builder
104 modules_string="modules = [\n\t"
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},"
111 # using ::-1 below to remove the extra comma we get from the above loop
112 echo -e ${modules_string::-1}"\n]"
115 function get_cli_params
117 # Check if params have been supplied
118 test $# -eq 0 && usage
120 # First param is index, and rest are controller list
124 # Verify we have controller list
125 test "${CONTROLLER_LIST}" == "" && usage "Missing controller list"
127 # Create the list of controllers from the CONTROLLER_LIST variable
128 CONTROLLERIPS=( ${CONTROLLER_LIST//,/ } )
130 test ${INDEX} -le 0 -o ${INDEX} -gt ${#CONTROLLERIPS[@]} && \
131 usage "Invalid index"
133 CONTROLLER_ID="member-${INDEX}"
134 CONTROLLER_IP="${CONTROLLERIPS[((${INDEX} - 1))]}"
138 function modify_conf_files
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}
145 echo "Configuring hostname in akka.conf"
146 sed -i -e "s/hostname[ ]*=.*\"/hostname = \"${CONTROLLER_IP}\"/" ${AKKACONF}
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}
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"
157 module_shards_builder > ${MODULESHARDSCONF}
158 modules_builder > ${MODULESCONF}
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}
167 function verify_configuration_files
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
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
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
193 NOTE: Cluster configuration files not found. Copying from
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}
203 ERROR: Cluster configurations files not found. Please\
204 configure clustering feature.
215 verify_configuration_files
223 # vim: ts=4 sw=4 sts=4 et ft=sh :