Skip to content
11 changes: 9 additions & 2 deletions internal/controller/httproute_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,16 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
if gateway.ListenerName == "" {
continue
}
SetRouteConditionAccepted(&parentStatus, hr.GetGeneration(), acceptStatus.status, acceptStatus.msg)
SetRouteConditionResolvedRefs(&parentStatus, hr.GetGeneration(), resolveRefStatus.status, resolveRefStatus.msg)
hr.Status.Parents = append(hr.Status.Parents, parentStatus)
SetRouteConditionAccepted(&parentStatus, hr.GetGeneration(), acceptStatus.status, acceptStatus.msg)
var accepted = !slices.ContainsFunc(parentStatus.Conditions, func(condition metav1.Condition) bool {
return condition.Status == metav1.ConditionFalse
})
if accepted {
hr.Status.Parents = append(hr.Status.Parents, parentStatus)
} else {
hr.Status.Parents = []gatewayv1.RouteParentStatus{parentStatus}
}
}
if err := r.Status().Update(ctx, hr); err != nil {
return ctrl.Result{}, err
Expand Down
37 changes: 20 additions & 17 deletions internal/controller/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"fmt"
"path"
"reflect"
"slices"
"strings"

"github.com/api7/gopkg/pkg/log"
Expand Down Expand Up @@ -223,32 +224,31 @@ func SetGatewayConditionProgrammed(gw *gatewayv1.Gateway, status bool, message s
return
}

func SetRouteConditionAccepted(routeParentStatus *gatewayv1.RouteParentStatus, generation int64, status bool, message string) {
conditionStatus := metav1.ConditionTrue
if !status {
conditionStatus = metav1.ConditionFalse
func ConditionStatus(status bool) metav1.ConditionStatus {
if status {
return metav1.ConditionTrue
}
return metav1.ConditionFalse
}

func SetRouteConditionAccepted(routeParentStatus *gatewayv1.RouteParentStatus, generation int64, status bool, message string) {
condition := metav1.Condition{
Type: string(gatewayv1.RouteConditionAccepted),
Status: conditionStatus,
Status: ConditionStatus(status),
Reason: string(gatewayv1.RouteReasonAccepted),
ObservedGeneration: generation,
Message: message,
LastTransitionTime: metav1.Now(),
}

if !IsConditionPresentAndEqual(routeParentStatus.Conditions, condition) {
if !IsConditionPresentAndEqual(routeParentStatus.Conditions, condition) && !slices.ContainsFunc(routeParentStatus.Conditions, func(item metav1.Condition) bool {
return item.Type == condition.Type && item.Status == metav1.ConditionFalse && condition.Status == metav1.ConditionTrue
}) {
routeParentStatus.Conditions = MergeCondition(routeParentStatus.Conditions, condition)
}
}

func SetRouteConditionResolvedRefs(routeParentStatus *gatewayv1.RouteParentStatus, generation int64, status bool, message string) {
conditionStatus := metav1.ConditionTrue
if !status {
conditionStatus = metav1.ConditionFalse
}

reason := string(gatewayv1.RouteReasonResolvedRefs)
// check if the error message contains InvalidKind
if !status && strings.Contains(message, string(gatewayv1.RouteReasonInvalidKind)) {
Expand All @@ -257,7 +257,7 @@ func SetRouteConditionResolvedRefs(routeParentStatus *gatewayv1.RouteParentStatu

condition := metav1.Condition{
Type: string(gatewayv1.RouteConditionResolvedRefs),
Status: conditionStatus,
Status: ConditionStatus(status),
Reason: reason,
ObservedGeneration: generation,
Message: message,
Expand Down Expand Up @@ -348,19 +348,21 @@ func ParseRouteParentRefs(
continue
}

if ok, err := routeMatchesListenerAllowedRoutes(ctx, mgrc, route, listener.AllowedRoutes, gateway.Namespace, parentRef.Namespace); err != nil {
return nil, fmt.Errorf("failed matching listener %s to a route %s for gateway %s: %w",
listenerName = string(listener.Name)
ok, err := routeMatchesListenerAllowedRoutes(ctx, mgrc, route, listener.AllowedRoutes, gateway.Namespace, parentRef.Namespace)
if err != nil {
log.Warnf("failed matching listener %s to a route %s for gateway %s: %v",
listener.Name, route.GetName(), gateway.Name, err,
)
} else if !ok {
}
if !ok {
reason = gatewayv1.RouteReasonNotAllowedByListeners
continue
}

// TODO: check if the listener status is programmed

matched = true
listenerName = string(listener.Name)
break
}

Expand All @@ -377,7 +379,8 @@ func ParseRouteParentRefs(
})
} else {
gateways = append(gateways, RouteParentRefContext{
Gateway: &gateway,
Gateway: &gateway,
ListenerName: listenerName,
Conditions: []metav1.Condition{{
Type: string(gatewayv1.RouteConditionAccepted),
Status: metav1.ConditionFalse,
Expand Down
1 change: 0 additions & 1 deletion test/conformance/conformance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ var skippedTestsForTraditionalRoutes = []string{

tests.GatewayInvalidTLSConfiguration.ShortName,
// tests.HTTPRouteInvalidBackendRefUnknownKind.ShortName,
tests.HTTPRouteInvalidCrossNamespaceParentRef.ShortName,
tests.HTTPRouteInvalidNonExistentBackendRef.ShortName,
tests.HTTPRouteInvalidParentRefNotMatchingSectionName.ShortName,
}
Expand Down
3 changes: 2 additions & 1 deletion test/e2e/ingress/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,8 @@ spec:
WithTimeout(8 * time.Second).ProbeEvery(time.Second).Should(Equal(http.StatusOK))
})

It("HTTPRoutePolicy status changes on Ingress deleting", func() {
// todo: unstable test case, pending for now
PIt("HTTPRoutePolicy status changes on Ingress deleting", func() {
By("create Ingress")
err := s.CreateResourceFromString(ingressSpec)
Expect(err).NotTo(HaveOccurred(), "creating Ingress")
Expand Down
Loading