BASE_DIRECTORY:=$(shell git rev-parse --show-toplevel)
GIT_TAG:=$(shell cat GIT_TAG)
GOLANG_VERSION:=$(shell cat GOLANG_VERSION)
REPO=kind
REPO_OWNER=kubernetes-sigs

BINARY_TARGET_FILES=kind kindnetd
SOURCE_PATTERNS=. ./cmd/kindnetd
GO_MOD_PATHS=. ./images/kindnetd

# force binariess to go to non-release branch bin folder
BINARIES_ARE_RELEASE_BRANCHED=false

# do not look for checksums in release branch folder, instead use project root
PROJECT_ROOT=$(MAKE_ROOT)

MINIMAL_BASE_IPTABLES_IMAGE_NAME?=eks-distro-minimal-base-iptables
MINIMAL_BASE_HAPROXY_IMAGE_NAME?=eks-distro-minimal-base-haproxy
MINIMAL_BASE_KIND_IMAGE_NAME?=eks-distro-minimal-base-kind
MINIMAL_BASE_KIND_IMAGE_NAME_OS_VERSION=al2023

KIND_BASE_IMAGE_COMPONENT=kubernetes-sigs/kind/base
KIND_BASE_VERSIONED_IMAGE_COMPONENT=kubernetes-sigs/kind/base
KIND_NODE_IMAGE_COMPONENT=kubernetes-sigs/kind/node
KINDNETD_IMAGE_COMPONENT=kubernetes-sigs/kind/kindnetd
HAPROXY_IMAGE_COMPONENT=kubernetes-sigs/kind/haproxy

KIND_BASE_IMAGE_BUILD_ARGS=$(OUTPUT_DIR)/$(RELEASE_BRANCH)/kind-base-image-build-args
KIND_BASE_KUBEADM_OVERRIDE=$(OUTPUT_DIR)/$(RELEASE_BRANCH)/images/base/files/usr/local/bin/kubeadm
KIND_NODE_IMAGE_BUILD_ARGS=$(OUTPUT_DIR)/$(RELEASE_BRANCH)/kind-node-image-build-args
EKSD_KUBE_VERSION=

# Overriding since kind is released branch it will try to add git_tag to latest tag
LATEST_TAG=$(LATEST)

UNVERSIONED_BASE_IMAGE=$(IMAGE_REPO)/$(KIND_BASE_IMAGE_COMPONENT):$(GIT_TAG)-$(GIT_HASH)
VERSIONED_BASE_IMAGE=$(IMAGE_REPO)/$(KIND_BASE_IMAGE_COMPONENT):$(EKSD_KUBE_VERSION)-$(GIT_TAG)-$(GIT_HASH)

HAS_S3_ARTIFACTS?=true
HAS_RELEASE_BRANCHES=true

PROJECT_DEPENDENCIES=eksd/kubernetes/client eksa/kubernetes-sigs/etcdadm eksd/cni-plugins eksa/kubernetes-sigs/cri-tools eksd/etcd/etcd.tar.gz eksa/rancher/local-path-provisioner
ORGANIZE_BINARIES_AMD64_TARGET=$(BINARY_DEPS_DIR)/linux-amd64/files/rootfs/LICENSES
ORGANIZE_BINARIES_ARM64_TARGET=$(BINARY_DEPS_DIR)/linux-arm64/files/rootfs/LICENSES
ARM_ENV_CONF_TARGET=$(BINARY_DEPS_DIR)/linux-arm64/files/rootfs/etc
KIND_NODE_BUILD_AMD64_TARGET=$(BINARY_DEPS_DIR)/linux-amd64/files/io.containerd.metadata.v1.bolt/meta.db
KIND_NODE_BUILD_ARM64_TARGET=$(BINARY_DEPS_DIR)/linux-arm64/files/io.containerd.metadata.v1.bolt/meta.db

HAPROXY_CFG=$(OUTPUT_DIR)/files/haproxy/usr/local/etc/haproxy/haproxy.cfg

IMAGE_NAMES?=haproxy kindnetd kind-base 

FIX_LICENSES_KINDNETD_TARGET=$(REPO)/images/kindnetd/LICENSE

BUILDSPECS=buildspecs/binaries.yml buildspecs/images.yml
BUILDSPEC_1_PLATFORM=ARM_CONTAINER
BUILDSPEC_1_DEPENDS_ON_OVERRIDE=none
BUILDSPEC_2_PLATFORM=LINUX_CONTAINER
BUILDSPEC_2_COMPUTE_TYPE=BUILD_GENERAL1_LARGE
BUILDSPEC_2_VARS_KEYS=RELEASE_BRANCH
BUILDSPEC_2_VARS_VALUES=SUPPORTED_K8S_VERSIONS



include $(BASE_DIRECTORY)/Common.mk

# Do not need to import if running clean or any var-value-% targets
ifneq ($(and $(RELEASE_BRANCH),$(filter-out clean,$(MAKECMDGOALS_WITHOUT_VAR_VALUE))),)
-include $(KIND_BASE_IMAGE_BUILD_ARGS)
-include $(KIND_NODE_IMAGE_BUILD_ARGS)
endif

$(GATHER_LICENSES_TARGETS): | $(FIX_LICENSES_KINDNETD_TARGET)

# During build the node image is never built so we can extract this file
# instead fake it to keep s3-artifacts happy
s3-artifacts: $(ARTIFACTS_PATH)/manifests/kindnetd/$(GIT_TAG)/kindnetd.yaml

images: kind-base-versioned/images/push kind-node/images/push
create-ecr-repos: kind-node/create-ecr-repo

$(OUTPUT_BIN_DIR)/%/kind: EXTRA_GO_LDFLAGS=-X=sigs.k8s.io/kind/pkg/cmd/kind/version.gitCommit=$(shell git -C $(REPO) rev-list -n 1  "${GIT_TAG}")

# haproxy
haproxy/images/%: DOCKERFILE_FOLDER=./images/haproxy
haproxy/images/%: BASE_IMAGE_NAME=$(MINIMAL_BASE_HAPROXY_IMAGE_NAME)
$(call IMAGE_TARGETS_FOR_NAME, haproxy): $(HAPROXY_CFG)

$(HAPROXY_CFG): $(GIT_PATCH_TARGET)
	@mkdir -p $(@D)
	cp $(REPO)/images/haproxy/haproxy.cfg $@

# Kindnetd
kindnetd/images/%: DOCKERFILE_FOLDER=./images/kindnetd
kindnetd/images/%: BASE_IMAGE_NAME=$(MINIMAL_BASE_IPTABLES_IMAGE_NAME)

# Kind-base
kind-base/images/% kind-base-versioned/images/%: DOCKERFILE_FOLDER=$(REPO)/images/base
kind-base/images/% kind-base-versioned/images/%: BASE_IMAGE_NAME=$(MINIMAL_BASE_KIND_IMAGE_NAME)
kind-base/images/% kind-base-versioned/images/%: BASE_IMAGE_OS_VERSION=$(MINIMAL_BASE_KIND_IMAGE_NAME_OS_VERSION)
kind-base/images/% kind-base-versioned/images/%: IMAGE_BUILD_ARGS=CNI_PLUGINS_AMD64_URL CNI_PLUGINS_ARM64_URL CNI_PLUGINS_AMD64_SHA256SUM \
	CNI_PLUGINS_ARM64_SHA256SUM CRICTL_AMD64_SHA256SUM_URL CRICTL_ARM64_SHA256SUM_URL CRICTL_AMD64_URL CRICTL_ARM64_URL

kind-base/images/%: IMAGE_TARGET=base
kind-base/images/%: IMAGE_CONTEXT_DIR=$(REPO)/images/base
$(call IMAGE_TARGETS_FOR_NAME, kind-base): $(KIND_BASE_IMAGE_BUILD_ARGS)

kind-base-versioned/images/%: IMAGE_TARGET=base-versioned
kind-base-versioned/images/%: IMAGE_TAG:=$(EKSD_KUBE_VERSION)-$(IMAGE_TAG)
kind-base-versioned/images/%: LATEST_TAG:=$(EKSD_KUBE_VERSION)-$(LATEST_TAG)
kind-base-versioned/images/%: IMAGE_CONTEXT_DIR=$(OUTPUT_DIR)/$(RELEASE_BRANCH)/images/base
kind-base-versioned/images/%: BUILDER_IMAGE=$(UNVERSIONED_BASE_IMAGE)
$(call IMAGE_TARGETS_FOR_NAME, kind-base-versioned): $(KIND_BASE_KUBEADM_OVERRIDE)

# Kind-node
kind-node/images/push: DOCKERFILE_FOLDER=./images/node
kind-node/images/push: IMAGE_CONTEXT_DIR=$(BINARY_DEPS_DIR)
kind-node/images/push: BASE_IMAGE=$(VERSIONED_BASE_IMAGE)
# We are fully overriding the base_image above, setting the name is to ensure the builder image is set correctly
kind-node/images/push: BASE_IMAGE_NAME=$(MINIMAL_BASE_KIND_IMAGE_NAME)
kind-node/images/push: BASE_IMAGE_OS_VERSION=$(MINIMAL_BASE_KIND_IMAGE_NAME_OS_VERSION)
kind-node/images/push: IMAGE_TAG=$(NODE_IMAGE_TAG)
kind-node/images/push: LATEST_TAG=$(NODE_IMAGE_LATEST_TAG)
kind-node/images/push: IMAGE_TARGET=node
kind-node/images/push: $(KIND_NODE_BUILD_AMD64_TARGET) $(KIND_NODE_BUILD_ARM64_TARGET) $(ARM_ENV_CONF_TARGET)

$(KIND_BASE_IMAGE_BUILD_ARGS):
	@echo -e $(call TARGET_START_LOG)
	build/base-image-build-args.sh $(RELEASE_BRANCH) $(ARTIFACTS_BUCKET) $@ $(LATEST)
	@echo -e $(call TARGET_END_LOG)

$(KIND_NODE_IMAGE_BUILD_ARGS):
	@echo -e $(call TARGET_START_LOG)
	build/node-image-build-args.sh $(RELEASE_BRANCH) $(KINDNETD_IMAGE_COMPONENT) $(IMAGE_REPO) "$(ARTIFACTS_BUCKET)" $(IMAGE_TAG) $(LATEST) $@
	@echo -e $(call TARGET_END_LOG)

# Tweak the kind/base image to have a hardcode kubeadm config
# so that during the image pull phase it pulls eks-d images
# vs upstream images
# kubeadm-override and config are copied into kind/images/base/files/etc
# so they are automatically added into the image by the dockerfile
$(KIND_BASE_KUBEADM_OVERRIDE): KUBEADM_CONFIG_DIR=$(OUTPUT_DIR)/$(RELEASE_BRANCH)/images/base/files/etc
$(KIND_BASE_KUBEADM_OVERRIDE):
	@mkdir -p $(@D)
	@mkdir -p $(KUBEADM_CONFIG_DIR)
	set -a && source $(KIND_BASE_IMAGE_BUILD_ARGS) && envsubst '$$COREDNS_VERSION:$$ETCD_VERSION:$$EKSD_KUBE_VERSION:$$EKSD_IMAGE_REPO' \
		< ./images/base/kubeadm.config.tmpl \
		> $(KUBEADM_CONFIG_DIR)/kubeadm.config
	cp ./images/base/kubeadm-override.sh $@

# kind build node-image process, also extracts kindnetd manifest to push to s3
# kind cli built for current host is needed to create the node image
$(KIND_NODE_BUILD_AMD64_TARGET): KIND_CLI=./$(OUTPUT_BIN_DIR)/$(subst /,-,$(BUILDER_PLATFORM))/kind
$(KIND_NODE_BUILD_AMD64_TARGET): $(KIND_NODE_IMAGE_BUILD_ARGS) $(ORGANIZE_BINARIES_AMD64_TARGET)
	$(MAKE) $(KIND_CLI) BINARY_PLATFORMS=$(BUILDER_PLATFORM)
	build/build-kind-node-image.sh $(RELEASE_BRANCH) $(VERSIONED_BASE_IMAGE) amd64

$(KIND_NODE_BUILD_ARM64_TARGET): $(KIND_NODE_IMAGE_BUILD_ARGS) $(ORGANIZE_BINARIES_ARM64_TARGET)
	build/build-kind-node-image.sh $(RELEASE_BRANCH) $(VERSIONED_BASE_IMAGE) arm64

$(ORGANIZE_BINARIES_AMD64_TARGET): $(HANDLE_DEPENDENCIES_TARGET)
	build/organize_binaries.sh $(RELEASE_BRANCH) amd64

$(ORGANIZE_BINARIES_ARM64_TARGET): $(HANDLE_DEPENDENCIES_TARGET)
	build/organize_binaries.sh $(RELEASE_BRANCH) arm64

$(ARM_ENV_CONF_TARGET):
	@cp -rf images/node/files/* $(BINARY_DEPS_DIR)/linux-arm64/files/rootfs/

$(ARTIFACTS_PATH)/manifests/kindnetd/$(GIT_TAG)/kindnetd.yaml:
	@mkdir -p $(@D)
	cp manifests/kindnetd.yaml $(ARTIFACTS_PATH)/manifests/kindnetd/$(GIT_TAG)/kindnetd.yaml
	sed -i -e 's/{{ .PodSubnet }}/192.168.0.0\/16/' $(ARTIFACTS_PATH)/manifests/kindnetd/$(GIT_TAG)/kindnetd.yaml 

$(FIX_LICENSES_KINDNETD_TARGET): | $(GO_MOD_DOWNLOAD_TARGETS)
#go-licenses requires a LICENSE file in each folder with the go.mod
	cp $(REPO)/LICENSE $@

.PHONY: create-kind-cluster-%
create-kind-cluster-%:
	build/create-kind-cluster.sh $(IMAGE_REPO)/$(KIND_NODE_IMAGE_COMPONENT):$(NODE_IMAGE_LATEST_TAG) $* $(RELEASE_BRANCH)

create-kind-cluster-amd64: # Create local kind cluster using built amd64 image
create-kind-cluster-arm64: # Create local kind cluster using built arm64 image


########### DO NOT EDIT #############################
# To update call: make add-generated-help-block
# This is added to help document dynamic targets and support shell autocompletion
# Run make help for a formatted help block with all targets
include Help.mk
########### END GENERATED ###########################