diff --git a/charts/gardener-extension-shoot-fleet-agent/doc.go b/charts/gardener-extension-shoot-fleet-agent/doc.go index c4b10b7..b7c98fd 100644 --- a/charts/gardener-extension-shoot-fleet-agent/doc.go +++ b/charts/gardener-extension-shoot-fleet-agent/doc.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:generate ../../vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh extension-shoot-fleet-agent . ../../VERSION ../../example/controller-registration.yaml Extension:shoot-fleet-agent +//go:generate ../../hack/generate-controller-registration.sh extension-shoot-fleet-agent . ../../VERSION ../../example/controller-registration.yaml Extension:shoot-fleet-agent // Package chart enables go:generate support for generating the correct controller registration. package chart diff --git a/charts/gardener-extension-shoot-fleet-agent/templates/_helpers.tpl b/charts/gardener-extension-shoot-fleet-agent/templates/_helpers.tpl index cc224e0..d631ef0 100644 --- a/charts/gardener-extension-shoot-fleet-agent/templates/_helpers.tpl +++ b/charts/gardener-extension-shoot-fleet-agent/templates/_helpers.tpl @@ -9,7 +9,10 @@ kind: FleetAgentConfig clientConnection: kubeconfig: {{ .Values.fleetManager.kubeconfig }} {{- if .Values.fleetManager.labels }} -labels: {{ .Values.fleetManager.labels | toYaml }} + labels: {{ .Values.fleetManager.labels | toYaml | nindent 6 }} +{{- end }} +{{- if .Values.fleetManager.namespace }} + namespace: {{ .Values.fleetManager.namespace }} {{- end }} {{- end }} diff --git a/charts/gardener-extension-shoot-fleet-agent/values.yaml b/charts/gardener-extension-shoot-fleet-agent/values.yaml index 1a74f51..2671eda 100644 --- a/charts/gardener-extension-shoot-fleet-agent/values.yaml +++ b/charts/gardener-extension-shoot-fleet-agent/values.yaml @@ -27,8 +27,9 @@ controllers: concurrentSyncs: 1 fleetManager: - kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VVMlJFTkRRWFJEWjBGM1NVSkJaMGxSVWtsYWVFOXZaMmQxYW1aSlYwbHVhR3RGUlhSRGVrRk9RbWRyY1docmFVYzVkekJDUVZGelJrRkVRVTRLVFZGemQwTlJXVVJXVVZGRVJYZEthbGxVUVdkR2R6QjVUVlJCZUUxVVRYaE5la2t3VFhwR1lVZEJPSGxOUkZWNFRVUkZlRTE2UlhwTmVsRjZUVlp2ZHdwRVZFVk1UVUZyUjBFeFZVVkJlRTFEV1RKRmQyZG5TV2xOUVRCSFExTnhSMU5KWWpORVVVVkNRVkZWUVVFMFNVTkVkMEYzWjJkSlMwRnZTVU5CVVVOM0NtNUhibU53TDB4Vk9XSjNhek56SzNReVJqZHpNRlJhWlRaTFJVRkZVMjVWZFZCTE4xTkROMHQwY0d0M1JuRnBiR3hKV1RSdWRXeG1UQzgxYmxSMU1UQUtjRUZ2YVhGbWRHRnVabVJQUTJKWlMyTkdSR3Q0TldsNU0wMDVaSFp4WmtwMWEwSmpSR3hMT0VaM1RtbzVPVVpDYjJwa1dtMXpjVWw0U0VOeVRqRm9SUXBoYzJVM2VHUXphamxJTUZWa1VUVlFSek4wTTNFeVZHOVRURTVoZVZoVVdIWTBNRlZ3VlhacVowRnJibXMwYmtGS01rRlphWFZWWlZwNGEyeDVOMkp0Q2s1NGRuRmtTR0l5UVV3ck5uSmpSREZPUkVoWWNraFNiRVJLWTFsalZHTkJXVWxEY0hWQ1JVSjJRVXBzT1c0eVFXdFBSM0p4YmtJeUszVmtSRFZZWVcwS2JscDVNWGx5U1daNWVFaFdVVk5TZEhkRlZHVkJiakZrY3pSS1pWQkRjMXBUZUdKVFZIRjZkamRQZDFVelJuWm1SekpSSzJWVFVGVmlSa3BHUWtaTmJBcFBZaTh3TDNobldqWXZWVGwwWTJaQ2F6WjZkbVZCUWxJeldHMUpNa3RSUW5KUGIwWndhMnBHTUdvek9WTXZWRmxCWkVKM1pXRnpjak5tY1ZRelJsWnNDbWhJUTNWdFYxUlFZVlIzWjBzM1NVUXhVbTlXY1dSa1FraE5ZbFpYUVd3MldGZzRabU15Ym1scEwwcFdkV1JqZWsxVmJtVlZMM0I2U1V4b2N6aFJPV01LYTAxeU1XZEVXRGxSWXpCQmNtbFVVRzFXYlRGbGFVSmFRekJXU25oU2NraHFOSE56ZVdkVWFWUllPVXRRYmxKMFdsRmhNVXhRTXpsdmVrSXJaa1pITWdwMmRFWnphMVJaY0hKTWFuZHZjM1pWTkdnNWFFRnNVbVpWWVdwb0sySkVla0U1THpaaFVVTXljVnBXVjJ0aWNtbGtRMU5GVEdKNUt6aG9hVGx5VFRWekNtMTZVQzkxU2pCSmRHdDNkWE5wVDJNeWRuUlROWE5wZUhNelNHaG9WRVUxWkc1RlJ6aENaa05RTWtsaFZqUktORFEyY1ZoMmNFUlZXbTA1U3pWMmRYUUtjbUZyZGtKUEwydFZSRmhTV1RKM1EwcE1lbmx6WVhjMVVYTTFVbUpTTkdZdlZEVnJlalpEZURSM1NVUkJVVUZDYnpCSmQxRkVRVTlDWjA1V1NGRTRRZ3BCWmpoRlFrRk5RMEZ4VVhkRWQxbEVWbEl3VkVGUlNDOUNRVlYzUVhkRlFpOTZRV1JDWjA1V1NGRTBSVVpuVVZVeEsxY3lNRWxPYkZvelYxQk5UVVpZQ2s1SU5taExhUzl2YTNwamQwUlJXVXBMYjFwSmFIWmpUa0ZSUlV4Q1VVRkVaMmRKUWtGQlJXeFlhREpCSzJjeWJHSTJNMUY0ZHlzdk5WazVWMWRpZVdNS1FrMVFMemhVUVdaMlkzcDJRM0J4V25scFQwaEpSMjV0U21KNVFuaHljbm8wYUROT2RrVnZkMlEyYTNWeE9UUkpkakoyWnpkc1JHZ3lSMDFZUTB4cGJnbzBjazUwZGt0NVZWTTFVMGMxVTNWTGNVZElWMU5CUVdZdkswZzFUbXhYTVhnMFRIQjNZbXNyVGk5V1dXTnZjRXRyTDNoYVpHbHplak5KTDNSeFJHbFpDbWhXVW5aQ1ZqQjNOMkkzWVhScVYyeGplV0V6WTNBclMybFpNVEZ6UlhSSFkyRjZXR1pwVEU1UmEzUTRObTA0Y0V0TmVtRlpVVmd4YkZvd01qWXhLMU1LTVRoVk5VRk9NVVV2VDB4dFN6VkJORW95YXpGTFQyWm1UbVUwVFhwcmNIUmxWMlJPU1VKNVEzVm9PRlpYVkN0dGRuZDRhWGh3Y21Ka2FUWlVla3hUUkFwMWFqQkVlbnB1VVc1V1pGQkRjeXMwUlhaSllqRXJZbk5QV0hoSWFFc3dlWGRoWTJ4amNHUlVjRVpqV0dkdFIwOVhUek5SU2xGSFVEVTFUMlZHTDJneENrdFBRVWhwUTA5RU5rcEZZbkp0WTFkbVNXWk9hRTQ1VmxGWVZXeHNWa2h2UVRkWlp6aDJabU14UVVaV1prYzVaVE5UUXpScVF6WjViVFEyUjNCRFdVOEtNVkV5TmxOWVJHRnphVGRaUVhGVGNFbDVZMjF4Y2xac2QyZERRVkZzTkZFek9YZHRVbWRGVW5CV2RsQlhiMDF6YkV0RlVGazVWbXAwZVhvNFNWSnNaQXB1VmsxWGJGWTRZVkpqV2tvdlZFNUhZbTQzYkVkdFdHOWxWalpTVVhsalpVRkJkR1JQVHpkdlprWktjVWRqYkRJNVYxcDJiellyY2xGUWRYbEZObVYzQ25acWRsTlNTa2RUU0V4ME9HUXZVMlpRTWtFMk5rVXdiMk4yU2xNMWFXcEJlV05OUldOVU9HOXJSVnB5TVVWdWJTOUljbG8zTDBKelJtSTBia2wzYXprS2NVODBZMDAxVXpnNU0wOTNVMVZNYjA1RllXRnphbGgyTlcxWWFYUnZMelZKTVc1UGNWcGpNR2x6YUVOTk5XdEhOMHRtTURadGVHczVZelIwYVVJek1RcHBXRXRGVUdkWlpqVmxOVkpxZVVGTENpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSwogICAgc2VydmVyOiBodHRwczovL29wcy00NDAyM2I2Yy5oY3Aud2VzdGV1cm9wZS5hem1rOHMuaW86NDQzCiAgbmFtZTogb3BzCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBvcHMKICAgIHVzZXI6IGdhcmRlbmVyLWZsZWV0LWFnZW50CiAgbmFtZTogb3BzCmN1cnJlbnQtY29udGV4dDogb3BzCmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogZ2FyZGVuZXItZmxlZXQtYWdlbnQKICB1c2VyOgogICAgdG9rZW46IGV5SmhiR2NpT2lKU1V6STFOaUlzSW10cFpDSTZJbGxqYkRSM2VtVkdZMFpEZUdaRmVIY3hhRGxHWjAxYVFteFpURE5qTVRoVGFXMU1ibmxmTm1rNWRVa2lmUS5leUpwYzNNaU9pSnJkV0psY201bGRHVnpMM05sY25acFkyVmhZMk52ZFc1MElpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl1WVcxbGMzQmhZMlVpT2lKamJIVnpkR1Z5Y3lJc0ltdDFZbVZ5Ym1WMFpYTXVhVzh2YzJWeWRtbGpaV0ZqWTI5MWJuUXZjMlZqY21WMExtNWhiV1VpT2lKbllYSmtaVzVsY2kxbWJHVmxkQzFoWjJWdWRDMTBiMnRsYmkxNmRtNW9jeUlzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG01aGJXVWlPaUpuWVhKa1pXNWxjaTFtYkdWbGRDMWhaMlZ1ZENJc0ltdDFZbVZ5Ym1WMFpYTXVhVzh2YzJWeWRtbGpaV0ZqWTI5MWJuUXZjMlZ5ZG1salpTMWhZMk52ZFc1MExuVnBaQ0k2SWpNME9HUTVOVGRtTFRCaVpETXRORFU0T0MxaU5EUm1MV1l5T1RkaU1EWXhZV1JqTXlJc0luTjFZaUk2SW5ONWMzUmxiVHB6WlhKMmFXTmxZV05qYjNWdWREcGpiSFZ6ZEdWeWN6cG5ZWEprWlc1bGNpMW1iR1ZsZEMxaFoyVnVkQ0o5Lm1OR1hHekN5MFhBTTZMWTlSTEJhTTZral9RSHBGdVVhcU54WklZT3dldm1VSEFwMTF6NEVLMThOZGtJWDRlZEhHT3hkbHlVWUFfUWg1V3dfalBndGJpOEk2NmNickRWX2oxZGtlVlp4SWN4VVc5X3BhN0NEVUpveDF6dUNienJMRjNfV0JFZFVkU1JnWUtVaURjUXZWcm9mUWVQOVQtdVRFUWdkYkpLenBEcThZd0hQY0VjdmJ5a3QtYThUMWNNX1dCMHlta0dRLXhCYUJKRHp1ZEFvNVMwUVQ4NHZrOV8xNFlEb1FtUkZ2MkxnRlNRQUhqcTdDYnM2QXJjWm9QS3Q0aUVxRVJIRGZGcDdmQWozVFQ1QmFVN0MxV2NfazRYLVJYdFJzWnY4Uml0UDVPUUszdWRyaEtGWi1GdVhIaXN0R19NcXV2VlZrWkhiOUdTZldzblpuRnJnaWNTbDJSVVIxWDN0dlJIODljYzk0a3oyNGZ0cG13Q3BCNlNRSDRzZWxMRnBsb0tpWFMtcnR3cGU4SXFkS2dDTEFZWm5CMG1fS1JGWVE1cEFOV2hFeWF4MkVsTzRaSDN0eFU4TWJSMlJnWm1hWXJLZzF5YkQ5MnJ1VnlrR01fSUlhY2NLc1gtZjdjQ1RZTnBCZm1IaHAzVUhMQmJKVENHZU42ODlxLWVqTEhvcFpaNmxDLTdPMkpBMWRCM3hOenVQbDg1SHJxclIxZEZ4Sk84bjFIaEQwdWdZeHYyRXZVMlhYMkVuVFNGcFd4TlF5dlhFcjVOY1JiRXdfTk1vTUh2b1p2V21jYzg3M2J4TWJvR1p0dWU5ZmZSVkJnMmFSWlU5X1I1bVlEUkZiRWQ5VWxRRHZuS0RuNlJ4LVNBLW5nNVZFTXJzUG1keDAtem01WnZReUNrCgo= - labels: + kubeconfig: #base64encoded kubeconfig of fleet manager cluster comes here + labels: # optional fleet Cluster crd labels + namespace: clusters # namespace where Fleet clusters stores Cluster CRD objects disableControllers: [] diff --git a/example/00-config.yaml b/example/00-config.yaml index 44c54f4..78bf18e 100644 --- a/example/00-config.yaml +++ b/example/00-config.yaml @@ -1,5 +1,5 @@ apiVersion: shoot-fleet-agent-service.extensions.config.gardener.cloud/v1alpha1 kind: FleetAgentConfig clientConnection: - kubeconfig: #base64 encoded kubeconfig + kubeconfig: #base64 encoded kubeconfig of fleet cluster namespace: clusters #namespace to register clusters in fleet manager cluster \ No newline at end of file diff --git a/example/30-cluster.yaml b/example/30-cluster.yaml deleted file mode 100644 index 82f5a4f..0000000 --- a/example/30-cluster.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -apiVersion: extensions.gardener.cloud/v1alpha1 -kind: Cluster -metadata: - name: shoot--foo--bar -spec: - cloudProfile: - apiVersion: core.gardener.cloud/v1beta1 - kind: CloudProfile - seed: - apiVersion: core.gardener.cloud/v1beta1 - kind: Seed - shoot: - apiVersion: core.gardener.cloud/v1beta1 - kind: Shoot - metadata: - generation: 1 - name: shoot--foo--bar - spec: - dns: - domain: foo.bar.example.com - kubernetes: - version: 1.18.2 - status: - lastOperation: - state: Succeeded - observedGeneration: 1 - diff --git a/example/30-extension.yaml b/example/30-extension.yaml index b4b41a4..1a289d8 100644 --- a/example/30-extension.yaml +++ b/example/30-extension.yaml @@ -7,5 +7,8 @@ metadata: spec: type: shoot-fleet-agent providerConfig: - apiVersion: service.cert.extensions.gardener.cloud/v1alpha1 - kind: CertConfig + apiVersion: shoot-fleet-agent-service.extensions.config.gardener.cloud/v1alpha1 + kind: FleetAgentConfig + clientConnection: + kubeconfig: #base64 encoded kubeconfig of fleet cluster + namespace: clusters #namespace to register clusters in fleet manager cluster diff --git a/example/controller-registration.yaml b/example/controller-registration.yaml index 6e89af8..cb78065 100644 --- a/example/controller-registration.yaml +++ b/example/controller-registration.yaml @@ -7,10 +7,14 @@ spec: resources: - kind: Extension type: shoot-fleet-agent + globallyEnabled: true deployment: type: helm providerConfig: - chart: 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 + chart: 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 values: image: tag: v1.0.0-dev + fleetManager: + kubeconfig: #base64 encoded kubeconfig of Fleet manager cluster with user that has write access to Cluster and Secret + namespace: clusters diff --git a/hack/generate-controller-registration.sh b/hack/generate-controller-registration.sh new file mode 100755 index 0000000..fb91ca6 --- /dev/null +++ b/hack/generate-controller-registration.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# +# Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +# +# 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. + +set -e +set -o pipefail + +function usage { + cat < [kinds-and-types ...] + + Name of the controller registration to generate. + Location of the chart directory. + Location of the VERSION file. + The destination file to write the registration YAML to. + A tuple of kind and type of the controller registration to generate. + Separated by ':'. + Example: OperatingSystemConfig:foobar + Further tuples of kind and type of the controller registration to generate. + Separated by ':'. +EOM + exit 0 +} + +if [ "$1" == "--optional" ]; then + shift + MODE=$'\n globallyEnabled: false' +fi +NAME="$1" +CHART_DIR="$2" +VERSION_FILE="$3" +DEST="$4" +KIND_AND_TYPE="$5" + +VERSION="$(cat "$VERSION_FILE")" + +( [[ -z "$NAME" ]] || [[ -z "$CHART_DIR" ]] || [[ -z "$DEST" ]] || [[ -z "$KIND_AND_TYPE" ]]) && usage + +KINDS_AND_TYPES=("$KIND_AND_TYPE" "${@:6}") + +# The following code is to make `helm package` idempotent: Usually, everytime `helm package` is invoked, +# it produces a different `.tgz` due to modification timestamps and some special shasums of gzip. We +# resolve this by unarchiving the `.tgz`, compressing it again with a constant `mtime` and no gzip +# checksums. +temp_dir="$(mktemp -d)" +temp_helm_home="$(mktemp -d)" +temp_extract_dir="$(mktemp -d)" +function cleanup { + rm -rf "$temp_dir" + rm -rf "$temp_helm_home" + rm -rf "$temp_extract_dir" +} +trap cleanup EXIT ERR INT TERM + +export HELM_HOME="$temp_helm_home" +[ "$(helm version --client --template "{{.Version}}" | head -c2 | tail -c1)" = "3" ] || helm init --client-only > /dev/null 2>&1 +helm package "$CHART_DIR" --version "$VERSION" --app-version "$VERSION" --destination "$temp_dir" > /dev/null +tar -xzm -C "$temp_extract_dir" -f "$temp_dir"/* +chart="$(tar --sort=name -c --owner=root:0 --group=root:0 --mtime='UTC 2019-01-01' -C "$temp_extract_dir" "$(basename "$temp_extract_dir"/*)" | gzip -n | base64 | tr -d '\n')" + +mkdir -p "$(dirname "$DEST")" + +cat < "$DEST" +--- +apiVersion: core.gardener.cloud/v1beta1 +kind: ControllerRegistration +metadata: + name: $NAME +spec: + resources: +EOM + +for kind_and_type in "${KINDS_AND_TYPES[@]}"; do + KIND="$(echo "$kind_and_type" | cut -d ':' -f 1)" + TYPE="$(echo "$kind_and_type" | cut -d ':' -f 2)" + cat <> "$DEST" + - kind: $KIND + type: $TYPE$MODE + globallyEnabled: true +EOM +done + +cat <> "$DEST" + deployment: + type: helm + providerConfig: + chart: $chart + values: + image: + tag: $VERSION + fleetManager: + kubeconfig: #base64 encoded kubeconfig of Fleet manager cluster with user that has write access to Cluster and Secret + namespace: clusters +EOM + +echo "Successfully generated controller registration at $DEST" diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index f72fa6b..1848610 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -45,5 +45,4 @@ bash "${PROJECT_ROOT}"/vendor/k8s.io/code-generator/generate-internal-groups.sh github.com/rancher/fleet/pkg/apis \ github.com/rancher/fleet/pkg/apis \ "fleet.cattle.io:v1alpha1" \ - --go-header-file "${PROJECT_ROOT}/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt" - #--extra-peer-dirs=github.com/javamachr/gardener-extension-shoot-fleet-agent/pkg/apis/config,github.com/javamachr/gardener-extension-shoot-fleet-agent/pkg/apis/config/v1alpha1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/conversion,k8s.io/apimachinery/pkg/runtime, github.com/gardener/gardener/extensions/pkg/controller/healthcheck/config/v1alpha1 \ No newline at end of file + --go-header-file "${PROJECT_ROOT}/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt" \ No newline at end of file