diff --git a/internal/manager/conditions.go b/internal/manager/conditions.go deleted file mode 100644 index 108c3f2f67..0000000000 --- a/internal/manager/conditions.go +++ /dev/null @@ -1,66 +0,0 @@ -package manager - -import ( - netv1 "k8s.io/api/networking/v1" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime/schema" - - ctrlutils "github.com/kong/kubernetes-ingress-controller/v2/internal/controllers/utils" -) - -type IngressAPI int - -const ( - NoIngressAPI IngressAPI = iota - NetworkingV1 -) - -// IngressControllerConditions negotiates the best Ingress API version supported by both KIC and the k8s apiserver and -// provides functions to determine if particular controllers should be enabled. -// TODO: https://github.com/Kong/kubernetes-ingress-controller/issues/1666 -type IngressControllerConditions struct { - chosenVersion IngressAPI - cfg *Config -} - -func NewIngressControllersConditions(cfg *Config, mapper meta.RESTMapper) (*IngressControllerConditions, error) { - chosenVersion, err := negotiateIngressAPI(cfg, mapper) - if err != nil { - return nil, err - } - - return &IngressControllerConditions{chosenVersion: chosenVersion, cfg: cfg}, nil -} - -// IngressNetV1Enabled returns true if the chosen ingress API version is networking.k8s.io/v1 and it's enabled. -func (s *IngressControllerConditions) IngressNetV1Enabled() bool { - return s.chosenVersion == NetworkingV1 && s.cfg.IngressNetV1Enabled -} - -// IngressClassNetV1Enabled returns true if the chosen ingress class API version is networking.k8s.io/v1 and it's enabled. -func (s *IngressControllerConditions) IngressClassNetV1Enabled() bool { - return s.chosenVersion == NetworkingV1 && s.cfg.IngressClassNetV1Enabled -} - -func negotiateIngressAPI(config *Config, mapper meta.RESTMapper) (IngressAPI, error) { //nolint:unparam - var allowedAPIs []IngressAPI - candidateAPIs := map[IngressAPI]schema.GroupVersionResource{ - NetworkingV1: { - Group: netv1.SchemeGroupVersion.Group, - Version: netv1.SchemeGroupVersion.Version, - Resource: "ingresses", - }, - } - - // Please note the order is not arbitrary - the most mature APIs will get picked first. - if config.IngressNetV1Enabled { - allowedAPIs = append(allowedAPIs, NetworkingV1) - } - - for _, candidate := range allowedAPIs { - if ctrlutils.CRDExists(mapper, candidateAPIs[candidate]) { - return candidate, nil - } - } - return NoIngressAPI, nil -} diff --git a/internal/manager/conditions_test.go b/internal/manager/conditions_test.go deleted file mode 100644 index f88ba716cb..0000000000 --- a/internal/manager/conditions_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package manager_test - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - netv1 "k8s.io/api/networking/v1" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/kong/kubernetes-ingress-controller/v2/internal/manager" -) - -func TestIngressControllerConditions(t *testing.T) { - const kind = "Ingress" - networkingV1 := schema.GroupVersionResource{ - Group: netv1.SchemeGroupVersion.Group, - Version: netv1.SchemeGroupVersion.Version, - Resource: "ingresses", - } - - type ingressTestOpts struct { - enabled bool - crdInstalled bool - } - - testCases := []struct { - name string - - ingressNetV1 ingressTestOpts - ingressClassNetV1 ingressTestOpts - - expectIngressNetV1 bool - expectIngressClassNetV1 bool - expectError bool - }{ - { - name: "netV1_takes_precedence_over_all", - ingressNetV1: ingressTestOpts{enabled: true, crdInstalled: true}, - ingressClassNetV1: ingressTestOpts{enabled: true, crdInstalled: true}, - expectIngressNetV1: true, - expectIngressClassNetV1: true, - }, - { - name: "no_crds_installed", - ingressNetV1: ingressTestOpts{enabled: true}, - ingressClassNetV1: ingressTestOpts{enabled: true}, - expectError: false, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - restMapper := meta.NewDefaultRESTMapper(nil) - if tc.ingressNetV1.crdInstalled || tc.ingressClassNetV1.crdInstalled { - restMapper.Add(schema.GroupVersionKind{ - Group: networkingV1.Group, - Version: networkingV1.Version, - Kind: kind, - }, meta.RESTScopeRoot) - } - - conditions, err := manager.NewIngressControllersConditions( - &manager.Config{ - IngressNetV1Enabled: tc.ingressNetV1.enabled, - IngressClassNetV1Enabled: tc.ingressClassNetV1.enabled, - }, - restMapper, - ) - if tc.expectError { - require.Error(t, err) - return - } - - require.NoError(t, err) - assert.Equal(t, tc.expectIngressNetV1, conditions.IngressNetV1Enabled()) - assert.Equal(t, tc.expectIngressClassNetV1, conditions.IngressClassNetV1Enabled()) - }) - } -} diff --git a/internal/manager/controllerdef.go b/internal/manager/controllerdef.go index 2a8c96c753..67f15c9cb7 100644 --- a/internal/manager/controllerdef.go +++ b/internal/manager/controllerdef.go @@ -2,7 +2,6 @@ package manager import ( "context" - "fmt" "reflect" "k8s.io/apimachinery/pkg/runtime/schema" @@ -68,14 +67,6 @@ func setupControllers( kongAdminAPIEndpointsNotifier configuration.EndpointsNotifier, adminAPIsDiscoverer configuration.AdminAPIsDiscoverer, ) ([]ControllerDef, error) { - restMapper := mgr.GetClient().RESTMapper() - - // Choose the best API version of Ingress to inform which ingress controller to enable. - ingressConditions, err := NewIngressControllersConditions(c, restMapper) - if err != nil { - return nil, fmt.Errorf("ingress version picker failed: %w", err) - } - referenceIndexers := ctrlref.NewCacheIndexers() controllers := []ControllerDef{ @@ -97,7 +88,7 @@ func setupControllers( // Core API Controllers // --------------------------------------------------------------------------- { - Enabled: ingressConditions.IngressClassNetV1Enabled(), + Enabled: c.IngressClassNetV1Enabled, Controller: &configuration.NetV1IngressClassReconciler{ Client: mgr.GetClient(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("IngressClass").WithName("netv1"), @@ -107,7 +98,7 @@ func setupControllers( }, }, { - Enabled: ingressConditions.IngressNetV1Enabled(), + Enabled: c.IngressNetV1Enabled, Controller: &configuration.NetV1IngressReconciler{ Client: mgr.GetClient(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Ingress").WithName("netv1"),