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