-
Notifications
You must be signed in to change notification settings - Fork 592
/
backendref.go
73 lines (66 loc) · 2.21 KB
/
backendref.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package translator
import (
"fmt"
"github.com/go-logr/logr"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/kong/kubernetes-ingress-controller/v3/internal/dataplane/kongstate"
"github.com/kong/kubernetes-ingress-controller/v3/internal/gatewayapi"
"github.com/kong/kubernetes-ingress-controller/v3/internal/util"
)
func backendRefsToKongStateBackends(
logger logr.Logger,
route client.Object,
backendRefs []gatewayapi.BackendRef,
allowed map[gatewayapi.Namespace][]gatewayapi.ReferenceGrantTo,
) kongstate.ServiceBackends {
backends := kongstate.ServiceBackends{}
for _, backendRef := range backendRefs {
if util.IsBackendRefGroupKindSupported(
backendRef.Group,
backendRef.Kind,
) && newRefChecker(backendRef).IsRefAllowedByGrant(allowed) {
port := int32(-1)
if backendRef.Port != nil {
port = int32(*backendRef.Port)
}
backend := kongstate.ServiceBackend{
Name: string(backendRef.Name),
PortDef: kongstate.PortDef{
Mode: kongstate.PortModeByNumber,
Number: port,
},
Weight: backendRef.Weight,
}
if backendRef.Namespace != nil {
backend.Namespace = string(*backendRef.Namespace)
}
backends = append(backends, backend)
} else {
// we log impermissible refs rather than failing the entire rule. while we cannot actually route to
// these, we do not want a single impermissible ref to take the entire rule offline. in the case of edits,
// failing the entire rule could potentially delete routes that were previously online and in use, and
// that remain viable (because they still have some permissible backendRefs)
var (
namespace = route.GetNamespace()
kind string
)
if backendRef.Namespace != nil {
namespace = string(*backendRef.Namespace)
}
if backendRef.Kind != nil {
kind = string(*backendRef.Kind)
}
objName := fmt.Sprintf("%s %s/%s",
route.GetObjectKind().GroupVersionKind().String(),
route.GetNamespace(),
route.GetName())
logger.Error(nil, "Object requested backendRef to target, but no ReferenceGrant permits it, skipping...",
"object_name", objName,
"target_kind", kind,
"target_namespace", namespace,
"target_name", backendRef.Name,
)
}
}
return backends
}