From: Leonardo Date: Thu, 17 Nov 2016 13:33:07 +0000 (+0100) Subject: Dev compute script generation X-Git-Tag: v1.0.2~10 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=d9cd59644f3427709741bdf711057e069cb6ce72;p=osm%2Fopenvim.git Dev compute script generation Signed-off-by: Leonardo --- diff --git a/scripts/configure-compute-node-develop-UBUNTU16.04.sh b/scripts/configure-compute-node-develop-UBUNTU16.04.sh new file mode 100644 index 0000000..4abe3c7 --- /dev/null +++ b/scripts/configure-compute-node-develop-UBUNTU16.04.sh @@ -0,0 +1,432 @@ +#!/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 +## + +# Authors: Antonio Lopez, Pablo Montes, Alfonso Tierno +# June 2015 + +# Personalize RHEL7.1 on compute nodes +# Prepared to work with the following network card drivers: +# tg3, igb drivers for management interfaces +# ixgbe (Intel Niantic) and i40e (Intel Fortville) drivers for data plane interfaces + +# To download: +# wget https://raw.githubusercontent.com/nfvlabs/openmano/master/scripts/configure-compute-node-develope-UBUNTU16.04.sh +# To execute: +# chmod +x ./configure-compute-node-RHEL7.1.sh +# sudo ./configure-compute-node-RHEL7.1.sh + +# Assumptions: +# All virtualization options activated on BIOS (vt-d, vt-x, SR-IOV, no power savings...) +# RHEL7.1 installed without /home partition and with the following packages selection: +# @base, @core, @development, @network-file-system-client, @virtualization-hypervisor, @virtualization-platform, @virtualization-tools + +interfaced_path='/etc/network/interfaces.d/' +#interfaced_path='/home/ubuntu/openvim_install/openvim/test-inter/' +set_mtu_path='/etc/' +VLAN_INDEX=20 +function _usage(){ + + echo -e "Usage: sudo $0 [-y] " + echo -e " Configure compute host for VIM usage. (version 0.4). Params:" + echo -e " -y do not prompt for confirmation. If a new user is created, the user name is set as password" + echo -e " Create if not exist and configure this user for openvim to connect" + echo -e " if suplied creates bridge interfaces on this interface, needed for openvim" +} + +function _interface_cfg_generator(){ + #$1 interface name | $2 MTU | $3 type + +echo " +auto ${1} +iface ${1} inet ${3} + mtu ${2} + ${bridge_ports} +" >> ${interfaced_path}${1}."cfg" +} + + +function _interface_cfg_generator(){ + #$1 interface name | $2 vlan | $3 virbrMan | $4 MTU + +echo " +auto ${1}.${2} +iface ${1}.${2} inet manual + mtu ${4} + post-up vconfig add ${1} ${2} + post-down vconfig rem ${1}.${2} + +auto ${3} +iface ${3} inet manual + bridge_ports ${1}.${2} + mtu ${4} + vlan-raw-device $1 +" >> ${interfaced_path}${1}.${2}."cfg" +} + +function _install_user() { + # create user given by the user and add to groups need it. + # Add required groups + groupadd -f admin + groupadd -f libvirt #for other operating systems may be libvirtd + + # Adds user, default password same as name + if grep -q "^${user_name}:" /etc/passwd + then + #user exist, add to group + echo "adding user ${user_name} to groups libvirt,admin" + usermod -a -G libvirt,admin -g admin ${user_name} + else + #create user if it does not exist + [ -z "$FORCE" ] && read -p "user '${user_name}' does not exist, create (Y/n)" kk + if ! [ -z "$kk" -o "$kk"="y" -o "$kk"="Y" ] + then + exit + fi + echo "creating and configuring user ${user_name}" + useradd -m -G libvirt,admin -g admin ${user_name} + #Password + if [ -z "$FORCE" ] + then + echo "Provide a password for ${user_name}" + passwd ${user_name} + else + echo -e "$user_name\n$user_name" | passwd --stdin ${user_name} + fi + fi + +} + +function _openmano_img_2_libvirt_img(){ + # Links the OpenMANO required folder /opt/VNF/images to /var/lib/libvirt/images. + # The OS installation + # should have only a / partition with all possible space available + + echo " link /opt/VNF/images to /var/lib/libvirt/images" + if [ "$user_name" != "" ] + then + # The orchestator needs to link the images folder + rm -f /opt/VNF/images + mkdir -p /opt/VNF/ + ln -s /var/lib/libvirt/images /opt/VNF/images + chown -R ${user_name}:admin /opt/VNF + chown -R root:admin /var/lib/libvirt/images + chmod g+rwx /var/lib/libvirt/images + else + mkdir -p /opt/VNF/images + chmod o+rx /opt/VNF/images + fi +} + +function _install_pacckags_dependences() +{ + # Required packages by openvim + apt-get -y update + apt-get -y install grub-common screen virt-manager ethtool build-essential \ + x11-common x11-utils libguestfs-tools hwloc libguestfs-tools \ + numactl vlan nfs-common nfs-kernel-server + echo "Remove unneeded packages....." + apt-get -y autoremove +} + +function _network_configuration(){ + # adding vlan support + grep -q '8021q' '/etc/modules'; [ $? -eq 1 ] && sudo su -c 'echo "8021q" >> /etc/modules' + + #grep -q ${interface} '/etc/network/interfaces.d/50-cloud-init.cfg'; [ $? -eq 0 ] && sed -e '/'${interface}'/ s/^#*/#/' -i '/etc/network/interfaces.d/50-cloud-init.cfg' + + # Network interfaces static configuration + echo "Interface ==> $interface" + if [ -n "$interface" ] + then + # For management and data interfaces + rm -f /etc/udev/rules.d/pci_config.rules # it will be created to define VFs + # Set ONBOOT=on and MTU=9000 on the interface used for the bridges + echo "configuring iface $interface" + + # Static network interface configuration and MTU + MTU=9000 + virbrMan_interface_number=20 + + #Create bridge interfaces + echo "Creating bridge ifaces: " + for ((i =1; i <= ${virbrMan_interface_number}; i++)) + do + i2digits=${i} + [ ${i} -lt 10 ] && i2digits="0${i}" + echo " ${interface} ${VLAN_INDEX}${i2digits}" + echo " virbrMan${i} vlan ${VLAN_INDEX}${i2digits}" + j=${i} + #$1 interface name | $2 vlan | $3 MTU | $3 virbrMan | $4 bridge_ports + _interface_cfg_generator ${interface} ${VLAN_INDEX}${i2digits} 'virbrMan'${i} ${MTU} + done + + fi +} + +function _disable_aaparmor(){ + #Deactivating apparmor while looking for a better solution + /etc/init.d/apparmor stop + update-rc.d -f apparmor remove +} + +function _check_interface(){ + #check if interface given as an argument exits + if [ -n "$1" ] && ! ifconfig $1 &> /dev/null + then + echo "Error: interface '$1' is not present in the system"\n + _usage + exit 1 + fi +} + +function _user_remainder_pront() +{ + echo + echo "Do not forget to create a shared (NFS, Samba, ...) where original virtual machine images are allocated" + echo + echo "Do not forget to copy the public ssh key into /home/${user_name}/.ssh/authorized_keys for authomatic login from openvim controller" + echo + echo "Reboot the system to make the changes effective" +} + +function _libvirt_configuration(){ + # Libvirt options for openvim + echo "configure Libvirt options" + sed -i 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirt"/' /etc/libvirt/libvirtd.conf + sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/' /etc/libvirt/libvirtd.conf + sed -i 's/#unix_sock_dir = "\/var\/run\/libvirt"/unix_sock_dir = "\/var\/run\/libvirt"/' /etc/libvirt/libvirtd.conf + sed -i 's/#auth_unix_rw = "none"/auth_unix_rw = "none"/' /etc/libvirt/libvirtd.conf + + chmod a+rwx /var/lib/libvirt/images + mkdir /usr/libexec/ + pushd /usr/libexec/ + ln -s /usr/bin/qemu-system-x86_64 qemu-kvm + popd +} + +function _hostinfo_config() +{ + + echo "#By default openvim assumes control plane interface naming as em1,em2,em3,em4 " > /opt/VNF/images/hostinfo.yaml + echo "creating local information /opt/VNF/images/hostinfo.yaml" + echo "#and bridge ifaces as virbrMan1, virbrMan2, ..." >> /opt/VNF/images/hostinfo.yaml + echo "#if compute node contain a different name it must be indicated in this file" >> /opt/VNF/images/hostinfo.yaml + echo "#with the format extandard-name: compute-name" >> /opt/VNF/images/hostinfo.yaml + chmod o+r /opt/VNF/images/hostinfo.yaml +} + +function _get_opts() +{ + [[ ${BASH_SOURCE[0]} != $0 ]] && ___exit="return" || ___exit="exit" + + options="$1" + shift + + get_argument="" + #reset variables + params="" + for option_group in $options + do + _name=${option_group%%:*} + _name=${_name%=} + _name=${_name//-/_} + eval option_${_name}='""' + done + + while [[ $# -gt 0 ]] + do + argument="$1" + shift + if [[ -n $get_argument ]] + then + [[ ${argument:0:1} == "-" ]] && echo "option '-$option' requires an argument" >&2 && $___exit 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 && $___exit 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 && $___exit 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 && $___exit 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 && $___exit 1 + break + else + params="$params ${argument}" + fi + + done + + [[ -n "$get_argument" ]] && echo "option '-$option' requires an argument" >&2 && $___exit 1 + $___exit 0 + +} + +function _parse_opts() +{ + FORCE="" + if [ -n "$option_help" ]; + then + _usage + exit -1 + fi + + if [ -n "$option_force" ]; + then + FORCE="yes" + echo "force = yes" + fi + + [ -z "$option_user" ] && echo -e "ERROR: User argument is mandatory, --user=\n" && usage + USER=${option_user} + echo "user_name = "$option_user + + [ -z "$option_iface_name" ] && echo -e "ERROR: User argument is mandatory, --user=\n" && usage + interface=$option_iface_name + +} +#1 CHECK input parameters +#1.1 root privileges +[ "${USER}" != "root" ] && echo "Needed root privileges" && _usage && exit -1 + + +#Parse opts +_get_opts "help:h force:f user:u= iface-name:in= " $* +_parse_opts + +echo "checking interface "$interface + +_check_interface $interface + +echo ' +################################################################# +##### INSTALL USER ##### +#################################################################' +_install_user + +echo ' +################################################################# +##### INSTALL NEEDED PACKETS ##### +#################################################################' +_install_pacckags_dependences + +echo ' +################################################################# +##### OTHER CONFIGURATION ##### +#################################################################' +_openmano_img_2_libvirt_img +_hostinfo_config +_libvirt_configuration + +echo ' +################################################################# +##### NETWORK CONFIGURATION ##### +#################################################################' +_network_configuration +_disable_aaparmor +_user_remainder_pront + + + diff --git a/scripts/host-add-develop.sh b/scripts/host-add-develop.sh index ed84cdf..d62db8d 100755 --- a/scripts/host-add-develop.sh +++ b/scripts/host-add-develop.sh @@ -1,3 +1,4 @@ + #!/bin/bash ## @@ -24,17 +25,22 @@ #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 --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 -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 "\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)." + echo -e "\n" 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,298 @@ 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" ] && echo -e "ERROR: User argument is mandatory, --user=\n" && usage + USER=${option_user} + + [ -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" + echo2file " ip_name: $IP" + echo2file "host-data:" + echo2file " name: $HOST_NAME" + echo2file " user: $USER" + 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 - 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" + + 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 - - 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() +{ + [[ ${BASH_SOURCE[0]} != $0 ]] && ___exit="return" || ___exit="exit" + + options="$1" + shift + + get_argument="" + #reset variables + params="" + for option_group in $options + do + _name=${option_group%%:*} + _name=${_name%=} + _name=${_name//-/_} + eval option_${_name}='""' + done + + while [[ $# -gt 0 ]] + do + argument="$1" + shift + if [[ -n $get_argument ]] + then + [[ ${argument:0:1} == "-" ]] && echo "option '-$option' requires an argument" >&2 && $___exit 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 && $___exit 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 && $___exit 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 && $___exit 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 && $___exit 1 + break + else + params="$params ${argument}" + fi + + done + + [[ -n "$get_argument" ]] && echo "option '-$option' requires an argument" >&2 && $___exit 1 + $___exit 0 + +} + +#check root privileges and non a root user behind +[ "${USER}" != "root" ] && echo "Needed root privileges" && _usage && exit -1 + +#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:u= ip:i= cores:c= huge-pages-1G:hp= nb-10GB-interfaces:ni=" $* +_parse_opts + +HOST_NAME=`cat /etc/hostname` + +_generate_compute_develope_yaml