Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/tools/backups/restore.sh b/tools/backups/restore.sh
new file mode 100755
index 0000000..f585a07
--- /dev/null
+++ b/tools/backups/restore.sh
@@ -0,0 +1,110 @@
+#!/bin/bash
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+
+# The existing replicas all have this prefix:
+REPLICA_PREFIX="replica"
+
+# The new replicas made from the restored primary will have this prefix:
+NEW_REPLICA_PREFIX="replica-1"
+
+CLOUD_PROJECT="monorail-staging"
+
+DRY_RUN=true
+
+echo Restoring backups to primary for ${CLOUD_PROJECT}. Dry run: ${DRY_RUN}
+echo This will delete all read replicas with the prefix "${REPLICA_PREFIX}"
+echo and create a new set of replicas with the prefix "${NEW_REPLICA_PREFIX}"
+echo
+echo Checking for existing read replicas to delete:
+
+EXISTING_REPLICAS=($(gcloud sql instances list --project=${CLOUD_PROJECT} | grep ${REPLICA_PREFIX}- | awk '{print $1}'))
+
+if [ ${#EXISTING_REPLICAS[@]} -eq 0 ]; then
+  echo No replicas found with prefix ${REPLICA_PREFIX}
+  echo List instances to find the replica prefix by running:
+  echo gcloud sql instances list --project=${CLOUD_PROJECT}
+  exit 1
+fi
+
+echo Deleting ${#EXISTING_REPLICAS[@]} existing replicas found with the prefix ${REPLICA_PREFIX}
+
+for r in "${EXISTING_REPLICAS[@]}"; do
+  echo Deleting ${r}
+  cmd="gcloud sql instances delete ${r} --project=${CLOUD_PROJECT}"
+  echo ${cmd}
+  if [ ${DRY_RUN} == false ]; then
+    ${cmd}
+  fi
+done
+
+echo Checking for available backups:
+
+DUE_TIMES=($(gcloud sql backups list --instance primary --project=${CLOUD_PROJECT} | grep SUCCESSFUL | awk '{print $1}'))
+
+for index in ${!DUE_TIMES[*]}; do
+  echo "[${index}] ${DUE_TIMES[${index}]}"
+done
+
+echo "Choose one of the above due_time values."
+echo "NOTE: selecting anything besides 0 will require you to manually"
+echo "complete the rest of the restore process."
+echo "Recover from date [0: ${DUE_TIMES[0]}]:"
+read DUE_TIME_INDEX
+
+DUE_TIME=${DUE_TIMES[${DUE_TIME_INDEX}]}
+
+cmd="gcloud sql backups restore ${DUE_TIME} --project=${CLOUD_PROJECT} --restore-instance=primary"
+echo ${cmd}
+if [ ${DRY_RUN} == false ]; then
+  ${cmd}
+fi
+
+if [ "${DUE_TIME_INDEX}" -ne "0" ]; then
+  echo "You've restored an older-than-latest backup. Please contact speckle-oncall@"
+  echo "to request an on-demand backup of the primary before attempting to restart replicas,"
+  echo "which this script does not do automatically in this case."
+  echo "run 'gcloud sql instances create' commands to create new replicas manually after"
+  echo "you have confirmed with speckle-oncall@ the on-demand backup is complete."
+  echo "Exiting"
+  exit 0
+fi
+
+echo "Finding restore operation ID..."
+
+RESTORE_OP_IDS=($(gcloud sql operations list --instance=primary --project=${CLOUD_PROJECT} | grep RESTORE_VOLUME | awk '{print $1}'))
+
+# Assume the fist RESTORE_VOLUME is the operation we want; they're listed in reverse chronological order.
+echo Waiting on restore operation ID: ${RESTORE_OP_IDS[0]}
+
+if [ ${DRY_RUN} == false ]; then
+  gcloud sql operations wait ${RESTORE_OP_IDS[0]} --project=${CLOUD_PROJECT}
+fi
+
+echo Restore is finished on primary. Now create the new set of read replicas with the new name prefix ${NEW_REPLICA_PREFIX}:
+
+TIER=($(gcloud sql instances describe primary --project=${CLOUD_PROJECT} | grep tier | awk '{print $2}'))
+
+for i in {00..09}; do
+  cmd="gcloud sql instances create ${NEW_REPLICA_PREFIX}-${i} --master-instance-name=primary --project=${CLOUD_PROJECT} --tier=${TIER} --region=us-central1"
+  echo ${cmd}
+  if [ ${DRY_RUN} == false ]; then
+    ${cmd}
+  fi
+done
+
+echo If the replica creation steps above did not succeed due to authentication
+echo errors, you may need to retry them manually.
+echo
+echo
+echo Backup restore is nearly complete.  Check the instances page on developer console to see when
+echo all of the replicas are "Runnable" status. Until then, you may encounter errors in issue search.
+echo In the mean time:
+echo - edit settings.py to change the db_replica_prefix variable to be "${NEW_REPLICA_PREFIX}-"
+echo   Then either "make deploy_prod" or "make deploy_staging" for search to pick up the new prefix.
+echo   Then set the newly deploy version for besearch and besearch2 on the dev console Versons page.
+echo Follow-up:
+echo - Submit the change.
+echo - Delete old versions of besearch because they run up the GAE bill.