While YAML does have inbuilt support for anchors to greatly reduce duplicated sections, anchors have no support for merging values. For diskimages, this can result in a lot of duplicated values for each image which you can not otherwise avoid. This provides two new values for diskimages; a "parent" and "abstract". Specifying a parent means you inherit all the configuration values from that image. Anything specified within the child image overwrites the parent values as you would expect; caveats, as described in the documentation, are that the elements field appends and the env-vars field has update() semantics. An "abstract" diskimage is not instantiated into a real image, it is only used for configuration inheritance. This way you can make a abstrat "base" image with common values and inherit that everywhere without having to worry about bringing in values you don't want. You can also chain parents together and the inheritance flows through. Documentation is updated, and several tests are added to ensure the correct parenting, merging and override behaviour of the new values. Change-Id: I170016ef7d8443b9830912b9b0667370e6afcde7
167 lines
4.9 KiB
Bash
Executable File
167 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
echo "*** fake-image-create: start"
|
|
|
|
echo "arguments:"
|
|
echo "----"
|
|
echo $*
|
|
echo "----"
|
|
|
|
if [[ "${DIB_RELEASE}" != "21" ]]; then
|
|
echo "DIB_RELEASE not set correctly"
|
|
exit 1
|
|
fi
|
|
|
|
# test passing of real-life env-vars
|
|
if [[ "${TMPDIR}" != "/opt/dib_tmp" ]]; then
|
|
echo "TMPDIR not set"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "${DIB_IMAGE_CACHE}" != "/opt/dib_cache" ]]; then
|
|
echo "DIB_IMAGE_CACHE not set"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "${DIB_CLOUD_IMAGES}" != "http://download.fedoraproject.org/pub/fedora/linux/releases/test/21-Beta/Cloud/Images/x86_64/" ]]; then
|
|
echo "DIB_CLOUD_IMAGES not set"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "${BASE_IMAGE_FILE}" != "Fedora-Cloud-Base-20141029-21_Beta.x86_64.qcow2" ]]; then
|
|
echo "BASE_IMAGE_FILE not set"
|
|
exit 1
|
|
fi
|
|
|
|
outfile=
|
|
outtypes=("qcow2")
|
|
|
|
TEMP=$(getopt -o xo:t: --long qemu-img-options:,no-tmpfs,checksum -- "$@")
|
|
if [ $? -ne 0 ]; then
|
|
echo "Invalid option"
|
|
exit 1
|
|
fi
|
|
eval set -- "$TEMP"
|
|
while true ; do
|
|
case "$1" in
|
|
--checksum)
|
|
echo " -> set --checksum"; shift 1;;
|
|
--no-tmpfs)
|
|
echo " -> set --no-tmpfs"; shift 1;;
|
|
--qemu-img-options)
|
|
echo " -> qemu-img-options: $2"; shift 2;;
|
|
-o) outfile=$2; shift 2;;
|
|
-t) IFS="," read -a outtypes <<< "$2"; shift 2;;
|
|
-x) echo " -> debugging enabled"; shift;;
|
|
--) shift ; break ;;
|
|
*) echo "Unknown option : $1"; exit 1;;
|
|
esac
|
|
done
|
|
|
|
ELEMENTS="$@"
|
|
|
|
if [ -z "$outfile" ]; then
|
|
echo "No output file specified."
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# WTF is this testing? That we merge abstract diskimages correctly
|
|
# into children and append/override variables correctly. The two
|
|
# images in the test config file
|
|
# (/nodepool/tests/fixtures/node_diskimage_parents.yaml) set
|
|
# PARENT_TEST_FLAG which we gate on here so we only run this for that
|
|
# test. The diskimage layout when hitting this path is roughly like
|
|
# this:
|
|
#
|
|
# %%%%% abstract-base %%%%%
|
|
# elements: fedora
|
|
# env: TMPDIR, DIB_IMAGE_... (and so on)
|
|
# PARENT_TEST_ENV_OVERRIDE=abstract-base
|
|
# | |
|
|
# |-------+ +-------|
|
|
# | |
|
|
# | |
|
|
# | %%%%% abstract-intermediate %%%%%
|
|
# | elements: intermediate
|
|
# | env: PARENT_TEST_ENV_INTERMEDIATE=abstract-intermediate
|
|
# | |
|
|
# | |
|
|
# %%%%% parent-image-1 %%%%% %%%%% parent-image-2 %%%%%%
|
|
# elements: vm elements: vm
|
|
# env: PARENT_TEST_FLAG=base env: PARENT_TEST_FLAG=intermediate
|
|
# PARENT_TEST_ENV_OVERRIDE=parent-image-2
|
|
#
|
|
# So for parent-image-1 we want to see elements "fedora vm" and for
|
|
# parent-image-2 we want to see "fedora intermediate vm"; and similar
|
|
# updates/overrides for the env-vars.
|
|
#
|
|
if [[ -n "${PARENT_TEST_FLAG}" ]]; then
|
|
|
|
if [[ "${PARENT_TEST_FLAG}" == "base" ]]; then
|
|
# Note we've already tested the base-defined env-vars like
|
|
# TMPDIR, DIB_*, etc. are merged because they're tested above.
|
|
if [[ "${ELEMENTS}" != "fedora vm" ]]; then
|
|
echo "Elements list did not merge correctly"
|
|
exit 1
|
|
else
|
|
echo " -> Base elements list correctly merged"
|
|
fi
|
|
|
|
elif [[ "${PARENT_TEST_FLAG}" == "intermediate" ]]; then
|
|
|
|
if [[ "${ELEMENTS}" != "fedora intermediate vm" ]]; then
|
|
echo "Elements list did not merge correctly"
|
|
exit 1
|
|
else
|
|
echo " -> Intermediate elements list correctly merged"
|
|
fi
|
|
|
|
if [[ "${PARENT_TEST_ENV_INTERMEDIATE}" != "abstract-intermediate" ]]; then
|
|
echo "Did not see intermediate env value in final job"
|
|
exit 1
|
|
else
|
|
echo " -> Intermediate env value correctly merged"
|
|
fi
|
|
|
|
if [[ "${PARENT_TEST_ENV_OVERRIDE}" != "parent-image-2" ]]; then
|
|
echo "Final job did not override PARENT_TEST_ENV_OVERRIDE correctly"
|
|
exit 1
|
|
else
|
|
echo " -> Env override correct"
|
|
fi
|
|
else
|
|
echo "Invalid PARENT_TEST_IMAGE?"
|
|
exit 1
|
|
fi
|
|
|
|
fi
|
|
|
|
# Tests can pause this script by creating this file before it runs.
|
|
# No dib files should be created yet at the pause point.
|
|
tmpdir=$(dirname $outfile)
|
|
pause_file="$tmpdir/fake-image-create.pause"
|
|
while [ -f "$pause_file" ]
|
|
do
|
|
sleep .1
|
|
done
|
|
|
|
for outtype in ${outtypes[@]} ; do
|
|
echo "fake-data" > $outfile.$outtype
|
|
echo "10da41d43d4bd6d67db763616c18b72f" > $outfile.$outtype.md5
|
|
echo "0033e9d444953d11689b5fa6a6dba32bf901582f62b0825bc35f593190b1f7dc" > $outfile.$outtype.sha256
|
|
done
|
|
|
|
# Emulate manifest creation
|
|
mkdir $outfile.d
|
|
|
|
if [[ "${SHOULD_FAIL}" == 'true' ]]; then
|
|
echo "Should fail is set, exiting with status 127"
|
|
exit 127
|
|
fi
|
|
|
|
echo "*** fake-image-create: done"
|
|
|
|
# Tests might need to know when this process is completed
|
|
touch $tmpdir/fake-image-create.done
|