380 lines
13 KiB
Bash
Executable File
380 lines
13 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2012-2019 Red Hat, Inc.
|
|
# This program and the accompanying materials are made
|
|
# available under the terms of the Eclipse Public License 2.0
|
|
# which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
#
|
|
# SPDX-License-Identifier: EPL-2.0
|
|
#
|
|
|
|
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.9.0/openshift-origin-client-tools-v3.9.0-191fece-mac.zip"
|
|
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.9.0/openshift-origin-client-tools-v3.9.0-191fece-linux-64bit.tar.gz"
|
|
fi
|
|
|
|
export OC_PUBLIC_HOSTNAME=${OC_PUBLIC_HOSTNAME:-${DEFAULT_OC_PUBLIC_HOSTNAME}}
|
|
export OC_PUBLIC_IP=${OC_PUBLIC_IP:-${DEFAULT_OC_PUBLIC_IP}}
|
|
|
|
DEFAULT_OCP_TOOLS_DIR="/tmp"
|
|
export OCP_TOOLS_DIR=${OCP_TOOLS_DIR:-${DEFAULT_OCP_TOOLS_DIR}}
|
|
|
|
export OC_BINARY_DOWNLOAD_URL=${OC_BINARY_DOWNLOAD_URL:-${DEFAULT_OC_BINARY_DOWNLOAD_URL}}
|
|
|
|
DEFAULT_OPENSHIFT_USERNAME="developer"
|
|
export OPENSHIFT_USERNAME=${OPENSHIFT_USERNAME:-${DEFAULT_OPENSHIFT_USERNAME}}
|
|
|
|
DEFAULT_OPENSHIFT_PASSWORD="developer"
|
|
export OPENSHIFT_PASSWORD=${OPENSHIFT_PASSWORD:-${DEFAULT_OPENSHIFT_PASSWORD}}
|
|
|
|
DEFAULT_CHE_OPENSHIFT_PROJECT="eclipse-che"
|
|
export CHE_OPENSHIFT_PROJECT=${CHE_OPENSHIFT_PROJECT:-${DEFAULT_CHE_OPENSHIFT_PROJECT}}
|
|
|
|
DNS_PROVIDERS=(
|
|
xip.io
|
|
nip.codenvy-stg.com
|
|
)
|
|
DEFAULT_DNS_PROVIDER="nip.io"
|
|
export DNS_PROVIDER=${DNS_PROVIDER:-${DEFAULT_DNS_PROVIDER}}
|
|
|
|
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}}
|
|
|
|
# OKD config local dir
|
|
DEFAULT_OKD_DIR="${HOME}/.okd"
|
|
export OKD_DIR=${OKD_DIR:-${DEFAULT_OKD_DIR}}
|
|
mkdir -p ${OKD_DIR}
|
|
|
|
# Docker image and tag for ansible-service-broker. Currently nightly, since latest does not work
|
|
DEFAULT_ORIGIN_ANSIBLE_SERVICE_BROKER_IMAGE="ansibleplaybookbundle/origin-ansible-service-broker"
|
|
DEFAULT_ORIGIN_ANSIBLE_SERVICE_BROKER_TAG="nightly"
|
|
export ORIGIN_ANSIBLE_SERVICE_BROKER_IMAGE=${ORIGIN_ANSIBLE_SERVICE_BROKER_IMAGE:-${DEFAULT_ORIGIN_ANSIBLE_SERVICE_BROKER_IMAGE}}
|
|
export ORIGIN_ANSIBLE_SERVICE_BROKER_TAG=${ORIGIN_ANSIBLE_SERVICE_BROKER_TAG:-${DEFAULT_ORIGIN_ANSIBLE_SERVICE_BROKER_TAG}}
|
|
|
|
DEFAULT_WAIT_FOR_CHE=true
|
|
export WAIT_FOR_CHE=${WAIT_FOR_CHE:-${DEFAULT_WAIT_FOR_CHE}}
|
|
|
|
DEFAULT_SETUP_OCP_OAUTH=false
|
|
export SETUP_OCP_OAUTH=${SETUP_OCP_OAUTH:-${DEFAULT_SETUP_OCP_OAUTH}}
|
|
|
|
DEFAULT_OCP_IDENTITY_PROVIDER_ID=openshift-v3
|
|
export OCP_IDENTITY_PROVIDER_ID=${OCP_IDENTITY_PROVIDER_ID:-${DEFAULT_OCP_IDENTITY_PROVIDER_ID}}
|
|
|
|
DEFAULT_OCP_OAUTH_CLIENT_ID=ocp-client
|
|
export OCP_OAUTH_CLIENT_ID=${OCP_OAUTH_CLIENT_ID:-${DEFAULT_OCP_OAUTH_CLIENT_ID}}
|
|
|
|
DEFAULT_OCP_OAUTH_CLIENT_SECRET=ocp-client-secret
|
|
export OCP_OAUTH_CLIENT_SECRET=${OCP_OAUTH_CLIENT_SECRET:-${DEFAULT_OCP_OAUTH_CLIENT_SECRET}}
|
|
|
|
DEFAULT_KEYCLOAK_USER=admin
|
|
export KEYCLOAK_USER=${KEYCLOAK_USER:-${DEFAULT_KEYCLOAK_USER}}
|
|
|
|
DEFAULT_KEYCLOAK_PASSWORD=admin
|
|
export KEYCLOAK_PASSWORD=${KEYCLOAK_PASSWORD:-${DEFAULT_KEYCLOAK_PASSWORD}}
|
|
|
|
}
|
|
|
|
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() {
|
|
OC_BINARY="$OCP_TOOLS_DIR/oc"
|
|
OC_VERSION=$(echo $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 $OCP_TOOLS_DIR"
|
|
EXTRA_ARGS=""
|
|
else
|
|
OC_PACKAGE="openshift-origin-client-tools.tar.gz"
|
|
ARCH="tar --strip 1 -xzf"
|
|
EXTRA_ARGS="-C $OCP_TOOLS_DIR"
|
|
fi
|
|
|
|
download_oc() {
|
|
echo "download oc client $OC_VERSION"
|
|
wget -O $OCP_TOOLS_DIR/$OC_PACKAGE $OC_BINARY_DOWNLOAD_URL
|
|
eval "$ARCH" "$OCP_TOOLS_DIR"/"$OC_PACKAGE" "$EXTRA_ARGS" &>/dev/null
|
|
rm -f "$OCP_TOOLS_DIR"/README.md "$OCP_TOOLS_DIR"/LICENSE "${OCP_TOOLS_DIR:-/tmp}"/"$OC_PACKAGE"
|
|
}
|
|
|
|
if [[ $(oc version 2> /dev/null | grep "oc v" | cut -d " " -f2 | cut -d '+' -f1 || true) == *"$OC_VERSION"* ]]; then
|
|
echo "Found oc ${OC_VERSION} in PATH. Using it"
|
|
export OC_BINARY="oc"
|
|
elif [[ ! -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" "$OCP_TOOLS_DIR"/README.md "$OCP_TOOLS_DIR"/LICENSE
|
|
download_oc
|
|
fi
|
|
fi
|
|
export PATH=${PATH}:${OCP_TOOLS_DIR}
|
|
}
|
|
|
|
add_user_as_admin() {
|
|
$OC_BINARY login -u system:admin >/dev/null
|
|
echo "[OCP] adding cluster-admin role to user developer..."
|
|
$OC_BINARY adm policy add-cluster-role-to-user cluster-admin developer
|
|
}
|
|
|
|
wait_for_automation_service_broker() {
|
|
|
|
if [ "${APB}" == "true" ]; then
|
|
$OC_BINARY login -u system:admin
|
|
echo "[OCP] updating automation-broker configMap with admin sandbox role..."
|
|
$OC_BINARY get cm/broker-config -n=openshift-automation-service-broker -o=json | sed 's/edit/admin/g' | oc apply -f -
|
|
echo "[OCP] re-deploying openshift-automation-service-broker..."
|
|
$OC_BINARY rollout cancel dc/openshift-automation-service-broker -n=openshift-automation-service-broker
|
|
sleep 5
|
|
$OC_BINARY rollout latest dc/openshift-automation-service-broker -n=openshift-automation-service-broker
|
|
DESIRED_REPLICA_COUNT=1
|
|
CURRENT_REPLICA_COUNT=$(${OC_BINARY} get dc/openshift-automation-service-broker -n=openshift-automation-service-broker -o=jsonpath='{.status.availableReplicas}')
|
|
DEPLOYMENT_TIMEOUT_SEC=300
|
|
POLLING_INTERVAL_SEC=5
|
|
end=$((SECONDS+DEPLOYMENT_TIMEOUT_SEC))
|
|
while [ "${CURRENT_REPLICA_COUNT}" -ne "${DESIRED_REPLICA_COUNT}" ] && [ ${SECONDS} -lt ${end} ]; do
|
|
CURRENT_REPLICA_COUNT=$(${OC_BINARY} get dc/openshift-automation-service-broker -n=openshift-automation-service-broker -o=jsonpath='{.status.availableReplicas}')
|
|
timeout_in=$((end-SECONDS))
|
|
echo "Deployment is in progress...(Current replica count=${CURRENT_REPLICA_COUNT}, ${timeout_in} seconds remain)"
|
|
sleep ${POLLING_INTERVAL_SEC}
|
|
done
|
|
|
|
if [ "${CURRENT_REPLICA_COUNT}" -ne "${DESIRED_REPLICA_COUNT}" ]; then
|
|
printError "Automation Service Broker deployment failed. Aborting"
|
|
exit 1
|
|
elif [ ${SECONDS} -ge ${end} ]; then
|
|
printError "Deployment timeout. Aborting."
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
run_ocp() {
|
|
test_dns_provider
|
|
if [ "${APB}" == "true" ]; then
|
|
export ENABLE_COMPONENTS="--enable=service-catalog,router,registry,web-console,persistent-volumes,rhel-imagestreams,automation-service-broker"
|
|
echo "[OCP] start OKD with '${ENABLE_COMPONENTS}'"
|
|
fi
|
|
$OC_BINARY cluster up --public-hostname="${OC_PUBLIC_HOSTNAME}" \
|
|
--routing-suffix="${OC_PUBLIC_IP}.${DNS_PROVIDER}"
|
|
wait_for_automation_service_broker
|
|
}
|
|
|
|
deploy_che_to_ocp() {
|
|
if [ "${DEPLOY_CHE}" == "true" ];then
|
|
echo "Logging in to OpenShift cluster..."
|
|
$OC_BINARY login -u "${OPENSHIFT_USERNAME}" -p "${OPENSHIFT_PASSWORD}" > /dev/null
|
|
${BASE_DIR}/deploy_che.sh
|
|
fi
|
|
}
|
|
|
|
destroy_ocp() {
|
|
if [ -d "${OKD_DIR}" ]; then
|
|
docker run --rm -v ${OKD_DIR}:/to_remove alpine sh -c "rm -rf /to_remove/* > /dev/null 2>&1" || true
|
|
fi
|
|
docker run --rm -v /var/lib/origin:/to_remove alpine sh -c "rm -rf /to_remove/* > /dev/null 2>&1" || true
|
|
$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 exist."
|
|
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
|
|
--enable-apb - enable ansible service broker (APBs)
|
|
--admin - add cluster-admin role to developer user
|
|
--destroy - destroy ocp cluster
|
|
--deploy-che - deploy che to ocp
|
|
--project | -p - OpenShift namespace to deploy Che (defaults to eclipse-che). Example: --project=myproject
|
|
--secure | -s - Deploy Che with SSL enabled
|
|
--multiuser - deploy Che in multiuser mode
|
|
--postgres-debug - run PostgreSQL DB with Debug logging
|
|
--no-pull - IfNotPresent pull policy for Che server deployment
|
|
--rolling - rolling update strategy (Recreate is the default one)
|
|
--debug - deploy Che in a debug mode, create and expose debug route
|
|
--image-che - override default Che image. Example: --image-che=org/repo:tag. Tag is mandatory!
|
|
--remove-che - remove existing che project
|
|
--setup-ocp-oauth - register OCP oauth client and setup Keycloak and Che to use OpenShift Identity Provider
|
|
--deploy-che-plugin-registry - deploy Che plugin registry
|
|
--enable-tracing - Enable tracing and deploy Jaeger
|
|
===================================
|
|
ENV vars
|
|
CHE_IMAGE_TAG - set che-server image tag, default: 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
|
|
"
|
|
if [ $# -eq 0 ]; then
|
|
echo "No arguments supplied"
|
|
echo -e "$HELP"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$@" == *"--remove-che"* ]]; then
|
|
remove_che_from_ocp
|
|
fi
|
|
|
|
if [[ "$@" == *"--enable-apb"* ]]; then
|
|
export APB="true"
|
|
fi
|
|
|
|
for i in "${@}"
|
|
do
|
|
case $i in
|
|
--run-ocp)
|
|
run_ocp
|
|
shift
|
|
;;
|
|
--enable-apb)
|
|
shift
|
|
;;
|
|
--admin)
|
|
add_user_as_admin
|
|
shift
|
|
;;
|
|
--destroy)
|
|
destroy_ocp
|
|
shift
|
|
;;
|
|
--deploy-che)
|
|
DEPLOY_CHE=true
|
|
shift
|
|
;;
|
|
--multiuser)
|
|
export CHE_MULTIUSER=true
|
|
shift
|
|
;;
|
|
--postgres-debug)
|
|
export POSTGRESQL_LOG_DEBUG=true
|
|
shift
|
|
;;
|
|
--update)
|
|
shift
|
|
;;
|
|
-p=*| --project=*)
|
|
export CHE_OPENSHIFT_PROJECT="${i#*=}"
|
|
shift
|
|
;;
|
|
--no-pull)
|
|
export IMAGE_PULL_POLICY=IfNotPresent
|
|
export CHE_WORKSPACE_PLUGIN__BROKER_PULL__POLICY=IfNotPresent
|
|
shift
|
|
;;
|
|
--rolling)
|
|
export UPDATE_STRATEGY=Rolling
|
|
shift
|
|
;;
|
|
--debug)
|
|
export CHE_DEBUG_SERVER=true
|
|
shift
|
|
;;
|
|
--image-che=*)
|
|
export CHE_IMAGE_REPO=$(echo "${i#*=}" | sed 's/:.*//')
|
|
export CHE_IMAGE_TAG=$(echo "${i#*=}" | sed 's/.*://')
|
|
shift
|
|
;;
|
|
-s | --secure)
|
|
export ENABLE_SSL=true
|
|
shift
|
|
;;
|
|
--remove-che)
|
|
shift
|
|
;;
|
|
--setup-ocp-oauth)
|
|
export SETUP_OCP_OAUTH=true
|
|
shift
|
|
;;
|
|
--help)
|
|
echo -e "$HELP"
|
|
exit 1
|
|
;;
|
|
--deploy-che-plugin-registry)
|
|
export DEPLOY_CHE_PLUGIN_REGISTRY=true
|
|
shift
|
|
;;
|
|
--enable-tracing)
|
|
export CHE_TRACING_ENABLED=true
|
|
shift
|
|
;;
|
|
*)
|
|
echo "You've passed wrong arg '$i'."
|
|
echo -e "$HELP"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
init
|
|
get_tools
|
|
parse_args "$@"
|
|
deploy_che_to_ocp
|