promenade/tools/g2/lib/virsh.sh

200 lines
5.0 KiB
Bash

img_base_declare() {
log Validating base image exists
if ! virsh vol-key --pool ${VIRSH_POOL} --vol promenade-base.img > /dev/null; then
log Installing base image from ${BASE_IMAGE_URL}
cd ${TEMP_DIR}
curl -q -L -o base.img ${BASE_IMAGE_URL}
virsh vol-create-as \
--pool ${VIRSH_POOL} \
--name promenade-base.img \
--format qcow2 \
--capacity ${BASE_IMAGE_SIZE} \
--prealloc-metadata &>> ${LOG_FILE}
virsh vol-upload \
--vol promenade-base.img \
--file base.img \
--pool ${VIRSH_POOL} &>> ${LOG_FILE}
fi
}
iso_gen() {
NAME=${1}
if virsh vol-key --pool ${VIRSH_POOL} --vol cloud-init-${NAME}.iso &> /dev/null; then
log Removing existing cloud-init ISO for ${NAME}
virsh vol-delete \
--pool ${VIRSH_POOL} \
--vol cloud-init-${NAME}.iso &>> ${LOG_FILE}
fi
log Creating cloud-init ISO for ${NAME}
ISO_DIR=${TEMP_DIR}/iso/${NAME}
mkdir -p ${ISO_DIR}
cd ${ISO_DIR}
export BR_IP_NODE=$(config_vm_ip ${NAME})
export NAME
export SSH_PUBLIC_KEY=$(ssh_load_pubkey)
envsubst < ${TEMPLATE_DIR}/user-data.sub > user-data
envsubst < ${TEMPLATE_DIR}/meta-data.sub > meta-data
envsubst < ${TEMPLATE_DIR}/network-config.sub > network-config
genisoimage \
-V cidata \
-input-charset utf-8 \
-joliet \
-rock \
-o cidata.iso \
meta-data \
network-config \
user-data &>> ${LOG_FILE}
virsh vol-create-as \
--pool ${VIRSH_POOL} \
--name cloud-init-${NAME}.iso \
--capacity $(stat -c %s ${ISO_DIR}/cidata.iso) \
--format raw &>> ${LOG_FILE}
virsh vol-upload \
--pool ${VIRSH_POOL} \
--vol cloud-init-${NAME}.iso \
--file ${ISO_DIR}/cidata.iso &>> ${LOG_FILE}
}
iso_path() {
NAME=${1}
echo ${TEMP_DIR}/iso/${NAME}/cidata.iso
}
net_clean() {
log net_clean is not yet implemented.
exit 1
}
net_declare() {
if ! virsh net-list --name | grep ^promenade$ > /dev/null; then
log Creating promenade network
virsh net-create ${XML_DIR}/network.xml &>> ${LOG_FILE}
fi
}
pool_declare() {
log Validating virsh pool setup
if ! virsh pool-uuid ${VIRSH_POOL} &> /dev/null; then
log Creating pool ${VIRSH_POOL}
virsh pool-create-as --name ${VIRSH_POOL} --type dir --target ${VIRSH_POOL_PATH} &>> ${LOG_FILE}
fi
}
vm_clean() {
NAME=${1}
if virsh list --name | grep ${NAME} &> /dev/null; then
virsh destroy ${NAME} &>> ${LOG_FILE}
fi
if virsh list --name --all | grep ${NAME} &> /dev/null; then
log Removing VM ${NAME}
virsh undefine --remove-all-storage --domain ${NAME} &>> ${LOG_FILE}
fi
}
vm_clean_all() {
log Removing all VMs in parallel
for NAME in ${ALL_VM_NAMES[@]}; do
vm_clean ${NAME} &
done
wait
}
vm_create() {
NAME=${1}
iso_gen ${NAME}
vol_create_root ${NAME}
log Creating VM ${NAME}
virt-install \
--name ${NAME} \
--hvm \
--cpu host \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--network network=promenade \
--vcpus $(config_vm_vcpus) \
--memory $(config_vm_memory) \
--import \
--disk vol=${VIRSH_POOL}/promenade-${NAME}.img,format=qcow2,bus=virtio \
--disk pool=${VIRSH_POOL},size=20,format=qcow2,bus=virtio \
--disk pool=${VIRSH_POOL},size=20,format=qcow2,bus=virtio \
--disk vol=${VIRSH_POOL}/cloud-init-${NAME}.iso,device=cdrom &>> ${LOG_FILE}
ssh_wait ${NAME}
ssh_cmd ${NAME} sync
}
vm_create_all() {
log Starting all VMs in parallel
for NAME in $(config_vm_names); do
vm_create ${NAME} &
done
wait
for NAME in $(config_vm_names); do
vm_validate ${NAME}
done
}
vm_start() {
NAME=${1}
log Starting VM ${NAME}
virsh start ${NAME} &>> ${LOG_FILE}
ssh_wait ${NAME}
}
vm_stop() {
NAME=${1}
log Stopping VM ${NAME}
virsh destroy ${NAME} &>> ${LOG_FILE}
}
vm_restart_all() {
for NAME in $(config_vm_names); do
vm_stop ${NAME} &
done
wait
for NAME in $(config_vm_names); do
vm_start ${NAME} &
done
wait
}
vm_validate() {
NAME=${1}
if ! virsh list --name | grep ${NAME} &> /dev/null; then
log VM ${NAME} did not start correctly.
exit 1
fi
}
vol_create_root() {
NAME=${1}
if virsh vol-list --pool ${VIRSH_POOL} | grep promenade-${NAME}.img &> /dev/null; then
log Deleting previous volume promenade-${NAME}.img
virsh vol-delete --pool ${VIRSH_POOL} promenade-${NAME}.img &>> ${LOG_FILE}
fi
log Creating root volume for ${NAME}
virsh vol-create-as \
--pool ${VIRSH_POOL} \
--name promenade-${NAME}.img \
--capacity 64G \
--format qcow2 \
--backing-vol promenade-base.img \
--backing-vol-format qcow2 &>> ${LOG_FILE}
}