@@ -2,17 +2,20 @@ package eventhandlers
22
33import (
44 "context"
5- "github.com/aws/aws-application-networking-k8s/pkg/apis/applicationnetworking/v1alpha1"
6- "github.com/aws/aws-application-networking-k8s/pkg/k8s"
7- "github.com/aws/aws-application-networking-k8s/pkg/model/core"
8- "github.com/aws/aws-application-networking-k8s/pkg/utils/gwlog"
5+ "fmt"
6+
97 corev1 "k8s.io/api/core/v1"
108 "k8s.io/apimachinery/pkg/api/errors"
119 "k8s.io/apimachinery/pkg/types"
1210 "sigs.k8s.io/controller-runtime/pkg/client"
1311 gateway_api_v1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
1412 gateway_api "sigs.k8s.io/gateway-api/apis/v1beta1"
1513 mcs_api "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1"
14+
15+ "github.com/aws/aws-application-networking-k8s/pkg/apis/applicationnetworking/v1alpha1"
16+ "github.com/aws/aws-application-networking-k8s/pkg/k8s"
17+ "github.com/aws/aws-application-networking-k8s/pkg/model/core"
18+ "github.com/aws/aws-application-networking-k8s/pkg/utils/gwlog"
1619)
1720
1821type resourceMapper struct {
@@ -21,16 +24,16 @@ type resourceMapper struct {
2124}
2225
2326const (
24- coreGroupName = "" // empty means core by definition
2527 serviceKind = "Service"
2628 serviceImportKind = "ServiceImport"
29+ gatewayKind = "Gateway"
2730)
2831
2932func (r * resourceMapper ) ServiceToRoutes (ctx context.Context , svc * corev1.Service , routeType core.RouteType ) []core.Route {
3033 if svc == nil {
3134 return nil
3235 }
33- return r .backendRefToRoutes (ctx , svc , coreGroupName , serviceKind , routeType )
36+ return r .backendRefToRoutes (ctx , svc , corev1 . GroupName , serviceKind , routeType )
3437}
3538
3639func (r * resourceMapper ) ServiceImportToRoutes (ctx context.Context , svc * mcs_api.ServiceImport , routeType core.RouteType ) []core.Route {
@@ -63,49 +66,81 @@ func (r *resourceMapper) EndpointsToService(ctx context.Context, ep *corev1.Endp
6366}
6467
6568func (r * resourceMapper ) TargetGroupPolicyToService (ctx context.Context , tgp * v1alpha1.TargetGroupPolicy ) * corev1.Service {
66- if tgp == nil {
67- return nil
68- }
69- policyName := k8s .NamespacedName (tgp ).String ()
69+ return policyToTargetRefObj (r , ctx , tgp , & corev1.Service {})
70+ }
7071
71- targetRef := tgp .Spec .TargetRef
72- if targetRef == nil {
73- r .log .Infow ("TargetGroupPolicy does not have targetRef, skipping" ,
74- "policyName" , policyName )
75- return nil
76- }
77- if targetRef .Group != coreGroupName || targetRef .Kind != serviceKind {
78- r .log .Infow ("Detected non-Service TargetGroupPolicy attachment, skipping" ,
79- "policyName" , policyName , "targetRef" , targetRef )
80- return nil
81- }
82- namespace := tgp .Namespace
83- if targetRef .Namespace != nil && namespace != string (* targetRef .Namespace ) {
84- r .log .Infow ("Detected cross namespace TargetGroupPolicy attachment, skipping" ,
85- "policyName" , policyName , "targetRef" , targetRef )
86- return nil
72+ func (r * resourceMapper ) VpcAssociationPolicyToGateway (ctx context.Context , vap * v1alpha1.VpcAssociationPolicy ) * gateway_api.Gateway {
73+ return policyToTargetRefObj (r , ctx , vap , & gateway_api.Gateway {})
74+ }
75+
76+ func policyToTargetRefObj [T client.Object ](r * resourceMapper , ctx context.Context , policy core.Policy , retObj T ) T {
77+ null := * new (T )
78+ if policy == nil {
79+ return null
8780 }
81+ policyNamespacedName := policy .GetNamespacedName ()
8882
89- svcName := types.NamespacedName {
90- Namespace : namespace ,
83+ targetRef := policy .GetTargetRef ()
84+ if targetRef == nil {
85+ r .log .Infow ("Policy does not have targetRef, skipping" ,
86+ "policyName" , policyNamespacedName )
87+ return null
88+ }
89+ expectedGroup , expectedKind , err := k8sResourceTypeToGroupAndKind (retObj )
90+ if err != nil {
91+ r .log .Errorw ("Failed to get expected GroupKind for targetRefObj" ,
92+ "policyName" , policyNamespacedName ,
93+ "targetRef" , targetRef ,
94+ "reason" , err .Error ())
95+ return null
96+ }
97+
98+ if targetRef .Group != expectedGroup || targetRef .Kind != expectedKind {
99+ r .log .Infow ("Detected targetRef GroupKind and expected retObj GroupKind are different, skipping" ,
100+ "policyName" , policyNamespacedName ,
101+ "targetRef" , targetRef ,
102+ "expectedGroup" , expectedGroup ,
103+ "expectedKind" , expectedKind )
104+ return null
105+ }
106+ if targetRef .Namespace != nil && policyNamespacedName .Namespace != string (* targetRef .Namespace ) {
107+ r .log .Infow ("Detected Policy and TargetRef namespace are different, skipping" ,
108+ "policyNamespacedName" , policyNamespacedName , "targetRef" , targetRef ,
109+ "targetRef.Namespace" , targetRef .Namespace ,
110+ "policyNamespacedName.Namespace" , policyNamespacedName .Namespace )
111+ return null
112+ }
113+
114+ key := types.NamespacedName {
115+ Namespace : policyNamespacedName .Namespace ,
91116 Name : string (targetRef .Name ),
92117 }
93- svc := & corev1.Service {}
94- if err := r .client .Get (ctx , svcName , svc ); err != nil {
118+ if err := r .client .Get (ctx , key , retObj ); err != nil {
95119 if errors .IsNotFound (err ) {
96- r .log .Debugw ("TargetGroupPolicy is referring to non-existent service , skipping" ,
97- "policyName" , policyName , "serviceName " , svcName . String () )
120+ r .log .Debugw ("Policy is referring to a non-existent targetRefObj , skipping" ,
121+ "policyName" , policyNamespacedName , "targetRef " , targetRef )
98122 } else {
99123 // Still gracefully skipping the event but errors other than NotFound are bad sign.
100124 r .log .Errorw ("Failed to query targetRef of TargetGroupPolicy" ,
101- "policyName" , policyName , "serviceName " , svcName . String () , "reason" , err .Error ())
125+ "policyName" , policyNamespacedName , "targetRef " , targetRef , "reason" , err .Error ())
102126 }
103- return nil
127+ return null
104128 }
105129 r .log .Debugw ("TargetGroupPolicy change on Service detected" ,
106- "policyName" , policyName , "serviceName " , svcName . String () )
130+ "policyName" , policyNamespacedName , "targetRef " , targetRef )
107131
108- return svc
132+ return retObj
133+ }
134+
135+ func k8sResourceTypeToGroupAndKind (obj client.Object ) (gateway_api.Group , gateway_api.Kind , error ) {
136+ switch obj .(type ) {
137+ case * corev1.Service :
138+ return corev1 .GroupName , serviceKind , nil
139+ case * gateway_api.Gateway :
140+ return gateway_api .GroupName , gatewayKind , nil
141+ default :
142+ return "" , "" , fmt .Errorf ("un-registered obj type: %T" , obj )
143+ }
109144}
110145
111146func (r * resourceMapper ) backendRefToRoutes (ctx context.Context , obj client.Object , group , kind string , routeType core.RouteType ) []core.Route {
0 commit comments