sigs.k8s.io/cluster-api-provider-aws@v1.5.5/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  ROOT_DIR_RELATIVE := .
    16  
    17  include $(ROOT_DIR_RELATIVE)/common.mk
    18  
    19  # If you update this file, please follow
    20  # https://suva.sh/posts/well-documented-makefiles
    21  
    22  # Directories.
    23  ARTIFACTS ?= $(REPO_ROOT)/_artifacts
    24  TOOLS_DIR := hack/tools
    25  TOOLS_DIR_DEPS := $(TOOLS_DIR)/go.sum $(TOOLS_DIR)/go.mod $(TOOLS_DIR)/Makefile
    26  TOOLS_BIN_DIR := $(TOOLS_DIR)/bin
    27  GO_INSTALL := ./scripts/go_install.sh
    28  
    29  API_DIRS := cmd/clusterawsadm/api api exp/api controlplane/eks/api bootstrap/eks/api iam/api
    30  API_FILES := $(foreach dir, $(API_DIRS), $(call rwildcard,../../$(dir),*.go))
    31  
    32  BIN_DIR := bin
    33  REPO_ROOT := $(shell git rev-parse --show-toplevel)
    34  GH_ORG_NAME ?= kubernetes-sigs
    35  GH_REPO_NAME ?= cluster-api-provider-aws
    36  GH_REPO ?= $(GH_ORG_NAME)/$(GH_REPO_NAME)
    37  TEST_E2E_DIR := test/e2e
    38  
    39  # Files
    40  E2E_DATA_DIR ?= $(REPO_ROOT)/test/e2e/data
    41  E2E_CONF_PATH  ?= $(E2E_DATA_DIR)/e2e_conf.yaml
    42  E2E_EKS_CONF_PATH ?= $(E2E_DATA_DIR)/e2e_eks_conf.yaml
    43  KUBETEST_CONF_PATH ?= $(abspath $(E2E_DATA_DIR)/kubetest/conformance.yaml)
    44  EXP_DIR := exp
    45  
    46  # Binaries.
    47  GO_APIDIFF_BIN := $(BIN_DIR)/go-apidiff
    48  GO_APIDIFF := $(TOOLS_DIR)/$(GO_APIDIFF_BIN)
    49  CLUSTERCTL := $(BIN_DIR)/clusterctl
    50  CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen
    51  CONVERSION_GEN := $(TOOLS_BIN_DIR)/conversion-gen
    52  CONVERSION_VERIFIER := $(TOOLS_BIN_DIR)/conversion-verifier
    53  DEFAULTER_GEN := $(TOOLS_BIN_DIR)/defaulter-gen
    54  ENVSUBST := $(TOOLS_BIN_DIR)/envsubst
    55  GH := $(TOOLS_BIN_DIR)/gh
    56  GINKGO := $(TOOLS_BIN_DIR)/ginkgo
    57  GOJQ := $(TOOLS_BIN_DIR)/gojq
    58  GOLANGCI_LINT := $(TOOLS_BIN_DIR)/golangci-lint
    59  KIND := $(TOOLS_BIN_DIR)/kind
    60  KUSTOMIZE := $(TOOLS_BIN_DIR)/kustomize
    61  MOCKGEN := $(TOOLS_BIN_DIR)/mockgen
    62  SSM_PLUGIN := $(TOOLS_BIN_DIR)/session-manager-plugin
    63  CLUSTERAWSADM_SRCS := $(call rwildcard,.,cmd/clusterawsadm/*.*)
    64  
    65  PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH)
    66  DOCKER_CLI_EXPERIMENTAL=enabled
    67  DOCKER_BUILDKIT=1
    68  
    69  export ACK_GINKGO_DEPRECATIONS := 1.16.4
    70  
    71  # Set --output-base for conversion-gen if we are not within GOPATH
    72  ifneq ($(abspath $(REPO_ROOT)),$(shell go env GOPATH)/src/sigs.k8s.io/cluster-api-provider-aws)
    73  	GEN_OUTPUT_BASE := --output-base=$(REPO_ROOT)
    74  else
    75  	export GOPATH := $(shell go env GOPATH)
    76  endif
    77  
    78  # Release variables
    79  
    80  STAGING_REGISTRY ?= gcr.io/k8s-staging-cluster-api-aws
    81  STAGING_BUCKET ?= artifacts.k8s-staging-cluster-api-aws.appspot.com
    82  BUCKET ?= $(STAGING_BUCKET)
    83  PROD_REGISTRY := registry.k8s.io/cluster-api-aws
    84  REGISTRY ?= $(STAGING_REGISTRY)
    85  RELEASE_TAG ?= $(shell git describe --abbrev=0 2>/dev/null)
    86  PULL_BASE_REF ?= $(RELEASE_TAG) # PULL_BASE_REF will be provided by Prow
    87  RELEASE_ALIAS_TAG ?= $(PULL_BASE_REF)
    88  RELEASE_DIR := out
    89  RELEASE_POLICIES := $(RELEASE_DIR)/AWSIAMManagedPolicyControllers.json $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithEKS.json $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithS3.json
    90  BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
    91  
    92  # image name used to build the cmd/clusterawsadm
    93  TOOLCHAIN_IMAGE := toolchain
    94  
    95  TAG ?= dev
    96  ARCH ?= $(shell go env GOARCH)
    97  ALL_ARCH ?= amd64 arm arm64 ppc64le s390x
    98  
    99  # main controller
   100  CORE_IMAGE_NAME ?= cluster-api-aws-controller
   101  CORE_CONTROLLER_IMG ?= $(REGISTRY)/$(CORE_IMAGE_NAME)
   102  CORE_CONTROLLER_PROMOTED_IMG := $(PROD_REGISTRY)/$(CORE_IMAGE_NAME)
   103  CORE_CONTROLLER_ORIGINAL_IMG := gcr.io/k8s-staging-cluster-api-aws/cluster-api-aws-controller
   104  CORE_CONTROLLER_NAME := capa-controller-manager
   105  CORE_MANIFEST_FILE := infrastructure-components
   106  CORE_CONFIG_DIR := config/default
   107  CORE_NAMESPACE := capa-system
   108  
   109  # Allow overriding manifest generation destination directory
   110  MANIFEST_ROOT ?= config
   111  CRD_ROOT ?= $(MANIFEST_ROOT)/crd/bases
   112  CRD_DOCS_DIR := docs/book/src/crd
   113  CRD_DOCS := $(CRD_DOCS_DIR)/index.md
   114  WEBHOOK_ROOT ?= $(MANIFEST_ROOT)/webhook
   115  RBAC_ROOT ?= $(MANIFEST_ROOT)/rbac
   116  
   117  # Allow overriding the imagePullPolicy
   118  PULL_POLICY ?= Always
   119  
   120  # Set build time variables including version details
   121  LDFLAGS := $(shell source ./hack/version.sh; version::ldflags)
   122  
   123  # Set USE_EXISTING_CLUSTER to use an existing kubernetes context
   124  USE_EXISTING_CLUSTER ?= "false"
   125  
   126  # Set E2E_SKIP_EKS_UPGRADE to false to test EKS upgrades.
   127  # Warning, this takes a long time
   128  E2E_SKIP_EKS_UPGRADE ?= "false"
   129  
   130  # Set EKS_SOURCE_TEMPLATE to override the source template
   131  EKS_SOURCE_TEMPLATE ?= eks/cluster-template-eks-control-plane-only.yaml
   132  
   133  # set up `setup-envtest` to install kubebuilder dependency
   134  export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.23.3
   135  SETUP_ENVTEST_VER := v0.0.0-20211110210527-619e6b92dab9
   136  SETUP_ENVTEST_BIN := setup-envtest
   137  SETUP_ENVTEST := $(abspath $(TOOLS_BIN_DIR)/$(SETUP_ENVTEST_BIN)-$(SETUP_ENVTEST_VER))
   138  SETUP_ENVTEST_PKG := sigs.k8s.io/controller-runtime/tools/setup-envtest
   139  
   140  GINKGO_FOCUS ?= ""
   141  GINKGO_SKIP ?= ""
   142  
   143  # Enable Cluster API Framework tests for the purposes of running the PR blocking test
   144  ifeq ($(findstring \[PR-Blocking\],$(GINKGO_FOCUS)),\[PR-Blocking\])
   145    override undefine GINKGO_SKIP
   146  endif
   147  
   148  override E2E_ARGS += -artifacts-folder="$(ARTIFACTS)" --data-folder="$(E2E_DATA_DIR)" -use-existing-cluster=$(USE_EXISTING_CLUSTER)
   149  override GINKGO_ARGS += -stream -progress -v -trace
   150  
   151  # DEPRECATED, use GINKGO_FOCUS instead
   152  ifdef E2E_UNMANAGED_FOCUS
   153  	override GINKGO_ARGS += -focus="$(E2E_UNMANAGED_FOCUS)"
   154  endif
   155  
   156  # ALL tests will take ~ 1 hour @ 24 node concurrency.
   157  # Set the number of nodes using GINKGO_ARGS=-nodes 24
   158  # Ginkgo will default to the number of logical CPUs you have available.
   159  # Should be safe to set more nodes than available CPU cores as most of the time is spent in
   160  # infrastructure reconciliation
   161  
   162  # Instead, you can run a quick smoke test, it should run fast (9 minutes)...
   163  # GINKGO_FOCUS := "\\[smoke\\]"
   164  # For running CAPI e2e tests: GINKGO_FOCUS := "\\[Cluster API Framework\\]"
   165  # For running CAPI blocking e2e test: GINKGO_FOCUS := "\\[PR-Blocking\\]"
   166  ifeq ($(E2E_SKIP_EKS_UPGRADE),"true")
   167  	override EKS_E2E_ARGS += --skip-eks-upgrade-tests
   168  endif
   169  
   170  ##@ generate:
   171  
   172  .PHONY: defaulters
   173  defaulters: $(DEFAULTER_GEN) ## Generate all Go types
   174  	$(DEFAULTER_GEN) \
   175  		--input-dirs=./api/v1alpha3 \
   176  		--input-dirs=./api/v1alpha4 \
   177  		--input-dirs=./api/v1beta1 \
   178  		--input-dirs=./$(EXP_DIR)/api/v1beta1 \
   179  		--input-dirs=./cmd/clusterawsadm/api/bootstrap/v1beta1 \
   180  		--input-dirs=./cmd/clusterawsadm/api/bootstrap/v1alpha1 \
   181  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \
   182  		--v=0 $(GEN_OUTPUT_BASE) \
   183  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   184  
   185  .PHONY: generate
   186  generate: ## Generate code
   187  	$(MAKE) generate-go
   188  	$(MAKE) $(CRD_DOCS)
   189  
   190  $(CRD_DOCS_DIR)/%: $(API_FILES)
   191  	$(MAKE) -C docs/book src/crd/$*
   192  
   193  .PHONY: generate-go ## Generate all Go api files
   194  generate-go: $(MOCKGEN)
   195  	$(MAKE) generate-go-apis
   196  	go generate ./...
   197  
   198  .PHONY: generate-go-apis
   199  generate-go-apis: ## Alias for .build/generate-go-apis
   200  	$(MAKE) .build/generate-go-apis
   201  
   202  .build: ## Create the .build folder
   203  	mkdir -p .build
   204  
   205  .build/generate-go-apis: .build $(API_FILES) $(CONTROLLER_GEN) $(DEFAULTER_GEN) $(CONVERSION_GEN) ## Generate all Go api files
   206  	$(CONTROLLER_GEN) \
   207  		paths=./api/... \
   208  		paths=./$(EXP_DIR)/api/... \
   209  		paths=./bootstrap/eks/api/... \
   210  		paths=./controlplane/eks/api/... \
   211  		paths=./iam/api/... \
   212  		output:crd:dir=config/crd/bases \
   213  		object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \
   214  		crd:crdVersions=v1 \
   215  		rbac:roleName=manager-role \
   216  		webhook
   217  
   218  	$(CONTROLLER_GEN) \
   219  		paths=./cmd/... \
   220  		object:headerFile=./hack/boilerplate/boilerplate.generatego.txt
   221  
   222  	$(MAKE) defaulters
   223  
   224  	$(CONVERSION_GEN) \
   225  		--input-dirs=./api/v1alpha3 \
   226  		--input-dirs=./api/v1alpha4 \
   227  		--input-dirs=./cmd/clusterawsadm/api/bootstrap/v1alpha1 \
   228  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \
   229  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \
   230  		--build-tag=ignore_autogenerated_conversions \
   231  		--output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \
   232  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   233  
   234  	$(CONVERSION_GEN) \
   235  		--input-dirs=./bootstrap/eks/api/v1alpha3 \
   236  		--input-dirs=./bootstrap/eks/api/v1alpha4 \
   237  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \
   238  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \
   239  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \
   240  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \
   241  		--build-tag=ignore_autogenerated_conversions \
   242  		--output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \
   243  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   244  
   245  	$(CONVERSION_GEN) \
   246  		--input-dirs=./controlplane/eks/api/v1alpha3 \
   247  		--input-dirs=./controlplane/eks/api/v1alpha4 \
   248  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \
   249  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \
   250  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \
   251  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \
   252  		--build-tag=ignore_autogenerated_conversions \
   253  		--output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \
   254  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   255  
   256  	$(CONVERSION_GEN) \
   257  		--input-dirs=./$(EXP_DIR)/api/v1alpha3 \
   258  		--input-dirs=./$(EXP_DIR)/api/v1alpha4 \
   259  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \
   260  		--extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \
   261  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \
   262  		--extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \
   263  		--build-tag=ignore_autogenerated_conversions \
   264  		--output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \
   265  		--go-header-file=./hack/boilerplate/boilerplate.generatego.txt
   266  
   267  		touch $@
   268  
   269  ##@ lint and verify:
   270  
   271  .PHONY: modules
   272  
   273  .PHONY: lint
   274  lint: $(GOLANGCI_LINT) ## Lint codebase
   275  	$(GOLANGCI_LINT) run -v --fast=false $(GOLANGCI_LINT_EXTRA_ARGS)
   276  
   277  .PHONY: lint-fix
   278  lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported by the linter
   279  	GOLANGCI_LINT_EXTRA_ARGS=--fix $(MAKE) lint
   280  
   281  modules: ## Runs go mod to ensure proper vendoring.
   282  	go mod tidy
   283  	cd $(TOOLS_DIR); go mod tidy
   284  
   285  .PHONY: verify ## Verify ties together the rest of the verification targets into one target
   286  verify: verify-boilerplate verify-modules verify-gen verify-conversions verify-shellcheck verify-book-links release-manifests
   287  
   288  .PHONY: verify-boilerplate
   289  verify-boilerplate: ## Verify boilerplate
   290  	-rm -f ./hack/tools/bin/*.sh
   291  	./hack/verify-boilerplate.sh
   292  
   293  .PHONY: verify-modules
   294  verify-modules: modules ## Verify go modules integrity
   295  	@if !(git diff --quiet HEAD -- go.sum go.mod hack/tools/go.mod hack/tools/go.sum); then \
   296  		git diff; \
   297  		echo "go module files are out of date"; exit 1; \
   298  	fi
   299  
   300  .PHONY: verify-conversions
   301  verify-conversions: $(CONVERSION_VERIFIER)  ## Verifies expected API conversion are in place
   302  	echo verification of api conversions initiated
   303  	$(CONVERSION_VERIFIER)
   304  
   305  .PHONY: verify-shellcheck
   306  verify-shellcheck: ## Verify shell files
   307  	./hack/verify-shellcheck.sh
   308  
   309  .PHONY: verify-book-links
   310  verify-book-links: ## Verify book links
   311  	$(MAKE) -C docs/book verify
   312  
   313  .PHONY: verify-gen
   314  verify-gen: generate ## Verify generated files
   315  	@if !(git diff --quiet HEAD); then \
   316  		git diff; \
   317  		echo "generated files are out of date, run make generate"; exit 1; \
   318  	fi
   319  
   320  .PHONY: apidiff
   321  apidiff: APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main)
   322  apidiff: $(GO_APIDIFF) ## Check for API differences
   323  	@$(call checkdiff) > /dev/null
   324  	@if ($(call checkdiff) | grep "api/"); then \
   325  		$(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible; \
   326  	else
   327  		@echo "No changes to 'api/'. Nothing to do."
   328  	fi
   329  
   330  define checkdiff
   331  	git --no-pager diff --name-only FETCH_HEAD
   332  endef
   333  
   334  ##@ build:
   335  
   336  .PHONY: binaries
   337  binaries: managers clusterawsadm ## Builds and installs all binaries
   338  
   339  .PHONY: clusterawsadm
   340  clusterawsadm: ## Build clusterawsadm binary
   341  	go build -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/clusterawsadm ./cmd/clusterawsadm
   342  
   343  
   344  .PHONY: docker-build
   345  docker-build: docker-pull-prerequisites ## Build the docker image for controller-manager
   346  	docker build --build-arg ARCH=$(ARCH) --build-arg LDFLAGS="$(LDFLAGS)" . -t $(CORE_CONTROLLER_IMG)-$(ARCH):$(TAG)
   347  
   348  .PHONY: docker-build-all ## Build all the architecture docker images
   349  docker-build-all: $(addprefix docker-build-,$(ALL_ARCH))
   350  
   351  docker-build-%: ## Build docker images for a given ARCH
   352  	$(MAKE) ARCH=$* docker-build
   353  
   354  .PHONY: docker-pull-prerequisites
   355  docker-pull-prerequisites: ## Build prerequisites using docker
   356  	docker pull docker.io/docker/dockerfile:1.1-experimental
   357  	docker pull gcr.io/distroless/static:latest
   358  
   359  .PHONY: managers
   360  managers: ## Alias for manager-aws-infrastructure
   361  	$(MAKE) manager-aws-infrastructure
   362  
   363  .PHONY: manager-aws-infrastructure
   364  manager-aws-infrastructure: ## Build manager binary
   365  	CGO_ENABLED=0 GOOS=linux GOARCH=${ARCH} go build -ldflags "${LDFLAGS} -extldflags '-static'" -o $(BIN_DIR)/manager .
   366  
   367  ##@ test:
   368  
   369  $(ARTIFACTS):
   370  	mkdir -p $@
   371  
   372  .PHONY: generate-test-flavors
   373  generate-test-flavors: $(KUSTOMIZE)  ## Generate test template flavors
   374  	./hack/gen-test-flavors.sh
   375  
   376  .PHONY: e2e-image
   377  e2e-image: docker-pull-prerequisites $(TOOLS_BIN_DIR)/start.sh $(TOOLS_BIN_DIR)/restart.sh ## Build an e2e test image
   378  	docker build -f Dockerfile --tag="gcr.io/k8s-staging-cluster-api/capa-manager:e2e" .
   379  
   380  .PHONY: install-setup-envtest
   381  install-setup-envtest: # Install setup-envtest so that setup-envtest's eval is executed after the tool has been installed.
   382  	GOBIN=$(abspath $(TOOLS_BIN_DIR)) $(GO_INSTALL) $(SETUP_ENVTEST_PKG) $(SETUP_ENVTEST_BIN) $(SETUP_ENVTEST_VER)
   383  
   384  .PHONY: setup-envtest
   385  setup-envtest: install-setup-envtest # Build setup-envtest from tools folder.
   386  	@if [ $(shell go env GOOS) == "darwin" ]; then \
   387  		$(eval KUBEBUILDER_ASSETS := $(shell $(SETUP_ENVTEST) use --use-env -p path --arch amd64 $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION))) \
   388  		echo "kube-builder assets set using darwin OS"; \
   389  	else \
   390  		$(eval KUBEBUILDER_ASSETS := $(shell $(SETUP_ENVTEST) use --use-env -p path $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION))) \
   391  		echo "kube-builder assets set using other OS"; \
   392  	fi
   393  
   394  .PHONY: test
   395  test: setup-envtest ## Run tests
   396  	KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./...
   397  
   398  .PHONY: test-verbose
   399  test-verbose: setup-envtest ## Run tests with verbose settings.
   400  	KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -v ./...
   401  
   402  .PHONY: test-e2e ## Run e2e tests using clusterctl
   403  test-e2e: $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) generate-test-flavors e2e-image ## Run e2e tests
   404  	time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) -p ./test/e2e/suites/unmanaged/... -- -config-path="$(E2E_CONF_PATH)" $(E2E_ARGS)
   405  
   406  .PHONY: test-e2e-eks ## Run EKS e2e tests using clusterctl
   407  test-e2e-eks: generate-test-flavors  $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests
   408  	time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) ./test/e2e/suites/managed/... -- -config-path="$(E2E_EKS_CONF_PATH)" --source-template="$(EKS_SOURCE_TEMPLATE)" $(E2E_ARGS) $(EKS_E2E_ARGS)
   409  
   410  .PHONY: test-e2e-gc ## Run garbage collection e2e tests using clusterctl
   411  test-e2e-gc: generate-test-flavors  $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests
   412  	time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) -p ./test/e2e/suites/gc_unmanaged/... -- -config-path="$(E2E_CONF_PATH)" $(E2E_ARGS)
   413  
   414  .PHONY: test-e2e-eks-gc ## Run EKS garbage collection e2e tests using clusterctl
   415  test-e2e-eks-gc: generate-test-flavors  $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests
   416  	time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) ./test/e2e/suites/gc_managed/... -- -config-path="$(E2E_EKS_CONF_PATH)" --source-template="$(EKS_SOURCE_TEMPLATE)" $(E2E_ARGS) $(EKS_E2E_ARGS)
   417  
   418  
   419  CONFORMANCE_E2E_ARGS ?= -kubetest.config-file=$(KUBETEST_CONF_PATH)
   420  CONFORMANCE_E2E_ARGS += $(E2E_ARGS)
   421  CONFORMANCE_GINKGO_ARGS += $(GINKGO_ARGS)
   422  .PHONY: test-conformance
   423  test-conformance: generate-test-flavors $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run clusterctl based conformance test on workload cluster (requires Docker).
   424  	time $(GINKGO) -tags=e2e -focus="conformance" $(CONFORMANCE_GINKGO_ARGS) ./test/e2e/suites/conformance/... -- -config-path="$(E2E_CONF_PATH)" $(CONFORMANCE_E2E_ARGS)
   425  
   426  .PHONY: test-cover
   427  test-cover: setup-envtest ## Run tests with code coverage and code generate  reports
   428  	KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -coverprofile=coverage.out ./... $(TEST_ARGS)
   429  	go tool cover -func=coverage.out -o coverage.txt
   430  	go tool cover -html=coverage.out -o coverage.html
   431  
   432  .PHONY: serve-book
   433  serve-book: ## Run a server with the documentation book
   434  	$(MAKE) -C docs/book serve
   435  
   436  .PHONY: compile-e2e
   437  compile-e2e: ## Test e2e compilation
   438  	go test -c -o /dev/null -tags=e2e ./test/e2e/suites/unmanaged
   439  	go test -c -o /dev/null -tags=e2e ./test/e2e/suites/conformance
   440  	go test -c -o /dev/null -tags=e2e ./test/e2e/suites/managed
   441  	go test -c -o /dev/null -tags=e2e ./test/e2e/suites/gc_managed
   442  	go test -c -o /dev/null -tags=e2e ./test/e2e/suites/gc_unmanaged
   443  
   444  
   445  .PHONY: docker-pull-e2e-preloads
   446  docker-pull-e2e-preloads: ## Preloads the docker images used for e2e testing and can speed it up
   447  	-docker pull registry.k8s.io/cluster-api/kubeadm-control-plane-controller:$(CAPI_VERSION)
   448  	-docker pull registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:$(CAPI_VERSION)
   449  	-docker pull registry.k8s.io/cluster-api/cluster-api-controller:$(CAPI_VERSION)
   450  	-docker pull quay.io/jetstack/cert-manager-controller:$(CERT_MANAGER_VERSION)
   451  	-docker pull quay.io/jetstack/cert-manager-cainjector:$(CERT_MANAGER_VERSION)
   452  	-docker pull quay.io/jetstack/cert-manager-webhook:$(CERT_MANAGER_VERSION)
   453  
   454  ##@ release:
   455  
   456  $(RELEASE_DIR):
   457  	mkdir -p $@
   458  
   459  .PHONY: build-toolchain
   460  build-toolchain: ## Build the toolchain
   461  	docker build --target toolchain -t $(TOOLCHAIN_IMAGE) .
   462  
   463  .PHONY: check-github-token
   464  check-github-token: ## Check if the github token is set
   465  	@if [ -z "${GITHUB_TOKEN}" ]; then echo "GITHUB_TOKEN is not set"; exit 1; fi
   466  
   467  .PHONY: check-previous-release-tag
   468  check-previous-release-tag: ## Check if the previous release tag is set
   469  	@if [ -z "${PREVIOUS_VERSION}" ]; then echo "PREVIOUS_VERSION is not set"; exit 1; fi
   470  
   471  .PHONY: check-release-tag
   472  check-release-tag: ## Check if the release tag is set
   473  	@if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi
   474  	@if ! [ -z "$$(git status --porcelain)" ]; then echo "Your local git repository contains uncommitted changes, use git clean before proceeding."; exit 1; fi
   475  
   476  .PHONY: create-gh-release
   477  create-gh-release:$(GH) ## Create release on Github
   478  	$(GH) release create $(VERSION) -d -F $(RELEASE_DIR)/CHANGELOG.md -t $(VERSION) -R $(GH_REPO)
   479  
   480  .PHONY: compiled-manifest
   481  compiled-manifest: $(RELEASE_DIR) $(KUSTOMIZE) ## Compile the manifest files
   482  	$(MAKE) image-patch-source-manifest
   483  	$(MAKE) image-patch-pull-policy
   484  	$(MAKE) image-patch-kustomization
   485  	$(KUSTOMIZE) build $(IMAGE_PATCH_DIR)/$(PROVIDER) > $(RELEASE_DIR)/$(PROVIDER).yaml
   486  
   487  .PHONY: docker-push
   488  docker-push: ## Push the docker image
   489  	docker push $(CORE_CONTROLLER_IMG)-$(ARCH):$(TAG)
   490  
   491  .PHONY: docker-push-all ## Push all the architecture docker images
   492  docker-push-all: $(addprefix docker-push-,$(ALL_ARCH))
   493  	$(MAKE) docker-push-core-manifest
   494  
   495  docker-push-%: ## Docker push
   496  	$(MAKE) ARCH=$* docker-push
   497  
   498  .PHONY: docker-push-core-manifest
   499  docker-push-core-manifest: ## Push the fat manifest docker image.
   500  	## Minimum docker version 18.06.0 is required for creating and pushing manifest images.
   501  	$(MAKE) docker-push-manifest CONTROLLER_IMG=$(CORE_CONTROLLER_IMG) MANIFEST_FILE=$(CORE_MANIFEST_FILE)
   502  
   503  .PHONY: docker-push-manifest
   504  docker-push-manifest: ## Push the manifest image
   505  	docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g")
   506  	@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done
   507  	docker manifest push --purge ${CONTROLLER_IMG}:${TAG}
   508  
   509  .PHONY: image-patch-source-manifest
   510  image-patch-source-manifest: $(IMAGE_PATCH_DIR) $(KUSTOMIZE) ## Patch the source manifest
   511  	mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER)
   512  	$(KUSTOMIZE) build $(PROVIDER_CONFIG_DIR) > $(IMAGE_PATCH_DIR)/$(PROVIDER)/source-manifest.yaml
   513  
   514  .PHONY: image-patch-kustomization
   515  image-patch-kustomization: $(IMAGE_PATCH_DIR) ## Alias for image-patch-kustomization-without-webhook
   516  	mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER)
   517  	$(MAKE) image-patch-kustomization-without-webhook
   518  
   519  .PHONY: image-patch-kustomization-without-webhook
   520  image-patch-kustomization-without-webhook: $(IMAGE_PATCH_DIR) $(GOJQ) ## Patch the image in the kustomization file
   521  	mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER)
   522  	$(GOJQ) --yaml-input --yaml-output '.images[0]={"name":"$(OLD_IMG)","newName":"$(MANIFEST_IMG)","newTag":"$(TAG)"}|.patchesJson6902[0].target.name="$(CONTROLLER_NAME)"|.patchesJson6902[0].target.namespace="$(NAMESPACE)"' \
   523  		"hack/image-patch/kustomization.yaml" > $(IMAGE_PATCH_DIR)/$(PROVIDER)/kustomization.yaml
   524  
   525  .PHONY: image-patch-pull-policy
   526  image-patch-pull-policy: $(IMAGE_PATCH_DIR) $(GOJQ) ## Patch the pull policy
   527  	mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER)
   528  	echo Setting imagePullPolicy to $(PULL_POLICY)
   529  	$(GOJQ) --yaml-input --yaml-output '.[0].value="$(PULL_POLICY)"' "hack/image-patch/pull-policy-patch.yaml" > $(IMAGE_PATCH_DIR)/$(PROVIDER)/pull-policy-patch.yaml
   530  
   531  .PHONY: list-staging-releases
   532  list-staging-releases: ## List staging images for image promotion
   533  	@echo $(CORE_IMAGE_NAME):
   534  	$(MAKE) list-image RELEASE_TAG=$(RELEASE_TAG) IMAGE=$(CORE_IMAGE_NAME)
   535  
   536  list-image: ## List images for RELEASE_TAG
   537  	gcloud container images list-tags $(STAGING_REGISTRY)/$(IMAGE) --filter="tags=('$(RELEASE_TAG)')" --format=json
   538  
   539  .PHONY: release
   540  release: clean-release check-release-tag $(RELEASE_DIR)  ## Builds and push container images using the latest git tag for the commit.
   541  	git checkout "${RELEASE_TAG}"
   542  	$(MAKE) release-changelog
   543  	$(MAKE) release-binaries
   544  	CORE_CONTROLLER_IMG=$(PROD_REGISTRY)/$(CORE_IMAGE_NAME) $(MAKE) release-manifests
   545  	$(MAKE) release-templates
   546  	$(MAKE) release-policies
   547  
   548  release-policies: $(RELEASE_POLICIES) ## Release policies
   549  
   550  $(RELEASE_DIR)/AWSIAMManagedPolicyControllers.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS)
   551  	go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers > $@
   552  
   553  $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithEKS.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS)
   554  	go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers --config hack/eks-clusterawsadm-config.yaml > $@
   555  
   556  $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS)
   557  	go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyCloudProviderControlPlane > $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json
   558  
   559  $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS)
   560  	go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyCloudProviderNodes > $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json
   561  
   562  $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithS3.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS)
   563  	go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers --config hack/s3-clusterawsadm-config.yaml > $@
   564  
   565  .PHONY: release-manifests
   566  release-manifests: ## Release manifest files
   567  	$(MAKE) $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml TAG=$(RELEASE_TAG) PULL_POLICY=IfNotPresent
   568  	# Add metadata to the release artifacts
   569  	cp metadata.yaml $(RELEASE_DIR)/metadata.yaml
   570  
   571  .PHONY: release-changelog
   572  release-changelog: $(GH) ## Generates release notes using Github release notes.
   573  	./hack/releasechangelog.sh > $(RELEASE_DIR)/CHANGELOG.md
   574  
   575  .PHONY: release-binaries
   576  release-binaries: ## Builds the binaries to publish with a release
   577  	RELEASE_BINARY=./cmd/clusterawsadm GOOS=linux GOARCH=amd64 $(MAKE) release-binary
   578  	RELEASE_BINARY=./cmd/clusterawsadm GOOS=linux GOARCH=arm64 $(MAKE) release-binary
   579  	RELEASE_BINARY=./cmd/clusterawsadm GOOS=darwin GOARCH=amd64 $(MAKE) release-binary
   580  	RELEASE_BINARY=./cmd/clusterawsadm GOOS=darwin GOARCH=arm64 $(MAKE) release-binary
   581  
   582  .PHONY: release-binary
   583  release-binary: $(RELEASE_DIR) versions.mk build-toolchain ## Release binary
   584  	docker run \
   585  		--rm \
   586  		-e CGO_ENABLED=0 \
   587  		-e GOOS=$(GOOS) \
   588  		-e GOARCH=$(GOARCH) \
   589  		--mount=source=gocache,target=/go/pkg/mod \
   590  		--mount=source=gocache,target=/root/.cache/go-build \
   591  		-v "$$(pwd):/workspace$(DOCKER_VOL_OPTS)" \
   592  		-w /workspace \
   593  		$(TOOLCHAIN_IMAGE) \
   594  		go build -ldflags '$(LDFLAGS) -extldflags "-static"' \
   595  		-o $(RELEASE_DIR)/$(notdir $(RELEASE_BINARY))-$(GOOS)-$(GOARCH) $(RELEASE_BINARY)
   596  
   597  .PHONY: release-staging
   598  release-staging: ## Builds and push container images and manifests to the staging bucket.
   599  	$(MAKE) docker-build-all
   600  	$(MAKE) docker-push-all
   601  	$(MAKE) release-alias-tag
   602  	$(MAKE) staging-manifests
   603  	$(MAKE) upload-staging-artifacts
   604  
   605  .PHONY: release-staging-nightly
   606  release-staging-nightly: ## Tags and push container images to the staging bucket.
   607  	$(eval NEW_RELEASE_ALIAS_TAG := nightly_$(RELEASE_ALIAS_TAG)_$(shell date +'%Y%m%d'))
   608  	echo $(NEW_RELEASE_ALIAS_TAG)
   609  	$(MAKE) release-alias-tag TAG=$(RELEASE_ALIAS_TAG) RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG)
   610  	$(MAKE) staging-manifests RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG)
   611  	$(MAKE) upload-staging-artifacts RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG)
   612  
   613  .PHONY: release-alias-tag
   614  release-alias-tag: # Adds the tag to the last build tag.
   615  	gcloud container images add-tag -q $(CORE_CONTROLLER_IMG):$(TAG) $(CORE_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG)
   616  
   617  .PHONY: release-templates
   618  release-templates: $(RELEASE_DIR) ## Generate release templates
   619  	cp templates/cluster-template*.yaml $(RELEASE_DIR)/
   620  
   621  .PHONY: upload-staging-artifacts
   622  upload-staging-artifacts: ## Upload release artifacts to the staging bucket
   623  	gsutil cp $(RELEASE_DIR)/* gs://$(BUCKET)/components/$(RELEASE_ALIAS_TAG)
   624  
   625  .PHONY: upload-gh-artifacts
   626  upload-gh-artifacts: $(GH) ## Upload artifacts to Github release
   627  	$(GH) release upload $(VERSION) -R $(GH_REPO) --clobber  $(RELEASE_DIR)/*
   628  
   629  IMAGE_PATCH_DIR := $(ARTIFACTS)/image-patch
   630  
   631  $(IMAGE_PATCH_DIR): $(ARTIFACTS)
   632  	mkdir -p $@
   633  
   634  .PHONY: $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml
   635  $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml:
   636  	$(MAKE) compiled-manifest \
   637  		PROVIDER=$(CORE_MANIFEST_FILE) \
   638  		OLD_IMG=$(CORE_CONTROLLER_ORIGINAL_IMG) \
   639  		MANIFEST_IMG=$(CORE_CONTROLLER_IMG) \
   640  		CONTROLLER_NAME=$(CORE_CONTROLLER_NAME) \
   641  		PROVIDER_CONFIG_DIR=$(CORE_CONFIG_DIR) \
   642  		NAMESPACE=$(CORE_NAMESPACE) \
   643  
   644  .PHONY: staging-manifests
   645  staging-manifests: ## Staging manifests
   646  	$(MAKE) $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml PULL_POLICY=IfNotPresent TAG=$(RELEASE_ALIAS_TAG)
   647  
   648  ##@ clean:
   649  
   650  .PHONY: clean
   651  clean: ## Remove all generated files
   652  	$(MAKE) -C hack/tools clean
   653  	$(MAKE) clean-bin
   654  	$(MAKE) clean-temporary
   655  
   656  .PHONY: clean-artifacts
   657  clean-artifacts: ## Remove the _artifacts directory
   658  	rm -rf _artifacts
   659  
   660  .PHONY: clean-bin
   661  clean-bin: ## Remove all generated binaries
   662  	rm -rf bin
   663  
   664  .PHONY: clean-release
   665  clean-release: ## Remove the release folder
   666  	rm -rf $(RELEASE_DIR)
   667  
   668  .PHONY: clean-temporary
   669  clean-temporary: ## Remove all temporary files and folders
   670  	rm -f minikube.kubeconfig
   671  	rm -f kubeconfig
   672  	rm -rf _artifacts
   673  	rm -rf test/e2e/.artifacts/*
   674  	rm -rf test/e2e/*.xml
   675  	rm -rf test/e2e/capa-controller-manager
   676  	rm -rf test/e2e/capi-controller-manager
   677  	rm -rf test/e2e/capi-kubeadm-bootstrap-controller-manager
   678  	rm -rf test/e2e/capi-kubeadm-control-plane-controller-manager
   679  	rm -rf test/e2e/logs
   680  	rm -rf test/e2e/resources
   681