mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-11-01 10:48:15 +00:00
Simpler openapi gen - subprojects do themselves
This involves moving the report files, but it allows me to delete the indirect variable and indirect array code in update-codgen. As proud as I was of figuring that out, I am also ashamed of myself for doing it. This is my atonement.
This commit is contained in:
@@ -497,47 +497,6 @@ function k8s_tag_files_except() {
|
||||
done
|
||||
}
|
||||
|
||||
# $@: directories to exclude
|
||||
# example:
|
||||
# k8s_tag_files_matching foo bat/qux
|
||||
function k8s_tag_files_matching() {
|
||||
for f in "${ALL_K8S_TAG_FILES[@]}"; do
|
||||
for x in "$@"; do
|
||||
if [[ "$f" =~ "${x}"/.* ]]; then
|
||||
echo "$f"
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
# $1: the name of a scalar variable to read
|
||||
# example:
|
||||
# FOO_VAR="foo value"
|
||||
# BAR_VAR="bar value"
|
||||
# x=FOO
|
||||
# indirect "${x}_VAR" # -> "foo value\n"
|
||||
function indirect() {
|
||||
# This is a trick to get bash to indirectly read a variable.
|
||||
# Thanks StackOverflow!
|
||||
local var="$1"
|
||||
echo "${!var}"
|
||||
}
|
||||
|
||||
# $1: the name of an array variable to read
|
||||
# FOO_ARR=(a b c)
|
||||
# BAR_ARR=(1 2 3)
|
||||
# x=FOO
|
||||
# indirect_array "${x}_ARR" # -> "a\nb\nc\n"
|
||||
function indirect_array() {
|
||||
# This is a trick to get bash to indirectly read an array.
|
||||
# Thanks StackOverflow!
|
||||
local arrayname="$1"
|
||||
# shellcheck disable=SC1087 # intentional
|
||||
local tmp="$arrayname[@]"
|
||||
printf -- "%s\n" "${!tmp}"
|
||||
}
|
||||
|
||||
# OpenAPI generation
|
||||
#
|
||||
# Any package that wants open-api functions generated must include a
|
||||
@@ -555,148 +514,73 @@ function codegen::openapi() {
|
||||
local gen_openapi_bin
|
||||
gen_openapi_bin="$(kube::util::find-binary "openapi-gen")"
|
||||
|
||||
# Standard dirs which all targets need.
|
||||
local apimachinery_dirs=(
|
||||
vendor/k8s.io/apimachinery/pkg/apis/meta/v1
|
||||
vendor/k8s.io/apimachinery/pkg/runtime
|
||||
vendor/k8s.io/apimachinery/pkg/version
|
||||
)
|
||||
local output_dir="pkg/generated/openapi"
|
||||
local known_violations_file="api/api-rules/violation_exceptions.list"
|
||||
|
||||
# These should probably be configured by tags in code-files somewhere.
|
||||
local targets=(
|
||||
KUBE
|
||||
AGGREGATOR
|
||||
APIEXTENSIONS
|
||||
CODEGEN
|
||||
SAMPLEAPISERVER
|
||||
)
|
||||
local report_file="${OUT_DIR}/api_violations.report"
|
||||
# When UPDATE_API_KNOWN_VIOLATIONS is set to be true, let the generator to write
|
||||
# updated API violations to the known API violation exceptions list.
|
||||
if [[ "${UPDATE_API_KNOWN_VIOLATIONS}" == true ]]; then
|
||||
report_file="${known_violations_file}"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local KUBE_output_dir="pkg/generated/openapi"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local KUBE_known_violations_file="api/api-rules/violation_exceptions.list"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local KUBE_tag_files=()
|
||||
kube::util::read-array KUBE_tag_files < <(
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: finding all +k8s:openapi-gen tags"
|
||||
fi
|
||||
|
||||
local tag_files=()
|
||||
kube::util::read-array tag_files < <(
|
||||
k8s_tag_files_except \
|
||||
vendor/k8s.io/code-generator \
|
||||
vendor/k8s.io/sample-apiserver
|
||||
)
|
||||
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local AGGREGATOR_output_dir="staging/src/k8s.io/kube-aggregator/pkg/generated/openapi"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local AGGREGATOR_known_violations_file="api/api-rules/aggregator_violation_exceptions.list"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local AGGREGATOR_tag_files=()
|
||||
kube::util::read-array AGGREGATOR_tag_files < <(
|
||||
k8s_tag_files_matching \
|
||||
vendor/k8s.io/kube-aggregator \
|
||||
"${apimachinery_dirs[@]}"
|
||||
)
|
||||
local tag_dirs=()
|
||||
kube::util::read-array tag_dirs < <(
|
||||
grep -l --null '+k8s:openapi-gen=' "${tag_files[@]}" \
|
||||
| xargs -0 -n1 dirname \
|
||||
| sort -u)
|
||||
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local APIEXTENSIONS_output_dir="staging/src/k8s.io/apiextensions-apiserver/pkg/generated/openapi"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local APIEXTENSIONS_known_violations_file="api/api-rules/apiextensions_violation_exceptions.list"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local APIEXTENSIONS_tag_files=()
|
||||
kube::util::read-array APIEXTENSIONS_tag_files < <(
|
||||
k8s_tag_files_matching \
|
||||
vendor/k8s.io/apiextensions-apiserver \
|
||||
vendor/k8s.io/api/autoscaling/v1 \
|
||||
"${apimachinery_dirs[@]}"
|
||||
)
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: found ${#tag_dirs[@]} +k8s:openapi-gen tagged dirs"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local CODEGEN_output_dir="staging/src/k8s.io/code-generator/examples/apiserver/openapi"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local CODEGEN_known_violations_file="api/api-rules/codegen_violation_exceptions.list"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local CODEGEN_tag_files=()
|
||||
kube::util::read-array CODEGEN_tag_files < <(
|
||||
k8s_tag_files_matching \
|
||||
vendor/k8s.io/code-generator \
|
||||
"${apimachinery_dirs[@]}"
|
||||
)
|
||||
local tag_pkgs=()
|
||||
for dir in "${tag_dirs[@]}"; do
|
||||
tag_pkgs+=("${PRJ_SRC_PATH}/$dir")
|
||||
done
|
||||
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local SAMPLEAPISERVER_output_dir="staging/src/k8s.io/sample-apiserver/pkg/generated/openapi"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local SAMPLEAPISERVER_known_violations_file="api/api-rules/sample_apiserver_violation_exceptions.list"
|
||||
# shellcheck disable=SC2034 # used indirectly
|
||||
local SAMPLEAPISERVER_tag_files=()
|
||||
kube::util::read-array SAMPLEAPISERVER_tag_files < <(
|
||||
k8s_tag_files_matching \
|
||||
vendor/k8s.io/sample-apiserver \
|
||||
"${apimachinery_dirs[@]}"
|
||||
)
|
||||
|
||||
git_find -z ':(glob)**'/"${output_base}.go" | xargs -0 rm -f
|
||||
|
||||
for prefix in "${targets[@]}"; do
|
||||
local report_file="${OUT_DIR}/${prefix}_violations.report"
|
||||
# When UPDATE_API_KNOWN_VIOLATIONS is set to be true, let the generator to write
|
||||
# updated API violations to the known API violation exceptions list.
|
||||
if [[ "${UPDATE_API_KNOWN_VIOLATIONS}" == true ]]; then
|
||||
report_file=$(indirect "${prefix}_known_violations_file")
|
||||
fi
|
||||
|
||||
# 2 lines because shellcheck
|
||||
local output_dir
|
||||
output_dir=$(indirect "${prefix}_output_dir")
|
||||
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: finding all +k8s:openapi-gen tags for ${prefix}"
|
||||
fi
|
||||
|
||||
local tag_dirs=()
|
||||
kube::util::read-array tag_dirs < <(
|
||||
grep -l --null '+k8s:openapi-gen=' $(indirect_array "${prefix}_tag_files") \
|
||||
| xargs -0 -n1 dirname \
|
||||
| sort -u)
|
||||
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: found ${#tag_dirs[@]} +k8s:openapi-gen tagged dirs for ${prefix}"
|
||||
fi
|
||||
|
||||
local tag_pkgs=()
|
||||
kube::log::status "Generating openapi code"
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: running ${gen_openapi_bin} for:"
|
||||
for dir in "${tag_dirs[@]}"; do
|
||||
tag_pkgs+=("${PRJ_SRC_PATH}/$dir")
|
||||
kube::log::status "DBG: $dir"
|
||||
done
|
||||
fi
|
||||
|
||||
kube::log::status "Generating openapi code for ${prefix}"
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "DBG: running ${gen_openapi_bin} for:"
|
||||
for dir in "${tag_dirs[@]}"; do
|
||||
kube::log::status "DBG: $dir"
|
||||
done
|
||||
fi
|
||||
git_find -z ':(glob)pkg/generated/**'/"${output_base}.go" | xargs -0 rm -f
|
||||
|
||||
./hack/run-in-gopath.sh "${gen_openapi_bin}" \
|
||||
--v "${KUBE_VERBOSE}" \
|
||||
--logtostderr \
|
||||
-h "${BOILERPLATE_FILENAME}" \
|
||||
-O "${output_base}" \
|
||||
-p "${PRJ_SRC_PATH}/${output_dir}" \
|
||||
-r "${report_file}" \
|
||||
$(printf -- " -i %s" "${tag_pkgs[@]}") \
|
||||
"$@"
|
||||
./hack/run-in-gopath.sh "${gen_openapi_bin}" \
|
||||
--v "${KUBE_VERBOSE}" \
|
||||
--logtostderr \
|
||||
-h "${BOILERPLATE_FILENAME}" \
|
||||
-O "${output_base}" \
|
||||
-p "${PRJ_SRC_PATH}/${output_dir}" \
|
||||
-r "${report_file}" \
|
||||
$(printf -- " -i %s" "${tag_pkgs[@]}") \
|
||||
"$@"
|
||||
|
||||
touch "${report_file}"
|
||||
# 2 lines because shellcheck
|
||||
local known_filename
|
||||
known_filename=$(indirect "${prefix}_known_violations_file")
|
||||
if ! diff -u "${known_filename}" "${report_file}"; then
|
||||
echo -e "ERROR:"
|
||||
echo -e "\t'${prefix}' API rule check failed - reported violations differ from known violations"
|
||||
echo -e "\tPlease read api/api-rules/README.md to resolve the failure in ${known_filename}"
|
||||
fi
|
||||
touch "${report_file}"
|
||||
local known_filename="${known_violations_file}"
|
||||
if ! diff -u "${known_filename}" "${report_file}"; then
|
||||
echo -e "ERROR:"
|
||||
echo -e "\tAPI rule check failed - reported violations differ from known violations"
|
||||
echo -e "\tPlease read api/api-rules/README.md to resolve the failure in ${known_filename}"
|
||||
fi
|
||||
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "Generated openapi code"
|
||||
fi
|
||||
done # for each prefix
|
||||
if [[ "${DBG_CODEGEN}" == 1 ]]; then
|
||||
kube::log::status "Generated openapi code"
|
||||
fi
|
||||
}
|
||||
|
||||
function codegen::applyconfigs() {
|
||||
|
||||
Reference in New Issue
Block a user