Skip to content

Commit

Permalink
Merge branch 'main' into migrate-todos
Browse files Browse the repository at this point in the history
  • Loading branch information
pmalek authored May 28, 2024
2 parents fb95bf2 + 3fe8af0 commit 376a03d
Show file tree
Hide file tree
Showing 7 changed files with 309 additions and 10 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/__build-workflow.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ jobs:
- name: Log in to the Container registry
if: ${{ inputs.push }}
uses: docker/login-action@v3.1.0
uses: docker/login-action@v3.2.0
with:
registry: ${{ inputs.registry }}
username: ${{ inputs.username }}
Expand Down Expand Up @@ -311,7 +311,7 @@ jobs:

- name: Log in to the Container registry
if: ${{ inputs.push }}
uses: docker/login-action@v3.1.0
uses: docker/login-action@v3.2.0
with:
registry: ${{ inputs.registry }}
username: ${{ inputs.username }}
Expand Down
2 changes: 1 addition & 1 deletion .tools_versions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ controller-tools: "0.15.0"
# renovate: datasource=github-releases depName=kubernetes-sigs/kustomize
kustomize: "5.4.1"
# renovate: datasource=github-releases depName=golangci/golangci-lint
golangci-lint: "1.58.2"
golangci-lint: "1.59.0"
# renovate: datasource=github-releases depName=GoogleContainerTools/skaffold
skaffold: "2.12.0"
# renovate: datasource=github-releases depName=go-delve/delve
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ require (
k8s.io/api v0.30.1
k8s.io/apimachinery v0.30.1
k8s.io/client-go v0.30.1
sigs.k8s.io/controller-runtime v0.18.2
sigs.k8s.io/controller-runtime v0.18.3
sigs.k8s.io/gateway-api v1.1.0
)

Expand Down Expand Up @@ -182,7 +182,7 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.30.0
k8s.io/apiextensions-apiserver v0.30.1
k8s.io/component-base v0.30.1 // indirect
k8s.io/klog/v2 v2.120.1 // indirect
k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -603,8 +603,8 @@ k8s.io/kubernetes v1.30.1 h1:XlqS6KslLEA5mQzLK2AJrhr4Z1m8oJfkhHiWJ5lue+I=
k8s.io/kubernetes v1.30.1/go.mod h1:yPbIk3MhmhGigX62FLJm+CphNtjxqCvAIFQXup6RKS0=
k8s.io/utils v0.0.0-20240423183400-0849a56e8f22 h1:ao5hUqGhsqdm+bYbjH/pRkCs0unBGe9UyDahzs9zQzQ=
k8s.io/utils v0.0.0-20240423183400-0849a56e8f22/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q=
sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw=
sigs.k8s.io/controller-runtime v0.18.3 h1:B5Wmmo8WMWK7izei+2LlXLVDGzMwAHBNLX68lwtlSR4=
sigs.k8s.io/controller-runtime v0.18.3/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
sigs.k8s.io/gateway-api v1.1.0 h1:DsLDXCi6jR+Xz8/xd0Z1PYl2Pn0TyaFMOPPZIj4inDM=
sigs.k8s.io/gateway-api v1.1.0/go.mod h1:ZH4lHrL2sDi0FHZ9jjneb8kKnGzFWyrTya35sWUTrRs=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
Expand Down
5 changes: 5 additions & 0 deletions internal/types/gatewaytypes.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,17 @@ type (
CommonRouteSpec = gatewayv1.CommonRouteSpec
Kind = gatewayv1.Kind
Group = gatewayv1.Group
Namespace = gatewayv1.Namespace
AllowedRoutes = gatewayv1.AllowedRoutes
RouteGroupKind = gatewayv1.RouteGroupKind
RouteNamespaces = gatewayv1.RouteNamespaces
ObjectName = gatewayv1.ObjectName
SectionName = gatewayv1.SectionName
PortNumber = gatewayv1.PortNumber
)

var GroupVersion = gatewayv1.GroupVersion

const (
HTTPProtocolType = gatewayv1.HTTPProtocolType

Expand Down
28 changes: 25 additions & 3 deletions pkg/utils/gateway/ownerrefs.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,31 @@ func ListHTTPRoutesForGateway(
for _, httpRoute := range httpRoutesList.Items {
if !lo.ContainsBy(httpRoute.Spec.ParentRefs, func(parentRef gwtypes.ParentReference) bool {
gwGVK := gateway.GroupVersionKind()
return (parentRef.Group != nil && string(*parentRef.Group) == gwGVK.Group) &&
(parentRef.Kind != nil && string(*parentRef.Kind) == gwGVK.Kind) &&
string(parentRef.Name) == gateway.Name
if parentRef.Group != nil && string(*parentRef.Group) != gwGVK.Group {
return false
}
if parentRef.Kind != nil && string(*parentRef.Kind) != gwGVK.Kind {
return false
}
if string(parentRef.Name) != gateway.Name {
return false
}

if parentRef.SectionName != nil {
if !lo.ContainsBy(gateway.Spec.Listeners, func(listener gwtypes.Listener) bool {
if listener.Name != *parentRef.SectionName {
return false
}
if parentRef.Port != nil && listener.Port != *parentRef.Port {
return false
}
return true
}) {
return false
}
}

return true
}) {
continue
}
Expand Down
272 changes: 272 additions & 0 deletions pkg/utils/gateway/ownerrefs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
package gateway

import (
"context"
"testing"

"github.com/samber/lo"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"

gwtypes "github.com/kong/gateway-operator/internal/types"
"github.com/kong/gateway-operator/modules/manager/scheme"
)

func TestListHTTPRoutesForGateway(t *testing.T) {
testCases := []struct {
name string
httpRoutes []client.Object
gateway *gwtypes.Gateway
expected []gwtypes.HTTPRoute
expectedErr bool
}{
{
name: "returns HTTPRoute for a Gateway",
httpRoutes: []client.Object{
&gwtypes.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
},
},
},
},
},
},
gateway: &gwtypes.Gateway{
TypeMeta: metav1.TypeMeta{
Kind: "Gateway",
APIVersion: gwtypes.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "gw-1",
Namespace: "default",
},
},
expected: []gwtypes.HTTPRoute{
{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
},
},
},
},
},
},
},
{
name: "does not return HTTPRoute for a Gateway when it is not a parent",
httpRoutes: []client.Object{
&gwtypes.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{},
},
},
gateway: &gwtypes.Gateway{
TypeMeta: metav1.TypeMeta{
Kind: "Gateway",
APIVersion: gwtypes.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "gw-1",
Namespace: "default",
},
},
expected: nil,
},
{
name: "returns HTTPRoute when section name does match",
httpRoutes: []client.Object{
&gwtypes.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
SectionName: lo.ToPtr(gwtypes.SectionName("http")),
},
},
},
},
},
},
gateway: &gwtypes.Gateway{
TypeMeta: metav1.TypeMeta{
Kind: "Gateway",
APIVersion: gwtypes.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "gw-1",
Namespace: "default",
},
Spec: gwtypes.GatewaySpec{
Listeners: []gwtypes.Listener{
{
Name: "http",
Port: 80,
},
},
},
},
expected: []gwtypes.HTTPRoute{
{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
SectionName: lo.ToPtr(gwtypes.SectionName("http")),
},
},
},
},
},
},
},
{
name: "does not return HTTPRoute when section name does not match",
httpRoutes: []client.Object{
&gwtypes.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
SectionName: lo.ToPtr(gwtypes.SectionName("http-1")),
},
},
},
},
},
},
gateway: &gwtypes.Gateway{
TypeMeta: metav1.TypeMeta{
Kind: "Gateway",
APIVersion: gwtypes.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "gw-1",
Namespace: "default",
},
Spec: gwtypes.GatewaySpec{
Listeners: []gwtypes.Listener{
{
Name: "http",
Port: 80,
},
},
},
},
expected: nil,
},
{
name: "does not return HTTPRoute when port does not match",
httpRoutes: []client.Object{
&gwtypes.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Name: "http-route-1",
Namespace: "default",
ResourceVersion: "1",
},
Spec: gwtypes.HTTPRouteSpec{
CommonRouteSpec: gwtypes.CommonRouteSpec{
ParentRefs: []gwtypes.ParentReference{
{
Group: lo.ToPtr(gwtypes.Group(gwtypes.GroupVersion.Group)),
Kind: lo.ToPtr(gwtypes.Kind("Gateway")),
Name: gwtypes.ObjectName("gw-1"),
SectionName: lo.ToPtr(gwtypes.SectionName("http")),
Port: lo.ToPtr(gwtypes.PortNumber(8080)),
},
},
},
},
},
},
gateway: &gwtypes.Gateway{
TypeMeta: metav1.TypeMeta{
Kind: "Gateway",
APIVersion: gwtypes.GroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: "gw-1",
Namespace: "default",
},
Spec: gwtypes.GatewaySpec{
Listeners: []gwtypes.Listener{
{
Name: "http",
Port: 80,
},
},
},
},
expected: nil,
},
}

for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
cl := fake.NewClientBuilder().
WithScheme(scheme.Get()).
WithObjects(tc.gateway).
WithObjects(tc.httpRoutes...).
Build()
routes, err := ListHTTPRoutesForGateway(context.Background(), cl, tc.gateway)
if tc.expectedErr {
require.Error(t, err)
} else {
require.NoError(t, err)
require.Equal(t, tc.expected, routes)
}
})

}
}

0 comments on commit 376a03d

Please sign in to comment.