#!/bin/bash
# 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.

#set -x
 
usage() {
  printf "Usage: %s \n" $(basename $0) >&2

}
moveConfigToBond() {
  bond=$1
  bondMaster=$(xe bond-param-get param-name=master uuid=$bond)
  bondMasterIp=$(xe pif-param-get param-name=IP uuid=$bondMaster)
  if [ -z "$bondMasterIp" ]; then
    bondSlaves=$(xe bond-param-get param-name=slaves uuid=$bond| tr ';' ' ')
    for bondSlave in $bondSlaves; do
      bondSlaveIp=$(xe pif-param-get param-name=IP uuid=$bondSlave)
      if [ -n "$bondSlaveIp" ]; then
        mode=$(xe pif-param-get param-name=IP-configuration-mode uuid=$bondSlave)
        netmask=$(xe pif-param-get param-name=netmask uuid=$bondSlave)
        gateway=$(xe pif-param-get param-name=gateway uuid=$bondSlave)       
        DNS=$(xe pif-param-get param-name=DNS uuid=$bondSlave)
        management=$(xe pif-param-get param-name=management uuid=$bondSlave)
        slavedevice=$(xe pif-param-get param-name=device uuid=$bondSlave)
        masterdevice=$(xe pif-param-get param-name=device uuid=$bondMaster)
        echo "  --configure $masterdevice($bondMaster) DNS=$DNS gateway=$gateway IP=$bondSlaveIp mode=$mode netmask=$netmask"
        xe pif-reconfigure-ip DNS=$DNS gateway=$gateway IP=$bondSlaveIp mode=$mode netmask=$netmask uuid=$bondMaster
        if [ $? -ne 0 ]; then
          echo "  --Failed to configure $masterdevice($bondMaster), please run xe pif-reconfigure-ip DNS=$DNS gateway=$gateway IP=$bondSlaveIp mode=$mode netmask=$netmask uuid=$bondMaster manually"
          exit 1
        fi
        echo "  --Succeeded"
        if [ "$management" = "true" ]; then
          echo "  --move management interface from $slavedevice($bondSlave) to $masterdevice($bondMaster)"
          xe host-management-reconfigure pif-uuid=$bondMaster 
          if [ $? -ne 0 ]; then
            echo "  --Failed to move management interface from $bondSlave to $bondMaster, please run xe host-management-reconfigure pif-uuid=$bondMaster manually"
            exit 1
          fi
          echo "  --Succeeded"
        fi
        echo "  --remove configuration from $slavedevice($bondSlave)"
        xe pif-reconfigure-ip mode=None uuid=$bondSlave
        echo "  --Succeeded"
        break
      fi
      xe pif-plug uuid=$bondMaster
    done
  fi
} 

poolUuid=$(xe pool-list | grep ^uuid | awk '{print $NF}')
hostMaster=$(xe pool-param-get uuid=$poolUuid param-name=master)
masterName=$(xe host-param-get param-name=hostname uuid=$hostMaster)
masterAddress=$(xe host-param-get param-name=address uuid=$hostMaster)

echo "#Begin check"
echo "##check master $masterName $masterAddress $hostMaster"
masterPifs=$(xe pif-list host-uuid=$hostMaster| grep ^uuid | awk '{print $NF}')
for pif in $masterPifs; do
  bond=$(xe pif-param-get param-name=bond-master-of uuid=$pif)
  if [ -n "$bond" ]; then
    moveConfigToBond $bond
  fi
done
echo "##done for master $hostMaster"

hostSlaves=$(xe host-list | grep ^uuid | awk '{print $NF}')

for hostSlave in $hostSlaves; do
  if [ "$hostSlave" != "$hostMaster" ]; then
    slaveName=$(xe host-param-get param-name=hostname uuid=$hostSlave)
    slaverAddress=$(xe host-param-get param-name=address uuid=$hostSlave)
    echo "##check slave $slaveName $slaveAddress $hostSlave"
    slavePifs=$(xe pif-list host-uuid=$hostSlave| grep ^uuid | awk '{print $NF}')
    for slavePif in $slavePifs; do
      bond=$(xe pif-param-get param-name=bond-master-of uuid=$slavePif)
      if [ -n "$bond" ]; then
        moveConfigToBond $bond
      fi
    done
    for masterPif in $masterPifs; do
      network=$(xe pif-param-get param-name=network-uuid uuid=$masterPif)
      management=$(xe pif-param-get param-name=management uuid=$masterPif)
      slavePif=$(xe pif-list host-uuid=$hostSlave network-uuid=$network | grep ^uuid | awk '{print $NF}')
      if [ -z "$slavePif" ]; then
        echo "  --ERROR:There is no NIC $device on host $hostSlave on network $network, please check"
        exit 1
      fi
    done
    echo "##done for slave $hostSlave"
  fi
done
echo "#check is successful, you can add these hosts to CloudStack."
