#!/usr/bin/env bash

# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This scripts locates all API groups by their packages and versions
# Usage: `hack/verify-api-groups.sh`.

set -o errexit
set -o nounset
set -o pipefail

KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${KUBE_ROOT}/hack/lib/init.sh"

register_files=()
while read -r file ; do
	register_files+=("${file}")
done < <(find pkg/apis -name register.go | sort)

# every register file should contain a GroupName.  Gather the different representations.
# 1. group directory name for client gen
# 2. external group versions for init.sh all APIs list
# 3. install packages for inclusion in import_known_versions files
group_dirnames=()
external_group_versions=()
expected_install_packages=()
for register_file in "${register_files[@]}"; do
	package="${register_file%"/register.go"}"
	group_dirname="${package#"pkg/apis/"}"
	group_dirname="${group_dirname%%"/*"}"
	group_name=""
	if grep -q 'GroupName = "' "${register_file}"; then
		group_name=$(grep 'GroupName = "' "${register_file}" | cut -d\" -f2 -)
	else
		echo "${register_file} is missing \"const GroupName =\""
		exit 1
	fi

	# If the dirname doesn't have a slash, then it's the internal package.
	# if does have one, then it's versioned (e.g. foobar/v1).
	if [[ "${group_dirname#*'/'}" == "${group_dirname}" ]]; then
		group_dirnames+=("${group_dirname}")
		expected_install_packages+=("k8s.io/kubernetes/${package}")
	else
		version=$(echo "${group_dirname}" | cut -d/ -f2 -)
		external_group_versions+=("${group_name}/${version}")
	fi
done


# check to make sure that client gen is getting
# groups_without_codegen is the list of group we EXPECT to not have the client generated for
# them.  This happens for types that aren't served from the API server
groups_without_codegen=(
	"abac"
	"componentconfig"
	"imagepolicy"
	"admission"
)
client_gen_file="${KUBE_ROOT}/staging/src/k8s.io/code-generator/cmd/client-gen/main.go"

for group_dirname in "${group_dirnames[@]}"; do
	if ! grep -q "${group_dirname}/" "${client_gen_file}" ; then
		found=0
		for group_without_codegen in "${groups_without_codegen[@]}"; do
			if [[ "${group_without_codegen}" == "${group_dirname}" ]]; then
				found=1
			fi
		done
		if [[ "${found}" -ne "1" && -f "${group_dirname}/types.go" ]] ; then
			echo "need to add ${group_dirname}/ to ${client_gen_file}"
			exit 1
		fi
	fi
done

# import_known_versions checks to be sure we'll get installed
# groups_without_codegen is the list of group we EXPECT to not have the client generated for
# them.  This happens for types that aren't served from the API server
packages_without_install=(
	"k8s.io/kubernetes/pkg/apis/abac"
	"k8s.io/kubernetes/pkg/apis/admission"
	"k8s.io/kubernetes/pkg/apis/apidiscovery"
	"k8s.io/kubernetes/pkg/apis/componentconfig" # TODO: Remove this package completely and from this list
)
known_version_files=(
	"pkg/controlplane/import_known_versions.go"
)
for expected_install_package in "${expected_install_packages[@]}"; do
	found=0
	for package_without_install in "${packages_without_install[@]}"; do
		if [ "${package_without_install}" == "${expected_install_package}" ]; then
			found=1
		fi
	done
	if [[ "${found}" -eq "1" ]] ; then
		continue
	fi

	for known_version_file in "${known_version_files[@]}"; do
		if ! grep -q "${expected_install_package}/install" "${known_version_file}" ; then
			echo "missing ${expected_install_package}/install from ${known_version_file}"
			exit 1
		fi
	done
done

# check all groupversions to make sure they're in the init.sh file.  This isn't perfect, but its slightly
# better than nothing
for external_group_version in "${external_group_versions[@]}"; do
	if ! grep -q "${external_group_version}" "${KUBE_ROOT}/hack/lib/init.sh" ; then
		echo "missing ${external_group_version} from hack/lib/init.sh:/KUBE_AVAILABLE_GROUP_VERSIONS or hack/init.sh:/KUBE_NONSERVER_GROUP_VERSIONS"
		exit 1
	fi
done
