diff --git a/cmd/gardener-extension-provider-azure/app/app.go b/cmd/gardener-extension-provider-azure/app/app.go index 24484c1a9..5c3d3c251 100644 --- a/cmd/gardener-extension-provider-azure/app/app.go +++ b/cmd/gardener-extension-provider-azure/app/app.go @@ -121,8 +121,9 @@ func NewControllerManagerCommand(ctx context.Context) *cobra.Command { Namespace: os.Getenv("WEBHOOK_CONFIG_NAMESPACE"), } + gardenerVersion = new(string) controllerSwitches = azurecmd.ControllerSwitchOptions() - webhookSwitches = azurecmd.WebhookSwitchOptions() + webhookSwitches = azurecmd.WebhookSwitchOptions(gardenerVersion) webhookOptions = webhookcmd.NewAddToManagerOptions( azure.Name, genericactuator.ShootWebhooksResourceName, @@ -214,6 +215,7 @@ func NewControllerManagerCommand(ctx context.Context) *cobra.Command { } log.Info("Adding controllers to manager") + *gardenerVersion = generalOpts.Completed().GardenerVersion configFileOpts.Completed().ApplyETCDStorage(&azurecontrolplaneexposure.DefaultAddOptions.ETCDStorage) configFileOpts.Completed().ApplyHealthCheckConfig(&healthcheck.DefaultAddOptions.HealthCheckConfig) diff --git a/pkg/cmd/options.go b/pkg/cmd/options.go index 7d720d0e4..5d74a642e 100644 --- a/pkg/cmd/options.go +++ b/pkg/cmd/options.go @@ -54,12 +54,12 @@ func ControllerSwitchOptions() *controllercmd.SwitchOptions { } // WebhookSwitchOptions are the webhookcmd.SwitchOptions for the provider webhooks. -func WebhookSwitchOptions() *webhookcmd.SwitchOptions { +func WebhookSwitchOptions(gardenerVersion *string) *webhookcmd.SwitchOptions { return webhookcmd.NewSwitchOptions( webhookcmd.Switch(extensionsnetworkwebhook.WebhookName, networkwebhook.AddToManager), webhookcmd.Switch(acceleratednetworkwebhook.WebhookName, acceleratednetworkwebhook.AddToManager), webhookcmd.Switch(infrastructurewebhook.WebhookName, infrastructurewebhook.AddToManager), - webhookcmd.Switch(extensionscontrolplanewebhook.WebhookName, controlplanewebhook.AddToManager), + webhookcmd.Switch(extensionscontrolplanewebhook.WebhookName, controlplanewebhook.AddToManager(gardenerVersion)), webhookcmd.Switch(extensionscontrolplanewebhook.ExposureWebhookName, controlplaneexposurewebhook.AddToManager), webhookcmd.Switch(extensionscloudproviderwebhook.WebhookName, cloudproviderwebhook.AddToManager), webhookcmd.Switch(topology.WebhookName, topology.AddToManager), diff --git a/pkg/webhook/controlplane/add.go b/pkg/webhook/controlplane/add.go index afe83ac6e..a7508457c 100644 --- a/pkg/webhook/controlplane/add.go +++ b/pkg/webhook/controlplane/add.go @@ -5,13 +5,19 @@ package controlplane import ( + "fmt" + + "github.com/Masterminds/semver/v3" extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook" "github.com/gardener/gardener/extensions/pkg/webhook/controlplane" "github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/component/extensions/operatingsystemconfig/original/components/kubelet" oscutils "github.com/gardener/gardener/pkg/component/extensions/operatingsystemconfig/utils" appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" vpaautoscalingv1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -21,21 +27,43 @@ import ( var ( logger = log.Log.WithName("azure-controlplane-webhook") + // TODO(LucaBernstein): Clean up the gardener version check after October/2024. + versionConstraintGreaterEqual198 *semver.Constraints ) +func init() { + var err error + versionConstraintGreaterEqual198, err = semver.NewConstraint(">= 1.98") + utilruntime.Must(err) +} + // AddToManager creates a webhook and adds it to the manager. -func AddToManager(mgr manager.Manager) (*extensionswebhook.Webhook, error) { - logger.Info("Adding webhook to manager") - fciCodec := oscutils.NewFileContentInlineCodec() - return controlplane.New(mgr, controlplane.Args{ - Kind: controlplane.KindShoot, - Provider: azure.Type, - Types: []extensionswebhook.Type{ - {Obj: &appsv1.Deployment{}}, - {Obj: &vpaautoscalingv1.VerticalPodAutoscaler{}}, - {Obj: &extensionsv1alpha1.OperatingSystemConfig{}}, - }, - Mutator: genericmutator.NewMutator(mgr, NewEnsurer(mgr, logger), oscutils.NewUnitSerializer(), - kubelet.NewConfigCodec(fciCodec), fciCodec, logger), - }) +func AddToManager(gardenerVersion *string) func(mgr manager.Manager) (*extensionswebhook.Webhook, error) { + return func(mgr manager.Manager) (*extensionswebhook.Webhook, error) { + var objectSelector *metav1.LabelSelector + if gardenerVersion != nil && len(*gardenerVersion) > 0 { + version, err := semver.NewVersion(*gardenerVersion) + if err != nil { + return nil, fmt.Errorf("failed to parse gardener version: %v", err) + } + if versionConstraintGreaterEqual198.Check(version) { + objectSelector = &metav1.LabelSelector{MatchLabels: map[string]string{v1beta1constants.LabelExtensionProviderMutatedByControlplaneWebhook: "true"}} + } + } + + logger.Info("Adding webhook to manager") + fciCodec := oscutils.NewFileContentInlineCodec() + return controlplane.New(mgr, controlplane.Args{ + Kind: controlplane.KindShoot, + Provider: azure.Type, + Types: []extensionswebhook.Type{ + {Obj: &appsv1.Deployment{}}, + {Obj: &vpaautoscalingv1.VerticalPodAutoscaler{}}, + {Obj: &extensionsv1alpha1.OperatingSystemConfig{}}, + }, + ObjectSelector: objectSelector, + Mutator: genericmutator.NewMutator(mgr, NewEnsurer(mgr, logger), oscutils.NewUnitSerializer(), + kubelet.NewConfigCodec(fciCodec), fciCodec, logger), + }) + } }