98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
package googlecomputeexport
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/packer/builder/googlecompute"
|
|
)
|
|
|
|
var StartupScript string = fmt.Sprintf(`#!/bin/bash
|
|
|
|
GetMetadata () {
|
|
echo "$(curl -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/$1 2> /dev/null)"
|
|
}
|
|
|
|
ZONE=$(basename $(GetMetadata zone))
|
|
|
|
SetMetadata () {
|
|
gcloud compute instances add-metadata ${HOSTNAME} --metadata ${1}=${2} --zone ${ZONE}
|
|
}
|
|
|
|
STARTUPSCRIPT=$(GetMetadata attributes/%s)
|
|
STARTUPSCRIPTPATH=/packer-wrapped-startup-script
|
|
if [ -f "/var/log/startupscript.log" ]; then
|
|
STARTUPSCRIPTLOGPATH=/var/log/startupscript.log
|
|
else
|
|
STARTUPSCRIPTLOGPATH=/var/log/daemon.log
|
|
fi
|
|
STARTUPSCRIPTLOGDEST=$(GetMetadata attributes/startup-script-log-dest)
|
|
|
|
IMAGENAME=$(GetMetadata image_name)
|
|
NAME=$(GetMetadata name)
|
|
DISKNAME=${NAME}-toexport
|
|
PATHS=($(GetMetadata paths))
|
|
|
|
Exit () {
|
|
for i in ${PATHS[@]}; do
|
|
LOGDEST="${i}.exporter.log"
|
|
echo "Uploading exporter log to ${LOGDEST}..."
|
|
gsutil -h "Content-Type:text/plain" cp /var/log/daemon.log ${LOGDEST}
|
|
done
|
|
exit $1
|
|
}
|
|
|
|
echo "####### Export configuration #######"
|
|
echo "Image name - ${IMAGENAME}"
|
|
echo "Instance name - ${NAME}"
|
|
echo "Instance zone - ${ZONE}"
|
|
echo "Disk name - ${DISKNAME}"
|
|
echo "Export paths - ${PATHS}"
|
|
echo "####################################"
|
|
|
|
echo "Creating disk from image to be exported..."
|
|
if ! gcloud compute disks create ${DISKNAME} --image ${IMAGENAME} --zone ${ZONE}; then
|
|
echo "Failed to create disk."
|
|
Exit 1
|
|
fi
|
|
|
|
echo "Attaching disk..."
|
|
if ! gcloud compute instances attach-disk ${NAME} --disk ${DISKNAME} --device-name toexport --zone ${ZONE}; then
|
|
echo "Failed to attach disk."
|
|
Exit 1
|
|
fi
|
|
|
|
echo "GCEExport: Running export tool."
|
|
gce_export -gcs_path "${PATHS[0]}" -disk /dev/disk/by-id/google-toexport -y
|
|
if [ $? -ne 0 ]; then
|
|
echo "ExportFailed: Failed to export disk source to ${PATHS[0]}."
|
|
Exit 1
|
|
fi
|
|
|
|
echo "ExportSuccess"
|
|
sync
|
|
|
|
echo "Detaching disk..."
|
|
if ! gcloud compute instances detach-disk ${NAME} --disk ${DISKNAME} --zone ${ZONE}; then
|
|
echo "Failed to detach disk."
|
|
fi
|
|
|
|
FAIL=0
|
|
echo "Deleting disk..."
|
|
if ! gcloud compute disks delete ${DISKNAME} --zone ${ZONE}; then
|
|
echo "Failed to delete disk."
|
|
FAIL=1
|
|
fi
|
|
|
|
for i in ${PATHS[@]:1}; do
|
|
echo "Copying archive image to ${i}..."
|
|
if ! gsutil -o GSUtil:parallel_composite_upload_threshold=100M cp ${PATHS[0]} ${i}; then
|
|
echo "Failed to copy image to ${i}."
|
|
FAIL=1
|
|
fi
|
|
done
|
|
|
|
SetMetadata %s %s
|
|
|
|
Exit ${FAIL}
|
|
`, googlecompute.StartupWrappedScriptKey, googlecompute.StartupScriptStatusKey, googlecompute.StartupScriptStatusDone)
|