#
# Copyright 2022 Google LLC
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# version 2 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#

EAPI=7

inherit systemd toolchain-funcs

DESCRIPTION="Kubernetes package for node"
HOMEPAGE="https://k8s.io"
SRC_URI="https://github.com/kubernetes/kubernetes/archive/v${PV}.tar.gz -> ${P}.tar.gz"

# Including BSD here forces the license tools to scan the source for licenses.
# The k8s source includes all third-party licenses in the LICENSES directory, so
# the source scan catches everything. K8s itself is Apache-2.0 licensed.
# K8s has a ton of vendored third-party dependencies; making this ebuild value
# accurate isn't worth it given that the source gets scanned for licenses, and
# those licenses are included in about_os_credits.html.
LICENSE="
	Apache-2.0
	BSD
"
SLOT="0"
KEYWORDS="*"
IUSE="platform_gcp kubeadm"

BDEPEND="
	dev-lang/go
"

RDEPEND="
	app-arch/gzip
	>=net-misc/socat-1.7.3.0
	app-admin/logrotate
"

src_prepare() {
	default
	export BUILD_GO="$(tc-getBUILD_GO)"
	go() {
		echo "${BUILD_GO} $*" 1>&2
		"${BUILD_GO}" "$@"
	}
	export -f go
	emake -j1 \
		KUBE_VERBOSE=3 \
		generated_files
	unset -f go
	unset BUILD_GO
}

src_configure() {
	PROGRAMS=(
		"kubelet"
		"kubectl"
		$(usex kubeadm kubeadm "")
	)
}

src_compile() {
	export GO="$(tc-getGO)"
	go() {
		echo "${GO} $*" 1>&2
		"${GO}" "$@"
	}
	export -f go
	# On arm64, cgo insists on using the gold linker
	# (https://github.com/golang/go/blob/38607c553878da21b5042e63997ecb3b7201e684/src/cmd/link/internal/ld/lib.go#L1478).
	# We don't have an arm64 gold linker. Use lld instead.
	#
	# A side effect of setting GOLDFLAGS is that debug symbols are included in
	# the result executable. Installation strips those and includes them in
	# /usr/lib/debug.
	emake -j1 \
		KUBE_VERBOSE=3 \
		GOLDFLAGS=-extldflags=-fuse-ld=lld \
		KUBE_BUILD_PLATFORMS="linux/${ARCH}" \
		KUBE_CGO_OVERRIDES="${PROGRAMS[*]}" \
		"KUBE_LINUX_${ARCH^^}_CC=${CC}" \
		"${PROGRAMS[@]}"
	unset -f go
	unset GO
}

src_install() {
	for prog in "${PROGRAMS[@]}"; do
		if [[ "${prog}" == "" ]]; then
			continue
		fi
		dobin "_output/local/bin/linux/${ARCH}/${prog}"
	done

	systemd_dounit "${FILESDIR}"/kubelet.service
	insinto /etc/default
	if use platform_gcp; then
		newins "${FILESDIR}"/default-gcp kubelet
	else
		newins "${FILESDIR}"/default kubelet
	fi
}
