mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
# SPDX-License-Identifier: AGPL-3.0-only
 | 
						|
# Provenance-includes-location: https://github.com/kubernetes/code-generator/blob/master/kube_codegen.sh
 | 
						|
# Provenance-includes-license: Apache-2.0
 | 
						|
# Provenance-includes-copyright: The Kubernetes Authors.
 | 
						|
 | 
						|
## NOTE: The following is a fork of the original gen_openapi helper in k8s.io/code-generator
 | 
						|
## It allows us to generate separate openapi packages per api group.
 | 
						|
 | 
						|
# Generate openapi code
 | 
						|
#
 | 
						|
# Args:
 | 
						|
#
 | 
						|
#   --input-pkg-single <string>
 | 
						|
#     The root directory of a single grafana API Group.
 | 
						|
#
 | 
						|
#   --output-base <string>
 | 
						|
#     The root directory under which to emit code.  The concatenation of
 | 
						|
#     <output-base> + <input-pkg-single> must be valid.
 | 
						|
#
 | 
						|
#   --report-filename <string = "/dev/null">
 | 
						|
#     The filename of the API violations report in the input pkg directory.
 | 
						|
#
 | 
						|
#   --update-report
 | 
						|
#     If specified, update the report file in place, rather than diffing it.
 | 
						|
#
 | 
						|
#   --boilerplate <string = path_to_kube_codegen_boilerplate>
 | 
						|
#     An optional override for the header file to insert into generated files.
 | 
						|
 | 
						|
set -o errexit
 | 
						|
set -o nounset
 | 
						|
set -o pipefail
 | 
						|
 | 
						|
KUBE_CODEGEN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
 | 
						|
 | 
						|
source "${CODEGEN_PKG}/kube_codegen.sh"
 | 
						|
#
 | 
						|
function grafana::codegen::gen_openapi() {
 | 
						|
    local in_pkg_single=""
 | 
						|
    local out_base=""
 | 
						|
    local report="/dev/null"
 | 
						|
    local update_report=""
 | 
						|
    local include_common_input_dirs=""
 | 
						|
    local boilerplate="${KUBE_CODEGEN_ROOT}/hack/boilerplate.go.txt"
 | 
						|
    local v="${KUBE_VERBOSE:-0}"
 | 
						|
 | 
						|
    while [ "$#" -gt 0 ]; do
 | 
						|
        case "$1" in
 | 
						|
        "--input-pkg-single")
 | 
						|
            in_pkg_single="$2"
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        "--include-common-input-dirs")
 | 
						|
            if [ "$2" == "true" ]; then
 | 
						|
                COMMON_INPUT_DIRS='k8s.io/apimachinery/pkg/apis/meta/v1 k8s.io/apimachinery/pkg/runtime k8s.io/apimachinery/pkg/version'
 | 
						|
            else
 | 
						|
                COMMON_INPUT_DIRS=""
 | 
						|
            fi
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        "--output-base")
 | 
						|
            out_base="$2"
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        "--report-filename")
 | 
						|
            report="$2"
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        "--update-report")
 | 
						|
            update_report="true"
 | 
						|
            shift
 | 
						|
            ;;
 | 
						|
        "--boilerplate")
 | 
						|
            boilerplate="$2"
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        *)
 | 
						|
            echo "unknown argument: $1" >&2
 | 
						|
            return 1
 | 
						|
            ;;
 | 
						|
        esac
 | 
						|
    done
 | 
						|
 | 
						|
    if [ -z "${in_pkg_single}" ]; then
 | 
						|
        echo "--input-pkg-single is required" >&2
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ -z "${report}" ]; then
 | 
						|
        echo "--report-filename is required" >&2
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ -z "${out_base}" ]; then
 | 
						|
        echo "--output-base is required" >&2
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
 | 
						|
    (
 | 
						|
        # To support running this from anywhere, first cd into this directory,
 | 
						|
        # and then install with forced module mode on and fully qualified name.
 | 
						|
        cd "${KUBE_CODEGEN_ROOT}"
 | 
						|
        GO111MODULE=on go mod download
 | 
						|
        BINS=(
 | 
						|
            openapi-gen
 | 
						|
        )
 | 
						|
        # shellcheck disable=2046 # printf word-splitting is intentional
 | 
						|
        GO111MODULE=on go install $(printf "k8s.io/kube-openapi/cmd/%s " "${BINS[@]}")
 | 
						|
    )
 | 
						|
    # Go installs in $GOBIN if defined, and $GOPATH/bin otherwise
 | 
						|
    gobin="${GOBIN:-$(go env GOPATH)/bin}"
 | 
						|
 | 
						|
    # These tools all assume out-dir == in-dir.
 | 
						|
    root="${in_pkg_single}"
 | 
						|
    mkdir -p "${root}"
 | 
						|
 | 
						|
    local input_pkgs=()
 | 
						|
    while read -r dir; do
 | 
						|
        pkg="$(cd "${dir}" && GO111MODULE=on go list -find .)"
 | 
						|
        input_pkgs+=("${pkg}")
 | 
						|
    done < <(
 | 
						|
        (
 | 
						|
            kube::codegen::internal::grep -l --null \
 | 
						|
                -e '+k8s:openapi-gen=' \
 | 
						|
                -r "${root}" \
 | 
						|
                --include '*.go' ||
 | 
						|
                true
 | 
						|
        ) | while read -r -d $'\0' F; do dirname "${F}"; done |
 | 
						|
            LC_ALL=C sort -u
 | 
						|
    )
 | 
						|
 | 
						|
    local new_report=""
 | 
						|
    if [ "${#input_pkgs[@]}" == 0 ]; then
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
    echo "Generating openapi code for ${#input_pkgs[@]} targets"
 | 
						|
 | 
						|
    kube::codegen::internal::findz \
 | 
						|
        "${root}" \
 | 
						|
        -type f \
 | 
						|
        -name zz_generated.openapi.go \
 | 
						|
        | xargs -0 rm -f
 | 
						|
 | 
						|
    local new_report
 | 
						|
    new_report="$(mktemp -t "$(basename "$0").api_violations.XXXXXX")"
 | 
						|
    if [ -n "${update_report}" ]; then
 | 
						|
        new_report="${root}/${report}"
 | 
						|
    fi
 | 
						|
 | 
						|
    "${gobin}/openapi-gen" \
 | 
						|
        -v "${v}" \
 | 
						|
        --output-file zz_generated.openapi.go \
 | 
						|
        --go-header-file "${boilerplate}" \
 | 
						|
        --output-dir "${root}" \
 | 
						|
        --output-pkg "github.com/grafana/grafana/${in_pkg_single}" \
 | 
						|
        --report-filename "${new_report}" \
 | 
						|
        ${COMMON_INPUT_DIRS} \
 | 
						|
        "${input_pkgs[@]}"
 | 
						|
 | 
						|
    touch "${root}/${report}" # in case it doesn't exist yet
 | 
						|
    if [[ -z "${new_report}" ]]; then
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
    if ! diff -u "${root}/${report}" "${new_report}"; then
 | 
						|
        echo -e "ERROR:"
 | 
						|
        echo -e "\tAPI rule check failed for ${root}/${report}: new reported violations"
 | 
						|
        echo -e "\tPlease read api/api-rules/README.md"
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
 | 
						|
    # if all goes well, remove the temporary reports
 | 
						|
    if [ -z "${update_report}" ]; then
 | 
						|
        rm -f "${new_report}"
 | 
						|
    fi
 | 
						|
}
 |