#! /bin/sh POOL="pool4TB" POOLPATH=$(virsh pool-dumpxml ${POOL} |fgrep path | sed -e "s,<[/]*path>,,g" -e "s,^[ \t]*,,g") RELEASE=${RELEASE:-"master"} WORKER_NO=${WORKER_NO:-"01"} WORKER_MEM=${WORKER_MEM:-2097152} WORKER_VCPUS=${WORKER_VCPUS:-2} WORKER_TEMP_DISK="${POOLPATH}/dfly-${RELEASE}-base-${WORKER_NO}_temp.qcow2" TMPDIR="/data/temp" usage() { echo "$0: " echo "" echo "available commands:" echo "" echo " create-worker-vm - Creates a buildbot-worker in a libvirt VM." echo " delete-worker-vm - Deletes a buildbo-worker VM." echo "" echo " NOTE: The worker disk images are pulled from thor so make sure the" echo " building scripts there are working properly." echo "" echo "available environment variables:" echo "" echo " POOL : libvirt pool to use. Default: pool4TB" echo " RELEASE : master or release. Default: master" echo " WORKER_NO : 2-digit padded worker number. Default: 01" echo " WORKER_MEM : memory in kilobytes. Default: 2097152" echo " WORKER_VCPUS: worker VM number of vcpus. Default: 2" echo "" exit 1 } info() { echo "INFO: $*" } delete_worker_vm() { info "Removing domaing buildbot-libvirt-${WORKERNO}" virsh undefine --remove-all-storage --delete-snapshots --wipe-storage \ --nvram buildbot-libvirt-${WORKER_NO} || \ { echo "Failed to remove domain buildbot-libvirt-${WORKER_NO}"; exit 1; } } create_volume() { local _url local _imgfilename local _imgfmt local _imgsize # Calculate the image file name _imgfilename="dfly-${RELEASE}-base-${WORKER_NO}.qcow2" # Different images are generated in different servers case "${RELEASE}" in master|MASTER) _url="https://thor.dragonflybsd.org/libvirt-buildbot/${_imgfilename}.xz" ;; release|RELEASE) _url="https://loki.dragonflybsd.org/libvirt-buildbot/${_imgfilename}.xz" ;; esac # Fetch and extract in one go info "Fetching ${_url}" wget -qO- ${_url} | unxz > ${TMPDIR}/${_imgfilename} # Get image information and upload it to a pool _imgfmt=$(qemu-img info --output json ${TMPDIR}/${_imgfilename} | \ jq -r .format) _imgsize=$(qemu-img info --output json ${TMPDIR}/${_imgfilename} | \ jq -r .[\"virtual-size\"]) # Do it! info "Creating volume ${_imgfilename}" virsh vol-create-as ${POOL} ${_imgfilename} ${_imgsize} \ --format ${_imgfmt} > /dev/null 2>&1 info "Uploading volume ${_imgfilename}" virsh vol-upload --pool ${POOL} ${_imgfilename} \ ${TMPDIR}/${_imgfilename} > /dev/null 2>&1 info "Cleaning up" rm ${TMPDIR}/${_imgfilename} } create_worker_vm() { local _xmlfilename="${TMPDIR}/buildbot-libvirt-${WORKER_NO}.xml" # delete worker domain delete_worker_vm # handle volume creation create_volume # handle xml definition cp /root/adm/libvirt-domains/buildbot-libvirt-nn.xml \ ${_xmlfilename} sed -i.BAK \ -e "s,%%WORKER_NO%%,${WORKER_NO},g" \ -e "s,%%WORKER_MEM%%,${WORKER_MEM},g" \ -e "s,%%WORKER_VCPUS%%,${WORKER_VCPUS},g" \ -e "s,%%WORKER_TEMP_DISK%%,${WORKER_TEMP_DISK},g" \ ${_xmlfilename} # validate the domain XML and create it virsh define --validate ${_xmlfilename} } case "$1" in create-worker-vm) create_worker_vm ;; *) usage ;; esac