From: Ionut Balutoiu Date: Fri, 5 Nov 2021 09:53:17 +0000 (+0200) Subject: Update ceph-windows-test job X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d552f389b2c1ca955fc56cb07755cad88292b00d;p=ceph-build.git Update ceph-windows-test job * Create `scripts/ceph-windows` directory with the common scripts for the Ceph Windows testing. * Move `run_tests` script to `scripts/ceph-windows`. * Remove VM image caching from the `run_tests` script. * Add `cleanup_tests` script to `scripts/ceph-windows`, and call this as a post-build step when the job is aborted. * Add `get_chacra_build` build script, and refactor away this logic from the `run_tests` script. * Move cleanup Windows tests function to `scripts/build_utils.sh`. --- diff --git a/ceph-windows-test/build/get_chacra_build b/ceph-windows-test/build/get_chacra_build new file mode 100644 index 00000000..e6ad1339 --- /dev/null +++ b/ceph-windows-test/build/get_chacra_build @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -o errexit +set -o pipefail + +CEPH_WINDOWS_VERSION=${CEPH_WINDOWS_VERSION:-"1809"} +CEPH_WINDOWS_SHA1=${CEPH_WINDOWS_SHA1:-"latest"} + +GET_BIN_SCRIPT_URL="https://raw.githubusercontent.com/ceph/ceph-win32-tests/master/get-bin.py" + +# +# Download the Chacra Ceph Windows build +# +cd $WORKSPACE +timeout 1m curl -L -o ./get-chacra-bin.py $GET_BIN_SCRIPT_URL +chmod +x ./get-chacra-bin.py +timeout 10m ./get-chacra-bin.py --distrover $CEPH_WINDOWS_VERSION --sha1 $CEPH_WINDOWS_SHA1 diff --git a/ceph-windows-test/build/run_tests b/ceph-windows-test/build/run_tests deleted file mode 100755 index dbf50bff..00000000 --- a/ceph-windows-test/build/run_tests +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env bash -set -o errexit -set -o pipefail - -CEPH_WINDOWS_VERSION=${CEPH_WINDOWS_VERSION:-"1809"} -CEPH_WINDOWS_SHA1=${CEPH_WINDOWS_SHA1:-"latest"} - -VM_IMAGE_URL=${VM_IMAGE_URL:-"https://filedump.ceph.com/windows/ceph-win-ltsc2019-ci-image.qcow2"} -VM_IMAGES_DIR=${VM_IMAGES_DIR:-"$WORKSPACE/vm_images"} - -CEPHADM_RELEASE=${CEPHADM_RELEASE:-"pacific"} - -VM_NAME="ceph-win-ltsc2019-${BUILD_ID}" -SSH_KNOWN_HOSTS="/tmp/ssh_known_hosts_${BUILD_ID}" -SSH_TIMEOUT="30s" - - -function run_ssh_command() { - local VM_IP="$1" - shift - timeout $SSH_TIMEOUT ssh -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${SSH_KNOWN_HOSTS} administrator@${VM_IP} ${@} -} - -function run_scp_upload_command() { - local VM_IP="$1" - local LOCAL_FILE="$2" - local REMOTE_FILE="$3" - timeout $SSH_TIMEOUT scp -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${SSH_KNOWN_HOSTS} -r $LOCAL_FILE administrator@${VM_IP}:${REMOTE_FILE} -} - -function run_scp_download_command() { - local VM_IP="$1" - local REMOTE_FILE="$2" - local LOCAL_FILE="$3" - timeout $SSH_TIMEOUT scp -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${SSH_KNOWN_HOSTS} -r administrator@${VM_IP}:${REMOTE_FILE} $LOCAL_FILE -} - -function cleanup() { - # Cleanup virsh VM - if sudo virsh list | grep -q $VM_NAME; then - echo "Shutting down VM $VM_NAME" - sudo virsh destroy $VM_NAME - fi - if sudo virsh list --all | grep -q $VM_NAME; then - echo "Deleting VM $VM_NAME" - sudo virsh undefine $VM_NAME --remove-all-storage - fi - # Cleanup Ceph clusters spawned via cephadm - if [[ -x $WORKSPACE/cephadm ]] && [[ -d /var/lib/ceph ]]; then - for FSID in $(sudo ls /var/lib/ceph); do - echo "Removing Ceph cluster $FSID" - sudo $WORKSPACE/cephadm rm-cluster --fsid $FSID --force - done - fi - # Cleanup remaning files / directories - sudo rm -rf \ - $WORKSPACE/ceph.conf $WORKSPACE/keyring $WORKSPACE/cephadm \ - $WORKSPACE/ceph.zip $SSH_KNOWN_HOSTS /etc/ceph /var/log/ceph \ - /var/lib/ceph /var/run/ceph -} - - -# -# Cleanup before the script exits -# -trap cleanup EXIT - -# -# Download the Chacra Ceph Windows build -# -timeout 10m $WORKSPACE/ceph-win32-tests/get-bin.py \ - --distrover $CEPH_WINDOWS_VERSION \ - --sha1 $CEPH_WINDOWS_SHA1 - -# -# Install requirements (if needed) -# -if ! sudo docker version &>/dev/null; then - sudo apt-get update - sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release - - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - - sudo apt-get update - sudo apt-get install -y docker-ce docker-ce-cli containerd.io - - sudo usermod -aG docker $USER -fi -if ! which virt-install >/dev/null; then - sudo apt-get update - sudo apt-get install -y virtinst -fi -if ! sudo virsh net-info default &>/dev/null; then - cat << EOF > $WORKSPACE/default-net.xml - - default - - - - - - - - -EOF - sudo virsh net-define $WORKSPACE/default-net.xml - sudo virsh net-start default - sudo virsh net-autostart default - rm $WORKSPACE/default-net.xml -fi -if ! which xmllint >/dev/null; then - sudo apt-get update - sudo apt-get install -y libxml2-utils -fi - -# -# Start minimal Ceph development cluster via cephadm -# -curl -L "https://github.com/ceph/ceph/raw/${CEPHADM_RELEASE}/src/cephadm/cephadm" -o $WORKSPACE/cephadm -chmod +x $WORKSPACE/cephadm -sudo virsh net-dumpxml default > $WORKSPACE/default-net.xml -MON_IP=`xmllint --xpath 'string(/network/ip/@address)' $WORKSPACE/default-net.xml` -sudo rm $WORKSPACE/default-net.xml -sudo $WORKSPACE/cephadm bootstrap --allow-fqdn-hostname --single-host-defaults --mon-ip $MON_IP -sudo $WORKSPACE/cephadm add-repo --release $CEPHADM_RELEASE -sudo $WORKSPACE/cephadm install ceph-common - -sudo cp /etc/ceph/ceph.conf $WORKSPACE/ceph.conf -sudo cp /etc/ceph/ceph.client.admin.keyring $WORKSPACE/keyring -sudo chown $USER $WORKSPACE/ceph.conf $WORKSPACE/keyring - -sudo ceph osd pool create rbd - -# -# Download the Windows qcow2 image (if necessary) -# -IMAGE_FILE="$(basename $VM_IMAGE_URL)" -mkdir -p $VM_IMAGES_DIR - -echo "Decide if the VM image is up to date" -DOWNLOAD_IMAGE=false -if [[ -e "${VM_IMAGES_DIR}/${IMAGE_FILE}" ]]; then - SHA256="$(curl -L -s ${VM_IMAGE_URL}.sha256)" - if [[ ! -e "${VM_IMAGES_DIR}/${IMAGE_FILE}.sha256" ]]; then - sha256sum ${VM_IMAGES_DIR}/${IMAGE_FILE} | awk '{print $1}' > "${VM_IMAGES_DIR}/${IMAGE_FILE}.sha256" - fi - if [[ "$SHA256" != "$(cat ${VM_IMAGES_DIR}/${IMAGE_FILE}.sha256)" ]]; then - DOWNLOAD_IMAGE=true - fi -else - DOWNLOAD_IMAGE=true -fi -if [[ $DOWNLOAD_IMAGE == true ]]; then - echo "The VM image is outdated. Downloading it from $VM_IMAGE_URL" - curl -L -o ${VM_IMAGES_DIR}/${IMAGE_FILE} $VM_IMAGE_URL - curl -L -o ${VM_IMAGES_DIR}/${IMAGE_FILE}.sha256 ${VM_IMAGE_URL}.sha256 -else - echo "The VM image is up to date" -fi -echo "Copying VM image to be used for VM ${VM_NAME}" -cp ${VM_IMAGES_DIR}/${IMAGE_FILE} ${WORKSPACE}/${IMAGE_FILE} - -# -# Start the Windows testing VM -# -sudo virt-install \ - --name $VM_NAME \ - --os-variant win2k19 \ - --boot hd \ - --virt-type kvm \ - --graphics spice \ - --cpu host \ - --vcpus 4 \ - --memory 4096 \ - --disk ${WORKSPACE}/${IMAGE_FILE},bus=virtio \ - --network network=default,model=virtio \ - --controller type=virtio-serial \ - --channel unix,target_type=virtio,name=org.qemu.guest_agent.0 \ - --noautoconsol - -# -# Wait until the QEMU agent reports the VM IP, and it's reachable via SSH -# -SECONDS=0 -TIMEOUT=600 -SLEEP_SECS=10 -while true; do - if [[ $SECONDS -gt $TIMEOUT ]]; then - echo "Timeout waiting for the VM to start" - exit 1 - fi - VM_IP=$(sudo virsh domifaddr --source agent --interface Ethernet --full $VM_NAME | grep ipv4 | awk '{print $4}' | cut -d '/' -f1) || { - echo "Retrying in $SLEEP_SECS seconds" - sleep $SLEEP_SECS - continue - } - ssh-keyscan -H $VM_IP &> $SSH_KNOWN_HOSTS || { - echo "SSH is not reachable yet" - sleep $SLEEP_SECS - continue - } - run_ssh_command $VM_IP hostname || { - echo "Cannot execute SSH commands yet" - sleep $SLEEP_SECS - continue - } - break -done - -# -# Copy the ceph.conf and keyring to the Windows VM -# -run_ssh_command $VM_IP powershell.exe mkdir -force /ProgramData/ceph/out -run_scp_upload_command $VM_IP $WORKSPACE/ceph.conf /ProgramData/ceph/ceph.conf -run_scp_upload_command $VM_IP $WORKSPACE/keyring /ProgramData/ceph/keyring - -# -# Setup the Ceph Windows build in the Windows VM -# -SSH_TIMEOUT=5m run_scp_upload_command $VM_IP $WORKSPACE/ceph.zip /ceph.zip -SSH_TIMEOUT=10m run_ssh_command $VM_IP powershell.exe "\$ProgressPreference='SilentlyContinue'; Expand-Archive -Path /ceph.zip -DestinationPath / -Force" -run_ssh_command $VM_IP powershell.exe "New-Service -Name ceph-rbd -BinaryPathName 'c:\ceph\rbd-wnbd.exe service'" -run_ssh_command $VM_IP powershell.exe Start-Service -Name ceph-rbd - -# -# Run the Windows tests -# -SSH_TIMEOUT=5m run_scp_upload_command $VM_IP $WORKSPACE/ceph-win32-tests /workspace/repos/ceph-win32-tests -SSH_TIMEOUT=1h run_ssh_command $VM_IP powershell.exe /workspace/repos/ceph-win32-tests/test_host/run_tests.ps1 -workerCount 4 - -# -# Collect logs -# -mkdir -p $WORKSPACE/logs -run_scp_download_command $VM_IP /workspace/test_results $WORKSPACE/logs/test_results diff --git a/ceph-windows-test/config/definitions/ceph-windows-test.yml b/ceph-windows-test/config/definitions/ceph-windows-test.yml index d3283d0c..004256e0 100644 --- a/ceph-windows-test/config/definitions/ceph-windows-test.yml +++ b/ceph-windows-test/config/definitions/ceph-windows-test.yml @@ -23,17 +23,12 @@ description: "The SHA1 for the Ceph build." default: latest - scm: - - git: - url: https://github.com/ceph/ceph-win32-tests.git - branches: - - master - basedir: ceph-win32-tests - builders: - shell: !include-raw: - ../../build/run_tests + - ../../build/get_chacra_build + - ../../../scripts/build_utils.sh + - ../../../scripts/ceph-windows/run_tests wrappers: - credentials-binding: @@ -46,3 +41,14 @@ artifacts: 'logs/**' allow-empty: true latest-only: false + + - postbuildscript: + builders: + - role: SLAVE + build-on: + - ABORTED + build-steps: + - shell: + !include-raw: + - ../../../scripts/build_utils.sh + - ../../../scripts/ceph-windows/cleanup_tests diff --git a/scripts/build_utils.sh b/scripts/build_utils.sh index 09fcdb8a..6ba86d29 100644 --- a/scripts/build_utils.sh +++ b/scripts/build_utils.sh @@ -1595,3 +1595,29 @@ docs_pr_only() { fi popd } + +function cleanup_windows_tests_env() { + local VM_NAME=${VM_NAME:-"ceph-win-ltsc2019-${JOB_NAME}-${BUILD_ID}"} + + # Cleanup virsh VM + if sudo virsh list | grep -q $VM_NAME; then + echo "Shutting down VM $VM_NAME" + sudo virsh destroy $VM_NAME + fi + if sudo virsh list --all | grep -q $VM_NAME; then + echo "Deleting VM $VM_NAME" + sudo virsh undefine $VM_NAME --remove-all-storage + fi + # Cleanup Ceph clusters spawned via cephadm + if [[ -x $WORKSPACE/cephadm ]] && [[ -d /var/lib/ceph ]]; then + for FSID in $(sudo ls /var/lib/ceph); do + echo "Removing Ceph cluster $FSID" + sudo $WORKSPACE/cephadm rm-cluster --fsid $FSID --force + done + fi + # Cleanup remaning files / directories + sudo rm -rf \ + $WORKSPACE/ceph.conf $WORKSPACE/keyring $WORKSPACE/cephadm \ + $WORKSPACE/ceph.zip $WORKSPACE/known_hosts \ + /etc/ceph /var/log/ceph /var/lib/ceph /var/run/ceph +} diff --git a/scripts/ceph-windows/cleanup_tests b/scripts/ceph-windows/cleanup_tests new file mode 100644 index 00000000..b37f2604 --- /dev/null +++ b/scripts/ceph-windows/cleanup_tests @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -o errexit +set -o pipefail + + +cleanup_windows_tests_env diff --git a/scripts/ceph-windows/run_tests b/scripts/ceph-windows/run_tests new file mode 100644 index 00000000..b3a2db04 --- /dev/null +++ b/scripts/ceph-windows/run_tests @@ -0,0 +1,185 @@ +#!/usr/bin/env bash +set -o errexit +set -o pipefail + +if [[ -z $CEPH_WIN_CI_KEY ]]; then + echo "ERROR: The CI SSH private key secret (CEPH_WIN_CI_KEY) is not set" + exit 1 +fi +if [[ ! -f $WORKSPACE/ceph.zip ]]; then + echo "ERROR: The Ceph Windows build zip file doesn't exist at $WORKSPACE/ceph.zip" + exit 1 +fi + +VM_IMAGE_URL=${VM_IMAGE_URL:-"https://filedump.ceph.com/windows/ceph-win-ltsc2019-ci-image.qcow2"} +CEPHADM_RELEASE=${CEPHADM_RELEASE:-"pacific"} + +VM_NAME="ceph-win-ltsc2019-${JOB_NAME}-${BUILD_ID}" +SSH_TIMEOUT="30s" + + +function run_ssh_command() { + local VM_IP="$1" + shift + timeout $SSH_TIMEOUT ssh -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${WORKSPACE}/known_hosts administrator@${VM_IP} ${@} +} + +function run_scp_upload_command() { + local VM_IP="$1" + local LOCAL_FILE="$2" + local REMOTE_FILE="$3" + timeout $SSH_TIMEOUT scp -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${WORKSPACE}/known_hosts -r $LOCAL_FILE administrator@${VM_IP}:${REMOTE_FILE} +} + +function run_scp_download_command() { + local VM_IP="$1" + local REMOTE_FILE="$2" + local LOCAL_FILE="$3" + timeout $SSH_TIMEOUT scp -i $CEPH_WIN_CI_KEY -o UserKnownHostsFile=${WORKSPACE}/known_hosts -r administrator@${VM_IP}:${REMOTE_FILE} $LOCAL_FILE +} + +# +# Cleanup before the script exits +# +trap cleanup_windows_tests_env EXIT + +# +# Install requirements (if needed) +# +if ! sudo docker version &>/dev/null; then + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release + + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + + sudo usermod -aG docker $USER +fi +if ! which virt-install >/dev/null; then + sudo apt-get update + sudo apt-get install -y virtinst +fi +if ! sudo virsh net-info default &>/dev/null; then + cat << EOF > $WORKSPACE/default-net.xml + + default + + + + + + + + +EOF + sudo virsh net-define $WORKSPACE/default-net.xml + sudo virsh net-start default + sudo virsh net-autostart default + rm $WORKSPACE/default-net.xml +fi +if ! which xmllint >/dev/null; then + sudo apt-get update + sudo apt-get install -y libxml2-utils +fi + +# +# Start minimal Ceph development cluster via cephadm +# +curl -L "https://github.com/ceph/ceph/raw/${CEPHADM_RELEASE}/src/cephadm/cephadm" -o $WORKSPACE/cephadm +chmod +x $WORKSPACE/cephadm +sudo virsh net-dumpxml default > $WORKSPACE/default-net.xml +MON_IP=`xmllint --xpath 'string(/network/ip/@address)' $WORKSPACE/default-net.xml` +sudo rm $WORKSPACE/default-net.xml +sudo $WORKSPACE/cephadm bootstrap --allow-fqdn-hostname --single-host-defaults --mon-ip $MON_IP +sudo $WORKSPACE/cephadm add-repo --release $CEPHADM_RELEASE +sudo $WORKSPACE/cephadm install ceph-common + +sudo cp /etc/ceph/ceph.conf $WORKSPACE/ceph.conf +sudo cp /etc/ceph/ceph.client.admin.keyring $WORKSPACE/keyring +sudo chown $USER $WORKSPACE/ceph.conf $WORKSPACE/keyring + +sudo ceph osd pool create rbd + +# +# Download the Windows qcow2 image +# +IMAGE_FILE="$(basename $VM_IMAGE_URL)" +echo "Downloading VM image from $VM_IMAGE_URL" +curl -L -o ${WORKSPACE}/${IMAGE_FILE} $VM_IMAGE_URL + +# +# Start the Windows testing VM +# +sudo virt-install \ + --name $VM_NAME \ + --os-variant win2k19 \ + --boot hd \ + --virt-type kvm \ + --graphics spice \ + --cpu host \ + --vcpus 4 \ + --memory 4096 \ + --disk ${WORKSPACE}/${IMAGE_FILE},bus=virtio \ + --network network=default,model=virtio \ + --controller type=virtio-serial \ + --channel unix,target_type=virtio,name=org.qemu.guest_agent.0 \ + --noautoconsol + +# +# Wait until the QEMU agent reports the VM IP, and it's reachable via SSH +# +SECONDS=0 +TIMEOUT=600 +SLEEP_SECS=10 +while true; do + if [[ $SECONDS -gt $TIMEOUT ]]; then + echo "Timeout waiting for the VM to start" + exit 1 + fi + VM_IP=$(sudo virsh domifaddr --source agent --interface Ethernet --full $VM_NAME | grep ipv4 | awk '{print $4}' | cut -d '/' -f1) || { + echo "Retrying in $SLEEP_SECS seconds" + sleep $SLEEP_SECS + continue + } + ssh-keyscan -H $VM_IP &> ${WORKSPACE}/known_hosts || { + echo "SSH is not reachable yet" + sleep $SLEEP_SECS + continue + } + run_ssh_command $VM_IP hostname || { + echo "Cannot execute SSH commands yet" + sleep $SLEEP_SECS + continue + } + break +done + +# +# Copy the ceph.conf and keyring to the Windows VM +# +run_ssh_command $VM_IP powershell.exe mkdir -force /ProgramData/ceph/out +run_scp_upload_command $VM_IP $WORKSPACE/ceph.conf /ProgramData/ceph/ceph.conf +run_scp_upload_command $VM_IP $WORKSPACE/keyring /ProgramData/ceph/keyring + +# +# Setup the Ceph Windows build in the Windows VM +# +SSH_TIMEOUT=5m run_scp_upload_command $VM_IP $WORKSPACE/ceph.zip /ceph.zip +SSH_TIMEOUT=10m run_ssh_command $VM_IP powershell.exe "\$ProgressPreference='SilentlyContinue'; Expand-Archive -Path /ceph.zip -DestinationPath / -Force" +run_ssh_command $VM_IP powershell.exe "New-Service -Name ceph-rbd -BinaryPathName 'c:\ceph\rbd-wnbd.exe service'" +run_ssh_command $VM_IP powershell.exe Start-Service -Name ceph-rbd + +# +# Run the Windows tests +# +SSH_TIMEOUT=5m run_ssh_command $VM_IP git.exe clone https://github.com/ceph/ceph-win32-tests.git /workspace/repos/ceph-win32-tests +SSH_TIMEOUT=1h run_ssh_command $VM_IP powershell.exe /workspace/repos/ceph-win32-tests/test_host/run_tests.ps1 -workerCount 4 + +# +# Collect logs +# +mkdir -p $WORKSPACE/logs +run_scp_download_command $VM_IP /workspace/test_results $WORKSPACE/logs/test_results