Add supported features to the Gateway API GatewayClass status

This commit is contained in:
Romain 2024-09-17 16:40:04 +02:00 committed by GitHub
parent 1ebd12ff82
commit 42e1f2c9b1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 18 deletions

View file

@ -18,6 +18,7 @@ import (
"github.com/testcontainers/testcontainers-go/modules/k3s" "github.com/testcontainers/testcontainers-go/modules/k3s"
"github.com/testcontainers/testcontainers-go/network" "github.com/testcontainers/testcontainers-go/network"
"github.com/traefik/traefik/v3/integration/try" "github.com/traefik/traefik/v3/integration/try"
"github.com/traefik/traefik/v3/pkg/provider/kubernetes/gateway"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
kclientset "k8s.io/client-go/kubernetes" kclientset "k8s.io/client-go/kubernetes"
@ -33,7 +34,6 @@ import (
"sigs.k8s.io/gateway-api/conformance/tests" "sigs.k8s.io/gateway-api/conformance/tests"
"sigs.k8s.io/gateway-api/conformance/utils/config" "sigs.k8s.io/gateway-api/conformance/utils/config"
ksuite "sigs.k8s.io/gateway-api/conformance/utils/suite" ksuite "sigs.k8s.io/gateway-api/conformance/utils/suite"
"sigs.k8s.io/gateway-api/pkg/features"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
) )
@ -199,23 +199,7 @@ func (s *K8sConformanceSuite) TestK8sGatewayAPIConformance() {
ksuite.GatewayGRPCConformanceProfileName, ksuite.GatewayGRPCConformanceProfileName,
ksuite.GatewayTLSConformanceProfileName, ksuite.GatewayTLSConformanceProfileName,
), ),
SupportedFeatures: sets.New( SupportedFeatures: sets.New(gateway.SupportedFeatures()...),
features.SupportGateway,
features.SupportGatewayPort8080,
features.SupportGRPCRoute,
features.SupportHTTPRoute,
features.SupportHTTPRouteQueryParamMatching,
features.SupportHTTPRouteMethodMatching,
features.SupportHTTPRoutePortRedirect,
features.SupportHTTPRouteSchemeRedirect,
features.SupportHTTPRouteHostRewrite,
features.SupportHTTPRoutePathRewrite,
features.SupportHTTPRoutePathRedirect,
features.SupportHTTPRouteResponseHeaderModification,
features.SupportTLSRoute,
features.SupportHTTPRouteBackendProtocolH2C,
features.SupportHTTPRouteBackendProtocolWebSocket,
),
}) })
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -0,0 +1,23 @@
package gateway
import "sigs.k8s.io/gateway-api/pkg/features"
func SupportedFeatures() []features.SupportedFeature {
return []features.SupportedFeature{
features.SupportGateway,
features.SupportGatewayPort8080,
features.SupportGRPCRoute,
features.SupportHTTPRoute,
features.SupportHTTPRouteQueryParamMatching,
features.SupportHTTPRouteMethodMatching,
features.SupportHTTPRoutePortRedirect,
features.SupportHTTPRouteSchemeRedirect,
features.SupportHTTPRouteHostRewrite,
features.SupportHTTPRoutePathRewrite,
features.SupportHTTPRoutePathRedirect,
features.SupportHTTPRouteResponseHeaderModification,
features.SupportTLSRoute,
features.SupportHTTPRouteBackendProtocolH2C,
features.SupportHTTPRouteBackendProtocolWebSocket,
}
}

View file

@ -316,6 +316,12 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C
return nil return nil
} }
var supportedFeatures []gatev1.SupportedFeature
for _, feature := range SupportedFeatures() {
supportedFeatures = append(supportedFeatures, gatev1.SupportedFeature(feature))
}
slices.Sort(supportedFeatures)
gatewayClassNames := map[string]struct{}{} gatewayClassNames := map[string]struct{}{}
for _, gatewayClass := range gatewayClasses { for _, gatewayClass := range gatewayClasses {
if gatewayClass.Spec.ControllerName != controllerName { if gatewayClass.Spec.ControllerName != controllerName {
@ -333,6 +339,7 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C
Message: "Handled by Traefik controller", Message: "Handled by Traefik controller",
LastTransitionTime: metav1.Now(), LastTransitionTime: metav1.Now(),
}), }),
SupportedFeatures: supportedFeatures,
} }
if err := p.client.UpdateGatewayClassStatus(ctx, gatewayClass.Name, status); err != nil { if err := p.client.UpdateGatewayClassStatus(ctx, gatewayClass.Name, status); err != nil {