X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=scripts%2Fhost-add-develop.sh;h=01b877f2d9baf229fc35bd595e12301333b69e6a;hb=9cead2a0262deabadc900d580ef312fbc468efc0;hp=ed84cdfcf958fca43507d08368b52047d69ec8dd;hpb=9a61c6b761065160d0889e7bd1e0f9fc37de5310;p=osm%2Fopenvim.git diff --git a/scripts/host-add-develop.sh b/scripts/host-add-develop.sh index ed84cdf..01b877f 100755 --- a/scripts/host-add-develop.sh +++ b/scripts/host-add-develop.sh @@ -24,17 +24,23 @@ #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)." + + echo -e "\nUsage: $0 --user-name --ip= --cores= --huge-pages-1G= --nb-10GB-interfaces==" + echo -e "Generate a develop host yaml to be used for openvim host-add\n" + echo -e " --user-name -u * Server OAM Ip" + echo -e " --ip -i * Server hostname" + echo -e " --cores -c Numa Cores available must be an odd number and bigger or equal to 4." + echo -e " --huge-pages-1G -hp 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 -ni Dataplane interfaces must be an odd number and bigger or equal to 4." + echo -e " * Mandatory arguments" + echo -e "\n" + 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_hash_value() { echo `eval echo $\{\`echo $USER[$IP]\`\}`; } function get_mac(){ seed=$1 @@ -47,105 +53,297 @@ function get_mac(){ echo $mac } +function _parse_opts(){ -#check root privileges and non a root user behind + #help argument + if [ -n "$option_help" ]; + then + usage + fi -[ "$#" -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 " -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++)) + #User argument + [ -z "$option_user_name" ] && echo -e "ERROR: User argument is mandatory, --user-name=\n" && usage + USER_NAME=${option_user_name} + + [ -z "$option_ip" ] && echo -e "ERROR: OAM IP argument is mandatory, --ip=\n" && usage + IP=${option_ip} + + #TODO to be checl diference between real cores an numa cores + #cores argument + REAL_CORES=$(grep -c "^processor" "/proc/cpuinfo") + if [ -z "$option_cores" ] ; then + CORES=REAL_CORES + else + CORES=${option_cores} + fi + + #Ensure the core user input is big enough + ([ $((CORES%2)) -ne 0 ]) && echo -e "ERROR: Wrong number of cores\n" && usage + + MEMORY=$(($(grep MemTotal /proc/meminfo | awk '{print $2}') /1024/1024)) + if [ -z "$option_huge_pages_1G" ] ; then + HUGE_PAGES_MEMORY=0 + else + HUGE_PAGES_MEMORY=${option_huge_pages_1G} + fi + #Ensure the memory user input is big enough + #([ $((MEMORY%2)) -ne 0 ] || [ $MEMORY -lt 16 ] ) && echo -e "ERROR: Wrong number of memory\n" && usage + + #nb_10GB_interfaces argument + if [ -z "$nb_10GB_interfaces" ] ; then + INTERFACES=8 + else + INTERFACES=${nb_10GB_interfaces} + fi + ([ $((INTERFACES%2)) -ne 0 ] || [ $INTERFACES -lt 4 ] ) && echo -e "ERROR: Wrong number of interfaces\n" && usage + + # Parameter by default + NUMAS=1 + ([ $((NUMAS%2)) -ne 0 ]) && NUMAS=1 +} + +function _generate_compute_develope_yaml(){ + + _yaml_init + + FEATURES_LIST="lps,dioc,hwsv,tlbps,ht,lps,64b,iommu" + + #Generate a cpu topology for 4 numas with hyperthreading + #in this developing/fake server all cores can be used + #TODO check if this calculation is correct + echo2file "#This file was created by $0" + echo2file "#for adding this compute node to openvim" + echo2file "#copy this file to openvim controller and run" + echo2file "#openvim host-add " + echo2file + echo2file "host:" + echo2file " name: $HOST_NAME" + echo2file " user: $USER_NAME" + echo2file " ip_name: $IP" + echo2file "host-data:" + echo2file " name: $HOST_NAME" + echo2file " user: $USER_NAME" + echo2file " ip_name: $IP" + echo2file " ranking: 100" + echo2file " description: $HOST_NAME" + echo2file " features: $FEATURES_LIST" + echo2file " numas:" + + numa=0 + last_iface=0 + iface_counter=0 + + while [ $numa -lt $NUMAS ] + do + + HUGE_PAGES=$((HUGE_PAGES_MEMORY/2-2)) + ([ ${HUGE_PAGES} -lt -1 ]) && HUGE_PAGES=0 + + echo2file " - numa_socket: $numa" + #MEMORY + echo2file " hugepages: $((HUGE_PAGES))" + echo2file " memory: $((MEMORY/$NUMAS))" + #CORES + echo2file " cores:" + + for((n_core=0;n_core<$REAL_CORES;n_core++)) + do + THREAD_ID=$(($n_core+1)) + CORE_ID=$(($((${n_core}+${numa}))/2)) + echo2file " - core_id: ${CORE_ID}" + echo2file " thread_id: ${THREAD_ID}" + [ $CORE_ID -eq 0 ] && echo2file " status: noteligible" + + thread_counter=$((thread_counter+1)) + done + # GENERATE INTERFACES INFORMATION AND PRINT IT + seed=$RANDOM + echo2file " interfaces:" + for ((iface=0;iface<$INTERFACES;iface+=2)) + do + name="iface$iface_counter" + bus=$((iface+last_iface)) + bus=$((iface)) + pci=`printf "0000:%02X:00.0" $bus` + mac=`get_mac $seed` + seed=$((seed+1)) + + echo2file " - source_name: $name" + echo2file " Mbps: 10000" + echo2file " pci: \"$pci\"" + echo2file " mac: \"$mac\"" + echo2file " sriovs:" + + PCI_COUNTER=0 + for((nb_sriov=0;nb_sriov<8;nb_sriov++)) + do + #PCI_COUNTER=$((PCI_COUNTER+2)) + #echo2file "nb_sriov "$nb_sriov + #echo2file "PCI_COUNTER "$PCI_COUNTER + + pci=`printf "0000:%02X:10.%i" $bus $nb_sriov` + mac=`get_mac $seed` + seed=$((seed+1)) + echo2file " - source_name: eth$nb_sriov" + echo2file " mac: \"$mac\"" + echo2file " pci: \"$pci\"" + 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 +} + +function _yaml_init(){ + echo -n > host-develope.yaml +} + +function echo2file(){ + echo "${1}" + echo "${1}" >> host-develope.yaml +} + +function _get_opts() +{ + options="$1" + shift + + get_argument="" + #reset variables + params="" + for option_group in $options 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" + _name=${option_group%%:*} + _name=${_name%=} + _name=${_name//-/_} + eval option_${_name}='""' 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 + + while [[ $# -gt 0 ]] + do + argument="$1" + shift + if [[ -n $get_argument ]] + then + [[ ${argument:0:1} == "-" ]] && echo "option '-$option' requires an argument" >&2 && return 1 + eval ${get_argument}='"$argument"' + #echo option $get_argument with argument + get_argument="" + continue + fi + + + #short options + if [[ ${argument:0:1} == "-" ]] && [[ ${argument:1:1} != "-" ]] && [[ ${#argument} -ge 2 ]] + then + index=0 + while index=$((index+1)) && [[ $index -lt ${#argument} ]] + do + option=${argument:$index:1} + bad_option=y + for option_group in $options + do + _name="" + for o in $(echo $option_group | tr ":=" " ") + do + [[ -z "$_name" ]] && _name=${o//-/_} + #echo option $option versus $o + if [[ "$option" == "${o}" ]] + then + eval option_${_name}='${option_'${_name}'}-' + bad_option=n + if [[ ${option_group:${#option_group}-1} != "=" ]] + then + continue + fi + if [[ ${#argument} -gt $((index+1)) ]] + then + eval option_${_name}='"${argument:$((index+1))}"' + index=${#argument} + else + get_argument=option_${_name} + #echo next should be argument $argument + fi + + break + fi + done + done + [[ $bad_option == y ]] && echo "invalid argument '-$option'? Type -h for help" >&2 && return 1 + done + elif [[ ${argument:0:2} == "--" ]] && [[ ${#argument} -ge 3 ]] + then + option=${argument:2} + option_argument=${option#*=} + option_name=${option%%=*} + [[ "$option_name" == "$option" ]] && option_argument="" + bad_option=y + for option_group in $options + do + _name="" + for o in $(echo $option_group | tr ":=" " ") + do + [[ -z "$_name" ]] && _name=${o//-/_} + #echo option $option versus $o + if [[ "$option_name" == "${o}" ]] + then + bad_option=n + if [[ ${option_group:${#option_group}-1} != "=" ]] + then #not an argument + [[ -n "${option_argument}" ]] && echo "option '--${option%%=*}' do not accept an argument " >&2 && return 1 + eval option_${_name}='"${option_'${_name}'}-"' + elif [[ -n "${option_argument}" ]] + then + eval option_${_name}='"${option_argument}"' + else + get_argument=option_${_name} + #echo next should be argument $argument + fi + break + fi + done + done + [[ $bad_option == y ]] && echo "invalid argument '-$option'? Type -h for help" >&2 && return 1 + elif [[ ${argument:0:2} == "--" ]] + then + option__="$*" + bad_option=y + for o in $options + do + if [[ "$o" == "--" ]] + then + bad_option=n + option__=" $*" + break + fi + done + [[ $bad_option == y ]] && echo "invalid argument '--'? Type -h for help" >&2 && return 1 + break + else + params="$params ${argument}" + fi + + done + + [[ -n "$get_argument" ]] && echo "option '-$option' requires an argument" >&2 && return 1 + return 0 +} + +#process options +DIRNAME=$(readlink -f ${BASH_SOURCE[0]}) +DIRNAME=$(dirname $DIRNAME) + +#source ${DIRNAME}/get-options.sh "help:h user:u= ip:i= cores:c= huge-pages-1G:hp= nb-10GB-interfaces:ni=" $* +_get_opts "help:h user-name:u= ip:i= cores:c= huge-pages-1G:hp= nb-10GB-interfaces:ni=" $* || exit 1 +_parse_opts + +#check root privileges +[ "${USER}" != "root" ] && echo "Needed root privileges" >&2 && exit 2 +#check root privileges and non a root user behind + + +HOST_NAME=`cat /etc/hostname` + +_generate_compute_develope_yaml