Add tools/upload_image.sh
* moves the image upload logic from stack.sh to functions upload_image() * tools/upload_image.sh which is a thin wrapper around upload_image() Change-Id: I8746beebf50cf623b6fe903d6497e66e3fa5dda6
This commit is contained in:
parent
555767abbf
commit
ca0e3d0230
99
functions
99
functions
@ -618,6 +618,105 @@ function trueorfalse() {
|
||||
}
|
||||
|
||||
|
||||
# Retrieve an image from a URL and upload into Glance
|
||||
# Uses the following variables:
|
||||
# **FILES** must be set to the cache dir
|
||||
# **GLANCE_HOSTPORT**
|
||||
# upload_image image-url glance-token
|
||||
function upload_image() {
|
||||
local image_url=$1
|
||||
local token=$2
|
||||
|
||||
# Create a directory for the downloaded image tarballs.
|
||||
mkdir -p $FILES/images
|
||||
|
||||
# Downloads the image (uec ami+aki style), then extracts it.
|
||||
IMAGE_FNAME=`basename "$image_url"`
|
||||
if [[ ! -f $FILES/$IMAGE_FNAME || "$(stat -c "%s" $FILES/$IMAGE_FNAME)" = "0" ]]; then
|
||||
wget -c $image_url -O $FILES/$IMAGE_FNAME
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Not found: $image_url"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
# OpenVZ-format images are provided as .tar.gz, but not decompressed prior to loading
|
||||
if [[ "$image_url" =~ 'openvz' ]]; then
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tar.gz}"
|
||||
glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --is-public=True --container-format ami --disk-format ami < "${IMAGE}"
|
||||
return
|
||||
fi
|
||||
|
||||
KERNEL=""
|
||||
RAMDISK=""
|
||||
DISK_FORMAT=""
|
||||
CONTAINER_FORMAT=""
|
||||
UNPACK=""
|
||||
case "$IMAGE_FNAME" in
|
||||
*.tar.gz|*.tgz)
|
||||
# Extract ami and aki files
|
||||
[ "${IMAGE_FNAME%.tar.gz}" != "$IMAGE_FNAME" ] &&
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" ||
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tgz}"
|
||||
xdir="$FILES/images/$IMAGE_NAME"
|
||||
rm -Rf "$xdir";
|
||||
mkdir "$xdir"
|
||||
tar -zxf $FILES/$IMAGE_FNAME -C "$xdir"
|
||||
KERNEL=$(for f in "$xdir/"*-vmlinuz* "$xdir/"aki-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
RAMDISK=$(for f in "$xdir/"*-initrd* "$xdir/"ari-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
IMAGE=$(for f in "$xdir/"*.img "$xdir/"ami-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
if [[ -z "$IMAGE_NAME" ]]; then
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img")
|
||||
fi
|
||||
;;
|
||||
*.img)
|
||||
IMAGE="$FILES/$IMAGE_FNAME";
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img")
|
||||
DISK_FORMAT=raw
|
||||
CONTAINER_FORMAT=bare
|
||||
;;
|
||||
*.img.gz)
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img.gz")
|
||||
DISK_FORMAT=raw
|
||||
CONTAINER_FORMAT=bare
|
||||
UNPACK=zcat
|
||||
;;
|
||||
*.qcow2)
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".qcow2")
|
||||
DISK_FORMAT=qcow2
|
||||
CONTAINER_FORMAT=bare
|
||||
;;
|
||||
*) echo "Do not know what to do with $IMAGE_FNAME"; false;;
|
||||
esac
|
||||
|
||||
if [ "$CONTAINER_FORMAT" = "bare" ]; then
|
||||
if [ "$UNPACK" = "zcat" ]; then
|
||||
glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --public --container-format=$CONTAINER_FORMAT --disk-format $DISK_FORMAT < <(zcat --force "${IMAGE}")
|
||||
else
|
||||
glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --public --container-format=$CONTAINER_FORMAT --disk-format $DISK_FORMAT < "${IMAGE}"
|
||||
fi
|
||||
else
|
||||
# Use glance client to add the kernel the root filesystem.
|
||||
# We parse the results of the first upload to get the glance ID of the
|
||||
# kernel for use when uploading the root filesystem.
|
||||
KERNEL_ID=""; RAMDISK_ID="";
|
||||
if [ -n "$KERNEL" ]; then
|
||||
KERNEL_ID=$(glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME-kernel" --public --container-format aki --disk-format aki < "$KERNEL" | grep ' id ' | get_field 2)
|
||||
fi
|
||||
if [ -n "$RAMDISK" ]; then
|
||||
RAMDISK_ID=$(glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME-ramdisk" --public --container-format ari --disk-format ari < "$RAMDISK" | grep ' id ' | get_field 2)
|
||||
fi
|
||||
glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT image-create --name "${IMAGE_NAME%.img}" --public --container-format ami --disk-format ami ${KERNEL_ID:+--property kernel_id=$KERNEL_ID} ${RAMDISK_ID:+--property ramdisk_id=$RAMDISK_ID} < "${IMAGE}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# yum wrapper to set arguments correctly
|
||||
# yum_install package [package ...]
|
||||
function yum_install() {
|
||||
|
92
stack.sh
92
stack.sh
@ -2141,21 +2141,17 @@ is_service_enabled swift3 || \
|
||||
|
||||
# Upload an image to glance.
|
||||
#
|
||||
# The default image is a small ***TTY*** testing image, which lets you login
|
||||
# the username/password of root/password.
|
||||
# The default image is cirros, a small testing image, which lets you login as root
|
||||
#
|
||||
# TTY also uses ``cloud-init``, supporting login via keypair and sending scripts as
|
||||
# cirros also uses ``cloud-init``, supporting login via keypair and sending scripts as
|
||||
# userdata. See https://help.ubuntu.com/community/CloudInit for more on cloud-init
|
||||
#
|
||||
# Override ``IMAGE_URLS`` with a comma-separated list of uec images.
|
||||
#
|
||||
# * **natty**: http://uec-images.ubuntu.com/natty/current/natty-server-cloudimg-amd64.tar.gz
|
||||
# * **oneiric**: http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
|
||||
# * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz
|
||||
|
||||
if is_service_enabled g-reg; then
|
||||
# Create a directory for the downloaded image tarballs.
|
||||
mkdir -p $FILES/images
|
||||
|
||||
TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
|
||||
|
||||
# Option to upload legacy ami-tty, which works with xenserver
|
||||
@ -2164,87 +2160,7 @@ if is_service_enabled g-reg; then
|
||||
fi
|
||||
|
||||
for image_url in ${IMAGE_URLS//,/ }; do
|
||||
# Downloads the image (uec ami+aki style), then extracts it.
|
||||
IMAGE_FNAME=`basename "$image_url"`
|
||||
if [[ ! -f $FILES/$IMAGE_FNAME || "$(stat -c "%s" $FILES/$IMAGE_FNAME)" = "0" ]]; then
|
||||
wget -c $image_url -O $FILES/$IMAGE_FNAME
|
||||
fi
|
||||
|
||||
# OpenVZ-format images are provided as .tar.gz, but not decompressed prior to loading
|
||||
if [[ "$image_url" =~ 'openvz' ]]; then
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tar.gz}"
|
||||
glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --public --container-format ami --disk-format ami < "$IMAGE"
|
||||
continue
|
||||
fi
|
||||
|
||||
KERNEL=""
|
||||
RAMDISK=""
|
||||
DISK_FORMAT=""
|
||||
CONTAINER_FORMAT=""
|
||||
UNPACK=""
|
||||
|
||||
case "$IMAGE_FNAME" in
|
||||
*.tar.gz|*.tgz)
|
||||
# Extract ami and aki files
|
||||
[ "${IMAGE_FNAME%.tar.gz}" != "$IMAGE_FNAME" ] &&
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" ||
|
||||
IMAGE_NAME="${IMAGE_FNAME%.tgz}"
|
||||
xdir="$FILES/images/$IMAGE_NAME"
|
||||
rm -Rf "$xdir";
|
||||
mkdir "$xdir"
|
||||
tar -zxf $FILES/$IMAGE_FNAME -C "$xdir"
|
||||
KERNEL=$(for f in "$xdir/"*-vmlinuz* "$xdir/"aki-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
RAMDISK=$(for f in "$xdir/"*-initrd* "$xdir/"ari-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
IMAGE=$(for f in "$xdir/"*.img "$xdir/"ami-*/image; do
|
||||
[ -f "$f" ] && echo "$f" && break; done; true)
|
||||
if [[ -z "$IMAGE_NAME" ]]; then
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img")
|
||||
fi
|
||||
;;
|
||||
*.img)
|
||||
IMAGE="$FILES/$IMAGE_FNAME";
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img")
|
||||
DISK_FORMAT=raw
|
||||
CONTAINER_FORMAT=bare
|
||||
;;
|
||||
*.img.gz)
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".img.gz")
|
||||
DISK_FORMAT=raw
|
||||
CONTAINER_FORMAT=bare
|
||||
UNPACK=zcat
|
||||
;;
|
||||
*.qcow2)
|
||||
IMAGE="$FILES/${IMAGE_FNAME}"
|
||||
IMAGE_NAME=$(basename "$IMAGE" ".qcow2")
|
||||
DISK_FORMAT=qcow2
|
||||
CONTAINER_FORMAT=bare
|
||||
;;
|
||||
*) echo "Do not know what to do with $IMAGE_FNAME"; false;;
|
||||
esac
|
||||
|
||||
if [ "$CONTAINER_FORMAT" = "bare" ]; then
|
||||
if [ "$UNPACK" = "zcat" ]; then
|
||||
glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --is-public=True --container-format=$CONTAINER_FORMAT --disk-format $DISK_FORMAT < <(zcat --force "${IMAGE}")
|
||||
else
|
||||
glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --is-public=True --container-format=$CONTAINER_FORMAT --disk-format $DISK_FORMAT < ${IMAGE}
|
||||
fi
|
||||
else
|
||||
# Use glance client to add the kernel the root filesystem.
|
||||
# We parse the results of the first upload to get the glance ID of the
|
||||
# kernel for use when uploading the root filesystem.
|
||||
KERNEL_ID=""; RAMDISK_ID="";
|
||||
if [ -n "$KERNEL" ]; then
|
||||
KERNEL_ID=$(glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME-kernel" --is-public=True --container-format aki --disk-format aki < "$KERNEL" | grep ' id ' | get_field 2)
|
||||
fi
|
||||
if [ -n "$RAMDISK" ]; then
|
||||
RAMDISK_ID=$(glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME-ramdisk" --is-public=True --container-format ari --disk-format ari < "$RAMDISK" | grep ' id ' | get_field 2)
|
||||
fi
|
||||
glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "${IMAGE_NAME%.img}" --is-public=True --container-format ami --disk-format ami ${KERNEL_ID:+--property kernel_id=$KERNEL_ID} ${RAMDISK_ID:+--property ramdisk_id=$RAMDISK_ID} < "${IMAGE}"
|
||||
fi
|
||||
upload_image $image_url $TOKEN
|
||||
done
|
||||
fi
|
||||
|
||||
|
42
tools/upload_image.sh
Executable file
42
tools/upload_image.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
# upload_image.sh - Retrieve and upload an image into Glance
|
||||
#
|
||||
# upload_image.sh <image-url>
|
||||
#
|
||||
# Assumes credentials are set via OS_* environment variables
|
||||
|
||||
function usage {
|
||||
echo "$0 - Retrieve and upload an image into Glance"
|
||||
echo ""
|
||||
echo "Usage: $0 <image-url> [...]"
|
||||
echo ""
|
||||
echo "Assumes credentials are set via OS_* environment variables"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Keep track of the current directory
|
||||
TOOLS_DIR=$(cd $(dirname "$0") && pwd)
|
||||
TOP_DIR=$(cd $TOOLS_DIR/..; pwd)
|
||||
|
||||
# Import common functions
|
||||
source $TOP_DIR/functions
|
||||
|
||||
# Import configuration
|
||||
source $TOP_DIR/openrc "" "" "" ""
|
||||
|
||||
# Find the cache dir
|
||||
FILES=$TOP_DIR/files
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# Get a token to authenticate to glance
|
||||
TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
|
||||
|
||||
# Glance connection info. Note the port must be specified.
|
||||
GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$GLANCE_HOST:9292}
|
||||
|
||||
for IMAGE in "$*"; do
|
||||
upload_image $IMAGE $TOKEN
|
||||
done
|
Loading…
Reference in New Issue
Block a user