From 2e9f479a1b06071e89b87674e6edc3ad31798cbc Mon Sep 17 00:00:00 2001 From: Tyler Jewell Date: Sat, 27 Aug 2016 13:16:00 -0700 Subject: [PATCH 1/2] Added compilation --- che.sh | 389 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 208 insertions(+), 181 deletions(-) diff --git a/che.sh b/che.sh index b25613b5fec..dacfef3ac69 100755 --- a/che.sh +++ b/che.sh @@ -52,6 +52,7 @@ init_global_variables() { DEFAULT_CHE_MOUNT_IMAGE_NAME="codenvy/che-mount" DEFAULT_CHE_ACTION_IMAGE_NAME="codenvy/che-action" DEFAULT_CHE_TEST_IMAGE_NAME="codenvy/che-test" + DEFAULT_CHE_DEV_IMAGE_NAME="codenvy/che-dev" DEFAULT_CHE_SERVER_CONTAINER_NAME="che-server" DEFAULT_CHE_VERSION="latest" DEFAULT_CHE_CLI_ACTION="help" @@ -64,6 +65,7 @@ init_global_variables() { CHE_MOUNT_IMAGE_NAME=${CHE_MOUNT_IMAGE_NAME:-${DEFAULT_CHE_MOUNT_IMAGE_NAME}} CHE_ACTION_IMAGE_NAME=${CHE_ACTION_IMAGE_NAME:-${DEFAULT_CHE_ACTION_IMAGE_NAME}} CHE_TEST_IMAGE_NAME=${CHE_TEST_IMAGE_NAME:-${DEFAULT_CHE_TEST_IMAGE_NAME}} + CHE_DEV_IMAGE_NAME=${CHE_DEV_IMAGE_NAME:-${DEFAULT_CHE_DEV_IMAGE_NAME}} CHE_SERVER_CONTAINER_NAME=${CHE_SERVER_CONTAINER_NAME:-${DEFAULT_CHE_SERVER_CONTAINER_NAME}} @@ -94,6 +96,7 @@ Usage: ${CHE_MINI_PRODUCT_NAME} [COMMAND] dir down Stop workspace running in current directory dir status Display status of ${CHE_MINI_PRODUCT_NAME} in current directory action [--help] Start action on ${CHE_MINI_PRODUCT_NAME} instance + compile SDK - Builds Che source code or modules test [--help] Start test on ${CHE_MINI_PRODUCT_NAME} instance info [ --all Run all debugging tests --server Run ${CHE_MINI_PRODUCT_NAME} launcher and server debugging tests @@ -126,7 +129,7 @@ parse_command_line () { CHE_CLI_ACTION="help" else case $1 in - start|stop|restart|update|info|profile|action|dir|mount|test|help|-h|--help) + start|stop|restart|update|info|profile|action|dir|mount|compile|test|help|-h|--help) CHE_CLI_ACTION=$1 ;; *) @@ -339,182 +342,17 @@ check_current_image_and_update_if_not_found() { fi } +########################################################################### +### END HELPER FUNCTIONS +### +### START CLI COMMANDS +########################################################################### + execute_che_launcher() { check_current_image_and_update_if_not_found ${CHE_LAUNCHER_IMAGE_NAME} docker_run "${CHE_LAUNCHER_IMAGE_NAME}":"${CHE_VERSION}" "${CHE_CLI_ACTION}" || true } -execute_che_dir() { - check_current_image_and_update_if_not_found ${CHE_DIR_IMAGE_NAME} - CURRENT_DIRECTORY=$(get_mount_path "${PWD}") - docker_run -v "$CURRENT_DIRECTORY":"$CURRENT_DIRECTORY" "${CHE_DIR_IMAGE_NAME}":"${CHE_VERSION}" "${CURRENT_DIRECTORY}" "$@" -} - -execute_che_action() { - check_current_image_and_update_if_not_found ${CHE_ACTION_IMAGE_NAME} - docker_run "${CHE_ACTION_IMAGE_NAME}":"${CHE_VERSION}" "$@" -} - - -update_che_image() { - if [ -z "${CHE_VERSION}" ]; then - CHE_VERSION=${DEFAULT_CHE_VERSION} - fi - - info "${CHE_PRODUCT_NAME}: Pulling image $1:${CHE_VERSION}" - docker pull $1:${CHE_VERSION} - echo "" -} - -mount_local_directory() { - if [ ! $# -eq 3 ]; then - error "che mount: Wrong number of arguments provided." - return - fi - - MOUNT_PATH=$(get_mount_path "${2}") - - if [ ! -e "${MOUNT_PATH}" ]; then - error "che mount: Path provided does not exist." - return - fi - - if [ ! -d "${MOUNT_PATH}" ]; then - error "che mount: Path provided is not a valid directory." - return - fi - - docker_run --cap-add SYS_ADMIN \ - --device /dev/fuse \ - -v "${MOUNT_PATH}":/mnthost \ - "${CHE_MOUNT_IMAGE_NAME}":"${CHE_VERSION}" "${GLOBAL_GET_DOCKER_HOST_IP}" $3 -} - -execute_che_debug() { - - if [ $# -eq 1 ]; then - TESTS="--server" - else - TESTS=$2 - fi - - case $TESTS in - --all|-all) - print_che_cli_debug - execute_che_launcher - run_connectivity_tests - execute_che_test post-flight-check "$@" - ;; - --cli|-cli) - print_che_cli_debug - ;; - --networking|-networking) - run_connectivity_tests - ;; - --server|-server) - print_che_cli_debug - execute_che_launcher - ;; - --create|-create) - execute_che_test "$@" - ;; - *) - debug "Unknown debug flag passed: $2. Exiting." - ;; - esac -} - - -execute_che_test() { - check_current_image_and_update_if_not_found ${CHE_TEST_IMAGE_NAME} - docker_run "${CHE_TEST_IMAGE_NAME}":"${CHE_VERSION}" "$@" -} - -print_che_cli_debug() { - debug "---------------------------------------" - debug "--------- CLI DEBUG INFO --------" - debug "---------------------------------------" - debug "" - debug "--------- PLATFORM INFO -------------" - debug "CLI DEFAULT PROFILE = $(has_default_profile && echo $(get_default_profile) || echo "not set")" - debug "DOCKER_INSTALL_TYPE = $(get_docker_install_type)" - debug "DOCKER_HOST_IP = ${GLOBAL_GET_DOCKER_HOST_IP}" - debug "IS_DOCKER_FOR_WINDOWS = $(is_docker_for_windows && echo "YES" || echo "NO")" - debug "IS_DOCKER_FOR_MAC = $(is_docker_for_mac && echo "YES" || echo "NO")" - debug "IS_BOOT2DOCKER = $(is_boot2docker && echo "YES" || echo "NO")" - debug "IS_NATIVE = $(is_native && echo "YES" || echo "NO")" - debug "HAS_DOCKER_FOR_WINDOWS_IP = $(has_docker_for_windows_ip && echo "YES" || echo "NO")" - debug "IS_MOBY_VM = $(is_moby_vm && echo "YES" || echo "NO")" - debug "" -} - -run_connectivity_tests() { - debug "" - debug "---------------------------------------" - debug "-------- CONNECTIVITY TEST --------" - debug "---------------------------------------" - # Start a fake workspace agent - docker_exec run -d -p 12345:80 --name fakeagent alpine httpd -f -p 80 -h /etc/ > /dev/null - - AGENT_INTERNAL_IP=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' fakeagent) - AGENT_INTERNAL_PORT=80 - AGENT_EXTERNAL_IP=$GLOBAL_GET_DOCKER_HOST_IP - AGENT_EXTERNAL_PORT=12345 - - - ### TEST 1: Simulate browser ==> workspace agent HTTP connectivity - HTTP_CODE=$(curl -I $(get_che_hostname):${AGENT_EXTERNAL_PORT}/alpine-release \ - -s -o /dev/null --connect-timeout 5 \ - --write-out "%{http_code}") || echo "28" > /dev/null - - if [ "${HTTP_CODE}" = "200" ]; then - debug "Browser => Workspace Agent (Hostname) : Connection succeeded" - else - debug "Browser => Workspace Agent (Hostname) : Connection failed" - fi - - ### TEST 1a: Simulate browser ==> workspace agent HTTP connectivity - HTTP_CODE=$(curl -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ - -s -o /dev/null --connect-timeout 5 \ - --write-out "%{http_code}") || echo "28" > /dev/null - - if [ "${HTTP_CODE}" = "200" ]; then - debug "Browser => Workspace Agent (External IP): Connection succeeded" - else - debug "Browser => Workspace Agent (External IP): Connection failed" - fi - - ### TEST 2: Simulate Che server ==> workspace agent (external IP) connectivity - export HTTP_CODE=$(docker run --rm --name fakeserver \ - --entrypoint=curl \ - codenvy/che-server:${DEFAULT_CHE_VERSION} \ - -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ - -s -o /dev/null \ - --write-out "%{http_code}") - - if [ "${HTTP_CODE}" = "200" ]; then - debug "Che Server => Workspace Agent (External IP): Connection succeeded" - else - debug "Che Server => Workspace Agent (External IP): Connection failed" - fi - - ### TEST 3: Simulate Che server ==> workspace agent (internal IP) connectivity - export HTTP_CODE=$(docker run --rm --name fakeserver \ - --entrypoint=curl \ - codenvy/che-server:${DEFAULT_CHE_VERSION} \ - -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ - -s -o /dev/null \ - --write-out "%{http_code}") - - if [ "${HTTP_CODE}" = "200" ]; then - debug "Che Server => Workspace Agent (Internal IP): Connection succeeded" - else - debug "Che Server => Workspace Agent (Internal IP): Connection failed" - fi - - docker rm -f fakeagent > /dev/null -} - execute_profile(){ if [ ! $# -ge 2 ]; then @@ -565,7 +403,7 @@ execute_profile(){ echo "CHE_SERVER_CONTAINER_NAME=$CHE_SERVER_CONTAINER_NAME" >> ~/.che/profiles/"${3}" # Add all other variables to the profile - env | grep CHE_ >> ~/.che/profiles/"${3}" + env | grep CHE_ >> ~/.che/profiles/"${3}" || true # Remove duplicates, if any cat ~/.che/profiles/"${3}" | sort | uniq > ~/.che/profiles/tmp @@ -700,6 +538,188 @@ load_profile() { fi } +execute_che_dir() { + check_current_image_and_update_if_not_found ${CHE_DIR_IMAGE_NAME} + CURRENT_DIRECTORY=$(get_mount_path "${PWD}") + docker_run -v "$CURRENT_DIRECTORY":"$CURRENT_DIRECTORY" "${CHE_DIR_IMAGE_NAME}":"${CHE_VERSION}" "${CURRENT_DIRECTORY}" "$@" +} + +execute_che_action() { + check_current_image_and_update_if_not_found ${CHE_ACTION_IMAGE_NAME} + docker_run "${CHE_ACTION_IMAGE_NAME}":"${CHE_VERSION}" "$@" +} + +update_che_image() { + if [ -z "${CHE_VERSION}" ]; then + CHE_VERSION=${DEFAULT_CHE_VERSION} + fi + + info "${CHE_PRODUCT_NAME}: Pulling image $1:${CHE_VERSION}" + docker pull $1:${CHE_VERSION} + echo "" +} + +execute_che_mount() { + if [ ! $# -eq 3 ]; then + error "${CHE_MINI_PRODUCT_NAME} mount: Wrong number of arguments provided." + return + fi + + MOUNT_PATH=$(get_mount_path "${2}") + + if [ ! -e "${MOUNT_PATH}" ]; then + error "${CHE_MINI_PRODUCT_NAME} mount: Path provided does not exist." + return + fi + + if [ ! -d "${MOUNT_PATH}" ]; then + error "${CHE_MINI_PRODUCT_NAME} mount: Path provided is not a valid directory." + return + fi + + docker_run --cap-add SYS_ADMIN \ + --device /dev/fuse \ + -v "${MOUNT_PATH}":/mnthost \ + "${CHE_MOUNT_IMAGE_NAME}":"${CHE_VERSION}" "${GLOBAL_GET_DOCKER_HOST_IP}" $3 +} + +execute_che_compile() { + if [ $# -eq 0 ]; then + error "${CHE_MINI_PRODUCT_NAME} compile: Missing argument - pass compilation command as paramters." + return + fi + + check_current_image_and_update_if_not_found ${CHE_DEV_IMAGE_NAME} + CURRENT_DIRECTORY=$(get_mount_path "${PWD}") + docker_run -v "$CURRENT_DIRECTORY":/home/user/che-build \ + -v "$HOME/.m2:/home/user/.m2" \ + -w /home/user/che-build \ + "${CHE_DEV_IMAGE_NAME}":"${CHE_VERSION}" "$@" +} + +execute_che_test() { + check_current_image_and_update_if_not_found ${CHE_TEST_IMAGE_NAME} + docker_run "${CHE_TEST_IMAGE_NAME}":"${CHE_VERSION}" "$@" +} + +execute_che_info() { + if [ $# -eq 1 ]; then + TESTS="--server" + else + TESTS=$2 + fi + + case $TESTS in + --all|-all) + print_che_cli_debug + execute_che_launcher + run_connectivity_tests + execute_che_test post-flight-check "$@" + ;; + --cli|-cli) + print_che_cli_debug + ;; + --networking|-networking) + run_connectivity_tests + ;; + --server|-server) + print_che_cli_debug + execute_che_launcher + ;; + --create|-create) + execute_che_test "$@" + ;; + *) + debug "Unknown debug flag passed: $2. Exiting." + ;; + esac +} + +print_che_cli_debug() { + debug "---------------------------------------" + debug "--------- CLI DEBUG INFO --------" + debug "---------------------------------------" + debug "" + debug "--------- PLATFORM INFO -------------" + debug "CLI DEFAULT PROFILE = $(has_default_profile && echo $(get_default_profile) || echo "not set")" + debug "DOCKER_INSTALL_TYPE = $(get_docker_install_type)" + debug "DOCKER_HOST_IP = ${GLOBAL_GET_DOCKER_HOST_IP}" + debug "IS_DOCKER_FOR_WINDOWS = $(is_docker_for_windows && echo "YES" || echo "NO")" + debug "IS_DOCKER_FOR_MAC = $(is_docker_for_mac && echo "YES" || echo "NO")" + debug "IS_BOOT2DOCKER = $(is_boot2docker && echo "YES" || echo "NO")" + debug "IS_NATIVE = $(is_native && echo "YES" || echo "NO")" + debug "HAS_DOCKER_FOR_WINDOWS_IP = $(has_docker_for_windows_ip && echo "YES" || echo "NO")" + debug "IS_MOBY_VM = $(is_moby_vm && echo "YES" || echo "NO")" + debug "" +} + +run_connectivity_tests() { + debug "" + debug "---------------------------------------" + debug "-------- CONNECTIVITY TEST --------" + debug "---------------------------------------" + # Start a fake workspace agent + docker_exec run -d -p 12345:80 --name fakeagent alpine httpd -f -p 80 -h /etc/ > /dev/null + + AGENT_INTERNAL_IP=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' fakeagent) + AGENT_INTERNAL_PORT=80 + AGENT_EXTERNAL_IP=$GLOBAL_GET_DOCKER_HOST_IP + AGENT_EXTERNAL_PORT=12345 + + + ### TEST 1: Simulate browser ==> workspace agent HTTP connectivity + HTTP_CODE=$(curl -I $(get_che_hostname):${AGENT_EXTERNAL_PORT}/alpine-release \ + -s -o /dev/null --connect-timeout 5 \ + --write-out "%{http_code}") || echo "28" > /dev/null + + if [ "${HTTP_CODE}" = "200" ]; then + debug "Browser => Workspace Agent (Hostname) : Connection succeeded" + else + debug "Browser => Workspace Agent (Hostname) : Connection failed" + fi + + ### TEST 1a: Simulate browser ==> workspace agent HTTP connectivity + HTTP_CODE=$(curl -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ + -s -o /dev/null --connect-timeout 5 \ + --write-out "%{http_code}") || echo "28" > /dev/null + + if [ "${HTTP_CODE}" = "200" ]; then + debug "Browser => Workspace Agent (External IP): Connection succeeded" + else + debug "Browser => Workspace Agent (External IP): Connection failed" + fi + + ### TEST 2: Simulate Che server ==> workspace agent (external IP) connectivity + export HTTP_CODE=$(docker run --rm --name fakeserver \ + --entrypoint=curl \ + codenvy/che-server:${DEFAULT_CHE_VERSION} \ + -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ + -s -o /dev/null \ + --write-out "%{http_code}") + + if [ "${HTTP_CODE}" = "200" ]; then + debug "Che Server => Workspace Agent (External IP): Connection succeeded" + else + debug "Che Server => Workspace Agent (External IP): Connection failed" + fi + + ### TEST 3: Simulate Che server ==> workspace agent (internal IP) connectivity + export HTTP_CODE=$(docker run --rm --name fakeserver \ + --entrypoint=curl \ + codenvy/che-server:${DEFAULT_CHE_VERSION} \ + -I ${AGENT_EXTERNAL_IP}:${AGENT_EXTERNAL_PORT}/alpine-release \ + -s -o /dev/null \ + --write-out "%{http_code}") + + if [ "${HTTP_CODE}" = "200" ]; then + debug "Che Server => Workspace Agent (Internal IP): Connection succeeded" + else + debug "Che Server => Workspace Agent (Internal IP): Connection failed" + fi + + docker rm -f fakeagent > /dev/null +} + # See: https://sipb.mit.edu/doc/safe-shell/ set -e set -u @@ -734,12 +754,6 @@ case ${CHE_CLI_ACTION} in load_profile execute_che_action "$@" ;; - test) - # remove "test" arg by shifting it - shift - load_profile - execute_che_test "$@" - ;; update) load_profile update_che_image ${CHE_LAUNCHER_IMAGE_NAME} @@ -747,17 +761,30 @@ case ${CHE_CLI_ACTION} in update_che_image ${CHE_DIR_IMAGE_NAME} update_che_image ${CHE_ACTION_IMAGE_NAME} update_che_image ${CHE_TEST_IMAGE_NAME} + update_che_image ${CHE_DEV_IMAGE_NAME} # Delegate updating che-server to the launcher execute_che_launcher ;; mount) load_profile - mount_local_directory "$@" + execute_che_mount "$@" + ;; + compile) + # remove "compile" arg by shifting it + shift + load_profile + execute_che_compile "$@" + ;; + test) + # remove "test" arg by shifting it + shift + load_profile + execute_che_test "$@" ;; info) load_profile - execute_che_debug "$@" + execute_che_info "$@" ;; help) usage From 3d032fc775f2a0f4ba47756aa61618ad81e0d9ac Mon Sep 17 00:00:00 2001 From: Tyler Jewell Date: Sat, 27 Aug 2016 16:30:20 -0700 Subject: [PATCH 2/2] Added property converter --- che.sh | 129 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 103 insertions(+), 26 deletions(-) diff --git a/che.sh b/che.sh index dacfef3ac69..48f67f5ef65 100755 --- a/che.sh +++ b/che.sh @@ -56,6 +56,7 @@ init_global_variables() { DEFAULT_CHE_SERVER_CONTAINER_NAME="che-server" DEFAULT_CHE_VERSION="latest" DEFAULT_CHE_CLI_ACTION="help" + DEFAULT_IS_INTERACTIVE="true" CHE_PRODUCT_NAME=${CHE_PRODUCT_NAME:-${DEFAULT_CHE_PRODUCT_NAME}} CHE_MINI_PRODUCT_NAME=${CHE_MINI_PRODUCT_NAME:-${DEFAULT_CHE_MINI_PRODUCT_NAME}} @@ -66,11 +67,10 @@ init_global_variables() { CHE_ACTION_IMAGE_NAME=${CHE_ACTION_IMAGE_NAME:-${DEFAULT_CHE_ACTION_IMAGE_NAME}} CHE_TEST_IMAGE_NAME=${CHE_TEST_IMAGE_NAME:-${DEFAULT_CHE_TEST_IMAGE_NAME}} CHE_DEV_IMAGE_NAME=${CHE_DEV_IMAGE_NAME:-${DEFAULT_CHE_DEV_IMAGE_NAME}} - CHE_SERVER_CONTAINER_NAME=${CHE_SERVER_CONTAINER_NAME:-${DEFAULT_CHE_SERVER_CONTAINER_NAME}} - CHE_VERSION=${CHE_VERSION:-${DEFAULT_CHE_VERSION}} CHE_CLI_ACTION=${CHE_CLI_ACTION:-${DEFAULT_CHE_CLI_ACTION}} + IS_INTERACTIVE=${IS_INTERACTIVE:-${DEFAULT_IS_INTERACTIVE}} GLOBAL_NAME_MAP=$(docker info | grep "Name:" | cut -d" " -f2) GLOBAL_HOST_ARCH=$(docker version --format {{.Client}} | cut -d" " -f5) @@ -149,17 +149,50 @@ docker_exec() { } docker_run() { - ENV_VARS=$(get_list_of_che_system_environment_variables) + docker_exec run --rm -v /var/run/docker.sock:/var/run/docker.sock "$@" +} - if [ "$ENV_VARS" = "" ]; then - docker_exec run --rm -it -v /var/run/docker.sock:/var/run/docker.sock "$@" +docker_run_with_env_file() { + if has_che_env_variables; then + get_list_of_che_system_environment_variables + docker_run --env-file="tmp" "$@" + rm -rf "tmp" > /dev/null else - docker_exec run --rm -it -v /var/run/docker.sock:/var/run/docker.sock \ - --env-file="tmp" "$@" + docker_run "$@" fi +} - # Remove temporary file -- only due to POSIX weirdness with --env-file - rm -rf "tmp" > /dev/null 2>&1 +docker_run_with_interactive() { + if has_interactive; then + docker_run_with_env_file -it "$@" + else + docker_run_with_env_file -t "$@" + fi +} + +docker_run_with_che_properties() { + if [ ! -z ${CHE_CONF_FOLDER+x} ]; then + + # Configuration directory set by user - this has precedence. + docker_run_with_interactive -e "CHE_CONF_FOLDER=${CHE_CONF_FOLDER}" "$@" + else + if has_che_properties; then + # No user configuration directory, but CHE_PROPERTY_ values set + generate_temporary_che_properties_file + docker_run_with_interactive -e "CHE_CONF_FOLDER=$(get_mount_path ~/.che/conf)" "$@" + rm -rf ~/.che/conf/che.properties > /dev/null + else + docker_run_with_interactive "$@" + fi + fi +} + +has_interactive() { + if [ "${IS_INTERACTIVE}" = "true" ]; then + return 0 + else + return 1 + fi } get_docker_host_ip() { @@ -294,43 +327,45 @@ get_che_hostname() { fi } +has_che_env_variables() { + PROPERTIES=$(env | grep CHE_) + + if [ "$PROPERTIES" = "" ]; then + return 1 + else + return 0 + fi +} + get_list_of_che_system_environment_variables() { # See: http://stackoverflow.com/questions/4128235/what-is-the-exact-meaning-of-ifs-n IFS=$'\n' DOCKER_ENV="tmp" - RETURN="" touch "tmp" if has_default_profile; then cat ~/.che/profiles/${CHE_PROFILE} >> $DOCKER_ENV - RETURN=$DOCKER_ENV else CHE_VARIABLES=$(env | grep CHE_) if [ ! -z ${CHE_VARIABLES+x} ]; then env | grep CHE_ >> $DOCKER_ENV - RETURN=$DOCKER_ENV fi # Add in known proxy variables if [ ! -z ${http_proxy+x} ]; then echo "http_proxy=${http_proxy}" >> $DOCKER_ENV - RETURN=$DOCKER_ENV fi if [ ! -z ${https_proxy+x} ]; then echo "https_proxy=${https_proxy}" >> $DOCKER_ENV - RETURN=$DOCKER_ENV fi if [ ! -z ${no_proxy+x} ]; then echo "no_proxy=${no_proxy}" >> $DOCKER_ENV - RETURN=$DOCKER_ENV fi fi - - echo $RETURN } check_current_image_and_update_if_not_found() { @@ -342,6 +377,45 @@ check_current_image_and_update_if_not_found() { fi } +has_che_properties() { + PROPERTIES=$(env | grep CHE_PROPERTY_) + + if [ "$PROPERTIES" = "" ]; then + return 1 + else + return 0 + fi +} + +generate_temporary_che_properties_file() { + if has_che_properties; then + test -d ~/.che/conf || mkdir -p ~/.che/conf + touch ~/.che/conf/che.properties + + # Get list of properties + PROPERTIES_ARRAY=($(env | grep CHE_PROPERTY_)) + for PROPERTY in "${PROPERTIES_ARRAY[@]}" + do + # CHE_PROPERTY_NAME=value ==> NAME=value + PROPERTY_WITHOUT_PREFIX=${PROPERTY#CHE_PROPERTY_} + + # NAME=value ==> separate name / value into different variables + PROPERTY_NAME=$(echo $PROPERTY_WITHOUT_PREFIX | cut -f1 -d=) + PROPERTY_VALUE=$(echo $PROPERTY_WITHOUT_PREFIX | cut -f2 -d=) + + # Replace "_" in names to periods + + # Replace "_" in names to periods + CONVERTED_PROPERTY_NAME=$(echo "$PROPERTY_NAME" | tr _ .) + + # Replace ".." in names to "_" + SUPER_CONVERTED_PROPERTY_NAME="${CONVERTED_PROPERTY_NAME//../_}" + + echo "$SUPER_CONVERTED_PROPERTY_NAME=$PROPERTY_VALUE" >> ~/.che/conf/che.properties + done + fi +} + ########################################################################### ### END HELPER FUNCTIONS ### @@ -350,7 +424,7 @@ check_current_image_and_update_if_not_found() { execute_che_launcher() { check_current_image_and_update_if_not_found ${CHE_LAUNCHER_IMAGE_NAME} - docker_run "${CHE_LAUNCHER_IMAGE_NAME}":"${CHE_VERSION}" "${CHE_CLI_ACTION}" || true + docker_run_with_che_properties "${CHE_LAUNCHER_IMAGE_NAME}":"${CHE_VERSION}" "${CHE_CLI_ACTION}" || true } execute_profile(){ @@ -541,12 +615,12 @@ load_profile() { execute_che_dir() { check_current_image_and_update_if_not_found ${CHE_DIR_IMAGE_NAME} CURRENT_DIRECTORY=$(get_mount_path "${PWD}") - docker_run -v "$CURRENT_DIRECTORY":"$CURRENT_DIRECTORY" "${CHE_DIR_IMAGE_NAME}":"${CHE_VERSION}" "${CURRENT_DIRECTORY}" "$@" + docker_run_with_che_properties -v "$CURRENT_DIRECTORY":"$CURRENT_DIRECTORY" "${CHE_DIR_IMAGE_NAME}":"${CHE_VERSION}" "${CURRENT_DIRECTORY}" "$@" } execute_che_action() { check_current_image_and_update_if_not_found ${CHE_ACTION_IMAGE_NAME} - docker_run "${CHE_ACTION_IMAGE_NAME}":"${CHE_VERSION}" "$@" + docker_run_with_che_properties "${CHE_ACTION_IMAGE_NAME}":"${CHE_VERSION}" "$@" } update_che_image() { @@ -577,7 +651,7 @@ execute_che_mount() { return fi - docker_run --cap-add SYS_ADMIN \ + docker_run_with_che_properties --cap-add SYS_ADMIN \ --device /dev/fuse \ -v "${MOUNT_PATH}":/mnthost \ "${CHE_MOUNT_IMAGE_NAME}":"${CHE_VERSION}" "${GLOBAL_GET_DOCKER_HOST_IP}" $3 @@ -591,15 +665,15 @@ execute_che_compile() { check_current_image_and_update_if_not_found ${CHE_DEV_IMAGE_NAME} CURRENT_DIRECTORY=$(get_mount_path "${PWD}") - docker_run -v "$CURRENT_DIRECTORY":/home/user/che-build \ - -v "$HOME/.m2:/home/user/.m2" \ - -w /home/user/che-build \ - "${CHE_DEV_IMAGE_NAME}":"${CHE_VERSION}" "$@" + docker_run_with_che_properties -v "$CURRENT_DIRECTORY":/home/user/che-build \ + -v "$(get_mount_path ~/.m2):/home/user/.m2" \ + -w /home/user/che-build \ + "${CHE_DEV_IMAGE_NAME}":"${CHE_VERSION}" "$@" } execute_che_test() { check_current_image_and_update_if_not_found ${CHE_TEST_IMAGE_NAME} - docker_run "${CHE_TEST_IMAGE_NAME}":"${CHE_VERSION}" "$@" + docker_run_with_che_properties "${CHE_TEST_IMAGE_NAME}":"${CHE_VERSION}" "$@" } execute_che_info() { @@ -650,6 +724,9 @@ print_che_cli_debug() { debug "IS_NATIVE = $(is_native && echo "YES" || echo "NO")" debug "HAS_DOCKER_FOR_WINDOWS_IP = $(has_docker_for_windows_ip && echo "YES" || echo "NO")" debug "IS_MOBY_VM = $(is_moby_vm && echo "YES" || echo "NO")" + debug "HAS_CHE_ENV_VARIABLES = $(has_che_env_variables && echo "YES" || echo "NO")" + debug "HAS_TEMP_CHE_PROPERTIES = $(has_che_properties && echo "YES" || echo "NO")" + debug "HAS_INTERACTIVE = $(has_interactive && echo "YES" || echo "NO")" debug "" }