xref: /freebsd/release/scripts/atlas-upload.sh (revision f19a742ff15ef826bd1626757e598459ecf6ab5d)
1*f19a742fSBrad Davis#!/bin/sh
2*f19a742fSBrad Davis#-
3*f19a742fSBrad Davis# Redistribution and use in source and binary forms, with or without
4*f19a742fSBrad Davis# modification, are permitted provided that the following conditions
5*f19a742fSBrad Davis# are met:
6*f19a742fSBrad Davis# 1. Redistributions of source code must retain the above copyright
7*f19a742fSBrad Davis#    notice, this list of conditions and the following disclaimer.
8*f19a742fSBrad Davis# 2. Redistributions in binary form must reproduce the above copyright
9*f19a742fSBrad Davis#    notice, this list of conditions and the following disclaimer in the
10*f19a742fSBrad Davis#    documentation and/or other materials provided with the distribution.
11*f19a742fSBrad Davis#
12*f19a742fSBrad Davis# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13*f19a742fSBrad Davis# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14*f19a742fSBrad Davis# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15*f19a742fSBrad Davis# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16*f19a742fSBrad Davis# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17*f19a742fSBrad Davis# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18*f19a742fSBrad Davis# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19*f19a742fSBrad Davis# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20*f19a742fSBrad Davis# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21*f19a742fSBrad Davis# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22*f19a742fSBrad Davis# SUCH DAMAGE.
23*f19a742fSBrad Davis#
24*f19a742fSBrad Davis# Upload a Vagrant image to Hashicorp's Atlas service
25*f19a742fSBrad Davis#
26*f19a742fSBrad Davis# $FreeBSD$
27*f19a742fSBrad Davis#
28*f19a742fSBrad Davis
29*f19a742fSBrad DavisATLAS_API_URL=''
30*f19a742fSBrad DavisATLAS_UPLOAD_URL='https://binstore.hashicorp.com'
31*f19a742fSBrad DavisVERSION_DESCRIPTION="FreeBSD Snapshot Build"
32*f19a742fSBrad Davis
33*f19a742fSBrad Davisusage() {
34*f19a742fSBrad Davis	echo "${0} usage:"
35*f19a742fSBrad Davis	echo "-b box-name -f box-to-upload -k api-key -p provider -u user -v version"
36*f19a742fSBrad Davis	return 1
37*f19a742fSBrad Davis}
38*f19a742fSBrad Davis
39*f19a742fSBrad Davismain () {
40*f19a742fSBrad Davis	while getopts "b:f:k:p:u:v:" arg; do
41*f19a742fSBrad Davis		case "${arg}" in
42*f19a742fSBrad Davis			b)
43*f19a742fSBrad Davis				BOX="${OPTARG}"
44*f19a742fSBrad Davis				;;
45*f19a742fSBrad Davis			f)
46*f19a742fSBrad Davis				FILE="${OPTARG}"
47*f19a742fSBrad Davis				;;
48*f19a742fSBrad Davis			k)
49*f19a742fSBrad Davis				KEY="${OPTARG}"
50*f19a742fSBrad Davis				;;
51*f19a742fSBrad Davis			p)
52*f19a742fSBrad Davis				PROVIDER="${OPTARG}"
53*f19a742fSBrad Davis				;;
54*f19a742fSBrad Davis			u)
55*f19a742fSBrad Davis				USERNAME="${OPTARG}"
56*f19a742fSBrad Davis				;;
57*f19a742fSBrad Davis			v)
58*f19a742fSBrad Davis				VERSION="${OPTARG}"
59*f19a742fSBrad Davis				;;
60*f19a742fSBrad Davis			*)
61*f19a742fSBrad Davis				;;
62*f19a742fSBrad Davis		esac
63*f19a742fSBrad Davis	done
64*f19a742fSBrad Davis
65*f19a742fSBrad Davis	if [ -z "${BOX}" -o \
66*f19a742fSBrad Davis		-z "${FILE}" -o \
67*f19a742fSBrad Davis		-z "${KEY}" -o \
68*f19a742fSBrad Davis		-z "${PROVIDER}" -o \
69*f19a742fSBrad Davis		-z "${USERNAME}" -o \
70*f19a742fSBrad Davis		-z "${VERSION}" ];
71*f19a742fSBrad Davis	then
72*f19a742fSBrad Davis		usage || exit 0
73*f19a742fSBrad Davis	fi
74*f19a742fSBrad Davis
75*f19a742fSBrad Davis	# Check to see if the box exists or create it
76*f19a742fSBrad Davis	BOXRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}?access_token=${KEY}")
77*f19a742fSBrad Davis	if [ $? != 0 ]; then
78*f19a742fSBrad Davis		echo "Failed to connect to the API"
79*f19a742fSBrad Davis		exit 2;
80*f19a742fSBrad Davis	fi
81*f19a742fSBrad Davis	echo $BOXRESULT | grep "\"name\":\"${BOX}\"" > /dev/null
82*f19a742fSBrad Davis	if [ $? != 0 ]; then
83*f19a742fSBrad Davis		echo "Creating box: ${BOX}"
84*f19a742fSBrad Davis		/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*f19a742fSBrad Davis		/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*f19a742fSBrad Davis	else
87*f19a742fSBrad Davis		echo "Box already exists"
88*f19a742fSBrad Davis	fi
89*f19a742fSBrad Davis
90*f19a742fSBrad Davis	# Check to see if the version exists or create it
91*f19a742fSBrad Davis	VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}")
92*f19a742fSBrad Davis	if [ $? != 0 ]; then
93*f19a742fSBrad Davis		echo "Failed to connect to the API"
94*f19a742fSBrad Davis		exit 2;
95*f19a742fSBrad Davis	fi
96*f19a742fSBrad Davis	echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null
97*f19a742fSBrad Davis	if [ $? != 0 ]; then
98*f19a742fSBrad Davis		echo "Creating version: ${VERSION}"
99*f19a742fSBrad Davis		/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*f19a742fSBrad Davis		/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*f19a742fSBrad Davis		VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}")
102*f19a742fSBrad Davis		echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null
103*f19a742fSBrad Davis		if [ $? != 0 ]; then
104*f19a742fSBrad Davis			echo "Failed to create version"
105*f19a742fSBrad Davis			exit 2
106*f19a742fSBrad Davis		fi
107*f19a742fSBrad Davis	else
108*f19a742fSBrad Davis		echo "Version already exists"
109*f19a742fSBrad Davis	fi
110*f19a742fSBrad Davis
111*f19a742fSBrad Davis	# Check to see if the provider exists or create it
112*f19a742fSBrad Davis	PROVIDERRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}")
113*f19a742fSBrad Davis	if [ $? != 0 ]; then
114*f19a742fSBrad Davis		echo "Failed to connect to the API"
115*f19a742fSBrad Davis		exit 2;
116*f19a742fSBrad Davis	fi
117*f19a742fSBrad Davis	echo $PROVIDERRESULT | grep "\"name\":\"${PROVIDER}\"" > /dev/null
118*f19a742fSBrad Davis	if [ $? != 0 ]; then
119*f19a742fSBrad Davis		echo "Creating provider: ${PROVIDER}"
120*f19a742fSBrad Davis		/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*f19a742fSBrad Davis	else
122*f19a742fSBrad Davis		echo "Provider already exists"
123*f19a742fSBrad Davis	fi
124*f19a742fSBrad Davis
125*f19a742fSBrad Davis	# Request an upload token
126*f19a742fSBrad Davis	TOKENRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}/upload?access_token=${KEY}")
127*f19a742fSBrad Davis	if [ $? != 0 ]; then
128*f19a742fSBrad Davis		echo "Failed to get the token from the API"
129*f19a742fSBrad Davis		exit 2;
130*f19a742fSBrad Davis	fi
131*f19a742fSBrad Davis	echo ${TOKENRESULT} | grep "\"token\":" > /dev/null
132*f19a742fSBrad Davis	if [ $? != 0 ]; then
133*f19a742fSBrad Davis		echo "No token found from the API"
134*f19a742fSBrad Davis		exit 2
135*f19a742fSBrad Davis	else
136*f19a742fSBrad Davis		TOKEN=$(echo $TOKENRESULT | sed -e 's/.*token":"//' -e 's/".*//')
137*f19a742fSBrad Davis		echo "Uploading to Atlas"
138*f19a742fSBrad Davis		UPLOADRESULT=$(/usr/local/bin/curl -s -X PUT --upload-file ${FILE} ${ATLAS_UPLOAD_URL}/${TOKEN})
139*f19a742fSBrad Davis
140*f19a742fSBrad Davis		# Validate the Upload
141*f19a742fSBrad Davis		echo "Validating"
142*f19a742fSBrad Davis		VALIDRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}")
143*f19a742fSBrad Davis		HOSTED_TOKEN=$(echo $VALIDRESULT | sed -e 's/.*hosted_token":"//' -e 's/".*//')
144*f19a742fSBrad Davis		if [ ! -z ${HOSTED_TOKEN} -a ! -z ${TOKEN} -a ${HOSTED_TOKEN} != ${TOKEN} ]; then
145*f19a742fSBrad Davis			echo "Upload failed, try again."
146*f19a742fSBrad Davis			exit 2
147*f19a742fSBrad Davis		fi
148*f19a742fSBrad Davis
149*f19a742fSBrad Davis		# Release the version
150*f19a742fSBrad Davis		echo "Releasing ${VERSION} of ${BOX} in Atlas"
151*f19a742fSBrad Davis		/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*f19a742fSBrad Davis	fi
153*f19a742fSBrad Davis}
154*f19a742fSBrad Davis
155*f19a742fSBrad Davismain "$@"
156