Skip to content

Commit 7716bfc

Browse files
committed
feat: support translate backendtrafficpolicy CRD
1 parent 2b5f4fb commit 7716bfc

File tree

15 files changed

+345
-45
lines changed

15 files changed

+345
-45
lines changed

api/adc/types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ type Route struct {
128128
}
129129

130130
type Timeout struct {
131-
Connect float64 `json:"connect"`
132-
Read float64 `json:"read"`
133-
Send float64 `json:"send"`
131+
Connect *int64 `json:"connect,omitempty"`
132+
Read *int64 `json:"read,omitempty"`
133+
Send *int64 `json:"send,omitempty"`
134134
}
135135

136136
type StreamRoute struct {

api/v1alpha1/backendtrafficpolicy_types.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package v1alpha1
22

33
import (
44
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5-
6-
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
75
)
86

97
// +kubebuilder:object:root=true
@@ -12,8 +10,8 @@ type BackendTrafficPolicy struct {
1210
metav1.TypeMeta `json:",inline"`
1311
metav1.ObjectMeta `json:"metadata,omitempty"`
1412

15-
Spec BackendTrafficPolicySpec `json:"spec,omitempty"`
16-
Status gatewayv1alpha2.PolicyStatus `json:"status,omitempty"`
13+
Spec BackendTrafficPolicySpec `json:"spec,omitempty"`
14+
Status PolicyStatus `json:"status,omitempty"`
1715
}
1816

1917
type BackendTrafficPolicySpec struct {
@@ -27,7 +25,7 @@ type BackendTrafficPolicySpec struct {
2725
// +listMapKey=name
2826
// +kubebuilder:validation:MinItems=1
2927
// +kubebuilder:validation:MaxItems=16
30-
TargetRefs []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"`
28+
TargetRefs []BackendPolicyTargetReferenceWithSectionName `json:"targetRefs"`
3129
// LoadBalancer represents the load balancer configuration for Kubernetes Service.
3230
// The default strategy is round robin.
3331
LoadBalancer *LoadBalancer `json:"loadbalancer,omitempty" yaml:"loadbalancer,omitempty"`

api/v1alpha1/policies_type.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package v1alpha1
2+
3+
import gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
4+
5+
type PolicyStatus gatewayv1alpha2.PolicyStatus
6+
7+
// +kubebuilder:validation:XValidation:rule="self.kind == 'Service' && self.group == \"\""
8+
type BackendPolicyTargetReferenceWithSectionName gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 45 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/gateway.apisix.io_backendtrafficpolicies.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ spec:
153153
- kind
154154
- name
155155
type: object
156+
x-kubernetes-validations:
157+
- rule: self.kind == 'Service' && self.group == ""
156158
maxItems: 16
157159
minItems: 1
158160
type: array

internal/controller/consumer_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (r *ConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
136136
}
137137

138138
var statusErr error
139-
tctx := provider.NewDefaultTranslateContext()
139+
tctx := provider.NewDefaultTranslateContext(ctx)
140140

141141
if err := r.processSpec(ctx, tctx, consumer); err != nil {
142142
r.Log.Error(err, "failed to process consumer spec", "consumer", consumer)

internal/controller/httproute_controller.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
112112
return ctrl.Result{}, nil
113113
}
114114

115-
tctx := provider.NewDefaultTranslateContext()
115+
tctx := provider.NewDefaultTranslateContext(ctx)
116116

117117
if err := r.processHTTPRoute(tctx, hr); err != nil {
118118
acceptStatus.status = false
@@ -249,7 +249,7 @@ func (r *HTTPRouteReconciler) processHTTPRouteBackendRefs(tctx *provider.Transla
249249
}
250250

251251
var service corev1.Service
252-
if err := r.Get(context.TODO(), client.ObjectKey{
252+
if err := r.Get(tctx, client.ObjectKey{
253253
Namespace: namespace,
254254
Name: name,
255255
}, &service); err != nil {
@@ -268,9 +268,13 @@ func (r *HTTPRouteReconciler) processHTTPRouteBackendRefs(tctx *provider.Transla
268268
terr = fmt.Errorf("port %d not found in service %s", *backend.Port, name)
269269
continue
270270
}
271+
tctx.Services[client.ObjectKey{
272+
Namespace: namespace,
273+
Name: name,
274+
}] = &service
271275

272276
endpointSliceList := new(discoveryv1.EndpointSliceList)
273-
if err := r.List(context.TODO(), endpointSliceList,
277+
if err := r.List(tctx, endpointSliceList,
274278
client.InNamespace(namespace),
275279
client.MatchingLabels{
276280
discoveryv1.LabelServiceName: name,

internal/controller/indexer/indexer.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55

66
"github.com/api7/api7-ingress-controller/api/v1alpha1"
77
networkingv1 "k8s.io/api/networking/v1"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
"k8s.io/apimachinery/pkg/types"
810
ctrl "sigs.k8s.io/controller-runtime"
911
"sigs.k8s.io/controller-runtime/pkg/client"
1012
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -19,6 +21,7 @@ const (
1921
SecretIndexRef = "secretRefs"
2022
IngressClassRef = "ingressClassRef"
2123
ConsumerGatewayRef = "consumerGatewayRef"
24+
PolicyTargetRefs = "targetRefs"
2225
)
2326

2427
func SetupIndexer(mgr ctrl.Manager) error {
@@ -227,6 +230,18 @@ func IngressSecretIndexFunc(rawObj client.Object) []string {
227230
return secrets
228231
}
229232

233+
func GenIndexKeyWithGK(group, kind, namespace, name string) string {
234+
gvk := schema.GroupKind{
235+
Group: group,
236+
Kind: kind,
237+
}
238+
nsName := types.NamespacedName{
239+
Namespace: namespace,
240+
Name: name,
241+
}
242+
return gvk.String() + "/" + nsName.String()
243+
}
244+
230245
func GenIndexKey(namespace, name string) string {
231246
return client.ObjectKey{
232247
Namespace: namespace,
@@ -292,3 +307,19 @@ func GatewayParametersRefIndexFunc(rawObj client.Object) []string {
292307
}
293308
return nil
294309
}
310+
311+
func BackendTrafficPolicyIndexFunc(rawObj client.Object) []string {
312+
btp := rawObj.(*v1alpha1.BackendTrafficPolicy)
313+
keys := make([]string, 0, len(btp.Spec.TargetRefs))
314+
for _, ref := range btp.Spec.TargetRefs {
315+
keys = append(keys,
316+
GenIndexKeyWithGK(
317+
v1alpha1.GroupVersion.Group,
318+
string(ref.Kind),
319+
btp.GetNamespace(),
320+
string(ref.Name),
321+
),
322+
)
323+
}
324+
return keys
325+
}

internal/controller/ingress_controller.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
9393
r.Log.Info("reconciling ingress", "ingress", ingress.Name)
9494

9595
// create a translate context
96-
tctx := provider.NewDefaultTranslateContext()
96+
tctx := provider.NewDefaultTranslateContext(ctx)
9797

9898
// process TLS configuration
99-
if err := r.processTLS(ctx, tctx, ingress); err != nil {
99+
if err := r.processTLS(tctx, ingress); err != nil {
100100
r.Log.Error(err, "failed to process TLS configuration", "ingress", ingress.Name)
101101
return ctrl.Result{}, err
102102
}
103103

104104
// process backend services
105-
if err := r.processBackends(ctx, tctx, ingress); err != nil {
105+
if err := r.processBackends(tctx, ingress); err != nil {
106106
r.Log.Error(err, "failed to process backend services", "ingress", ingress.Name)
107107
return ctrl.Result{}, err
108108
}
@@ -295,14 +295,14 @@ func (r *IngressReconciler) listIngressesBySecret(ctx context.Context, obj clien
295295
}
296296

297297
// processTLS process the TLS configuration of the ingress
298-
func (r *IngressReconciler) processTLS(ctx context.Context, tctx *provider.TranslateContext, ingress *networkingv1.Ingress) error {
298+
func (r *IngressReconciler) processTLS(tctx *provider.TranslateContext, ingress *networkingv1.Ingress) error {
299299
for _, tls := range ingress.Spec.TLS {
300300
if tls.SecretName == "" {
301301
continue
302302
}
303303

304304
secret := corev1.Secret{}
305-
if err := r.Get(ctx, client.ObjectKey{
305+
if err := r.Get(tctx, client.ObjectKey{
306306
Namespace: ingress.Namespace,
307307
Name: tls.SecretName,
308308
}, &secret); err != nil {
@@ -323,7 +323,7 @@ func (r *IngressReconciler) processTLS(ctx context.Context, tctx *provider.Trans
323323
}
324324

325325
// processBackends process the backend services of the ingress
326-
func (r *IngressReconciler) processBackends(ctx context.Context, tctx *provider.TranslateContext, ingress *networkingv1.Ingress) error {
326+
func (r *IngressReconciler) processBackends(tctx *provider.TranslateContext, ingress *networkingv1.Ingress) error {
327327
var terr error
328328

329329
// process all the backend services in the rules
@@ -336,7 +336,7 @@ func (r *IngressReconciler) processBackends(ctx context.Context, tctx *provider.
336336
continue
337337
}
338338
service := path.Backend.Service
339-
if err := r.processBackendService(ctx, tctx, ingress.Namespace, service); err != nil {
339+
if err := r.processBackendService(tctx, ingress.Namespace, service); err != nil {
340340
terr = err
341341
}
342342
}
@@ -345,10 +345,10 @@ func (r *IngressReconciler) processBackends(ctx context.Context, tctx *provider.
345345
}
346346

347347
// processBackendService process a single backend service
348-
func (r *IngressReconciler) processBackendService(ctx context.Context, tctx *provider.TranslateContext, namespace string, backendService *networkingv1.IngressServiceBackend) error {
348+
func (r *IngressReconciler) processBackendService(tctx *provider.TranslateContext, namespace string, backendService *networkingv1.IngressServiceBackend) error {
349349
// get the service
350350
var service corev1.Service
351-
if err := r.Get(ctx, client.ObjectKey{
351+
if err := r.Get(tctx, client.ObjectKey{
352352
Namespace: namespace,
353353
Name: backendService.Name,
354354
}, &service); err != nil {
@@ -385,7 +385,7 @@ func (r *IngressReconciler) processBackendService(ctx context.Context, tctx *pro
385385

386386
// get the endpoint slices
387387
endpointSliceList := &discoveryv1.EndpointSliceList{}
388-
if err := r.List(ctx, endpointSliceList,
388+
if err := r.List(tctx, endpointSliceList,
389389
client.InNamespace(namespace),
390390
client.MatchingLabels{
391391
discoveryv1.LabelServiceName: backendService.Name,

0 commit comments

Comments
 (0)