]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - release/scripts/atlas-upload.sh
MFC r284893, r284895-r284897, r284942, r284968, r284996, r285005:
[FreeBSD/stable/10.git] / release / scripts / atlas-upload.sh
1 #!/bin/sh
2 #-
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 # 1. Redistributions of source code must retain the above copyright
7 #    notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright
9 #    notice, this list of conditions and the following disclaimer in the
10 #    documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22 # SUCH DAMAGE.
23 #
24 # Upload a Vagrant image to Hashicorp's Atlas service
25 #
26 # $FreeBSD$
27 #
28
29 ATLAS_API_URL=''
30 ATLAS_UPLOAD_URL='https://binstore.hashicorp.com'
31 VERSION_DESCRIPTION="FreeBSD Snapshot Build"
32
33 usage() {
34         echo "${0} usage:"
35         echo "-b box-name -f box-to-upload -k api-key -p provider -u user -v version"
36         return 1
37 }
38
39 main () {
40         while getopts "b:f:k:p:u:v:" arg; do
41                 case "${arg}" in
42                         b)
43                                 BOX="${OPTARG}"
44                                 ;;
45                         f)
46                                 FILE="${OPTARG}"
47                                 ;;
48                         k)
49                                 KEY="${OPTARG}"
50                                 ;;
51                         p)
52                                 PROVIDER="${OPTARG}"
53                                 ;;
54                         u)
55                                 USERNAME="${OPTARG}"
56                                 ;;
57                         v)
58                                 VERSION="${OPTARG}"
59                                 ;;
60                         *)
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
155 main "$@"