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