
The original code inconsistently uses replacement strings either limited to capital letters or with additional percentage symbols. The use of percentage symbols is preferred to mitigate the possibility of accidental replacements. Standardize the sed replacement strings to use percentage symbols. Test plan: PASS: Regression for default and mad examples PASS: unit test the replacement values for all configurations Story: 2010816 Task: 48611 Change-Id: I35959d7ae8cd46e613a1d0b3a1fcb44fc3f0b1d6 Signed-off-by: Michel Thebeau <michel.thebeau@windriver.com>
313 lines
9.0 KiB
Bash
313 lines
9.0 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# Copyright (c) 2023 Wind River Systems, Inc.
|
|
#
|
|
|
|
source set_defaults.sh
|
|
|
|
usage() {
|
|
echo "$0 [-h] [-c <configuration>] [-i <iso image>]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -c: Configuration: simplex, duplex, controllerstorage, dedicatedstorage"
|
|
echo " -i: StarlingX ISO image"
|
|
echo ""
|
|
}
|
|
|
|
usage_destroy() {
|
|
echo "$0 [-h] [-c <configuration>]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -c: Configuration: simplex, duplex, controllerstorage, dedicatedstorage"
|
|
echo ""
|
|
}
|
|
|
|
iso_image_check() {
|
|
local ISOIMAGE=$1
|
|
if ! file ${ISOIMAGE} | grep "DOS/MBR" > /dev/null; then
|
|
echo "$ISOIMAGE is not an ISO type"
|
|
exit -1
|
|
fi
|
|
}
|
|
|
|
configuration_check() {
|
|
local CONFIGURATION=$1
|
|
if [ $CONFIGURATION != "simplex" ] && [ $CONFIGURATION != "duplex" ] && [ $CONFIGURATION != "controllerstorage" ] && [ $CONFIGURATION != "dedicatedstorage" ]; then
|
|
echo "Please check your configuration name, available configurations:"
|
|
echo "simplex, duplex, controllerstorage, dedicatedstorage"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
get_disk(){
|
|
|
|
local field=$1
|
|
local num=$2
|
|
local diskdir
|
|
|
|
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
|
|
diskdir=$( ./config.py $CONFIG_FILE $field $num disk )
|
|
fi
|
|
|
|
if [ -z "$diskdir" ]; then
|
|
# DEFAULT_DISK_DIR is always defined because the calling scripts
|
|
# is required to source set_defaults.sh
|
|
diskdir=$DEFAULT_DISK_DIR
|
|
fi
|
|
echo $diskdir
|
|
}
|
|
|
|
get_cpu(){
|
|
|
|
local field=$1
|
|
local num=$2
|
|
local cpu_count
|
|
|
|
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
|
|
cpu_count=$( ./config.py $CONFIG_FILE $field $num cpu )
|
|
fi
|
|
|
|
if [ -z "$cpu_count" ]; then
|
|
if [ $field == 'controllerlist' ] && ([ $CONFIGURATION == \
|
|
'simplex' ] || [ $CONFIGURATION == 'duplex' ]); then
|
|
cpu_count=$AIO_DEFAULT_CPU
|
|
else
|
|
cpu_count=$DEFAULT_CPU
|
|
fi
|
|
fi
|
|
echo $cpu_count
|
|
}
|
|
|
|
get_mem(){
|
|
|
|
local field=$1
|
|
local num=$2
|
|
local memory
|
|
|
|
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
|
|
memory=$( ./config.py $CONFIG_FILE $field $num mem )
|
|
fi
|
|
|
|
if [ -z "$memory" ]; then
|
|
if [ $field == 'controllerlist' ] && ([ $CONFIGURATION == \
|
|
'simplex' ] || [ $CONFIGURATION == 'duplex' ]); then
|
|
memory=$AIO_DEFAULT_MEM
|
|
else
|
|
memory=$DEFAULT_MEM
|
|
fi
|
|
fi
|
|
echo $memory
|
|
}
|
|
|
|
# delete a node's disk file in a safe way
|
|
delete_disk() {
|
|
local fpath="$1"
|
|
|
|
if [ ! -f "$fpath" ]; then
|
|
echo "file to delete is not a regular file: $fpath" >&2
|
|
return 1
|
|
fi
|
|
|
|
file -b "$fpath" | grep -q "^QEMU \(QCOW\|QCOW2\) Image (v3),"
|
|
if [ $? -ne 0 ]; then
|
|
echo "file to delete is not QEMU QCOW Image (v3): $fpath" >&2
|
|
return 1
|
|
fi
|
|
|
|
sudo rm "$fpath"
|
|
}
|
|
|
|
# delete an xml file in a safe way
|
|
delete_xml() {
|
|
local fpath="$1"
|
|
|
|
if [ ! -f "$fpath" ]; then
|
|
echo "file to delete is not a regular file: $fpath" >&2
|
|
return 1
|
|
fi
|
|
|
|
file -b "$fpath" | grep -q "^ASCII text$"
|
|
if [ $? -ne 0 ]; then
|
|
echo "file to delete is not ASCII text: $fpath" >&2
|
|
return 1
|
|
fi
|
|
|
|
sudo rm "$fpath"
|
|
}
|
|
|
|
# Create a Controller node
|
|
create_controller() {
|
|
local CONFIGURATION=$1
|
|
local CONTROLLER=$2
|
|
local BRIDGE_INTERFACE=$3
|
|
local ISOIMAGE=$4
|
|
local DOMAIN_FILE
|
|
local DISK_LOCATION
|
|
|
|
if ([ "$CONFIGURATION" == "simplex" ]); then
|
|
CONTROLLER_NODE_NUMBER=0
|
|
else
|
|
CONTROLLER_NODE_NUMBER=1
|
|
fi
|
|
for ((i=0; i<=$CONTROLLER_NODE_NUMBER; i++)); do
|
|
CONTROLLER_NODE=${CONFIGURATION}-${CONTROLLER}-${i}
|
|
DOMAIN_FILE=${DOMAIN_DIRECTORY}/${CONTROLLER_NODE}.xml
|
|
|
|
CPU="$( get_cpu controllerlist $i )"
|
|
MEM="$( get_mem controllerlist $i )"
|
|
DISK_LOCATION="$( get_disk controllerlist $i )"
|
|
mkdir -p "${DISK_LOCATION}"
|
|
if [ $? -ne 0 ]; then
|
|
echo -n "Cannot create directory for virtual disks: "
|
|
echo "${DISK_LOCATION}"
|
|
return 1
|
|
fi
|
|
|
|
if ([ "$CONFIGURATION" == "simplex" ] || [ "$CONFIGURATION" == "duplex" ]); then
|
|
DISK_0_SIZE=600
|
|
cp controller_allinone.xml ${DOMAIN_FILE}
|
|
else
|
|
DISK_0_SIZE=250
|
|
cp controller.xml ${DOMAIN_FILE}
|
|
fi
|
|
sed -i -e "
|
|
s,%NAME%,${CONTROLLER_NODE},
|
|
s,%CPU%,${CPU},
|
|
s,%MEM%,${MEM},
|
|
s,%DISK0%,${DISK_LOCATION}/${CONTROLLER_NODE}-0.img,
|
|
s,%DISK1%,${DISK_LOCATION}/${CONTROLLER_NODE}-1.img,
|
|
s,%BR1%,${BRIDGE_INTERFACE}1,
|
|
s,%BR2%,${BRIDGE_INTERFACE}2,
|
|
s,%BR3%,${BRIDGE_INTERFACE}3,
|
|
s,%BR4%,${BRIDGE_INTERFACE}4,
|
|
" ${DOMAIN_FILE}
|
|
sudo qemu-img create -f qcow2 ${DISK_LOCATION}/${CONTROLLER_NODE}-0.img ${DISK_0_SIZE}G
|
|
sudo qemu-img create -f qcow2 ${DISK_LOCATION}/${CONTROLLER_NODE}-1.img 200G
|
|
if ([ "$CONFIGURATION" == "simplex" ] || [ "$CONFIGURATION" == "duplex" ]); then
|
|
sed -i -e "
|
|
s,%DISK2%,${DISK_LOCATION}/${CONTROLLER_NODE}-2.img,
|
|
" ${DOMAIN_FILE}
|
|
sudo qemu-img create -f qcow2 ${DISK_LOCATION}/${CONTROLLER_NODE}-2.img 200G
|
|
fi
|
|
if [ $i -eq 0 ]; then
|
|
sed -i -e "s,%ISO%,${ISOIMAGE}," ${DOMAIN_FILE}
|
|
else
|
|
sed -i -e "s,%ISO%,," ${DOMAIN_FILE}
|
|
fi
|
|
sudo virsh define ${DOMAIN_FILE}
|
|
if [ $i -eq 0 ]; then
|
|
sudo virsh start ${CONTROLLER_NODE}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Delete a Controller node
|
|
destroy_controller() {
|
|
local CONFIGURATION=$1
|
|
local CONTROLLER=$2
|
|
local DISK_LOCATION
|
|
if ([ "$CONFIGURATION" == "simplex" ]); then
|
|
CONTROLLER_NODE_NUMBER=0
|
|
else
|
|
CONTROLLER_NODE_NUMBER=1
|
|
fi
|
|
for ((i=0; i<=$CONTROLLER_NODE_NUMBER; i++)); do
|
|
DISK_LOCATION="$( get_disk controllerlist $i )"
|
|
CONTROLLER_NODE=${CONFIGURATION}-${CONTROLLER}-${i}
|
|
DOMAIN_FILE=$DOMAIN_DIRECTORY/$CONTROLLER_NODE.xml
|
|
if virsh list --all --name | grep ${CONTROLLER_NODE}; then
|
|
STATUS=$(virsh list --all | grep ${CONTROLLER_NODE} | awk '{ print $3}')
|
|
if ([ "$STATUS" == "running" ])
|
|
then
|
|
sudo virsh destroy ${CONTROLLER_NODE}
|
|
fi
|
|
sudo virsh undefine ${CONTROLLER_NODE}
|
|
delete_disk ${DISK_LOCATION}/${CONTROLLER_NODE}-0.img
|
|
delete_disk ${DISK_LOCATION}/${CONTROLLER_NODE}-1.img
|
|
if ([ "$CONFIGURATION" == "simplex" ] || [ "$CONFIGURATION" == "duplex" ]); then
|
|
delete_disk ${DISK_LOCATION}/${CONTROLLER_NODE}-2.img
|
|
fi
|
|
[ -e ${DOMAIN_FILE} ] && delete_xml ${DOMAIN_FILE}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Create a Node
|
|
create_node() {
|
|
local IDENTITY=$1
|
|
local INDEX=$2
|
|
local CONFIGURATION=$3
|
|
local BRIDGE_INTERFACE=$4
|
|
local DISK_LOCATION
|
|
local NODE
|
|
|
|
if [ $IDENTITY == 'worker' ]; then
|
|
NODE="${CONFIGURATION}-${WORKER}-${INDEX}"
|
|
CPU="$( get_cpu workerlist $INDEX )"
|
|
MEM="$( get_mem workerlist $INDEX )"
|
|
DISK_LOCATION="$( get_disk workerlist $INDEX )"
|
|
elif [ $IDENTITY == 'storage' ]; then
|
|
NODE="${CONFIGURATION}-${STORAGE}-${INDEX}"
|
|
CPU="$( get_cpu storagelist $INDEX )"
|
|
MEM="$( get_mem storagelist $INDEX )"
|
|
DISK_LOCATION="$( get_disk storagelist $INDEX )"
|
|
fi
|
|
mkdir -p "${DISK_LOCATION}"
|
|
if [ $? -ne 0 ]; then
|
|
echo -n "Cannot create directory for virtual disks: "
|
|
echo "${DISK_LOCATION}"
|
|
return 1
|
|
fi
|
|
|
|
local DOMAIN_FILE=${DOMAIN_DIRECTORY}/${NODE}.xml
|
|
|
|
sudo qemu-img create -f qcow2 ${DISK_LOCATION}/${NODE}-0.img 200G
|
|
sudo qemu-img create -f qcow2 ${DISK_LOCATION}/${NODE}-1.img 200G
|
|
cp ${IDENTITY}.xml ${DOMAIN_FILE}
|
|
sed -i -e "
|
|
s,%NAME%,${NODE},
|
|
s,%CPU%,${CPU},
|
|
s,%MEM%,${MEM},
|
|
s,%DISK0%,${DISK_LOCATION}/${NODE}-0.img,;
|
|
s,%DISK1%,${DISK_LOCATION}/${NODE}-1.img,
|
|
s,%BR1%,${BRIDGE_INTERFACE}1,
|
|
s,%BR2%,${BRIDGE_INTERFACE}2,
|
|
s,%BR3%,${BRIDGE_INTERFACE}3,
|
|
s,%BR4%,${BRIDGE_INTERFACE}4,
|
|
" ${DOMAIN_FILE}
|
|
sudo virsh define ${DOMAIN_FILE}
|
|
}
|
|
|
|
# Delete a Node
|
|
destroy_node() {
|
|
local IDENTITY=$1
|
|
local INDEX=$2
|
|
local CONFIGURATION=$3
|
|
local DISK_LOCATION
|
|
local NODE
|
|
|
|
if [ $IDENTITY == 'worker' ]; then
|
|
NODE="${CONFIGURATION}-${WORKER}-${INDEX}"
|
|
DISK_LOCATION="$( get_disk workerlist $INDEX )"
|
|
elif [ $IDENTITY == 'storage' ]; then
|
|
NODE="${CONFIGURATION}-${STORAGE}-${INDEX}"
|
|
DISK_LOCATION="$( get_disk storagelist $INDEX )"
|
|
fi
|
|
|
|
local DOMAIN_FILE=$DOMAIN_DIRECTORY/$NODE.xml
|
|
|
|
if virsh list --all --name | grep ${NODE}; then
|
|
STATUS=$(virsh list --all | grep ${NODE} | awk '{ print $3}')
|
|
if ([ "$STATUS" == "running" ])
|
|
then
|
|
sudo virsh destroy ${NODE}
|
|
fi
|
|
sudo virsh undefine ${NODE}
|
|
delete_disk ${DISK_LOCATION}/${NODE}-0.img
|
|
delete_disk ${DISK_LOCATION}/${NODE}-1.img
|
|
[ -e ${DOMAIN_FILE} ] && delete_xml ${DOMAIN_FILE}
|
|
fi
|
|
}
|