blob: 695fea50c509676a50b255cc4b9ccc6c961e6dc1 [file] [log] [blame]
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
set -e
POLICY=$1
VERSION=$2
TOOLS_LOCATION=$3
POLICIES_DIR=pkg/plugins/policies
POLICIES_API_DIR="${POLICIES_DIR}/${POLICY}/api/${VERSION}"
POLICIES_CRD_DIR="${POLICIES_DIR}/${POLICY}/k8s/crd"
SCHEMA_TEMPLATE="${TOOLS_LOCATION}/policy-gen/templates/schema.yaml"
# 1. Copy file ${SCHEMA_TEMPLATE} to ${POLICIES_API_DIR}/schema.yaml. It contains
# information about fields that are equal for all resources 'type', 'mesh' and 'name'.
#
# 2. Using yq extract item from the list '.spec.version[]' that has ${VERSION} and
# take '.schema.openAPIV3Schema.properties.spec'.
#
# 3. Delete 'type' and 'description' for the extracted item, because these are 'type'
# and 'description' for the 'spec' field.
#
# 4. Using yq eval-all with ireduce merge the file from Step 1 and output from Step 3,
# placing the result into the file from Step 1
echo "Generating schema for ${POLICY}/${VERSION} based on CRD"
function cleanupOnError() {
rm "${POLICIES_API_DIR}"/schema.yaml
echo "Script failed, schema.yaml wasn't generated"
}
trap cleanupOnError ERR
cp "${SCHEMA_TEMPLATE}" "${POLICIES_API_DIR}"/schema.yaml
if [ "$(find "${POLICIES_CRD_DIR}" -type f | wc -l | xargs echo)" != 1 ]; then
echo "Exactly 1 file is expected in ${POLICIES_CRD_DIR}"
exit 1
fi
CRD_FILE=$(find "${POLICIES_CRD_DIR}" -type f)
yq e -i ".properties.spec += (load(\"${CRD_FILE}\") | .spec.versions[] | select (.name == \"${VERSION}\") | .schema.openAPIV3Schema.properties.spec)" "${POLICIES_API_DIR}"/schema.yaml
yq e -i ".properties.type.enum = [load(\"${CRD_FILE}\") | .spec.names.kind]" "${POLICIES_API_DIR}"/schema.yaml