@@ -24,13 +24,17 @@ import (
24
24
"k8s.io/apimachinery/pkg/util/intstr"
25
25
"k8s.io/apimachinery/pkg/util/validation"
26
26
"k8s.io/cli-runtime/pkg/resource"
27
+ gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
27
28
)
28
29
30
+ const RouteBackendServiceKind = "Service"
31
+
29
32
// k8sWorkloadObjectFromInfo creates a Resource object from an Info object
30
33
func k8sWorkloadObjectFromInfo (info * resource.Info ) (* Resource , error ) {
31
34
var podSpecV1 * v1.PodTemplateSpec
32
35
var resourceCtx Resource
33
36
var metaObj metaV1.Object
37
+ resourceCtx .Resource .FilePath = info .Source
34
38
resourceCtx .Resource .Kind = info .Object .GetObjectKind ().GroupVersionKind ().Kind
35
39
switch resourceCtx .Resource .Kind {
36
40
case pod :
@@ -98,7 +102,9 @@ func k8sServiceFromInfo(info *resource.Info) (*Service, error) {
98
102
if svcObj == nil {
99
103
return nil , fmt .Errorf ("failed to parse Service resource" )
100
104
}
105
+
101
106
var serviceCtx Service
107
+ serviceCtx .Resource .FilePath = info .Source
102
108
serviceCtx .Resource .Name = svcObj .GetName ()
103
109
serviceCtx .Resource .Namespace = svcObj .Namespace
104
110
serviceCtx .Resource .Kind = svcObj .Kind
@@ -146,14 +152,9 @@ func ocRouteFromInfo(info *resource.Info, toExpose servicesToExpose) error {
146
152
return fmt .Errorf ("failed to parse Route resource" )
147
153
}
148
154
149
- exposedServicesInNamespace , ok := toExpose [routeObj .Namespace ]
150
- if ! ok {
151
- toExpose [routeObj .Namespace ] = map [string ][]* intstr.IntOrString {}
152
- exposedServicesInNamespace = toExpose [routeObj .Namespace ]
153
- }
154
- appendToSliceInMap (exposedServicesInNamespace , routeObj .Spec .To .Name , & routeObj .Spec .Port .TargetPort )
155
+ toExpose .appendPort (routeObj .Namespace , routeObj .Spec .To .Name , & routeObj .Spec .Port .TargetPort )
155
156
for _ , backend := range routeObj .Spec .AlternateBackends {
156
- appendToSliceInMap ( exposedServicesInNamespace , backend .Name , & routeObj .Spec .Port .TargetPort )
157
+ toExpose . appendPort ( routeObj . Namespace , backend .Name , & routeObj .Spec .Port .TargetPort )
157
158
}
158
159
159
160
return nil
@@ -166,16 +167,10 @@ func k8sIngressFromInfo(info *resource.Info, toExpose servicesToExpose) error {
166
167
return fmt .Errorf ("failed to parse Ingress resource" )
167
168
}
168
169
169
- exposedServicesInNamespace , ok := toExpose [ingressObj .Namespace ]
170
- if ! ok {
171
- toExpose [ingressObj .Namespace ] = map [string ][]* intstr.IntOrString {}
172
- exposedServicesInNamespace = toExpose [ingressObj .Namespace ]
173
- }
174
-
175
170
defaultBackend := ingressObj .Spec .DefaultBackend
176
171
if defaultBackend != nil && defaultBackend .Service != nil {
177
172
portToAppend := portFromServiceBackendPort (& defaultBackend .Service .Port )
178
- appendToSliceInMap ( exposedServicesInNamespace , defaultBackend .Service .Name , portToAppend )
173
+ toExpose . appendPort ( ingressObj . Namespace , defaultBackend .Service .Name , portToAppend )
179
174
}
180
175
181
176
for ruleIdx := range ingressObj .Spec .Rules {
@@ -185,7 +180,7 @@ func k8sIngressFromInfo(info *resource.Info, toExpose servicesToExpose) error {
185
180
svc := rule .HTTP .Paths [pathIdx ].Backend .Service
186
181
if svc != nil {
187
182
portToAppend := portFromServiceBackendPort (& svc .Port )
188
- appendToSliceInMap ( exposedServicesInNamespace , svc .Name , portToAppend )
183
+ toExpose . appendPort ( ingressObj . Namespace , svc .Name , portToAppend )
189
184
}
190
185
}
191
186
}
@@ -202,6 +197,56 @@ func portFromServiceBackendPort(sbp *networkv1.ServiceBackendPort) *intstr.IntOr
202
197
return & res
203
198
}
204
199
200
+ func gatewayHTTPRouteFromInfo (info * resource.Info , toExpose servicesToExpose ) error {
201
+ routeObj := parseResourceFromInfo [gatewayv1.HTTPRoute ](info )
202
+ if routeObj == nil {
203
+ return fmt .Errorf ("failed to parse HTTPRoute resource" )
204
+ }
205
+
206
+ for i := range routeObj .Spec .Rules {
207
+ rule := & routeObj .Spec .Rules [i ]
208
+ for j := range rule .BackendRefs {
209
+ backend := & rule .BackendRefs [j ]
210
+ if (backend .Kind != nil && string (* backend .Kind ) != RouteBackendServiceKind ) || backend .Port == nil {
211
+ continue // ignore backends which are not services and which do not specify a port
212
+ }
213
+ namespace := routeObj .Namespace
214
+ if backend .Namespace != nil {
215
+ namespace = string (* backend .Namespace )
216
+ }
217
+ port := intstr .FromInt32 (int32 (* backend .Port ))
218
+ toExpose .appendPort (namespace , string (backend .Name ), & port )
219
+ }
220
+ }
221
+
222
+ return nil
223
+ }
224
+
225
+ func gatewayGRPCRouteFromInfo (info * resource.Info , toExpose servicesToExpose ) error {
226
+ routeObj := parseResourceFromInfo [gatewayv1.GRPCRoute ](info )
227
+ if routeObj == nil {
228
+ return fmt .Errorf ("failed to parse GRPCRoute resource" )
229
+ }
230
+
231
+ for i := range routeObj .Spec .Rules {
232
+ rule := & routeObj .Spec .Rules [i ]
233
+ for j := range rule .BackendRefs {
234
+ backend := & rule .BackendRefs [j ]
235
+ if (backend .Kind != nil && string (* backend .Kind ) != RouteBackendServiceKind ) || backend .Port == nil {
236
+ continue // ignore backends which are not services and which do not specify a port
237
+ }
238
+ port := intstr .FromInt32 (int32 (* backend .Port ))
239
+ namespace := routeObj .Namespace
240
+ if backend .Namespace != nil {
241
+ namespace = string (* backend .Namespace )
242
+ }
243
+ toExpose .appendPort (namespace , string (backend .Name ), & port )
244
+ }
245
+ }
246
+
247
+ return nil
248
+ }
249
+
205
250
func parseDeployResource (podSpec * v1.PodTemplateSpec , obj metaV1.Object , resourceCtx * Resource ) {
206
251
resourceCtx .Resource .Name = obj .GetName ()
207
252
resourceCtx .Resource .Namespace = obj .GetNamespace ()
0 commit comments