#!/usr/bin/env 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. set -o errexit set -o nounset set -o pipefail #set -o xtrace UTIL_SCRIPT=$(readlink -m "${BASH_SOURCE[0]}") JUJU_PATH=$(dirname "${UTIL_SCRIPT}") KUBE_ROOT=$(readlink -m "${JUJU_PATH}/../../") # Use the config file specified in $KUBE_CONFIG_FILE, or config-default.sh. source "${JUJU_PATH}/${KUBE_CONFIG_FILE-config-default.sh}" # This attempts installation of Juju - This really needs to support multiple # providers/distros - but I'm super familiar with ubuntu so assume that for now. source "${JUJU_PATH}/prereqs/ubuntu-juju.sh" export JUJU_REPOSITORY="${JUJU_PATH}/charms" KUBE_BUNDLE_PATH="${JUJU_PATH}/bundles/local.yaml" # The directory for the kubectl binary, this is one of the paths in kubectl.sh. KUBECTL_DIR="${KUBE_ROOT}/platforms/linux/amd64" function build-local() { # This used to build the kubernetes project. Now it rebuilds the charm(s) # living in `cluster/juju/layers` charm build "${JUJU_PATH}/layers/kubernetes" -o "$JUJU_REPOSITORY" -r --no-local-layers } function detect-master() { local kubestatus # Capturing a newline, and my awk-fu was weak - pipe through tr -d kubestatus=$(juju status --format=oneline kubernetes | grep "${KUBE_MASTER_NAME}" | awk '{print $3}' | tr -d "\n") export KUBE_MASTER_IP=${kubestatus} export KUBE_SERVER=https://${KUBE_MASTER_IP}:6433 } function detect-nodes() { # Run the Juju command that gets the minion private IP addresses. local ipoutput ipoutput=$(juju run --application kubernetes "unit-get private-address" --format=json) # [ # {"MachineId":"2","Stdout":"192.168.122.188\n","UnitId":"kubernetes/0"}, # {"MachineId":"3","Stdout":"192.168.122.166\n","UnitId":"kubernetes/1"} # ] # Strip out the IP addresses while IFS=$'\n' read -r ip; do KUBE_NODE_IP_ADDRESSES+=("$ip"); done < <("${JUJU_PATH}/return-node-ips.py" "${ipoutput}") export KUBE_NODE_IP_ADDRESSES # echo "Kubernetes minions: " ${KUBE_NODE_IP_ADDRESSES[@]} 1>&2 export NUM_NODES=${#KUBE_NODE_IP_ADDRESSES[@]} } function kube-up() { build-local # Replace the charm directory in the bundle. sed "s|__CHARM_DIR__|${JUJU_REPOSITORY}|" < "${KUBE_BUNDLE_PATH}.base" > "${KUBE_BUNDLE_PATH}" # The juju-deployer command will deploy the bundle and can be run # multiple times to continue deploying the parts that fail. juju deploy "${KUBE_BUNDLE_PATH}" source "${KUBE_ROOT}/cluster/common.sh" # Sleep due to juju bug http://pad.lv/1432759 sleep-status detect-master detect-nodes # Copy kubectl, the cert and key to this machine from master. ( umask 077 mkdir -p "${KUBECTL_DIR}" juju scp "${KUBE_MASTER_NAME}:kubectl_package.tar.gz" "${KUBECTL_DIR}" tar xfz "${KUBECTL_DIR}/kubectl_package.tar.gz" -C "${KUBECTL_DIR}" ) # Export the location of the kubectl configuration file. export KUBECONFIG="${KUBECTL_DIR}/kubeconfig" } function kube-down() { local force="${1-}" local jujuenv jujuenv=$(juju switch) juju destroy-model "${jujuenv}" "${force}" || true # Clean up the generated charm files. rm -rf "${KUBE_ROOT}/cluster/juju/charms" # Clean up the kubectl binary and config file. rm -rf "${KUBECTL_DIR}" } function prepare-e2e() { echo "prepare-e2e() The Juju provider does not need any preparations for e2e." 1>&2 } function sleep-status() { local i local maxtime local jujustatus i=0 maxtime=900 jujustatus='' echo "Waiting up to 15 minutes to allow the cluster to come online... wait for it..." 1>&2 while [[ $i < $maxtime && -z $jujustatus ]]; do sleep 15 i=$((i + 15)) jujustatus=$("${JUJU_PATH}/identify-leaders.py") export KUBE_MASTER_NAME=${jujustatus} done } # Execute prior to running tests to build a release if required for environment. function test-build-release { echo "test-build-release() " 1>&2 } # Execute prior to running tests to initialize required structure. This is # called from hack/e2e.go only when running -up. function test-setup { "${KUBE_ROOT}/cluster/kube-up.sh" } # Execute after running tests to perform any required clean-up. This is called # from hack/e2e.go function test-teardown() { kube-down "-y" } # Verify the prerequisites are statisfied before running. function verify-prereqs() { gather_installation_reqs }