15d64e84ba
Airshipctl implementation will provide container inputs via stdin. This patchset allows the image-builder container to accept inputs of this kind. It maintains backwards compatibility with previous verison until it is no longer used by airshipctl. Add control to enable or disable qcow compression. Add wget package to image defaults. Change-Id: I835c183be7ef6e06f2e3550de2a726df6f9d0e3f
154 lines
5.0 KiB
Bash
Executable File
154 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# NOTE: These functions are deprecated. It is only left here
|
|
# for backwards compatibility until airshipctl is migrated
|
|
# away from using it.
|
|
set -x
|
|
|
|
# Defaults
|
|
OUTPUT_METADATA_FILE_NAME_DEFAULT='output-metadata.yaml'
|
|
ISO_NAME_DEFAULT='ephemeral.iso'
|
|
|
|
# Common
|
|
echo "${BUILDER_CONFIG:?}"
|
|
if [ ! -f "${BUILDER_CONFIG}" ]
|
|
then
|
|
echo "file ${BUILDER_CONFIG} not found"
|
|
exit 1
|
|
fi
|
|
|
|
_validate_param(){
|
|
PARAM_VAL="$1"
|
|
PARAM_NAME="$2"
|
|
# Validate that a paramter is defined (default) or that
|
|
# it is defined and represents the path of a file or
|
|
# directory that is found on the filesystem (VAL_TYPE=file)
|
|
VAL_TYPE="$3"
|
|
NO_NULL_EXIT="$4"
|
|
echo "${PARAM_VAL:?}"
|
|
# yq will return the 'null' string if a key is either undefined or defined with no value
|
|
if [[ "${PARAM_VAL}" =~ null$ ]]
|
|
then
|
|
echo "variable ${PARAM_NAME} is not present in ${BUILDER_CONFIG}"
|
|
if [[ "${NO_NULL_EXIT}" == 'no_null_exit' ]]; then
|
|
echo "Using defaults"
|
|
else
|
|
exit 1
|
|
fi
|
|
else
|
|
if [[ ${VAL_TYPE} == 'file' ]]; then
|
|
if [[ ! -e "${PARAM_VAL}" ]]
|
|
then
|
|
echo "${PARAM_VAL} not exist"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
IFS=':' read -ra ADDR <<<"$(yq r "${BUILDER_CONFIG}" container.volume)"
|
|
HOST_PATH="${ADDR[0]}"
|
|
VOLUME="${ADDR[1]}"
|
|
_validate_param "${VOLUME}" "container.volume" file
|
|
|
|
# Read IMAGE_TYPE from the builder config yaml if not supplied as an env var
|
|
if [[ -z "${IMAGE_TYPE}" ]]; then
|
|
IMAGE_TYPE="$(yq r "${BUILDER_CONFIG}" "builder.imageType")"
|
|
# Make iso builds the default for backwards compatibility
|
|
if [[ "${IMAGE_TYPE}" == 'null' ]]; then
|
|
echo "NOTE: No builder.imageType specified. Assuming 'iso'."
|
|
IMAGE_TYPE='iso'
|
|
fi
|
|
fi
|
|
|
|
if [[ -z "${OUTPUT_METADATA_FILE_NAME}" ]]; then
|
|
OUTPUT_METADATA_FILE_NAME="$(yq r "${BUILDER_CONFIG}" builder.outputMetadataFileName)"
|
|
if [[ "${OUTPUT_METADATA_FILE_NAME}" == 'null' ]]; then
|
|
echo "NOTE: No builder.outputMetadataFileName specified. Assuming '${OUTPUT_METADATA_FILE_NAME_DEFAULT}'."
|
|
OUTPUT_METADATA_FILE_NAME="${OUTPUT_METADATA_FILE_NAME_DEFAULT}"
|
|
fi
|
|
fi
|
|
|
|
OUTPUT_FILE_NAME="$(yq r "${BUILDER_CONFIG}" builder.outputFileName)"
|
|
|
|
_make_metadata(){
|
|
IMG_NAME="$1"
|
|
OUTPUT_METADATA_FILE_PATH="${VOLUME}/${OUTPUT_METADATA_FILE_NAME}"
|
|
# Instruct airshipctl where to locate the output image artifact
|
|
echo "bootImagePath: ${HOST_PATH}/${IMG_NAME}" > "${OUTPUT_METADATA_FILE_PATH}"
|
|
# Also include the image md5sum
|
|
md5sum=$(md5sum "${VOLUME}/${IMG_NAME}" | awk '{print $1}')
|
|
echo "md5sum: $md5sum" | tee -a "${OUTPUT_METADATA_FILE_PATH}"
|
|
}
|
|
|
|
_process_input_data_set_vars_osconfig(){
|
|
if [[ -z "${OSCONFIG_FILE}" ]]; then
|
|
OSCONFIG_FILE="$(yq r "${BUILDER_CONFIG}" builder.osconfigVarsFileName)"
|
|
fi
|
|
OSCONFIG_FILE="${VOLUME}/${OSCONFIG_FILE}"
|
|
_validate_param "${OSCONFIG_FILE}" builder.osconfigVarsFileName file no_null_exit
|
|
# Optional user-supplied playbook vars
|
|
if [[ -f "${OSCONFIG_FILE}" ]]; then
|
|
cp "${OSCONFIG_FILE}" /opt/assets/playbooks/roles/osconfig/vars/main.yaml
|
|
fi
|
|
}
|
|
|
|
_process_input_data_set_vars_iso(){
|
|
# Required user provided input
|
|
if [[ -z "${USER_DATA_FILE}" ]]; then
|
|
USER_DATA_FILE="$(yq r "${BUILDER_CONFIG}" builder.userDataFileName)"
|
|
fi
|
|
USER_DATA_FILE="${VOLUME}/${USER_DATA_FILE}"
|
|
_validate_param "${USER_DATA_FILE}" builder.userDataFileName file
|
|
|
|
# Required user provided input
|
|
if [[ -z "${NET_CONFIG_FILE}" ]]; then
|
|
NET_CONFIG_FILE="$(yq r "${BUILDER_CONFIG}" builder.networkConfigFileName)"
|
|
fi
|
|
NET_CONFIG_FILE="${VOLUME}/${NET_CONFIG_FILE}"
|
|
_validate_param "${NET_CONFIG_FILE}" builder.networkConfigFileName file
|
|
# cloud-init expects net confing specifically in json format
|
|
NET_CONFIG_JSON_FILE=/tmp/network_data.json
|
|
yq r -j "${NET_CONFIG_FILE}" > "${NET_CONFIG_JSON_FILE}"
|
|
|
|
# Optional user provided input
|
|
if [[ ${OUTPUT_FILE_NAME} != null ]]; then
|
|
IMG_NAME="${OUTPUT_FILE_NAME}"
|
|
else
|
|
IMG_NAME="${ISO_NAME_DEFAULT}"
|
|
fi
|
|
cat << EOF > /opt/assets/playbooks/roles/iso/vars/main.yaml
|
|
meta_data_file: ${BASEDIR}/meta_data.json
|
|
user_data_file: ${USER_DATA_FILE}
|
|
network_data_file: ${NET_CONFIG_JSON_FILE}
|
|
EOF
|
|
}
|
|
|
|
_process_input_data_set_vars_qcow(){
|
|
IMG_NAME=null
|
|
if [[ -z "${QCOW_CONFIG_FILE}" ]]; then
|
|
QCOW_CONFIG_FILE="$(yq r "${BUILDER_CONFIG}" builder.qcowVarsFileName)"
|
|
fi
|
|
QCOW_CONFIG_FILE="${VOLUME}/${QCOW_CONFIG_FILE}"
|
|
_validate_param "${QCOW_CONFIG_FILE}" builder.qcowVarsFileName file no_null_exit
|
|
# Optional user-supplied playbook vars
|
|
if [[ -f "${QCOW_CONFIG_FILE}" ]]; then
|
|
cp "${QCOW_CONFIG_FILE}" /opt/assets/playbooks/roles/qcow/vars/main.yaml
|
|
|
|
# Extract the image output name in the ansible vars file provided
|
|
IMG_NAME="$(yq r "${QCOW_CONFIG_FILE}" img_name)"
|
|
fi
|
|
|
|
# Retrieve from playbook defaults if not provided in user input
|
|
if [[ "${IMG_NAME}" == 'null' ]]; then
|
|
IMG_NAME="$(yq r /opt/assets/playbooks/roles/qcow/defaults/main.yaml img_name)"
|
|
fi
|
|
|
|
# User-supplied image output name in builder-config takes precedence
|
|
if [[ ${OUTPUT_FILE_NAME} != null ]]; then
|
|
IMG_NAME="${OUTPUT_FILE_NAME}"
|
|
else
|
|
_validate_param "${IMG_NAME}" img_name
|
|
fi
|
|
}
|
|
|