1#!/usr/bin/env bash
2
3# Copyright 2017 The Kubernetes Authors.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17set -o errexit
18set -o nounset
19set -o pipefail
20
21
22if LANG=C sed --help 2>&1 | grep -q GNU; then
23  SED="sed"
24elif which gsed &>/dev/null; then
25  SED="gsed"
26else
27  echo "Failed to find GNU sed as sed or gsed. If you are on Mac: brew install gnu-sed." >&2
28  exit 1
29fi
30
31dir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename 0).XXXXXXXXXXXX")
32# Register function to be called on EXIT to remove generated binary.
33function cleanup {
34  rm -rf "${dir}"
35}
36trap cleanup EXIT
37
38
39scriptDir=$(dirname "${BASH_SOURCE[0]}")
40
41# this uses discovery from a kube-like API server to register ALL the API versions that server provides
42# first argument is reference to kube-config file that points the API server you're adding from
43# second argument is the service namespace
44# third argument is the service name
45# fourth argument is reference to kube-config file that points to the aggregator you're using
46
47FROM_KUBECONFIG=${1}
48SERVICE_NAMESPACE=${2}
49SERVICE_NAME=${3}
50AGG_KUBECONFIG=${4}
51
52
53caBundle=$(base64 /var/run/kubernetes/server-ca.crt | awk 'BEGIN{ORS="";} {print}')
54
55# if we have a /api endpoint, then we need to register that
56if kubectl --kubeconfig="${FROM_KUBECONFIG}" get --raw / | grep -q /api/v1; then
57	group=""
58	version="v1"
59	resourceName=${version}.${group}
60	resourceFileName="${dir}/${resourceName}.yaml"
61	cp "${scriptDir}/apiservice-template.yaml" "${resourceFileName}"
62	${SED} -i "s/RESOURCE_NAME/${resourceName}/" "${resourceFileName}"
63	${SED} -i "s/API_GROUP/${group}/" "${resourceFileName}"
64	${SED} -i "s/API_VERSION/${version}/" "${resourceFileName}"
65	${SED} -i "s/SERVICE_NAMESPACE/${SERVICE_NAMESPACE}/" "${resourceFileName}"
66	${SED} -i "s/SERVICE_NAME/${SERVICE_NAME}/" "${resourceFileName}"
67	${SED} -i "s/CA_BUNDLE/${caBundle}/" "${resourceFileName}"
68	echo "registering ${resourceName} using ${resourceFileName}"
69
70	kubectl --kubeconfig="${AGG_KUBECONFIG}" create -f "${resourceFileName}"
71fi
72
73while IFS=$'\n' read -r groupVersion;
74  do groupVersions+=("$groupVersion");
75done < <(kubectl get --raw / | grep /apis/ | sed 's/",.*//' | sed 's|.*"/apis/||' | grep '/')
76
77for groupVersion in "${groupVersions[@]}"; do
78	group=$(echo "$groupVersion" | awk -F/ '{print $1}')
79	version=$(echo "$groupVersion" | awk -F/ '{print $2}')
80	resourceName=${version}.${group}
81	resourceFileName=${dir}/${resourceName}.yaml
82	cp "${scriptDir}/apiservice-template.yaml" "${resourceFileName}"
83	${SED} -i "s/RESOURCE_NAME/${resourceName}/" "${resourceFileName}"
84	${SED} -i "s/API_GROUP/${group}/" "${resourceFileName}"
85	${SED} -i "s/API_VERSION/${version}/" "${resourceFileName}"
86	${SED} -i "s/SERVICE_NAMESPACE/${SERVICE_NAMESPACE}/" "${resourceFileName}"
87	${SED} -i "s/SERVICE_NAME/${SERVICE_NAME}/" "${resourceFileName}"
88	${SED} -i "s/CA_BUNDLE/${caBundle}/" "${resourceFileName}"
89	echo "registering ${resourceName} using ${resourceFileName}"
90
91	kubectl --kubeconfig="${AGG_KUBECONFIG}" create -f "${resourceFileName}"
92done
93