che-server/deploy/openshift/ocp.sh

299 lines
9.2 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2012-2017 Red Hat, Inc
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
set -e
init() {
LOCAL_IP_ADDRESS=$(detectIP)
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
#OS specific defaults
if [[ "$OSTYPE" == "darwin"* ]]; then
DEFAULT_OC_PUBLIC_HOSTNAME="$LOCAL_IP_ADDRESS"
DEFAULT_OC_PUBLIC_IP="$LOCAL_IP_ADDRESS"
DEFAULT_OC_BINARY_DOWNLOAD_URL="https://github.com/openshift/origin/releases/download/v3.7.0/openshift-origin-client-tools-v3.7.0-7ed6862-mac.zip"
DEFAULT_JQ_BINARY_DOWNLOAD_URL="https://github.com/stedolan/jq/releases/download/jq-1.5/jq-osx-amd64"
else
DEFAULT_OC_PUBLIC_HOSTNAME="$LOCAL_IP_ADDRESS"
DEFAULT_OC_PUBLIC_IP="$LOCAL_IP_ADDRESS"
DEFAULT_OC_BINARY_DOWNLOAD_URL="https://github.com/openshift/origin/releases/download/v3.7.0/openshift-origin-client-tools-v3.7.0-7ed6862-linux-64bit.tar.gz"
DEFAULT_JQ_BINARY_DOWNLOAD_URL="https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64"
fi
export OC_PUBLIC_HOSTNAME=${OC_PUBLIC_HOSTNAME:-${DEFAULT_OC_PUBLIC_HOSTNAME}}
export OC_PUBLIC_IP=${OC_PUBLIC_IP:-${DEFAULT_OC_PUBLIC_IP}}
export OC_BINARY_DOWNLOAD_URL=${OC_BINARY_DOWNLOAD_URL:-${DEFAULT_OC_BINARY_DOWNLOAD_URL}}
export JQ_BINARY_DOWNLOAD_URL=${JQ_BINARY_DOWNLOAD_URL:-${DEFAULT_JQ_BINARY_DOWNLOAD_URL}}
DEFAULT_CHE_MULTIUSER="false"
export CHE_MULTIUSER=${CHE_MULTIUSER:-${DEFAULT_CHE_MULTIUSER}}
DEFAULT_OPENSHIFT_USERNAME="developer"
export OPENSHIFT_USERNAME=${OPENSHIFT_USERNAME:-${DEFAULT_OPENSHIFT_USERNAME}}
DEFAULT_OPENSHIFT_PASSWORD="developer"
export OPENSHIFT_PASSWORD=${OPENSHIFT_PASSWORD:-${DEFAULT_OPENSHIFT_PASSWORD}}
DNS_PROVIDERS=(
xip.io
nip.codenvy-stg.com
)
DEFAULT_DNS_PROVIDER="nip.io"
export DNS_PROVIDER=${DNS_PROVIDER:-${DEFAULT_DNS_PROVIDER}}
export OPENSHIFT_ROUTING_SUFFIX="${OC_PUBLIC_IP}.${DNS_PROVIDER}"
DEFAULT_CHE_OPENSHIFT_PROJECT="eclipse-che"
export CHE_OPENSHIFT_PROJECT=${CHE_OPENSHIFT_PROJECT:-${DEFAULT_CHE_OPENSHIFT_PROJECT}}
export OPENSHIFT_FLAVOR="ocp"
DEFAULT_OPENSHIFT_ENDPOINT="https://${OC_PUBLIC_HOSTNAME}:8443"
export OPENSHIFT_ENDPOINT=${OPENSHIFT_ENDPOINT:-${DEFAULT_OPENSHIFT_ENDPOINT}}
export CHE_INFRA_KUBERNETES_MASTER__URL=${CHE_INFRA_KUBERNETES_MASTER__URL:-${OPENSHIFT_ENDPOINT}}
DEFAULT_ENABLE_SSL="false"
export ENABLE_SSL=${ENABLE_SSL:-${DEFAULT_ENABLE_SSL}}
DEFAULT_CHE_IMAGE_TAG="nightly"
export CHE_IMAGE_TAG=${CHE_IMAGE_TAG:-${DEFAULT_CHE_IMAGE_TAG}}
DEFAULT_IMAGE_PULL_POLICY="Always"
export IMAGE_PULL_POLICY=${IMAGE_PULL_POLICY:-${DEFAULT_IMAGE_PULL_POLICY}}
DEFAULT_CHE_IMAGE_REPO="eclipse/che-server"
export CHE_IMAGE_REPO=${CHE_IMAGE_REPO:-${DEFAULT_CHE_IMAGE_REPO}}
DEFAULT_CHE_CLI_IMAGE="eclipse/che-cli:nightly"
export CHE_CLI_IMAGE=${CHE_CLI_IMAGE:-${DEFAULT_CHE_CLI_IMAGE}}
DEFAULT_CONFIG_DIR="/tmp/che-config"
export CONFIG_DIR=${CONFIG_DIR:-${DEFAULT_CONFIG_DIR}}
}
test_dns_provider() {
#add current $DNS_PROVIDER to the providers list to respect environment settings
DNS_PROVIDERS=("$DNS_PROVIDER" "${DNS_PROVIDERS[@]}")
for i in ${DNS_PROVIDERS[@]}
do
if [[ $(dig +short +time=5 +tries=1 10.0.0.1.$i) = "10.0.0.1" ]]; then
echo "Test $i - works OK, using it as DNS provider"
export DNS_PROVIDER="$i"
break;
else
echo "Test $i DNS provider failed, trying next one."
fi
done
}
get_tools() {
TOOLS_DIR="/tmp"
OC_BINARY="$TOOLS_DIR/oc"
JQ_BINARY="$TOOLS_DIR/jq"
OC_VERSION=$(echo $DEFAULT_OC_BINARY_DOWNLOAD_URL | cut -d '/' -f 8)
#OS specific extract archives
if [[ "$OSTYPE" == "darwin"* ]]; then
OC_PACKAGE="openshift-origin-client-tools.zip"
ARCH="unzip -d $TOOLS_DIR"
EXTRA_ARGS=""
else
OC_PACKAGE="openshift-origin-client-tools.tar.gz"
ARCH="tar --strip 1 -xzf"
EXTRA_ARGS="-C $TOOLS_DIR"
fi
download_oc() {
echo "download oc client $OC_VERSION"
wget -q -O $TOOLS_DIR/$OC_PACKAGE $OC_BINARY_DOWNLOAD_URL
eval "$ARCH" "$TOOLS_DIR"/"$OC_PACKAGE" "$EXTRA_ARGS" &>/dev/null
rm -f "$TOOLS_DIR"/README.md "$TOOLS_DIR"/LICENSE "${TOOLS_DIR:-/tmp}"/"$OC_PACKAGE"
}
if [[ ! -f $OC_BINARY ]]; then
download_oc
else
# here we check is installed version is same version defined in script, if not we update version to one that defined in script.
if [[ $($OC_BINARY version 2> /dev/null | grep "oc v" | cut -d " " -f2 | cut -d '+' -f1 || true) != *"$OC_VERSION"* ]]; then
rm -f "$OC_BINARY" "$TOOLS_DIR"/README.md "$TOOLS_DIR"/LICENSE
download_oc
fi
fi
if [ ! -f $JQ_BINARY ]; then
echo "download jq..."
wget -q -O $JQ_BINARY $JQ_BINARY_DOWNLOAD_URL
chmod +x $JQ_BINARY
fi
export PATH=${PATH}:${TOOLS_DIR}
}
ocp_is_booted() {
# we have to wait before docker registry will be started as it is staring as last container and it should be running before we perform che deploy.
ocp_registry_container_id=$(docker ps -a | grep openshift/origin-docker-registry | cut -d ' ' -f1)
if [ ! -z "$ocp_registry_container_id" ];then
ocp_registry_container_status=$(docker inspect "$ocp_registry_container_id" | $JQ_BINARY .[0] | $JQ_BINARY -r '.State.Status')
else
return 1
fi
if [[ "${ocp_registry_container_status}" == "running" ]]; then
return 0
else
return 1
fi
}
wait_ocp() {
OCP_BOOT_TIMEOUT=120
echo "[OCP] wait for ocp full boot..."
ELAPSED=0
until ocp_is_booted; do
if [ ${ELAPSED} -eq "${OCP_BOOT_TIMEOUT}" ];then
echo "OCP didn't started in $OCP_BOOT_TIMEOUT secs, exit"
exit 1
fi
sleep 2
ELAPSED=$((ELAPSED+1))
done
}
run_ocp() {
test_dns_provider
$OC_BINARY cluster up --public-hostname="${OC_PUBLIC_HOSTNAME}" --routing-suffix="${OC_PUBLIC_IP}.${DNS_PROVIDER}"
wait_ocp
}
deploy_che_to_ocp() {
bash ${BASE_DIR}/deploy_che.sh --wait-che ${DEPLOY_SCRIPT_ARGS}
}
destroy_ocp() {
$OC_BINARY login -u system:admin
$OC_BINARY delete pvc --all
$OC_BINARY delete all --all
$OC_BINARY cluster down
}
remove_che_from_ocp() {
echo "[CHE] Checking if project \"${CHE_OPENSHIFT_PROJECT}\" exists before removing..."
WAIT_FOR_PROJECT_TO_DELETE=true
CHE_REMOVE_PROJECT=true
DELETE_OPENSHIFT_PROJECT_MESSAGE="[CHE] Removing Project \"${CHE_OPENSHIFT_PROJECT}\"."
if $OC_BINARY get project "${CHE_OPENSHIFT_PROJECT}" &> /dev/null; then
echo "[CHE] Project \"${CHE_OPENSHIFT_PROJECT}\" exists."
while $WAIT_FOR_PROJECT_TO_DELETE
do
{ # try
echo -n $DELETE_OPENSHIFT_PROJECT_MESSAGE
if $CHE_REMOVE_PROJECT; then
$OC_BINARY delete project "${CHE_OPENSHIFT_PROJECT}" &> /dev/null
CHE_REMOVE_PROJECT=false
fi
DELETE_OPENSHIFT_PROJECT_MESSAGE="."
if ! $OC_BINARY get project "${CHE_OPENSHIFT_PROJECT}" &> /dev/null; then
WAIT_FOR_PROJECT_TO_DELETE=false
fi
echo -n $DELETE_OPENSHIFT_PROJECT_MESSAGE
} || { # catch
echo "[CHE] Could not find project \"${CHE_OPENSHIFT_PROJECT}\" to delete."
WAIT_FOR_PROJECT_TO_DELETE=false
}
done
echo "Done!"
else
echo "[CHE] Project \"${CHE_OPENSHIFT_PROJECT}\" does NOT exists."
fi
}
detectIP() {
docker run --rm --net host eclipse/che-ip:nightly
}
parse_args() {
HELP="valid args:
--help - this help menu
--run-ocp - run ocp cluster
--destroy - destroy ocp cluster
--deploy-che - deploy che to ocp
--multiuser - deploy che in multiuser mode
--remove-che - remove existing che project
===================================
ENV vars
CHE_IMAGE_TAG - set che-server image tag, default: nightly
CHE_CLI_IMAGE - set che-cli image, default: eclipse/che-cli:nightly
CHE_MULTIUSER - set CHE multi user mode, default: false (single user)
OC_PUBLIC_HOSTNAME - set ocp hostname to admin console, default: host ip
OC_PUBLIC_IP - set ocp hostname for routing suffix, default: host ip
DNS_PROVIDER - set ocp DNS provider for routing suffix, default: nip.io
OPENSHIFT_TOKEN - set ocp token for authentication
"
DEPLOY_SCRIPT_ARGS=""
if [ $# -eq 0 ]; then
echo "No arguments supplied"
echo -e "$HELP"
exit 1
fi
if [[ "$@" == *"--multiuser"* ]]; then
CHE_MULTIUSER=true
fi
if [[ "$@" == *"--update"* ]]; then
DEPLOY_SCRIPT_ARGS="-c rollupdate"
fi
if [[ "$@" == *"--remove-che"* ]]; then
remove_che_from_ocp
fi
for i in "${@}"
do
case $i in
--run-ocp)
run_ocp
shift
;;
--destroy)
destroy_ocp
shift
;;
--deploy-che)
deploy_che_to_ocp
shift
;;
--multiuser)
shift
;;
--update)
shift
;;
--remove-che)
shift
;;
--help)
echo -e "$HELP"
exit 1
;;
*)
echo "You've passed wrong arg."
echo -e "$HELP"
exit 1
;;
esac
done
}
init
get_tools
parse_args "$@"