X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?a=blobdiff_plain;f=shell%2Fopenstack-cleanup-orphaned-ports.sh;h=b5c0af526f958a14cb03684d96a3c3f85108b2c2;hb=98090d2e52c78ada3ae2bc3fe4cb918df309a207;hp=e1f84360c9d4266b764a4d59511db760528bb6a1;hpb=a8c7722c19cfca9f0361c578ce63bf552093dd0e;p=releng%2Fglobal-jjb.git diff --git a/shell/openstack-cleanup-orphaned-ports.sh b/shell/openstack-cleanup-orphaned-ports.sh old mode 100644 new mode 100755 index e1f84360..b5c0af52 --- a/shell/openstack-cleanup-orphaned-ports.sh +++ b/shell/openstack-cleanup-orphaned-ports.sh @@ -14,45 +14,58 @@ echo "---> Orphaned ports" # shellcheck disable=SC1090 source ~/lf-env.sh +lf-activate-venv --python python3 "lftools[openstack]" \ + python-openstackclient + os_cloud="${OS_CLOUD:-vex}" -# Check if openstack venv was previously created -if [ -f "/tmp/.os_lf_venv" ]; then - os_lf_venv=$(cat "/tmp/.os_lf_venv") -fi - -if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then - echo "Re-use existing venv: ${os_lf_venv}" - PATH=$os_lf_venv/bin:$PATH -else - lf-activate-venv --python python3 \ - python-heatclient \ - python-openstackclient -fi - -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 || true; } | { awk '{print $1}' || true; } > "$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"