Bailey Henry 2066a90fa5 Libvirt: CPU and Memory value configurable
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>
2023-08-16 08:54:23 -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
}