#!/usr/bin/env bash set -eo pipefail shopt -s globstar prepare() { mkdir -p "${WORKDIR}" curl -SsfL -o "${WORKDIR}/${NAME}.crds.yaml" "${SOURCE}" } output() { TARGET_DIR="$DIST/$API" mkdir -p "$TARGET_DIR" for FILE in "${WORKDIR}"/*.json; do FILENAME=$(basename "$FILE") mv "$FILE" "$TARGET_DIR/$FILENAME" done } generate_all() { export SOURCE=$1 export TYPE=anyOf gomplate -d source=env:SOURCE -d type=env:TYPE -o "$SOURCE/all-$TYPE.json" -f templates/all.json.tmpl export TYPE=oneOf gomplate -d source=env:SOURCE -d type=env:TYPE -o "$SOURCE/all-$TYPE.json" -f templates/all.json.tmpl } exec_openapi() { printf "Processing %s ...\n" "$1" prepare ( cd "$WORKDIR" openapi2jsonschema "${NAME}.crds.yaml" >/dev/null ) output generate_all "$TARGET_DIR" } calico_handler() { API=projectcalico.org NAME=calico WORKDIR="${TMP_CRD_DIR}/calico" SOURCE="https://raw.githubusercontent.com/projectcalico/calico/${CALICO_VERSION}/manifests/calico.yaml" printf "Processing %s ...\n" $API prepare ( cd "$WORKDIR" openapi2jsonschema "${NAME}.crds.yaml" >/dev/null ) TARGET_DIR="$DIST/$API" mkdir -p "$TARGET_DIR" for FILE in "${WORKDIR}"/*.json; do FILENAME=$(basename "$FILE") mv "$FILE" "$TARGET_DIR/${FILENAME//_v1/_v3}" done generate_all "$TARGET_DIR" } flux_handler() { API=toolkit.fluxcd.io WORKDIR="${TMP_CRD_DIR}/flux" SOURCE="https://github.com/fluxcd/flux2/releases/download/${FLUXCD_VERSION}/crd-schemas.tar.gz" printf "Processing %s ...\n" $API mkdir -p "${WORKDIR}" curl -SsfL "${SOURCE}" | tar xz -C "${WORKDIR}" for FILE in "${WORKDIR}"/*.json; do FILENAME=$(basename "$FILE") PREFIX="${FILENAME%%\-*}" MIDDLE="${FILENAME#*-}" SUFFIX="${MIDDLE#*-}" MIDDLE="${MIDDLE%%\-*}" TARGET_DIR="$DIST/$MIDDLE.$API" TARGET_NAME="$TARGET_DIR/$PREFIX""_""$SUFFIX" mkdir -p "$TARGET_DIR" mv "$FILE" "$TARGET_NAME" generate_all "$TARGET_DIR" done } metallb_handler() { API=metallb.io NAME=metallb WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://raw.githubusercontent.com/metallb/metallb/${METALLB_VERSION}/charts/metallb/charts/crds/templates/crds.yaml" printf "Processing %s ...\n" $API prepare ( cd "$WORKDIR" yq --inplace 'del(.spec.conversion)' "${NAME}.crds.yaml" openapi2jsonschema "${NAME}.crds.yaml" >/dev/null ) output generate_all "$TARGET_DIR" } objectbucket_handler() { API=objectbucket.io NAME=objectbucket WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://github.com/kube-object-storage/lib-bucket-provisioner/archive/refs/tags/kubernetes-v1.14.1.tar.gz" printf "Processing %s ...\n" $API mkdir -p "${WORKDIR}" curl -SsfL "${SOURCE}" | tar xz -C "${WORKDIR}" --strip-components=1 ( cd "$WORKDIR" for FILE in "${WORKDIR}"/deploy/crds/*crd.yaml; do openapi2jsonschema "${FILE}" >/dev/null done ) output generate_all "$TARGET_DIR" } cnpg_handler() { API=postgresql.cnpg.io NAME=cnpg WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://github.com/cloudnative-pg/cloudnative-pg/releases/download/${CNPG_VERSION}/cnpg-${CNPG_VERSION##v}.yaml" exec_openapi $API } certmanager_handler() { API=cert-manager.io NAME=cert-manager WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://github.com/cert-manager/cert-manager/releases/download/${CERTMANAGER_VERSION}/cert-manager.crds.yaml" exec_openapi $API } minio_handler() { API=minio.min.io NAME=minio WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://raw.githubusercontent.com/minio/operator/${MINIO_VERSION}/resources/base/crds/minio.min.io_tenants.yaml" exec_openapi $API } k8up_handler() { API=k8up.io NAME=k8up WORKDIR="${TMP_CRD_DIR}/$NAME" SOURCE="https://github.com/k8up-io/k8up/releases/download/k8up-${K8UP_VERSION}/k8up-crd.yaml" exec_openapi $API } handlers=( calico_handler flux_handler metallb_handler objectbucket_handler cnpg_handler certmanager_handler minio_handler k8up_handler ) if [ $# -eq 0 ]; then for handler in "${handlers[@]}"; do "$handler" done else "$1"_handler fi