GKE deployment: Kill cluster/gke
kubernetes/test-infra#3983 migrated the remaining GKE jobs using the bash deployment (cluster/gke). Fixes kubernetes/test-infra#3307
This commit is contained in:
		| @@ -1,52 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Copyright 2014 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This script should be sourced as a part of config-test or config-default. | ||||
| # Specifically, the following environment variables are assumed: | ||||
| # - CLUSTER_NAME  (the name of the cluster) | ||||
|  | ||||
| if [ ! -z "${REGION:-}" ] && [ ! -z "${ZONE:-}" ]; then | ||||
|   echo "Only one of REGION and ZONE can be set." >&2 | ||||
|   exit 1 | ||||
| fi | ||||
| if [ -z "${REGION:-}" ]; then | ||||
|   ZONE="${ZONE:-us-central1-f}" | ||||
| fi | ||||
| NUM_NODES="${NUM_NODES:-3}" | ||||
| ADDITIONAL_ZONES="${ADDITIONAL_ZONES:-}" | ||||
| CLUSTER_API_VERSION="${CLUSTER_API_VERSION:-}" | ||||
| NETWORK="${NETWORK:-default}" | ||||
| FIREWALL_SSH="${FIREWALL_SSH:-${NETWORK}-allow-ssh}" | ||||
| GCLOUD="${GCLOUD:-gcloud}" | ||||
| CMD_GROUP="${CMD_GROUP:-}" | ||||
| GCLOUD_CONFIG_DIR="${GCLOUD_CONFIG_DIR:-${HOME}/.config/gcloud/kubernetes}" | ||||
| MACHINE_TYPE="${MACHINE_TYPE:-n1-standard-2}" | ||||
| IMAGE_TYPE="${IMAGE_TYPE:-}" | ||||
| if [[ "${FEDERATION:-}" == true ]]; then | ||||
|     NODE_SCOPES="${NODE_SCOPES:-compute-rw,storage-ro,https://www.googleapis.com/auth/ndev.clouddns.readwrite}" | ||||
| else | ||||
|     NODE_SCOPES="${NODE_SCOPES:-compute-rw,storage-ro}" | ||||
| fi | ||||
|  | ||||
| # WARNING: any new vars added here must correspond to options that can be | ||||
| # passed to `gcloud {CMD_GROUP} container clusters create`, or they will | ||||
| # have no effect. If you change/add a var used to toggle a value in | ||||
| # cluster/gce/configure-vm.sh, please ping someone on GKE. | ||||
|  | ||||
| # This is a hack, but I keep setting this when I run commands manually, and | ||||
| # then things grossly fail during normal runs because cluster/kubecfg.sh and | ||||
| # cluster/kubectl.sh both use this if it's set. | ||||
| unset KUBERNETES_MASTER | ||||
| @@ -1,56 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Copyright 2014 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # The following are default-specific settings. | ||||
| CLUSTER_NAME="${CLUSTER_NAME:-${USER}-gke}" | ||||
| NETWORK=${KUBE_GKE_NETWORK:-default} | ||||
|  | ||||
| # For ease of maintenance, extract any pieces that do not vary between default | ||||
| # and test in a common config. | ||||
| source $(dirname "${BASH_SOURCE}")/config-common.sh | ||||
|  | ||||
| # Optional: Install node logging | ||||
| ENABLE_NODE_LOGGING=false | ||||
| LOGGING_DESTINATION=gcp # options: elasticsearch, gcp | ||||
|  | ||||
| # Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up. | ||||
| ENABLE_CLUSTER_LOGGING=false | ||||
| ELASTICSEARCH_LOGGING_REPLICAS=1 | ||||
|  | ||||
| # Optional: Deploy a L7 loadbalancer controller to fulfill Ingress requests: | ||||
| #   glbc           - CE L7 Load Balancer Controller | ||||
| ENABLE_L7_LOADBALANCING="${KUBE_ENABLE_L7_LOADBALANCING:-glbc}" | ||||
|  | ||||
| # Optional: Cluster monitoring to setup as part of the cluster bring up: | ||||
| #   none     - No cluster monitoring setup | ||||
| #   influxdb - Heapster, InfluxDB, and Grafana | ||||
| #   google   - Heapster, Google Cloud Monitoring, and Google Cloud Logging | ||||
| #   standalone     - Heapster only. Metrics available via Heapster REST API. | ||||
| ENABLE_CLUSTER_MONITORING="${KUBE_ENABLE_CLUSTER_MONITORING:-standalone}" | ||||
|  | ||||
| KUBE_DELETE_NETWORK=${KUBE_DELETE_NETWORK:-false} | ||||
|  | ||||
| # Indicates if the values (i.e. KUBE_USER and KUBE_PASSWORD for basic | ||||
| # authentication) in metadata should be treated as canonical, and therefore disk | ||||
| # copies ought to be recreated/clobbered. | ||||
| METADATA_CLOBBERS_CONFIG=true | ||||
|  | ||||
| # Fluentd requirements | ||||
| FLUENTD_GCP_MEMORY_LIMIT="${FLUENTD_GCP_MEMORY_LIMIT:-300Mi}" | ||||
| FLUENTD_GCP_CPU_REQUEST="${FLUENTD_GCP_CPU_REQUEST:-100m}" | ||||
| FLUENTD_GCP_MEMORY_REQUEST="${FLUENTD_GCP_MEMORY_REQUEST:-200Mi}" | ||||
| # Adding to PROVIDER_VARS, since this is GCP-specific. | ||||
| PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST" | ||||
| @@ -1,28 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Copyright 2014 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # The following are test-specific settings. | ||||
| CLUSTER_NAME="${CLUSTER_NAME:-${USER}-gke-e2e}" | ||||
| NETWORK=${KUBE_GKE_NETWORK:-e2e} | ||||
| NODE_TAG="k8s-${CLUSTER_NAME}-node" | ||||
| IMAGE_TYPE="${KUBE_GKE_IMAGE_TYPE:-container_vm}" | ||||
| ENABLE_KUBERNETES_ALPHA="${KUBE_GKE_ENABLE_KUBERNETES_ALPHA:-}" | ||||
|  | ||||
| KUBE_DELETE_NETWORK=${KUBE_DELETE_NETWORK:-true} | ||||
|  | ||||
| # For ease of maintenance, extract any pieces that do not vary between default | ||||
| # and test in a common config. | ||||
| source $(dirname "${BASH_SOURCE}")/config-common.sh | ||||
| @@ -1,65 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Copyright 2016 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| echo "This is NOT a production-ready tool.\n\ | ||||
| IT'S A HACKY, BEST-EFFORT WAY TO \"STOP\" CREATION OF THE GKE CLUSTER." | ||||
| read -n 1 -p "Are you sure you want to proceed (y/N)?: " decision | ||||
| echo "" | ||||
| if [[ "${decision}" != "y" ]]; then | ||||
| 	echo "Aborting..." | ||||
| 	exit 0 | ||||
| fi | ||||
|  | ||||
| set -o errexit | ||||
| set -o nounset | ||||
| set -o pipefail | ||||
|  | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. | ||||
|  | ||||
| if [ -f "${KUBE_ROOT}/cluster/env.sh" ]; then | ||||
|     source "${KUBE_ROOT}/cluster/env.sh" | ||||
| fi | ||||
|  | ||||
| source "${KUBE_ROOT}/cluster/gke/util.sh" | ||||
| STAGING_ENDPOINT="CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER=https://staging-container.sandbox.googleapis.com/" | ||||
|  | ||||
| detect-project | ||||
| cluster=$(gcloud container operations list "--project=${PROJECT}" | grep "CREATE_CLUSTER" | grep "RUNNING" || true) | ||||
| if [ -z "${cluster}" ]; then | ||||
| 	echo "Couldn't find any cluster being created in production environment. Trying staging..." | ||||
| 	cluster=$(env ${STAGING_ENDPOINT} gcloud container operations list "--project=${PROJECT}" | grep "CREATE_CLUSTER" | grep "RUNNING" || true) | ||||
| fi | ||||
|  | ||||
| if [ -z "${cluster}" ]; then | ||||
| 	echo "No cluster creation in progress found. Aborting." | ||||
| 	exit 0 | ||||
| fi | ||||
|  | ||||
| zone=$(echo "${cluster}" | tr -s "[:blank:]" | cut -f3 -d" ") | ||||
| cluster_name=$(echo "${cluster}" | tr -s "[:blank:]" | cut -f4 -d" ") | ||||
| gcloud="gcloud" | ||||
| if [ "${zone}" == "us-east1-a" ]; then | ||||
| 	gcloud="env ${STAGING_ENDPOINT} gcloud" | ||||
| fi | ||||
|  | ||||
| migs=$(${gcloud} compute instance-groups managed list --project=${PROJECT} --zones=${zone} | grep "gke-${cluster_name}" | cut -f1 -d" ") | ||||
| echo "Managed instance groups for cluster ${cluster_name}: ${migs}" | ||||
| for mig in ${migs}; do | ||||
| 	echo "Resizing ${mig}..." | ||||
| 	${gcloud} compute instance-groups managed resize --project="${PROJECT}" --zone="${zone}" "${mig}" --size=1 | ||||
| done | ||||
|  | ||||
| echo "All managed instance groups resized to 1. Cluster creation operation should end soon, and you will be be able to delete the cluster." | ||||
| @@ -1,458 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Copyright 2014 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # A library of helper functions and constant for the local config. | ||||
|  | ||||
| # Uses the config file specified in $KUBE_CONFIG_FILE, or defaults to config-default.sh | ||||
|  | ||||
| KUBE_PROMPT_FOR_UPDATE=${KUBE_PROMPT_FOR_UPDATE:-"n"} | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. | ||||
| source "${KUBE_ROOT}/cluster/gke/${KUBE_CONFIG_FILE:-config-default.sh}" | ||||
| source "${KUBE_ROOT}/cluster/common.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/util.sh" | ||||
|  | ||||
| function with-retry() { | ||||
|   local retry_limit=$1 | ||||
|   local cmd=("${@:2}") | ||||
|  | ||||
|   local retry_count=0 | ||||
|   local rc=0 | ||||
|  | ||||
|   until [[ ${retry_count} -ge ${retry_limit} ]]; do | ||||
|     ((retry_count+=1)) | ||||
|     "${cmd[@]}" && rc=0 || rc=$? | ||||
|     if [[ ${rc} == 0 ]]; then | ||||
|       return 0 | ||||
|     fi | ||||
|     sleep 3 | ||||
|   done | ||||
|  | ||||
|   echo "Failed to execute '${cmd[@]}' for $retry_limit times." >&2 | ||||
|  | ||||
|   return ${rc} | ||||
| } | ||||
|  | ||||
| # Perform preparations required to run e2e tests | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| function prepare-e2e() { | ||||
|   echo "... in gke:prepare-e2e()" >&2 | ||||
|  | ||||
|   # Ensure GCLOUD is set to some gcloud binary. | ||||
|   if [[ -z "${GCLOUD:-}" ]]; then | ||||
|     echo "GCLOUD environment variable is not set. It should be your gcloud binary. " >&2 | ||||
|     echo "A sane default is probably \$ export GCLOUD=gcloud" >&2 | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
|  | ||||
| # Use the gcloud defaults to find the project.  If it is already set in the | ||||
| # environment then go with that. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| # Vars set: | ||||
| #   PROJECT | ||||
| #   SCOPE_ARGS | ||||
| function detect-project() { | ||||
|   echo "... in gke:detect-project()" >&2 | ||||
|   if [[ -z "${PROJECT:-}" ]]; then | ||||
|     export PROJECT=$("${GCLOUD}" config list project --format 'value(core.project)') | ||||
|     echo "... Using project: ${PROJECT}" >&2 | ||||
|   fi | ||||
|   if [[ -z "${PROJECT:-}" ]]; then | ||||
|     echo "Could not detect Google Cloud Platform project. Set the default project using " >&2 | ||||
|     echo "'gcloud config set project <PROJECT>'" >&2 | ||||
|     exit 1 | ||||
|   fi | ||||
|  | ||||
|   SCOPE_ARGS=( | ||||
|     "--project=${PROJECT}" | ||||
|   ) | ||||
|  | ||||
|   if [[ ! -z "${ZONE:-}" ]]; then | ||||
|     SCOPE_ARGS+=("--zone=${ZONE}") | ||||
|   fi | ||||
|  | ||||
|   if [[ ! -z "${REGION:-}" ]]; then | ||||
|     SCOPE_ARGS+=("--region=${REGION}") | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Execute prior to running tests to build a release if required for env. | ||||
| # | ||||
| # Assumed Vars: | ||||
| #   KUBE_ROOT | ||||
| function test-build-release() { | ||||
|   echo "... in gke:test-build-release()" >&2 | ||||
|   "${KUBE_ROOT}/build/release.sh" | ||||
| } | ||||
|  | ||||
| # Verify needed binaries exist. | ||||
| function verify-prereqs() { | ||||
|   echo "... in gke:verify-prereqs()" >&2 | ||||
|   if ! which gcloud >/dev/null; then | ||||
|     local resp | ||||
|     if [[ "${KUBE_PROMPT_FOR_UPDATE}" == "y" ]]; then | ||||
|       echo "Can't find gcloud in PATH.  Do you wish to install the Google Cloud SDK? [Y/n]" | ||||
|       read resp | ||||
|     fi | ||||
|     if [[ "${resp}" != "n" && "${resp}" != "N" ]]; then | ||||
|       curl https://sdk.cloud.google.com | bash | ||||
|     fi | ||||
|     if ! which gcloud >/dev/null; then | ||||
|       echo "Can't find gcloud in PATH, please fix and retry. The Google Cloud " | ||||
|       echo "SDK can be downloaded from https://cloud.google.com/sdk/." | ||||
|       exit 1 | ||||
|     fi | ||||
|   fi | ||||
|   update-or-verify-gcloud | ||||
| } | ||||
|  | ||||
| # Validate a kubernetes cluster | ||||
| function validate-cluster { | ||||
|   # Simply override the NUM_NODES variable if we've spread nodes across multiple | ||||
|   # zones before calling into the generic validate-cluster logic. | ||||
|   local EXPECTED_NUM_NODES="${NUM_NODES}" | ||||
|   if [ ! -z "${REGION:-}" ]; then | ||||
|     (( EXPECTED_NUM_NODES *= 3 )) | ||||
|   fi | ||||
|   for zone in $(echo "${ADDITIONAL_ZONES}" | sed "s/,/ /g") | ||||
|   do | ||||
|     (( EXPECTED_NUM_NODES += NUM_NODES )) | ||||
|   done | ||||
|   NUM_NODES=${EXPECTED_NUM_NODES} bash -c "${KUBE_ROOT}/cluster/validate-cluster.sh" | ||||
| } | ||||
|  | ||||
| # Instantiate a kubernetes cluster | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| #   CLUSTER_NAME | ||||
| #   ZONE (optional) | ||||
| #   REGION (optional) | ||||
| #   CLUSTER_API_VERSION (optional) | ||||
| #   NUM_NODES | ||||
| #   ADDITIONAL_ZONES (optional) | ||||
| #   NODE_SCOPES | ||||
| #   MACHINE_TYPE | ||||
| #   HEAPSTER_MACHINE_TYPE (optional) | ||||
| #   CLUSTER_IP_RANGE (optional) | ||||
| #   GKE_CREATE_FLAGS (optional, space delineated) | ||||
| #   ENABLE_KUBERNETES_ALPHA (optional) | ||||
| function kube-up() { | ||||
|   echo "... in gke:kube-up()" >&2 | ||||
|   detect-project >&2 | ||||
|  | ||||
|   # Make the specified network if we need to. | ||||
|   if ! "${GCLOUD}" compute networks --project "${PROJECT}" describe "${NETWORK}" &>/dev/null; then | ||||
|     echo "Creating new network: ${NETWORK}" >&2 | ||||
|     with-retry 3 "${GCLOUD}" compute networks create "${NETWORK}" --project="${PROJECT}" --mode=auto | ||||
|   else | ||||
|     echo "... Using network: ${NETWORK}" >&2 | ||||
|   fi | ||||
|  | ||||
|   # Allow SSH on all nodes in the network. This doesn't actually check whether | ||||
|   # such a rule exists, only whether we've created this exact rule. | ||||
|   if ! "${GCLOUD}" compute firewall-rules --project "${PROJECT}" describe "${FIREWALL_SSH}" &>/dev/null; then | ||||
|     echo "Creating new firewall for SSH: ${FIREWALL_SSH}" >&2 | ||||
|     with-retry 3 "${GCLOUD}" compute firewall-rules create "${FIREWALL_SSH}" \ | ||||
|       --allow="tcp:22" \ | ||||
|       --network="${NETWORK}" \ | ||||
|       --project="${PROJECT}" \ | ||||
|       --source-ranges="0.0.0.0/0" | ||||
|   else | ||||
|     echo "... Using firewall-rule: ${FIREWALL_SSH}" >&2 | ||||
|   fi | ||||
|  | ||||
|   local shared_args=( | ||||
|     ${SCOPE_ARGS[@]} | ||||
|     "--scopes=${NODE_SCOPES}" | ||||
|   ) | ||||
|  | ||||
|   if [[ ! -z "${IMAGE_TYPE:-}" ]]; then | ||||
|     shared_args+=("--image-type=${IMAGE_TYPE}") | ||||
|   fi | ||||
|  | ||||
|   if [[ -z "${HEAPSTER_MACHINE_TYPE:-}" ]]; then | ||||
|     local -r nodes="${NUM_NODES}" | ||||
|   else | ||||
|     local -r nodes=$(( NUM_NODES - 1 )) | ||||
|   fi | ||||
|  | ||||
|   local create_args=( | ||||
|     ${shared_args[@]} | ||||
|     "--num-nodes=${nodes}" | ||||
|     "--network=${NETWORK}" | ||||
|     "--cluster-version=${CLUSTER_API_VERSION}" | ||||
|     "--machine-type=${MACHINE_TYPE}" | ||||
|     "--quiet" | ||||
|   ) | ||||
|  | ||||
|   if [[ ! -z "${ENABLE_KUBERNETES_ALPHA:-}" ]]; then | ||||
|     create_args+=("--enable-kubernetes-alpha") | ||||
|   fi | ||||
|  | ||||
|   if [[ ! -z "${ADDITIONAL_ZONES:-}" ]]; then | ||||
|     create_args+=("--additional-zones=${ADDITIONAL_ZONES}") | ||||
|   fi | ||||
|  | ||||
|   if [[ ! -z "${CLUSTER_IP_RANGE:-}" ]]; then | ||||
|     create_args+=("--cluster-ipv4-cidr=${CLUSTER_IP_RANGE}") | ||||
|   fi | ||||
|  | ||||
|   if [[ ! -z "${ENABLE_LEGACY_ABAC:-}" ]]; then | ||||
|     if [[ "${ENABLE_LEGACY_ABAC:-}" == "true" ]]; then | ||||
|       create_args+=("--enable-legacy-authorization") | ||||
|     else | ||||
|       create_args+=("--no-enable-legacy-authorization") | ||||
|     fi | ||||
|   fi | ||||
|  | ||||
|   create_args+=( ${GKE_CREATE_FLAGS:-} ) | ||||
|  | ||||
|   # Bring up the cluster. | ||||
|   "${GCLOUD}" ${CMD_GROUP:-} container clusters create "${CLUSTER_NAME}" "${create_args[@]}" | ||||
|  | ||||
|   create-kubeconfig-for-federation | ||||
|  | ||||
|   if [[ ! -z "${HEAPSTER_MACHINE_TYPE:-}" ]]; then | ||||
|     "${GCLOUD}" ${CMD_GROUP:-} container node-pools create "heapster-pool" --cluster "${CLUSTER_NAME}" --num-nodes=1 --machine-type="${HEAPSTER_MACHINE_TYPE}" "${shared_args[@]}" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Execute prior to running tests to initialize required structure. This is | ||||
| # called from hack/e2e-go only when running -up (it is run after kube-up, so | ||||
| # the cluster already exists at this point). | ||||
| # | ||||
| # Assumed vars: | ||||
| #   CLUSTER_NAME | ||||
| #   GCLOUD | ||||
| #   ZONE | ||||
| # Vars set: | ||||
| #   NODE_TAG | ||||
| function test-setup() { | ||||
|   echo "... in gke:test-setup()" >&2 | ||||
|   # Detect the project into $PROJECT if it isn't set | ||||
|   detect-project >&2 | ||||
|  | ||||
|   "${KUBE_ROOT}/cluster/kube-up.sh" | ||||
|  | ||||
|   detect-nodes >&2 | ||||
|  | ||||
|   # At this point, CLUSTER_NAME should have been used, so its value is final. | ||||
|   NODE_TAG=$($GCLOUD compute instances list ${NODE_NAMES[0]} --project="${PROJECT}" --format='value(tags.items)' | grep -o "gke-${CLUSTER_NAME}-.\{8\}-node") | ||||
|   OLD_NODE_TAG="k8s-${CLUSTER_NAME}-node" | ||||
|  | ||||
|   # Open up port 80 & 8080 so common containers on minions can be reached. | ||||
|   with-retry 3 "${GCLOUD}" compute firewall-rules create \ | ||||
|     "${CLUSTER_NAME}-http-alt" \ | ||||
|     --allow tcp:80,tcp:8080 \ | ||||
|     --project "${PROJECT}" \ | ||||
|     --target-tags "${NODE_TAG},${OLD_NODE_TAG}" \ | ||||
|     --network="${NETWORK}" & | ||||
|  | ||||
|   with-retry 3 "${GCLOUD}" compute firewall-rules create \ | ||||
|     "${CLUSTER_NAME}-nodeports" \ | ||||
|     --allow tcp:30000-32767,udp:30000-32767 \ | ||||
|     --project "${PROJECT}" \ | ||||
|     --target-tags "${NODE_TAG},${OLD_NODE_TAG}" \ | ||||
|     --network="${NETWORK}" & | ||||
|  | ||||
|   # Wait for firewall rules. | ||||
|   kube::util::wait-for-jobs || { | ||||
|     echo "... gke:test-setup(): Could not create firewall" >&2 | ||||
|     return 1 | ||||
|   } | ||||
| } | ||||
|  | ||||
| # Detect the IP for the master. Note that on GKE, we don't know the name of the | ||||
| # master, so KUBE_MASTER is not set. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   ZONE | ||||
| #   CLUSTER_NAME | ||||
| # Vars set: | ||||
| #   KUBE_MASTER_IP | ||||
| function detect-master() { | ||||
|   echo "... in gke:detect-master()" >&2 | ||||
|   detect-project >&2 | ||||
|   KUBE_MASTER_IP=$("${GCLOUD}" ${CMD_GROUP:-} container clusters describe \ | ||||
|      ${SCOPE_ARGS[@]} --format='value(endpoint)' \ | ||||
|     "${CLUSTER_NAME}") | ||||
| } | ||||
|  | ||||
| # Assumed vars: | ||||
| #   none | ||||
| # Vars set: | ||||
| #   NODE_NAMES | ||||
| function detect-nodes() { | ||||
|   echo "... in gke:detect-nodes()" >&2 | ||||
|   detect-node-names | ||||
| } | ||||
|  | ||||
| # Detect minions created in the minion group | ||||
| # | ||||
| # Note that for zonal clusters this will only select nodes in the same zone as the | ||||
| # cluster, meaning that it won't include all nodes in a multi-zone cluster. | ||||
| # For regional clusters, this will select nodes only from arbitrarily chosen node instance group. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| #   PROJECT | ||||
| #   ZONE (optional) | ||||
| #   REGION (optional) | ||||
| #   CLUSTER_NAME | ||||
| # Vars set: | ||||
| #   NODE_NAMES | ||||
| function detect-node-names { | ||||
|   echo "... in gke:detect-node-names()" >&2 | ||||
|   detect-project | ||||
|   detect-node-instance-groups | ||||
|  | ||||
|   NODE_NAMES=() | ||||
|   for group in "${NODE_INSTANCE_GROUPS[@]:-}"; do | ||||
|     # We can't simply use --zone "${ZONE}" as ZONE may not be set (e.g. when REGION is set). | ||||
|     local igm_zone=$(gcloud compute instance-groups managed list "${group}" --format='value(zone)') | ||||
|     NODE_NAMES+=($(gcloud compute instance-groups managed list-instances \ | ||||
|       "${group}" --zone "${igm_zone}" \ | ||||
|       --project "${PROJECT}" --format='value(instance)')) | ||||
|   done | ||||
|   echo "NODE_NAMES=${NODE_NAMES[*]:-}" | ||||
| } | ||||
|  | ||||
| # Detect instance group name generated by gke. | ||||
| # | ||||
| # Note that for zonal clusters the NODE_INSTANCE_GROUPS var will only have instance groups in the | ||||
| # same zone as the cluster, meaning that it won't include all groups in a | ||||
| # multi-zone cluster. | ||||
| # For regional clusters, NODE_INSTANCE_GROUPS is set to arbitrarily chosen node instance group. | ||||
| # The ALL_INSTANCE_GROUP_URLS will contain all the instance group URLs, | ||||
| # which include multi-zone groups. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| #   SCOPE_ARGS | ||||
| #   ZONE (optional) | ||||
| #   REGION (optional) | ||||
| #   CLUSTER_NAME | ||||
| # Vars set: | ||||
| #   NODE_INSTANCE_GROUPS | ||||
| #   ALL_INSTANCE_GROUP_URLS | ||||
| function detect-node-instance-groups { | ||||
|   echo "... in gke:detect-node-instance-groups()" >&2 | ||||
|   local urls=$("${GCLOUD}" ${CMD_GROUP:-} container clusters describe \ | ||||
|     ${SCOPE_ARGS[@]} --format='value(instanceGroupUrls)' "${CLUSTER_NAME}") | ||||
|   urls=(${urls//;/ }) | ||||
|   ALL_INSTANCE_GROUP_URLS=${urls[*]} | ||||
|   NODE_INSTANCE_GROUPS=() | ||||
|   if [[ ! -z "${ZONE:-}" ]]; then | ||||
|     for url in "${urls[@]:-}"; do | ||||
|       local igm_zone=$(expr ${url} : '.*/zones/\([a-z0-9-]*\)/') | ||||
|       if [[ "${igm_zone}" == "${ZONE}" ]]; then | ||||
|         NODE_INSTANCE_GROUPS+=("${url##*/}") | ||||
|       fi | ||||
|     done | ||||
|   fi | ||||
|   if [[ ! -z "${REGION:-}" ]]; then | ||||
|     NODE_INSTANCE_GROUPS+=("${urls[0]}") | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # SSH to a node by name ($1) and run a command ($2). | ||||
| # | ||||
| # Assumed vars: | ||||
| #   GCLOUD | ||||
| #   ZONE | ||||
| function ssh-to-node() { | ||||
|   echo "... in gke:ssh-to-node()" >&2 | ||||
|   detect-project >&2 | ||||
|  | ||||
|   local node="$1" | ||||
|   local cmd="$2" | ||||
|   # Loop until we can successfully ssh into the box | ||||
|   for try in {1..5}; do | ||||
|     if gcloud compute ssh --ssh-flag="-o LogLevel=quiet" --ssh-flag="-o ConnectTimeout=30" --project "${PROJECT}" --zone="${ZONE}" "${node}" --command "echo test > /dev/null"; then | ||||
|       break | ||||
|     fi | ||||
|     sleep 5 | ||||
|   done | ||||
|   # Then actually try the command. | ||||
|   gcloud compute ssh --ssh-flag="-o LogLevel=quiet" --ssh-flag="-o ConnectTimeout=30" --project "${PROJECT}" --zone="${ZONE}" "${node}" --command "${cmd}" | ||||
| } | ||||
|  | ||||
| # Execute after running tests to perform any required clean-up.  This is called | ||||
| # from hack/e2e.go. This calls kube-down, so the cluster still exists when this | ||||
| # is called. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   CLUSTER_NAME | ||||
| #   GCLOUD | ||||
| #   KUBE_ROOT | ||||
| #   ZONE | ||||
| function test-teardown() { | ||||
|   echo "... in gke:test-teardown()" >&2 | ||||
|  | ||||
|   detect-project >&2 | ||||
|  | ||||
|   # Tear down the cluster first. | ||||
|   "${KUBE_ROOT}/cluster/kube-down.sh" || true | ||||
|  | ||||
|   # Then remove the firewall rules. We do it in this order because the | ||||
|   # time to delete a firewall is actually dependent on the number of | ||||
|   # instances, but we can safely delete the cluster before the firewall. | ||||
|   # | ||||
|   # NOTE: Keep in sync with names above in test-setup. | ||||
|   for fw in "${CLUSTER_NAME}-http-alt" "${CLUSTER_NAME}-nodeports" "${FIREWALL_SSH}"; do | ||||
|     if [[ -n $("${GCLOUD}" compute firewall-rules --project "${PROJECT}" describe "${fw}" --format='value(name)' 2>/dev/null || true) ]]; then | ||||
|       with-retry 3 "${GCLOUD}" compute firewall-rules delete "${fw}" --project="${PROJECT}" --quiet & | ||||
|     fi | ||||
|   done | ||||
|  | ||||
|   # Wait for firewall rule teardown. | ||||
|   kube::util::wait-for-jobs || true | ||||
|  | ||||
|   # It's unfortunate that the $FIREWALL_SSH rule and network are created in | ||||
|   # kube-up, but we can only really delete them in test-teardown. So much for | ||||
|   # symmetry. | ||||
|   if [[ "${KUBE_DELETE_NETWORK}" == "true" ]]; then | ||||
|     if [[ -n $("${GCLOUD}" compute networks --project "${PROJECT}" describe "${NETWORK}" --format='value(name)' 2>/dev/null || true) ]]; then | ||||
|       if ! with-retry 3 "${GCLOUD}" compute networks delete --project "${PROJECT}" --quiet "${NETWORK}"; then | ||||
|         echo "Failed to delete network '${NETWORK}'. Listing firewall-rules:" | ||||
|         "${GCLOUD}" compute firewall-rules --project "${PROJECT}" list --filter="network=${NETWORK}" | ||||
|       fi | ||||
|     fi | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Actually take down the cluster. This is called from test-teardown. | ||||
| # | ||||
| # Assumed vars: | ||||
| #  GCLOUD | ||||
| #  SCOPE_ARGS | ||||
| #  ZONE (optional) | ||||
| #  REGION (optional) | ||||
| #  CLUSTER_NAME | ||||
| function kube-down() { | ||||
|   echo "... in gke:kube-down()" >&2 | ||||
|   detect-project >&2 | ||||
|   if "${GCLOUD}" ${CMD_GROUP:-} container clusters describe ${SCOPE_ARGS[@]} "${CLUSTER_NAME}" --quiet &>/dev/null; then | ||||
|     with-retry 3 "${GCLOUD}" ${CMD_GROUP:-} container clusters delete ${SCOPE_ARGS[@]} \ | ||||
|       "${CLUSTER_NAME}" --quiet | ||||
|   fi | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Zach Loafman
					Zach Loafman