sigs.k8s.io/cluster-api@v1.7.1/Makefile (about)

     1  # Copyright 2018 The Kubernetes Authors.
     2  #
     3  # Licensed under the Apache License, Version 2.0 (the "License");
     4  # you may not use this file except in compliance with the License.
     5  # You may obtain a copy of the License at
     6  #
     7  #     http://www.apache.org/licenses/LICENSE-2.0
     8  #
     9  # Unless required by applicable law or agreed to in writing, software
    10  # distributed under the License is distributed on an "AS IS" BASIS,
    11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  # See the License for the specific language governing permissions and
    13  # limitations under the License.
    14  
    15  # If you update this file, please follow
    16  # https://www.thapaliya.com/en/writings/well-documented-makefiles/
    17  
    18  # Ensure Make is run with bash shell as some syntax below is bash-specific
    19  SHELL:=/usr/bin/env bash
    20  
    21  .DEFAULT_GOAL:=help
    22  
    23  #
    24  # Go.
    25  #
    26  GO_VERSION ?= 1.21.9
    27  GO_DIRECTIVE_VERSION ?= 1.21
    28  GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION)
    29  
    30  # Use GOPROXY environment variable if set
    31  GOPROXY := $(shell go env GOPROXY)
    32  ifeq ($(GOPROXY),)
    33  GOPROXY := https://proxy.golang.org
    34  endif
    35  export GOPROXY
    36  
    37  # Active module mode, as we use go modules to manage dependencies
    38  export GO111MODULE=on
    39  
    40  #
    41  # Kubebuilder.
    42  #
    43  export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.30.0
    44  export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT ?= 60s
    45  export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?= 60s
    46  
    47  # This option is for running docker manifest command
    48  export DOCKER_CLI_EXPERIMENTAL := enabled
    49  
    50  # Enables shell script tracing. Enable by running: TRACE=1 make <target>
    51  TRACE ?= 0
    52  
    53  #
    54  # Directories.
    55  #
    56  # Full directory of where the Makefile resides
    57  ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
    58  EXP_DIR := exp
    59  BIN_DIR := bin
    60  TEST_DIR := test
    61  TOOLS_DIR := hack/tools
    62  TOOLS_BIN_DIR := $(abspath $(TOOLS_DIR)/$(BIN_DIR))
    63  DOCS_DIR := docs
    64  E2E_FRAMEWORK_DIR := $(TEST_DIR)/framework
    65  CAPD_DIR := $(TEST_DIR)/infrastructure/docker
    66  CAPIM_DIR := $(TEST_DIR)/infrastructure/inmemory
    67  TEST_EXTENSION_DIR := $(TEST_DIR)/extension
    68  GO_INSTALL := ./scripts/go_install.sh
    69  OBSERVABILITY_DIR := hack/observability
    70  
    71  export PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH)
    72  
    73  # Set --output-base for conversion-gen if we are not within GOPATH
    74  ifneq ($(abspath $(ROOT_DIR)),$(shell go env GOPATH)/src/sigs.k8s.io/cluster-api)
    75  	CONVERSION_GEN_OUTPUT_BASE := --output-base=$(ROOT_DIR)
    76  	CONVERSION_GEN_OUTPUT_BASE_CAPD := --output-base=$(ROOT_DIR)/$(CAPD_DIR)
    77  else
    78  	export GOPATH := $(shell go env GOPATH)
    79  endif
    80  
    81  #
    82  # Ginkgo configuration.
    83  #
    84  GINKGO_FOCUS ?=
    85  GINKGO_SKIP ?=
    86  GINKGO_NODES ?= 1
    87  GINKGO_TIMEOUT ?= 2h
    88  GINKGO_POLL_PROGRESS_AFTER ?= 60m
    89  GINKGO_POLL_PROGRESS_INTERVAL ?= 5m
    90  E2E_CONF_FILE ?= $(ROOT_DIR)/$(TEST_DIR)/e2e/config/docker.yaml
    91  SKIP_RESOURCE_CLEANUP ?= false
    92  USE_EXISTING_CLUSTER ?= false
    93  GINKGO_NOCOLOR ?= false
    94  
    95  # to set multiple ginkgo skip flags, if any
    96  ifneq ($(strip $(GINKGO_SKIP)),)
    97  _SKIP_ARGS := $(foreach arg,$(strip $(GINKGO_SKIP)),-skip="$(arg)")
    98  endif
    99  
   100  # Helper function to get dependency version from go.mod
   101  get_go_version = $(shell go list -m $1 | awk '{print $$2}')
   102  
   103  #
   104  # Binaries.
   105  #
   106  # Note: Need to use abspath so we can invoke these from subdirectories
   107  KUSTOMIZE_VER := v4.5.2
   108  KUSTOMIZE_BIN := kustomize
   109  KUSTOMIZE := $(abspath $(TOOLS_BIN_DIR)/$(KUSTOMIZE_BIN)-$(KUSTOMIZE_VER))
   110  KUSTOMIZE_PKG := sigs.k8s.io/kustomize/kustomize/v4
   111  
   112  SETUP_ENVTEST_VER := v0.0.0-20240215143116-d0396a3d6f9f
   113  SETUP_ENVTEST_BIN := setup-envtest
   114  SETUP_ENVTEST := $(abspath $(TOOLS_BIN_DIR)/$(SETUP_ENVTEST_BIN)-$(SETUP_ENVTEST_VER))
   115  SETUP_ENVTEST_PKG := sigs.k8s.io/controller-runtime/tools/setup-envtest
   116  
   117  CONTROLLER_GEN_VER := v0.14.0
   118  CONTROLLER_GEN_BIN := controller-gen
   119  CONTROLLER_GEN := $(abspath $(TOOLS_BIN_DIR)/$(CONTROLLER_GEN_BIN)-$(CONTROLLER_GEN_VER))
   120  CONTROLLER_GEN_PKG := sigs.k8s.io/controller-tools/cmd/controller-gen
   121  
   122  GOTESTSUM_VER := v1.11.0
   123  GOTESTSUM_BIN := gotestsum
   124  GOTESTSUM := $(abspath $(TOOLS_BIN_DIR)/$(GOTESTSUM_BIN)-$(GOTESTSUM_VER))
   125  GOTESTSUM_PKG := gotest.tools/gotestsum
   126  
   127  CONVERSION_GEN_VER := v0.29.2
   128  CONVERSION_GEN_BIN := conversion-gen
   129  # We are intentionally using the binary without version suffix, to avoid the version
   130  # in generated files.
   131  CONVERSION_GEN := $(abspath $(TOOLS_BIN_DIR)/$(CONVERSION_GEN_BIN))
   132  CONVERSION_GEN_PKG := k8s.io/code-generator/cmd/conversion-gen
   133  
   134  ENVSUBST_BIN := envsubst
   135  ENVSUBST_VER := $(call get_go_version,github.com/drone/envsubst/v2)
   136  ENVSUBST := $(abspath $(TOOLS_BIN_DIR)/$(ENVSUBST_BIN)-$(ENVSUBST_VER))
   137  ENVSUBST_PKG := github.com/drone/envsubst/v2/cmd/envsubst
   138  
   139  GO_APIDIFF_VER := v0.8.2
   140  GO_APIDIFF_BIN := go-apidiff
   141  GO_APIDIFF := $(abspath $(TOOLS_BIN_DIR)/$(GO_APIDIFF_BIN)-$(GO_APIDIFF_VER))
   142  GO_APIDIFF_PKG := github.com/joelanford/go-apidiff
   143  
   144  HADOLINT_VER := v2.12.0
   145  HADOLINT_FAILURE_THRESHOLD = warning
   146  
   147  SHELLCHECK_VER := v0.9.0
   148  
   149  TRIVY_VER := 0.49.1
   150  
   151  KPROMO_VER := v4.0.5
   152  KPROMO_BIN := kpromo
   153  KPROMO :=  $(abspath $(TOOLS_BIN_DIR)/$(KPROMO_BIN)-$(KPROMO_VER))
   154  # KPROMO_PKG may have to be changed if KPROMO_VER increases its major version.
   155  KPROMO_PKG := sigs.k8s.io/promo-tools/v4/cmd/kpromo
   156  
   157  YQ_VER := v4.35.2
   158  YQ_BIN := yq
   159  YQ :=  $(abspath $(TOOLS_BIN_DIR)/$(YQ_BIN)-$(YQ_VER))
   160  YQ_PKG := github.com/mikefarah/yq/v4
   161  
   162  PLANTUML_VER := 1.2024.3
   163  
   164  GINKGO_BIN := ginkgo
   165  GINKGO_VER := $(call get_go_version,github.com/onsi/ginkgo/v2)
   166  GINKGO := $(abspath $(TOOLS_BIN_DIR)/$(GINKGO_BIN)-$(GINKGO_VER))
   167  GINKGO_PKG := github.com/onsi/ginkgo/v2/ginkgo
   168  
   169  GOLANGCI_LINT_BIN := golangci-lint
   170  GOLANGCI_LINT_VER := $(shell cat .github/workflows/pr-golangci-lint.yaml | grep [[:space:]]version: | sed 's/.*version: //')
   171  GOLANGCI_LINT := $(abspath $(TOOLS_BIN_DIR)/$(GOLANGCI_LINT_BIN)-$(GOLANGCI_LINT_VER))
   172  GOLANGCI_LINT_PKG := github.com/golangci/golangci-lint/cmd/golangci-lint
   173  
   174  GOVULNCHECK_BIN := govulncheck
   175  GOVULNCHECK_VER := v1.0.4
   176  GOVULNCHECK := $(abspath $(TOOLS_BIN_DIR)/$(GOVULNCHECK_BIN)-$(GOVULNCHECK_VER))
   177  GOVULNCHECK_PKG := golang.org/x/vuln/cmd/govulncheck
   178  
   179  IMPORT_BOSS_BIN := import-boss
   180  IMPORT_BOSS_VER := v0.28.1
   181  IMPORT_BOSS := $(abspath $(TOOLS_BIN_DIR)/$(IMPORT_BOSS_BIN))
   182  IMPORT_BOSS_PKG := k8s.io/code-generator/cmd/import-boss
   183  
   184  CONVERSION_VERIFIER_BIN := conversion-verifier
   185  CONVERSION_VERIFIER := $(abspath $(TOOLS_BIN_DIR)/$(CONVERSION_VERIFIER_BIN))
   186  
   187  OPENAPI_GEN_VER := 70dd376
   188  OPENAPI_GEN_BIN := openapi-gen
   189  # We are intentionally using the binary without version suffix, to avoid the version
   190  # in generated files.
   191  OPENAPI_GEN := $(abspath $(TOOLS_BIN_DIR)/$(OPENAPI_GEN_BIN))
   192  OPENAPI_GEN_PKG := k8s.io/kube-openapi/cmd/openapi-gen
   193  
   194  PROWJOB_GEN_BIN := prowjob-gen
   195  PROWJOB_GEN := $(abspath $(TOOLS_BIN_DIR)/$(PROWJOB_GEN_BIN))
   196  
   197  RUNTIME_OPENAPI_GEN_BIN := runtime-openapi-gen
   198  RUNTIME_OPENAPI_GEN := $(abspath $(TOOLS_BIN_DIR)/$(RUNTIME_OPENAPI_GEN_BIN))
   199  
   200  TILT_PREPARE_BIN := tilt-prepare
   201  TILT_PREPARE := $(abspath $(TOOLS_BIN_DIR)/$(TILT_PREPARE_BIN))
   202  
   203  # Define Docker related variables. Releases should modify and double check these vars.
   204  REGISTRY ?= gcr.io/$(shell gcloud config get-value project)
   205  PROD_REGISTRY ?= registry.k8s.io/cluster-api
   206  
   207  STAGING_REGISTRY ?= gcr.io/k8s-staging-cluster-api
   208  STAGING_BUCKET ?= artifacts.k8s-staging-cluster-api.appspot.com
   209  
   210  # core
   211  IMAGE_NAME ?= cluster-api-controller
   212  CONTROLLER_IMG ?= $(REGISTRY)/$(IMAGE_NAME)
   213  
   214  # bootstrap
   215  KUBEADM_BOOTSTRAP_IMAGE_NAME ?= kubeadm-bootstrap-controller
   216  KUBEADM_BOOTSTRAP_CONTROLLER_IMG ?= $(REGISTRY)/$(KUBEADM_BOOTSTRAP_IMAGE_NAME)
   217  
   218  # control plane
   219  KUBEADM_CONTROL_PLANE_IMAGE_NAME ?= kubeadm-control-plane-controller
   220  KUBEADM_CONTROL_PLANE_CONTROLLER_IMG ?= $(REGISTRY)/$(KUBEADM_CONTROL_PLANE_IMAGE_NAME)
   221  
   222  # capd
   223  CAPD_IMAGE_NAME ?= capd-manager
   224  CAPD_CONTROLLER_IMG ?= $(REGISTRY)/$(CAPD_IMAGE_NAME)
   225  
   226  # capim
   227  CAPIM_IMAGE_NAME ?= capim-manager
   228  CAPIM_CONTROLLER_IMG ?= $(REGISTRY)/$(CAPIM_IMAGE_NAME)
   229  
   230  # clusterctl
   231  CLUSTERCTL_MANIFEST_DIR := cmd/clusterctl/config
   232  CLUSTERCTL_IMAGE_NAME ?= clusterctl
   233  CLUSTERCTL_IMG ?= $(REGISTRY)/$(CLUSTERCTL_IMAGE_NAME)
   234  
   235  # test extension
   236  TEST_EXTENSION_IMAGE_NAME ?= test-extension
   237  TEST_EXTENSION_IMG ?= $(REGISTRY)/$(TEST_EXTENSION_IMAGE_NAME)
   238  
   239  # kind
   240  CAPI_KIND_CLUSTER_NAME ?= capi-test
   241  
   242  # It is set by Prow GIT_TAG, a git-based tag of the form vYYYYMMDD-hash, e.g., v20210120-v0.3.10-308-gc61521971
   243  
   244  TAG ?= dev
   245  ARCH ?= $(shell go env GOARCH)
   246  ALL_ARCH ?= amd64 arm arm64 ppc64le s390x
   247  
   248  # Allow overriding the imagePullPolicy
   249  PULL_POLICY ?= Always
   250  
   251  # Hosts running SELinux need :z added to volume mounts
   252  SELINUX_ENABLED := $(shell cat /sys/fs/selinux/enforce 2> /dev/null || echo 0)
   253  
   254  ifeq ($(SELINUX_ENABLED),1)
   255    DOCKER_VOL_OPTS?=:z
   256  endif
   257  
   258  # Set build time variables including version details
   259  LDFLAGS := $(shell hack/version.sh)
   260  
   261  all: test managers clusterctl
   262  
   263  help:  # Display this help
   264  	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[0-9A-Za-z_-]+:.*?##/ { printf "  \033[36m%-50s\033[0m %s\n", $$1, $$2 } /^\$$\([0-9A-Za-z_-]+\):.*?##/ { gsub("_","-", $$1); printf "  \033[36m%-50s\033[0m %s\n", tolower(substr($$1, 3, length($$1)-7)), $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
   265  
   266  ## --------------------------------------
   267  ## Generate / Manifests
   268  ## --------------------------------------
   269  
   270  ##@ generate:
   271  
   272  ALL_GENERATE_MODULES = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension
   273  
   274  .PHONY: generate
   275  generate: ## Run all generate-manifests-*, generate-go-deepcopy-*, generate-go-conversions-* and generate-go-openapi targets
   276  	$(MAKE) generate-modules generate-manifests generate-go-deepcopy generate-go-conversions generate-go-openapi generate-metrics-config
   277  
   278  .PHONY: generate-manifests
   279  generate-manifests: $(addprefix generate-manifests-,$(ALL_GENERATE_MODULES)) ## Run all generate-manifests-* targets
   280  
   281  .PHONY: generate-manifests-core
   282  generate-manifests-core: $(CONTROLLER_GEN) $(KUSTOMIZE) ## Generate manifests e.g. CRD, RBAC etc. for core
   283  	$(MAKE) clean-generated-yaml SRC_DIRS="./config/crd/bases,./config/webhook/manifests.yaml"
   284  	$(CONTROLLER_GEN) \
   285  		paths=./ \
   286  		paths=./api/... \
   287  		paths=./internal/apis/core/... \
   288  		paths=./internal/controllers/... \
   289  		paths=./internal/webhooks/... \
   290  		paths=./$(EXP_DIR)/api/... \
   291  		paths=./$(EXP_DIR)/internal/controllers/... \
   292  		paths=./$(EXP_DIR)/internal/webhooks/... \
   293  		paths=./$(EXP_DIR)/addons/api/... \
   294  		paths=./$(EXP_DIR)/addons/internal/controllers/... \
   295  		paths=./$(EXP_DIR)/addons/internal/webhooks/... \
   296  		paths=./$(EXP_DIR)/ipam/api/... \
   297  		paths=./$(EXP_DIR)/ipam/internal/webhooks/... \
   298  		paths=./$(EXP_DIR)/runtime/api/... \
   299  		paths=./$(EXP_DIR)/runtime/internal/controllers/... \
   300  		crd:crdVersions=v1 \
   301  		rbac:roleName=manager-role \
   302  		output:crd:dir=./config/crd/bases \
   303  		output:webhook:dir=./config/webhook \
   304  		webhook
   305  	$(CONTROLLER_GEN) \
   306  		paths=./cmd/clusterctl/api/... \
   307  		crd:crdVersions=v1 \
   308  		output:crd:dir=./cmd/clusterctl/config/crd/bases
   309  	$(KUSTOMIZE) build $(CLUSTERCTL_MANIFEST_DIR)/crd > $(CLUSTERCTL_MANIFEST_DIR)/manifest/clusterctl-api.yaml
   310  
   311  .PHONY: generate-manifests-kubeadm-bootstrap
   312  generate-manifests-kubeadm-bootstrap: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for kubeadm bootstrap
   313  	$(MAKE) clean-generated-yaml SRC_DIRS="./bootstrap/kubeadm/config/crd/bases,./bootstrap/kubeadm/config/webhook/manifests.yaml"
   314  	$(CONTROLLER_GEN) \
   315  		paths=./bootstrap/kubeadm \
   316  		paths=./bootstrap/kubeadm/api/... \
   317  		paths=./bootstrap/kubeadm/internal/controllers/... \
   318  		paths=./bootstrap/kubeadm/internal/webhooks/... \
   319  		paths=./internal/apis/bootstrap/kubeadm/... \
   320  		crd:crdVersions=v1 \
   321  		rbac:roleName=manager-role \
   322  		output:crd:dir=./bootstrap/kubeadm/config/crd/bases \
   323  		output:rbac:dir=./bootstrap/kubeadm/config/rbac \
   324  		output:webhook:dir=./bootstrap/kubeadm/config/webhook \
   325  		webhook
   326  
   327  .PHONY: generate-manifests-kubeadm-control-plane
   328  generate-manifests-kubeadm-control-plane: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for kubeadm control plane
   329  	$(MAKE) clean-generated-yaml SRC_DIRS="./controlplane/kubeadm/config/crd/bases,./controlplane/kubeadm/config/webhook/manifests.yaml"
   330  	$(CONTROLLER_GEN) \
   331  		paths=./controlplane/kubeadm \
   332  		paths=./controlplane/kubeadm/api/... \
   333  		paths=./controlplane/kubeadm/internal/controllers/... \
   334  		paths=./controlplane/kubeadm/internal/webhooks/... \
   335  		paths=./internal/apis/controlplane/kubeadm/... \
   336  		crd:crdVersions=v1 \
   337  		rbac:roleName=manager-role \
   338  		output:crd:dir=./controlplane/kubeadm/config/crd/bases \
   339  		output:rbac:dir=./controlplane/kubeadm/config/rbac \
   340  		output:webhook:dir=./controlplane/kubeadm/config/webhook \
   341  		webhook
   342  
   343  .PHONY: generate-manifests-docker-infrastructure
   344  generate-manifests-docker-infrastructure: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for docker infrastructure provider
   345  	$(MAKE) clean-generated-yaml SRC_DIRS="$(CAPD_DIR)/config/crd/bases,$(CAPD_DIR)/config/webhook/manifests.yaml"
   346  	cd $(CAPD_DIR); $(CONTROLLER_GEN) \
   347  		paths=./ \
   348  		paths=./api/... \
   349  		paths=./$(EXP_DIR)/api/... \
   350  		paths=./$(EXP_DIR)/internal/controllers/... \
   351  		paths=./$(EXP_DIR)/internal/webhooks/... \
   352  		paths=./internal/controllers/... \
   353  		paths=./internal/webhooks/... \
   354  		crd:crdVersions=v1 \
   355  		rbac:roleName=manager-role \
   356  		output:crd:dir=./config/crd/bases \
   357  		output:webhook:dir=./config/webhook \
   358  		webhook
   359  
   360  
   361  .PHONY: generate-manifests-in-memory-infrastructure
   362  generate-manifests-in-memory-infrastructure: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for in-memory infrastructure provider
   363  	$(MAKE) clean-generated-yaml SRC_DIRS="$(CAPIM_DIR)/config/crd/bases,$(CAPIM_DIR)/config/webhook/manifests.yaml"
   364  	cd $(CAPIM_DIR); $(CONTROLLER_GEN) \
   365  		paths=./ \
   366  		paths=./api/... \
   367  		paths=./internal/controllers/... \
   368  		paths=./internal/webhooks/... \
   369  		crd:crdVersions=v1 \
   370  		rbac:roleName=manager-role \
   371  		output:crd:dir=./config/crd/bases \
   372  		output:webhook:dir=./config/webhook \
   373  		webhook
   374  
   375  .PHONY: generate-manifests-test-extension
   376  generate-manifests-test-extension: $(CONTROLLER_GEN) ## Generate manifests e.g. RBAC for test-extension provider
   377  	cd ./test/extension; $(CONTROLLER_GEN) \
   378  		paths=./... \
   379  		output:rbac:dir=./config/rbac \
   380  		rbac:roleName=manager-role
   381  
   382  .PHONY: generate-go-deepcopy
   383  generate-go-deepcopy:  ## Run all generate-go-deepcopy-* targets
   384  	$(MAKE) $(addprefix generate-go-deepcopy-,$(ALL_GENERATE_MODULES))
   385  
   386  .PHONY: generate-go-deepcopy-core
   387  generate-go-deepcopy-core: $(CONTROLLER_GEN) ## Generate deepcopy go code for core
   388  	$(MAKE) clean-generated-deepcopy SRC_DIRS="./api,./$(EXP_DIR)/api,./$(EXP_DIR)/addons/api,./$(EXP_DIR)/runtime/api,./$(EXP_DIR)/runtime/hooks/api"
   389  	$(CONTROLLER_GEN) \
   390  		object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \
   391  		paths=./api/... \
   392  		paths=./$(EXP_DIR)/api/... \
   393  		paths=./$(EXP_DIR)/addons/api/... \
   394  		paths=./$(EXP_DIR)/ipam/api/... \
   395  		paths=./$(EXP_DIR)/runtime/api/... \
   396  		paths=./$(EXP_DIR)/runtime/hooks/api/... \
   397  		paths=./internal/runtime/test/... \
   398  		paths=./cmd/clusterctl/... \
   399  		paths=./internal/test/builder/...
   400  
   401  .PHONY: generate-go-deepcopy-kubeadm-bootstrap
   402  generate-go-deepcopy-kubeadm-bootstrap: $(CONTROLLER_GEN) ## Generate deepcopy go code for kubeadm bootstrap
   403  	$(MAKE) clean-generated-deepcopy SRC_DIRS="./bootstrap/kubeadm/api,./bootstrap/kubeadm/types"
   404  	$(CONTROLLER_GEN) \
   405  		object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \
   406  		paths=./bootstrap/kubeadm/api/... \
   407  		paths=./bootstrap/kubeadm/types/...
   408  
   409  .PHONY: generate-go-deepcopy-kubeadm-control-plane
   410  generate-go-deepcopy-kubeadm-control-plane: $(CONTROLLER_GEN) ## Generate deepcopy go code for kubeadm control plane
   411  	$(MAKE) clean-generated-deepcopy SRC_DIRS="./controlplane/kubeadm/api"
   412  	$(CONTROLLER_GEN) \
   413  		object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \
   414  		paths=./controlplane/kubeadm/api/...
   415  
   416  .PHONY: generate-go-deepcopy-docker-infrastructure
   417  generate-go-deepcopy-docker-infrastructure: $(CONTROLLER_GEN) ## Generate deepcopy go code for docker infrastructure provider
   418  	$(MAKE) clean-generated-deepcopy SRC_DIRS="$(CAPD_DIR)/api,$(CAPD_DIR)/$(EXP_DIR)/api"
   419  	cd $(CAPD_DIR); $(CONTROLLER_GEN) \
   420  		object:headerFile=../../../hack/boilerplate/boilerplate.generatego.txt \
   421  		paths=./api/... \
   422  		paths=./$(EXP_DIR)/api/...
   423  
   424  .PHONY: generate-go-deepcopy-in-memory-infrastructure
   425  generate-go-deepcopy-in-memory-infrastructure: $(CONTROLLER_GEN) ## Generate deepcopy go code for in-memory infrastructure provider
   426  	$(MAKE) clean-generated-deepcopy SRC_DIRS="$(CAPIM_DIR)/api,$(CAPIM_DIR)/internal/cloud/api"
   427  	cd $(CAPIM_DIR); $(CONTROLLER_GEN) \
   428  		object:headerFile=../../../hack/boilerplate/boilerplate.generatego.txt \
   429  		paths=./api/... \
   430          paths=./internal/cloud/api/...
   431  
   432  .PHONY: generate-go-deepcopy-test-extension
   433  generate-go-deepcopy-test-extension: $(CONTROLLER_GEN) ## Generate deepcopy go code for test-extension
   434  
   435  .PHONY: generate-go-conversions
   436  generate-go-conversions: ## Run all generate-go-conversions-* targets
   437  	$(MAKE) $(addprefix generate-go-conversions-,$(ALL_GENERATE_MODULES))
   438  
   439  .PHONY: generate-go-conversions-core
   440  generate-go-conversions-core: ## Run all generate-go-conversions-core-* targets
   441  	$(MAKE) generate-go-conversions-core-api
   442  	$(MAKE) generate-go-conversions-core-exp
   443  	$(MAKE) generate-go-conversions-core-exp-ipam
   444  	$(MAKE) generate-go-conversions-core-runtime
   445  
   446  .PHONY: generate-go-conversions-core-api
   447  generate-go-conversions-core-api: $(CONVERSION_GEN) ## Generate conversions go code for core api
   448  	$(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/core/v1alpha3,./internal/apis/core/v1alpha4"
   449  	$(CONVERSION_GEN) \
   450  		--input-dirs=./internal/apis/core/v1alpha3 \
   451  		--input-dirs=./internal/apis/core/v1alpha4 \
   452  		--build-tag=ignore_autogenerated_core \
   453  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   454  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   455  
   456  .PHONY: generate-go-conversions-core-exp
   457  generate-go-conversions-core-exp: $(CONVERSION_GEN) ## Generate conversions go code for core exp
   458  	$(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/core/exp/v1alpha3,./internal/apis/core/exp/addons/v1alpha3,./internal/apis/core/exp/v1alpha4,./internal/apis/core/exp/addons/v1alpha4"
   459  	$(CONVERSION_GEN) \
   460  		--input-dirs=./internal/apis/core/exp/v1alpha3 \
   461  		--input-dirs=./internal/apis/core/exp/v1alpha4 \
   462  		--input-dirs=./internal/apis/core/exp/addons/v1alpha3 \
   463  		--input-dirs=./internal/apis/core/exp/addons/v1alpha4 \
   464  		--build-tag=ignore_autogenerated_core_exp \
   465  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \
   466  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \
   467  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   468  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   469  
   470  .PHONY: generate-go-conversions-core-exp-ipam
   471  generate-go-conversions-core-exp-ipam: $(CONVERSION_GEN) ## Generate conversions go code for core exp IPAM
   472  	$(MAKE) clean-generated-conversions SRC_DIRS="./$(EXP_DIR)/ipam/api/v1alpha1"
   473  	$(CONVERSION_GEN) \
   474  		--input-dirs=./$(EXP_DIR)/ipam/api/v1alpha1 \
   475  		--build-tag=ignore_autogenerated_core_exp_ipam \
   476  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   477  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   478  
   479  .PHONY: generate-go-conversions-core-runtime
   480  generate-go-conversions-core-runtime: $(CONVERSION_GEN) ## Generate conversions go code for core runtime
   481  	$(MAKE) clean-generated-conversions SRC_DIRS="./internal/runtime/test/v1alpha1,./internal/runtime/test/v1alpha2"
   482  	$(CONVERSION_GEN) \
   483  		--input-dirs=./internal/runtime/test/v1alpha1 \
   484  		--input-dirs=./internal/runtime/test/v1alpha2 \
   485  		--build-tag=ignore_autogenerated_core_runtime \
   486  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   487  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   488  
   489  .PHONY: generate-go-conversions-kubeadm-bootstrap
   490  generate-go-conversions-kubeadm-bootstrap: $(CONVERSION_GEN) ## Generate conversions go code for kubeadm bootstrap
   491  	$(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/bootstrap/kubeadm"
   492  	$(CONVERSION_GEN) \
   493  		--input-dirs=./internal/apis/bootstrap/kubeadm/v1alpha3 \
   494  		--input-dirs=./internal/apis/bootstrap/kubeadm/v1alpha4 \
   495  		--build-tag=ignore_autogenerated_kubeadm_bootstrap \
   496  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \
   497  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \
   498  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   499  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   500  	$(MAKE) clean-generated-conversions SRC_DIRS="./bootstrap/kubeadm/types/upstreamv1beta2,./bootstrap/kubeadm/types/upstreamv1beta3"
   501  	$(CONVERSION_GEN) \
   502  		--input-dirs=./bootstrap/kubeadm/types/upstreamv1beta2 \
   503  		--input-dirs=./bootstrap/kubeadm/types/upstreamv1beta3 \
   504  		--build-tag=ignore_autogenerated_kubeadm_types \
   505  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   506  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   507  
   508  .PHONY: generate-go-conversions-kubeadm-control-plane
   509  generate-go-conversions-kubeadm-control-plane: $(CONVERSION_GEN) ## Generate conversions go code for kubeadm control plane
   510  	$(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/controlplane/kubeadm"
   511  	$(CONVERSION_GEN) \
   512  		--input-dirs=./internal/apis/controlplane/kubeadm/v1alpha3 \
   513  		--input-dirs=./internal/apis/controlplane/kubeadm/v1alpha4 \
   514  		--build-tag=ignore_autogenerated_kubeadm_controlplane \
   515  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \
   516  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \
   517  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/bootstrap/kubeadm/v1alpha3 \
   518  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/bootstrap/kubeadm/v1alpha4 \
   519  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \
   520  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   521  
   522  .PHONY: generate-go-conversions-docker-infrastructure
   523  generate-go-conversions-docker-infrastructure: $(CONVERSION_GEN) ## Generate conversions go code for docker infrastructure provider
   524  	cd $(CAPD_DIR); $(CONVERSION_GEN) \
   525  		--input-dirs=./api/v1alpha3 \
   526  		--input-dirs=./api/v1alpha4 \
   527  		--input-dirs=./$(EXP_DIR)/api/v1alpha3 \
   528  		--input-dirs=./$(EXP_DIR)/api/v1alpha4 \
   529  		--build-tag=ignore_autogenerated_capd \
   530  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \
   531  		--extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \
   532  		--output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE_CAPD) \
   533  		--go-header-file=../../../hack/boilerplate/boilerplate.generatego.txt
   534  
   535  .PHONY: generate-go-conversions-in-memory-infrastructure
   536  generate-go-conversions-in-memory-infrastructure: $(CONVERSION_GEN) ## Generate conversions go code for in-memory infrastructure provider
   537  	cd $(CAPIM_DIR)
   538  
   539  .PHONY: generate-go-conversions-test-extension
   540  generate-go-conversions-test-extension: $(CONVERSION_GEN) ## Generate conversions go code for in-memory infrastructure provider
   541  
   542  # The tmp/sigs.k8s.io/cluster-api symlink is a workaround to make this target run outside of GOPATH
   543  .PHONY: generate-go-openapi
   544  generate-go-openapi: $(OPENAPI_GEN) $(CONTROLLER_GEN) ## Generate openapi go code for runtime SDK
   545  	@mkdir -p ./tmp/sigs.k8s.io; ln -s $(ROOT_DIR) ./tmp/sigs.k8s.io/; cd ./tmp; \
   546  	for pkg in "api/v1beta1" "$(EXP_DIR)/runtime/hooks/api/v1alpha1"; do \
   547  		(cd ../ && $(MAKE) clean-generated-openapi-definitions SRC_DIRS="./$${pkg}"); \
   548  		echo "** Generating openapi schema for types in ./$${pkg} **"; \
   549  		$(OPENAPI_GEN) \
   550  			--output-dir=../$${pkg} \
   551  			--output-file=zz_generated.openapi.go \
   552  			--output-pkg=sigs.k8s.io/cluster-api/$${pkg} \
   553  			--go-header-file=../hack/boilerplate/boilerplate.generatego.txt \
   554  			sigs.k8s.io/cluster-api/$${pkg}; \
   555  	done; \
   556  	rm sigs.k8s.io/cluster-api
   557  
   558  .PHONY: generate-modules
   559  generate-modules: ## Run go mod tidy to ensure modules are up to date
   560  	go mod tidy
   561  	cd $(TOOLS_DIR); go mod tidy
   562  	cd $(TEST_DIR); go mod tidy
   563  
   564  .PHONY: generate-doctoc
   565  generate-doctoc:
   566  	TRACE=$(TRACE) ./hack/generate-doctoc.sh
   567  
   568  .PHONY: generate-e2e-templates
   569  generate-e2e-templates: $(KUSTOMIZE) $(addprefix generate-e2e-templates-, v0.3 v0.4 v1.0 v1.5 v1.6 main) ## Generate cluster templates for all versions
   570  
   571  DOCKER_TEMPLATES := test/e2e/data/infrastructure-docker
   572  INMEMORY_TEMPLATES := test/e2e/data/infrastructure-inmemory
   573  
   574  .PHONY: generate-e2e-templates-v0.3
   575  generate-e2e-templates-v0.3: $(KUSTOMIZE)
   576  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v0.3/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v0.3/cluster-template.yaml
   577  
   578  .PHONY: generate-e2e-templates-v0.4
   579  generate-e2e-templates-v0.4: $(KUSTOMIZE)
   580  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v0.4/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v0.4/cluster-template.yaml
   581  
   582  .PHONY: generate-e2e-templates-v1.0
   583  generate-e2e-templates-v1.0: $(KUSTOMIZE)
   584  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.0/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.0/cluster-template.yaml
   585  
   586  .PHONY: generate-e2e-templates-v1.5
   587  generate-e2e-templates-v1.5: $(KUSTOMIZE)
   588  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.5/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.5/cluster-template.yaml
   589  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.5/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.5/cluster-template-topology.yaml
   590  
   591  .PHONY: generate-e2e-templates-v1.6
   592  generate-e2e-templates-v1.6: $(KUSTOMIZE)
   593  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.6/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.6/cluster-template.yaml
   594  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.6/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.6/cluster-template-topology.yaml
   595  
   596  .PHONY: generate-e2e-templates-main
   597  generate-e2e-templates-main: $(KUSTOMIZE)
   598  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template.yaml
   599  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-md-remediation --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-md-remediation.yaml
   600  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-remediation --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-remediation.yaml
   601  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption/step1 --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml
   602  	echo "---" >> $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml
   603  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption/step2 --load-restrictor LoadRestrictionsNone >> $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml
   604  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-machine-pool --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-machine-pool.yaml
   605  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-node-drain --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-node-drain.yaml
   606  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-upgrades --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-upgrades.yaml
   607  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-upgrades-runtimesdk --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-upgrades-runtimesdk.yaml
   608  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-scale-in --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-scale-in.yaml
   609  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-ipv6 --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-ipv6.yaml
   610  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv6-primary --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv6-primary.yaml
   611  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv4-primary --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv4-primary.yaml
   612  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-single-node-cluster --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-single-node-cluster.yaml
   613  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-autoscaler --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-autoscaler.yaml
   614  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology.yaml
   615  	$(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-ignition --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-ignition.yaml
   616  
   617  	$(KUSTOMIZE) build $(INMEMORY_TEMPLATES)/main/cluster-template --load-restrictor LoadRestrictionsNone > $(INMEMORY_TEMPLATES)/main/cluster-template.yaml
   618  
   619  .PHONY: generate-metrics-config
   620  generate-metrics-config: $(ENVSUBST_BIN) ## Generate ./config/metrics/crd-metrics-config.yaml
   621  	OUTPUT_FILE="./config/metrics/crd-metrics-config.yaml"; \
   622  	METRIC_TEMPLATES_DIR="./config/metrics/templates"; \
   623  	echo "# This file was auto-generated via: make generate-metrics-config" > "$${OUTPUT_FILE}"; \
   624  	cat "$${METRIC_TEMPLATES_DIR}/header.yaml" >> "$${OUTPUT_FILE}"; \
   625  	for resource in clusterclass cluster kubeadmcontrolplane kubeadmconfig machine machinedeployment machinehealthcheck machineset machinepool; do \
   626  		cat "$${METRIC_TEMPLATES_DIR}/$${resource}.yaml"; \
   627  		RESOURCE="$${resource}" ${ENVSUBST_BIN} < "$${METRIC_TEMPLATES_DIR}/common_metrics.yaml"; \
   628  		if [[ "$${resource}" != "cluster" ]]; then \
   629  			cat "$${METRIC_TEMPLATES_DIR}/owner_metric.yaml"; \
   630  		fi \
   631  	done >> "$${OUTPUT_FILE}"; \
   632  
   633  .PHONY: generate-diagrams
   634  generate-diagrams: ## Generate diagrams for *.plantuml files
   635  	$(MAKE) generate-diagrams-book
   636  	$(MAKE) generate-diagrams-proposals
   637  
   638  .PHONY: generate-diagrams-book
   639  generate-diagrams-book: ## Generate diagrams for *.plantuml files in book
   640  	docker run -v $(ROOT_DIR)/$(DOCS_DIR):/$(DOCS_DIR)$(DOCKER_VOL_OPTS)  plantuml/plantuml:$(PLANTUML_VER) /$(DOCS_DIR)/book/**/*.plantuml
   641  
   642  .PHONY: generate-diagrams-proposals
   643  generate-diagrams-proposals: ## Generate diagrams for *.plantuml files in proposals
   644  	docker run -v $(ROOT_DIR)/$(DOCS_DIR):/$(DOCS_DIR)$(DOCKER_VOL_OPTS)  plantuml/plantuml:$(PLANTUML_VER) /$(DOCS_DIR)/proposals/**/*.plantuml
   645  
   646  .PHONY: generate-test-infra-prowjobs
   647  generate-test-infra-prowjobs: $(PROWJOB_GEN) ## Generates the prowjob configurations in test-infra
   648  	@if [ -z "${TEST_INFRA_DIR}" ]; then echo "TEST_INFRA_DIR is not set"; exit 1; fi
   649  	$(PROWJOB_GEN) \
   650  		-config "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api/cluster-api-prowjob-gen.yaml" \
   651  		-templates-dir "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api/templates" \
   652  		-output-dir "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api"
   653  
   654  ## --------------------------------------
   655  ## Lint / Verify
   656  ## --------------------------------------
   657  
   658  ##@ lint and verify:
   659  
   660  .PHONY: lint
   661  lint: $(GOLANGCI_LINT) ## Lint the codebase
   662  	$(GOLANGCI_LINT) run -v $(GOLANGCI_LINT_EXTRA_ARGS)
   663  	cd $(TEST_DIR); $(GOLANGCI_LINT) run --path-prefix $(TEST_DIR) --config $(ROOT_DIR)/.golangci.yml -v $(GOLANGCI_LINT_EXTRA_ARGS)
   664  	cd $(TOOLS_DIR); $(GOLANGCI_LINT) run --path-prefix $(TOOLS_DIR) --config $(ROOT_DIR)/.golangci.yml -v $(GOLANGCI_LINT_EXTRA_ARGS)
   665  	./scripts/ci-lint-dockerfiles.sh $(HADOLINT_VER) $(HADOLINT_FAILURE_THRESHOLD)
   666  
   667  .PHONY: lint-dockerfiles
   668  lint-dockerfiles:
   669  	./scripts/ci-lint-dockerfiles.sh $(HADOLINT_VER) $(HADOLINT_FAILURE_THRESHOLD)
   670  
   671  .PHONY: lint-fix
   672  lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported by the linter
   673  	GOLANGCI_LINT_EXTRA_ARGS=--fix $(MAKE) lint
   674  
   675  .PHONY: tiltfile-fix
   676  tiltfile-fix: ## Format the Tiltfile
   677  	TRACE=$(TRACE) ./hack/verify-starlark.sh fix
   678  
   679  APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main)
   680  
   681  .PHONY: apidiff
   682  apidiff: $(GO_APIDIFF) ## Check for API differences
   683  	$(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible
   684  
   685  ALL_VERIFY_CHECKS = licenses boilerplate shellcheck tiltfile modules gen conversions doctoc capi-book-summary diagrams import-restrictions go-directive
   686  
   687  .PHONY: verify
   688  verify: $(addprefix verify-,$(ALL_VERIFY_CHECKS)) lint-dockerfiles ## Run all verify-* targets
   689  
   690  .PHONY: verify-go-directive
   691  verify-go-directive:
   692  	TRACE=$(TRACE) ./hack/verify-go-directive.sh -g $(GO_DIRECTIVE_VERSION)
   693  
   694  .PHONY: verify-modules
   695  verify-modules: generate-modules  ## Verify go modules are up to date
   696  	@if !(git diff --quiet HEAD -- go.sum go.mod $(TOOLS_DIR)/go.mod $(TOOLS_DIR)/go.sum $(TEST_DIR)/go.mod $(TEST_DIR)/go.sum); then \
   697  		git diff; \
   698  		echo "go module files are out of date"; exit 1; \
   699  	fi
   700  	@if (find . -name 'go.mod' | xargs -n1 grep -q -i 'k8s.io/client-go.*+incompatible'); then \
   701  		find . -name "go.mod" -exec grep -i 'k8s.io/client-go.*+incompatible' {} \; -print; \
   702  		echo "go module contains an incompatible client-go version"; exit 1; \
   703  	fi
   704  
   705  .PHONY: verify-gen
   706  verify-gen: generate  ## Verify go generated files are up to date
   707  	@if !(git diff --quiet HEAD); then \
   708  		git diff; \
   709  		echo "generated files are out of date, run make generate"; exit 1; \
   710  	fi
   711  
   712  .PHONY: verify-conversions
   713  verify-conversions: $(CONVERSION_VERIFIER)  ## Verifies expected API conversion are in place
   714  	$(CONVERSION_VERIFIER)
   715  
   716  .PHONY: verify-doctoc
   717  verify-doctoc: generate-doctoc
   718  	@if !(git diff --quiet HEAD); then \
   719  		git diff; \
   720  		echo "doctoc is out of date, run make generate-doctoc"; exit 1; \
   721  	fi
   722  
   723  .PHONY: verify-capi-book-summary
   724  verify-capi-book-summary:
   725  	TRACE=$(TRACE) ./hack/verify-capi-book-summary.sh
   726  
   727  .PHONY: verify-boilerplate
   728  verify-boilerplate: ## Verify boilerplate text exists in each file
   729  	TRACE=$(TRACE) ./hack/verify-boilerplate.sh
   730  
   731  .PHONY: verify-shellcheck
   732  verify-shellcheck: ## Verify shell files
   733  	TRACE=$(TRACE) ./hack/verify-shellcheck.sh $(SHELLCHECK_VER)
   734  
   735  .PHONY: verify-tiltfile
   736  verify-tiltfile: ## Verify Tiltfile format
   737  	TRACE=$(TRACE) ./hack/verify-starlark.sh
   738  
   739  .PHONY: verify-container-images
   740  verify-container-images: ## Verify container images
   741  	TRACE=$(TRACE) ./hack/verify-container-images.sh $(TRIVY_VER)
   742  
   743  .PHONY: verify-licenses
   744  verify-licenses: ## Verify licenses
   745  	TRACE=$(TRACE) ./hack/verify-licenses.sh $(TRIVY_VER)
   746  
   747  .PHONY: verify-govulncheck
   748  verify-govulncheck: $(GOVULNCHECK) ## Verify code for vulnerabilities
   749  	$(GOVULNCHECK) ./... && R1=$$? || R1=$$?; \
   750  	$(GOVULNCHECK) -C "$(TOOLS_DIR)" ./... && R2=$$? || R2=$$?; \
   751  	$(GOVULNCHECK) -C "$(TEST_DIR)" ./... && R3=$$? || R3=$$?; \
   752  	if [ "$$R1" -ne "0" ] || [ "$$R2" -ne "0" ] || [ "$$R3" -ne "0" ]; then \
   753  		exit 1; \
   754  	fi
   755  
   756  .PHONY: verify-diagrams
   757  verify-diagrams: generate-diagrams ## Verify generated diagrams are up to date
   758  	@if !(git diff --quiet HEAD); then \
   759  		git diff; \
   760  		echo "generated diagrams are out of date, run make generate-diagrams"; exit 1; \
   761  	fi
   762  
   763  .PHONY: verify-security
   764  verify-security: ## Verify code and images for vulnerabilities
   765  	$(MAKE) verify-container-images && R1=$$? || R1=$$?; \
   766  	$(MAKE) verify-govulncheck && R2=$$? || R2=$$?; \
   767  	if [ "$$R1" -ne "0" ] || [ "$$R2" -ne "0" ]; then \
   768  	  echo "Check for vulnerabilities failed! There are vulnerabilities to be fixed"; \
   769  		exit 1; \
   770  	fi
   771  
   772  .PHONY: verify-import-restrictions
   773  verify-import-restrictions: $(IMPORT_BOSS) ## Verify import restrictions with import-boss
   774  	./hack/verify-import-restrictions.sh
   775  
   776  ## --------------------------------------
   777  ## Binaries
   778  ## --------------------------------------
   779  
   780  ##@ build:
   781  
   782  .PHONY: clusterctl
   783  clusterctl: ## Build the clusterctl binary
   784  	go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/clusterctl sigs.k8s.io/cluster-api/cmd/clusterctl
   785  
   786  ALL_MANAGERS = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure
   787  
   788  .PHONY: managers
   789  managers: $(addprefix manager-,$(ALL_MANAGERS)) ## Run all manager-* targets
   790  
   791  .PHONY: manager-core
   792  manager-core: ## Build the core manager binary into the ./bin folder
   793  	go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/manager sigs.k8s.io/cluster-api
   794  
   795  .PHONY: manager-kubeadm-bootstrap
   796  manager-kubeadm-bootstrap: ## Build the kubeadm bootstrap manager binary into the ./bin folder
   797  	go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/kubeadm-bootstrap-manager sigs.k8s.io/cluster-api/bootstrap/kubeadm
   798  
   799  .PHONY: manager-kubeadm-control-plane
   800  manager-kubeadm-control-plane: ## Build the kubeadm control plane manager binary into the ./bin folder
   801  	go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/kubeadm-control-plane-manager sigs.k8s.io/cluster-api/controlplane/kubeadm
   802  
   803  .PHONY: manager-docker-infrastructure
   804  manager-docker-infrastructure: ## Build the docker infrastructure manager binary into the ./bin folder
   805  	cd $(CAPD_DIR); go build -trimpath -ldflags "$(LDFLAGS)" -o ../../../$(BIN_DIR)/capd-manager sigs.k8s.io/cluster-api/test/infrastructure/docker
   806  
   807  .PHONY: manager-in-memory-infrastructure
   808  manager-in-memory-infrastructure: ## Build the in-memory-infrastructure infrastructure manager binary into the ./bin folder
   809  	cd $(CAPIM_DIR); go build -trimpath -ldflags "$(LDFLAGS)" -o ../../../$(BIN_DIR)/capim-manager sigs.k8s.io/cluster-api/test/infrastructure/inmemory
   810  
   811  .PHONY: docker-pull-prerequisites
   812  docker-pull-prerequisites:
   813  	docker pull docker.io/docker/dockerfile:1.4
   814  	docker pull $(GO_CONTAINER_IMAGE)
   815  	docker pull gcr.io/distroless/static:latest
   816  
   817  .PHONY: docker-build-all
   818  docker-build-all: $(addprefix docker-build-,$(ALL_ARCH)) ## Build docker images for all architectures
   819  
   820  docker-build-%:
   821  	$(MAKE) ARCH=$* docker-build
   822  
   823  # Choice of images to build/push
   824  ALL_DOCKER_BUILD ?= core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension clusterctl
   825  
   826  .PHONY: docker-build
   827  docker-build: docker-pull-prerequisites ## Run docker-build-* targets for all the images
   828  	$(MAKE) ARCH=$(ARCH) $(addprefix docker-build-,$(ALL_DOCKER_BUILD))
   829  
   830  ALL_DOCKER_BUILD_E2E = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension
   831  
   832  .PHONY: docker-build-e2e
   833  docker-build-e2e: ## Run docker-build-* targets for all the images with settings to be used for the e2e tests
   834      # please ensure the generated image name matches image names used in the E2E_CONF_FILE;
   835      # also the same settings must exist in ci-e2e-lib.sh, capi:buildDockerImage func.
   836  	$(MAKE) REGISTRY=gcr.io/k8s-staging-cluster-api PULL_POLICY=IfNotPresent TAG=dev $(addprefix docker-build-,$(ALL_DOCKER_BUILD_E2E))
   837  
   838  .PHONY: docker-build-core
   839  docker-build-core: ## Build the docker image for core controller manager
   840  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   841  	cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CONTROLLER_IMG)-$(ARCH):$(TAG) --file -
   842  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/default/manager_image_patch.yaml"
   843  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/default/manager_pull_policy.yaml"
   844  
   845  .PHONY: docker-build-kubeadm-bootstrap
   846  docker-build-kubeadm-bootstrap: ## Build the docker image for kubeadm bootstrap controller manager
   847  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   848  	cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./bootstrap/kubeadm --build-arg ldflags="$(LDFLAGS)" . -t $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG) --file -
   849  	$(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml"
   850  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml"
   851  
   852  .PHONY: docker-build-kubeadm-control-plane
   853  docker-build-kubeadm-control-plane: ## Build the docker image for kubeadm control plane controller manager
   854  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   855  	cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./controlplane/kubeadm --build-arg ldflags="$(LDFLAGS)" . -t $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG) --file -
   856  	$(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml"
   857  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml"
   858  
   859  .PHONY: docker-build-docker-infrastructure
   860  docker-build-docker-infrastructure: ## Build the docker image for docker infrastructure controller manager
   861  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   862  	cat $(CAPD_DIR)/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CAPD_CONTROLLER_IMG)-$(ARCH):$(TAG) --file -
   863  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CAPD_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml"
   864  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml"
   865  
   866  .PHONY: docker-build-in-memory-infrastructure
   867  docker-build-in-memory-infrastructure: ## Build the docker image for in-memory infrastructure controller manager
   868  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   869  	cat $(CAPIM_DIR)/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CAPIM_CONTROLLER_IMG)-$(ARCH):$(TAG) --file -
   870  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CAPIM_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml"
   871  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml"
   872  
   873  .PHONY: docker-build-clusterctl
   874  docker-build-clusterctl: ## Build the docker image for clusterctl
   875  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   876  	cat ./cmd/clusterctl/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./cmd/clusterctl --build-arg ldflags="$(LDFLAGS)" . -t $(CLUSTERCTL_IMG)-$(ARCH):$(TAG) --file -
   877  
   878  .PHONY: docker-build-test-extension
   879  docker-build-test-extension: ## Build the docker image for core controller manager
   880  ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368)
   881  	cat ./test/extension/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(TEST_EXTENSION_IMG)-$(ARCH):$(TAG) --file -
   882  	$(MAKE) set-manifest-image MANIFEST_IMG=$(TEST_EXTENSION_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./test/extension/config/default/manager_image_patch.yaml"
   883  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./test/extension/config/default/manager_pull_policy.yaml"
   884  
   885  .PHONY: e2e-framework
   886  e2e-framework: ## Builds the CAPI e2e framework
   887  	cd $(E2E_FRAMEWORK_DIR); go build ./...
   888  
   889  .PHONY: build-book
   890  build-book: ## Build the book
   891  	$(MAKE) -C docs/book build
   892  
   893  ## --------------------------------------
   894  ## Testing
   895  ## --------------------------------------
   896  
   897  ##@ test:
   898  
   899  ARTIFACTS ?= ${ROOT_DIR}/_artifacts
   900  
   901  KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST) use --use-env -p path $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION))
   902  
   903  .PHONY: setup-envtest
   904  setup-envtest: $(SETUP_ENVTEST) ## Set up envtest (download kubebuilder assets)
   905  	@echo KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS)
   906  
   907  .PHONY: test
   908  test: $(SETUP_ENVTEST) ## Run unit and integration tests
   909  	KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS)
   910  
   911  .PHONY: test-verbose
   912  test-verbose: ## Run unit and integration tests with verbose flag
   913  	$(MAKE) test TEST_ARGS="$(TEST_ARGS) -v"
   914  
   915  .PHONY: test-junit
   916  test-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report
   917  	set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.exitcode) | tee $(ARTIFACTS)/junit.stdout
   918  	$(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.xml --raw-command cat $(ARTIFACTS)/junit.stdout
   919  	exit $$(cat $(ARTIFACTS)/junit.exitcode)
   920  
   921  .PHONY: test-cover
   922  test-cover: ## Run unit and integration tests and generate a coverage report
   923  	$(MAKE) test TEST_ARGS="$(TEST_ARGS) -coverprofile=out/coverage.out"
   924  	go tool cover -func=out/coverage.out -o out/coverage.txt
   925  	go tool cover -html=out/coverage.out -o out/coverage.html
   926  
   927  .PHONY: test-docker-infrastructure
   928  test-docker-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for docker infrastructure provider
   929  	cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS)
   930  
   931  .PHONY: test-docker-infrastructure-verbose
   932  test-docker-infrastructure-verbose: ## Run unit and integration tests for docker infrastructure provider with verbose flag
   933  	$(MAKE) test-docker-infrastructure TEST_ARGS="$(TEST_ARGS) -v"
   934  
   935  .PHONY: test-docker-infrastructure-junit
   936  test-docker-infrastructure-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for docker infrastructure provider
   937  	cd $(CAPD_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.infra_docker.exitcode) | tee $(ARTIFACTS)/junit.infra_docker.stdout
   938  	$(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.infra_docker.xml --raw-command cat $(ARTIFACTS)/junit.infra_docker.stdout
   939  	exit $$(cat $(ARTIFACTS)/junit.infra_docker.exitcode)
   940  
   941  .PHONY: test-in-memory-infrastructure
   942  test-in-memory-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for in-memory infrastructure provider
   943  	cd $(CAPIM_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS)
   944  
   945  .PHONY: test-in-memory-infrastructure-verbose
   946  test-in-memory-infrastructure-verbose: ## Run unit and integration tests for in-memory infrastructure provider with verbose flag
   947  	$(MAKE) test-in-memory-infrastructure TEST_ARGS="$(TEST_ARGS) -v"
   948  
   949  .PHONY: test-in-memory-infrastructure-junit
   950  test-in-memory-infrastructure-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for in-memory infrastructure provider
   951  	cd $(CAPIM_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.infra_inmemory.exitcode) | tee $(ARTIFACTS)/junit.infra_inmemory.stdout
   952  	$(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.infra_inmemory.xml --raw-command cat $(ARTIFACTS)/junit.infra_inmemory.stdout
   953  	exit $$(cat $(ARTIFACTS)/junit.infra_inmemory.exitcode)
   954  
   955  .PHONY: test-test-extension
   956  test-test-extension: $(SETUP_ENVTEST) ## Run unit and integration tests for the test extension
   957  	cd $(TEST_EXTENSION_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS)
   958  
   959  .PHONY: test-test-extension-verbose
   960  test-test-extension-verbose: ## Run unit and integration tests with verbose flag
   961  	$(MAKE) test-test-extension TEST_ARGS="$(TEST_ARGS) -v"
   962  
   963  .PHONY: test-test-extension-junit
   964  test-test-extension-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for the test extension
   965  	cd $(TEST_EXTENSION_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.test_extension.exitcode) | tee $(ARTIFACTS)/junit.test_extension.stdout
   966  	$(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.test_extension.xml --raw-command cat $(ARTIFACTS)/junit.test_extension.stdout
   967  	exit $$(cat $(ARTIFACTS)/junit.test_extension.exitcode)
   968  
   969  .PHONY: test-e2e
   970  test-e2e: $(GINKGO) generate-e2e-templates ## Run the end-to-end tests
   971  	$(GINKGO) -v --trace -poll-progress-after=$(GINKGO_POLL_PROGRESS_AFTER) \
   972  		-poll-progress-interval=$(GINKGO_POLL_PROGRESS_INTERVAL) --tags=e2e --focus="$(GINKGO_FOCUS)" \
   973  		$(_SKIP_ARGS) --nodes=$(GINKGO_NODES) --timeout=$(GINKGO_TIMEOUT) --no-color=$(GINKGO_NOCOLOR) \
   974  		--output-dir="$(ARTIFACTS)" --junit-report="junit.e2e_suite.1.xml" $(GINKGO_ARGS) $(ROOT_DIR)/$(TEST_DIR)/e2e -- \
   975  	    -e2e.artifacts-folder="$(ARTIFACTS)" \
   976  	    -e2e.config="$(E2E_CONF_FILE)" \
   977  	    -e2e.skip-resource-cleanup=$(SKIP_RESOURCE_CLEANUP) -e2e.use-existing-cluster=$(USE_EXISTING_CLUSTER)
   978  
   979  
   980  .PHONY: kind-cluster
   981  kind-cluster: ## Create a new kind cluster designed for development with Tilt
   982  	hack/kind-install-for-capd.sh
   983  
   984  .PHONY: tilt-up
   985  tilt-up: kind-cluster ## Start tilt and build kind cluster if needed.
   986  	tilt up
   987  
   988  .PHONY: serve-book
   989  serve-book: ## Build and serve the book (with live-reload)
   990  	$(MAKE) -C docs/book serve
   991  
   992  ## --------------------------------------
   993  ## Release
   994  ## --------------------------------------
   995  
   996  ##@ release:
   997  
   998  ## latest git tag for the commit, e.g., v0.3.10
   999  RELEASE_TAG ?= $(shell git describe --abbrev=0 2>/dev/null)
  1000  ifneq (,$(findstring -,$(RELEASE_TAG)))
  1001      PRE_RELEASE=true
  1002  endif
  1003  # the previous release tag, e.g., v0.3.9, excluding pre-release tags
  1004  PREVIOUS_TAG ?= $(shell git tag -l | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+$$" | sort -V | grep -B1 $(RELEASE_TAG) | head -n 1 2>/dev/null)
  1005  ## set by Prow, ref name of the base branch, e.g., main
  1006  RELEASE_ALIAS_TAG := $(PULL_BASE_REF)
  1007  RELEASE_DIR := out
  1008  RELEASE_NOTES_DIR := CHANGELOG
  1009  USER_FORK ?= $(shell git config --get remote.origin.url | cut -d/ -f4) # only works on https://github.com/<username>/cluster-api.git style URLs
  1010  ifeq ($(USER_FORK),)
  1011  USER_FORK := $(shell git config --get remote.origin.url | cut -d: -f2 | cut -d/ -f1) # for git@github.com:<username>/cluster-api.git style URLs
  1012  endif
  1013  IMAGE_REVIEWERS ?= $(shell ./hack/get-project-maintainers.sh)
  1014  
  1015  .PHONY: $(RELEASE_DIR)
  1016  $(RELEASE_DIR):
  1017  	mkdir -p $(RELEASE_DIR)/
  1018  
  1019  .PHONY: $(RELEASE_NOTES_DIR)
  1020  $(RELEASE_NOTES_DIR):
  1021  	mkdir -p $(RELEASE_NOTES_DIR)/
  1022  
  1023  .PHONY: release
  1024  release: clean-release ## Build and push container images using the latest git tag for the commit
  1025  	@if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi
  1026  	@if ! [ -z "$$(git status --porcelain)" ]; then echo "Your local git repository contains uncommitted changes, use git clean before proceeding."; exit 1; fi
  1027  	git checkout "${RELEASE_TAG}"
  1028  	# Build binaries first.
  1029  	GIT_VERSION=$(RELEASE_TAG) $(MAKE) release-binaries
  1030  	# Set the manifest images to the staging/production bucket and Builds the manifests to publish with a release.
  1031  	$(MAKE) release-manifests-all
  1032  
  1033  .PHONY: release-manifests-all
  1034  release-manifests-all: # Set the manifest images to the staging/production bucket and Builds the manifests to publish with a release.
  1035  	# Set the manifest image to the production bucket.
  1036  	$(MAKE) manifest-modification REGISTRY=$(PROD_REGISTRY)
  1037  	## Build the manifests
  1038  	$(MAKE) release-manifests
  1039  	# Set the development manifest image to the staging bucket.
  1040  	$(MAKE) manifest-modification-dev REGISTRY=$(STAGING_REGISTRY)
  1041  	## Build the development manifests
  1042  	$(MAKE) release-manifests-dev
  1043  	## Clean the git artifacts modified in the release process
  1044  	$(MAKE) clean-release-git
  1045  
  1046  .PHONY: manifest-modification
  1047  manifest-modification: # Set the manifest images to the staging/production bucket.
  1048  	$(MAKE) set-manifest-image \
  1049  		MANIFEST_IMG=$(REGISTRY)/$(IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1050  		TARGET_RESOURCE="./config/default/manager_image_patch.yaml"
  1051  	$(MAKE) set-manifest-image \
  1052  		MANIFEST_IMG=$(REGISTRY)/$(KUBEADM_BOOTSTRAP_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1053  		TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml"
  1054  	$(MAKE) set-manifest-image \
  1055  		MANIFEST_IMG=$(REGISTRY)/$(KUBEADM_CONTROL_PLANE_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1056  		TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml"
  1057  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./config/default/manager_pull_policy.yaml"
  1058  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml"
  1059  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml"
  1060  
  1061  .PHONY: manifest-modification-dev
  1062  manifest-modification-dev: # Set the manifest images to the staging bucket.
  1063  	$(MAKE) set-manifest-image \
  1064  		MANIFEST_IMG=$(REGISTRY)/$(CAPD_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1065  		TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml"
  1066  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml"
  1067  	$(MAKE) set-manifest-image \
  1068  		MANIFEST_IMG=$(REGISTRY)/$(CAPIM_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1069  		TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml"
  1070  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml"
  1071  	$(MAKE) set-manifest-image \
  1072  		MANIFEST_IMG=$(REGISTRY)/$(TEST_EXTENSION_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
  1073  		TARGET_RESOURCE="$(TEST_EXTENSION_DIR)/config/default/manager_image_patch.yaml"
  1074  	$(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml"
  1075  
  1076  
  1077  .PHONY: release-manifests
  1078  release-manifests: $(RELEASE_DIR) $(KUSTOMIZE) $(RUNTIME_OPENAPI_GEN) ## Build the manifests to publish with a release
  1079  	# Build core-components.
  1080  	$(KUSTOMIZE) build config/default > $(RELEASE_DIR)/core-components.yaml
  1081  	# Build bootstrap-components.
  1082  	$(KUSTOMIZE) build bootstrap/kubeadm/config/default > $(RELEASE_DIR)/bootstrap-components.yaml
  1083  	# Build control-plane-components.
  1084  	$(KUSTOMIZE) build controlplane/kubeadm/config/default > $(RELEASE_DIR)/control-plane-components.yaml
  1085  
  1086  	## Build cluster-api-components (aggregate of all of the above).
  1087  	cat $(RELEASE_DIR)/core-components.yaml > $(RELEASE_DIR)/cluster-api-components.yaml
  1088  	echo "---" >> $(RELEASE_DIR)/cluster-api-components.yaml
  1089  	cat $(RELEASE_DIR)/bootstrap-components.yaml >> $(RELEASE_DIR)/cluster-api-components.yaml
  1090  	echo "---" >> $(RELEASE_DIR)/cluster-api-components.yaml
  1091  	cat $(RELEASE_DIR)/control-plane-components.yaml >> $(RELEASE_DIR)/cluster-api-components.yaml
  1092  	# Add metadata to the release artifacts
  1093  	cp metadata.yaml $(RELEASE_DIR)/metadata.yaml
  1094  
  1095  	# Generate OpenAPI specification.
  1096  	$(RUNTIME_OPENAPI_GEN) --version $(RELEASE_TAG) --output-file $(RELEASE_DIR)/runtime-sdk-openapi.yaml
  1097  
  1098  .PHONY: release-manifests-dev
  1099  release-manifests-dev: $(RELEASE_DIR) $(KUSTOMIZE) ## Build the development manifests and copies them in the release folder
  1100  	cd $(CAPD_DIR); $(KUSTOMIZE) build config/default > ../../../$(RELEASE_DIR)/infrastructure-components-development.yaml
  1101  	cp $(CAPD_DIR)/templates/* $(RELEASE_DIR)/
  1102  	cd $(CAPIM_DIR); $(KUSTOMIZE) build config/default > ../../../$(RELEASE_DIR)/infrastructure-components-in-memory-development.yaml
  1103  	cp $(CAPIM_DIR)/templates/* $(RELEASE_DIR)/
  1104  	cd $(TEST_EXTENSION_DIR); $(KUSTOMIZE) build config/default > ../../$(RELEASE_DIR)/runtime-extension-components-development.yaml
  1105  
  1106  .PHONY: release-binaries
  1107  release-binaries: ## Build the binaries to publish with a release
  1108  	RELEASE_BINARY=clusterctl-linux-amd64 BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=amd64 $(MAKE) release-binary
  1109  	RELEASE_BINARY=clusterctl-linux-arm64 BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=arm64 $(MAKE) release-binary
  1110  	RELEASE_BINARY=clusterctl-darwin-amd64 BUILD_PATH=./cmd/clusterctl GOOS=darwin GOARCH=amd64 $(MAKE) release-binary
  1111  	RELEASE_BINARY=clusterctl-darwin-arm64 BUILD_PATH=./cmd/clusterctl GOOS=darwin GOARCH=arm64 $(MAKE) release-binary
  1112  	RELEASE_BINARY=clusterctl-windows-amd64.exe BUILD_PATH=./cmd/clusterctl GOOS=windows GOARCH=amd64 $(MAKE) release-binary
  1113  	RELEASE_BINARY=clusterctl-linux-ppc64le BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=ppc64le $(MAKE) release-binary
  1114  
  1115  .PHONY: release-binary
  1116  release-binary: $(RELEASE_DIR)
  1117  	docker run \
  1118  		--rm \
  1119  		-e CGO_ENABLED=0 \
  1120  		-e GOOS=$(GOOS) \
  1121  		-e GOARCH=$(GOARCH) \
  1122  		-e GOCACHE=/tmp/ \
  1123  		--user $$(id -u):$$(id -g) \
  1124  		-v "$$(pwd):/workspace$(DOCKER_VOL_OPTS)" \
  1125  		-w /workspace \
  1126  		golang:$(GO_VERSION) \
  1127  		go build -a -trimpath -ldflags "$(LDFLAGS) -extldflags '-static'" \
  1128  		-o $(RELEASE_DIR)/$(notdir $(RELEASE_BINARY)) $(BUILD_PATH)
  1129  
  1130  .PHONY: release-staging
  1131  release-staging: ## Build and push container images to the staging bucket
  1132  	REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-build-all
  1133  	REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-image-verify
  1134  	REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-push-all
  1135  	REGISTRY=$(STAGING_REGISTRY) $(MAKE) release-alias-tag
  1136  
  1137  .PHONY: release-staging-nightly
  1138  release-staging-nightly: ## Tag and push container images to the staging bucket. Example image tag: cluster-api-controller:nightly_main_20210121
  1139  	$(eval NEW_RELEASE_ALIAS_TAG := nightly_$(RELEASE_ALIAS_TAG)_$(shell date +'%Y%m%d'))
  1140  	echo $(NEW_RELEASE_ALIAS_TAG)
  1141  	$(MAKE) release-alias-tag TAG=$(RELEASE_ALIAS_TAG) RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG)
  1142  	# Set the manifest image to the staging bucket.
  1143  	$(MAKE) manifest-modification REGISTRY=$(STAGING_REGISTRY) RELEASE_TAG=$(NEW_RELEASE_ALIAS_TAG)
  1144  	## Build the manifests
  1145  	$(MAKE) release-manifests
  1146  	# Set the manifest image to the staging bucket.
  1147  	$(MAKE) manifest-modification-dev REGISTRY=$(STAGING_REGISTRY) RELEASE_TAG=$(NEW_RELEASE_ALIAS_TAG)
  1148  	## Build the dev manifests
  1149  	$(MAKE) release-manifests-dev
  1150  	# Example manifest location: artifacts.k8s-staging-cluster-api.appspot.com/components/nightly_main_20210121/bootstrap-components.yaml
  1151  	gsutil cp $(RELEASE_DIR)/* gs://$(STAGING_BUCKET)/components/$(NEW_RELEASE_ALIAS_TAG)
  1152  
  1153  .PHONY: release-alias-tag
  1154  release-alias-tag: ## Add the release alias tag to the last build tag
  1155  	gcloud container images add-tag $(CONTROLLER_IMG):$(TAG) $(CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
  1156  	gcloud container images add-tag $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG) $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
  1157  	gcloud container images add-tag $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
  1158  	gcloud container images add-tag $(CLUSTERCTL_IMG):$(TAG) $(CLUSTERCTL_IMG):$(RELEASE_ALIAS_TAG)
  1159  	gcloud container images add-tag $(CAPD_CONTROLLER_IMG):$(TAG) $(CAPD_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
  1160  	gcloud container images add-tag $(CAPIM_CONTROLLER_IMG):$(TAG) $(CAPIM_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
  1161  	gcloud container images add-tag $(TEST_EXTENSION_IMG):$(TAG) $(TEST_EXTENSION_IMG):$(RELEASE_ALIAS_TAG)
  1162  
  1163  .PHONY: release-notes-tool
  1164  release-notes-tool:
  1165  	go build -C hack/tools -o $(ROOT_DIR)/bin/notes -tags tools sigs.k8s.io/cluster-api/hack/tools/release/notes
  1166  
  1167  .PHONY: release-notes
  1168  release-notes: release-notes-tool
  1169  	./bin/notes --release $(RELEASE_TAG) > CHANGELOG/$(RELEASE_TAG).md
  1170  
  1171  .PHONY: test-release-notes-tool
  1172  test-release-notes-tool:
  1173  	go test -C hack/tools -v -tags tools,integration sigs.k8s.io/cluster-api/hack/tools/release/notes
  1174  
  1175  .PHONY: release-provider-issues-tool
  1176  release-provider-issues-tool: # Creates GitHub issues in a pre-defined list of CAPI provider repositories
  1177  	@go run ./hack/tools/release/internal/update_providers/provider_issues.go
  1178  
  1179  .PHONY: release-weekly-update-tool
  1180  release-weekly-update-tool:
  1181  	go build -C hack/tools -o $(ROOT_DIR)/bin/weekly -tags tools sigs.k8s.io/cluster-api/hack/tools/release/weekly
  1182  
  1183  .PHONY: promote-images
  1184  promote-images: $(KPROMO)
  1185  	$(KPROMO) pr --project cluster-api --tag $(RELEASE_TAG) --reviewers "$(IMAGE_REVIEWERS)" --fork $(USER_FORK) --image cluster-api-controller --image kubeadm-control-plane-controller --image kubeadm-bootstrap-controller --image clusterctl
  1186  
  1187  ## --------------------------------------
  1188  ## Docker
  1189  ## --------------------------------------
  1190  
  1191  .PHONY: docker-image-verify
  1192  docker-image-verify: ## Verifies all built images to contain the correct binary in the expected arch
  1193  	ALL_ARCH="$(ALL_ARCH)" TAG="$(TAG)" ./hack/docker-image-verify.sh
  1194  
  1195  .PHONY: docker-push-all
  1196  docker-push-all: $(addprefix docker-push-,$(ALL_ARCH))  ## Push the docker images to be included in the release for all architectures + related multiarch manifests
  1197  	$(MAKE) ALL_ARCH="$(ALL_ARCH)" $(addprefix docker-push-manifest-,$(ALL_DOCKER_BUILD))
  1198  
  1199  docker-push-%:
  1200  	$(MAKE) ARCH=$* docker-push
  1201  
  1202  .PHONY: docker-push
  1203  docker-push: $(addprefix docker-push-,$(ALL_DOCKER_BUILD)) ## Push the docker images to be included in the release
  1204  
  1205  .PHONY: docker-push-core
  1206  docker-push-core: ## Push the core docker image
  1207  	docker push $(CONTROLLER_IMG)-$(ARCH):$(TAG)
  1208  
  1209  .PHONY: docker-push-manifest-core
  1210  docker-push-manifest-core: ## Push the multiarch manifest for the core docker images
  1211  	docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g")
  1212  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done
  1213  	docker manifest push --purge $(CONTROLLER_IMG):$(TAG)
  1214  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/default/manager_image_patch.yaml"
  1215  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/default/manager_pull_policy.yaml"
  1216  
  1217  .PHONY: docker-push-kubeadm-bootstrap
  1218  docker-push-kubeadm-bootstrap: ## Push the kubeadm bootstrap docker image
  1219  	docker push $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG)
  1220  
  1221  .PHONY: docker-push-manifest-kubeadm-bootstrap
  1222  docker-push-manifest-kubeadm-bootstrap: ## Push the multiarch manifest for the kubeadm bootstrap docker images
  1223  	docker manifest create --amend $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)\-&:$(TAG)~g")
  1224  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${KUBEADM_BOOTSTRAP_CONTROLLER_IMG}:${TAG} ${KUBEADM_BOOTSTRAP_CONTROLLER_IMG}-$${arch}:${TAG}; done
  1225  	docker manifest push --purge $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG)
  1226  	$(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml"
  1227  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml"
  1228  
  1229  .PHONY: docker-push-kubeadm-control-plane
  1230  docker-push-kubeadm-control-plane: ## Push the kubeadm control plane docker image
  1231  	docker push $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG)
  1232  
  1233  .PHONY: docker-push-manifest-kubeadm-control-plane
  1234  docker-push-manifest-kubeadm-control-plane: ## Push the multiarch manifest for the kubeadm control plane docker images
  1235  	docker manifest create --amend $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)\-&:$(TAG)~g")
  1236  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${KUBEADM_CONTROL_PLANE_CONTROLLER_IMG}:${TAG} ${KUBEADM_CONTROL_PLANE_CONTROLLER_IMG}-$${arch}:${TAG}; done
  1237  	docker manifest push --purge $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG)
  1238  	$(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml"
  1239  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml"
  1240  
  1241  .PHONY: docker-push-docker-infrastructure
  1242  docker-push-docker-infrastructure: ## Push the docker infrastructure provider image
  1243  	docker push $(CAPD_CONTROLLER_IMG)-$(ARCH):$(TAG)
  1244  
  1245  .PHONY: docker-push-manifest-docker-infrastructure
  1246  docker-push-manifest-docker-infrastructure: ## Push the multiarch manifest for the docker infrastructure provider images
  1247  	docker manifest create --amend $(CAPD_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CAPD_CONTROLLER_IMG)\-&:$(TAG)~g")
  1248  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CAPD_CONTROLLER_IMG}:${TAG} ${CAPD_CONTROLLER_IMG}-$${arch}:${TAG}; done
  1249  	docker manifest push --purge $(CAPD_CONTROLLER_IMG):$(TAG)
  1250  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CAPD_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml"
  1251  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml"
  1252  
  1253  .PHONY: docker-push-in-memory-infrastructure
  1254  docker-push-in-memory-infrastructure: ## Push the in-memory infrastructure provider image
  1255  	docker push $(CAPIM_CONTROLLER_IMG)-$(ARCH):$(TAG)
  1256  
  1257  .PHONY: docker-push-manifest-in-memory-infrastructure
  1258  docker-push-manifest-in-memory-infrastructure: ## Push the multiarch manifest for the in-memory infrastructure provider images
  1259  	docker manifest create --amend $(CAPIM_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CAPIM_CONTROLLER_IMG)\-&:$(TAG)~g")
  1260  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CAPIM_CONTROLLER_IMG}:${TAG} ${CAPIM_CONTROLLER_IMG}-$${arch}:${TAG}; done
  1261  	docker manifest push --purge $(CAPIM_CONTROLLER_IMG):$(TAG)
  1262  	$(MAKE) set-manifest-image MANIFEST_IMG=$(CAPIM_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml"
  1263  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml"
  1264  
  1265  .PHONY: docker-push-test-extension
  1266  docker-push-test-extension: ## Push the test extension provider image
  1267  	docker push $(TEST_EXTENSION_IMG)-$(ARCH):$(TAG)
  1268  
  1269  .PHONY: docker-push-manifest-test-extension
  1270  docker-push-manifest-test-extension: ## Push the multiarch manifest for the test extension provider images
  1271  	docker manifest create --amend $(TEST_EXTENSION_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(TEST_EXTENSION_IMG)\-&:$(TAG)~g")
  1272  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${TEST_EXTENSION_IMG}:${TAG} ${TEST_EXTENSION_IMG}-$${arch}:${TAG}; done
  1273  	docker manifest push --purge $(TEST_EXTENSION_IMG):$(TAG)
  1274  	$(MAKE) set-manifest-image MANIFEST_IMG=$(TEST_EXTENSION_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./test/extension/config/default/manager_image_patch.yaml"
  1275  	$(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./test/extension/config/default/manager_pull_policy.yaml"
  1276  
  1277  .PHONY: docker-push-clusterctl
  1278  docker-push-clusterctl: ## Push the clusterctl image
  1279  	docker push $(CLUSTERCTL_IMG)-$(ARCH):$(TAG)
  1280  
  1281  .PHONY: docker-push-manifest-clusterctl
  1282  docker-push-manifest-clusterctl: ## Push the multiarch manifest for the clusterctl images
  1283  	docker manifest create --amend $(CLUSTERCTL_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CLUSTERCTL_IMG)\-&:$(TAG)~g")
  1284  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CLUSTERCTL_IMG}:${TAG} ${CLUSTERCTL_IMG}-$${arch}:${TAG}; done
  1285  	docker manifest push --purge $(CLUSTERCTL_IMG):$(TAG)
  1286  
  1287  .PHONY: set-manifest-pull-policy
  1288  set-manifest-pull-policy:
  1289  	$(info Updating kustomize pull policy file for manager resources)
  1290  	sed -i'' -e 's@imagePullPolicy: .*@imagePullPolicy: '"$(PULL_POLICY)"'@' $(TARGET_RESOURCE)
  1291  
  1292  .PHONY: set-manifest-image
  1293  set-manifest-image:
  1294  	$(info Updating kustomize image patch file for manager resource)
  1295  	sed -i'' -e 's@image: .*@image: '"${MANIFEST_IMG}:$(MANIFEST_TAG)"'@' $(TARGET_RESOURCE)
  1296  
  1297  ## --------------------------------------
  1298  ## Cleanup / Verification
  1299  ## --------------------------------------
  1300  
  1301  ##@ clean:
  1302  
  1303  .PHONY: clean
  1304  clean: ## Remove generated binaries, GitBook files, Helm charts, and Tilt build files
  1305  	$(MAKE) clean-bin
  1306  	$(MAKE) clean-book
  1307  	$(MAKE) clean-charts
  1308  	$(MAKE) clean-tilt
  1309  
  1310  .PHONY: clean-kind
  1311  clean-kind: ## Cleans up the kind cluster with the name $CAPI_KIND_CLUSTER_NAME
  1312  	kind delete cluster --name="$(CAPI_KIND_CLUSTER_NAME)" || true
  1313  
  1314  .PHONY: clean-bin
  1315  clean-bin: ## Remove all generated binaries
  1316  	rm -rf $(BIN_DIR)
  1317  	rm -rf $(TOOLS_BIN_DIR)
  1318  
  1319  .PHONY: clean-tilt
  1320  clean-tilt: clean-charts clean-kind ## Remove all files generated by Tilt
  1321  	rm -rf ./.tiltbuild
  1322  	rm -rf ./controlplane/kubeadm/.tiltbuild
  1323  	rm -rf ./bootstrap/kubeadm/.tiltbuild
  1324  	rm -rf ./test/infrastructure/docker/.tiltbuild
  1325  	rm -rf ./test/infrastructure/inmemory/.tiltbuild
  1326  
  1327  .PHONY: clean-charts
  1328  clean-charts: ## Remove all local copies of Helm charts in ./hack/observability
  1329  	(for path in "./hack/observability/*"; do rm -rf $$path/.charts ; done)
  1330  
  1331  .PHONY: clean-book
  1332  clean-book: ## Remove all generated GitBook files
  1333  	rm -rf ./docs/book/_book
  1334  
  1335  .PHONY: clean-release
  1336  clean-release: ## Remove the release folder
  1337  	rm -rf $(RELEASE_DIR)
  1338  
  1339  .PHONY: clean-manifests ## Reset manifests in config directories back to main
  1340  clean-manifests:
  1341  	@read -p "WARNING: This will reset all config directories to local main. Press [ENTER] to continue."
  1342  	git checkout main config bootstrap/kubeadm/config controlplane/kubeadm/config $(CAPD_DIR)/config
  1343  
  1344  .PHONY: clean-release-git
  1345  clean-release-git: ## Restores the git files usually modified during a release
  1346  	git restore ./*manager_image_patch.yaml ./*manager_pull_policy.yaml
  1347  
  1348  .PHONY: clean-generated-yaml
  1349  clean-generated-yaml: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4"
  1350  	(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name '*.yaml' -exec rm -f {} \;; done)
  1351  
  1352  .PHONY: clean-generated-deepcopy
  1353  clean-generated-deepcopy: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4"
  1354  	(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.deepcopy*' -exec rm -f {} \;; done)
  1355  
  1356  .PHONY: clean-generated-conversions
  1357  clean-generated-conversions: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4"
  1358  	(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.conversion*' -exec rm -f {} \;; done)
  1359  
  1360  .PHONY: clean-generated-openapi-definitions
  1361  clean-generated-openapi-definitions: ## Remove files generated by openapi-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4"
  1362  	(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.openapi*' -exec rm -f {} \;; done)
  1363  
  1364  ## --------------------------------------
  1365  ## Hack / Tools
  1366  ## --------------------------------------
  1367  
  1368  ##@ hack/tools:
  1369  
  1370  .PHONY: $(CONTROLLER_GEN_BIN)
  1371  $(CONTROLLER_GEN_BIN): $(CONTROLLER_GEN) ## Build a local copy of controller-gen.
  1372  
  1373  .PHONY: $(CONVERSION_GEN_BIN)
  1374  $(CONVERSION_GEN_BIN): $(CONVERSION_GEN) ## Build a local copy of conversion-gen.
  1375  
  1376  .PHONY: $(OPENAPI_GEN_BIN)
  1377  $(OPENAPI_GEN_BIN): $(OPENAPI_GEN) ## Build a local copy of openapi-gen.
  1378  
  1379  .PHONY: $(RUNTIME_OPENAPI_GEN_BIN)
  1380  $(RUNTIME_OPENAPI_GEN_BIN): $(RUNTIME_OPENAPI_GEN) ## Build a local copy of runtime-openapi-gen.
  1381  
  1382  .PHONY: $(PROWJOB_GEN_BIN)
  1383  $(PROWJOB_GEN_BIN): $(PROWJOB_GEN) ## Build a local copy of prowjob-gen.
  1384  
  1385  .PHONY: $(CONVERSION_VERIFIER_BIN)
  1386  $(CONVERSION_VERIFIER_BIN): $(CONVERSION_VERIFIER) ## Build a local copy of conversion-verifier.
  1387  
  1388  .PHONY: $(GOTESTSUM_BIN)
  1389  $(GOTESTSUM_BIN): $(GOTESTSUM) ## Build a local copy of gotestsum.
  1390  
  1391  .PHONY: $(GO_APIDIFF_BIN)
  1392  $(GO_APIDIFF_BIN): $(GO_APIDIFF) ## Build a local copy of go-apidiff
  1393  
  1394  .PHONY: $(ENVSUBST_BIN)
  1395  $(ENVSUBST_BIN): $(ENVSUBST) ## Build a local copy of envsubst.
  1396  
  1397  .PHONY: $(KUSTOMIZE_BIN)
  1398  $(KUSTOMIZE_BIN): $(KUSTOMIZE) ## Build a local copy of kustomize.
  1399  
  1400  .PHONY: $(SETUP_ENVTEST_BIN)
  1401  $(SETUP_ENVTEST_BIN): $(SETUP_ENVTEST) ## Build a local copy of setup-envtest.
  1402  
  1403  .PHONY: $(KPROMO_BIN)
  1404  $(KPROMO_BIN): $(KPROMO) ## Build a local copy of kpromo
  1405  
  1406  .PHONY: $(YQ_BIN)
  1407  $(YQ_BIN): $(YQ) ## Build a local copy of yq
  1408  
  1409  .PHONY: $(TILT_PREPARE_BIN)
  1410  $(TILT_PREPARE_BIN): $(TILT_PREPARE) ## Build a local copy of tilt-prepare.
  1411  
  1412  .PHONY: $(GINKGO_BIN)
  1413  $(GINKGO_BIN): $(GINKGO) ## Build a local copy of ginkgo.
  1414  
  1415  .PHONY: $(GOLANGCI_LINT_BIN)
  1416  $(GOLANGCI_LINT_BIN): $(GOLANGCI_LINT) ## Build a local copy of golangci-lint.
  1417  
  1418  .PHONY: $(GOVULNCHECK_BIN)
  1419  $(GOVULNCHECK_BIN): $(GOVULNCHECK) ## Build a local copy of govulncheck.
  1420  
  1421  .PHONY: $(IMPORT_BOSS_BIN)
  1422  $(IMPORT_BOSS_BIN): $(IMPORT_BOSS)
  1423  
  1424  $(CONTROLLER_GEN): # Build controller-gen from tools folder.
  1425  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(CONTROLLER_GEN_PKG) $(CONTROLLER_GEN_BIN) $(CONTROLLER_GEN_VER)
  1426  
  1427  ## We are forcing a rebuilt of conversion-gen via PHONY so that we're always using an up-to-date version.
  1428  ## We can't use a versioned name for the binary, because that would be reflected in generated files.
  1429  .PHONY: $(CONVERSION_GEN)
  1430  $(CONVERSION_GEN): # Build conversion-gen from tools folder.
  1431  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(CONVERSION_GEN_PKG) $(CONVERSION_GEN_BIN) $(CONVERSION_GEN_VER)
  1432  
  1433  $(CONVERSION_VERIFIER): $(TOOLS_DIR)/go.mod # Build conversion-verifier from tools folder.
  1434  	cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(CONVERSION_VERIFIER_BIN) sigs.k8s.io/cluster-api/hack/tools/conversion-verifier
  1435  
  1436  .PHONY: $(OPENAPI_GEN)
  1437  $(OPENAPI_GEN): # Build openapi-gen from tools folder.
  1438  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(OPENAPI_GEN_PKG) $(OPENAPI_GEN_BIN) $(OPENAPI_GEN_VER)
  1439  
  1440  ## We are forcing a rebuilt of runtime-openapi-gen via PHONY so that we're always using an up-to-date version.
  1441  .PHONY: $(RUNTIME_OPENAPI_GEN)
  1442  $(RUNTIME_OPENAPI_GEN): $(TOOLS_DIR)/go.mod # Build openapi-gen from tools folder.
  1443  	cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(RUNTIME_OPENAPI_GEN_BIN) sigs.k8s.io/cluster-api/hack/tools/runtime-openapi-gen
  1444  
  1445  .PHONY: $(PROWJOB_GEN)
  1446  $(PROWJOB_GEN): $(TOOLS_DIR)/go.mod # Build prowjob-gen from tools folder.
  1447  	cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(PROWJOB_GEN_BIN) sigs.k8s.io/cluster-api/hack/tools/prowjob-gen
  1448  
  1449  $(GOTESTSUM): # Build gotestsum from tools folder.
  1450  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOTESTSUM_PKG) $(GOTESTSUM_BIN) $(GOTESTSUM_VER)
  1451  
  1452  $(GO_APIDIFF): # Build go-apidiff from tools folder.
  1453  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GO_APIDIFF_PKG) $(GO_APIDIFF_BIN) $(GO_APIDIFF_VER)
  1454  
  1455  $(ENVSUBST): # Build gotestsum from tools folder.
  1456  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(ENVSUBST_PKG) $(ENVSUBST_BIN) $(ENVSUBST_VER)
  1457  
  1458  $(KUSTOMIZE): # Build kustomize from tools folder.
  1459  	CGO_ENABLED=0 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(KUSTOMIZE_PKG) $(KUSTOMIZE_BIN) $(KUSTOMIZE_VER)
  1460  
  1461  $(SETUP_ENVTEST): # Build setup-envtest from tools folder.
  1462  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(SETUP_ENVTEST_PKG) $(SETUP_ENVTEST_BIN) $(SETUP_ENVTEST_VER)
  1463  
  1464  $(TILT_PREPARE): $(TOOLS_DIR)/go.mod # Build tilt-prepare from tools folder.
  1465  	cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/tilt-prepare sigs.k8s.io/cluster-api/hack/tools/internal/tilt-prepare
  1466  
  1467  $(KPROMO):
  1468  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(KPROMO_PKG) $(KPROMO_BIN) ${KPROMO_VER}
  1469  
  1470  $(YQ):
  1471  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(YQ_PKG) $(YQ_BIN) ${YQ_VER}
  1472  
  1473  $(GINKGO): # Build ginkgo from tools folder.
  1474  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GINKGO_PKG) $(GINKGO_BIN) $(GINKGO_VER)
  1475  
  1476  $(GOLANGCI_LINT): # Build golangci-lint from tools folder.
  1477  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOLANGCI_LINT_PKG) $(GOLANGCI_LINT_BIN) $(GOLANGCI_LINT_VER)
  1478  
  1479  $(GOVULNCHECK): # Build govulncheck.
  1480  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOVULNCHECK_PKG) $(GOVULNCHECK_BIN) $(GOVULNCHECK_VER)
  1481  
  1482  $(IMPORT_BOSS): # Build import-boss
  1483  	GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(IMPORT_BOSS_PKG) $(IMPORT_BOSS_BIN) $(IMPORT_BOSS_VER)
  1484  
  1485  ## --------------------------------------
  1486  ## Helpers
  1487  ## --------------------------------------
  1488  
  1489  ##@ helpers:
  1490  
  1491  go-version: ## Print the go version we use to compile our binaries and images
  1492  	@echo $(GO_VERSION)