Michel Thebeau 5f1da7dbdc libvirt: standardize sed replacement strings
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>
2023-08-16 09:47:31 -04:00

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
}