* 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
... | ... |
@@ -419,7 +419,7 @@ function is_service_enabled() { |
419 | 419 |
|
420 | 420 |
# remove extra commas from the input string (ENABLED_SERVICES) |
421 | 421 |
function _cleanup_service_list () { |
422 |
- echo "$1" | sed -e ' |
|
422 |
+ echo "$1" | sed -e ' |
|
423 | 423 |
s/,,/,/g; |
424 | 424 |
s/^,//; |
425 | 425 |
s/,$// |
... | ... |
@@ -618,6 +618,105 @@ function trueorfalse() { |
618 | 618 |
} |
619 | 619 |
|
620 | 620 |
|
621 |
+# Retrieve an image from a URL and upload into Glance |
|
622 |
+# Uses the following variables: |
|
623 |
+# **FILES** must be set to the cache dir |
|
624 |
+# **GLANCE_HOSTPORT** |
|
625 |
+# upload_image image-url glance-token |
|
626 |
+function upload_image() { |
|
627 |
+ local image_url=$1 |
|
628 |
+ local token=$2 |
|
629 |
+ |
|
630 |
+ # Create a directory for the downloaded image tarballs. |
|
631 |
+ mkdir -p $FILES/images |
|
632 |
+ |
|
633 |
+ # Downloads the image (uec ami+aki style), then extracts it. |
|
634 |
+ IMAGE_FNAME=`basename "$image_url"` |
|
635 |
+ if [[ ! -f $FILES/$IMAGE_FNAME || "$(stat -c "%s" $FILES/$IMAGE_FNAME)" = "0" ]]; then |
|
636 |
+ wget -c $image_url -O $FILES/$IMAGE_FNAME |
|
637 |
+ if [[ $? -ne 0 ]]; then |
|
638 |
+ echo "Not found: $image_url" |
|
639 |
+ return |
|
640 |
+ fi |
|
641 |
+ fi |
|
642 |
+ |
|
643 |
+ # OpenVZ-format images are provided as .tar.gz, but not decompressed prior to loading |
|
644 |
+ if [[ "$image_url" =~ 'openvz' ]]; then |
|
645 |
+ IMAGE="$FILES/${IMAGE_FNAME}" |
|
646 |
+ IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" |
|
647 |
+ 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}" |
|
648 |
+ return |
|
649 |
+ fi |
|
650 |
+ |
|
651 |
+ KERNEL="" |
|
652 |
+ RAMDISK="" |
|
653 |
+ DISK_FORMAT="" |
|
654 |
+ CONTAINER_FORMAT="" |
|
655 |
+ UNPACK="" |
|
656 |
+ case "$IMAGE_FNAME" in |
|
657 |
+ *.tar.gz|*.tgz) |
|
658 |
+ # Extract ami and aki files |
|
659 |
+ [ "${IMAGE_FNAME%.tar.gz}" != "$IMAGE_FNAME" ] && |
|
660 |
+ IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" || |
|
661 |
+ IMAGE_NAME="${IMAGE_FNAME%.tgz}" |
|
662 |
+ xdir="$FILES/images/$IMAGE_NAME" |
|
663 |
+ rm -Rf "$xdir"; |
|
664 |
+ mkdir "$xdir" |
|
665 |
+ tar -zxf $FILES/$IMAGE_FNAME -C "$xdir" |
|
666 |
+ KERNEL=$(for f in "$xdir/"*-vmlinuz* "$xdir/"aki-*/image; do |
|
667 |
+ [ -f "$f" ] && echo "$f" && break; done; true) |
|
668 |
+ RAMDISK=$(for f in "$xdir/"*-initrd* "$xdir/"ari-*/image; do |
|
669 |
+ [ -f "$f" ] && echo "$f" && break; done; true) |
|
670 |
+ IMAGE=$(for f in "$xdir/"*.img "$xdir/"ami-*/image; do |
|
671 |
+ [ -f "$f" ] && echo "$f" && break; done; true) |
|
672 |
+ if [[ -z "$IMAGE_NAME" ]]; then |
|
673 |
+ IMAGE_NAME=$(basename "$IMAGE" ".img") |
|
674 |
+ fi |
|
675 |
+ ;; |
|
676 |
+ *.img) |
|
677 |
+ IMAGE="$FILES/$IMAGE_FNAME"; |
|
678 |
+ IMAGE_NAME=$(basename "$IMAGE" ".img") |
|
679 |
+ DISK_FORMAT=raw |
|
680 |
+ CONTAINER_FORMAT=bare |
|
681 |
+ ;; |
|
682 |
+ *.img.gz) |
|
683 |
+ IMAGE="$FILES/${IMAGE_FNAME}" |
|
684 |
+ IMAGE_NAME=$(basename "$IMAGE" ".img.gz") |
|
685 |
+ DISK_FORMAT=raw |
|
686 |
+ CONTAINER_FORMAT=bare |
|
687 |
+ UNPACK=zcat |
|
688 |
+ ;; |
|
689 |
+ *.qcow2) |
|
690 |
+ IMAGE="$FILES/${IMAGE_FNAME}" |
|
691 |
+ IMAGE_NAME=$(basename "$IMAGE" ".qcow2") |
|
692 |
+ DISK_FORMAT=qcow2 |
|
693 |
+ CONTAINER_FORMAT=bare |
|
694 |
+ ;; |
|
695 |
+ *) echo "Do not know what to do with $IMAGE_FNAME"; false;; |
|
696 |
+ esac |
|
697 |
+ |
|
698 |
+ if [ "$CONTAINER_FORMAT" = "bare" ]; then |
|
699 |
+ if [ "$UNPACK" = "zcat" ]; then |
|
700 |
+ 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}") |
|
701 |
+ else |
|
702 |
+ 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}" |
|
703 |
+ fi |
|
704 |
+ else |
|
705 |
+ # Use glance client to add the kernel the root filesystem. |
|
706 |
+ # We parse the results of the first upload to get the glance ID of the |
|
707 |
+ # kernel for use when uploading the root filesystem. |
|
708 |
+ KERNEL_ID=""; RAMDISK_ID=""; |
|
709 |
+ if [ -n "$KERNEL" ]; then |
|
710 |
+ 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) |
|
711 |
+ fi |
|
712 |
+ if [ -n "$RAMDISK" ]; then |
|
713 |
+ 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) |
|
714 |
+ fi |
|
715 |
+ 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}" |
|
716 |
+ fi |
|
717 |
+} |
|
718 |
+ |
|
719 |
+ |
|
621 | 720 |
# yum wrapper to set arguments correctly |
622 | 721 |
# yum_install package [package ...] |
623 | 722 |
function yum_install() { |
... | ... |
@@ -2141,21 +2141,17 @@ is_service_enabled swift3 || \ |
2141 | 2141 |
|
2142 | 2142 |
# Upload an image to glance. |
2143 | 2143 |
# |
2144 |
-# The default image is a small ***TTY*** testing image, which lets you login |
|
2145 |
-# the username/password of root/password. |
|
2144 |
+# The default image is cirros, a small testing image, which lets you login as root |
|
2146 | 2145 |
# |
2147 |
-# TTY also uses ``cloud-init``, supporting login via keypair and sending scripts as |
|
2146 |
+# cirros also uses ``cloud-init``, supporting login via keypair and sending scripts as |
|
2148 | 2147 |
# userdata. See https://help.ubuntu.com/community/CloudInit for more on cloud-init |
2149 | 2148 |
# |
2150 | 2149 |
# Override ``IMAGE_URLS`` with a comma-separated list of uec images. |
2151 | 2150 |
# |
2152 |
-# * **natty**: http://uec-images.ubuntu.com/natty/current/natty-server-cloudimg-amd64.tar.gz |
|
2153 | 2151 |
# * **oneiric**: http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz |
2152 |
+# * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz |
|
2154 | 2153 |
|
2155 | 2154 |
if is_service_enabled g-reg; then |
2156 |
- # Create a directory for the downloaded image tarballs. |
|
2157 |
- mkdir -p $FILES/images |
|
2158 |
- |
|
2159 | 2155 |
TOKEN=$(keystone token-get | grep ' id ' | get_field 2) |
2160 | 2156 |
|
2161 | 2157 |
# Option to upload legacy ami-tty, which works with xenserver |
... | ... |
@@ -2164,87 +2160,7 @@ if is_service_enabled g-reg; then |
2164 | 2164 |
fi |
2165 | 2165 |
|
2166 | 2166 |
for image_url in ${IMAGE_URLS//,/ }; do |
2167 |
- # Downloads the image (uec ami+aki style), then extracts it. |
|
2168 |
- IMAGE_FNAME=`basename "$image_url"` |
|
2169 |
- if [[ ! -f $FILES/$IMAGE_FNAME || "$(stat -c "%s" $FILES/$IMAGE_FNAME)" = "0" ]]; then |
|
2170 |
- wget -c $image_url -O $FILES/$IMAGE_FNAME |
|
2171 |
- fi |
|
2172 |
- |
|
2173 |
- # OpenVZ-format images are provided as .tar.gz, but not decompressed prior to loading |
|
2174 |
- if [[ "$image_url" =~ 'openvz' ]]; then |
|
2175 |
- IMAGE="$FILES/${IMAGE_FNAME}" |
|
2176 |
- IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" |
|
2177 |
- glance --os-auth-token $TOKEN --os-image-url http://$GLANCE_HOSTPORT image-create --name "$IMAGE_NAME" --public --container-format ami --disk-format ami < "$IMAGE" |
|
2178 |
- continue |
|
2179 |
- fi |
|
2180 |
- |
|
2181 |
- KERNEL="" |
|
2182 |
- RAMDISK="" |
|
2183 |
- DISK_FORMAT="" |
|
2184 |
- CONTAINER_FORMAT="" |
|
2185 |
- UNPACK="" |
|
2186 |
- |
|
2187 |
- case "$IMAGE_FNAME" in |
|
2188 |
- *.tar.gz|*.tgz) |
|
2189 |
- # Extract ami and aki files |
|
2190 |
- [ "${IMAGE_FNAME%.tar.gz}" != "$IMAGE_FNAME" ] && |
|
2191 |
- IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" || |
|
2192 |
- IMAGE_NAME="${IMAGE_FNAME%.tgz}" |
|
2193 |
- xdir="$FILES/images/$IMAGE_NAME" |
|
2194 |
- rm -Rf "$xdir"; |
|
2195 |
- mkdir "$xdir" |
|
2196 |
- tar -zxf $FILES/$IMAGE_FNAME -C "$xdir" |
|
2197 |
- KERNEL=$(for f in "$xdir/"*-vmlinuz* "$xdir/"aki-*/image; do |
|
2198 |
- [ -f "$f" ] && echo "$f" && break; done; true) |
|
2199 |
- RAMDISK=$(for f in "$xdir/"*-initrd* "$xdir/"ari-*/image; do |
|
2200 |
- [ -f "$f" ] && echo "$f" && break; done; true) |
|
2201 |
- IMAGE=$(for f in "$xdir/"*.img "$xdir/"ami-*/image; do |
|
2202 |
- [ -f "$f" ] && echo "$f" && break; done; true) |
|
2203 |
- if [[ -z "$IMAGE_NAME" ]]; then |
|
2204 |
- IMAGE_NAME=$(basename "$IMAGE" ".img") |
|
2205 |
- fi |
|
2206 |
- ;; |
|
2207 |
- *.img) |
|
2208 |
- IMAGE="$FILES/$IMAGE_FNAME"; |
|
2209 |
- IMAGE_NAME=$(basename "$IMAGE" ".img") |
|
2210 |
- DISK_FORMAT=raw |
|
2211 |
- CONTAINER_FORMAT=bare |
|
2212 |
- ;; |
|
2213 |
- *.img.gz) |
|
2214 |
- IMAGE="$FILES/${IMAGE_FNAME}" |
|
2215 |
- IMAGE_NAME=$(basename "$IMAGE" ".img.gz") |
|
2216 |
- DISK_FORMAT=raw |
|
2217 |
- CONTAINER_FORMAT=bare |
|
2218 |
- UNPACK=zcat |
|
2219 |
- ;; |
|
2220 |
- *.qcow2) |
|
2221 |
- IMAGE="$FILES/${IMAGE_FNAME}" |
|
2222 |
- IMAGE_NAME=$(basename "$IMAGE" ".qcow2") |
|
2223 |
- DISK_FORMAT=qcow2 |
|
2224 |
- CONTAINER_FORMAT=bare |
|
2225 |
- ;; |
|
2226 |
- *) echo "Do not know what to do with $IMAGE_FNAME"; false;; |
|
2227 |
- esac |
|
2228 |
- |
|
2229 |
- if [ "$CONTAINER_FORMAT" = "bare" ]; then |
|
2230 |
- if [ "$UNPACK" = "zcat" ]; then |
|
2231 |
- 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}") |
|
2232 |
- else |
|
2233 |
- 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} |
|
2234 |
- fi |
|
2235 |
- else |
|
2236 |
- # Use glance client to add the kernel the root filesystem. |
|
2237 |
- # We parse the results of the first upload to get the glance ID of the |
|
2238 |
- # kernel for use when uploading the root filesystem. |
|
2239 |
- KERNEL_ID=""; RAMDISK_ID=""; |
|
2240 |
- if [ -n "$KERNEL" ]; then |
|
2241 |
- 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) |
|
2242 |
- fi |
|
2243 |
- if [ -n "$RAMDISK" ]; then |
|
2244 |
- 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) |
|
2245 |
- fi |
|
2246 |
- 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}" |
|
2247 |
- fi |
|
2167 |
+ upload_image $image_url $TOKEN |
|
2248 | 2168 |
done |
2249 | 2169 |
fi |
2250 | 2170 |
|
2251 | 2171 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,42 @@ |
0 |
+#!/usr/bin/env bash |
|
1 |
+# upload_image.sh - Retrieve and upload an image into Glance |
|
2 |
+# |
|
3 |
+# upload_image.sh <image-url> |
|
4 |
+# |
|
5 |
+# Assumes credentials are set via OS_* environment variables |
|
6 |
+ |
|
7 |
+function usage { |
|
8 |
+ echo "$0 - Retrieve and upload an image into Glance" |
|
9 |
+ echo "" |
|
10 |
+ echo "Usage: $0 <image-url> [...]" |
|
11 |
+ echo "" |
|
12 |
+ echo "Assumes credentials are set via OS_* environment variables" |
|
13 |
+ exit 1 |
|
14 |
+} |
|
15 |
+ |
|
16 |
+# Keep track of the current directory |
|
17 |
+TOOLS_DIR=$(cd $(dirname "$0") && pwd) |
|
18 |
+TOP_DIR=$(cd $TOOLS_DIR/..; pwd) |
|
19 |
+ |
|
20 |
+# Import common functions |
|
21 |
+source $TOP_DIR/functions |
|
22 |
+ |
|
23 |
+# Import configuration |
|
24 |
+source $TOP_DIR/openrc "" "" "" "" |
|
25 |
+ |
|
26 |
+# Find the cache dir |
|
27 |
+FILES=$TOP_DIR/files |
|
28 |
+ |
|
29 |
+if [[ -z "$1" ]]; then |
|
30 |
+ usage |
|
31 |
+fi |
|
32 |
+ |
|
33 |
+# Get a token to authenticate to glance |
|
34 |
+TOKEN=$(keystone token-get | grep ' id ' | get_field 2) |
|
35 |
+ |
|
36 |
+# Glance connection info. Note the port must be specified. |
|
37 |
+GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$GLANCE_HOST:9292} |
|
38 |
+ |
|
39 |
+for IMAGE in "$*"; do |
|
40 |
+ upload_image $IMAGE $TOKEN |
|
41 |
+done |