Whamcloud - gitweb
LU-5104 build: utilities cleanup
[fs/lustre-release.git] / lustre / scripts / lustre_config.in
diff --git a/lustre/scripts/lustre_config.in b/lustre/scripts/lustre_config.in
deleted file mode 100644 (file)
index fcdf45f..0000000
+++ /dev/null
@@ -1,768 +0,0 @@
-#!/bin/bash
-
-# vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
-
-#
-# lustre_config - format and set up multiple lustre servers from a csv file
-#
-# This script is used to parse each line of a spreadsheet (csv file) and 
-# execute remote commands to format (mkfs.lustre) every Lustre target 
-# that will be part of the Lustre cluster.
-# 
-# In addition, it can also verify the network connectivity and hostnames in 
-# the cluster, configure Linux MD/LVM devices and produce High-Availability
-# software configurations for Heartbeat or CluManager.
-#
-################################################################################
-
-# Usage
-usage() {
-    cat <<EOF
-
-Usage: $(basename $0) [options] <-a|-w|-x> <csv file>
-
-    This script is used to format and set up multiple lustre servers from a
-    csv file.
-
-    Options:
-    -h          help and examples
-    -a          select all the nodes from the csv file to operate on
-    -w hostname,hostname,...
-                select the specified list of nodes (separated by commas) to
-                operate on rather than all the nodes in the csv file
-    -x hostname,hostname,...
-                exclude the specified list of nodes (separated by commas)
-    -t HAtype   produce High-Availability software configurations
-                The argument following -t is used to indicate the High-
-                Availability software type. The HA software types which 
-                are currently supported are: hbv1 (Heartbeat version 1)
-                and hbv2 (Heartbeat version 2).
-    -n          no net - don't verify network connectivity and hostnames
-                in the cluster
-    -d          configure Linux MD/LVM devices before formatting the
-                Lustre targets
-    -f          force-format the Lustre targets using --reformat option
-    -m          no fstab change - don't modify /etc/fstab to add the new
-                Lustre targets
-                If using this option, then the value of "mount options"
-                item in the csv file will be passed to mkfs.lustre, else
-                the value will be added into the /etc/fstab.
-    -u          upgrade Lustre targets from 1.4 to 1.6
-    -v          verbose mode
-    csv file    a spreadsheet that contains configuration parameters
-                (separated by commas) for each target in a Lustre cluster
-
-EOF
-}
-
-# Samples 
-sample() {
-    cat <<EOF
-
-This script is used to parse each line of a spreadsheet (csv file) and 
-execute remote commands to format (mkfs.lustre) every Lustre target 
-that will be part of the Lustre cluster.
-
-It can also optionally: 
- * upgrade Lustre targets from 1.4 to 1.6
- * verify the network connectivity and hostnames in the cluster
- * configure Linux MD/LVM devices
- * modify /etc/modprobe.conf to add Lustre networking info
- * add the Lustre server info to /etc/fstab
- * produce configurations for Heartbeat or CluManager.
-
-There are 5 kinds of line formats in the csv file. They represent the following 
-targets:
-1) Linux MD device
-The format is:
-hostname,MD,md name,operation mode,options,raid level,component devices
-
-hostname            hostname of the node in the cluster
-MD                  marker of MD device line
-md name             MD device name, e.g. /dev/md0
-operation mode      create or remove, default is create
-options             a "catchall" for other mdadm options, e.g. "-c 128"
-raid level          raid level: 0,1,4,5,6,10,linear and multipath
-component devices   block devices to be combined into the MD device
-                    Multiple devices are separated by space or by using
-                    shell expansions, e.g. "/dev/sd{a,b,c}"
-
-2) Linux LVM PV (Physical Volume)
-The format is:
-hostname,PV,pv names,operation mode,options
-
-hostname            hostname of the node in the cluster
-PV                  marker of PV line
-pv names            devices or loopback files to be initialized for later
-                    use by LVM or to be wiped the label, e.g. /dev/sda
-                    Multiple devices or files are separated by space or by
-                    using shell expansions, e.g. "/dev/sd{a,b,c}"
-operation mode      create or remove, default is create
-options             a "catchall" for other pvcreate/pvremove options
-                    e.g. "-vv"
-
-3) Linux LVM VG (Volume Group)
-The format is:
-hostname,VG,vg name,operation mode,options,pv paths
-
-hostname            hostname of the node in the cluster
-VG                  marker of VG line
-vg name             name of the volume group, e.g. ost_vg
-operation mode      create or remove, default is create
-options             a "catchall" for other vgcreate/vgremove options
-                    e.g. "-s 32M"
-pv paths            physical volumes to construct this VG, required by
-                    create mode
-                    Multiple PVs are separated by space or by using
-                    shell expansions, e.g. "/dev/sd[k-m]1"
-
-4) Linux LVM LV (Logical Volume)
-The format is:
-hostname,LV,lv name,operation mode,options,lv size,vg name
-
-hostname            hostname of the node in the cluster
-LV                  marker of LV line
-lv name             name of the logical volume to be created (optional)
-                    or path of the logical volume to be removed (required
-                    by remove mode)
-operation mode      create or remove, default is create
-options             a "catchall" for other lvcreate/lvremove options
-                    e.g. "-i 2 -I 128"
-lv size             size [kKmMgGtT] to be allocated for the new LV
-                    Default unit is megabytes.
-vg name             name of the VG in which the new LV will be created
-
-5) Lustre target
-The format is:
-hostname,module_opts,device name,mount point,device type,fsname,mgs nids,index,
-format options,mkfs options,mount options,failover nids
-
-hostname            hostname of the node in the cluster, must match "uname -n"
-module_opts         Lustre networking module options
-device name         Lustre target (block device or loopback file)
-mount point         Lustre target mount point
-device type         Lustre target type (mgs, mdt, ost, mgs|mdt, mdt|mgs)
-fsname              Lustre filesystem name, should be limited to 8 characters 
-                    Default is "lustre".
-mgs nids            NID(s) of remote mgs node, required for mdt and ost targets
-                    If this item is not given for an mdt, it is assumed that
-                    the mdt will also be an mgs, according to mkfs.lustre.
-index               Lustre target index
-format options      a "catchall" contains options to be passed to mkfs.lustre
-                    "--device-size", "--param", etc. all goes into this item.
-mkfs options        format options to be wrapped with --mkfsoptions="" and
-                    passed to mkfs.lustre
-mount options       If this script is invoked with "-m" option, then the value of
-                    this item will be wrapped with --mountfsoptions="" and passed
-                    to mkfs.lustre, else the value will be added into /etc/fstab.
-failover nids       NID(s) of failover partner node
-
-All the NIDs in one node are delimited by commas (','). When multiple nodes are
-specified, they are delimited by a colon (':').
-
-Items left blank will be set to defaults.
-
-Example 1 - Simple, with combo MGS/MDT:
--------------------------------------------------------------------------------
-# combo mdt/mgs
-lustre-mgs,options lnet networks=tcp,/tmp/mgs,/mnt/mgs,mgs|mdt,,,,--device-size=10240
-
-# ost0
-lustre-ost,options lnet networks=tcp,/tmp/ost0,/mnt/ost0,ost,,lustre-mgs@tcp0,,--device-size=10240
-
-# ost1
-lustre-ost,options lnet networks=tcp,/tmp/ost1,/mnt/ost1,ost,,lustre-mgs@tcp0,,--device-size=10240
--------------------------------------------------------------------------------
-
-Example 2 - Separate MGS/MDT, two networks interfaces:
--------------------------------------------------------------------------------
-# mgs
-lustre-mgs1,options lnet 'networks="tcp,elan"',/dev/sda,/mnt/mgs,mgs,,,,--quiet --param="sys.timeout=50",,"defaults,noauto","lustre-mgs2,2@elan"
-
-# mdt
-lustre-mdt1,options lnet 'networks="tcp,elan"',/dev/sdb,/mnt/mdt,mdt,lustre2,"lustre-mgs1,1@elan:lustre-mgs2,2@elan",,--quiet --param="lov.stripesize=4194304",-J size=16,"defaults,noauto",lustre-mdt2
-
-# ost
-lustre-ost1,options lnet 'networks="tcp,elan"',/dev/sdc,/mnt/ost,ost,lustre2,"lustre-mgs1,1@elan:lustre-mgs2,2@elan",,--quiet,-I 512,"defaults,noauto",lustre-ost2
--------------------------------------------------------------------------------
-
-Example 3 - with combo MGS/MDT failover pair and OST failover pair:
--------------------------------------------------------------------------------
-# combo mgs/mdt
-lustre-mgs1,options lnet networks=tcp,/tmp/mgs,/mnt/mgs,mgs|mdt,,,,--quiet --device-size=10240,,,lustre-mgs2@tcp0
-
-# combo mgs/mdt backup (--noformat)
-lustre-mgs2,options lnet networks=tcp,/tmp/mgs,/mnt/mgs,mgs|mdt,,,,--quiet --device-size=10240 --noformat,,,lustre-mgs1@tcp0
-
-# ost
-lustre-ost1,options lnet networks=tcp,/tmp/ost1,/mnt/ost1,ost,,"lustre-mgs1@tcp0:lustre-mgs2@tcp0",,--quiet --device-size=10240,,,lustre-ost2@tcp0
-
-# ost backup (--noformat) (note different device name)
-lustre-ost2,options lnet networks=tcp,/tmp/ost2,/mnt/ost2,ost,,"lustre-mgs1@tcp0:lustre-mgs2@tcp0",,--quiet --device-size=10240 --noformat,,,lustre-ost1@tcp0
--------------------------------------------------------------------------------
-
-Example 4 - Configure Linux MD/LVM devices before formatting Lustre targets:
--------------------------------------------------------------------------------
-# MD device on mgsnode
-mgsnode,MD,/dev/md0,,-q,1,/dev/sda1 /dev/sdb1
-
-# MD/LVM devices on ostnode
-ostnode,MD,/dev/md0,,-q -c 128,5,"/dev/sd{a,b,c}"
-ostnode,MD,/dev/md1,,-q -c 128,5,"/dev/sd{d,e,f}"
-ostnode,PV,/dev/md0 /dev/md1
-ostnode,VG,ost_vg,,-s 32M,/dev/md0 /dev/md1
-ostnode,LV,ost0,,-i 2 -I 128,300G,ost_vg
-ostnode,LV,ost1,,-i 2 -I 128,300G,ost_vg
-
-# combo mgs/mdt
-mgsnode,options lnet networks=tcp,/dev/md0,/mnt/mgs,mgs|mdt,,,,--quiet
-
-# ost0
-ostnode,options lnet networks=tcp,/dev/ost_vg/ost0,/mnt/ost0,ost,,mgsnode,,--quiet
-
-# ost1
-ostnode,options lnet networks=tcp,/dev/ost_vg/ost1,/mnt/ost1,ost,,mgsnode,,--quiet
--------------------------------------------------------------------------------
-
-EOF
-    exit 0
-}
-
-# Get the library of functions
-. @scriptlibdir@/lc_common
-
-#***************************** Global variables *****************************#
-declare -a NODE_NAMES               # node names in the failover group
-declare -a TARGET_OPTS              # target services in one failover group
-
-CONFIG_MD_LVM=false
-MODIFY_FSTAB=true
-UPGRADE_TARGET=false
-# Get and check the positional parameters
-while getopts "aw:x:t:ndfmuhv" OPTION; do
-    case $OPTION in
-    a)
-        [ -z "${SPECIFIED_NODELIST}" ] && [ -z "${EXCLUDED_NODELIST}" ] \
-        && USE_ALLNODES=true
-        NODELIST_OPT="${NODELIST_OPT} -a"
-        ;;
-    w)
-        USE_ALLNODES=false
-        SPECIFIED_NODELIST=$OPTARG
-        NODELIST_OPT="${NODELIST_OPT} -w ${SPECIFIED_NODELIST}"
-        ;;
-    x)
-        USE_ALLNODES=false
-        EXCLUDED_NODELIST=$OPTARG
-        NODELIST_OPT="${NODELIST_OPT} -x ${EXCLUDED_NODELIST}"
-        ;;
-    t)
-        HATYPE_OPT=$OPTARG
-        if [ "${HATYPE_OPT}" != "${HBVER_HBV1}" ] \
-        && [ "${HATYPE_OPT}" != "${HBVER_HBV2}" ] \
-        && [ "${HATYPE_OPT}" != "${HATYPE_CLUMGR}" ]; then
-            error_output "Invalid HA software type" \
-                      "- ${HATYPE_OPT}!"
-            usage 1>&2
-            exit 1
-        fi
-        ;;
-    n)
-        VERIFY_CONNECT=false
-        ;;
-    d)
-        CONFIG_MD_LVM=true
-        ;;
-    f)
-        REFORMAT_OPTION=$"--reformat "
-        ;;
-    m)
-        MODIFY_FSTAB=false
-        ;;
-    u)
-        UPGRADE_TARGET=true 
-        ;;
-    h)
-        usage
-        sample
-        ;;
-    v)
-        VERBOSE_OPT=$" -v"
-        VERBOSE_OUTPUT=true
-        ;;
-    ?)
-        usage 1>&2
-        exit 1
-        ;;
-    esac
-done
-
-# Toss out the parameters we've already processed
-shift  `expr $OPTIND - 1`
-
-# Here we expect the csv file
-if [ $# -eq 0 ]; then
-    error_output "Missing csv file!"
-    usage 1>&2
-    exit 1
-fi
-
-CSV_FILE=$1
-
-# Construct the command line of mkfs.lustre
-construct_mkfs_cmdline() {
-    # Check argument
-    if [ $# -eq 0 ]; then
-        error_output "construct_mkfs_cmdline():"\
-                  "Missing argument for function construct_mkfs_cmdline()!"
-        return 1
-    fi
-
-    declare -i i=$1
-    local mgsnids mgsnids_str
-    local failnids failnids_str
-
-    if $UPGRADE_TARGET; then
-        MKFS_CMD="$TUNEFS --writeconf"
-    else
-        MKFS_CMD="$MKFS $REFORMAT_OPTION"
-    fi
-
-    case "${DEVICE_TYPE[i]}" in
-    "ost")
-        MKFS_CMD="$MKFS_CMD --ost"
-        ;;
-    "mdt")
-        MKFS_CMD="$MKFS_CMD --mdt"
-        ;;
-    "mgs")
-        MKFS_CMD="$MKFS_CMD --mgs"
-        ;;
-    "mdt|mgs" | "mgs|mdt")
-        MKFS_CMD="$MKFS_CMD --mgs --mdt"
-        ;;
-    *)
-        error_output "construct_mkfs_cmdline():"\
-                  "Invalid device type - \"${DEVICE_TYPE[i]}\"!"
-        return 1
-        ;;
-    esac
-
-    if [ -n "${FS_NAME[i]}" ]; then
-        MKFS_CMD="$MKFS_CMD --fsname=${FS_NAME[i]}"
-    fi
-
-    if [ -n "${MGS_NIDS[i]}" ]; then
-        mgsnids_str=${MGS_NIDS[i]}
-        for mgsnids in ${mgsnids_str//:/ }; do
-            MKFS_CMD="$MKFS_CMD --mgsnode=$mgsnids"
-        done
-    fi
-
-    if [ -n "${INDEX[i]}" ]; then
-        MKFS_CMD="$MKFS_CMD --index=${INDEX[i]}"
-    fi
-
-    if [ -n "${FORMAT_OPTIONS[i]}" ]; then
-        MKFS_CMD="$MKFS_CMD ${FORMAT_OPTIONS[i]}"
-    fi
-
-    if ! $UPGRADE_TARGET && [ -n "${MKFS_OPTIONS[i]}" ]; then
-        MKFS_CMD="$MKFS_CMD --mkfsoptions=\"${MKFS_OPTIONS[i]}\""
-    fi
-
-    if [ -n "${MOUNT_OPTIONS[i]}" ] && ! $MODIFY_FSTAB; then
-        MKFS_CMD="$MKFS_CMD --mountfsoptions=\"${MOUNT_OPTIONS[i]}\""
-    fi
-
-    if [ -n "${FAILOVERS[i]}" ]; then
-        failnids_str=${FAILOVERS[i]}
-        for failnids in ${failnids_str//:/ }; do
-            MKFS_CMD="$MKFS_CMD --failnode=$failnids"
-        done
-    fi
-
-    MKFS_CMD="$MKFS_CMD ${DEVICE_NAME[i]}"
-    return 0
-} 
-
-# Get all the node names in this failover group
-get_nodenames() {
-    # Check argument
-    if [ $# -eq 0 ]; then
-        error_output "get_nodenames(): Missing"\
-                  "argument for function get_nodenames()!"
-        return 1
-    fi
-
-    declare -i i=$1
-    declare -i idx
-    local nids
-
-    # Initialize the NODE_NAMES array
-    unset NODE_NAMES
-
-    NODE_NAMES[0]=${HOST_NAME[i]}
-
-    idx=1
-    for nids in ${FAILOVERS_NAMES[i]//:/ }
-    do
-        NODE_NAMES[idx]=$(nids2hostname ${nids})
-        if [ ${PIPESTATUS[0]} -ne 0 ]; then
-            error_output "${NODE_NAMES[idx]}"
-            return 1
-        fi
-    
-        idx=$idx+1
-    done
-
-    return 0
-}
-
-# Verify whether the format line has HA items
-is_ha_line() {
-    declare -i i=$1
-
-    [ -n "${FAILOVERS[i]}" ] && return 0
-
-    return 1
-}
-
-# Produce HA software's configuration files
-gen_ha_config() {
-    declare -i i=$1
-    declare -i idx
-    local  cmd_line
-
-    # Prepare parameters
-    # Hostnames option
-    HOSTNAME_OPT=${HOST_NAME[i]}
-
-    if ! get_nodenames $i; then
-        error_output "gen_ha_config(): Can not get the"\
-        "failover nodenames from failover nids - \"${FAILOVERS[i]}\" in"\
-        "the \"${HOST_NAME[i]}\" failover group!"
-        return 1
-    fi
-
-    for ((idx = 1; idx < ${#NODE_NAMES[@]}; idx++)); do
-        HOSTNAME_OPT=${HOSTNAME_OPT}$":"${NODE_NAMES[idx]}
-    done
-
-    # Target devices option
-    DEVICE_OPT=" -d "${TARGET_OPTS[0]}
-    for ((idx = 1; idx < ${#TARGET_OPTS[@]}; idx++)); do
-        DEVICE_OPT=${DEVICE_OPT}" -d "${TARGET_OPTS[idx]}
-    done
-
-    # Construct the generation script command line
-    case "${HATYPE_OPT}" in
-    "${HBVER_HBV1}"|"${HBVER_HBV2}")    # Heartbeat 
-        cmd_line=${GEN_HB_CONFIG}$" -r ${HATYPE_OPT} -n ${HOSTNAME_OPT}"
-        cmd_line=${cmd_line}${DEVICE_OPT}${VERBOSE_OPT}
-        ;;
-    "${HATYPE_CLUMGR}")                 # CluManager
-        cmd_line=${GEN_CLUMGR_CONFIG}$" -n ${HOSTNAME_OPT}"
-        cmd_line=${cmd_line}${DEVICE_OPT}${VERBOSE_OPT}
-        ;;
-    esac
-    
-    # Execute script to generate HA software's configuration files
-    verbose_output "Generating HA software's configurations in"\
-               "${HOST_NAME[i]} failover group..."
-    verbose_output "${cmd_line}"
-    eval $(echo "${cmd_line}")
-    if [ ${PIPESTATUS[0]} -ne 0 ]; then
-        return 1
-    fi
-    verbose_output "Generate HA software's configurations in"\
-               "${HOST_NAME[i]} failover group OK"
-    
-    return 0
-}
-
-# Configure HA software
-config_ha() {
-    if $UPGRADE_TARGET || [ -z "${HATYPE_OPT}" ]; then
-        return 0
-    fi
-
-    declare -i i j k
-    declare -i prim_idx         # Index for PRIM_HOSTNAMES array
-    declare -i target_idx       # Index for TARGET_OPTS and HOST_INDEX arrays
-
-    declare -a PRIM_HOSTNAMES   # Primary hostnames in all the failover
-                                # groups in the lustre cluster
-    declare -a HOST_INDEX       # Indices for the same node in all the 
-                                # format lines in the csv file
-    local prim_host
-
-    # Initialize the PRIM_HOSTNAMES array
-    prim_idx=0
-    unset PRIM_HOSTNAMES
-
-    # Get failover groups and generate HA configuration files
-    for ((i = 0; i < ${#HOST_NAME[@]}; i++)); do
-        prim_host=${HOST_NAME[i]}
-
-        for ((j = 0; j < ${#PRIM_HOSTNAMES[@]}; j++)); do
-            [ "${prim_host}" = "${PRIM_HOSTNAMES[j]}" ] && continue 2
-        done
-
-        target_idx=0
-        unset HOST_INDEX
-        unset TARGET_OPTS
-        for ((k = 0; k < ${#HOST_NAME[@]}; k++)); do
-            if [ "${prim_host}" = "${HOST_NAME[k]}" ] && is_ha_line "${k}"
-            then
-                HOST_INDEX[target_idx]=$k
-                TARGET_OPTS[target_idx]=${DEVICE_NAME[k]}:${MOUNT_POINT[k]}
-                target_idx=$(( target_idx + 1 ))
-            fi
-        done
-
-        if [ ${#TARGET_OPTS[@]} -ne 0 ]; then
-            PRIM_HOSTNAMES[prim_idx]=${prim_host}
-            prim_idx=$(( prim_idx + 1 ))
-
-            if ! gen_ha_config ${HOST_INDEX[0]}; then
-                return 1
-            fi
-        fi
-    done
-
-    if [ ${#PRIM_HOSTNAMES[@]} -eq 0 ]; then
-        verbose_output "There are no \"failover nids\" items in the"\
-        "csv file. No HA configuration files are generated!"
-    fi
-
-    rm -rf ${TMP_DIRS}
-    return 0
-}
-
-# Execute remote command to add lnet options lines to remote nodes'
-# modprobe.conf/modules.conf and format(mkfs.lustre) Lustre targets
-mass_config() {
-    local COMMAND
-    declare -a REMOTE_PID 
-    declare -a REMOTE_CMD 
-    declare -i pid_num=0
-    declare -i i=0
-    local checked_hosts=""
-
-    if [ ${#HOST_NAME[@]} -eq 0 ]; then
-        verbose_output "There are no Lustre targets specified."
-        return 0
-    fi
-
-    if ! $UPGRADE_TARGET; then
-        # Start lnet network in the MGS node
-        start_mgs_lnet || return 1    
-    fi
-
-    for ((i = 0; i < ${#HOST_NAME[@]}; i++)); do
-        # Construct the command line of mkfs.lustre
-        if ! construct_mkfs_cmdline $i; then
-            return 1    
-        fi
-
-        # create the mount point on the node
-        COMMAND="mkdir -p ${MOUNT_POINT[i]}"
-        verbose_output "Creating the mount point ${MOUNT_POINT[i]} on" \
-                       "${HOST_NAME[i]}"
-        ${REMOTE} ${HOST_NAME[i]} "${COMMAND}" >&2 
-        if [ ${PIPESTATUS[0]} -ne 0 ]; then
-            error_output "mass_config():"\
-                 "Failed to execute remote command to"\
-                 "create the mountpoint on ${HOST_NAME[i]}!"
-            return 1
-        fi
-
-        if ! $UPGRADE_TARGET && ! is_mgs_node ${HOST_NAME[i]} && \
-        ! host_in_hostlist ${HOST_NAME[i]} $checked_hosts; then
-            # Execute remote command to add lnet options lines to 
-            # modprobe.conf/modules.conf
-            add_module_options $i ${HOST_NAME[i]} || return ${PIPESTATUS[0]}
-
-            # Check lnet networks
-            check_lnet $i || return ${PIPESTATUS[0]}
-
-            checked_hosts="$checked_hosts,${HOST_NAME[i]}"
-        fi
-
-        # Execute remote command to format or upgrade Lustre target
-        local OP
-        $UPGRADE_TARGET && OP="Upgrading" || OP="Formatting"
-        verbose_output "$OP Lustre target ${DEVICE_NAME[i]} on ${HOST_NAME[i]}..."
-
-        COMMAND="export PATH=\$PATH:/sbin:/usr/sbin; $MKFS_CMD"
-        REMOTE_CMD[$pid_num]="$REMOTE ${HOST_NAME[i]} \"$COMMAND\""
-        verbose_output "$OP command line is: ${REMOTE_CMD[$pid_num]}"
-
-        $REMOTE ${HOST_NAME[i]} "$COMMAND" &
-        REMOTE_PID[$pid_num]=$!
-        let pid_num=$pid_num+1
-        sleep 1
-    done
-
-    # Wait for the exit status of the background remote command
-    verbose_output "Waiting for the return of the remote command..."
-    fail_exit_status=false
-    for ((pid_num = 0; pid_num < ${#REMOTE_PID[@]}; pid_num++)); do
-        wait ${REMOTE_PID[${pid_num}]}
-        if [ ${PIPESTATUS[0]} -ne 0 ]; then
-            error_output "mass_config(): Failed"\
-            "to execute \"${REMOTE_CMD[${pid_num}]}\"!"
-            fail_exit_status=true
-        fi
-    done
-
-    if ${fail_exit_status}; then
-        return 1
-    fi    
-
-    verbose_output "Success on all Lustre targets!"
-    return 0
-}
-
-# get_mntopts hostname device_name failovers
-# Construct the mount options of Lustre target @device_name in host @hostname
-get_mntopts() {
-    local host_name=$1
-    local device_name=$2
-    local failovers=$3
-    local mnt_opts=
-    local ret_str
-
-    [ -n "${failovers}" ] && mnt_opts=defaults,noauto || mnt_opts=defaults
-
-    # Execute remote command to check whether the device
-    # is a block device or not
-    ret_str=$(${REMOTE} ${host_name} \
-            "[ -b ${device_name} ] && echo block || echo loop" 2>&1)
-    if [ ${PIPESTATUS[0]} -ne 0 -a -n "${ret_str}" ]; then
-        echo "`basename $0`: get_mntopts() error:" \
-        "remote command to ${host_name} error: ${ret_str}"
-        return 1
-    fi
-
-    if [ -z "${ret_str}" ]; then
-        echo "`basename $0`: get_mntopts() error: remote error:" \
-        "No results from remote!" \
-        "Check network connectivity between the local host and ${host_name}!"
-        return 1
-    fi
-
-    [ "${ret_str}" != "${ret_str#*loop}" ] && mnt_opts=${mnt_opts},loop
-
-    echo ${mnt_opts}
-    return 0
-}
-
-# Execute remote command to modify /etc/fstab to add the new Lustre targets
-modify_fstab() {
-    declare -i i
-    local mntent mntopts device_name
-    local COMMAND
-
-    if ! ${MODIFY_FSTAB}; then
-        return 0    
-    fi
-
-    for ((i = 0; i < ${#HOST_NAME[@]}; i++)); do
-        verbose_output "Modify /etc/fstab of host ${HOST_NAME[i]}"\
-                   "to add Lustre target ${DEVICE_NAME[i]}"
-        mntent=${DEVICE_NAME[i]}"\t\t"${MOUNT_POINT[i]}"\t\t"${FS_TYPE}
-
-        # Get mount options
-        if [ -n "${MOUNT_OPTIONS[i]}" ]; then
-            # The mount options already specified in the csv file.
-            mntopts="${MOUNT_OPTIONS[i]}"
-        else
-            mntopts=$(get_mntopts ${HOST_NAME[i]} ${DEVICE_NAME[i]}\
-                    ${FAILOVERS[i]})
-            if [ ${PIPESTATUS[0]} -ne 0 ]; then
-                error_output "${mntopts}"
-                return 1
-            fi
-        fi
-
-        mntent=${mntent}"\t"${mntopts}"\t"0" "0
-        verbose_output "`echo -e ${mntent}`"
-
-        # Execute remote command to modify /etc/fstab
-        device_name=${DEVICE_NAME[i]//\//\\/}
-        COMMAND=". @scriptlibdir@/lc_common; \
-                sed -i \"/^${device_name}\t/d\" \$(fcanon /etc/fstab); \
-                echo -e \"${mntent}\" >> \$(fcanon /etc/fstab)"
-        ${REMOTE} ${HOST_NAME[i]} "${COMMAND}" >&2
-        if [ ${PIPESTATUS[0]} -ne 0 ]; then
-            error_output "modify_fstab():"\
-            "Failed to modify /etc/fstab of host ${HOST_NAME[i]}"\
-            "to add Lustre target ${DEVICE_NAME[i]}!"
-            return 1
-        fi
-    done
-
-    return 0
-}
-
-#********************************* Main Flow **********************************#
-
-# Check the csv file
-check_file $CSV_FILE || exit ${PIPESTATUS[0]}
-
-# Get the list of nodes to be operated on
-NODES_TO_USE=$(get_nodelist) || error_exit ${PIPESTATUS[0]} "$NODES_TO_USE"
-
-# Check the node list
-check_nodelist $NODES_TO_USE || exit ${PIPESTATUS[0]}
-
-if ${VERIFY_CONNECT}; then
-# Check the network connectivity and hostnames
-    echo "`basename $0`: Checking the cluster network connectivity"\
-         "and hostnames..."
-    if ! ${VERIFY_CLUSTER_NET} ${NODELIST_OPT} ${VERBOSE_OPT} ${CSV_FILE}; then
-        exit 1
-    fi
-    echo "`basename $0`: Check the cluster network connectivity"\
-         "and hostnames OK!"
-    echo
-fi
-
-if $CONFIG_MD_LVM && ! $UPGRADE_TARGET; then
-# Configure Linux MD/LVM devices
-    echo "`basename $0`: Configuring Linux MD/LVM devices..."
-    if ! ${SCRIPT_CONFIG_MD} ${NODELIST_OPT} ${VERBOSE_OPT} ${CSV_FILE}; then
-        exit 1
-    fi
-
-    if ! ${SCRIPT_CONFIG_LVM} ${NODELIST_OPT} ${VERBOSE_OPT} ${CSV_FILE}; then
-        exit 1
-    fi
-    echo "`basename $0`: Configure Linux MD/LVM devices OK!"
-    echo
-fi
-
-# Configure the Lustre cluster
-echo "`basename $0`: ******** Lustre cluster configuration BEGIN ********"
-
-get_lustre_items $CSV_FILE || exit ${PIPESTATUS[0]}
-
-check_mgs || exit ${PIPESTATUS[0]}
-
-# Format or upgrade Lustre server targets
-mass_config || exit ${PIPESTATUS[0]}
-
-# Modify /etc/fstab to add the new Lustre server targets
-modify_fstab || exit ${PIPESTATUS[0]}
-
-# Produce HA software's configuration files
-if ! config_ha; then
-    rm -rf ${TMP_DIRS}
-    exit 1
-fi
-
-echo "`basename $0`: ******** Lustre cluster configuration END **********"
-
-exit 0