@@ -23,8 +23,11 @@ import (
2323
2424 apierrs "k8s.io/apimachinery/pkg/api/errors"
2525 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+ "k8s.io/apimachinery/pkg/labels"
27+ "k8s.io/apimachinery/pkg/util/sets"
2628
2729 "knative.dev/net-gateway-api/pkg/reconciler/ingress/config"
30+ "knative.dev/net-gateway-api/pkg/reconciler/ingress/resources"
2831 "knative.dev/net-gateway-api/pkg/status"
2932 "knative.dev/networking/pkg/apis/networking/v1alpha1"
3033 ingressreconciler "knative.dev/networking/pkg/client/injection/reconciler/networking/v1alpha1/ingress"
@@ -102,7 +105,10 @@ func (c *Reconciler) reconcileIngress(ctx context.Context, ing *v1alpha1.Ingress
102105
103106 routesReady := true
104107
108+ desiredRouteNames := sets .New [string ]()
105109 for _ , rule := range ing .Spec .Rules {
110+ desiredRouteNames .Insert (resources .LongestHost (rule .Hosts ))
111+
106112 httproute , probeTargets , err := c .reconcileHTTPRoute (ctx , ingressHash , ing , & rule )
107113 if err != nil {
108114 return err
@@ -123,6 +129,26 @@ func (c *Reconciler) reconcileIngress(ctx context.Context, ing *v1alpha1.Ingress
123129 }
124130 }
125131
132+ // Delete HTTPRoutes that don't exist in the current Spec (i.e., tags removed and no longer referenced)
133+ {
134+ existingRoutes , err := c .httprouteLister .HTTPRoutes (ing .Namespace ).List (labels .Everything ())
135+ if err != nil {
136+ return fmt .Errorf ("failed to list HTTPRoutes: %w" , err )
137+ }
138+ for _ , r := range existingRoutes {
139+ // Don't touch routes not owned by this Ingress
140+ if ! metav1 .IsControlledBy (r , ing ) {
141+ continue
142+ }
143+ // Not in the desired set = unnecessary
144+ if ! desiredRouteNames .Has (r .Name ) {
145+ if err := c .gwapiclient .GatewayV1 ().HTTPRoutes (r .Namespace ).Delete (ctx , r .Name , metav1.DeleteOptions {}); err != nil && ! apierrs .IsNotFound (err ) {
146+ return fmt .Errorf ("failed to delete stale HTTPRoute %s/%s: %w" , r .Namespace , r .Name , err )
147+ }
148+ }
149+ }
150+ }
151+
126152 externalIngressTLS := ing .GetIngressTLSForVisibility (v1alpha1 .IngressVisibilityExternalIP )
127153 listeners := make ([]* gatewayapi.Listener , 0 , len (externalIngressTLS ))
128154 for _ , tls := range externalIngressTLS {
0 commit comments