-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))
+regex_created_at='^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})Z$'
+
+# 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
+ # This is a valid result for some objects; do not stop processing
+ echo "No value for port creation time; skipping: $uuid"
+
+ elif echo "$created_at" | grep -qP "$regex_created_at"; then
+
+ created_at_uxts=$(date -d "$created_at" +"%s")
+
+ # Cleanup objects where created_at is older than specified cutoff time
+ # created_at_uxts is measured against UNIX epoch; lower values are older
+ if [[ "$created_at_uxts" -lt "$cutoff" ]]; then
+ echo "Removing orphaned port $uuid created $created_at_uxts > $age"
+ openstack --os-cloud "$os_cloud" port delete "$uuid"