From: Matthew Watkins Date: Tue, 6 Sep 2022 15:09:49 +0000 (+0100) Subject: Fix: Correctly capture openstack port cli output X-Git-Tag: v0.82.0~1^2 X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?p=releng%2Fglobal-jjb.git;a=commitdiff_plain;h=d5d5be584244ff5db85250ec3ad7618cc91753b5 Fix: Correctly capture openstack port cli output Issue: RELENG-4467 Signed-off-by: Matthew Watkins Change-Id: I5a0dbee41060e8786574030629f9a17e19a48d66 --- diff --git a/releasenotes/notes/fix-openstack-ports-cleanup-7b5e01d5867b5a79.yaml b/releasenotes/notes/fix-openstack-ports-cleanup-7b5e01d5867b5a79.yaml new file mode 100644 index 00000000..8c811543 --- /dev/null +++ b/releasenotes/notes/fix-openstack-ports-cleanup-7b5e01d5867b5a79.yaml @@ -0,0 +1,10 @@ +--- +fixes: + - | + Addresses failures when cleaning up orphaned openstack ports. + The main "openstack list" command no longer accepts + the "-c created_at" option, which has been moved to a property + of the object and must now be queried with "openstack show object + UUID". Also, the created_at parameter sometimes returns "None" + instead of a timestamp, and the existing version of the script + does not catch this condition. diff --git a/shell/openstack-cleanup-orphaned-ports.sh b/shell/openstack-cleanup-orphaned-ports.sh old mode 100644 new mode 100755 index c25ba59f..8549737b --- a/shell/openstack-cleanup-orphaned-ports.sh +++ b/shell/openstack-cleanup-orphaned-ports.sh @@ -14,35 +14,57 @@ echo "---> Orphaned ports" # shellcheck disable=SC1090 source ~/lf-env.sh +lf-activate-venv --python python3 "lftools[openstack]" \ + python-openstackclient + os_cloud="${OS_CLOUD:-vex}" -lf-activate-venv --python python3 \ - python-heatclient \ - python-openstackclient - -set -eux -o pipefail - -mapfile -t os_ports_ts < <(openstack --os-cloud "$os_cloud" port list \ - -f value \ - -c ID \ - -c status \ - -c created_at \ - | grep -E DOWN \ - | awk -F' ' '{print $1 " " $3}') - -if [ ${#os_ports_ts[@]} -eq 0 ]; then - echo "No orphaned ports found." -else - cutoff=$(date -d "30 minutes ago" +%s) - for port_ts in "${os_ports_ts[@]}"; do - created_at_isots="${port_ts#* }" - port_uuid="${port_ts% *}" - echo "checking port uuid: ${port_uuid} with TS: ${created_at_isots}" - created_at_uxts=$(date -d "${created_at_isots}" +"%s") - # Clean up ports where created_at > 30 minutes - if [[ "$created_at_uxts" -gt "$cutoff" ]]; then - echo "Removing orphaned port $port_uuid created_at ts > 30 minutes." - openstack --os-cloud "$os_cloud" port delete "$port_uuid" +set -eu -o pipefail + +tmpfile=$(mktemp --suffix -openstack-ports.txt) +cores=$(nproc --all) +threads=$((3*cores)) + +# Set age for deletion/removal +age="30 minutes ago" +cutoff=$(date -d "$age" +%s) + +_cleanup() +{ + uuid=$1 + created_at=$(openstack --os-cloud "$os_cloud" port show -f value -c created_at "$uuid") + if [ "$created_at" == "None" ]; then + echo "No value for port creation time; skipping: $uuid" + else + created_at_uxts=$(date -d "$created_at" +"%s") + + # For debugging only; this outout usually disabled + # echo "Port: ${uuid} created at ${created_at} / ${created_at_uxts}" + + # Validate timing values are numeric + if [[ "$created_at_uxts" -eq "$created_at_uxts" ]]; then + # Clean up ports where created_at > 30 minutes + if [[ "$created_at_uxts" -lt "$cutoff" ]]; then + echo "Removing orphaned port $uuid created > $age" + openstack --os-cloud "$os_cloud" port delete "$uuid" + fi + else + echo "Date variable failed numeric test; deletion not possible" fi - done -fi + fi +} + +# Output the initial list of port UUIDs to a temporary file +openstack --os-cloud "$os_cloud" port list -f value -c ID -c status | grep -e DOWN | awk '{print $1}'> "$tmpfile" + +# Count the number to process +total=$(wc -l "$tmpfile" | awk '{print $1}') +echo "Ports to process: $total; age limit: $cutoff" +echo "Using $threads parallel processes..." + +# Export variables and send to parallel for processing +export -f _cleanup +export os_cloud cutoff age +parallel --progress --retries 3 -j "$threads" _cleanup < "$tmpfile" + +rm "$tmpfile"