blob: ed84cdfcf958fca43507d08368b52047d69ec8dd [file] [log] [blame]
#!/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