#!/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 ] [-i ]" echo "" echo "Options:" echo " -c: Configuration: simplex, duplex, controllerstorage, dedicatedstorage" echo " -i: StarlingX ISO image" echo "" } usage_destroy() { echo "$0 [-h] [-c ]" 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 }