Author: brd (doc,ports committer)
Date: Mon Jun 29 21:26:41 2015
New Revision: 284942
URL: https://svnweb.freebsd.org/changeset/base/284942

Log:
  Add Support for uploading Vagrant images to Hashicorp Atlas.
  
  Approved by:  re (gjb)

Added:
  head/release/scripts/atlas-upload.sh   (contents, props changed)
Modified:
  head/release/Makefile.vagrant

Modified: head/release/Makefile.vagrant
==============================================================================
--- head/release/Makefile.vagrant       Mon Jun 29 21:23:54 2015        
(r284941)
+++ head/release/Makefile.vagrant       Mon Jun 29 21:26:41 2015        
(r284942)
@@ -7,12 +7,11 @@
 
 VAGRANT_IMG?=          ${.OBJDIR}/vagrant.vmdk
 VAGRANT_UPLOAD_TGTS=   vagrant-check-depends \
-                       vagrant-do-package-vmware
-#                      atlas-do-upload
+                       atlas-do-upload
 CLEANFILES+=           ${VAGRANT_UPLOAD_TGTS}
 
 .if defined(VAGRANT_UPLOAD_CONF) && !empty(VAGRANT_UPLOAD_CONF)
-. for VAR in _KEY _USERNAME _NAME _VERSION
+. for VAR in _KEY _USERNAME _VERSION
 VAGRANT${VAR}!=                grep -E ^VAGRANT${VAR} ${VAGRANT_UPLOAD_CONF} | 
awk -F' ' '{print $$2}'
 ATLAS${VAR}:=          ${VAGRANT${VAR}}
 . endfor
@@ -29,7 +28,7 @@ VAGRANT_PROVIDERS?=   vmware_desktop
 vagrant-upload:                ${VAGRANT_UPLOAD_TGTS}
 
 vagrant-check-depends:
-.for VAR in _KEY _USERNAME _NAME _VERSION
+.for VAR in _KEY _USERNAME _VERSION
 . if !defined(VAGRANT${VAR}) || empty(VAGRANT${VAR})
        @echo "Variable VAGRANT${VAR} cannot be empty."
        @false
@@ -40,7 +39,7 @@ vagrant-check-depends:
 .  if !exists(/usr/local/sbin/pkg-static)
        env ASSUME_ALWAYS_YES=yes pkg bootstrap -yf
 .  endif
-       env ASSUME_ALWAYS_YES=yes pkg install -y ftp/curl
+       env ASSUME_ALWAYS_YES=yes pkg install -y curl
 . else
        make -C ${PORTSDIR}/ftp/curl BATCH=1 all install clean
 . endif
@@ -53,17 +52,12 @@ vagrant-do-package-vmware: vagrant-creat
        cd ${.OBJDIR} && tar -czf ${VAGRANT_TARGET} metadata.json vagrant.vmx 
vagrant.vmdk
        touch ${.OBJDIR}/${.TARGET}
 
-atlas-create-upload:
+atlas-do-upload: vagrant-do-package-vmware
 .for PROVIDER in ${VAGRANT_PROVIDERS}
-       /usr/local/bin/curl 
"https://atlas.hashicorp.com/api/v1/box/${ATLAS_USERNAME}/${ATLAS_NAME}/version/${ATLAS_VERSION}/provider/${PROVIDER}/upload?access_token=${ATLAS_KEY}";
+       ${.CURDIR}/scripts/atlas-upload.sh -b FreeBSD-${REVISION}-${BRANCH} -f 
${VAGRANT_TARGET} -p ${PROVIDER} -k ${VAGRANT_KEY} -u ${VAGRANT_USERNAME} -v 0.1
 .endfor
        touch ${.OBJDIR}/${.TARGET}
 
-atlas-do-upload:
-       /usr/local/bin/curl -X PUT --upload-file \
-               ${VAGRANT_IMG} ${ATLAS_UPLOAD_PATH}
-       touch ${.OBJDIR}/${.TARGET}
-
 vagrant-create-vmware-vmx:
        @cd ${.OBJDIR} && echo '.encoding = "UTF-8"' > vagrant.vmx
        @cd ${.OBJDIR} && echo 'bios.bootorder = "hdd,CDROM"' >> vagrant.vmx

Added: head/release/scripts/atlas-upload.sh
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/release/scripts/atlas-upload.sh        Mon Jun 29 21:26:41 2015        
(r284942)
@@ -0,0 +1,155 @@
+#!/bin/sh
+#-
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Upload a Vagrant image to Hashicorp's Atlas service
+#
+# $FreeBSD$
+#
+
+ATLAS_API_URL=''
+ATLAS_UPLOAD_URL='https://binstore.hashicorp.com'
+VERSION_DESCRIPTION="FreeBSD Snapshot Build"
+
+usage() {
+       echo "${0} usage:"
+       echo "-b box-name -f box-to-upload -k api-key -p provider -u user -v 
version"
+       return 1
+}
+
+main () {
+       while getopts "b:f:k:p:u:v:" arg; do
+               case "${arg}" in
+                       b)
+                               BOX="${OPTARG}"
+                               ;;
+                       f)
+                               FILE="${OPTARG}"
+                               ;;
+                       k)
+                               KEY="${OPTARG}"
+                               ;;
+                       p)
+                               PROVIDER="${OPTARG}"
+                               ;;
+                       u)
+                               USERNAME="${OPTARG}"
+                               ;;
+                       v)
+                               VERSION="${OPTARG}"
+                               ;;
+                       *)
+                               ;;
+               esac
+       done
+
+       if [ -z "${BOX}" -o \
+               -z "${FILE}" -o \
+               -z "${KEY}" -o \
+               -z "${PROVIDER}" -o \
+               -z "${USERNAME}" -o \
+               -z "${VERSION}" ];
+       then
+               usage || exit 0
+       fi
+
+       # Check to see if the box exists or create it
+       BOXRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}?access_token=${KEY}";)
+       if [ $? != 0 ]; then
+               echo "Failed to connect to the API"
+               exit 2;
+       fi
+       echo $BOXRESULT | grep "\"name\":\"${BOX}\"" > /dev/null
+       if [ $? != 0 ]; then
+               echo "Creating box: ${BOX}"
+               /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/boxes 
-X POST -d "box[name]=${BOX}" -d "access_token=${KEY}" > /dev/null
+               /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
+       else
+               echo "Box already exists"
+       fi
+
+       # Check to see if the version exists or create it
+       VERSIONRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}";)
+       if [ $? != 0 ]; then
+               echo "Failed to connect to the API"
+               exit 2;
+       fi
+       echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null
+       if [ $? != 0 ]; then
+               echo "Creating version: ${VERSION}"
+               /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
+               /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
+               VERSIONRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}";)
+               echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > 
/dev/null
+               if [ $? != 0 ]; then
+                       echo "Failed to create version"
+                       exit 2
+               fi
+       else
+               echo "Version already exists"
+       fi
+
+       # Check to see if the provider exists or create it
+       PROVIDERRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}";)
+       if [ $? != 0 ]; then
+               echo "Failed to connect to the API"
+               exit 2;
+       fi
+       echo $PROVIDERRESULT | grep "\"name\":\"${PROVIDER}\"" > /dev/null
+       if [ $? != 0 ]; then
+               echo "Creating provider: ${PROVIDER}"
+               /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
+       else
+               echo "Provider already exists"
+       fi
+
+       # Request an upload token
+       TOKENRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}/upload?access_token=${KEY}";)
+       if [ $? != 0 ]; then
+               echo "Failed to get the token from the API"
+               exit 2;
+       fi
+       echo ${TOKENRESULT} | grep "\"token\":" > /dev/null
+       if [ $? != 0 ]; then
+               echo "No token found from the API"
+               exit 2
+       else
+               TOKEN=$(echo $TOKENRESULT | sed -e 's/.*token":"//' -e 
's/".*//')
+               echo "Uploading to Atlas"
+               UPLOADRESULT=$(/usr/local/bin/curl -s -X PUT --upload-file 
${FILE} ${ATLAS_UPLOAD_URL}/${TOKEN})
+
+               # Validate the Upload
+               echo "Validating"
+               VALIDRESULT=$(/usr/local/bin/curl -s 
"https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}";)
+               HOSTED_TOKEN=$(echo $VALIDRESULT | sed -e 
's/.*hosted_token":"//' -e 's/".*//')
+               if [ ! -z ${HOSTED_TOKEN} -a ! -z ${TOKEN} -a ${HOSTED_TOKEN} 
!= ${TOKEN} ]; then
+                       echo "Upload failed, try again."
+                       exit 2
+               fi
+
+               # Release the version
+               echo "Releasing ${VERSION} of ${BOX} in Atlas"
+               /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
+       fi
+}
+
+main "$@"
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to