Fix: Abort script earlier when no objects to cleanup
[releng/global-jjb.git] / shell / openstack-cleanup-orphaned-objects.sh
index 6d845b7..59e1edf 100755 (executable)
@@ -43,6 +43,7 @@ echo "Filters: ${filters}"
 tmpfile=$(mktemp --suffix -openstack-"${object}"s.txt)
 cores=$(nproc --all)
 threads=$((3*cores))
+regex_created_at='^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})Z$'
 
 _cleanup()
 {
@@ -50,26 +51,35 @@ _cleanup()
     created_at=$(openstack --os-cloud "$os_cloud" "${object}" 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 ${object} creation time; skipping: $uuid"
-    else
+
+    elif echo "$created_at" | grep -qP "$regex_created_at"; then
+
         created_at_uxts=$(date -d "$created_at" +%s)
 
-        # For debugging only; this outout usually disabled
-        # echo "${uuid} created at ${created_at} / ${created_at_uxts} / cutoff: ${cutoff}"
-
-        # Validate timing values are numeric
-        if [[ "$created_at_uxts" -eq "$created_at_uxts" ]]; then
-            # Clean up objects when created_at > specified age
-            if [[ "$created_at_uxts" -lt "$cutoff" ]]; then
-                echo "Removing orphaned ${object} $uuid created $created_at_uxts > $age"
-                openstack --os-cloud "$os_cloud" "${object}" delete "$uuid"
-            fi
-        else
-            echo "Date variable failed numeric test; deletion not possible"
+        # 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 ${object} $uuid created $created_at_uxts > $age"
+            openstack --os-cloud "$os_cloud" "${object}" delete "$uuid"
         fi
+    else
+        # Don't stop the job, but warn about unexpected value
+        echo "Unknown/unexpected value for created_at: ${created_at}"
     fi
 }
 
+_rmtemp()
+{
+    if [ -f "$tmpfile" ]; then
+        # Removes temporary file on script exit
+        rm -f "$tmpfile"
+    fi
+}
+
+trap _rmtemp EXIT
+
 # Output the initial list of object UUIDs to a temporary file
 if [[ -n ${filters} ]]; then
     # If a filter/match condition is requested/set
@@ -83,6 +93,12 @@ fi
 
 # Count the number of objects to process
 total=$(wc -l "$tmpfile" | awk '{print $1}')
+
+if [ "$total" -eq 0 ]; then
+    echo "No orphaned objects to process."
+    exit 0
+fi
+
 echo "Processing $total ${object} object(s); current time: $current age limit: $cutoff"
 echo "Using $threads parallel processes..."
 
@@ -91,5 +107,3 @@ export -f _cleanup
 export os_cloud cutoff age object
 # Add --progress flag to the command below for additional debug output
 parallel --retries 3 -j "$threads" _cleanup < "$tmpfile"
-
-rm "$tmpfile"