Check in configCECs which could help to create a lpar per CEC

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2863 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
wanghuaz 2009-03-10 06:58:21 +00:00
parent 8ea0b8d20c
commit 6424d0aa51
4 changed files with 868 additions and 4 deletions

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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_f<frame#>n<node#>_SN<serial#>', 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.