#!/usr/bin/bash source /usr/libexec/tests/osbuild-composer/shared_lib.sh function installClientVSphere() { if ! hash govc; then ARCH="$(uname -m)" if [ "$ARCH" = "aarch64" ]; then ARCH="arm64" fi greenprint "Installing govc" pushd "${WORKDIR}" || exit 1 curl -Ls --retry 5 --output govc.tar.gz \ "https://github.com/vmware/govmomi/releases/download/v0.29.0/govc_Linux_$ARCH.tar.gz" tar -xvf govc.tar.gz GOVC_CMD="${WORKDIR}/govc" chmod +x "${GOVC_CMD}" popd || exit 1 else echo "Using pre-installed 'govc' from the system" GOVC_CMD="govc" fi $GOVC_CMD version } function checkEnvVSphere() { printenv GOVMOMI_USERNAME GOVMOMI_PASSWORD GOVMOMI_URL GOVMOMI_CLUSTER GOVMOMI_DATACENTER GOVMOMI_DATASTORE GOVMOMI_FOLDER GOVMOMI_NETWORK > /dev/null } # Create a cloud-int user-data file # # Returns: # - path to the user-data file # # Arguments: # $1 - default username # $2 - path to the SSH public key to set as authorized for the user function createCIUserdata() { local _user="$1" local _ssh_pubkey_path="$2" local _ci_userdata_dir _ci_userdata_dir="$(mktemp -d -p "${WORKDIR}")" local _ci_userdata_path="${_ci_userdata_dir}/user-data" cat > "${_ci_userdata_path}" < "${_ci_metadata_path}" <" to the name greenprint "๐Ÿ’ฟ โฌ†๏ธ Importing the converted VMDK image to VSphere" $GOVC_CMD import.vmdk \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -pool="${GOVMOMI_CLUSTER}"/Resources \ -ds="${GOVMOMI_DATASTORE}" \ "${WORKDIR}/${VSPHERE_IMAGE_NAME}" \ "${VSPHERE_VM_NAME}" # create the VM, but don't start it greenprint "๐Ÿ–ฅ๏ธ Creating VM in VSphere" $GOVC_CMD vm.create \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -pool="${GOVMOMI_CLUSTER}"/Resources \ -ds="${GOVMOMI_DATASTORE}" \ -folder="${GOVMOMI_FOLDER}" \ -net="${GOVMOMI_NETWORK}" \ -net.adapter=vmxnet3 \ -m=4096 -c=2 -g=rhel8_64Guest -on=true -firmware=efi \ -disk="${VSPHERE_VM_NAME}/${VSPHERE_IMAGE_NAME}" \ -disk.controller=scsi \ -on=false \ "${VSPHERE_VM_NAME}" # tagging vm as testing object $GOVC_CMD tags.attach \ -u "${GOVMOMI_USERNAME}":"${GOVMOMI_PASSWORD}"@"${GOVMOMI_URL}" \ -k=true \ -c "osbuild-composer testing" gitlab-ci-test \ "/${GOVMOMI_DATACENTER}/vm/${GOVMOMI_FOLDER}/${VSPHERE_VM_NAME}" # upload ISO, create CDROM device and insert the ISO in it greenprint "๐Ÿ’ฟ โฌ†๏ธ Uploading the cloud-init user-data ISO to VSphere" VSPHERE_CIDATA_ISO_PATH="${VSPHERE_VM_NAME}/cidata.iso" $GOVC_CMD datastore.upload \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -ds="${GOVMOMI_DATASTORE}" \ "${_ci_iso_path}" \ "${VSPHERE_CIDATA_ISO_PATH}" local _cdrom_device greenprint "๐Ÿ–ฅ๏ธ + ๐Ÿ’ฟ Adding a CD-ROM device to the VM" _cdrom_device="$($GOVC_CMD device.cdrom.add \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -vm "${VSPHERE_VM_NAME}")" greenprint "๐Ÿ’ฟ Inserting the cloud-init ISO into the CD-ROM device" $GOVC_CMD device.cdrom.insert \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -ds="${GOVMOMI_DATASTORE}" \ -vm "${VSPHERE_VM_NAME}" \ -device "${_cdrom_device}" \ "${VSPHERE_CIDATA_ISO_PATH}" # start the VM greenprint "๐Ÿ”Œ Powering up the VSphere VM" $GOVC_CMD vm.power \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -on "${VSPHERE_VM_NAME}" HOST=$($GOVC_CMD vm.ip \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -v4=true \ -dc="${GOVMOMI_DATACENTER}" \ "${VSPHERE_VM_NAME}") greenprint "โฑ Waiting for the VSphere VM to respond to ssh" _instanceWaitSSH "${HOST}" _ssh="ssh -oStrictHostKeyChecking=no -i ${_vsphere_ssh_key} $SSH_USER@$HOST" _instanceCheck "${_ssh}" greenprint "โœ… Successfully verified VSphere image with cloud-init" } function cleanupVSphere() { # since this function can be called at any time, ensure that we don't expand unbound variables GOVC_CMD="${GOVC_CMD:-}" VSPHERE_VM_NAME="${VSPHERE_VM_NAME:-}" VSPHERE_CIDATA_ISO_PATH="${VSPHERE_CIDATA_ISO_PATH:-}" greenprint "๐Ÿงน Cleaning up the VSphere VM" $GOVC_CMD vm.destroy \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ "${VSPHERE_VM_NAME}" greenprint "๐Ÿงน Cleaning up the VSphere Datastore" $GOVC_CMD datastore.rm \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -ds="${GOVMOMI_DATASTORE}" \ -f \ "${VSPHERE_CIDATA_ISO_PATH}" $GOVC_CMD datastore.rm \ -u "${GOVMOMI_USERNAME}:${GOVMOMI_PASSWORD}@${GOVMOMI_URL}" \ -k=true \ -dc="${GOVMOMI_DATACENTER}" \ -ds="${GOVMOMI_DATASTORE}" \ -f \ "${VSPHERE_VM_NAME}" }