
Add the ability for the user to change how many cores and memory are allocated per node. Each node may have any number of cores or memory set, with which their values are used by sourcing the file: 'source readconfig.sh <yaml file>' Test plan: PASS: regression tests passed PASS: sanity tests passed PASS: no tox, flake8 or pylint errors PASS: value succesfully set from config file PASS: defaults used when no config file is sourced Story: 2010816 Task: 48398 Task: 48586 Change-Id: Ia2f7df44c872fac41ac6376ef3fb00062624ac22 Signed-off-by: Bailey Henry <Henry.Bailey@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
|
|
}
|