Skip to content

Commit fc462a8

Browse files
authored
feat: add ownerreference to infra resources when gateway namespace mode (#6100)
* feat: add ownerreference to infra resources when gateway namespace mode Signed-off-by: kkk777-7 <[email protected]>
1 parent 0815cdc commit fc462a8

25 files changed

+1810
-158
lines changed

internal/gatewayapi/testdata/gateway-namespace-mode-infra-httproute.out.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ infraIR:
240240
labels:
241241
gateway.envoyproxy.io/owning-gateway-name: gateway-1
242242
gateway.envoyproxy.io/owning-gateway-namespace: default
243+
ownerReference:
244+
kind: Gateway
245+
name: gateway-1
243246
name: default/gateway-1
244247
namespace: default
245248
default/gateway-2:
@@ -256,6 +259,9 @@ infraIR:
256259
labels:
257260
gateway.envoyproxy.io/owning-gateway-name: gateway-2
258261
gateway.envoyproxy.io/owning-gateway-namespace: default
262+
ownerReference:
263+
kind: Gateway
264+
name: gateway-2
259265
name: default/gateway-2
260266
namespace: default
261267
test-ns/gateway-3:
@@ -272,6 +278,9 @@ infraIR:
272278
labels:
273279
gateway.envoyproxy.io/owning-gateway-name: gateway-3
274280
gateway.envoyproxy.io/owning-gateway-namespace: test-ns
281+
ownerReference:
282+
kind: Gateway
283+
name: gateway-3
275284
name: test-ns/gateway-3
276285
namespace: test-ns
277286
xdsIR:

internal/gatewayapi/translator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ func (t *Translator) InitIRs(gateways []*GatewayContext) (map[string]*ir.Xds, ma
319319
gwInfraIR.Proxy.Namespace = t.ControllerNamespace
320320
if t.GatewayNamespaceMode {
321321
gwInfraIR.Proxy.Namespace = gateway.Namespace
322+
gwInfraIR.Proxy.GetProxyMetadata().OwnerReference = &ir.ResourceMetadata{
323+
Kind: resource.KindGateway,
324+
Name: gateway.Name,
325+
}
322326
}
323327
// save the IR references in the map before the translation starts
324328
xdsIR[irKey] = gwXdsIR

internal/infrastructure/kubernetes/proxy/resource_provider.go

Lines changed: 77 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package proxy
77

88
import (
9+
"context"
910
"fmt"
1011
"strconv"
1112

@@ -16,11 +17,14 @@ import (
1617
policyv1 "k8s.io/api/policy/v1"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1819
"k8s.io/apimachinery/pkg/labels"
20+
"k8s.io/apimachinery/pkg/types"
1921
"k8s.io/apimachinery/pkg/util/intstr"
2022
"k8s.io/utils/ptr"
23+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2124

2225
egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
2326
"github.com/envoyproxy/gateway/internal/gatewayapi"
27+
gwapiresource "github.com/envoyproxy/gateway/internal/gatewayapi/resource"
2428
"github.com/envoyproxy/gateway/internal/infrastructure/common"
2529
"github.com/envoyproxy/gateway/internal/infrastructure/kubernetes/resource"
2630
"github.com/envoyproxy/gateway/internal/ir"
@@ -58,17 +62,37 @@ type ResourceRender struct {
5862
ShutdownManager *egv1a1.ShutdownManager
5963

6064
GatewayNamespaceMode bool
65+
66+
// ownerReferenceUID store the uid of its owner reference. Key is the kind of owner resource.
67+
// - Gateway when enabled GatewayNamespaceMode
68+
// - TODO: GatewayClass when enabled merged gateways
69+
ownerReferenceUID map[string]types.UID
6170
}
6271

63-
func NewResourceRender(envoyNamespace, controllerNamespace, dnsDomain string, infra *ir.ProxyInfra, gateway *egv1a1.EnvoyGateway) *ResourceRender {
64-
return &ResourceRender{
65-
envoyNamespace: envoyNamespace,
66-
controllerNamespace: controllerNamespace,
67-
DNSDomain: dnsDomain,
68-
infra: infra,
69-
ShutdownManager: gateway.GetEnvoyGatewayProvider().GetEnvoyGatewayKubeProvider().ShutdownManager,
70-
GatewayNamespaceMode: gateway.GatewayNamespaceMode(),
72+
// KubernetesInfraProvider provide information for initializing the proxy resource render.
73+
type KubernetesInfraProvider interface {
74+
GetControllerNamespace() string
75+
GetDNSDomain() string
76+
GetEnvoyGateway() *egv1a1.EnvoyGateway
77+
GetOwnerReferenceUID(ctx context.Context, infra *ir.Infra) (map[string]types.UID, error)
78+
GetResourceNamespace(ir *ir.Infra) string
79+
}
80+
81+
func NewResourceRender(ctx context.Context, kubernetesInfra KubernetesInfraProvider, infra *ir.Infra) (*ResourceRender, error) {
82+
ownerReference, err := kubernetesInfra.GetOwnerReferenceUID(ctx, infra)
83+
if err != nil {
84+
return nil, err
7185
}
86+
87+
return &ResourceRender{
88+
envoyNamespace: kubernetesInfra.GetResourceNamespace(infra),
89+
controllerNamespace: kubernetesInfra.GetControllerNamespace(),
90+
DNSDomain: kubernetesInfra.GetDNSDomain(),
91+
infra: infra.GetProxyInfra(),
92+
ShutdownManager: kubernetesInfra.GetEnvoyGateway().GetEnvoyGatewayProvider().GetEnvoyGatewayKubeProvider().ShutdownManager,
93+
GatewayNamespaceMode: kubernetesInfra.GetEnvoyGateway().GatewayNamespaceMode(),
94+
ownerReferenceUID: ownerReference,
95+
}, nil
7296
}
7397

7498
func (r *ResourceRender) Name() string {
@@ -87,6 +111,21 @@ func (r *ResourceRender) LabelSelector() labels.Selector {
87111
return labels.SelectorFromSet(r.stableSelector().MatchLabels)
88112
}
89113

114+
func (r *ResourceRender) OwnerReferences() []metav1.OwnerReference {
115+
var ownerReferences []metav1.OwnerReference
116+
if r.ownerReferenceUID != nil && r.GatewayNamespaceMode {
117+
if uid, ok := r.ownerReferenceUID[gwapiresource.KindGateway]; ok {
118+
ownerReferences = append(ownerReferences, metav1.OwnerReference{
119+
APIVersion: gwapiv1.GroupVersion.String(),
120+
Kind: r.infra.GetProxyMetadata().OwnerReference.Kind,
121+
Name: r.infra.GetProxyMetadata().OwnerReference.Name,
122+
UID: uid,
123+
})
124+
}
125+
}
126+
return ownerReferences
127+
}
128+
90129
// ServiceAccount returns the expected proxy serviceAccount.
91130
func (r *ResourceRender) ServiceAccount() (*corev1.ServiceAccount, error) {
92131
// Set the labels based on the owning gateway name.
@@ -101,10 +140,11 @@ func (r *ResourceRender) ServiceAccount() (*corev1.ServiceAccount, error) {
101140
APIVersion: "v1",
102141
},
103142
ObjectMeta: metav1.ObjectMeta{
104-
Namespace: r.Namespace(),
105-
Name: r.Name(),
106-
Labels: labels,
107-
Annotations: r.infra.GetProxyMetadata().Annotations,
143+
Namespace: r.Namespace(),
144+
Name: r.Name(),
145+
Labels: labels,
146+
Annotations: r.infra.GetProxyMetadata().Annotations,
147+
OwnerReferences: r.OwnerReferences(),
108148
},
109149
}, nil
110150
}
@@ -208,9 +248,10 @@ func (r *ResourceRender) Service() (*corev1.Service, error) {
208248
Kind: "Service",
209249
},
210250
ObjectMeta: metav1.ObjectMeta{
211-
Namespace: r.Namespace(),
212-
Labels: svcLabels,
213-
Annotations: annotations,
251+
Namespace: r.Namespace(),
252+
Labels: svcLabels,
253+
Annotations: annotations,
254+
OwnerReferences: r.OwnerReferences(),
214255
},
215256
Spec: serviceSpec,
216257
}
@@ -253,10 +294,11 @@ func (r *ResourceRender) ConfigMap(cert string) (*corev1.ConfigMap, error) {
253294
APIVersion: "v1",
254295
},
255296
ObjectMeta: metav1.ObjectMeta{
256-
Namespace: r.Namespace(),
257-
Name: r.Name(),
258-
Labels: labels,
259-
Annotations: r.infra.GetProxyMetadata().Annotations,
297+
Namespace: r.Namespace(),
298+
Name: r.Name(),
299+
Labels: labels,
300+
Annotations: r.infra.GetProxyMetadata().Annotations,
301+
OwnerReferences: r.OwnerReferences(),
260302
},
261303
Data: data,
262304
}, nil
@@ -312,9 +354,10 @@ func (r *ResourceRender) Deployment() (*appsv1.Deployment, error) {
312354
APIVersion: "apps/v1",
313355
},
314356
ObjectMeta: metav1.ObjectMeta{
315-
Namespace: r.Namespace(),
316-
Labels: dpLabels,
317-
Annotations: dpAnnotations,
357+
Namespace: r.Namespace(),
358+
Labels: dpLabels,
359+
Annotations: dpAnnotations,
360+
OwnerReferences: r.OwnerReferences(),
318361
},
319362
Spec: appsv1.DeploymentSpec{
320363
Replicas: deploymentConfig.Replicas,
@@ -400,9 +443,10 @@ func (r *ResourceRender) DaemonSet() (*appsv1.DaemonSet, error) {
400443
APIVersion: "apps/v1",
401444
},
402445
ObjectMeta: metav1.ObjectMeta{
403-
Namespace: r.Namespace(),
404-
Labels: dsLabels,
405-
Annotations: dsAnnotations,
446+
Namespace: r.Namespace(),
447+
Labels: dsLabels,
448+
Annotations: dsAnnotations,
449+
OwnerReferences: r.OwnerReferences(),
406450
},
407451
Spec: appsv1.DaemonSetSpec{
408452
// Daemonset's selector is immutable.
@@ -468,8 +512,9 @@ func (r *ResourceRender) PodDisruptionBudget() (*policyv1.PodDisruptionBudget, e
468512

469513
podDisruptionBudget := &policyv1.PodDisruptionBudget{
470514
ObjectMeta: metav1.ObjectMeta{
471-
Name: r.Name(),
472-
Namespace: r.Namespace(),
515+
Name: r.Name(),
516+
Namespace: r.Namespace(),
517+
OwnerReferences: r.OwnerReferences(),
473518
},
474519
TypeMeta: metav1.TypeMeta{
475520
APIVersion: "policy/v1",
@@ -503,10 +548,11 @@ func (r *ResourceRender) HorizontalPodAutoscaler() (*autoscalingv2.HorizontalPod
503548
Kind: "HorizontalPodAutoscaler",
504549
},
505550
ObjectMeta: metav1.ObjectMeta{
506-
Namespace: r.Namespace(),
507-
Name: r.Name(),
508-
Annotations: r.infra.GetProxyMetadata().Annotations,
509-
Labels: r.infra.GetProxyMetadata().Labels,
551+
Namespace: r.Namespace(),
552+
Name: r.Name(),
553+
Annotations: r.infra.GetProxyMetadata().Annotations,
554+
Labels: r.infra.GetProxyMetadata().Labels,
555+
OwnerReferences: r.OwnerReferences(),
510556
},
511557
Spec: autoscalingv2.HorizontalPodAutoscalerSpec{
512558
ScaleTargetRef: autoscalingv2.CrossVersionObjectReference{

0 commit comments

Comments
 (0)