#!/bin/bash

##
# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
# This file is part of openvim
# All Rights Reserved.
#
# Licensed 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##

#Get configuration of a host for using it as a compute node

function usage(){
    echo  -e "usage: $0 user ip_name nb_cores GiB_memory nb_10GB_interfaces [hostname] [>> host.yaml]\n  Get host parameters and generated a yaml file to be used for openvim host-add"
    echo -e "  - In case hostname is not specified it will be used the name of the machine where the script is run"
    echo -e "  - nb_cores must be an odd number and bigger or equal to 4."
    echo -e "  - GiB_memory must be an odd number and bigger or equal to 16. 4GiB of memory will be reserved for the host OS, the rest will be used by VM."
    echo -e "  - nb_10GB_interfaces must be an odd number and bigger or equal to 4."
    echo -e "  - The output will be a server descriptor with two numas and resources (memory, cores and interfaces) equally distributed between them."
    echo -e "  - Each interface (physical funtion) will have defined 8 SR-IOV (virtual functions)."
    exit 1
}

function get_hash_value() {   echo `eval  echo $\{\`echo $1[$2]\`\}`; }

function get_mac(){
  seed=$1
  b1=$((seed%16)); seed=$((seed/16))
  b2=$((seed%16)); seed=$((seed/16))
  b3=$((seed%16)); seed=$((seed/16))
  b4=$((seed%16)); seed=$((seed/16))
  b5=$((seed%16)); seed=$((seed/16))
  mac=`printf "%02X:%02X:%02X:%02X:%02X:%02X" 2 $b5 $b4 $b3 $b2 $b1`
  echo $mac
}


#check root privileges and non a root user behind

[ "$#" -lt "5" ] && echo "Missing parameters" && usage
[ "$#" -gt "6" ] && echo "Too many parameters" && usage
HOST_NAME=`cat /etc/hostname`
[ "$#" -eq "6" ] && HOST_NAME=$6
FEATURES_LIST="lps,dioc,hwsv,tlbps,ht,lps,64b,iommu"
NUMAS=2
CORES=$3
MEMORY=$4
INTERFACES=$5

#Ensure the user input is big enough
([ $((CORES%2)) -ne 0 ] || [ $CORES -lt 4 ] ) && echo -e "ERROR: Wrong number of cores\n" && usage
([ $((MEMORY%2)) -ne 0 ] || [ $MEMORY -lt 16 ] ) && echo -e "ERROR: Wrong number of memory\n" && usage
([ $((INTERFACES%2)) -ne 0 ] || [ $INTERFACES -lt 4 ] ) && echo -e "ERROR: Wrong number of interfaces\n" && usage

#Generate a cpu topology for 4 numas with hyperthreading
CPUS=`pairs_gap=$((CORES/NUMAS));numa=0;inc=0;sibling=0;for((thread=0;thread<=$((pairs_gap-1));thread++)); do printf " ${numa}-${sibling}-${thread} ${numa}-${sibling}-$((thread+pairs_gap))";numa=$(((numa+1)%$NUMAS)); sibling=$((sibling+inc)); inc=$(((inc+1)%2));  done`     

#in this developing/fake server all cores can be used

echo "#This file was created by $0"
echo "#for adding this compute node to openvim"
echo "#copy this file to openvim controller and run"
echo "#openvim host-add <this>"
echo
echo "host:"
echo "  name:    $HOST_NAME"
echo "  user:    $1"
echo "  ip_name: $2"
echo "host-data:"
echo "  name:        $HOST_NAME"
echo "  user:        $1"
echo "  ip_name:     $2"
echo "  ranking:     100"
echo "  description: $HOST_NAME"
echo "  features:    $FEATURES_LIST"
echo "  numas:"

numa=0
last_iface=0
iface_counter=0
while [ $numa -lt $NUMAS ]
do
  echo "  - numa_socket:  $numa"
#MEMORY
  echo "    hugepages: $((MEMORY/2-2))"
  echo "    memory:    $((MEMORY/2))"

#CORES
  echo "    cores:"
  for cpu in $CPUS
  do
    PHYSICAL=`echo $cpu | cut -f 1 -d"-"`
    CORE=`echo $cpu | cut -f 2 -d"-"`
    THREAD=`echo $cpu | cut -f 3 -d"-"`
    [ $PHYSICAL != $numa ] && continue   #skip non physical
    echo "    - core_id:   $CORE"
    echo "      thread_id: $THREAD"
    [ $CORE -eq 0 ] && echo "      status:    noteligible"
  done
 

  #GENERATE INTERFACES INFORMATION AND PRINT IT
  seed=$RANDOM
  echo "    interfaces:"
  for ((iface=0;iface<$INTERFACES;iface+=2))
  do
    name="iface$iface_counter"
    bus=$((iface+last_iface))
    pci=`printf "0000:%02X:00.0" $bus`
    mac=`get_mac $seed`
    seed=$((seed+1))
  
    echo "    - source_name: $name"
    echo "      Mbps: 10000"
    echo "      pci: \"$pci\""
    echo "      mac: \"$mac\""
    echo "      switch_dpid: \"01:02:03:04:05:06\""
    echo "      switch_port: fake0/$iface_counter"
    echo "      sriovs:"

    for((nb_sriov=0;nb_sriov<8;nb_sriov++))
    do
      pci=`printf "0000:%02X:10.%i" $bus $nb_sriov`
      mac=`get_mac $seed`
      seed=$((seed+1))
      echo "      - mac: \"$mac\""
      echo "        pci: \"$pci\""
      echo "        source_name: $nb_sriov"
    done
  
  iface_counter=$((iface_counter+1))
  done
  last_iface=$(((numa+1)*127/NUMAS+5)) #made-up formula for more realistic pci numbers 
  

  numa=$((numa+1))
done

