#!/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 VC8_GOVMOMI_USERNAME VC8_GOVMOMI_PASSWORD VC8_GOVMOMI_URL VC8_GOVMOMI_CLUSTER VC8_GOVMOMI_DATACENTER VC8_GOVMOMI_DATASTORE VC8_GOVMOMI_FOLDER VC8_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 "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -pool="${VC8_GOVMOMI_CLUSTER}"/Resources \ -ds="${VC8_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 "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -pool="${VC8_GOVMOMI_CLUSTER}"/Resources \ -ds="${VC8_GOVMOMI_DATASTORE}" \ -folder="${VC8_GOVMOMI_FOLDER}" \ -net="${VC8_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}" # Create SSH keys to use local _vsphere_ssh_key="${WORKDIR}/vsphere_ssh_key" ssh-keygen -t rsa-sha2-512 -f "${_vsphere_ssh_key}" -C "${SSH_USER}" -N "" # Set cloud-init data for the VM local _ci_userdata_path _ci_userdata_path="$(createCIUserdata "${SSH_USER}" "${_vsphere_ssh_key}.pub")" local _ci_userdata_encoded _ci_userdata_encoded="$(fileToCloudInitEncodedGzipB64 "${_ci_userdata_path}")" local _ci_metadata_path _ci_metadata_path="$(createCIMetadata "${VSPHERE_VM_NAME}")" local _ci_metadata_encoded _ci_metadata_encoded="$(fileToCloudInitEncodedGzipB64 "${_ci_metadata_path}")" # configure the VM to use the cloud-init data greenprint "๐Ÿ’ฟ Configuring the VM to use the cloud-init data" $GOVC_CMD vm.change \ -u "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -vm "${VSPHERE_VM_NAME}" \ -e "guestinfo.userdata=${_ci_userdata_encoded}" \ -e "guestinfo.userdata.encoding=gzip+base64" \ -e "guestinfo.metadata=${_ci_metadata_encoded}" \ -e "guestinfo.metadata.encoding=gzip+base64" # tagging vm as testing object $GOVC_CMD tags.attach \ -u "${VC8_GOVMOMI_USERNAME}":"${VC8_GOVMOMI_PASSWORD}"@"${VC8_GOVMOMI_URL}" \ -k=true \ -c "osbuild-composer testing" gitlab-ci-test \ "/${VC8_GOVMOMI_DATACENTER}/vm/${VC8_GOVMOMI_FOLDER}/${VSPHERE_VM_NAME}" # start the VM greenprint "๐Ÿ”Œ Powering up the VSphere VM" $GOVC_CMD vm.power \ -u "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -on "${VSPHERE_VM_NAME}" HOST=$($GOVC_CMD vm.ip \ -u "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -v4=true \ -dc="${VC8_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 "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ "${VSPHERE_VM_NAME}" greenprint "๐Ÿงน Cleaning up the VSphere Datastore" $GOVC_CMD datastore.rm \ -u "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -ds="${VC8_GOVMOMI_DATASTORE}" \ -f \ "${VSPHERE_CIDATA_ISO_PATH}" $GOVC_CMD datastore.rm \ -u "${VC8_GOVMOMI_USERNAME}:${VC8_GOVMOMI_PASSWORD}@${VC8_GOVMOMI_URL}" \ -k=true \ -dc="${VC8_GOVMOMI_DATACENTER}" \ -ds="${VC8_GOVMOMI_DATASTORE}" \ -f \ "${VSPHERE_VM_NAME}" }