| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare -r SOLANA_LOCK_FILE="/home/solana/.solana.lock" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __colo_here="$(dirname "${BASH_SOURCE[0]}")" | 
					
						
							| 
									
										
										
										
											2019-10-17 15:44:45 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | # shellcheck source=net/common.sh | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  | source "${__colo_here}"/../common.sh | 
					
						
							| 
									
										
										
										
											2019-10-17 15:44:45 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | # Load colo resource specs | 
					
						
							|  |  |  | export COLO_RES_N=0 | 
					
						
							|  |  |  | export COLO_RES_HOSTNAME=() | 
					
						
							|  |  |  | export COLO_RES_IP=() | 
					
						
							|  |  |  | export COLO_RES_IP_PRIV=() | 
					
						
							|  |  |  | export COLO_RES_CPU_CORES=() | 
					
						
							|  |  |  | export COLO_RES_RAM_GB=() | 
					
						
							|  |  |  | export COLO_RES_STORAGE_TYPE=() | 
					
						
							|  |  |  | export COLO_RES_STORAGE_CAP_GB=() | 
					
						
							|  |  |  | export COLO_RES_ADD_STORAGE_TYPE=() | 
					
						
							|  |  |  | export COLO_RES_ADD_STORAGE_CAP_GB=() | 
					
						
							|  |  |  | export COLO_RES_MACHINE=() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export COLO_RESOURCES_LOADED=false | 
					
						
							|  |  |  | colo_load_resources() { | 
					
						
							|  |  |  |   if ! ${COLO_RESOURCES_LOADED}; then | 
					
						
							|  |  |  |     while read -r LINE; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |       IFS='|' read -r H I PI C M ST SC AST ASC G Z <<<"${LINE}" | 
					
						
							|  |  |  |       COLO_RES_HOSTNAME+=( "${H}" ) | 
					
						
							|  |  |  |       COLO_RES_IP+=( "${I}" ) | 
					
						
							|  |  |  |       COLO_RES_IP_PRIV+=( "${PI}" ) | 
					
						
							|  |  |  |       COLO_RES_CPU_CORES+=( "${C}" ) | 
					
						
							|  |  |  |       COLO_RES_RAM_GB+=( "${M}" ) | 
					
						
							|  |  |  |       COLO_RES_STORAGE_TYPE+=( "${ST}" ) | 
					
						
							|  |  |  |       COLO_RES_STORAGE_CAP_GB+=( "${SC}" ) | 
					
						
							|  |  |  |       COLO_RES_ADD_STORAGE_TYPE+=( "$(tr ',' $'\v' <<<"${AST}")" ) | 
					
						
							|  |  |  |       COLO_RES_ADD_STORAGE_CAP_GB+=( "$(tr ',' $'\v' <<<"${ASC}")" ) | 
					
						
							|  |  |  |       COLO_RES_MACHINE+=( "${G}" ) | 
					
						
							|  |  |  |       COLO_RES_ZONE+=( "${Z}" ) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       COLO_RES_N=$((COLO_RES_N+1)) | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     done < <(sort -nt'|' -k10,10 "${__colo_here}"/colo_nodes) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     COLO_RESOURCES_LOADED=true | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare COLO_RES_AVAILABILITY_CACHED=false | 
					
						
							|  |  |  | declare -ax COLO_RES_AVAILABILITY | 
					
						
							|  |  |  | colo_load_availability() { | 
					
						
							|  |  |  |   declare USE_CACHE=${1:-${COLO_RES_AVAILABILITY_CACHED}} | 
					
						
							|  |  |  |   declare LINE PRIV_IP STATUS LOCK_USER I IP HOST_NAME ZONE INSTNAME | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   if ! ${USE_CACHE}; then | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     COLO_RES_AVAILABILITY=() | 
					
						
							|  |  |  |     COLO_RES_REQUISITIONED=() | 
					
						
							|  |  |  |     while read -r LINE; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |       IFS=$'\v' read -r IP STATUS LOCK_USER INSTNAME <<< "${LINE}" | 
					
						
							|  |  |  |       I=$(colo_res_index_from_ip "${IP}") | 
					
						
							|  |  |  |       PRIV_IP="${COLO_RES_IP_PRIV[${I}]}" | 
					
						
							|  |  |  |       HOST_NAME="${COLO_RES_HOSTNAME[${I}]}" | 
					
						
							|  |  |  |       ZONE="${COLO_RES_ZONE[${I}]}" | 
					
						
							|  |  |  |       COLO_RES_AVAILABILITY+=( "$(echo -e "${HOST_NAME}\v${IP}\v${PRIV_IP}\v${STATUS}\v${ZONE}\v${LOCK_USER}\v${INSTNAME}")" ) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     done < <(colo_node_status_all | sort -t $'\v' -k1) | 
					
						
							|  |  |  |     COLO_RES_AVAILABILITY_CACHED=true | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_res_index_from_ip() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare IP="${1}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   for i in "${!COLO_RES_IP_PRIV[@]}"; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     if [[ "${IP}" = "${COLO_RES_IP[${i}]}" || "${IP}" = "${COLO_RES_IP_PRIV[${i}]}" ]]; then | 
					
						
							|  |  |  |       echo "${i}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       return 0 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   done | 
					
						
							|  |  |  |   return 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_instance_run() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare IP=${1} | 
					
						
							|  |  |  |   declare CMD="${2}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare OUT | 
					
						
							|  |  |  |   set +e | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   OUT=$(ssh -l solana -o "StrictHostKeyChecking=no" -o "ConnectTimeout=3" -n "${IP}" "${CMD}" 2>&1) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare RC=$? | 
					
						
							|  |  |  |   set -e | 
					
						
							|  |  |  |   while read -r LINE; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     echo -e "${IP}\v${RC}\v${LINE}" | 
					
						
							|  |  |  |     if [[ "${RC}" -ne 0 ]]; then | 
					
						
							| 
									
										
										
										
											2019-10-21 14:49:12 -06:00
										 |  |  |       echo "IP(${IP}) Err(${RC}) LINE(${LINE})" 1>&2 | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   done < <(tr -d $'\r' <<<"${OUT}") | 
					
						
							|  |  |  |   return ${RC} | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_instance_run_foreach() { | 
					
						
							|  |  |  |   declare CMD | 
					
						
							|  |  |  |   if test 1 -eq $#; then | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     CMD="${1}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     declare IPS=() | 
					
						
							|  |  |  |     for I in $(seq 0 $((COLO_RES_N-1))); do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |       IPS+=( "${COLO_RES_IP[${I}]}" ) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     done | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     set "${IPS[@]}" "${CMD}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   fi | 
					
						
							|  |  |  |   CMD="${*: -1}" | 
					
						
							|  |  |  |   for I in $(seq 0 $(($#-2))); do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     declare IP="${1}" | 
					
						
							|  |  |  |     colo_instance_run "${IP}" "${CMD}" & | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     shift | 
					
						
							|  |  |  |   done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   wait | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_whoami() { | 
					
						
							| 
									
										
										
										
											2019-10-21 14:49:12 -06:00
										 |  |  |   declare ME LINE SOL_USER EOL | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   while read -r LINE; do | 
					
						
							|  |  |  |     declare IP RC | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     IFS=$'\v' read -r IP RC SOL_USER EOL <<< "${LINE}" | 
					
						
							|  |  |  |     if [ "${RC}" -eq 0 ]; then | 
					
						
							|  |  |  |       [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${LINE}\"" 1>&2 | 
					
						
							|  |  |  |       if [ -z "${ME}" ] || [ "${ME}" = "${SOL_USER}" ]; then | 
					
						
							|  |  |  |         ME="${SOL_USER}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |         echo "Found conflicting username \"${SOL_USER}\" on ${IP}, expected \"${ME}\"" 1>&2 | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       fi | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   done < <(colo_instance_run_foreach "[ -n \"\${SOLANA_USER}\" ] && echo -e \"\${SOLANA_USER}\\vEOL\"") | 
					
						
							|  |  |  |   echo "${ME}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | COLO_SOLANA_USER="" | 
					
						
							|  |  |  | colo_get_solana_user() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   if [ -z "${COLO_SOLANA_USER}" ]; then | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     COLO_SOLANA_USER=$(colo_whoami) | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   echo "${COLO_SOLANA_USER}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __colo_node_status_script() { | 
					
						
							|  |  |  |   cat <<EOF | 
					
						
							|  |  |  |   exec 3>&2 | 
					
						
							|  |  |  |   exec 2>/dev/null  # Suppress stderr as the next call to exec fails most of | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |                     # the time due to ${SOLANA_LOCK_FILE} not existing and is running from a | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |                     # subshell where normal redirection doesn't work | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   exec 9<"${SOLANA_LOCK_FILE}" && flock -s 9 && . "${SOLANA_LOCK_FILE}" && exec 9>&- | 
					
						
							|  |  |  |   echo -e "\${SOLANA_LOCK_USER}\\v\${SOLANA_LOCK_INSTANCENAME}\\vEOL" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   exec 2>&3 # Restore stderr | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __colo_node_status_result_normalize() { | 
					
						
							| 
									
										
										
										
											2019-10-21 14:49:12 -06:00
										 |  |  |   declare IP RC US BY INSTNAME EOL | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare ST="DOWN" | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   IFS=$'\v' read -r IP RC US INSTNAME EOL <<< "${1}" | 
					
						
							|  |  |  |   if [ "${RC}" -eq 0 ]; then | 
					
						
							|  |  |  |     [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${1}\"" 1>&2 | 
					
						
							|  |  |  |     if [ -n "${US}" ]; then | 
					
						
							|  |  |  |       BY="${US}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       ST="HELD" | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |       if [[ -z "${INSTNAME}" ]]; then | 
					
						
							| 
									
										
										
										
											2019-09-26 12:22:07 -06:00
										 |  |  |         return | 
					
						
							|  |  |  |       fi | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     else | 
					
						
							|  |  |  |       ST="FREE" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   echo -e $"${IP}\v${ST}\v${BY}\v${INSTNAME}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_node_status() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare IP="${1}" | 
					
						
							|  |  |  |   __colo_node_status_result_normalize "$(colo_instance_run "${IP}" "$(__colo_node_status_script)")" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_node_status_all() { | 
					
						
							|  |  |  |   declare LINE | 
					
						
							|  |  |  |   while read -r LINE; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     __colo_node_status_result_normalize "${LINE}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   done < <(colo_instance_run_foreach "$(__colo_node_status_script)") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-08 16:41:36 -07:00
										 |  |  | # Note: As part of enabling COLO_PARALLELIZE, this list will need to be maintained in a | 
					
						
							|  |  |  | # lockfile to work around `cloud_CreateInstance` being called in the background | 
					
						
							|  |  |  | # for validators | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | export COLO_RES_REQUISITIONED=() | 
					
						
							|  |  |  | colo_node_requisition() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare IP=${1} | 
					
						
							| 
									
										
										
										
											2019-10-07 23:05:36 -06:00
										 |  |  |   # shellcheck disable=SC2034 | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare INSTANCE_NAME=${2} | 
					
						
							| 
									
										
										
										
											2019-10-07 23:05:36 -06:00
										 |  |  |   # shellcheck disable=SC2034 | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare SSH_PRIVATE_KEY="${3}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   declare INDEX | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   INDEX=$(colo_res_index_from_ip "${IP}") | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare RC=false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   colo_instance_run "${IP}" "$(cat <<EOF | 
					
						
							|  |  |  | SOLANA_LOCK_FILE="${SOLANA_LOCK_FILE}" | 
					
						
							|  |  |  | INSTANCE_NAME="${INSTANCE_NAME}" | 
					
						
							|  |  |  | SSH_AUTHORIZED_KEYS='$("${__colo_here}"/add-datacenter-solana-user-authorized_keys.sh 2> /dev/null)' | 
					
						
							|  |  |  | SSH_PRIVATE_KEY_TEXT="$(<"${SSH_PRIVATE_KEY}")" | 
					
						
							|  |  |  | SSH_PUBLIC_KEY_TEXT="$(<"${SSH_PRIVATE_KEY}.pub")" | 
					
						
							|  |  |  | NETWORK_INFO="$(printNetworkInfo 2>/dev/null)" | 
					
						
							|  |  |  | CREATION_INFO="$(creationInfo 2>/dev/null)" | 
					
						
							|  |  |  | $(<"${__colo_here}"/colo-node-onacquire.sh) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | EOF | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   )"
 | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   # shellcheck disable=SC2181 | 
					
						
							|  |  |  |   if [[ 0 -eq $? ]]; then | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     COLO_RES_REQUISITIONED+=("${INDEX}") | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     RC=true | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   ${RC} | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_node_is_requisitioned() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare INDEX="${1}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare REQ | 
					
						
							|  |  |  |   declare RC=false | 
					
						
							|  |  |  |   for REQ in "${COLO_RES_REQUISITIONED[@]}"; do | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     if [[ ${REQ} -eq ${INDEX} ]]; then | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |       RC=true | 
					
						
							|  |  |  |       break | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   done | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   ${RC} | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_machine_types_compatible() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare MAYBE_MACH="${1}" | 
					
						
							|  |  |  |   declare WANT_MACH="${2}" | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |   declare COMPATIBLE=false | 
					
						
							| 
									
										
										
										
											2019-10-21 16:43:11 -07:00
										 |  |  |   # Colo machine types are just GPU count ATM... | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   if [[ "${MAYBE_MACH}" -ge "${WANT_MACH}" ]]; then | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  |     COMPATIBLE=true | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   ${COMPATIBLE} | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | colo_node_free() { | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   declare IP=${1} | 
					
						
							|  |  |  |   colo_instance_run "${IP}" "$(cat <<EOF | 
					
						
							|  |  |  | SOLANA_LOCK_FILE="${SOLANA_LOCK_FILE}" | 
					
						
							|  |  |  | SECONDARY_DISK_MOUNT_POINT="${SECONDARY_DISK_MOUNT_POINT}" | 
					
						
							|  |  |  | SSH_AUTHORIZED_KEYS='$("${__colo_here}"/add-datacenter-solana-user-authorized_keys.sh 2> /dev/null)' | 
					
						
							|  |  |  | $(<"${__colo_here}"/colo-node-onfree.sh) | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | EOF | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |   )"
 | 
					
						
							| 
									
										
										
										
											2019-09-19 15:08:23 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |