diff --git a/README.md b/README.md index dede67b..b090a18 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Additionally, this script will automatically configure those tools for use with This is designed and tested for Linux and MacOS X. -This code also requires [the Triton CLI tools](https://docs.joyent.com/public-cloud/api-access/cloudapi) and [a Triton account](https://docs.joyent.com/public-cloud/getting-started) on either the Triton Public Cloud (Joyent public cloud) or in a private cloud powered by Triton. +This code also requires [the Triton CLI tools](https://docs.joyent.com/public-cloud/api-access/cloudapi) and [a Triton account](https://docs.joyent.com/public-cloud/getting-started) on either Triton public cloud (Joyent public cloud) or in a private cloud powered by Triton. Use of this software also requires [a Triton profile configured in the Triton CLI tool](https://docs.joyent.com/public-cloud/api-access/cloudapi#configuration). @@ -17,7 +17,7 @@ Use of this software also requires [a Triton profile configured in the Triton CL In a terminal window, run the following command: ```bash -sudo curl -o /usr/local/bin/triton-docker https://raw.githubusercontent.com/joyent/triton-docker-cli/master/triton-docker && chmod +x /usr/local/bin/triton-docker && ln -Fs /usr/local/bin/triton-docker /usr/local/bin/triton-compose && ln -Fs /usr/local/bin/triton-docker /usr/local/bin/triton-docker-install +sudo bash -c 'curl -o /usr/local/bin/triton-docker https://raw.githubusercontent.com/joyent/triton-docker-cli/master/triton-docker && chmod +x /usr/local/bin/triton-docker && ln -Fs /usr/local/bin/triton-docker /usr/local/bin/triton-compose && ln -Fs /usr/local/bin/triton-docker /usr/local/bin/triton-docker-install' ``` That command will copy the `triton-docker` shell script from this repo, and link it as `triton-compose` and `triton-docker-install`. @@ -58,6 +58,26 @@ More about: - [Docker Compose on Triton](https://www.joyent.com/blog/using-docker-compose) - [Optimizing your Docker operations for Triton](https://www.joyent.com/blog/optimizing-docker-on-triton) +### Triton Container Name Service helpers + +This will also set some helpful environment variables for using [Triton Container Name Service (CNS)](https://docs.joyent.com/public-cloud/network/cns): + +- `TRITON_CNS_SEARCH_DOMAIN_PUBLIC` +- `TRITON_CNS_SEARCH_DOMAIN_PRIVATE` + +Those vars will be automatically set with values appropriate for use in Triton Public Cloud: + +``` +TRITON_CNS_SEARCH_DOMAIN_PRIVATE=a42e7881-89d2-459e-bc0b-e9af0bca409a.us-east-3.cns.joyent.com +TRITON_CNS_SEARCH_DOMAIN_PUBLIC=a42e7881-89d2-459e-bc0b-e9af0bca409a.us-east-3.triton.zone +``` + +#### Notes and cautions about CNS env vars + +- The mechanism that sets these environment vars only works for Triton Public Cloud. To use Triton Docker CLI with private cloud implementations of Triton, please set the `TRITON_CNS_SEARCH_DOMAIN_PUBLIC` and `TRITON_CNS_SEARCH_DOMAIN_PRIVATE` vars manually +- These environment variables will be removed following the completion of [CNS-164](https://smartos.org/bugview/CNS-164) and [DOCKER-898](https://smartos.org/bugview/DOCKER-898), which will automatically set the DNS search domain to these values +- [CNS-164](https://smartos.org/bugview/CNS-164) and [DOCKER-898](https://smartos.org/bugview/DOCKER-898) will also work on private cloud implementations of Triton, solving the problem for everybody + ### Components In addition to the shell script in this repo, this script will install: diff --git a/triton-docker b/triton-docker old mode 100644 new mode 100755 index f79c962..9fd8f94 --- a/triton-docker +++ b/triton-docker @@ -1,5 +1,5 @@ #!/bin/bash -set -e +set -e -o pipefail triton_docker_version=1.12.6 triton_compose_version=1.9.0 @@ -14,28 +14,16 @@ function checkCurlInstalled () { command -v curl >/dev/null 2>&1 || { echo >&2 "curl is required to complete this installation. Please install before continuing."; exit 1; } } -# Emit the current Triton profile and time -function currentProfile () { - if [ -n "$TRITON_PROFILE" ] - then - local profile_source='via env var; use `eval "$(triton env )"` to change' - else - local profile_source='default; use `triton profile set ` to change' - fi - - echo "Executing in '$(triton profile get | awk 'NR == 1 {print $2}')' (${profile_source}) at $(date +'%r')" -} - # Check if the Docker binary (named triton-docker-helper) # and Docker Compose (named triton-compose-helper) are installed and executable function checkDockerInstalled () { if [ ! -f /usr/local/bin/triton-docker-helper ] || [ ! -x /usr/local/bin/triton-docker-helper ] || - [ "${triton_docker_version}," != $(/usr/local/bin/triton-docker-helper -v | awk '{print $3}') ] || + [ "${triton_docker_version}," != "$(/usr/local/bin/triton-docker-helper -v | awk '{print $3}')" ] || [ ! -f /usr/local/bin/triton-compose-helper ] || [ ! -x /usr/local/bin/triton-compose-helper ] || - [ "${triton_compose_version}," != $(/usr/local/bin/triton-compose-helper -v | awk '{print $3}') ] + [ "${triton_compose_version}," != "$(/usr/local/bin/triton-compose-helper -v | awk '{print $3}')" ] then echo 'Additional or updated components are required.' echo 'Please run `sudo triton-docker-install` to continue.' @@ -55,7 +43,7 @@ function install () { # Install the specific version of Docker for Triton rm -Rf /tmp/triton-docker /usr/local/bin/triton-docker-helper mkdir -p /tmp/triton-docker - curl https://get.docker.com/builds/$(uname -a | awk '{ print $1 }')/x86_64/docker-${triton_docker_version}.tgz | tar zxvf - -C /tmp/triton-docker + curl https://get.docker.com/builds/"$(uname -a | awk '{ print $1 }')"/x86_64/docker-${triton_docker_version}.tgz | tar zxvf - -C /tmp/triton-docker mv /tmp/triton-docker/docker/docker /usr/local/bin/triton-docker-helper rm -Rf /tmp/triton-docker chmod +x /usr/local/bin/triton-docker-helper @@ -64,30 +52,101 @@ function install () { echo # Install the specific version of Docker Compose for Triton - curl -Lo /usr/local/bin/triton-compose-helper https://github.com/docker/compose/releases/download/${triton_compose_version}/docker-compose-$(uname -a | awk '{ print $1 }')-x86_64 + curl -Lo /usr/local/bin/triton-compose-helper https://github.com/docker/compose/releases/download/${triton_compose_version}/docker-compose-"$(uname -a | awk '{ print $1 }')"-x86_64 chmod +x /usr/local/bin/triton-compose-helper echo "The triton-compose-helper is now installed." echo } +# Emit the current Triton profile and time +function currentProfile () { + if [ -n "$TRITON_PROFILE" ] + then + local profile_source='via env var; use `eval "$(triton env )"` to change' + else + local profile_source='default; use `triton profile set ` to change' + fi + + # Get and the user's account information and CloudAPI URL for parsing later + local triton_account="$(triton account get)" + + echo "Executing in '$(echo "${triton_account}" | awk 'NR == 1 {print $2}')' (${profile_source})" + + # Check if CNS is enabled, require it + if [ ! "true" == "$(echo "${triton_account}" | awk -F": " '/^triton_cns_enabled:/{print $2}')" ] + then + echo + tput rev # reverse + tput bold # bold + echo 'Warning! Triton CNS is not enabled.' + tput sgr0 # clear + echo + echo 'Please run the following to activate:' + echo ' triton account update triton_cns_enabled=true' + echo + fi +} + +# Set env vars to make using CNS easier +function cnsEnvVars () { + + # If the CNS env vars are already set, don't bother continuing + if [ -n "$TRITON_CNS_SEARCH_DOMAIN_PUBLIC" ] && [ -n "$TRITON_CNS_SEARCH_DOMAIN_PRIVATE" ] + then + return + fi + + # Get and the user's account information and CloudAPI URL for parsing later + local triton_account="$(triton account get)" + local triton_url="$(triton profile get | awk -F"/" '/url:/{print $3}')" + + # Do not continue if the target is not a Triton Public Cloud data center + if [ ! ".api.joyent.com" == "${triton_url: -15}" ] + then + return + fi + + # Get the user's UUID + local triton_account_uuid="$(echo "${triton_account}" | awk -F": " '/^id:/{print $2}')" + + # Get current data center name + # Note: this makes assumptions that work in our public cloud, but might not work elsewhere + # Further note: set TRITON_CNS_SUFFIX_PUBLIC and TRITON_CNS_SUFFIX_PRIVATE to work around this + local triton_dc="$(echo "${triton_url}" | awk -F'.' '{print $1}')" + + # Set the CNS base for public and private names + # Note, this also makes assumptions that only work in our public cloud + export TRITON_CNS_SEARCH_DOMAIN_PUBLIC="${triton_account_uuid}.${triton_dc}.triton.zone" + export TRITON_CNS_SEARCH_DOMAIN_PRIVATE="${triton_account_uuid}.${triton_dc}.cns.joyent.com" +} + # Run all checks function checkAll () { checkTritonInstalled && - checkDockerInstalled && - currentProfile + checkDockerInstalled } -case "`basename $0`" in +# Special case handling if the sub-command is `profile` +if [ "profile" == "$1" ] +then + currentProfile + exit 1 +fi + +# Change behavior based on the calling name of this executable +case "$(basename $0)" in triton-docker) checkAll && eval "$(triton env)" && + cnsEnvVars && exec /usr/local/bin/triton-docker-helper $@ ;; triton-compose) checkAll && eval "$(triton env)" && export COMPOSE_HTTP_TIMEOUT=750 && + cnsEnvVars && exec /usr/local/bin/triton-compose-helper $@ ;; triton-docker-install)