[autotest] A script to force puppet deployment

deploy_puppet.sh -s primary -r drone
deploy_puppet.sh -n fdeng-test-2.cbf.corp.google.com
deploy_puppet.sh -s primary -r drone -d # Dry run

TEST=ran the script on a ganeti instance
BUG=None

Change-Id: I6e07c5b1265ed7a0474252abc05befe84b4619b8
Reviewed-on: https://chromium-review.googlesource.com/294564
Reviewed-by: Fang Deng <fdeng@chromium.org>
Commit-Queue: Fang Deng <fdeng@chromium.org>
Tested-by: Fang Deng <fdeng@chromium.org>
diff --git a/contrib/deploy_puppet.sh b/contrib/deploy_puppet.sh
new file mode 100755
index 0000000..7ebf30a
--- /dev/null
+++ b/contrib/deploy_puppet.sh
@@ -0,0 +1,101 @@
+#!/bin/bash
+#
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+USAGE='Usage: deploy_puppet.sh [-rsndh]'
+HELP="${USAGE}\n\n\
+Force puppet deployment.\n\
+The script will first fetch server hostnames from server db,\n\
+given the server role and status and/or server name.\n\
+And then force puppet deployment on the selected servers.\n\n\
+Requirement:
+ - Run on the machine that has access to server db and
+ - Run it as chromeos-test.\n\
+ - The server must exist in server db, even if -n is used.
+
+It should be safe to rerun the script multiple time, \n\
+as it doesn't hurt to deploy puppet multiple times.\n\n\
+Options:\n\
+  -r server role as in server db, e.g. 'drone'.\n\
+  -s server status as in server db, e.g. 'primary'.\n\
+  -n server hostname.\n\
+  -d dryrun.\n\
+  -h help."
+
+ROLE=
+ROLE_OPT=
+STATUS=
+STATUS_OPT=
+HOSTNAME=
+DRYRUN="FALSE"
+AUTOTEST_ROOT="/usr/local/autotest"
+while getopts ":s:r:n:dh" opt; do
+  case $opt in
+    r)
+      ROLE=$OPTARG
+      ;;
+    s)
+      STATUS=$OPTARG
+      ;;
+    n)
+      HOSTNAME=$OPTARG
+      ;;
+    d)
+      DRYRUN="TRUE"
+      ;;
+    h)
+      echo -e "${HELP}" >&2
+      exit 0
+      ;;
+    \?)
+      echo "Invalid option: -$OPTARG" >&2
+      echo -e "${HELP}" >&2
+      exit 1
+      ;;
+    :)
+      echo "Option -$OPTARG requires an argument." >&2
+      echo -e "${HELP}" >&2
+      exit 1
+      ;;
+  esac
+done
+
+if [ -n "${ROLE}" ]; then
+  ROLE_OPT="-r ${ROLE}"
+fi
+
+if [ -n "${STATUS}" ]; then
+  STATUS_OPT="-s ${STATUS}"
+fi
+
+if [ -z "${ROLE}" ] && [ -z "${STATUS}" ] && [ -z "${HOSTNAME}"]; then
+  echo "You must specify at least one of -r, -s or -n"
+  exit 1
+fi
+
+hosts="$(${AUTOTEST_ROOT}/cli/atest server list ${STATUS_OPT} ${ROLE_OPT} ${HOSTNAME}| grep Hostname| awk {'print $3'})"
+
+echo -e "\n******* Will update the following servers ********\n "
+
+for host in ${hosts}; do
+  echo ${host}
+done
+
+echo -e "\n**************************************************\n"
+
+for host in ${hosts}; do
+  git_pull="ssh -t ${host} -- 'sudo git --work-tree=/root/chromeos-admin --git-dir=/root/chromeos-admin/.git pull'"
+  run_puppet="ssh ${host} -- 'sudo /root/chromeos-admin/puppet/run_puppet'"
+  echo -e "\n********** Processing ${host} ****************\n"
+  echo "[Running] ${git_pull}"
+  if [ "${DRYRUN}" != "TRUE" ]; then
+    eval ${git_pull}
+  fi
+  echo "[Running] ${run_puppet}"
+  if [ "${DRYRUN}" != "TRUE" ]; then
+    eval ${run_puppet}
+  fi
+  echo -e "\n********* Finished processing ${host} *******\n"
+done