Do not update gateway status when not selected by a gateway class
Co-authored-by: Romain <rtribotte@users.noreply.github.com>
This commit is contained in:
parent
7b08ecfa5e
commit
1508a2c221
3 changed files with 99 additions and 5 deletions
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: GatewayClass
|
||||||
|
metadata:
|
||||||
|
name: traefik-internal
|
||||||
|
labels:
|
||||||
|
name: traefik-internal
|
||||||
|
spec:
|
||||||
|
controllerName: traefik.io/gateway-controller
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: Gateway
|
||||||
|
metadata:
|
||||||
|
name: traefik-internal
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
gatewayClassName: traefik-internal
|
||||||
|
listeners:
|
||||||
|
- name: http
|
||||||
|
protocol: HTTP
|
||||||
|
port: 9080
|
||||||
|
allowedRoutes:
|
||||||
|
namespaces:
|
||||||
|
from: Same
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: GatewayClass
|
||||||
|
metadata:
|
||||||
|
name: traefik-external
|
||||||
|
labels:
|
||||||
|
name: traefik-external
|
||||||
|
spec:
|
||||||
|
controllerName: traefik.io/gateway-controller
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: Gateway
|
||||||
|
metadata:
|
||||||
|
name: traefik-external
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
gatewayClassName: traefik-external
|
||||||
|
listeners:
|
||||||
|
- name: http
|
||||||
|
protocol: HTTP
|
||||||
|
port: 9080
|
||||||
|
allowedRoutes:
|
||||||
|
namespaces:
|
||||||
|
from: Same
|
|
@ -357,7 +357,13 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gateways := p.client.ListGateways()
|
var gateways []*gatev1.Gateway
|
||||||
|
for _, gateway := range p.client.ListGateways() {
|
||||||
|
if _, ok := gatewayClassNames[string(gateway.Spec.GatewayClassName)]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
gateways = append(gateways, gateway)
|
||||||
|
}
|
||||||
|
|
||||||
var gatewayListeners []gatewayListener
|
var gatewayListeners []gatewayListener
|
||||||
for _, gateway := range gateways {
|
for _, gateway := range gateways {
|
||||||
|
@ -366,10 +372,6 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C
|
||||||
Str("namespace", gateway.Namespace).
|
Str("namespace", gateway.Namespace).
|
||||||
Logger()
|
Logger()
|
||||||
|
|
||||||
if _, ok := gatewayClassNames[string(gateway.Spec.GatewayClassName)]; !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
gatewayListeners = append(gatewayListeners, p.loadGatewayListeners(logger.WithContext(ctx), gateway, conf)...)
|
gatewayListeners = append(gatewayListeners, p.loadGatewayListeners(logger.WithContext(ctx), gateway, conf)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,47 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGatewayClassLabelSelector(t *testing.T) {
|
||||||
|
k8sObjects, gwObjects := readResources(t, []string{"gatewayclass_labelselector.yaml"})
|
||||||
|
|
||||||
|
kubeClient := kubefake.NewSimpleClientset(k8sObjects...)
|
||||||
|
gwClient := newGatewaySimpleClientSet(t, gwObjects...)
|
||||||
|
|
||||||
|
client := newClientImpl(kubeClient, gwClient)
|
||||||
|
|
||||||
|
// This is initialized by the Provider init method but this cannot be called in a unit test.
|
||||||
|
client.labelSelector = "name=traefik-internal"
|
||||||
|
|
||||||
|
eventCh, err := client.WatchAll(nil, make(chan struct{}))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if len(k8sObjects) > 0 || len(gwObjects) > 0 {
|
||||||
|
// just wait for the first event
|
||||||
|
<-eventCh
|
||||||
|
}
|
||||||
|
|
||||||
|
p := Provider{
|
||||||
|
EntryPoints: map[string]Entrypoint{"http": {Address: ":9080"}},
|
||||||
|
StatusAddress: &StatusAddress{IP: "1.2.3.4"},
|
||||||
|
client: client,
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = p.loadConfigurationFromGateways(context.Background())
|
||||||
|
|
||||||
|
gw, err := gwClient.GatewayV1().Gateways("default").Get(context.Background(), "traefik-external", metav1.GetOptions{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Empty(t, gw.Status.Addresses)
|
||||||
|
|
||||||
|
gw, err = gwClient.GatewayV1().Gateways("default").Get(context.Background(), "traefik-internal", metav1.GetOptions{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, gw.Status.Addresses, 1)
|
||||||
|
require.NotNil(t, gw.Status.Addresses[0].Type)
|
||||||
|
|
||||||
|
assert.Equal(t, gatev1.IPAddressType, *gw.Status.Addresses[0].Type)
|
||||||
|
assert.Equal(t, "1.2.3.4", gw.Status.Addresses[0].Value)
|
||||||
|
}
|
||||||
|
|
||||||
func TestLoadHTTPRoutes(t *testing.T) {
|
func TestLoadHTTPRoutes(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
|
|
Loading…
Reference in a new issue