atlas-upload.sh revision 284942
1117395Skan#!/bin/sh 2117395Skan#- 3169689Skan# Redistribution and use in source and binary forms, with or without 4117395Skan# modification, are permitted provided that the following conditions 5117395Skan# are met: 6132718Skan# 1. Redistributions of source code must retain the above copyright 7117395Skan# notice, this list of conditions and the following disclaimer. 8132718Skan# 2. Redistributions in binary form must reproduce the above copyright 9132718Skan# notice, this list of conditions and the following disclaimer in the 10132718Skan# documentation and/or other materials provided with the distribution. 11132718Skan# 12117395Skan# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 13132718Skan# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14132718Skan# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15132718Skan# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 16132718Skan# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 17117395Skan# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 18132718Skan# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 19132718Skan# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 20169689Skan# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 21169689Skan# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 22117395Skan# SUCH DAMAGE. 23132718Skan# 24169689Skan# Upload a Vagrant image to Hashicorp's Atlas service 25169689Skan# 26117395Skan# $FreeBSD: head/release/scripts/atlas-upload.sh 284942 2015-06-29 21:26:41Z brd $ 27132718Skan# 28117395Skan 29117395SkanATLAS_API_URL='' 30132718SkanATLAS_UPLOAD_URL='https://binstore.hashicorp.com' 31117395SkanVERSION_DESCRIPTION="FreeBSD Snapshot Build" 32132718Skan 33132718Skanusage() { 34169689Skan echo "${0} usage:" 35132718Skan echo "-b box-name -f box-to-upload -k api-key -p provider -u user -v version" 36169689Skan return 1 37132718Skan} 38117395Skan 39169689Skanmain () { 40132718Skan while getopts "b:f:k:p:u:v:" arg; do 41169689Skan case "${arg}" in 42132718Skan b) 43169689Skan BOX="${OPTARG}" 44169689Skan ;; 45169689Skan f) 46169689Skan FILE="${OPTARG}" 47117395Skan ;; 48132718Skan k) 49132718Skan KEY="${OPTARG}" 50132718Skan ;; 51132718Skan p) 52132718Skan PROVIDER="${OPTARG}" 53117395Skan ;; 54132718Skan u) 55117395Skan USERNAME="${OPTARG}" 56117395Skan ;; 57117395Skan v) 58117395Skan VERSION="${OPTARG}" 59132718Skan ;; 60117395Skan *) 61 ;; 62 esac 63 done 64 65 if [ -z "${BOX}" -o \ 66 -z "${FILE}" -o \ 67 -z "${KEY}" -o \ 68 -z "${PROVIDER}" -o \ 69 -z "${USERNAME}" -o \ 70 -z "${VERSION}" ]; 71 then 72 usage || exit 0 73 fi 74 75 # Check to see if the box exists or create it 76 BOXRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}?access_token=${KEY}") 77 if [ $? != 0 ]; then 78 echo "Failed to connect to the API" 79 exit 2; 80 fi 81 echo $BOXRESULT | grep "\"name\":\"${BOX}\"" > /dev/null 82 if [ $? != 0 ]; then 83 echo "Creating box: ${BOX}" 84 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/boxes -X POST -d "box[name]=${BOX}" -d "access_token=${KEY}" > /dev/null 85 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[is_private]=false" -d "access_token=${KEY}" > /dev/null 86 else 87 echo "Box already exists" 88 fi 89 90 # Check to see if the version exists or create it 91 VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 92 if [ $? != 0 ]; then 93 echo "Failed to connect to the API" 94 exit 2; 95 fi 96 echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null 97 if [ $? != 0 ]; then 98 echo "Creating version: ${VERSION}" 99 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/versions -X POST -d "version[version]=${VERSION}" -d "access_token=${KEY}" > /dev/null 100 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION} -X PUT -d "version[description]=${VERSION_DESCRIPTION}" -d "access_token=${KEY}" > /dev/null 101 VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 102 echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null 103 if [ $? != 0 ]; then 104 echo "Failed to create version" 105 exit 2 106 fi 107 else 108 echo "Version already exists" 109 fi 110 111 # Check to see if the provider exists or create it 112 PROVIDERRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 113 if [ $? != 0 ]; then 114 echo "Failed to connect to the API" 115 exit 2; 116 fi 117 echo $PROVIDERRESULT | grep "\"name\":\"${PROVIDER}\"" > /dev/null 118 if [ $? != 0 ]; then 119 echo "Creating provider: ${PROVIDER}" 120 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/providers -X POST -d "provider[name]=${PROVIDER}" -d "access_token=${KEY}" > /dev/null 121 else 122 echo "Provider already exists" 123 fi 124 125 # Request an upload token 126 TOKENRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}/upload?access_token=${KEY}") 127 if [ $? != 0 ]; then 128 echo "Failed to get the token from the API" 129 exit 2; 130 fi 131 echo ${TOKENRESULT} | grep "\"token\":" > /dev/null 132 if [ $? != 0 ]; then 133 echo "No token found from the API" 134 exit 2 135 else 136 TOKEN=$(echo $TOKENRESULT | sed -e 's/.*token":"//' -e 's/".*//') 137 echo "Uploading to Atlas" 138 UPLOADRESULT=$(/usr/local/bin/curl -s -X PUT --upload-file ${FILE} ${ATLAS_UPLOAD_URL}/${TOKEN}) 139 140 # Validate the Upload 141 echo "Validating" 142 VALIDRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 143 HOSTED_TOKEN=$(echo $VALIDRESULT | sed -e 's/.*hosted_token":"//' -e 's/".*//') 144 if [ ! -z ${HOSTED_TOKEN} -a ! -z ${TOKEN} -a ${HOSTED_TOKEN} != ${TOKEN} ]; then 145 echo "Upload failed, try again." 146 exit 2 147 fi 148 149 # Release the version 150 echo "Releasing ${VERSION} of ${BOX} in Atlas" 151 /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/release -X PUT -d "access_token=${KEY}" > /dev/null 152 fi 153} 154 155main "$@" 156