![Michel Thebeau](/assets/img/avatar_default.png)
The libvirt/ directory is a bit cluttered. Move xml files to a subdirectory. Test plan: PASS: Regression for default and mad examples PASS: unit test of the affected replacement values for all configurations Story: 2010816 Task: 48613 Change-Id: I7a8552616cce9ac4639d3c2c67d5a019f7f06bdc Signed-off-by: Michel Thebeau <michel.thebeau@windriver.com>
313 lines
9.1 KiB
Bash
313 lines
9.1 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 xml/controller_allinone.xml ${DOMAIN_FILE}
|
|
else
|
|
DISK_0_SIZE=250
|
|
cp xml/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 xml/${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
|
|
}
|