#!/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}") 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 export KUBE_NODE_IP_ADDRESSES=($(${JUJU_PATH}/return-node-ips.py "${ipoutput}")) # 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 }