Skip to content

Commit 5ea0b7b

Browse files
committed
feat(routing): complete Gateway API solver integration, fix spec drift and watches
1 parent e0d53c1 commit 5ea0b7b

7 files changed

Lines changed: 21 additions & 4 deletions

File tree

controllers/controller/devworkspacerouting/devworkspacerouting_controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"sigs.k8s.io/controller-runtime/pkg/controller"
4141
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4242
"sigs.k8s.io/controller-runtime/pkg/reconcile"
43+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
4344

4445
controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1"
4546
)
@@ -371,7 +372,8 @@ func (r *DevWorkspaceRoutingReconciler) SetupWithManager(mgr ctrl.Manager) error
371372
WithOptions(controller.Options{MaxConcurrentReconciles: maxConcurrentReconciles}).
372373
For(&controllerv1alpha1.DevWorkspaceRouting{}).
373374
Owns(&corev1.Service{}).
374-
Owns(&networkingv1.Ingress{})
375+
Owns(&networkingv1.Ingress{}).
376+
Owns(&gwapiv1.HTTPRoute{})
375377
if infrastructure.IsOpenShift() {
376378
bld.Owns(&routeV1.Route{})
377379
}

controllers/controller/devworkspacerouting/devworkspacerouting_controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,8 +561,8 @@ var _ = Describe("DevWorkspaceRouting Controller", func() {
561561
if filter.Type == gwapiv1.HTTPRouteFilterRequestRedirect {
562562
hasRedirectFilter = true
563563
Expect(filter.RequestRedirect).ShouldNot(BeNil(), "Redirect filter should have RequestRedirect configuration")
564-
Expect(*filter.RequestRedirect.Scheme).Should(Equal(gwapiv1.HTTPSProtocolType), "Redirect should be to HTTPS")
565-
Expect(*filter.RequestRedirect.StatusCode).Should(Equal(308), "Redirect should use 308 status code")
564+
Expect(*filter.RequestRedirect.Scheme).Should(Equal("https"), "Redirect should be to HTTPS")
565+
Expect(*filter.RequestRedirect.StatusCode).Should(Equal(301), "Redirect should use 301 status code")
566566
}
567567
}
568568
Expect(hasRedirectFilter).Should(BeTrue(), "HTTP redirect HTTPRoute should have a redirect filter")

controllers/controller/devworkspacerouting/solvers/gateway_api_solver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func (s *GatewayAPISolver) createHTTPRedirectRoute(
131131
routeName := fmt.Sprintf("%s-http-redirect", common.RouteName(workspaceMeta.DevWorkspaceId, endpointName))
132132

133133
httpsScheme := "https"
134-
statusCode := 308
134+
statusCode := 301
135135

136136
pathPrefix := gwapiv1.PathMatchPathPrefix
137137
pathValue := "/"

main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import (
5858
"sigs.k8s.io/controller-runtime/pkg/log/zap"
5959
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
6060
ctrl_webhook "sigs.k8s.io/controller-runtime/pkg/webhook"
61+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
6162
// +kubebuilder:scaffold:imports
6263
)
6364

@@ -79,6 +80,7 @@ func init() {
7980
utilruntime.Must(controllerv1alpha1.AddToScheme(scheme))
8081
utilruntime.Must(dwv1.AddToScheme(scheme))
8182
utilruntime.Must(dwv2.AddToScheme(scheme))
83+
utilruntime.Must(gwapiv1.AddToScheme(scheme))
8284

8385
if infrastructure.IsOpenShift() {
8486
utilruntime.Must(routev1.Install(scheme))

pkg/config/sync.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ func mergeConfig(from, to *controller.OperatorConfiguration) {
277277
if from.Routing.ClusterHostSuffix != "" {
278278
to.Routing.ClusterHostSuffix = from.Routing.ClusterHostSuffix
279279
}
280+
if from.Routing.GatewayRef != nil {
281+
to.Routing.GatewayRef = from.Routing.GatewayRef.DeepCopy()
282+
}
280283
if from.Routing.ProxyConfig != nil {
281284
if to.Routing.ProxyConfig == nil {
282285
to.Routing.ProxyConfig = &controller.Proxy{}

pkg/provision/sync/diff.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3232
"k8s.io/utils/pointer"
3333
crclient "sigs.k8s.io/controller-runtime/pkg/client"
34+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
3435
)
3536

3637
// diffFunc represents a function that compares a spec object against the corresponding cluster object and
@@ -50,6 +51,7 @@ var diffFuncs = map[reflect.Type]diffFunc{
5051
reflect.TypeOf(corev1.Service{}): allDiffFuncs(metadataDiffFunc, serviceDiffFunc),
5152
reflect.TypeOf(networkingv1.Ingress{}): allDiffFuncs(metadataDiffFunc, basicDiffFunc(ingressDiffOpts)),
5253
reflect.TypeOf(routev1.Route{}): allDiffFuncs(metadataDiffFunc, basicDiffFunc(routeDiffOpts)),
54+
reflect.TypeOf(gwapiv1.HTTPRoute{}): allDiffFuncs(metadataDiffFunc, basicDiffFunc(httpRouteDiffOpts)),
5355
}
5456

5557
// basicDiffFunc returns a diffFunc that specifies an object needs an update if cmp.Equal fails

pkg/provision/sync/diffopts.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
corev1 "k8s.io/api/core/v1"
2525
networkingv1 "k8s.io/api/networking/v1"
2626
rbacv1 "k8s.io/api/rbac/v1"
27+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2728
)
2829

2930
var roleDiffOpts = cmp.Options{
@@ -92,6 +93,13 @@ var ingressDiffOpts = cmp.Options{
9293
cmpopts.IgnoreFields(networkingv1.HTTPIngressPath{}, "PathType"),
9394
}
9495

96+
var httpRouteDiffOpts = cmp.Options{
97+
cmpopts.IgnoreFields(gwapiv1.HTTPRoute{}, "TypeMeta", "ObjectMeta", "Status"),
98+
cmpopts.IgnoreFields(gwapiv1.BackendRef{}, "Weight"),
99+
cmpopts.IgnoreFields(gwapiv1.BackendObjectReference{}, "Group", "Kind", "Namespace"),
100+
cmpopts.IgnoreFields(gwapiv1.ParentReference{}, "Group", "Kind", "Namespace"),
101+
}
102+
95103
func getNameFromEnvFrom(source corev1.EnvFromSource) string {
96104
switch {
97105
case source.ConfigMapRef != nil:

0 commit comments

Comments
 (0)