#!/usr/bin/env 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. set -o errexit set -o nounset set -o pipefail # Short-circuit if init.sh has already been sourced [[ $(type -t kube::init::loaded) == function ]] && return 0 # Unset CDPATH so that path interpolation can work correctly # https://github.com/kubernetes/kubernetes/issues/52255 unset CDPATH # FIXME(dims): Note that here we assume that if GOFLAGS are already set we # leave them as-is and not try to add providerless to it. So if you # really need to set your own GOFLAGS, ensure you add "providerless" explicitly if [[ "${KUBE_PROVIDERLESS:-"n"}" == "y" ]]; then export GOFLAGS=${GOFLAGS:-"-tags=providerless"} fi # The root of the build/dist directory KUBE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" # Where output goes. We should avoid redefining these anywhere else. # # KUBE_OUTPUT: the root directory (absolute) where this build should drop any # files (subdirs are encouraged). # KUBE_OUTPUT_BIN: the directory in which compiled binaries will be placed, # under OS/ARCH specific subdirs # THIS_PLATFORM_BIN: a symlink to the output directory for binaries built for # the current host platform (e.g. build/test tools). # # Compat: The KUBE_OUTPUT_SUBPATH variable is sometimes passed in by callers. # If it is specified, we'll use it in KUBE_OUTPUT. _KUBE_OUTPUT_SUBPATH="${KUBE_OUTPUT_SUBPATH:-_output/local}" export KUBE_OUTPUT="${KUBE_ROOT}/${_KUBE_OUTPUT_SUBPATH}" export KUBE_OUTPUT_BIN="${KUBE_OUTPUT}/bin" export THIS_PLATFORM_BIN="${KUBE_ROOT}/_output/bin" # This controls rsync compression. Set to a value > 0 to enable rsync # compression for build container KUBE_RSYNC_COMPRESS="${KUBE_RSYNC_COMPRESS:-0}" # Set no_proxy for localhost if behind a proxy, otherwise, # the connections to localhost in scripts will time out export no_proxy="127.0.0.1,localhost${no_proxy:+,${no_proxy}}" source "${KUBE_ROOT}/hack/lib/util.sh" source "${KUBE_ROOT}/hack/lib/logging.sh" kube::log::install_errexit kube::util::ensure-bash-version source "${KUBE_ROOT}/hack/lib/version.sh" source "${KUBE_ROOT}/hack/lib/golang.sh" source "${KUBE_ROOT}/hack/lib/etcd.sh" # list of all available group versions. This should be used when generated code # or when starting an API server that you want to have everything. # most preferred version for a group should appear first KUBE_AVAILABLE_GROUP_VERSIONS="${KUBE_AVAILABLE_GROUP_VERSIONS:-\ v1 \ admissionregistration.k8s.io/v1 \ admissionregistration.k8s.io/v1alpha1 \ admissionregistration.k8s.io/v1beta1 \ admission.k8s.io/v1 \ admission.k8s.io/v1beta1 \ apps/v1 \ apps/v1beta1 \ apps/v1beta2 \ authentication.k8s.io/v1 \ authentication.k8s.io/v1alpha1 \ authentication.k8s.io/v1beta1 \ authorization.k8s.io/v1 \ authorization.k8s.io/v1beta1 \ autoscaling/v1 \ autoscaling/v2 \ autoscaling/v2beta1 \ autoscaling/v2beta2 \ batch/v1 \ batch/v1beta1 \ certificates.k8s.io/v1 \ certificates.k8s.io/v1beta1 \ certificates.k8s.io/v1alpha1 \ coordination.k8s.io/v1beta1 \ coordination.k8s.io/v1 \ discovery.k8s.io/v1 \ discovery.k8s.io/v1beta1 \ resource.k8s.io/v1alpha2 \ extensions/v1beta1 \ events.k8s.io/v1 \ events.k8s.io/v1beta1 \ imagepolicy.k8s.io/v1alpha1 \ networking.k8s.io/v1 \ networking.k8s.io/v1alpha1 \ networking.k8s.io/v1beta1 \ node.k8s.io/v1 \ node.k8s.io/v1alpha1 \ node.k8s.io/v1beta1 \ policy/v1 \ policy/v1beta1 \ rbac.authorization.k8s.io/v1 \ rbac.authorization.k8s.io/v1beta1 \ rbac.authorization.k8s.io/v1alpha1 \ scheduling.k8s.io/v1alpha1 \ scheduling.k8s.io/v1beta1 \ scheduling.k8s.io/v1 \ storage.k8s.io/v1beta1 \ storage.k8s.io/v1 \ storage.k8s.io/v1alpha1 \ flowcontrol.apiserver.k8s.io/v1 \ storagemigration.k8s.io/v1alpha1 \ flowcontrol.apiserver.k8s.io/v1beta1 \ flowcontrol.apiserver.k8s.io/v1beta2 \ flowcontrol.apiserver.k8s.io/v1beta3 \ internal.apiserver.k8s.io/v1alpha1 \ }" # not all group versions are exposed by the server. This list contains those # which are not available so we don't generate clients or swagger for them KUBE_NONSERVER_GROUP_VERSIONS=" abac.authorization.kubernetes.io/v0 \ abac.authorization.kubernetes.io/v1beta1 \ apidiscovery.k8s.io/v2beta1 \ apidiscovery.k8s.io/v2 \ componentconfig/v1alpha1 \ imagepolicy.k8s.io/v1alpha1\ admission.k8s.io/v1\ admission.k8s.io/v1beta1\ " export KUBE_NONSERVER_GROUP_VERSIONS # This emulates "readlink -f" which is not available on MacOS X. # Test: # T=/tmp/$$.$RANDOM # mkdir $T # touch $T/file # mkdir $T/dir # ln -s $T/file $T/linkfile # ln -s $T/dir $T/linkdir # function testone() { # X=$(readlink -f $1 2>&1) # Y=$(kube::readlinkdashf $1 2>&1) # if [ "$X" != "$Y" ]; then # echo readlinkdashf $1: expected "$X", got "$Y" # fi # } # testone / # testone /tmp # testone $T # testone $T/file # testone $T/dir # testone $T/linkfile # testone $T/linkdir # testone $T/nonexistant # testone $T/linkdir/file # testone $T/linkdir/dir # testone $T/linkdir/linkfile # testone $T/linkdir/linkdir function kube::readlinkdashf { # run in a subshell for simpler 'cd' ( if [[ -d "${1}" ]]; then # This also catch symlinks to dirs. cd "${1}" pwd -P else cd "$(dirname "${1}")" local f f=$(basename "${1}") if [[ -L "${f}" ]]; then readlink "${f}" else echo "$(pwd -P)/${f}" fi fi ) } # This emulates "realpath" which is not available on MacOS X # Test: # T=/tmp/$$.$RANDOM # mkdir $T # touch $T/file # mkdir $T/dir # ln -s $T/file $T/linkfile # ln -s $T/dir $T/linkdir # function testone() { # X=$(realpath $1 2>&1) # Y=$(kube::realpath $1 2>&1) # if [ "$X" != "$Y" ]; then # echo realpath $1: expected "$X", got "$Y" # fi # } # testone / # testone /tmp # testone $T # testone $T/file # testone $T/dir # testone $T/linkfile # testone $T/linkdir # testone $T/nonexistant # testone $T/linkdir/file # testone $T/linkdir/dir # testone $T/linkdir/linkfile # testone $T/linkdir/linkdir kube::realpath() { if [[ ! -e "${1}" ]]; then echo "${1}: No such file or directory" >&2 return 1 fi kube::readlinkdashf "${1}" } # Marker function to indicate init.sh has been fully sourced kube::init::loaded() { return 0 }