diff --git a/Makefile b/Makefile index 959ace8c3d..1fbaff7f53 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,11 @@ GOLANGCI_LINT := $(TOOLS_BIN_DIR)/golangci-lint GOTESTSUM := $(TOOLS_BIN_DIR)/gotestsum KUSTOMIZE := $(TOOLS_BIN_DIR)/kustomize MOCKGEN := $(TOOLS_BIN_DIR)/mockgen +OPENAPI_GEN := $(TOOLS_BIN_DIR)/openapi-gen +APPLYCONFIGURATION_GEN := $(TOOLS_BIN_DIR)/applyconfiguration-gen +CLIENT_GEN := $(TOOLS_BIN_DIR)/client-gen +LISTER_GEN := $(TOOLS_BIN_DIR)/lister-gen +INFORMER_GEN := $(TOOLS_BIN_DIR)/informer-gen RELEASE_NOTES := $(TOOLS_BIN_DIR)/release-notes SETUP_ENVTEST := $(TOOLS_BIN_DIR)/setup-envtest GEN_CRD_API_REFERENCE_DOCS := $(TOOLS_BIN_DIR)/gen-crd-api-reference-docs @@ -304,8 +309,66 @@ generate-controller-gen: $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate/boilerplate.generatego.txt .PHONY: generate-codegen -generate-codegen: generate-controller-gen - ./hack/update-codegen.sh +generate-codegen: generate-controller-gen $(OPENAPI_GEN) $(APPLYCONFIGURATION_GEN) $(CLIENT_GEN) $(LISTER_GEN) $(INFORMER_GEN) + @echo "** Generating OpenAPI definitions **" + # The package list includes: + # - CAPO's own API packages (v1alpha1, v1alpha7, v1beta1) that have // +k8s:openapi-gen= markers + # - Dependency packages from CAPI and k8s.io that are referenced by CAPO's APIs + # - Base k8s.io/apimachinery packages + $(OPENAPI_GEN) \ + --go-header-file=./hack/boilerplate.go.txt \ + --output-file=zz_generated.openapi.go \ + --output-dir=./cmd/models-schema \ + --output-pkg=main \ + --report-filename=./api_violations.report \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1 \ + sigs.k8s.io/cluster-api/api/v1beta1 \ + k8s.io/api/core/v1 \ + k8s.io/apimachinery/pkg/apis/meta/v1 \ + k8s.io/apimachinery/pkg/runtime \ + k8s.io/apimachinery/pkg/version + @echo "** Generating openapi.json **" + go run ./cmd/models-schema | jq > ./openapi.json + @echo "** Generating applyconfiguration code **" + $(APPLYCONFIGURATION_GEN) \ + --go-header-file=./hack/boilerplate.go.txt \ + --output-dir=./pkg/generated/applyconfiguration \ + --output-pkg=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/applyconfiguration \ + --openapi-schema=./openapi.json \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1 + @echo "** Generating clientset code **" + $(CLIENT_GEN) \ + --go-header-file=./hack/boilerplate.go.txt \ + --output-dir=./pkg/generated/clientset \ + --output-pkg=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/clientset \ + --clientset-name=clientset \ + --input-base=sigs.k8s.io/cluster-api-provider-openstack \ + --apply-configuration-package=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/applyconfiguration \ + --input=api/v1alpha1 \ + --input=api/v1alpha7 \ + --input=api/v1beta1 + @echo "** Generating lister code **" + $(LISTER_GEN) \ + --go-header-file=./hack/boilerplate.go.txt \ + --output-dir=./pkg/generated/listers \ + --output-pkg=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/listers \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1 + @echo "** Generating informer code **" + $(INFORMER_GEN) \ + --go-header-file=./hack/boilerplate.go.txt \ + --output-dir=./pkg/generated/informers \ + --output-pkg=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/informers \ + --versioned-clientset-package=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/clientset/clientset \ + --listers-package=sigs.k8s.io/cluster-api-provider-openstack/pkg/generated/listers \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7 \ + sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1 .PHONY: generate-conversion-gen generate-conversion-gen: $(CONVERSION_GEN) diff --git a/hack/tools/Makefile b/hack/tools/Makefile index 7c5cac78f1..48a943a5cf 100644 --- a/hack/tools/Makefile +++ b/hack/tools/Makefile @@ -71,6 +71,26 @@ CONVERSION_GEN := $(BIN_DIR)/conversion-gen $(CONVERSION_GEN): go.mod go.sum | $(BIN_DIR) go build -tags=tools -o $@ k8s.io/code-generator/cmd/conversion-gen +OPENAPI_GEN := $(BIN_DIR)/openapi-gen +$(OPENAPI_GEN): go.mod go.sum | $(BIN_DIR) + go build -tags=tools -o $@ k8s.io/kube-openapi/cmd/openapi-gen + +APPLYCONFIGURATION_GEN := $(BIN_DIR)/applyconfiguration-gen +$(APPLYCONFIGURATION_GEN): go.mod go.sum | $(BIN_DIR) + go build -tags=tools -o $@ k8s.io/code-generator/cmd/applyconfiguration-gen + +CLIENT_GEN := $(BIN_DIR)/client-gen +$(CLIENT_GEN): go.mod go.sum | $(BIN_DIR) + go build -tags=tools -o $@ k8s.io/code-generator/cmd/client-gen + +LISTER_GEN := $(BIN_DIR)/lister-gen +$(LISTER_GEN): go.mod go.sum | $(BIN_DIR) + go build -tags=tools -o $@ k8s.io/code-generator/cmd/lister-gen + +INFORMER_GEN := $(BIN_DIR)/informer-gen +$(INFORMER_GEN): go.mod go.sum | $(BIN_DIR) + go build -tags=tools -o $@ k8s.io/code-generator/cmd/informer-gen + ENVSUBST := $(BIN_DIR)/envsubst $(ENVSUBST): go.mod go.sum | $(BIN_DIR) # Build envsubst from tools folder. go build -tags=tools -o $@ github.com/a8m/envsubst/cmd/envsubst diff --git a/hack/tools/go.mod b/hack/tools/go.mod index cb77df73bd..2d63f1545e 100644 --- a/hack/tools/go.mod +++ b/hack/tools/go.mod @@ -13,7 +13,7 @@ require ( sigs.k8s.io/cluster-api/hack/tools v0.0.0-20221129083400-679ae3e9e6b6 sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230926180527-c93e2abcb28e sigs.k8s.io/controller-tools v0.16.5 - sigs.k8s.io/kustomize/kustomize/v5 v5.7.1 + sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 ) require ( @@ -51,6 +51,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gophercloud/gophercloud/v2 v2.8.0 // indirect github.com/gophercloud/utils/v2 v2.0.0-20241209100706-e3a3b7c07d26 // indirect @@ -132,16 +133,16 @@ require ( k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 // indirect k8s.io/klog v0.2.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect sigs.k8s.io/cluster-api v1.9.11 // indirect sigs.k8s.io/controller-runtime v0.19.7 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d // indirect - sigs.k8s.io/kustomize/api v0.20.1 // indirect - sigs.k8s.io/kustomize/cmd/config v0.20.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.20.1 // indirect + sigs.k8s.io/kustomize/api v0.18.0 // indirect + sigs.k8s.io/kustomize/cmd/config v0.15.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/hack/tools/go.sum b/hack/tools/go.sum index 33c706113f..587ed4b7f3 100644 --- a/hack/tools/go.sum +++ b/hack/tools/go.sum @@ -129,6 +129,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gophercloud/gophercloud/v2 v2.8.0 h1:of2+8tT6+FbEYHfYC8GBu8TXJNsXYSNm9KuvpX7Neqo= @@ -469,8 +471,8 @@ k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg= -k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7/go.mod h1:GewRfANuJ70iYzvn+i4lezLDAFzvjxZYK1gn1lWcfas= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= @@ -493,14 +495,14 @@ sigs.k8s.io/kind v0.25.0 h1:ugUvgesHKKA0yKmD6QtYTiEev+kPUpGxdTPbMGf8VTU= sigs.k8s.io/kind v0.25.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d h1:KLiQzLW3RZJR19+j4pw2h5iioyAyqCkDBEAFdnGa3N8= sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d/go.mod h1:NRdZafr4zSCseLQggdvIMXa7umxf+Q+PJzrj3wFwiGE= -sigs.k8s.io/kustomize/api v0.20.1 h1:iWP1Ydh3/lmldBnH/S5RXgT98vWYMaTUL1ADcr+Sv7I= -sigs.k8s.io/kustomize/api v0.20.1/go.mod h1:t6hUFxO+Ph0VxIk1sKp1WS0dOjbPCtLJ4p8aADLwqjM= -sigs.k8s.io/kustomize/cmd/config v0.20.1 h1:4APUORmZe2BYrsqgGfEKdd/r7gM6i43egLrUzilpiFo= -sigs.k8s.io/kustomize/cmd/config v0.20.1/go.mod h1:R7rQ8kxknVlXWVUIbxWtMgu8DCCNVtl8V0KrmeVd/KE= -sigs.k8s.io/kustomize/kustomize/v5 v5.7.1 h1:sYJsarwy/SDJfjjLMUqwFDGPwzUtMOQ1i1Ed49+XSbw= -sigs.k8s.io/kustomize/kustomize/v5 v5.7.1/go.mod h1:+5/SrBcJ4agx1SJknGuR/c9thwRSKLxnKoI5BzXFaLU= -sigs.k8s.io/kustomize/kyaml v0.20.1 h1:PCMnA2mrVbRP3NIB6v9kYCAc38uvFLVs8j/CD567A78= -sigs.k8s.io/kustomize/kyaml v0.20.1/go.mod h1:0EmkQHRUsJxY8Ug9Niig1pUMSCGHxQ5RklbpV/Ri6po= +sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= +sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U= +sigs.k8s.io/kustomize/cmd/config v0.15.0 h1:WkdY8V2+8J+W00YbImXa2ke9oegfrHH79e+kywW7EdU= +sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00= +sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0= +sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE= +sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E= +sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh deleted file mode 100755 index ae760e6fea..0000000000 --- a/hack/update-codegen.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2024 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -euo pipefail -set -x - -SCRIPT_ROOT=$(realpath $(dirname "${BASH_SOURCE[0]}")) -PROJECT_ROOT=$(realpath "${SCRIPT_ROOT}/..") - -GENERATED_PKG="pkg/generated" - -# Ensure tools built by kube_codegen go in our own GOBIN rather than something -# shared under GOPATH. This guards against these tools being rebuilt by some -# other concurrent invocation, potentially with a different version. -export GOBIN="${PROJECT_ROOT}/bin" - -cd "$PROJECT_ROOT" - -# For this to work, the current working directory must be under a Go module which -# lists k8s.io/code-generator -CODEGEN_PKG=$(go list -f '{{ .Dir }}' k8s.io/code-generator) - -source "${CODEGEN_PKG}/kube_codegen.sh" - -# Deep-copies and what-not are generated by controller-gen, so we don't need to use kube::codegen::gen_helpers - -declare -a gen_openapi_args=( - --report-filename "${PROJECT_ROOT}/api_violations.report" - --output-dir "${PROJECT_ROOT}/cmd/models-schema" - --output-pkg main - --boilerplate "${SCRIPT_ROOT}/boilerplate.go.txt" - - # We need to include all referenced types in our generated openapi schema - # or applyconfiguration-gen won't be able to use it. Helpfully it will - # generate an error including the missing type. - --extra-pkgs sigs.k8s.io/cluster-api/api/v1beta1 - --extra-pkgs k8s.io/api/core/v1 -) - -# It is an error to make a change which updates the api violations. When doing -# this intentionally, for example when fixing violations, run with -# UPDATE_API_KNOWN_VIOLATIONS=true to update the api violations report. -if [ ! -z "${UPDATE_API_KNOWN_VIOLATIONS:-}" ]; then - gen_openapi_args+=(--update-report) -fi - -kube::codegen::gen_openapi "${gen_openapi_args[@]}" "${PROJECT_ROOT}/api" - -openapi="${PROJECT_ROOT}/openapi.json" -go run "${PROJECT_ROOT}/cmd/models-schema" | jq > "$openapi" - -kube::codegen::gen_client \ - --with-applyconfig \ - --with-watch \ - --applyconfig-openapi-schema "$openapi" \ - --output-dir "${PROJECT_ROOT}/${GENERATED_PKG}" \ - --output-pkg sigs.k8s.io/cluster-api-provider-openstack/${GENERATED_PKG} \ - --versioned-name clientset \ - --boilerplate "${SCRIPT_ROOT}/boilerplate.go.txt" \ - --one-input-api "api" \ - "${PROJECT_ROOT}"