
The script enforces the kind of file it will delete to prevent accidents. Update the detection of QCOW disk images for QCOW2. On an updated Ubuntu the file type is "QCOW2" instead of "QCOW". Change-Id: If6ab7113358f96749dadae53b52ae31e8f452777 Signed-off-by: Michel Thebeau <michel.thebeau@windriver.com>
261 lines
7.7 KiB
Bash
261 lines
7.7 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
|
|
}
|
|
|
|
# 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
|
|
|
|
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,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}"
|
|
DISK_LOCATION="$( get_disk workerlist $INDEX )"
|
|
elif [ $IDENTITY == 'storage' ]; then
|
|
NODE="${CONFIGURATION}-${STORAGE}-${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,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
|
|
}
|