#!/bin/bash
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@


export TRAF_CONFIG="/etc/trafodion/trafodion_config"
export NODES=""

while [[ $# -gt 0 ]]; do
    case "$1" in
        --nodes)
            NODES=$2
            shift
            ;;
        *)
            echo "***ERROR: unknown parameter '$1'"
            print_usage
            exit -1
    esac
    shift
done

source $TRAF_CONFIG

function checkForHA {

source $TRAF_CONFIG

if [[ $ENALBE_HA == "true" ]]; then
   echo -n "Enter extra backup nodes for HA (if needed): "
   read answer

   if [[ -z "$answer" ]]; then
      echo "***INFO: Didn't enter any extra backup nodes, that's okay, but remember that!"
   else
      NEW_BACKUP_DCS_NODES="$answer"
      for node in $NEW_BACKUP_DCS_NODES
      do
          BACKUP_DCS_NODES="$BACKUP_DCS_NODES $node"
      done
      sudo chmod 777 $TRAF_CONFIG
      sed -i '/\<NEW_BACKUP_DCS_NODES\>/d' $TRAF_CONFIG
      echo "export NEW_BACKUP_DCS_NODES=\"$NEW_BACKUP_DCS_NODES\"" >> $TRAF_CONFIG
      sudo chmod 777 $TRAF_CONFIG
      sed -i '/\<BACKUP_DCS_NODES\>/d' $TRAF_CONFIG
      echo "export BACKUP_DCS_NODES=\"$BACKUP_DCS_NODES\"" >> $TRAF_CONFIG
      sudo chmod 777 $TRAF_CONFIG
   fi

fi

}


function addNewNodesConfig {

source $TRAF_CONFIG

MY_NEW_NODES=""
NEW_NODES=""

for node in $NODES
do
   newNode=$(ssh -q -n $node hostname)
   if [[ $? -ne "0" ]]; then
      echo "***ERROR: UNABLE TO SSH to node $node"
      echo "***ERROR: Passwordless ssh must be set up!"
      exit -1
   fi
   NEW_NODES="$NEW_NODES $newNode"

done

for node in $NEW_NODES
do
   MY_NEW_NODES="$MY_NEW_NODES -w $node"
done


echo $MY_NEW_NODES

export PDSH_SSH_CMD="ssh -q -n %h"

export TRAF_NEW_PDSH="pdsh -R exec $MY_NEW_NODES $PDSH_SSH_CMD"
export TRAF_NEW_PDCP="pdcp -R ssh $MY_NEW_NODES"


sudo chmod 777 $TRAF_CONFIG
sed -i '/NEW_NODES\=/d' $TRAF_CONFIG
echo "export NEW_NODES=\"$NEW_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_NEW_NODES\=/d' $TRAF_CONFIG
echo "export MY_NEW_NODES=\"$MY_NEW_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/TRAF_NEW_PDSH\=/d' $TRAF_CONFIG
echo "export TRAF_NEW_PDSH=\"$TRAF_NEW_PDSH\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/TRAF_NEW_PDCP\=/d' $TRAF_CONFIG
echo "export TRAF_NEW_PDCP=\"$TRAF_NEW_PDCP\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
}

function copyHBaseTrx {

source $TRAF_CONFIG

cp $HADOOP_PATH/hbase-trx* $PWD
cp $HADOOP_PATH/trafodion-utility* $PWD

$TRAF_NEW_PDCP $PWD/hbase-trx* $HOME
$TRAF_NEW_PDCP $PWD/trafodion-utility* $HOME

$TRAF_NEW_PDSH sudo cp $HOME/hbase-trx* $HADOOP_PATH
$TRAF_NEW_PDSH sudo cp $HOME/trafodion-utility* $HADOOP_PATH

$TRAF_NEW_PDSH sudo chmod 644 $HADOOP_PATH/hbase-trx*
$TRAF_NEW_PDSH sudo chmod 644 $HADOOP_PATH/trafodion-utility*

}

function createNewNodes {

source $TRAF_CONFIG

for node in $NEW_NODES
do
  if [[ ! $NODE_LIST  =~ .*$node.* ]]; then
     NODE_LIST="$NODE_LIST $node"
     MY_NODES="$MY_NODES -w $node"
     ALL_NODE_LIST="$ALL_NODE_LIST $node"
     ALL_NODES="$ALL_NODES -w $node"
     HADOOP_NODES="$HADOOP_NODES $node"
     MY_HADOOP_NODES="$MY_HADOOP_NODES -w $node"
     HDFS_NODES="$HDFS_NODES $node"
     MY_HDFS_NODES="$MY_HDFS_NODES -w $node"
     HBASE_NODES="$HBASE_NODES $node"
     MY_HBASE_NODES="$MY_HBASE_NODES -w $node"
  fi
done

hadoop_node_count=$(echo $HADOOP_NODES | wc -w)
export TRAF_PDSH="pdsh -R exec $ALL_NODES $PDSH_SSH_CMD"
export TRAF_PDCP="pdcp -R ssh $ALL_NODES"
sudo chmod 777 $TRAF_CONFIG
sed -i '/TRAF_PDSH\=/d' $TRAF_CONFIG
echo "export TRAF_PDSH=\"$TRAF_PDSH\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/TRAF_PDCP\=/d' $TRAF_CONFIG
echo "export TRAF_PDCP=\"$TRAF_PDCP\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HADOOP_NODES\=/d' $TRAF_CONFIG
echo "export HADOOP_NODES=\"$HADOOP_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HADOOP_NODES\=/d' $TRAF_CONFIG
echo "export MY_HADOOP_NODES=\"$MY_HADOOP_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HDFS_NODES\=/d' $TRAF_CONFIG
echo "export HDFS_NODES=\"$HDFS_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HDFS_NODES\=/d' $TRAF_CONFIG
echo "export MY_HDFS_NODES=\"$MY_HDFS_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/HBASE_NODES\=/d' $TRAF_CONFIG
echo "export HBASE_NODES=\"$HBASE_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_HBASE_NODES\=/d' $TRAF_CONFIG
echo "export MY_HBASE_NODES=\"$MY_HBASE_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/ALL_NODES\=/d' $TRAF_CONFIG
echo "export ALL_NODES=\"$ALL_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/ALL_NODE_LIST\=/d' $TRAF_CONFIG
echo "export ALL_NODE_LIST=\"$ALL_NODE_LIST\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/MY_NODES\=/d' $TRAF_CONFIG
echo "export MY_NODES=\"$MY_NODES\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/NODE_LIST\=/d' $TRAF_CONFIG
echo "export NODE_LIST=\"$NODE_LIST\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG
sed -i '/hadoop_node_count\=/d' $TRAF_CONFIG
echo "export hadoop_node_count=\"$hadoop_node_count\"" >> $TRAF_CONFIG
sudo chmod 777 $TRAF_CONFIG

}

function removeNodeExclude {

source $TRAF_CONFIG
temp=""

for node in $TRAF_EXCLUDE_LIST
do
   if [[ ! $NODES  =~ .*$node.* ]]; then
      temp="$temp $node"
   fi

done
excludeCount=$(echo $TRAF_EXCLUDE_LIST | wc -w)
tempCount=$(echo $temp | wc -w)


if [[ "$excludeCount" -eq "$tempCount" ]]; then
#New node name
   changeNodeName
   NAME_CHANGE="true"
   sudo chmod 777 $TRAF_CONFIG
   sed -i '/NAME_CHANGE\=/d' $TRAF_CONFIG
   echo "export NAME_CHANGE=\"$NAME_CHANGE\"" >> $TRAF_CONFIG
   sudo chmod 777 $TRAF_CONFIG
else
   TRAF_EXCLUDE_LIST=$temp
   sudo chmod 777 $TRAF_CONFIG
   sed -i '/TRAF_EXCLUDE_LIST\=/d' $TRAF_CONFIG
   echo "export TRAF_EXCLUDE_LIST=\"$TRAF_EXCLUDE_LIST\"" >> $TRAF_CONFIG
   sudo chmod 777 $TRAF_CONFIG
fi

}

function changeNodeName {

source $TRAF_CONFIG

for node in $NODES
do

   export oldNODENAME=$(echo $TRAF_EXCLUDE_LIST | head -n1 | awk '{print $1;}')
   temp=""

   for nodes in $TRAF_EXCLUDE_LIST
   do
       if [[ "$oldNODENAME" != $nodes ]]; then
          temp="$temp $nodes"
       fi
   done 
   export TRAF_EXCLUDE_LIST=$temp

   oldToNew="$oldNODENAME $node"
   echo
   echo "********************************************************************"
   echo "***VERY IMPORTANT: User must change old user name to a new user name."
   echo "***VERY IMPORTANT: open another session and sudo su trafodion"
   echo "***VERY IMPORTANT: sqshell -a"
   echo "***VERY IMPORTANT: node name $oldToNew"
   sleep 5
   echo -n "***VERY IMPORTANT: Press any key when complete."
   read answer  
   echo
   echo "********************************************************************"
  
   sudo sed -i -e "s/\<$oldNODENAME\>/$node/g" $TRAF_HOME/tmp/cluster.conf
   sudo sed -i -e "s/\<$oldNODENAME\>/$node/g" $TRAF_HOME/sql/scripts/sqconfig
   sudo rm -rf $TRAF_HOME/tmp/se*
   sudo rm -rf $TRAF_HOME/sql/scripts/se*
   sudo chmod 777 $TRAF_CONFIG
   sed -i '/TRAF_EXCLUDE_LIST\=/d' $TRAF_CONFIG
   echo "export TRAF_EXCLUDE_LIST=\"$TRAF_EXCLUDE_LIST\"" >> $TRAF_CONFIG
   sudo chmod 777 $TRAF_CONFIG

done

}

function createConfigDir {

$TRAF_NEW_PDSH sudo mkdir -p /etc/trafodion

}

function copyConfig {

source $TRAF_CONFIG

cp $TRAF_CONFIG $PWD
$TRAF_PDCP $PWD/trafodion_config $HOME
$TRAF_PDSH sudo cp $HOME/trafodion_config /etc/trafodion/
$TRAF_PDSH sudo chmod 777 $TRAF_CONFIG

}

function checkHBaseTrx {

source $TRAF_CONFIG

for node in $HBASE_NODES
do
   copiedOver=$(ssh -q -n $node sudo ls $HADOOP_PATH/hbase-trx* | wc -l)
   if [[ $copiedOver -ne "1" ]]; then
      echo "***ERROR: $hbase_trx_jar was not copied on $node"
      echo "***ERROR: Please investigate why this happened"
      echo "***ERROR: Trafodion can not start without this. EXITING..."
      exit -1
   fi
done

echo "***INFO: hbase-trx file copied correctly! Huzzah."

}

function cleanUp {

$TRAF_NEW_PDSH rm -rf $HOME/hbase-trx*
$TRAF_NEW_PDSH rm -rf trafodion_config
$TRAF_NEW_PDSH rm -rf trafodion-util*

}


function printMessage {

source $TRAF_CONFIG
echo "***IMPORTANT: Go restart HBase on new nodes"
echo "***IMPORTANT: Wait until that is done... then..."
echo "***IMPORTANT: Ready to run addNode_step2"
echo

}


#Main

checkForHA
addNewNodesConfig
copyHBaseTrx
createNewNodes
removeNodeExclude
createConfigDir
copyConfig
checkHBaseTrx
cleanUp
printMessage

