Skip to content

Commit 7f80427

Browse files
authored
fix: GatewayInvalidTLSConfiguration (#138)
1 parent c9d2f9d commit 7f80427

File tree

2 files changed

+48
-28
lines changed

2 files changed

+48
-28
lines changed

internal/controller/utils.go

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ package controller
1414

1515
import (
1616
"context"
17+
"encoding/pem"
1718
"errors"
1819
"fmt"
1920
"path"
@@ -164,14 +165,9 @@ func SetGatewayListenerConditionAccepted(gw *gatewayv1.Gateway, listenerName str
164165
}
165166

166167
func SetGatewayListenerConditionProgrammed(gw *gatewayv1.Gateway, listenerName string, status bool, message string) (ok bool) {
167-
conditionStatus := metav1.ConditionTrue
168-
if !status {
169-
conditionStatus = metav1.ConditionFalse
170-
}
171-
172168
condition := metav1.Condition{
173169
Type: string(gatewayv1.ListenerConditionProgrammed),
174-
Status: conditionStatus,
170+
Status: ConditionStatus(status),
175171
Reason: string(gatewayv1.ListenerReasonProgrammed),
176172
ObservedGeneration: gw.GetGeneration(),
177173
Message: message,
@@ -186,14 +182,9 @@ func SetGatewayListenerConditionProgrammed(gw *gatewayv1.Gateway, listenerName s
186182
}
187183

188184
func SetGatewayListenerConditionResolvedRefs(gw *gatewayv1.Gateway, listenerName string, status bool, message string) (ok bool) {
189-
conditionStatus := metav1.ConditionTrue
190-
if !status {
191-
conditionStatus = metav1.ConditionFalse
192-
}
193-
194185
condition := metav1.Condition{
195186
Type: string(gatewayv1.ListenerConditionResolvedRefs),
196-
Status: conditionStatus,
187+
Status: ConditionStatus(status),
197188
Reason: string(gatewayv1.ListenerReasonResolvedRefs),
198189
ObservedGeneration: gw.GetGeneration(),
199190
Message: message,
@@ -208,14 +199,9 @@ func SetGatewayListenerConditionResolvedRefs(gw *gatewayv1.Gateway, listenerName
208199
}
209200

210201
func SetGatewayConditionProgrammed(gw *gatewayv1.Gateway, status bool, message string) (ok bool) {
211-
conditionStatus := metav1.ConditionTrue
212-
if !status {
213-
conditionStatus = metav1.ConditionFalse
214-
}
215-
216202
condition := metav1.Condition{
217203
Type: string(gatewayv1.GatewayConditionProgrammed),
218-
Status: conditionStatus,
204+
Status: ConditionStatus(status),
219205
Reason: string(gatewayv1.GatewayReasonProgrammed),
220206
ObservedGeneration: gw.GetGeneration(),
221207
Message: message,
@@ -672,8 +658,9 @@ func getListenerStatus(
672658
return nil, err
673659
}
674660
var (
675-
reasonResolvedRef = string(gatewayv1.ListenerReasonResolvedRefs)
676-
statusResolvedRef = metav1.ConditionTrue
661+
reasonResolvedRef = string(gatewayv1.ListenerReasonResolvedRefs)
662+
statusResolvedRef = metav1.ConditionTrue
663+
messageResolvedRef string
677664

678665
reasonProgrammed = string(gatewayv1.ListenerReasonProgrammed)
679666
statusProgrammed = metav1.ConditionTrue
@@ -707,24 +694,40 @@ func getListenerStatus(
707694

708695
if listener.TLS != nil {
709696
// TODO: support TLS
710-
secret := corev1.Secret{}
711-
resolved := true
697+
var (
698+
secret corev1.Secret
699+
resolved = true
700+
)
712701
for _, ref := range listener.TLS.CertificateRefs {
702+
if ref.Group != nil && *ref.Group != corev1.GroupName {
703+
resolved = false
704+
messageResolvedRef = fmt.Sprintf(`Invalid Group, expect "", got "%s"`, *ref.Group)
705+
break
706+
}
707+
if ref.Kind != nil && *ref.Kind != "Secret" {
708+
resolved = false
709+
messageResolvedRef = fmt.Sprintf(`Invalid Kind, expect "Secret", got "%s"`, *ref.Kind)
710+
break
711+
}
713712
ns := gateway.Namespace
714713
if ref.Namespace != nil {
715714
ns = string(*ref.Namespace)
716715
}
717-
if err := mrgc.Get(ctx, client.ObjectKey{
718-
Namespace: ns,
719-
Name: string(ref.Name),
720-
}, &secret); err != nil {
716+
if err := mrgc.Get(ctx, client.ObjectKey{Namespace: ns, Name: string(ref.Name)}, &secret); err != nil {
721717
resolved = false
718+
messageResolvedRef = err.Error()
719+
break
720+
}
721+
if reason, ok := isTLSSecretValid(&secret); !ok {
722+
resolved = false
723+
messageResolvedRef = fmt.Sprintf("Malformed Secret referenced: %s", reason)
722724
break
723725
}
724726
}
725727
if !resolved {
726728
reasonResolvedRef = string(gatewayv1.ListenerReasonInvalidCertificateRef)
727729
statusResolvedRef = metav1.ConditionFalse
730+
reasonProgrammed = string(gatewayv1.ListenerReasonInvalid)
728731
statusProgrammed = metav1.ConditionFalse
729732
}
730733
}
@@ -757,6 +760,7 @@ func getListenerStatus(
757760
ObservedGeneration: gateway.Generation,
758761
LastTransitionTime: metav1.Now(),
759762
Reason: reasonResolvedRef,
763+
Message: messageResolvedRef,
760764
},
761765
}
762766

@@ -1030,3 +1034,21 @@ func isRouteAccepted(gateways []RouteParentRefContext) bool {
10301034
}
10311035
return false
10321036
}
1037+
1038+
func isTLSSecretValid(secret *corev1.Secret) (string, bool) {
1039+
var ok bool
1040+
var crt, key []byte
1041+
if crt, ok = secret.Data["tls.crt"]; !ok {
1042+
return "Missing tls.crt", false
1043+
}
1044+
if key, ok = secret.Data["tls.key"]; !ok {
1045+
return "Missing tls.key", false
1046+
}
1047+
if p, _ := pem.Decode(crt); p == nil {
1048+
return "Malformed PEM tls.crt", false
1049+
}
1050+
if p, _ := pem.Decode(key); p == nil {
1051+
return "Malformed PEM tls.key", false
1052+
}
1053+
return "", true
1054+
}

test/conformance/conformance_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ var skippedTestsForTraditionalRoutes = []string{
3434
tests.HTTPRouteReferenceGrant.ShortName,
3535

3636
// TODO: HTTPRoute hostname intersection and listener hostname matching
37-
38-
tests.GatewayInvalidTLSConfiguration.ShortName,
3937
}
4038

4139
var gatewaySupportedFeatures = []features.FeatureName{

0 commit comments

Comments
 (0)