diff --git a/cluster/gce/config-default.sh b/cluster/gce/config-default.sh index cb042641f1d..ab07b09b4c2 100755 --- a/cluster/gce/config-default.sh +++ b/cluster/gce/config-default.sh @@ -82,3 +82,6 @@ DNS_REPLICAS=1 # Admission Controllers to invoke prior to persisting objects in cluster ADMISSION_CONTROL=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota + +# Optional: if set to true kube-up will automatically check for existing resources and clean them up. +KUBE_UP_AUTOMATIC_CLEANUP=${KUBE_UP_AUTOMATIC_CLEANUP:-false} diff --git a/cluster/gce/config-test.sh b/cluster/gce/config-test.sh index 7cb977a7ae7..c944e59c6e1 100755 --- a/cluster/gce/config-test.sh +++ b/cluster/gce/config-test.sh @@ -79,3 +79,6 @@ DNS_DOMAIN="cluster.local" DNS_REPLICAS=1 ADMISSION_CONTROL=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota + +# Optional: if set to true kube-up will automatically check for existing resources and clean them up. +KUBE_UP_AUTOMATIC_CLEANUP=${KUBE_UP_AUTOMATIC_CLEANUP:-false} diff --git a/cluster/gce/util.sh b/cluster/gce/util.sh index d50c6a831b6..72f1ae835cb 100755 --- a/cluster/gce/util.sh +++ b/cluster/gce/util.sh @@ -584,6 +584,27 @@ function kube-up { find-release-tars upload-server-tars + local running_in_terminal=false + # May be false if tty is not allocated (for example with ssh -T). + if [ -t 1 ]; then + running_in_terminal=true + fi + + if [[ ${running_in_terminal} == "true" || ${KUBE_UP_AUTOMATIC_CLEANUP} == "true" ]]; then + if ! check-resources; then + local run_kube_down="n" + echo "${KUBE_RESOURCE_FOUND} found." >&2 + # Get user input only if running in terminal. + if [[ ${running_in_terminal} == "true" && ${KUBE_UP_AUTOMATIC_CLEANUP} == "false" ]]; then + read -p "Would you like to shut down the old cluster (call kube-down)? [y/N] " run_kube_down + fi + if [[ ${run_kube_down} == "y" || ${run_kube_down} == "Y" || ${KUBE_UP_AUTOMATIC_CLEANUP} == "true" ]]; then + echo "... calling kube-down" >&2 + kube-down + fi + fi + fi + if ! gcloud compute networks --project "${PROJECT}" describe "${NETWORK}" &>/dev/null; then echo "Creating new network: ${NETWORK}" # The network needs to be created synchronously or we have a race. The @@ -857,6 +878,80 @@ function kube-down { set -e } +# Checks if there are any present resources related kubernetes cluster. +# +# Assumed vars: +# MASTER_NAME +# NODE_INSTANCE_PREFIX +# ZONE +# Vars set: +# KUBE_RESOURCE_FOUND + +function check-resources { + detect-project + + echo "Looking for already existing resources" + KUBE_RESOURCE_FOUND="" + + if gcloud preview managed-instance-groups --project "${PROJECT}" --zone "${ZONE}" describe "${NODE_INSTANCE_PREFIX}-group" &>/dev/null; then + KUBE_RESOURCE_FOUND="Managed instance group ${NODE_INSTANCE_PREFIX}-group" + return 1 + fi + + if gcloud compute instance-templates describe "${NODE_INSTANCE_PREFIX}-template" &>/dev/null; then + KUBE_RESOURCE_FOUND="Instance template ${NODE_INSTANCE_PREFIX}-template" + return 1 + fi + + if gcloud compute instances describe "${MASTER_NAME}" --zone "${ZONE}" &>/dev/null; then + KUBE_RESOURCE_FOUND="Kubernetes master ${MASTER_NAME}" + return 1 + fi + + if gcloud compute disks describe "${MASTER_NAME}"-pd --zone "${ZONE}" &>/dev/null; then + KUBE_RESOURCE_FOUND="Persistent disk ${MASTER_NAME}-pd" + return 1 + fi + + # Find out what minions are running. + local -a minions + minions=( $(gcloud compute instances list \ + --project "${PROJECT}" --zone "${ZONE}" \ + --regexp "${NODE_INSTANCE_PREFIX}-.+" \ + | awk 'NR >= 2 { print $1 }') ) + if (( "${#minions[@]}" > 0 )); then + KUBE_RESOURCE_FOUND="${#minions[@]} matching matching ${NODE_INSTANCE_PREFIX}-.+" + return 1 + fi + + if gcloud compute firewall-rules describe "${MASTER_NAME}-https" &>/dev/null; then + KUBE_RESOURCE_FOUND="Firewal rules for ${MASTER_NAME}-https" + return 1 + fi + + if gcloud compute firewall-rules describe "${MINION_TAG}-all" &>/dev/null; then + KUBE_RESOURCE_FOUND="Firewal rules for ${MASTER_NAME}-all" + return 1 + fi + + local -a routes + routes=( $(gcloud compute routes list --project "${PROJECT}" \ + --regexp "${INSTANCE_PREFIX}-minion-.{4}" | awk 'NR >= 2 { print $1 }') ) + if (( "${#routes[@]}" > 0 )); then + KUBE_RESOURCE_FOUND="${#routes[@]} routes matching ${INSTANCE_PREFIX}-minion-.{4}" + return 1 + fi + + local REGION=${ZONE%-*} + if gcloud compute addresses describe "${MASTER_NAME}-ip" --region "${REGION}" &>/dev/null; then + KUBE_RESOURCE_FOUND="Master's reserved IP" + return 1 + fi + + # No resources found. + return 0 +} + # Prepare to push new binaries to kubernetes cluster # $1 - whether prepare push to node function prepare-push() {