Skip to content

Commit

Permalink
add unit tests for translation failures
Browse files Browse the repository at this point in the history
  • Loading branch information
randmonkey committed May 18, 2023
1 parent 396bdeb commit daf081c
Show file tree
Hide file tree
Showing 2 changed files with 226 additions and 5 deletions.
199 changes: 199 additions & 0 deletions internal/dataplane/parser/translate_failures_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
package parser

import (
"strings"
"testing"

"github.com/samber/lo"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
knative "knative.dev/networking/pkg/apis/networking/v1alpha1"
"sigs.k8s.io/controller-runtime/pkg/client"
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"

"github.com/kong/kubernetes-ingress-controller/v2/internal/annotations"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/failures"
"github.com/kong/kubernetes-ingress-controller/v2/internal/store"
kongv1beta1 "github.com/kong/kubernetes-ingress-controller/v2/pkg/apis/configuration/v1beta1"
)

// This file contains unit test functions to test translation failures genreated by parser.

func TestTranslationFailureUnsupportedObjectsExpressionRoutes(t *testing.T) {
testCases := []struct {
name string
objects store.FakeObjects
causingObjects []client.Object
}{
{
name: "knative.Ingresses are not supported",
objects: store.FakeObjects{
KnativeIngresses: []*knative.Ingress{
{
TypeMeta: metav1.TypeMeta{
Kind: "Ingress",
APIVersion: knative.SchemeGroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "knative-ing-1",
Namespace: "default",
Annotations: map[string]string{
annotations.KnativeIngressClassKey: annotations.DefaultIngressClass,
},
},
Spec: knative.IngressSpec{},
},
},
},
causingObjects: []client.Object{
&knative.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "knative-ing-1",
Namespace: "default",
},
},
},
},
{
name: "TCPIngresses and UDPIngresses are not supported",
objects: store.FakeObjects{
TCPIngresses: []*kongv1beta1.TCPIngress{
{
TypeMeta: metav1.TypeMeta{
Kind: "TCPIngress",
APIVersion: kongv1beta1.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "tcpingress-1",
Namespace: "default",
Annotations: map[string]string{
annotations.IngressClassKey: annotations.DefaultIngressClass,
},
},
},
},
UDPIngresses: []*kongv1beta1.UDPIngress{
{
TypeMeta: metav1.TypeMeta{
Kind: "UDPIngress",
APIVersion: kongv1beta1.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "udpingress-1",
Namespace: "default",
Annotations: map[string]string{
annotations.IngressClassKey: annotations.DefaultIngressClass,
},
},
},
},
},
causingObjects: []client.Object{
&kongv1beta1.TCPIngress{
ObjectMeta: metav1.ObjectMeta{
Name: "tcpingress-1",
Namespace: "default",
},
},
&kongv1beta1.UDPIngress{
ObjectMeta: metav1.ObjectMeta{
Name: "udpingress-1",
Namespace: "default",
},
},
},
},
{
name: "TCPRoutes, UDPRoutes and TLSRoutes in gateway APIs are not supported",
objects: store.FakeObjects{
TCPRoutes: []*gatewayv1alpha2.TCPRoute{
{
TypeMeta: metav1.TypeMeta{
Kind: "TCPRoute",
APIVersion: gatewayv1alpha2.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "tcproute-1",
Namespace: "default",
},
},
},
UDPRoutes: []*gatewayv1alpha2.UDPRoute{
{
TypeMeta: metav1.TypeMeta{
Kind: "UDPRoute",
APIVersion: gatewayv1alpha2.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "udproute-1",
Namespace: "default",
},
},
},
TLSRoutes: []*gatewayv1alpha2.TLSRoute{
{
TypeMeta: metav1.TypeMeta{
Kind: "TLSRoute",
APIVersion: gatewayv1alpha2.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "tlsroute-1",
Namespace: "default",
},
},
},
},
causingObjects: []client.Object{
&gatewayv1alpha2.TCPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "tcproute-1",
Namespace: "default",
},
},
&gatewayv1alpha2.UDPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "udproute-1",
Namespace: "default",
},
},
&gatewayv1alpha2.TLSRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "tlsroute-1",
Namespace: "default",
},
},
},
},
}

for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
storer, err := store.NewFakeStore(tc.objects)
require.NoError(t, err)

parser := mustNewParser(t, storer)
parser.featureFlags.ExpressionRoutes = true

result := parser.BuildKongConfig()
t.Log(result.TranslationFailures)
for _, object := range tc.causingObjects {
require.True(t, lo.ContainsBy(result.TranslationFailures, func(f failures.ResourceFailure) bool {
msg := f.Message()
if !strings.Contains(msg, "not supported when expression routes enabled") {
return false
}

causingObjects := f.CausingObjects()
if len(causingObjects) != 1 {
return false
}
causingObject := causingObjects[0]
return object.GetNamespace() == causingObject.GetNamespace() &&
object.GetName() == causingObject.GetName()
}))
}
})

}
}
32 changes: 27 additions & 5 deletions test/integration/translation_failures_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
ktfkong "github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/kong"
"github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/generators"
"github.com/samber/lo"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
netv1 "k8s.io/api/networking/v1"
Expand Down Expand Up @@ -480,6 +481,10 @@ func TestTranslationFailuresUnsupportedObjectsWithExpressionRoutes(t *testing.T)
{
name: "1-TCPIngresses are not supported",
object: &kongv1beta1.TCPIngress{
TypeMeta: metav1.TypeMeta{
Kind: "TCPIngress",
APIVersion: kongv1beta1.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "tcpingress-1",
Annotations: map[string]string{
Expand All @@ -492,6 +497,10 @@ func TestTranslationFailuresUnsupportedObjectsWithExpressionRoutes(t *testing.T)
{
name: "2-TCPRoutes are not supported",
object: &gatewayv1alpha2.TCPRoute{
TypeMeta: metav1.TypeMeta{
Kind: "TCPRoute",
APIVersion: gatewayv1alpha2.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "tcproute-1",
},
Expand Down Expand Up @@ -551,7 +560,9 @@ func TestTranslationFailuresUnsupportedObjectsWithExpressionRoutes(t *testing.T)
require.NoError(t, err)
cleaner.Add(tc.object)

require.Eventually(t, func() bool {
var checkEventsErr error
if !assert.Eventually(t, func() bool {
checkEventsErr = nil
events, err := env.Cluster().Client().CoreV1().Events(ns.GetName()).List(ctx, metav1.ListOptions{
FieldSelector: fmt.Sprintf(
"reason=%s,type=%s,involvedObject.name=%s",
Expand All @@ -560,9 +571,14 @@ func TestTranslationFailuresUnsupportedObjectsWithExpressionRoutes(t *testing.T)
tc.object.GetName(),
),
})
require.NoError(t, err)

if err != nil {
checkEventsErr = fmt.Errorf("failed to list events: %w", err)
return false
}
if len(events.Items) == 0 {
checkEventsErr = fmt.Errorf("no events attached to %s %s",
tc.object.GetObjectKind().GroupVersionKind().Kind, tc.object.GetName(),
)
return false
}

Expand All @@ -571,9 +587,15 @@ func TestTranslationFailuresUnsupportedObjectsWithExpressionRoutes(t *testing.T)
return true
}
}

checkEventsErr = fmt.Errorf("no events with type %s attached to %s %s",
dataplane.KongConfigurationTranslationFailedEventReason,
tc.object.GetObjectKind().GroupVersionKind().Kind, tc.object.GetName(),
)
return false
}, time.Minute, time.Second)
}, time.Minute, time.Second) {
t.Logf("failed to check translation failure event attached to object: %v", checkEventsErr)
t.Fail()
}
})
}
}

0 comments on commit daf081c

Please sign in to comment.