Files
nodepool/nodepool/tests/fake-image-create
Ian Wienand b5b20b6e2c Add parent and abstract flags for diskimages
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
2020-03-20 07:53:08 +11:00

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