Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add validation for cloud provider Secrets #112

Merged
merged 1 commit into from
Jul 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ webhooks:
objectSelector: {}
namespaceSelector: {}
sideEffects: None
{{- if semverCompare "<= 1.15-0" .Capabilities.KubeVersion.GitVersion -}}
timeoutSeconds: 10
{{- end -}}
clientConfig:
{{- if .Values.global.virtualGarden.enabled }}
url: {{ printf "https://%s.%s/webhooks/validate" (include "name" .) (.Release.Namespace) }}
Expand All @@ -30,3 +33,30 @@ webhooks:
path: /webhooks/validate
{{- end }}
caBundle: {{ required ".Values.webhookConfig.caBundle is required" (b64enc .Values.global.webhookConfig.caBundle) }}
- name: secrets.validation.gcp.provider.extensions.gardener.cloud
ialidzhikov marked this conversation as resolved.
Show resolved Hide resolved
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- UPDATE
resources:
- secrets
failurePolicy: Fail
objectSelector: {}
namespaceSelector: {}
sideEffects: None
{{- if semverCompare "<= 1.15-0" .Capabilities.KubeVersion.GitVersion -}}
timeoutSeconds: 10
{{- end -}}
clientConfig:
{{- if .Values.global.virtualGarden.enabled }}
url: {{ printf "https://%s.%s/webhooks/validate/secrets" (include "name" .) (.Release.Namespace) }}
{{- else }}
service:
namespace: {{ .Release.Namespace }}
name: {{ include "name" . }}
path: /webhooks/validate/secrets
{{- end }}
caBundle: {{ required ".Values.webhookConfig.caBundle is required" (b64enc .Values.global.webhookConfig.caBundle) }}
9 changes: 9 additions & 0 deletions cmd/gardener-extension-admission-gcp/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ import (

controllercmd "github.com/gardener/gardener/extensions/pkg/controller/cmd"
"github.com/gardener/gardener/extensions/pkg/util"
"github.com/gardener/gardener/extensions/pkg/util/index"
webhookcmd "github.com/gardener/gardener/extensions/pkg/webhook/cmd"
"github.com/gardener/gardener/pkg/apis/core/install"
gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1"
"github.com/spf13/cobra"
componentbaseconfig "k8s.io/component-base/config"
logf "sigs.k8s.io/controller-runtime/pkg/log"
Expand Down Expand Up @@ -76,6 +78,13 @@ func NewAdmissionCommand(ctx context.Context) *cobra.Command {
return fmt.Errorf("could not update manager scheme: %v", err)
}

if err := mgr.GetFieldIndexer().IndexField(&gardencorev1beta1.SecretBinding{}, index.SecretRefNamespaceField, index.SecretRefNamespaceIndexerFunc); err != nil {
return err
}
if err := mgr.GetFieldIndexer().IndexField(&gardencorev1beta1.Shoot{}, index.SecretBindingNameField, index.SecretBindingNameIndexerFunc); err != nil {
return err
}

log.Info("Setting up webhook server")

if err := webhookOptions.Completed().AddToManager(mgr); err != nil {
Expand Down
27 changes: 27 additions & 0 deletions docs/local-setup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
### admission-gcp

`admission-gcp` is an admission webhook server which is responsible for the validation of the cloud provider (GCP in this case) specific fields and resources. The Gardener API server is cloud provider agnostic and it wouldn't be able to perform similar validation.

Follow the steps below to run the admission webhook server locally.

1. Start the Gardener API server.

For details, check the Gardener [local setup](https://github.com/gardener/gardener/blob/master/docs/development/local_setup.md).

1. Start the webhook server

Make sure that the `KUBECONFIG` environment variable is pointing to the local garden cluster.

```bash
make start-admission
```

1. Setup the `ValidatingWebhookConfiguration`.

`hack/dev-setup-admission-gcp.sh` will configure the webhook Service which will allow the kube-apiserver of your local cluster to reach the webhook server. It will also apply the `ValidatingWebhookConfiguration` manifest.

```bash
./hack/dev-setup-admission-gcp.sh
```

You are now ready to experiment with the `admission-gcp` webhook server locally.
22 changes: 21 additions & 1 deletion example/40-validatingwebhookconfiguration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,24 @@ webhooks:
sideEffects: None
clientConfig:
url: "https://localhost:9443/webhooks/validate"
timuthy marked this conversation as resolved.
Show resolved Hide resolved
caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLRENDQWhDZ0F3SUJBZ0lVR1VqMFNROVpJeXFUSmsvV0owbk5yQzl0azZjd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVJNQThHQTFVRUNoTUlSMkZ5WkdWdVpYSXhGekFWQmdOVkJBTVREbWRoY21SbGJtVnlMbU5zYjNWawpNQjRYRFRJd01ETXdPVEE0TkRVd01Gb1hEVEkxTURNd09EQTRORFV3TUZvd0xERVJNQThHQTFVRUNoTUlSMkZ5ClpHVnVaWEl4RnpBVkJnTlZCQU1URG1kaGNtUmxibVZ5TG1Oc2IzVmtNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0K1FMaG1KT2xIcW9CYnpPdHlTWVNzTzMrb3F5YmtiY2kxVnJaOXhOTHl1MwphRXlkWEFCQkJCTzMzckNuL2xLeXpodERFdjZHMVhlaWJVS1dKalBqV250K3lTK3NwMHA4L1p3YW9LdGh4SVpGClAyTlVMRmFneWhVU2ZIVm9WbGY1MklabXJwQWVGVzVRKzEzNm9seTFCZnZDYmhsTnZGcVhjQnZRY0VDNzhYTmoKMlc1Q0tmYlhvRjJEZnVqb3JRb1M1WGVpM2JzN3NQQmJDRlJIc1h4RHNxMVE4REY1ZG1yZStWVHdxRjdreTdiTAp6TEsrVkFsNFJZaTNnNTdUdEo2TUVQMWp2a2N2SnIycVNoUXZmY3VPS0tiaENVUG5ZdjQ3UE5ZMkZWY2RTTzJBClFGcmgwNHIwQjR3azdjT3hGWFM5cEJ5NGtYQ1EwbkNXdTJjblExNWpiUUlEQVFBQm8wSXdRREFPQmdOVkhROEIKQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQ2VHOEluVzUvUUlDem1LNApaRFZFMTZHbGo5WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSytWODhSdWp4TzR5ZEZXWXhCaGliUVhWMFZHCks1NWRGdzVpS1ZmTFAvdHphTVI5b2ZQbi90Rmw5bGpVM3p1V0FURTVZdkVxWjFIY3diSlJZeXpueVI5QWVwdmkKM213L1dTQktzUHZOME1RWUw0ZStUZWxvU3RueXc2TEFlbXFQMVprejdST3Y5bVE2L0VkUlhYWnBhbkxjb0FQRgpSQUtQN1BCNXA4Y2RHc3prN2xpbmUxZGdIaHUzOVhLdzJhaUI0d0l1d3AvY2ZZV01IN2MrTnhIN2lvc3pLb1ZPCkVEMm1UYVZEQ1QxSWlXQ2xuSmVFaExla3dPNy8zYm5ZRWtnR05HLzU0d3AxUU1lSEVqVDUxQnE0QjNiYkhBRGMKL2svbUpXOWJUcld2NzlYdUwvSkJJdmNzdFJSK0VmcHZWMUMxbmNtSnUvWkhyaEpNbUcxQnJiSXRjaEU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLRENDQWhDZ0F3SUJBZ0lVZDMzcEpWL01RWm12eENPU3FtdmpCOStvTENBd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVJNQThHQTFVRUNoTUlSMkZ5WkdWdVpYSXhGekFWQmdOVkJBTVREbWRoY21SbGJtVnlMbU5zYjNWawpNQjRYRFRJd01EVXpNVEUxTlRjd01Gb1hEVEkxTURVek1ERTFOVGN3TUZvd0xERVJNQThHQTFVRUNoTUlSMkZ5ClpHVnVaWEl4RnpBVkJnTlZCQU1URG1kaGNtUmxibVZ5TG1Oc2IzVmtNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0TkhXcENKbEMvYnIwM3VKUyt6MkgxNWlpSXBHQlJyMkpNV09ZbEhUVWYwNgpIYkFZbHhzTTR0bUZhUnZ4d0NRRlc2TnZ5cml0dWM2RCs0Q21YZFR1Z2QvaThVS2lNcU1wbXVVbHY5akhqUGVECnI0clBHeU1rZllHRm5HMGpua2RidXE1UDRDZTlLOXVCMytDekl2VGNoRklNVnE3d0dIMHJJYTBMQlVpSmlqUUsKMmYzNVNueTFvYlhlTm05V01TYUVrYjRndXlyUjlvK0FXSmlNd2hrWXIwSnlBeXV0M2wxcE9IMkpuU2ZHdXBCLwozYmFGWUlWbnVBQm1BSzUrNUxSUktTNzF3NUFXV0IvR2x5YzMzWlUwQXZNczVwRmFZaUNrVzVkbzdXS0NDU08wClpQNSttVHVhbGRJQ1gvSUpBWi9oZWRsRHZUVEs3L2V3UlBtK0tFbWppd0lEQVFBQm8wSXdRREFPQmdOVkhROEIKQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVSmlSTTdXb1doSDlqYWdzZgpFZWllZGFITVROOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR200MlQxL243SG1nMEtuRW1jQlcvTFdKaTUzCkpiU3VHWmZOOEltY1dHUkg4RXlhVGhseUxHa201U29OcFV3Y0c2b0JGZUR6dE9KbFZuV05JT1FYNndqVHhtcE0KK2o5d3hJSWpId2Q1emZoSm1xUE5GVlY1OVlvc1M2bWx2R2J5V09vSDBKRTRqVTNHamFvN1dkK21qYzRBQ21kMgpRNDlsZENrd2ZtTHQ5Y0hWSDNYNHNURDJRVmp4MFM1YU5nNkdKOHdFQnFabzl1Tlpyc0NOa21HbUZ5RXlLTDVmClRNQmJtNkZ3MzR2UFRnaEdGeFVQSzJ2Tk1mVStFa1EyTllkUURwQVJlQXNlalhuRmpvZ2RnQjRvcm4vUENwQjYKMGZPMVlIcjAvRDVoV1NMLzFINkF2V0NjT1N5ZjJSRVVDMzRJSTR3RGxVUjhsMVBwOEVPeW5DN2Raa0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
- name: secrets.validation.gcp.provider.extensions.gardener.cloud
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- UPDATE
resources:
- secrets
failurePolicy: Fail
objectSelector: {}
namespaceSelector: {}
sideEffects: None
clientConfig:
service:
namespace: garden
name: gardener-extension-admission-gcp
path: /webhooks/validate/secrets
caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLRENDQWhDZ0F3SUJBZ0lVZDMzcEpWL01RWm12eENPU3FtdmpCOStvTENBd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVJNQThHQTFVRUNoTUlSMkZ5WkdWdVpYSXhGekFWQmdOVkJBTVREbWRoY21SbGJtVnlMbU5zYjNWawpNQjRYRFRJd01EVXpNVEUxTlRjd01Gb1hEVEkxTURVek1ERTFOVGN3TUZvd0xERVJNQThHQTFVRUNoTUlSMkZ5ClpHVnVaWEl4RnpBVkJnTlZCQU1URG1kaGNtUmxibVZ5TG1Oc2IzVmtNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0TkhXcENKbEMvYnIwM3VKUyt6MkgxNWlpSXBHQlJyMkpNV09ZbEhUVWYwNgpIYkFZbHhzTTR0bUZhUnZ4d0NRRlc2TnZ5cml0dWM2RCs0Q21YZFR1Z2QvaThVS2lNcU1wbXVVbHY5akhqUGVECnI0clBHeU1rZllHRm5HMGpua2RidXE1UDRDZTlLOXVCMytDekl2VGNoRklNVnE3d0dIMHJJYTBMQlVpSmlqUUsKMmYzNVNueTFvYlhlTm05V01TYUVrYjRndXlyUjlvK0FXSmlNd2hrWXIwSnlBeXV0M2wxcE9IMkpuU2ZHdXBCLwozYmFGWUlWbnVBQm1BSzUrNUxSUktTNzF3NUFXV0IvR2x5YzMzWlUwQXZNczVwRmFZaUNrVzVkbzdXS0NDU08wClpQNSttVHVhbGRJQ1gvSUpBWi9oZWRsRHZUVEs3L2V3UlBtK0tFbWppd0lEQVFBQm8wSXdRREFPQmdOVkhROEIKQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVSmlSTTdXb1doSDlqYWdzZgpFZWllZGFITVROOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR200MlQxL243SG1nMEtuRW1jQlcvTFdKaTUzCkpiU3VHWmZOOEltY1dHUkg4RXlhVGhseUxHa201U29OcFV3Y0c2b0JGZUR6dE9KbFZuV05JT1FYNndqVHhtcE0KK2o5d3hJSWpId2Q1emZoSm1xUE5GVlY1OVlvc1M2bWx2R2J5V09vSDBKRTRqVTNHamFvN1dkK21qYzRBQ21kMgpRNDlsZENrd2ZtTHQ5Y0hWSDNYNHNURDJRVmp4MFM1YU5nNkdKOHdFQnFabzl1Tlpyc0NOa21HbUZ5RXlLTDVmClRNQmJtNkZ3MzR2UFRnaEdGeFVQSzJ2Tk1mVStFa1EyTllkUURwQVJlQXNlalhuRmpvZ2RnQjRvcm4vUENwQjYKMGZPMVlIcjAvRDVoV1NMLzFINkF2V0NjT1N5ZjJSRVVDMzRJSTR3RGxVUjhsMVBwOEVPeW5DN2Raa0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
39 changes: 22 additions & 17 deletions example/admission-gcp-certs/tls.crt
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIDnTCCAoWgAwIBAgIUEoVjdg5HQbKAJ1DA/1k6gX92zvkwDQYJKoZIhvcNAQEL
MIIEojCCA4qgAwIBAgIUN5mIHEZwJzoKJm09J8Q9Kk5OEUYwDQYJKoZIhvcNAQEL
BQAwLDERMA8GA1UEChMIR2FyZGVuZXIxFzAVBgNVBAMTDmdhcmRlbmVyLmNsb3Vk
MB4XDTIwMDMwOTA4NDUwMFoXDTMwMDMwNzA4NDUwMFowZDERMA8GA1UEBhMIR2Fy
MB4XDTIwMDUzMTE2MDIwMFoXDTMwMDUyOTE2MDIwMFowZDERMA8GA1UEBhMIR2Fy
ZGVuZXIxETAPBgNVBAgTCEdhcmRlbmVyMREwDwYDVQQKEwhHYXJkZW5lcjEVMBMG
A1UECxMMUHJvdmlkZXIgR0NQMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcgtEX+08JIMQrJK0BKOMkKC3H+iHowDq/
PAN5477gLTrDHBn9WkE6YqAydMDtnpTYCram2To0eEODzjZemlry//xpq/GXquhH
8cKk2xubbftJF6fnbyJiVmp1lZLGvpLikHroj1/dAw9BNsFfd12BhRsG4C7DEE4G
fs6KiaIgCj/JgC5xj9b1aXf284uohhy7zW3YYb7MdSnNNjO7+ZZ2zWpof+vYSSm1
zJIy7vPi7h9rocypNlc3FvU90b0Rr/pqDGrA87cLRZBTjvPqDUU/yeUk3fqqZu3c
K6bycDRIEw/deqgRHO3w0e/wFqypLqSDA3trlwkRNiKM5jUF9y5lAgMBAAGjfzB9
MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUXfYt+3Lub4hCiN14UljFOiJOyRAwHwYD
VR0jBBgwFoAUCeG8InW5/QICzmK4ZDVE16Glj9YwDQYJKoZIhvcNAQELBQADggEB
AF3uSKScJEI3fH1h77M077a7bWgtLjNMQf46DLULMW1uUNq94txqRBnPnKf2tl3q
UFske9FJo4MZcTwxAEfTdLtbkxOJJ8bQHU9+6nFLYDJg/DaSKwVNxdX0LvXpyK3o
xlZYjymDGL5ZfrnAgv1rqsULhG6GVGxx64kisHW4gcs6GjkjQ+J+rgXKEU7XIWiT
yNl5PtWN9f56uU+1JofR1v4BX67/JxoPsX/FlIlyMzFuVvOgpoYGuZ/dFbpeR88l
CPWR000TolZpm3mO/ZDpfpif7Izie2i69fyUo5n399qb7YhiHqgEjlKgRelGRPCq
EjiuwwNpXK/E/Yu5v3jQBHg=
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDl8XknpDMPCVC7CplalCJXUBvIWviJU7iF
VzUPhCCATTZEdn+MmK54RwMWDiOK7kXcIfZwzDvhmpwwnPfTgyT4NEpDZE4Hd5Gy
SYNbr1BAJg/aaZfzPJ/FmRFDgOE+2QM92e+UzifyPAManWPt9EalUlgB9ydvedrQ
/Sw41Rz6jYdLZLiU4CD5TcbWGNgqmoctllbQuEo0svY2je8UGtJAYHS8KKTkHnaU
bLSB//bHWxqvj2qq4vBbUkw6P5VAmkuKfEoFl8kTnDSH/aAmrtaQ83v2lBWzCBV6
9w0f+t59nTtA+9tq6s+hsR3JWaz+tHDaduWinLAEmAUZ72YQcYf9AgMBAAGjggGC
MIIBfjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOqWeDBS5JCHRMcNW1++jRdFeEYm
MB8GA1UdIwQYMBaAFCYkTO1qFoR/Y2oLHxHonnWhzEzfMIH+BgNVHREEgfYwgfOC
CWxvY2FsaG9zdIIgZ2FyZGVuZXItZXh0ZW5zaW9uLWFkbWlzc2lvbi1nY3CCJ2dh
cmRlbmVyLWV4dGVuc2lvbi1hZG1pc3Npb24tZ2NwLmdhcmRlboIrZ2FyZGVuZXIt
ZXh0ZW5zaW9uLWFkbWlzc2lvbi1nY3AuZ2FyZGVuLnN2Y4IzZ2FyZGVuZXItZXh0
ZW5zaW9uLWFkbWlzc2lvbi1nY3AuZ2FyZGVuLnN2Yy5jbHVzdGVygjlnYXJkZW5l
ci1leHRlbnNpb24tYWRtaXNzaW9uLWdjcC5nYXJkZW4uc3ZjLmNsdXN0ZXIubG9j
YWwwDQYJKoZIhvcNAQELBQADggEBABQZFqkZMqMq3Y7XkJmzBVo5D5fbk7xtfru2
HR4Yi0bH+j/He6s08Kd3MMdBvCgf+XfDvFP75BD9fBGhKIKrXf4XKgTSNFQlCWv9
Ajv+2uPSkrt5mZDTkU7eedGsXpoqRLroiIOxMJXYME6DBI9NXNZhrBqgFHpiYlUg
sXjSFElky1BbJx2on7t7hb3hXjeLRxaK9UBWiiZ4l4eGlZTsrFR7kGdc1WuBIA0K
I495St51dhVIt3hLsRXstm1KGcgvYQ7iyMKVzvWw2/TspZhzj1Q/m8U0Yv/Gxsx1
FGZM5evy+RWTfpUy5JvUFCfy25LXJ3l2TmGSkTt5h1zJTSdCYaY=
-----END CERTIFICATE-----
50 changes: 25 additions & 25 deletions example/admission-gcp-certs/tls.key
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
64 changes: 64 additions & 0 deletions hack/dev-setup-admission-gcp.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/bin/bash
#
# Copyright (c) 2020 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 -o errexit
set -o nounset
set -o pipefail

# Make it able to work on minikube and nodeless

IP_ROUTE=$(ip route get 1)
IP_ADDRESS=$(echo ${IP_ROUTE#*src} | awk '{print $1}')

ADMISSION_SERVICE_NAME="gardener-extension-admission-gcp"
ADMISSION_ENDPOINT_NAME="gardener-extension-admission-gcp"
APISERVER_SERVICE_PORT=443

if kubectl -n garden get service "$ADMISSION_SERVICE_NAME" &> /dev/null; then
kubectl -n garden delete service $ADMISSION_SERVICE_NAME
fi
if kubectl -n garden get endpoints "$ADMISSION_ENDPOINT_NAME" &> /dev/null; then
kubectl -n garden delete endpoints $ADMISSION_ENDPOINT_NAME
fi

cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: $ADMISSION_SERVICE_NAME
namespace: garden
spec:
ports:
- protocol: TCP
port: 443
targetPort: 9443
EOF

cat <<EOF | kubectl apply -f -
---
kind: Endpoints
apiVersion: v1
metadata:
name: $ADMISSION_ENDPOINT_NAME
namespace: garden
subsets:
- addresses:
- ip: ${IP_ADDRESS}
ports:
- port: 9443
EOF

kubectl apply -f $(dirname $0)/../example/40-validatingwebhookconfiguration.yaml
5 changes: 3 additions & 2 deletions pkg/admission/cmd/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@ package cmd
import (
"github.com/gardener/gardener-extension-provider-gcp/pkg/admission/validator"

extensionwebhook "github.com/gardener/gardener/extensions/pkg/webhook"
extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook"
webhookcmd "github.com/gardener/gardener/extensions/pkg/webhook/cmd"
)

// GardenWebhookSwitchOptions are the webhookcmd.SwitchOptions for the admission webhooks.
func GardenWebhookSwitchOptions() *webhookcmd.SwitchOptions {
return webhookcmd.NewSwitchOptions(
webhookcmd.Switch(extensionwebhook.ValidatorName, validator.New),
webhookcmd.Switch(extensionswebhook.ValidatorName, validator.New),
webhookcmd.Switch(validator.SecretsValidatorName, validator.NewSecretsWebhook),
)
}
76 changes: 76 additions & 0 deletions pkg/admission/validator/secret.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright (c) 2020 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.

package validator

import (
"context"
"fmt"

gcpvalidation "github.com/gardener/gardener-extension-provider-gcp/pkg/apis/gcp/validation"
"github.com/gardener/gardener-extension-provider-gcp/pkg/gcp"

secretutil "github.com/gardener/gardener/extensions/pkg/util/secret"
extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)

type secret struct {
client client.Client
}

// NewSecretValidator returns a new instance of a secret validator.
func NewSecretValidator() extensionswebhook.Validator {
return &secret{}
}

// InjectClient injects the given client into the validator.
func (s *secret) InjectClient(client client.Client) error {
s.client = client
return nil
}

// Validate checks whether the given new secret is in use by Shoot with provider.type=gcp
// and if yes, it check whether the new secret contains a valid GCP service account.
func (s *secret) Validate(ctx context.Context, newObj, oldObj runtime.Object) error {
secret, ok := newObj.(*corev1.Secret)
if !ok {
return fmt.Errorf("wrong object type %T", newObj)
}

if oldObj != nil {
oldSecret, ok := oldObj.(*corev1.Secret)
if !ok {
return fmt.Errorf("wrong object type %T for old object", oldObj)
}

if equality.Semantic.DeepEqual(secret.Data, oldSecret.Data) {
return nil
}
}

isInUse, err := secretutil.IsSecretInUseByShoot(ctx, s.client, secret, gcp.Type)
if err != nil {
return err
}

if !isInUse {
return nil
}

return gcpvalidation.ValidateCloudProviderSecret(secret)
}
Loading