Add contrib/freon_swap to simplify managing Freon test pools.

The script is a poor cousin to balance_pool.  It operates by
exchanging broken freon DUTs in pool:bvt with working non-freon
DUTs in pool:suites.

BUG=None
TEST=run the command

Change-Id: I81beff93947ec6e3b170c7f046a7db22ebdb576e
Reviewed-on: https://chromium-review.googlesource.com/264386
Tested-by: Richard Barnette <jrbarnette@chromium.org>
Reviewed-by: Mungyung Ryu <mkryu@google.com>
Commit-Queue: Richard Barnette <jrbarnette@chromium.org>
diff --git a/contrib/freon_swap b/contrib/freon_swap
new file mode 100755
index 0000000..9ff6789
--- /dev/null
+++ b/contrib/freon_swap
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+cd $(dirname $(readlink -f $0))/..
+
+BOARD="$1"
+if [[ "${BOARD}" = *_* ]]; then
+  FREON=${BOARD}-freon
+else
+  FREON=${BOARD}_freon
+fi
+
+case "${BOARD}" in
+    x86-*) PLATFORM=${BOARD#x86-} ;;
+    daisy) PLATFORM=snow ;;
+    daisy_spring) PLATFORM=spring ;;
+    daisy_skate) PLATFORM=skate ;;
+    parrot_ivb) PLATFORM=parrot_2 ;;
+    falco_li) PLATFORM=falco ;;
+    *) PLATFORM=$BOARD ;;
+esac
+
+BROKEN=( $(dut-status -n -b $FREON) )
+if [[ ${#BROKEN[@]} -eq 0 ]]; then
+  echo "No broken DUTs for $FREON" >&2
+  exit 0
+fi
+echo "Found ${#BROKEN[@]} broken $FREON DUTs" >&2
+
+HOST_FILTER='
+  NR == 1 || /pool:.*pool:/ {next}
+  {print $1}
+'
+ELIGIBLE=( $(atest list -b board:$BOARD,pool:suites | awk "${HOST_FILTER}") )
+WORKING=( $(dut-status -w "${ELIGIBLE[@]}" | tail -${#BROKEN[@]}) )
+if [[ ${#WORKING[@]} -eq 0 ]]; then
+  echo "No working DUTs for $BOARD" >&2
+  exit 1
+fi
+echo "Found ${#WORKING[@]} working $BOARD DUTs" >&2
+
+if [[ ${#WORKING[@]} -lt ${#BROKEN[@]} ]]; then
+  echo "Short by $(( ${#BROKEN[@]} - ${#WORKING[@]} )) spares" >&2
+  echo "Not all devices will be replaced" >&2
+  while [[ ${#WORKING[@]} -lt ${#BROKEN[@]} ]]; do
+    unset BROKEN[$(( ${#BROKEN[@]} - 1 ))]
+  done
+fi
+
+BROKEN_M=$(echo "${BROKEN[@]}" | sed 's/ /,/g')
+WORKING_M=$(echo "${WORKING[@]}" | sed 's/ /,/g')
+
+cli/atest label remove -m $BROKEN_M pool:bvt board:$FREON $FREON
+cli/atest label add -m $BROKEN_M pool:suites board:$BOARD $PLATFORM
+cli/atest label remove -m $WORKING_M pool:suites board:$BOARD $PLATFORM
+cli/atest label add -m $WORKING_M pool:bvt board:$FREON $FREON