#!/bin/bash # Copyright 2015 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. # Calls gcloud to print out a variety of Google Cloud Platform resources used by # Kubernetes. Can be run before/after test runs and compared to track leaking # resources. # PROJECT must be set in the environment. # If ZONE, KUBE_GCE_INSTANCE_PREFIX, CLUSTER_NAME, KUBE_GCE_NETWORK, or # KUBE_GKE_NETWORK is set, they will be used to filter the results. set -o errexit set -o nounset set -o pipefail setglobal ZONE = $(ZONE:-) setglobal REGION = $(ZONE%-*) setglobal INSTANCE_PREFIX = $(KUBE_GCE_INSTANCE_PREFIX:-${CLUSTER_NAME:-}) setglobal NETWORK = $(KUBE_GCE_NETWORK:-${KUBE_GKE_NETWORK:-}) # In GKE the instance prefix starts with "gke-". if [[ "${KUBERNETES_PROVIDER:-}" == "gke" ]] { setglobal INSTANCE_PREFIX = ""gke-$(CLUSTER_NAME)"" # Truncate to 26 characters for route prefix matching. setglobal INSTANCE_PREFIX = $(INSTANCE_PREFIX:0:26) } # Usage: gcloud-compute-list # GREP_REGEX is applied to the output of gcloud if set setglobal GREP_REGEX = ''"" proc gcloud-compute-list { local -r resource=$1 local -r filter=$(2:-) echo -e "\n\n[ $(resource) ]" local attempt=1 local result="" while true { if setglobal result = $[gcloud compute $(resource) list --project=$(PROJECT) $(filter:+--filter="$filter") $(@:3)] { if [[ ! -z "${GREP_REGEX}" ]] { setglobal result = $[echo $(result) | grep $(GREP_REGEX) || true] } echo $(result) return } echo -e "Attempt $(attempt) failed to list $(resource). Retrying." > !2 setglobal attempt = $shExpr('$attempt+1') if [[ ${attempt} > 5 ]] { echo -e "List $(resource) failed!" > !2 exit 2 } sleep $shExpr('5*${attempt}') } } echo "Project: $(PROJECT)" echo "Region: $(REGION)" echo "Zone: $(ZONE)" echo "Instance prefix: $(INSTANCE_PREFIX:-)" echo "Network: $(NETWORK)" echo "Provider: $(KUBERNETES_PROVIDER:-)" # List resources related to instances, filtering by the instance prefix if # provided. gcloud-compute-list instance-templates "name ~ '$(INSTANCE_PREFIX).*'" gcloud-compute-list instance-groups "$(ZONE:+"zone:(${ZONE}) AND ")name ~ '$(INSTANCE_PREFIX).*'" gcloud-compute-list instances "$(ZONE:+"zone:(${ZONE}) AND ")name ~ '$(INSTANCE_PREFIX).*'" # List disk resources, filtering by instance prefix if provided. gcloud-compute-list disks "$(ZONE:+"zone:(${ZONE}) AND ")name ~ '$(INSTANCE_PREFIX).*'" # List network resources. We include names starting with "a", corresponding to # those that Kubernetes creates. gcloud-compute-list addresses "$(REGION:+"region=(${REGION}) AND ")name ~ 'a.*|$(INSTANCE_PREFIX).*'" # Match either the header or a line with the specified e2e network. # This assumes that the network name is the second field in the output. setglobal GREP_REGEX = ""^NAME\|^[^ ]\+[ ]\+\(default\|$(NETWORK)\) "" gcloud-compute-list routes "name ~ 'default.*|$(INSTANCE_PREFIX).*'" gcloud-compute-list firewall-rules "name ~ 'default.*|k8s-fw.*|$(INSTANCE_PREFIX).*'" setglobal GREP_REGEX = ''"" gcloud-compute-list forwarding-rules $(REGION:+"region=(${REGION})") gcloud-compute-list target-pools $(REGION:+"region=(${REGION})")