Riccardo Pittau ce39115fa7 Explicitely do not allocate initial space for virtual volumes
Initialize virtual volumes with no allocated initial space to prevent
consuming all space available during volume creation.
The behavior of virsh has changed, by default in the past the virtual
volumes were initialized automatically with no initial allocated space,
while with recent versions we need to specify explicitly to not
allocate initial space for the virtual volumes.

Change-Id: I588d0888c19304119af607433de6e35199f7c555
2020-09-02 11:10:58 +00:00

136 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# **create-nodes**
# Creates baremetal poseur nodes for ironic testing purposes
set -ex
# Make tracing more educational
export PS4='+ ${BASH_SOURCE:-}:${FUNCNAME[0]:-}:L${LINENO:-}: '
# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:v:P:" arg; do
case $arg in
n) NAME=$OPTARG;;
c) CPU=$OPTARG;;
i) INTERFACE_COUNT=$OPTARG;;
M) INTERFACE_MTU=$OPTARG;;
m) MEM=$(( 1024 * OPTARG ));;
# Extra G to allow fuzz for partition table : flavor size and registered
# size need to be different to actual size.
d) DISK=$(( OPTARG + 1 ));;
a) ARCH=$OPTARG;;
b) BRIDGE=$OPTARG;;
e) EMULATOR=$OPTARG;;
E) ENGINE=$OPTARG;;
p) VBMC_PORT=$OPTARG;;
o) PDU_OUTLET=$OPTARG;;
f) DISK_FORMAT=$OPTARG;;
l) LOGDIR=$OPTARG;;
L) UEFI_LOADER=$OPTARG;;
N) UEFI_NVRAM=$OPTARG;;
A) MAC_ADDRESS=$OPTARG;;
D) NIC_DRIVER=$OPTARG;;
v) VOLUME_COUNT=$OPTARG;;
P) STORAGE_POOL=$OPTARG;;
esac
done
shift $(( $OPTIND - 1 ))
if [ -z "$UEFI_LOADER" ] && [ ! -z "$UEFI_NVRAM" ]; then
echo "Parameter -N (UEFI NVRAM) cannot be used without -L (UEFI Loader)"
exit 1
fi
LIBVIRT_NIC_DRIVER=${NIC_DRIVER:-"e1000"}
LIBVIRT_STORAGE_POOL=${STORAGE_POOL:-"default"}
LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI
if [ -n "$LOGDIR" ] ; then
mkdir -p "$LOGDIR"
fi
PREALLOC=
if [ -f /etc/debian_version -a "$DISK_FORMAT" == "qcow2" ]; then
PREALLOC="--prealloc-metadata"
fi
if [ -n "$LOGDIR" ] ; then
VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log"
else
VM_LOGGING=""
fi
UEFI_OPTS=""
if [ ! -z "$UEFI_LOADER" ]; then
UEFI_OPTS="--uefi-loader $UEFI_LOADER"
if [ ! -z "$UEFI_NVRAM" ]; then
UEFI_OPTS+=" --uefi-nvram $UEFI_NVRAM"
fi
fi
# Create bridge and add VM interface to it.
# Additional interface will be added to this bridge and
# it will be plugged to OVS.
# This is needed in order to have interface in OVS even
# when VM is in shutdown state
INTERFACE_COUNT=${INTERFACE_COUNT:-1}
for int in $(seq 1 $INTERFACE_COUNT); do
tapif=tap-${NAME}i${int}
ovsif=ovs-${NAME}i${int}
# NOTE(vsaienko) use veth pair here to ensure that interface
# exists in OVS even when VM is powered off.
sudo ip link add dev $tapif type veth peer name $ovsif
for l in $tapif $ovsif; do
sudo ip link set dev $l up
sudo ip link set $l mtu $INTERFACE_MTU
done
sudo ovs-vsctl add-port $BRIDGE $ovsif
done
if [ -n "$MAC_ADDRESS" ] ; then
MAC_ADDRESS="--mac $MAC_ADDRESS"
fi
VOLUME_COUNT=${VOLUME_COUNT:-1}
if ! virsh list --all | grep -q $NAME; then
vm_opts=""
for int in $(seq 1 $VOLUME_COUNT); do
if [[ "$int" == "1" ]]; then
# Compatibility with old naming
vol_name="$NAME.$DISK_FORMAT"
else
vol_name="$NAME-$int.$DISK_FORMAT"
fi
virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $vol_name &&
virsh vol-delete $vol_name --pool $LIBVIRT_STORAGE_POOL >&2
virsh vol-create-as $LIBVIRT_STORAGE_POOL ${vol_name} ${DISK}G --allocation 0 --format $DISK_FORMAT $PREALLOC >&2
volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $vol_name)
# Pre-touch the VM to set +C, as it can only be set on empty files.
sudo touch "$volume_path"
sudo chattr +C "$volume_path" || true
vm_opts+="--image $volume_path "
done
if [[ -n "$EMULATOR" ]]; then
vm_opts+="--emulator $EMULATOR "
fi
$PYTHON $TOP_DIR/scripts/configure-vm.py \
--bootdev network --name $NAME \
--arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \
--disk-format $DISK_FORMAT $VM_LOGGING --engine $ENGINE $UEFI_OPTS $vm_opts \
--interface-count $INTERFACE_COUNT $MAC_ADDRESS >&2
fi
# echo mac in format mac1,ovs-node-0i1;mac2,ovs-node-0i2;...;macN,ovs-node0iN
VM_MAC=$(echo -n $(virsh domiflist $NAME |awk '/tap-/{print $5","$3}')|tr ' ' ';' |sed s/tap-/ovs-/g)
echo -n "$VM_MAC $VBMC_PORT $PDU_OUTLET"