Skip to content
This repository has been archived by the owner on Dec 16, 2024. It is now read-only.

Commit

Permalink
GH-496 addressing comments p2
Browse files Browse the repository at this point in the history
  • Loading branch information
maksymvavilov committed Nov 16, 2023
1 parent e6f428c commit a225537
Show file tree
Hide file tree
Showing 4 changed files with 361 additions and 20 deletions.
5 changes: 2 additions & 3 deletions pkg/controllers/dnspolicy/dnspolicy_dnsrecords.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ func (r *DNSPolicyReconciler) reconcileGatewayDNSRecords(ctx context.Context, gw
log := crlog.FromContext(ctx)

gatewayWrapper := utils.NewGatewayWrapper(gw)
err := gatewayWrapper.Validate()
if err != nil {
if err := gatewayWrapper.Validate(); err != nil {
return err
}

Expand Down Expand Up @@ -168,7 +167,7 @@ func (r *DNSPolicyReconciler) buildClusterGateway(ctx context.Context, clusterNa
}

for i, addr := range gatewayAddresses {
addrType := utils.AddressTypeToSingleCluster(addr)
addrType, _ := utils.AddressTypeToSingleCluster(addr)

singleClusterAddresses[i] = gatewayv1beta1.GatewayAddress{
Type: &addrType,
Expand Down
15 changes: 8 additions & 7 deletions pkg/utils/gateway_wrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,22 +108,23 @@ func (g *GatewayWrapper) ListenerTotalAttachedRoutes(downstreamClusterName strin
}

// AddressTypeToMultiCluster returns a multi cluster version of the address type
// and a bool to indicate that provided address has supported type
// and a bool to indicate that provided address type was converted. If not - original type is returned
func AddressTypeToMultiCluster(address gatewayv1beta1.GatewayAddress) (gatewayv1beta1.AddressType, bool) {
if *address.Type == gatewayv1beta1.IPAddressType {
return MultiClusterIPAddressType, true
} else if *address.Type == gatewayv1beta1.HostnameAddressType {
return MultiClusterHostnameAddressType, true
}
return "", false
return *address.Type, false
}

// AddressTypeToSingleCluster converts provided multicluster address to single cluster version if applicable
func AddressTypeToSingleCluster(address gatewayv1beta1.GatewayAddress) gatewayv1beta1.AddressType {
// AddressTypeToSingleCluster converts provided multicluster address to single cluster version
// the bool indicates a successful conversion
func AddressTypeToSingleCluster(address gatewayv1beta1.GatewayAddress) (gatewayv1beta1.AddressType, bool) {
if *address.Type == MultiClusterIPAddressType {
return gatewayv1beta1.IPAddressType
return gatewayv1beta1.IPAddressType, true
} else if *address.Type == MultiClusterHostnameAddressType {
return gatewayv1beta1.HostnameAddressType
return gatewayv1beta1.HostnameAddressType, true
}
return *address.Type
return *address.Type, false
}
331 changes: 331 additions & 0 deletions pkg/utils/gateway_wrapper_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,331 @@
package utils

import (
"reflect"
"testing"

"sigs.k8s.io/gateway-api/apis/v1beta1"

testutil "github.com/Kuadrant/multicluster-gateway-controller/test/util"
)

func TestAddressTypeToMultiCluster(t *testing.T) {
tests := []struct {
name string
addressType v1beta1.AddressType
wantAddressType v1beta1.AddressType
converted bool
}{
{
name: "supported IP address",
addressType: v1beta1.IPAddressType,
wantAddressType: MultiClusterIPAddressType,
converted: true,
},
{
name: "supported host address",
addressType: v1beta1.HostnameAddressType,
wantAddressType: MultiClusterHostnameAddressType,
converted: true,
},
{
name: "not supported address",
addressType: v1beta1.NamedAddressType,
wantAddressType: v1beta1.NamedAddressType,
converted: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotAddressType, converted := AddressTypeToMultiCluster(v1beta1.GatewayAddress{Type: &tt.addressType})
if gotAddressType != tt.wantAddressType {
t.Errorf("AddressTypeToMultiCluster() got = %v, want %v", gotAddressType, tt.wantAddressType)
}
if converted != tt.converted {
t.Errorf("AddressTypeToMultiCluster() got1 = %v, want %v", converted, tt.converted)
}
})
}
}

func TestAddressTypeToSingleCluster(t *testing.T) {
tests := []struct {
name string
addressType v1beta1.AddressType
wantAddressType v1beta1.AddressType
converted bool
}{
{
name: "supported IP address",
addressType: MultiClusterIPAddressType,
wantAddressType: v1beta1.IPAddressType,
converted: true,
},
{
name: "supported host address",
addressType: MultiClusterHostnameAddressType,
wantAddressType: v1beta1.HostnameAddressType,
converted: true,
},
{
name: "not supported address",
addressType: v1beta1.NamedAddressType,
wantAddressType: v1beta1.NamedAddressType,
converted: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotAddressType, converted := AddressTypeToSingleCluster(v1beta1.GatewayAddress{Type: &tt.addressType})
if gotAddressType != tt.wantAddressType {
t.Errorf("AddressTypeToMultiCluster() got = %v, want %v", gotAddressType, tt.wantAddressType)
}
if converted != tt.converted {
t.Errorf("AddressTypeToMultiCluster() got1 = %v, want %v", converted, tt.converted)
}
})
}
}

func TestGatewayWrapper_GetClusterGatewayAddresses(t *testing.T) {
tests := []struct {
name string
Gateway *v1beta1.Gateway
want map[string][]v1beta1.GatewayAddress
}{
{
name: "single cluster Gateway",
Gateway: &v1beta1.Gateway{
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(v1beta1.IPAddressType),
Value: "1.1.1.1",
},
},
},
},
want: map[string][]v1beta1.GatewayAddress{
SingleClusterAddressValue: {
{
Type: testutil.Pointer(v1beta1.IPAddressType),
Value: "1.1.1.1",
},
},
},
},
{
name: "multi cluster Gateway",
Gateway: &v1beta1.Gateway{
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-control-plane/1.1.1.1",
},
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-workload-1/2.2.2.2",
},
{
Type: testutil.Pointer(MultiClusterHostnameAddressType),
Value: "kind-mgc-workload-1/boop.com",
},
},
},
},
want: map[string][]v1beta1.GatewayAddress{
"kind-mgc-control-plane": {
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "1.1.1.1",
},
},
"kind-mgc-workload-1": {
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "2.2.2.2",
},
{
Type: testutil.Pointer(MultiClusterHostnameAddressType),
Value: "boop.com",
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := NewGatewayWrapper(tt.Gateway)
if got := g.GetClusterGatewayAddresses(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("GetClusterGatewayAddresses() = %v, want %v", got, tt.want)
}
})
}
}

func TestGatewayWrapper_ListenerTotalAttachedRoutes(t *testing.T) {

tests := []struct {
name string
Gateway *v1beta1.Gateway
downstreamClusterName string
want int
}{
{
name: "single cluster gateway",
Gateway: &v1beta1.Gateway{
Spec: v1beta1.GatewaySpec{
Listeners: []v1beta1.Listener{
{
Name: "api",
},
},
},
Status: v1beta1.GatewayStatus{
Listeners: []v1beta1.ListenerStatus{
{
Name: "api",
AttachedRoutes: 1,
},
},
},
},
downstreamClusterName: SingleClusterAddressValue,
want: 1,
},
{
name: "multi cluster gateway",
Gateway: &v1beta1.Gateway{
Spec: v1beta1.GatewaySpec{
Listeners: []v1beta1.Listener{
{
Name: "api",
},
},
},
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-control-plane/1.1.1.1",
},
},
Listeners: []v1beta1.ListenerStatus{
{
Name: "kind-mgc-control-plane.api",
AttachedRoutes: 1,
},
},
},
},
downstreamClusterName: "kind-mgc-control-plane",
want: 1,
},
{
name: "invalid status listener name",
Gateway: &v1beta1.Gateway{
Spec: v1beta1.GatewaySpec{
Listeners: []v1beta1.Listener{
{
Name: "api",
},
},
},
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-control-plane/1.1.1.1",
},
},
Listeners: []v1beta1.ListenerStatus{
{
Name: "kind-mgc-control-plane-api",
AttachedRoutes: 1,
},
},
},
},
want: 0,
},
{
name: "no status",
Gateway: &v1beta1.Gateway{
Spec: v1beta1.GatewaySpec{
Listeners: []v1beta1.Listener{
{
Name: "api",
},
},
},
},
want: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := NewGatewayWrapper(tt.Gateway)
if got := g.ListenerTotalAttachedRoutes(tt.downstreamClusterName, tt.Gateway.Spec.Listeners[0]); got != tt.want {
t.Errorf("ListenerTotalAttachedRoutes() = %v, want %v", got, tt.want)
}
})
}
}

func TestGatewayWrapper_Validate(t *testing.T) {
tests := []struct {
name string
Gateway *v1beta1.Gateway
wantErr bool
}{
{
name: "Valid Gateway",
Gateway: &v1beta1.Gateway{
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-control-plane/1.1.1.1",
},
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-workload-1/2.2.2.2",
},
{
Type: testutil.Pointer(MultiClusterHostnameAddressType),
Value: "kind-mgc-workload-1/boop.com",
},
},
},
},
wantErr: false,
},
{
name: "invalid Gateway: inconsistent addresses",
Gateway: &v1beta1.Gateway{
Status: v1beta1.GatewayStatus{
Addresses: []v1beta1.GatewayAddress{
{
Type: testutil.Pointer(MultiClusterIPAddressType),
Value: "kind-mgc-control-plane/1.1.1.1",
},
{
Type: testutil.Pointer(v1beta1.NamedAddressType),
Value: "kind-mgc-workload-1/boop.com",
},
},
},
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := NewGatewayWrapper(tt.Gateway)
if err := g.Validate(); (err != nil) != tt.wantErr {
t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
Loading

0 comments on commit a225537

Please sign in to comment.