66package proxy
77
88import (
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
7498func (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.
91130func (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