diff --git a/pkg/provider/kubernetes/ingress/client.go b/pkg/provider/kubernetes/ingress/client.go index b827e52a5..7dddb8cda 100644 --- a/pkg/provider/kubernetes/ingress/client.go +++ b/pkg/provider/kubernetes/ingress/client.go @@ -46,7 +46,7 @@ type Client interface { GetSecret(namespace, name string) (*corev1.Secret, bool, error) GetEndpoints(namespace, name string) (*corev1.Endpoints, bool, error) UpdateIngressStatus(ing *networkingv1.Ingress, ingStatus []corev1.LoadBalancerIngress) error - GetServerVersion() (*version.Version, error) + GetServerVersion() *version.Version } type clientWrapper struct { @@ -58,6 +58,7 @@ type clientWrapper struct { ingressLabelSelector string isNamespaceAll bool watchedNamespaces []string + serverVersion *version.Version } // newInClusterClient returns a new Provider client that is expected to run @@ -135,6 +136,19 @@ func newClientImpl(clientset kubernetes.Interface) *clientWrapper { // WatchAll starts namespace-specific controllers for all relevant kinds. func (c *clientWrapper) WatchAll(namespaces []string, stopCh <-chan struct{}) (<-chan interface{}, error) { + // Get and store the serverVersion for future use. + serverVersionInfo, err := c.clientset.Discovery().ServerVersion() + if err != nil { + return nil, fmt.Errorf("could not retrieve server version: %w", err) + } + + serverVersion, err := version.NewVersion(serverVersionInfo.GitVersion) + if err != nil { + return nil, fmt.Errorf("could not parse server version: %w", err) + } + + c.serverVersion = serverVersion + eventCh := make(chan interface{}, 1) eventHandler := &k8s.ResourceEventHandler{Ev: eventCh} @@ -153,11 +167,6 @@ func (c *clientWrapper) WatchAll(namespaces []string, stopCh <-chan struct{}) (< opts.LabelSelector = c.ingressLabelSelector } - serverVersion, err := c.GetServerVersion() - if err != nil { - return nil, fmt.Errorf("failed to get server version: %w", err) - } - for _, ns := range namespaces { factoryIngress := informers.NewSharedInformerFactoryWithOptions(c.clientset, resyncPeriod, informers.WithNamespace(ns), informers.WithTweakListOptions(matchesLabelSelector)) @@ -230,13 +239,7 @@ func (c *clientWrapper) WatchAll(namespaces []string, stopCh <-chan struct{}) (< func (c *clientWrapper) GetIngresses() []*networkingv1.Ingress { var results []*networkingv1.Ingress - serverVersion, err := c.GetServerVersion() - if err != nil { - log.Errorf("Failed to get server version: %v", err) - return results - } - - isNetworkingV1Supported := supportsNetworkingV1Ingress(serverVersion) + isNetworkingV1Supported := supportsNetworkingV1Ingress(c.serverVersion) for ns, factory := range c.factoriesIngress { if isNetworkingV1Supported { @@ -354,13 +357,7 @@ func (c *clientWrapper) UpdateIngressStatus(src *networkingv1.Ingress, ingStatus return fmt.Errorf("failed to get ingress %s/%s: namespace is not within watched namespaces", src.Namespace, src.Name) } - serverVersion, err := c.GetServerVersion() - if err != nil { - log.WithoutContext().Errorf("Failed to get server version: %v", err) - return err - } - - if !supportsNetworkingV1Ingress(serverVersion) { + if !supportsNetworkingV1Ingress(c.serverVersion) { return c.updateIngressStatusOld(src, ingStatus) } @@ -472,18 +469,12 @@ func (c *clientWrapper) GetSecret(namespace, name string) (*corev1.Secret, bool, } func (c *clientWrapper) GetIngressClasses() ([]*networkingv1.IngressClass, error) { - serverVersion, err := c.GetServerVersion() - if err != nil { - log.WithoutContext().Errorf("Failed to get server version: %v", err) - return nil, err - } - if c.clusterFactory == nil { return nil, errors.New("cluster factory not loaded") } var ics []*networkingv1.IngressClass - if !supportsNetworkingV1Ingress(serverVersion) { + if !supportsNetworkingV1Ingress(c.serverVersion) { ingressClasses, err := c.clusterFactory.Networking().V1beta1().IngressClasses().Lister().List(labels.Everything()) if err != nil { return nil, err @@ -531,13 +522,8 @@ func (c *clientWrapper) lookupNamespace(ns string) string { } // GetServerVersion returns the cluster server version, or an error. -func (c *clientWrapper) GetServerVersion() (*version.Version, error) { - serverVersion, err := c.clientset.Discovery().ServerVersion() - if err != nil { - return nil, fmt.Errorf("could not retrieve server version: %w", err) - } - - return version.NewVersion(serverVersion.GitVersion) +func (c *clientWrapper) GetServerVersion() *version.Version { + return c.serverVersion } // translateNotFoundError will translate a "not found" error to a boolean return diff --git a/pkg/provider/kubernetes/ingress/client_mock_test.go b/pkg/provider/kubernetes/ingress/client_mock_test.go index 195580692..6cc6ef138 100644 --- a/pkg/provider/kubernetes/ingress/client_mock_test.go +++ b/pkg/provider/kubernetes/ingress/client_mock_test.go @@ -80,8 +80,8 @@ func (c clientMock) GetIngresses() []*networkingv1.Ingress { return c.ingresses } -func (c clientMock) GetServerVersion() (*version.Version, error) { - return c.serverVersion, nil +func (c clientMock) GetServerVersion() *version.Version { + return c.serverVersion } func (c clientMock) GetService(namespace, name string) (*corev1.Service, bool, error) { diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index a3c7eac46..2e1869fa8 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -189,11 +189,7 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl TCP: &dynamic.TCPConfiguration{}, } - serverVersion, err := client.GetServerVersion() - if err != nil { - log.FromContext(ctx).Errorf("Failed to get server version: %v", err) - return conf - } + serverVersion := client.GetServerVersion() var ingressClasses []*networkingv1.IngressClass