diff --git a/xCAT-server/share/xcat/ib/scripts/annotatelog b/xCAT-server/share/xcat/ib/scripts/annotatelog index ae03b44aa..294de6367 100644 --- a/xCAT-server/share/xcat/ib/scripts/annotatelog +++ b/xCAT-server/share/xcat/ib/scripts/annotatelog @@ -7,7 +7,7 @@ # # #-------------------------------------------------------------------------# # This xCAT script is used to parse the QLogic log entries in file -# /var/log/xcat/errorlog/[xCAT Management Nodes] on CSM Management +# /var/log/xcat/errorlog/[xCAT Management Nodes] on xCAT Management # Node by subnet manager, IB node, chassis, FRU(Field-Replaceable Unit) or a # particular node. This script is supported by both AIX and Linux MN. # From xCAT's point of view, the log to analyze must be xCAT @@ -195,7 +195,7 @@ sub getArgs() my ($hostname, $ip) = getHost($node); $node = $hostname; } - #Check nodes in NodeList and find those that are not defined in CSM database or not in Managed or MinManaged mode + #Check nodes in NodeList and find those that are not defined in xCAT database or not in Managed or MinManaged mode if (!(grep {$_ =~ /$node/} @AllNodes)) { push (@NotDefinedNodes, $node); @@ -810,7 +810,7 @@ Usage: annotatelog -f log_file [-s start_time] [-e end_time] -A Output the combination of -i, -S, -c and -u. It should be used with -g and -l flags. -f log_file Specifies a log file fullpath name to analyze. - Must be CSM consolidated log got from Qlogic HSM or ESM. + Must be xCAT consolidated log got from Qlogic HSM or ESM. -s start_time Specifies the start time for analysis, where the start_time variable has the format ddmmyyhh:mm:ss (day, month, year, diff --git a/xCAT-server/share/xcat/ib/scripts/annotatelog.README b/xCAT-server/share/xcat/ib/scripts/annotatelog.README index 561cf6fce..09045ec67 100644 --- a/xCAT-server/share/xcat/ib/scripts/annotatelog.README +++ b/xCAT-server/share/xcat/ib/scripts/annotatelog.README @@ -50,7 +50,7 @@ setup on xCAT Management Node local will move the log entries to file entries in this log file and it is difficult for the administrator to look through. annotatelog is a sample script to parse the QLogic log entries in file -/var/log/xcat/errorlog/[xCAT Management Node] on xCAT Management Server +/var/log/xcat/errorlog/[xCAT Management Node] on xCAT Management Node by subnet manager, IB node, chassis, FRU(Field-Replaceable Unit) or a particular node. This script is supported by both AIX and Linux Management Node. From xCAT's point of view, the log to analyze must be xCAT diff --git a/xCAT-server/share/xcat/ib/scripts/configCECs b/xCAT-server/share/xcat/ib/scripts/configCECs new file mode 100644 index 000000000..b3ca1a6d7 --- /dev/null +++ b/xCAT-server/share/xcat/ib/scripts/configCECs @@ -0,0 +1,743 @@ +#!/usr/bin/ksh + +########################################################################### +# +# The configCECs script is written in ksh, and used to create a full +# system partition for each CECs Managed by the HMC. It will use ssh to +# login the HMC with the hscroot userid in order to rename the CECs based +# on a certain pattern specified through command line and create full +# partition for all the CECs. +# Command Syntax: +# configCECs -H hmc_list [-c cec_format] [-l lpar_format] [-p profile_format] +# [--frame_pad_len len_number] [--node_pad_len len_number] +# [--cage_pad_len len_number] +# [--allocate_type always_all | always_list | conditional] +# [--exclude_hw ] +# [-h] +# +# -H hmc_list +# Specifies a comma-separated list of HMC host names, IP addresses to configure CECs on. +# -c cec_format +# Specifies the naming format for CEC, the default format is f%Fn%N_SN%S. +# -l lpar_format +# Specifies the naming format for LPAR, the default format is f%Fn%N. +# -p profile_format +# Specifies the naming format for profile, the default format is the same with lpar_format. +# --frame_pad_len len_number +# Specifies the number of digits used for the frame numbers, it will be zero filled if +# needed. The default value is no padding. +# --node_pad_len len_number +# Specifies the number of digits used for the node numbers, it will be zero filled if +# needed. The default value is no padding. +# --cage_pad_len len_number +# Specifies the number of digits used for the cage numbers, it will be zero filled if +# needed. The default value is no padding. +# --allocate_type +# Specifies the allocation method that is used to allocate resources to full system +# partition. The supported allocation methods are always_all, always_list and conditional. +# The default method is always_all. always_all indicates to always use the 'all resources' +# LPAR flag; always_list indicates to always explicitly list the devices in the LPAR; and +# conditional indicates to use the 'all resources' LPAR flag if not --exclude_hw is found, +# otherwise use an explicit list for the hardware. +# --exclude_hw +# Specifies a comma-separated list of hardware names or 'device id's that do not need to +# assign. The supported hardware names are RIO and 10G, RIO indicates Galaxy 1 HCA used +# for RIO connection in IH nodes; 10G indicates 2-port 10G integrated adapter in IH nodes. +# It can only be used with --allocate_type is always_list or conditional. +# -h Display usage information. +########################################################################### + +########################################################################### +# # +# Setup default values for the script's variables. Some of these might # +# be overwritten by the commmand line arguments. # +# # +########################################################################### +CEC_FILE="/tmp/Rename_cecs" +LPAR_FILE="/tmp/Build_lpars" + +CECFORMAT="f%Fn%N_SN%S" +LPARFORMAT="f%Fn%N" +PROFFORMAT="" +NODE_PAD_LENGTH=0 # A value of '0' means no padding +FRAME_PAD_LENGTH=0 # A value of '0' means no padding +CAGE_PAD_LENGTH=0 # A value of '0' means no padding +ALLOCATE_TYPE="always_all" +COMM_LPAR_INFO_AR="lpar_id=1,lpar_env=aixlinux,all_resources=1,boot_mode=norm,conn_monitoring=0" #For "all resources" +COMM_LPAR_INFO_LS="lpar_id=1,lpar_env=aixlinux,boot_mode=norm,conn_monitoring=0,proc_mode=ded,sharing_mode=keep_idle_procs" +NEW_LPAR_ID='1' +FULLPATH='NO' +NEWLINE=' +' +HAVE_PROCESSED_CAGE="" + +########################################################################### +# # +# usage for configCECs # +# # +########################################################################### +usage() +{ +echo "Usage: configCECs -H hmc_list [-c cec_format] [-l lpar_format] [-p profile_format] + [--frame_pad_len len_number] [--node_pad_len len_number] + [--cage_pad_len len_number] + [--allocate_type always_all | always_list | conditional] + [--exclude_hw ] + [-h] + + -H hmc_list + Specifies a comma-separated list of HMC host names, IP addresses to configure CECs on. + -c cec_format + Specifies the naming format for CEC, the default format is f%Fn%N_SN%S. + -l lpar_format + Specifies the naming format for LPAR, the default format is f%Fn%N. + -p profile_format + Specifies the naming format for profile, the default format is the same with lpar_format. + --frame_pad_len len_number + Specifies the number of digits used for the frame numbers, it will be zero filled if + needed. The default value is no padding. + --node_pad_len len_number + Specifies the number of digits used for the node numbers, it will be zero filled if + needed. The default value is no padding. + --cage_pad_len len_number + Specifies the number of digits used for the cage numbers, it will be zero filled if + needed. The default value is no padding. + --allocate_type + Specifies the allocation method that is used to allocate resources to full system + partition. The supported allocation methods are always_all, always_list and conditional. + The default method is always_all. always_all indicates to always use the 'all resources' + LPAR flag; always_list indicates to always explicitly list the devices in the LPAR; and + conditional indicates to use the 'all resources' LPAR flag if not --exclude_hw is found, + otherwise use an explicit list for the hardware. + --exclude_hw + Specifies a comma-separated list of hardware names or 'device id's that do not need to + assign. The supported hardware names are RIO and 10G, RIO indicates Galaxy 1 HCA used + for RIO connection in IH nodes; 10G indicates 2-port 10G integrated adapter in IH nodes. + It can only be used with --allocate_type is always_list or conditional. + -h Display usage information." +} + +############################################################################ +# # +# List all resources and exclude the resources indicated by '--exclude_hw' # +# # +############################################################################ +lsres() +{ + EXCLUDE_HW=`echo $EXCLUDE_HW | sed "s/,/\|/g"` + ########################################################### + # # + # Get the details of any HCAs in the CEC while skipping # + # the Galaxy 1 adapter for the RIO (adapter_id of # + # 230015ff). When allocate a HCA, a GUID is needed. First # + # we try to extract this GUID from unassigned_guids # + # attibute. If the unassigned_guids is null, we will try # + # to extract this GUID from assigned_guids attibute. If # + # this two attribute are both null, an error message will # + # will be printed to indicate this device can be # + # allocated. # + # # + ########################################################### + HCA_STRING="" + HCA_LIST_CMD="ssh hscroot@$HMC $LSHWRES -r hca --level sys -F adapter_id:unassigned_guids:assigned_guids -m $CEC_NAME" + TMP_HCA_LIST=`$HCA_LIST_CMD` + SAVEIFS="$IFS" + IFS="$NEWLINE" + set -A HCA_LIST $TMP_HCA_LIST + IFS="$SAVEIFS" + H_INDEX=0 + if [[ $HCA_LIST != "No results were found." ]]; then + while (($H_INDEX < ${#HCA_LIST[*]})); do + ADAPTER_ID=`echo ${HCA_LIST[$H_INDEX]} | cut -d ':' -f1` + UNASSIGNED_GUID=`echo ${HCA_LIST[$H_INDEX]} | cut -d ':' -f2` + ASSIGNED_GUID=`echo ${HCA_LIST[$H_INDEX]} | cut -d ':' -f3` + IS_EXCLUDED=`echo "$EXCLUDE_HW" | grep -q "$ADAPTER_ID" && echo yes || echo no` + if [[ $IS_EXCLUDED == "yes" ]]; then + ((H_INDEX=$H_INDEX+1)) + continue + fi + if [[ "$UNASSIGNED_GUID" != "" && "$UNASSIGNED_GUID" != "none" ]]; then + GUID=`echo $UNASSIGNED_GUID | cut -d ',' -f1` + else + if [[ "$ASSIGNED_GUID" != "" && "$ASSIGNED_GUID" != "none" ]]; then + GUID=`echo $ASSIGNED_GUID | cut -d ',' -f1` + else + echo " ERROR: The device $ADAPTER_ID could not be allocated." + ((H_INDEX=$H_INDEX+1)) + continue + fi + fi + if [[ $HCA_STRING == "" ]]; then + HCA_STRING=$ADAPTER_ID'/'$GUID'/4' + else + HCA_STRING=${HCA_STRING}','$ADAPTER_ID'/'$GUID'/4' + fi + ((H_INDEX=$H_INDEX+1)) + done + if [[ "${HCA_STRING}" != '' ]]; then + HCA_STRING=',\\\\\"hca_adapters='${HCA_STRING}'\\\\\"' + fi + fi + ########################################################### + # # + # Get the location of all the I/O slots. # + # # + ########################################################### + IO_LIST_CMD="ssh hscroot@$HMC $LSHWRES -r io --rsubtype slot -F drc_index -m $CEC_NAME" + if [[ $EXCLUDE_HW != '' ]]; then + IO_LIST_CMD=${IO_LIST_CMD}" | egrep -v \"$EXCLUDE_HW\"" + fi + set -A IO_LIST `$IO_LIST_CMD` + I_INDEX=0 + if [[ $IO_LIST != "No" ]]; then + while (($I_INDEX < ${#IO_LIST[*]})); do + if [[ $I_INDEX == "0" ]]; then + IO_STRING=${IO_LIST[$I_INDEX]}'//0' + else + IO_STRING=${IO_STRING}','${IO_LIST[$I_INDEX]}'//0' + fi + ((I_INDEX=$I_INDEX+1)) + done + if [[ "${IO_STRING}" != '' ]]; then + IO_STRING=',\\\\\"io_slots='${IO_STRING}'\\\\\"' + fi + fi + ########################################################### + # # + # Get the info on the HEAs in the CEC. # + # # + ########################################################### + HEA_LIST_CMD="ssh hscroot@$HMC $LSHWRES -r hea --rsubtype phys --level port -F adapter_id/port_group/phys_port_id/log_port_ids -m $CEC_NAME" + set -A HEA_LIST `$HEA_LIST_CMD` + IS_EXCLUDED=`echo "$EXCLUDE_HW" | grep -q "2300000c" && echo yes || echo no` + if [[ $HEA_LIST != "No" ]]; then + if [[ ${#HEA_LIST[*]} = '4' || $IS_EXCLUDED == "yes" ]]; then + HEA_STRING='23000014/2/0/1/,23000014/2/1/2/,23000014/1/0/1/,23000014/1/1/2/' + else + HEA_STRING='23000014/2/0/1/,23000014/2/1/2/,23000014/1/0/1/,23000014/1/1/2/,2300000c/2/0/1/,2300000c/1/0/1/' + fi + HEA_STRING=',\\\\\"lhea_logical_ports='${HEA_STRING}'\\\\\"' + fi + ########################################################### + # # + # Get the maximum installed memory. # + # # + ########################################################### + MAX_MEM=`ssh hscroot@$HMC $LSHWRES -r mem --level sys -F installed_sys_mem -m $CEC_NAME` + MEM_STRING=',min_mem=4096,desired_mem='$MAX_MEM',max_mem='$MAX_MEM + ########################################################### + # # + # Get the maximum installed CPUs. # + # # + ########################################################### + MAX_CPU=`ssh hscroot@$HMC $LSHWRES -r proc --level sys -F installed_sys_proc_units -m $CEC_NAME` + MAX_CPU=`echo $MAX_CPU | sed -e 's/\.0$//'` + CPU_STRING=',min_procs=1,desired_procs='$MAX_CPU',max_procs='$MAX_CPU +} + +########################################################################### +# # +# Parse/validate the commmand line arguments. # +# # +########################################################################### +OS=`uname` +if [[ "$OS" == "AIX" ]]; then + #The getopt on AIX doesn't support long options + ALLARGS=$* + ALLARGS=`echo $ALLARGS | sed -e 's/ --frame_pad_len/ -F/'` + ALLARGS=`echo $ALLARGS | sed -e 's/ --node_pad_len/ -N/'` + ALLARGS=`echo $ALLARGS | sed -e 's/ --cage_pad_len/ -G/'` + ALLARGS=`echo $ALLARGS | sed -e 's/ --allocate_type/ -A/'` + ALLARGS=`echo $ALLARGS | sed -e 's/ --exclude_hw/ -E/'` + echo "$ALLARGS" | grep " --" 2>&1 >/dev/null + if [ $? -eq 0 ]; then + strerr="Invalid options" + echo "$strerr" >&2 + usage + exit 1 + fi + args=`getopt H:c:l:p:hF:N:G:A:E: $ALLARGS 2>&1` + if [ $? -gt 0 ]; then + strerr="Invalid options" + echo "$strerr" >&2 + usage + exit 1 + fi + args=`echo $args | sed -e 's/ -F/ --frame_pad_len/'` + args=`echo $args | sed -e 's/ -N/ --node_pad_len/'` + args=`echo $args | sed -e 's/ -G/ --cage_pad_len/'` + args=`echo $args | sed -e 's/ -A/ --allocate_type/'` + args=`echo $args | sed -e 's/ -E/ --exclude_hw/'` +elif [[ "$OS" == "Linux" ]]; then + args=`getopt -u -l frame_pad_len:,node_pad_len:,cage_pad_len:,allocate_type:,exclude_hw: H:c:l:p:h $*` + if [ $? -gt 0 ]; then + strerr="Invalid options" + echo "$strerr" >&2 + usage + exit 1 + fi +else + echo "The system $OS is not supported." + exit 1 +fi + +set -- $args +for i in $args; do + case $i in + -H) + shift; + HMC_LIST=$1; + shift;; + -c) + shift; + CECFORMAT=$1; + shift;; + -l) + shift; + LPARFORMAT=$1; + shift;; + -p) + shift; + PROFFORMAT=$1; + shift;; + --frame_pad_len) + shift; + FRAME_PAD_LENGTH=$1; + if [[ `echo "$FRAME_PAD_LENGTH" | grep -sqE ^[0-9]+$ ;echo $?` != "0" ]]; then + echo "The parameter of --frame_pad_len should be an integer." + usage + exit 1 + fi + typeset -RZ${FRAME_PAD_LENGTH} F_NUM; + shift + ;; + --node_pad_len) + shift; + NODE_PAD_LENGTH=$1; + if [[ `echo "$NODE_PAD_LENGTH" | grep -sqE ^[0-9]+$ ;echo $?` != "0" ]]; then + echo "The parameter of --node_pad_len should be an integer." + usage + exit 1 + fi + typeset -RZ${NODE_PAD_LENGTH} N_NUM; + shift;; + --cage_pad_len) + shift; + CAGE_PAD_LENGTH=$1; + if [[ `echo "$CAGE_PAD_LENGTH" | grep -sqE ^[0-9]+$ ;echo $?` != "0" ]]; then + echo "The parameter of --cage_pad_len should be an integer." + usage + exit 1 + fi + typeset -RZ${CAGE_PAD_LENGTH} CAGE_NUM; + shift;; + --allocate_type) + shift; + ALLOCATE_TYPE=$1; + shift;; + --exclude_hw) + shift; + EXCLUDE_HW=$1; + shift;; + -h) + shift + usage + exit 0 + ;; + esac +done + +if [[ "$HMC_LIST" == '' ]]; then + echo "There is no HMC specified. Please use -H to specify HMC." + usage + exit 1 +fi +if [[ "$ALLOCATE_TYPE" != "always_all" ]] && [[ "$ALLOCATE_TYPE" != "always_list" ]] && [[ "$ALLOCATE_TYPE" != "conditional" ]]; then + echo "The parameter of --allocate_type is incorrect." + usage + exit 1 +fi +if [[ "$ALLOCATE_TYPE" == "always_all" ]] && [[ "$EXCLUDE_HW" != '' ]]; then + echo "The flag --exclude_hw can only be used with --allocate_type is always_list or conditional." + usage + exit 1 +fi +if [[ "$ALLOCATE_TYPE" == "conditional" ]] && [[ "$EXCLUDE_HW" != '' ]]; then + ALLOCATE_TYPE="always_list" +fi +if [[ "$ALLOCATE_TYPE" == "conditional" ]] && [[ "$EXCLUDE_HW" == '' ]]; then + ALLOCATE_TYPE="always_all" +fi +if [[ "$EXCLUDE_HW" != '' ]]; then + EXCLUDE_HW=`echo $EXCLUDE_HW | awk -F, '{ for (i=1;i<=NF;i++){ if($i=="RIO") $i="230015ff"; if($i=="10G") $i="2300000c"; } print $0 }'` + EXCLUDE_HW=`echo $EXCLUDE_HW | sed "s/ /,/g"` +fi +########################################################################### +# # +# Remove any old output files from previous runs of this script. # +# # +########################################################################### + +rm -r $CEC_FILE >/dev/null 2>&1 +rm -r $LPAR_FILE >/dev/null 2>&1 + +########################################################################### +# # +# Add the full pathname to the HMC commands if needed. # +# # +########################################################################### + +if [[ "$FULLPATH" == "YES" ]]; then + HMCPATH='/opt/hsc/bin/' +else + HMCPATH='' +fi +LSSYSCFG=${HMCPATH}'lssyscfg' +MKSYSCFG=${HMCPATH}'mksyscfg' +CHSYSCFG=${HMCPATH}'chsyscfg' +RMSYSCFG=${HMCPATH}'rmsyscfg' +LSHWRES=${HMCPATH}'lshwres' +########################################################################### +# # +# Main loop: For the given HMC ($HMC) list all it's frames. For each # +# frame display the contents of it's cages to find it's CECs. Then for # +# each CEC build the HMC commands to name the CEC and build the LPAR. # +# The HMC commands are written to the two output files ($CEC_FILE and # +# $LPAR_FILE). # +# # +########################################################################### +HMC_LIST=`echo $HMC_LIST | sed "s/,/ /g"` +for HMC in $HMC_LIST; do + echo "Checking HMC $HMC......" + SAVEIFS="$IFS" + IFS="$NEWLINE" + set -A ALLFRAMES `ssh hscroot@$HMC $LSSYSCFG -r frame -F name,frame_num,serial_num,state` + IFS="$SAVEIFS" + if [[ ${#ALLFRAMES[*]} == "0" ]]; then + echo 'ERROR: NO FRAMES WERE FOUND ON HMC' "$HMC" + continue + fi + F_INDEX=0 + while (($F_INDEX < ${#ALLFRAMES[*]})); do + SAVEIFS="$IFS" + IFS=',' + set -A FRAMELINE ${ALLFRAMES[$F_INDEX]} + IFS="$SAVEIFS" + F_NAME="${FRAMELINE[0]}" + F_NUM="${FRAMELINE[1]}" + F_SN="${FRAMELINE[2]}" + F_STATE="${FRAMELINE[3]}" + ################################################################### + # # + # Check if the frame number is invalid (0 or non-numeric). # + # # + ################################################################### + if [[ "$F_NAME" == "No results were found." ]]; then + echo 'ERROR: NO FRAMES WERE FOUND ON HMC' "$HMC" + break + fi + if [[ "$F_NUM" == "0" || `echo "$F_NUM" | grep -sqE ^[0-9]+$ ;echo $?` != "0" ]]; then + echo 'ERROR: Invalid Frame number for frame' "$F_NAME"":" "$F_NUM" + ((F_INDEX=$F_INDEX+1)) + continue + fi + + ################################################################### + # # + # Check if at least one BPA is in the 'Standby' state. # + # # + ################################################################### + if [[ `echo $F_STATE | grep -sq Standby ; echo $?` != "0" ]]; then + echo 'ERROR: Frame' "$F_NAME" 'is in incorrect state -' $F_STATE + ((F_INDEX=$F_INDEX+1)) + continue + fi + + ################################################################### + # # + # List the contents of each cage in the current frame using the # + # 'lssyscfg -r cage' command and loop through each one to find the# + # CECs. # + # # + ################################################################### + N_NUM=0 + SAVEIFS="$IFS" + IFS="$NEWLINE" + set -A ALLCAGES `ssh hscroot@$HMC $LSSYSCFG -r cage -e "$F_NAME" -F cage_num,contents,type_model_serial_num,loc_code,owner | sort -n` + IFS="$SAVEIFS" + CAGE_INDEX=0 + while (($CAGE_INDEX < ${#ALLCAGES[*]})); do + SAVEIFS="$IFS" + IFS=',' + set -A CAGELINE ${ALLCAGES[$CAGE_INDEX]} + IFS="$SAVEIFS" + CAGE_NUM="${CAGELINE[0]}" + CAGE_CONTENTS="${CAGELINE[1]}" + CAGE_TYPE_MODEL_SN="${CAGELINE[2]}" + CAGE_LOC_CODE="${CAGELINE[3]}" + CAGE_OWNER="${CAGELINE[4]}" + if [[ "$CAGE_NUM" == "No results were found." ]]; then + echo 'ERROR: NO CAGES WERE FOUND ON FRAME' "$F_NAME" + break + fi + case $CAGE_CONTENTS in + io) ;; ## Ignore RIO drawer + 48) ;; ## Ignore Federation switch board + sys) + ########################################################### + # # + # For each CEC found validate that the frame was able to # + # read it's MTMS correctly. The MTMS is the only common # + # piece of data between the 'lssyscfg -r cage' and # + # 'lssyscfg -r sys' commands. So, if the MTMS is invalid # + # skip over this CEC since will not be able to find it in # + # the 'lssyscfg -r sys' command output. The MTMS must be # + # split in 2 since 'lssyscfg -r sys' uses different fields# + # for the Model/Type and the Serial Number. # + # # + ########################################################### + echo "Frame $F_NUM Cage $CAGE_NUM contains CEC $CAGE_TYPE_MODEL_SN" + N_NUM=$((${N_NUM} + 1)) + if [[ "$CAGE_TYPE_MODEL_SN" == "No-TMS*Data!!!" ]]; then + echo " ERROR: Bad Type-Model-SN data:" "$CAGE_TYPE_MODEL_SN" + else + CAGE_TYPE_MODEL=`echo $CAGE_TYPE_MODEL_SN |cut -d '*' -f1` + CAGE_SN=`echo $CAGE_TYPE_MODEL_SN | cut -d '*' -f2` + for PREVCAGE in $HAVE_PROCESSED_CAGE; do + if [[ "$PREVCAGE" == "${CAGE_TYPE_MODEL}:${CAGE_SN}" ]]; then + PROCESSED=1 + break + fi + PROCESSED=0 + done + if [[ $PROCESSED == 1 ]]; then + echo " ERROR: ${CAGE_TYPE_MODEL}:${CAGE_SN} has already been processed." + ((CAGE_INDEX=$CAGE_INDEX+1)) + continue + fi + HAVE_PROCESSED_CAGE="${HAVE_PROCESSED_CAGE}${CAGE_TYPE_MODEL}:${CAGE_SN} " + ####################################################### + # # + # List all the CECs on this HMC and grep for the MTMS # + # that was found for the CEC in this cage. If it is # + # not found or not an IH p5 then skip over this CEC. # + # # + ####################################################### + CEC_ENTRY=`ssh hscroot@$HMC $LSSYSCFG -r sys -F name:state:power_off_policy:service_lpar_id:type_model:serial_num | grep "${CAGE_TYPE_MODEL}:${CAGE_SN}$"` + SAVE_RC=$? + if [[ "$SAVE_RC" != "0" ]]; then + echo " ERROR: Could not find System $CAGE_TYPE_MODEL $CAGE_SN on this HMC" + else + ################################################### + # # + # Save the detail data of this CEC. # + # # + ################################################### + CEC_NAME=`echo "$CEC_ENTRY" | cut -d ':' -f1` + CEC_STATE=`echo "$CEC_ENTRY" | cut -d ':' -f2` + CEC_POWER_POLICY=`echo "$CEC_ENTRY" | cut -d ':' -f3` + CEC_SERV_LPAR_ID=`echo "$CEC_ENTRY" | cut -d ':' -f4` + CEC_TYPE_MODEL=`echo "$CEC_ENTRY" | cut -d ':' -f5` + CEC_SN=`echo "$CEC_ENTRY" | cut -d ':' -f6` + ################################################### + # # + # Format the new CEC name. # + # # + ################################################### + CEC_NEW_NAME='' + PERCENT='no' + for i in `echo $CECFORMAT | sed -e 's/./& /g'`; do + if [[ $i = '%' && $PERCENT = 'no' ]]; then + PERCENT='yes' + else + if [[ $PERCENT = 'yes' ]]; then + case $i in + F) CEC_NEW_NAME=${CEC_NEW_NAME}${F_NUM} ;; + N) CEC_NEW_NAME=${CEC_NEW_NAME}${N_NUM} ;; + S) CEC_NEW_NAME=${CEC_NEW_NAME}${CEC_SN} ;; + C) CEC_NEW_NAME=${CEC_NEW_NAME}${CAGE_NUM} ;; + %) CEC_NEW_NAME=${CEC_NEW_NAME}${i} ;; + *) echo "Ignoring Invalid character "${i}" after a '%'." ;; + esac + PERCENT='no' + else + CEC_NEW_NAME=${CEC_NEW_NAME}${i} + fi + fi + done + ################################################### + # # + # If the current CEC name needs to be changed then# + # build the 'chsyscfg' command and append it to # + # the file. + # # + ################################################### + if [[ "$CEC_NAME" == "$CEC_NEW_NAME" ]]; then + echo " INFO: CEC NAME ($CEC_NAME) IS CORRECT." + else + echo " CHANGE: OLD CEC NAME:" "$CEC_NAME""." "NEW CEC NAME:" "$CEC_NEW_NAME""." + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NAME -i \"new_name=$CEC_NEW_NAME\"" >> $CEC_FILE + fi + ################################################### + # # + # Check if the CEC is powered up. If it isn't we # + # have to skip over it since it needs to be up to # + # do anything else other then changing the CEC # + # name. # + # # + ################################################### + if [[ "$CEC_STATE" == "Standby" || "$CEC_STATE" == "Operating" ]]; then + ############################################### + # # + # Make sure the CEC power off policy is set to# + # 1. This prevents the CEC from being powered # + # off when the last LPAR is shutdown. # + # # + ############################################### + if [[ "$CEC_POWER_POLICY" == "1" ]]; then + echo " INFO: CEC POWER OFF POLICY IS SET OK ($CEC_POWER_POLICY)." + else + echo " CHANGE: CEC POWER OFF POLICY IS SET WRONG ($CEC_POWER_POLICY)." + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NAME -i \"power_off_policy=1\"" >> $CEC_FILE + fi + ############################################### + # # + # Format the new LPAR name. # + # # + ############################################### + LPAR_NAME='' + PERCENT='no' + for i in `echo $LPARFORMAT | sed -e 's/./& /g'`; do + if [[ $i = '%' && $PERCENT = 'no' ]]; then + PERCENT='yes' + else + if [[ $PERCENT = 'yes' ]]; then + case $i in + F) LPAR_NAME=${LPAR_NAME}${F_NUM} ;; + N) LPAR_NAME=${LPAR_NAME}${N_NUM} ;; + S) LPAR_NAME=${LPAR_NAME}${CEC_SN} ;; + C) LPAR_NAME=${LPAR_NAME}${CAGE_NUM} ;; + %) LPAR_NAME=${LPAR_NAME}${i} ;; + *) echo "Ignoring Invalid character "${i}" after a '%'." ;; + esac + PERCENT='no' + else + LPAR_NAME=${LPAR_NAME}${i} + fi + fi + done + ############################################### + # # + # Format the new Profile name. # + # # + ############################################### + if [[ "$PROFFORMAT" == '' ]]; then + PROF_NAME=$LPAR_NAME + else + PROF_NAME='' + PERCENT='no' + for i in `echo $PROFFORMAT | sed -e 's/./& /g'`; do + if [[ $i = '%' && $PERCENT = 'no' ]]; then + PERCENT='yes' + else + if [[ $PERCENT = 'yes' ]]; then + case $i in + F) PROF_NAME=${PROF_NAME}${F_NUM} ;; + N) PROF_NAME=${PROF_NAME}${N_NUM} ;; + S) PROF_NAME=${PROF_NAME}${CEC_SN} ;; + C) PROF_NAME=${PROF_NAME}${CAGE_NUM} ;; + %) PROF_NAME=${PROF_NAME}${i} ;; + *) echo "Ignoring Invalid character "${i}" after a '%'." ;; + esac + PERCENT='no' + else + PROF_NAME=${PROF_NAME}${i} + fi + fi + done + fi + ############################################### + # # + # Check if an LPAR with this name already # + # exists on this CEC. # + # # + ############################################### + LPAR_ENTRY=`ssh hscroot@$HMC $LSSYSCFG -r lpar -m $CEC_NAME -F name:lpar_id:state --filter "lpar_names=$LPAR_NAME" ` + LPAR_ENTRY_RC="$?" + if [[ "$LPAR_ENTRY_RC" == "0" ]]; then + ########################################### + # # + # An LPAR with the this name exists. Now # + # check if the LPAR ID and the profile are# + # also correct. # + # # + ########################################### + LPAR_ID=`echo "$LPAR_ENTRY" |cut -d ':' -f2` + LPAR_STATE=`echo "$LPAR_ENTRY" |cut -d ':' -f3` + if [[ "$LPAR_ID" == "$NEW_LPAR_ID" ]]; then + echo " INFO: LPAR $LPAR_NAME IS ALREADY CONFIGURED AS ID 1" + if [[ "$CEC_SERV_LPAR_ID" == "$NEW_LPAR_ID" ]]; then + echo " INFO: SERVICE LPAR ID IS SET OK ($CEC_SERV_LPAR_ID)." + else + echo " CHANGE: SERVICE LPAR ID IS SET WRONG ($CEC_SERV_LPAR_ID)." + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NEW_NAME -i \"service_lpar_id=1\"" >> $CEC_FILE + fi + else + echo " ERROR: LPAR $LPAR_NAME IS CONFIGURED AS ID $LPAR_ID" + fi + else + ########################################### + # # + # There is no existing LPAR with the # + # requested name. # + # Now verify there is no existing LPAR # + # with the requested LPAR ID#. # + # # + ########################################### + LPAR_ENTRY=`ssh hscroot@$HMC $LSSYSCFG -r lpar -m $CEC_NAME -F name:lpar_id:state --filter "lpar_ids=$NEW_LPAR_ID" ` + LPAR_ENTRY_RC="$?" + LPAR_INFO='' + if [[ "$ALLOCATE_TYPE" == "always_all" ]]; then + LPAR_INFO=${COMM_LPAR_INFO_AR} + else + lsres + LPAR_INFO=${COMM_LPAR_INFO_LS}${CPU_STRING}${MEM_STRING}${IO_STRING}${HEA_STRING}${HCA_STRING} + fi + if [[ "$LPAR_ENTRY_RC" == "0" ]]; then + ####################################### + # # + # An existing LPAR with the requested # + # LPAR ID# (but different LPAR name) # + # was found. # + # # + ####################################### + echo " CHANGE: REMOVE LPAR ID $NEW_LPAR_ID" + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NEW_NAME -i \"service_lpar_id=none\"" >> $LPAR_FILE + echo "ssh hscroot@$HMC $RMSYSCFG -r lpar -m $CEC_NEW_NAME --id $NEW_LPAR_ID" >> $LPAR_FILE + CONFIG_DATA="name=${LPAR_NAME},profile_name=${PROF_NAME},${LPAR_INFO}" + echo " CHANGE: CREATE LPAR $LPAR_NAME as LPAR ID 1" + echo "ssh hscroot@$HMC $MKSYSCFG -r lpar -m $CEC_NEW_NAME -i \"$CONFIG_DATA\"" >> $LPAR_FILE + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NEW_NAME -i \"service_lpar_id=1\"" >> $LPAR_FILE + else + CONFIG_DATA="name=${LPAR_NAME},profile_name=${PROF_NAME},${LPAR_INFO}" + echo " CHANGE: CREATE LPAR $LPAR_NAME as LPAR ID 1" + echo "ssh hscroot@$HMC $MKSYSCFG -r lpar -m $CEC_NEW_NAME -i \"$CONFIG_DATA\"" >> $LPAR_FILE + echo "ssh hscroot@$HMC $CHSYSCFG -r sys -m $CEC_NEW_NAME -i \"service_lpar_id=1\"" >> $LPAR_FILE + fi + fi + else + echo " ERROR: CEC NOT POWERED UP. STATE IS: $CEC_STATE" + fi + fi + fi ;; + none) ;; ## Ignore empty cage in the frame + *) echo " ERROR: Unknown device in cage" $CAGE_NUM ;; + esac + ((CAGE_INDEX=$CAGE_INDEX+1)) + done + ((F_INDEX=$F_INDEX+1)) + done +done + +chmod u+x $CEC_FILE >/dev/null 2>&1 +chmod u+x $LPAR_FILE >/dev/null 2>&1 diff --git a/xCAT-server/share/xcat/ib/scripts/configCECs.README b/xCAT-server/share/xcat/ib/scripts/configCECs.README new file mode 100644 index 000000000..c76e1aa7b --- /dev/null +++ b/xCAT-server/share/xcat/ib/scripts/configCECs.README @@ -0,0 +1,121 @@ +# IBM(c) 2008 EPL license http://www.eclipse.org/legal/epl-v10.html + + +configCECs.README + +This README describes how to use the configCECs script. + +The syntax of the configCECs command is: + +configCECs -H hmc_list [-c cec_format] [-l lpar_format] [-p profile_format] + [--frame_pad_len len_number] [--node_pad_len len_number] + [--cage_pad_len len_number] + [--allocate_type always_all | always_list | conditional] + [--exclude_hw ] + [-h] + + -H hmc_list + Specifies a comma-separated list of HMC host names, IP + addresses to configure CECs on. + -c cec_format + Specifies the naming format for CEC, the default format + is f%Fn%N_SN%S. + -l lpar_format + Specifies the naming format for LPAR, the default + format is f%Fn%N. + -p profile_format + Specifies the naming format for profile, the default + format is the same with lpar_format. + --frame_pad_len len_number + Specifies the number of digits used for the frame + numbers, it will be zero filled if needed. The default + value is no padding. + --node_pad_len len_number + Specifies the number of digits used for the node numbers, + it will be zero filled if needed. The default value + is no padding. + --cage_pad_len len_number + Specifies the number of digits used for the cage numbers, + it will be zero filled if needed. The default value is + no padding. + --allocate_type + Specifies the allocation method that is used to allocate + resources to full system partition. The supported + allocation methods are always_all, always_list and + conditional. The default method is always_all. always_all + indicates to always use the 'all resources' LPAR flag; + always_list indicates to always explicitly list the + devices in the LPAR; and conditional indicates to use + the 'all resources' LPAR flag if not --exclude_hw is found, + otherwise use an explicit list for the hardware. + --exclude_hw + Specifies a comma-separated list of hardware names or + 'device id's that do not need to assign. The supported + hardware names are RIO and 10G, RIO indicates Galaxy 1 HCA + used for RIO connection in IH nodes; 10G indicates 2-port + 10G integrated adapter in IH nodes. It can only be used + with --allocate_type is always_list or conditional. + -h Display usage information. + +The configCECs script is written in ksh, and used to create a full +system partition for each CECs Managed by the HMC. It will use ssh to +login the HMC with the hscroot userid in order to rename the CECs based +on a certain pattern specified through command line and create full +partition for all the CECs. + +Since for the large HPC environment the user usually does not use many +nodes that are not IH nodes, so we only support Power6 IH servers in +this script. If the user wants to do LPAR setup for HV or HE servers, +he needs to modify this sample script manually. + +To specify the name format to be used for the CEC/LPAR/Profile, this +script uses the same logic that the 'date' command uses for specifying +how to output the date. There are 4 field descriptors that the script +will recognize: + %F = the frame number of the frame that the CEC is in + %N = the relative node number of the CEC in the frame + %C = the cage number of the CEC in the frame + %S = the serial number of the CEC +For example if you want the CEC name to be +'airbus_fn_SN', then the format to use would be +'airbus_f%Fn%N_SN%S' + +The way the script finds the CECs on the HMC is to issue the +'lssyscfg -r frame' command to find all the frames and then issues the +'lssyscfg -r cage' command for each frame to list the contents of each +cage position in a given frame. It then starts looking for CECs starting +at cage 1 and going through to the last cage. The first CEC found in a +frame is assumed to be node 1, the second node found is node two and so on. +The script then will assign each CEC a frame number, a node number, a cage +number and the Serial number of the CEC which can be used in naming the +CEC/LPAR/Profile. If no frames/cages/CECs are found on this HMC, an error +message will be displayed. + +xCAT command rspconfig could be used to setup ssh remote shell from the +xCAT Management Node to the HMCs without prompting for the hscroot password; +otherwise the user has to type in the password manually for many times. +And if the user wants to use the frame number in the name of the CEC or +LPAR then the frame number must be set on the frames through HMC Web GUI +or HMC command line before issuing this script. + +This script supports three resource allocate_types to create the full system +partition; they are always_all, always_list and conditional. The default +method is always_all. always_all indicates to always use the 'all resources' +LPAR flag; always_list indicates to always explicitly list the devices in the +LPAR; and conditional indicates to use the 'all resources' LPAR flag if not +--exclude_hw is found, otherwise use an explicit list for the hardware. + +As default, this script will assign all the resources to the full system +partition, but if the allocate_type is always_list or conditional, then the +user could use --exclude_hw flag to exclude those devices that can not be +assigned or not supported by the operating system from assignment. The +supported hardware names or 'device_id's to exclude are RIO and 10G, RIO +indicates Galaxy 1 HCA used for RIO connection in IH nodes; 10G indicates +2-port 10G integrated adapter in IH nodes. + +Actually, this script will not change the CECs/LPARs directly but creates +one or two scripts (Rename_cecs, Build_lpars) in /tmp directory on xCAT MN +that will do the changes once the user executes them. The /tmp/Rename_cecs +should be run first and then the /tmp/Build_lpars. The reason why we do it +this way is to have the user see exactly what HMC commands would be executed +and also have a better chance to fine tune the commands if it is needed.