Initial openvim v0.4.6 upload
[osm/openvim.git] / scripts / host-add-develop.sh
diff --git a/scripts/host-add-develop.sh b/scripts/host-add-develop.sh
new file mode 100755 (executable)
index 0000000..dce4bde
--- /dev/null
@@ -0,0 +1,151 @@
+#!/bin/bash
+
+##
+# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
+# This file is part of openmano
+# 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
+