From baab2e37a9713d9d79a8224033966a4e0e705ffb Mon Sep 17 00:00:00 2001 From: "Madhusudan.C.S" Date: Thu, 26 Jan 2017 21:29:47 -0800 Subject: [PATCH 1/3] Refactor the common parts of cluster/kube{ctl,adm}.sh into a util script. --- cluster/clientbin.sh | 105 +++++++++++++++++++++++++++++++++++++++++++ cluster/kubeadm.sh | 70 ++--------------------------- cluster/kubectl.sh | 70 ++--------------------------- 3 files changed, 111 insertions(+), 134 deletions(-) create mode 100644 cluster/clientbin.sh diff --git a/cluster/clientbin.sh b/cluster/clientbin.sh new file mode 100644 index 00000000000..b34a6e65866 --- /dev/null +++ b/cluster/clientbin.sh @@ -0,0 +1,105 @@ +#!/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. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=${KUBE_ROOT:-$(dirname "${BASH_SOURCE}")/..} + +# Detect the OS name/arch so that we can find our binary +case "$(uname -s)" in + Darwin) + host_os=darwin + ;; + Linux) + host_os=linux + ;; + *) + echo "Unsupported host OS. Must be Linux or Mac OS X." >&2 + exit 1 + ;; +esac + +case "$(uname -m)" in + x86_64*) + host_arch=amd64 + ;; + i?86_64*) + host_arch=amd64 + ;; + amd64*) + host_arch=amd64 + ;; + arm*) + host_arch=arm + ;; + i?86*) + host_arch=386 + ;; + s390x*) + host_arch=s390x + ;; + ppc64le*) + host_arch=ppc64le + ;; + *) + echo "Unsupported host arch. Must be x86_64, 386, arm, s390x or ppc64le." >&2 + exit 1 + ;; +esac + +# Get the absolute path of the directory component of a file, i.e. the +# absolute path of the dirname of $1. +get_absolute_dirname() { + echo "$(cd "$(dirname "$1")" && pwd)" +} + +function get_bin() { + bin="${1:-}" + srcdir="${2:-}" + if [[ "${bin}" == "" ]]; then + echo "Binary name is required" + exit 1 + fi + if [[ "${srcdir}" == "" ]]; then + echo "Source directory path is required" + exit 1 + fi + + locations=( + "${KUBE_ROOT}/_output/bin/${bin}" + "${KUBE_ROOT}/_output/dockerized/bin/${host_os}/${host_arch}/${bin}" + "${KUBE_ROOT}/_output/local/bin/${host_os}/${host_arch}/${bin}" + "${KUBE_ROOT}/bazel-bin/${srcdir}/${bin}" + "${KUBE_ROOT}/platforms/${host_os}/${host_arch}/${bin}" + ) + echo $( (ls -t "${locations[@]}" 2>/dev/null || true) | head -1 ) +} + +function print_error() { + { + echo "It looks as if you don't have a compiled ${1:-} binary" + echo + echo "If you are running from a clone of the git repo, please run" + echo "'./build/run.sh make cross'. Note that this requires having" + echo "Docker installed." + echo + echo "If you are running from a binary release tarball, something is wrong. " + echo "Look at http://kubernetes.io/ for information on how to contact the " + echo "development team for help." + } >&2 +} diff --git a/cluster/kubeadm.sh b/cluster/kubeadm.sh index 54cfb3d3dc5..d5912abcfe0 100755 --- a/cluster/kubeadm.sh +++ b/cluster/kubeadm.sh @@ -20,79 +20,15 @@ set -o pipefail KUBE_ROOT=${KUBE_ROOT:-$(dirname "${BASH_SOURCE}")/..} source "${KUBE_ROOT}/cluster/kube-util.sh" - -# Get the absolute path of the directory component of a file, i.e. the -# absolute path of the dirname of $1. -get_absolute_dirname() { - echo "$(cd "$(dirname "$1")" && pwd)" -} - -# Detect the OS name/arch so that we can find our binary -case "$(uname -s)" in - Darwin) - host_os=darwin - ;; - Linux) - host_os=linux - ;; - *) - echo "Unsupported host OS. Must be Linux or Mac OS X." >&2 - exit 1 - ;; -esac - -case "$(uname -m)" in - x86_64*) - host_arch=amd64 - ;; - i?86_64*) - host_arch=amd64 - ;; - amd64*) - host_arch=amd64 - ;; - arm*) - host_arch=arm - ;; - i?86*) - host_arch=386 - ;; - s390x*) - host_arch=s390x - ;; - ppc64le*) - host_arch=ppc64le - ;; - *) - echo "Unsupported host arch. Must be x86_64, 386, arm, s390x or ppc64le." >&2 - exit 1 - ;; -esac +source "${KUBE_ROOT}/cluster/clientbin.sh" # If KUBEADM_PATH isn't set, gather up the list of likely places and use ls # to find the latest one. if [[ -z "${KUBEADM_PATH:-}" ]]; then - locations=( - "${KUBE_ROOT}/_output/bin/kubeadm" - "${KUBE_ROOT}/_output/dockerized/bin/${host_os}/${host_arch}/kubeadm" - "${KUBE_ROOT}/_output/local/bin/${host_os}/${host_arch}/kubeadm" - "${KUBE_ROOT}/bazel-bin/cmd/kubectl/kubeadm" - "${KUBE_ROOT}/platforms/${host_os}/${host_arch}/kubeadm" - ) - kubeadm=$( (ls -t "${locations[@]}" 2>/dev/null || true) | head -1 ) + kubeadm=$( get_bin "kubeadm" "cmd/kubeadm" ) if [[ ! -x "$kubeadm" ]]; then - { - echo "It looks as if you don't have a compiled kubeadm binary" - echo - echo "If you are running from a clone of the git repo, please run" - echo "'./build/run.sh make cross'. Note that this requires having" - echo "Docker installed." - echo - echo "If you are running from a binary release tarball, something is wrong. " - echo "Look at http://kubernetes.io/ for information on how to contact the " - echo "development team for help." - } >&2 + print_error "kubeadm" exit 1 fi elif [[ ! -x "${KUBEADM_PATH}" ]]; then diff --git a/cluster/kubectl.sh b/cluster/kubectl.sh index 2e0c3c4de55..abee0f0e1a8 100755 --- a/cluster/kubectl.sh +++ b/cluster/kubectl.sh @@ -32,79 +32,15 @@ set -o pipefail KUBE_ROOT=${KUBE_ROOT:-$(dirname "${BASH_SOURCE}")/..} source "${KUBE_ROOT}/cluster/kube-util.sh" - -# Get the absolute path of the directory component of a file, i.e. the -# absolute path of the dirname of $1. -get_absolute_dirname() { - echo "$(cd "$(dirname "$1")" && pwd)" -} - -# Detect the OS name/arch so that we can find our binary -case "$(uname -s)" in - Darwin) - host_os=darwin - ;; - Linux) - host_os=linux - ;; - *) - echo "Unsupported host OS. Must be Linux or Mac OS X." >&2 - exit 1 - ;; -esac - -case "$(uname -m)" in - x86_64*) - host_arch=amd64 - ;; - i?86_64*) - host_arch=amd64 - ;; - amd64*) - host_arch=amd64 - ;; - arm*) - host_arch=arm - ;; - i?86*) - host_arch=386 - ;; - s390x*) - host_arch=s390x - ;; - ppc64le*) - host_arch=ppc64le - ;; - *) - echo "Unsupported host arch. Must be x86_64, 386, arm, s390x or ppc64le." >&2 - exit 1 - ;; -esac +source "${KUBE_ROOT}/cluster/clientbin.sh" # If KUBECTL_PATH isn't set, gather up the list of likely places and use ls # to find the latest one. if [[ -z "${KUBECTL_PATH:-}" ]]; then - locations=( - "${KUBE_ROOT}/_output/bin/kubectl" - "${KUBE_ROOT}/_output/dockerized/bin/${host_os}/${host_arch}/kubectl" - "${KUBE_ROOT}/_output/local/bin/${host_os}/${host_arch}/kubectl" - "${KUBE_ROOT}/bazel-bin/cmd/kubectl/kubectl" - "${KUBE_ROOT}/platforms/${host_os}/${host_arch}/kubectl" - ) - kubectl=$( (ls -t "${locations[@]}" 2>/dev/null || true) | head -1 ) + kubectl=$( get_bin "kubectl" "cmd/kubectl" ) if [[ ! -x "$kubectl" ]]; then - { - echo "It looks as if you don't have a compiled kubectl binary" - echo - echo "If you are running from a clone of the git repo, please run" - echo "'./build/run.sh make cross'. Note that this requires having" - echo "Docker installed." - echo - echo "If you are running from a binary release tarball, something is wrong. " - echo "Look at http://kubernetes.io/ for information on how to contact the " - echo "development team for help." - } >&2 + print_error "kubectl" exit 1 fi elif [[ ! -x "${KUBECTL_PATH}" ]]; then From f798b96a758d054b86a3da152f5503162ffad519 Mon Sep 17 00:00:00 2001 From: "Madhusudan.C.S" Date: Thu, 26 Jan 2017 21:30:52 -0800 Subject: [PATCH 2/3] Add a wrapper script to locate the kubefed binary in a CI environment. --- federation/develop/kubefed.sh | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 federation/develop/kubefed.sh diff --git a/federation/develop/kubefed.sh b/federation/develop/kubefed.sh new file mode 100755 index 00000000000..4c3caf81d21 --- /dev/null +++ b/federation/develop/kubefed.sh @@ -0,0 +1,48 @@ +#!/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. + +set -o errexit +set -o nounset +set -o pipefail + +# "-=-=-=-=-=-=-=-=-=-=" +# This script is only for CI testing purposes. Don't use it in production. +# "-=-=-=-=-=-=-=-=-=-=" + +KUBE_ROOT=${KUBE_ROOT:-$(dirname "${BASH_SOURCE}")/../..} +source "${KUBE_ROOT}/cluster/clientbin.sh" + +# If KUBEFED_PATH isn't set, gather up the list of likely places and use ls +# to find the latest one. +if [[ -z "${KUBEFED_PATH:-}" ]]; then + kubefed=$( get_bin "kubefed" "federation/cmd/kubefed" ) + + if [[ ! -x "$kubefed" ]]; then + print_error "kubefed" + exit 1 + fi +elif [[ ! -x "${KUBEFED_PATH}" ]]; then + { + echo "KUBEFED_PATH environment variable set to '${KUBEFED_PATH}', but " + echo "this doesn't seem to be a valid executable." + } >&2 + exit 1 +fi +kubefed="${KUBEFED_PATH:-${kubefed}}" + +# Use the arguments to the script if it is set, a null string +# otherwise. +"${kubefed}" "${@+$@}" From c1d5c6db38010a17acbea823696b980c4b99a3be Mon Sep 17 00:00:00 2001 From: "Madhusudan.C.S" Date: Thu, 26 Jan 2017 23:07:59 -0800 Subject: [PATCH 3/3] Use a wrapper script to locate kubefed and kubectl binaries instead of directly constructing their paths. Binaries are not available at the same path in all the environments, esp. in CI environment. So we use this wrapper to locate the binary. --- federation/cluster/federation-up.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/federation/cluster/federation-up.sh b/federation/cluster/federation-up.sh index bd13d797a5f..6d2c9ba5747 100755 --- a/federation/cluster/federation-up.sh +++ b/federation/cluster/federation-up.sh @@ -29,17 +29,13 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. # For `kube::log::status` function since it already sources # "${KUBE_ROOT}/cluster/lib/logging.sh" and DEFAULT_KUBECONFIG source "${KUBE_ROOT}/cluster/common.sh" -# For $KUBE_PLATFORM, $KUBE_ARCH, $KUBE_BUILD_STAGE, -# $FEDERATION_PUSH_REPO_BASE and $FEDERATION_NAMESPACE. +# For $FEDERATION_PUSH_REPO_BASE and $FEDERATION_NAMESPACE. source "${KUBE_ROOT}/federation/cluster/common.sh" FEDERATION_NAME="${FEDERATION_NAME:-e2e-federation}" FEDERATION_KUBE_CONTEXT="${FEDERATION_KUBE_CONTEXT:-e2e-federation}" DNS_ZONE_NAME="${FEDERATION_DNS_ZONE_NAME:-}" HOST_CLUSTER_CONTEXT="${FEDERATION_HOST_CLUSTER_CONTEXT:-${1}}" -readonly CLIENT_BIN_DIR="${KUBE_ROOT}/_output/${KUBE_BUILD_STAGE}/client/${KUBE_PLATFORM}-${KUBE_ARCH}/kubernetes/client/bin" -kubefed="${CLIENT_BIN_DIR}/kubefed" -kubectl="${CLIENT_BIN_DIR}/kubectl" # Initializes the control plane. # TODO(madhusudancs): Move this to federation/develop.sh. @@ -50,7 +46,7 @@ function init() { local -r kube_registry="${KUBE_REGISTRY:-gcr.io/${project}}" local -r kube_version="${KUBERNETES_RELEASE:-}" - ${kubefed} init \ + "${KUBE_ROOT}/federation/develop/kubefed.sh" init \ "${FEDERATION_NAME}" \ --host-cluster-context="${HOST_CLUSTER_CONTEXT}" \ --dns-zone-name="${DNS_ZONE_NAME}" \ @@ -73,13 +69,17 @@ function create_cluster_secrets() { name=$(echo "${dir}" | sed -e "s/_/-/g") # Replace "_" by "-" name=${name:0:252} kube::log::status "Creating secret with name: ${name} in namespace ${FEDERATION_NAMESPACE}" - ${kubectl} create secret generic ${name} --from-file="${base_dir}/${dir}/kubeconfig" --namespace="${FEDERATION_NAMESPACE}" + "${KUBE_ROOT}/cluster/kubectl.sh" create secret generic ${name} --from-file="${base_dir}/${dir}/kubeconfig" --namespace="${FEDERATION_NAMESPACE}" done } USE_KUBEFED="${USE_KUBEFED:-}" if [[ "${USE_KUBEFED}" == "true" ]]; then init + # TODO(madhusudancs): Call to create_cluster_secrets and the function + # itself must be removed after implementing cluster join with kubefed + # here. This call is now required for the cluster joins in the + # BeforeEach blocks of each e2e test to work. create_cluster_secrets else # Read the version back from the versions file if no version is given.