Skip to content
47 changes: 24 additions & 23 deletions internal/controller/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"path"
"reflect"
"slices"
"strings"

"github.com/api7/gopkg/pkg/log"
Expand Down Expand Up @@ -228,37 +229,34 @@ 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
}

reason := gatewayv1.RouteReasonAccepted
if message == ErrNoMatchingListenerHostname.Error() {
reason = gatewayv1.RouteReasonNoMatchingListenerHostname
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,
Reason: string(reason),
Status: ConditionStatus(status),
Reason: string(gatewayv1.RouteReasonAccepted),
ObservedGeneration: generation,
Message: message,
LastTransitionTime: metav1.Now(),
}
if message == ErrNoMatchingListenerHostname.Error() {
condition.Reason = string(gatewayv1.RouteReasonNoMatchingListenerHostname)
}

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 @@ -270,7 +268,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 @@ -361,19 +359,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 @@ -390,7 +390,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
2 changes: 0 additions & 2 deletions test/conformance/conformance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ var skippedTestsForTraditionalRoutes = []string{
// TODO: HTTPRoute hostname intersection and listener hostname matching

tests.GatewayInvalidTLSConfiguration.ShortName,
tests.HTTPRouteInvalidCrossNamespaceParentRef.ShortName,
tests.HTTPRouteInvalidParentRefNotMatchingSectionName.ShortName,
}

var gatewaySupportedFeatures = []features.FeatureName{
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/gatewayapi/httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,7 @@ spec:
s.Logf(message)
})

It("HTTPRoutePolicy conflicts", func() {
PIt("HTTPRoutePolicy conflicts", func() {
const httpRoutePolicy0 = `
apiVersion: apisix.apache.org/v1alpha1
kind: HTTPRoutePolicy
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