github.com/kiali/kiali@v1.84.0/business/references/k8shttproute_references.go (about) 1 package references 2 3 import ( 4 k8s_networking_v1 "sigs.k8s.io/gateway-api/apis/v1" 5 k8s_networking_v1beta1 "sigs.k8s.io/gateway-api/apis/v1beta1" 6 7 "github.com/kiali/kiali/kubernetes" 8 "github.com/kiali/kiali/models" 9 ) 10 11 type K8sHTTPRouteReferences struct { 12 K8sHTTPRoutes []*k8s_networking_v1.HTTPRoute 13 K8sReferenceGrants []*k8s_networking_v1beta1.ReferenceGrant 14 Namespaces models.Namespaces 15 } 16 17 func (n K8sHTTPRouteReferences) References() models.IstioReferencesMap { 18 result := models.IstioReferencesMap{} 19 20 for _, rt := range n.K8sHTTPRoutes { 21 key := models.IstioReferenceKey{Namespace: rt.Namespace, Name: rt.Name, ObjectType: models.ObjectTypeSingular[kubernetes.K8sHTTPRoutes]} 22 references := &models.IstioReferences{} 23 references.ServiceReferences = n.getServiceReferences(rt) 24 references.ObjectReferences = n.getConfigReferences(rt) 25 result.MergeReferencesMap(models.IstioReferencesMap{key: references}) 26 } 27 28 return result 29 } 30 31 func (n K8sHTTPRouteReferences) getServiceReferences(rt *k8s_networking_v1.HTTPRoute) []models.ServiceReference { 32 keys := make(map[string]bool) 33 allServices := make([]models.ServiceReference, 0) 34 result := make([]models.ServiceReference, 0) 35 36 for _, httpRoute := range rt.Spec.Rules { 37 for _, ref := range httpRoute.BackendRefs { 38 if ref.Kind == nil || string(*ref.Kind) != "Service" { 39 continue 40 } 41 namespace := rt.Namespace 42 if ref.Namespace != nil && string(*ref.Namespace) != "" { 43 namespace = string(*ref.Namespace) 44 } 45 fqdn := kubernetes.GetHost(string(ref.Name), namespace, n.Namespaces.GetNames()) 46 if !fqdn.IsWildcard() { 47 allServices = append(allServices, models.ServiceReference{Name: fqdn.Service, Namespace: fqdn.Namespace}) 48 } 49 } 50 } 51 52 // filter unique references 53 for _, sv := range allServices { 54 if !keys[sv.Name+"."+sv.Namespace] { 55 result = append(result, sv) 56 keys[sv.Name+"."+sv.Namespace] = true 57 } 58 } 59 return result 60 } 61 62 func (n K8sHTTPRouteReferences) getConfigReferences(rt *k8s_networking_v1.HTTPRoute) []models.IstioReference { 63 keys := make(map[string]bool) 64 result := make([]models.IstioReference, 0) 65 allGateways := getAllK8sGateways(rt) 66 // filter unique references 67 for _, gw := range allGateways { 68 if !keys[gw.Name+"."+gw.Namespace+"/"+gw.ObjectType] { 69 result = append(result, gw) 70 keys[gw.Name+"."+gw.Namespace+"/"+gw.ObjectType] = true 71 } 72 } 73 result = append(result, n.getAllK8sReferenceGrants(rt)...) 74 return result 75 } 76 77 func getAllK8sGateways(rt *k8s_networking_v1.HTTPRoute) []models.IstioReference { 78 allGateways := make([]models.IstioReference, 0) 79 80 if len(rt.Spec.ParentRefs) > 0 { 81 for _, parentRef := range rt.Spec.ParentRefs { 82 if string(parentRef.Name) != "" && string(*parentRef.Kind) == kubernetes.K8sActualGatewayType && string(*parentRef.Group) == kubernetes.K8sNetworkingGroupVersionV1.Group { 83 namespace := rt.Namespace 84 if parentRef.Namespace != nil && string(*parentRef.Namespace) != "" { 85 namespace = string(*parentRef.Namespace) 86 } 87 allGateways = append(allGateways, getK8sGatewayReference(string(parentRef.Name), namespace)) 88 } 89 } 90 } 91 92 return allGateways 93 } 94 95 func (n K8sHTTPRouteReferences) getAllK8sReferenceGrants(rt *k8s_networking_v1.HTTPRoute) []models.IstioReference { 96 allGrants := make([]models.IstioReference, 0) 97 for _, rGrant := range n.K8sReferenceGrants { 98 if len(rGrant.Spec.From) > 0 && 99 string(rGrant.Spec.From[0].Namespace) == rt.Namespace && 100 string(rGrant.Spec.From[0].Kind) == kubernetes.K8sActualHTTPRouteType { 101 allGrants = append(allGrants, getK8sGrantReference(rGrant.Name, rGrant.Namespace)) 102 } 103 } 104 105 return allGrants 106 } 107 108 func getK8sGatewayReference(gateway string, namespace string) models.IstioReference { 109 gw := kubernetes.ParseGatewayAsHost(gateway, namespace) 110 return models.IstioReference{Name: gw.Service, Namespace: gw.Namespace, ObjectType: models.ObjectTypeSingular[kubernetes.K8sGateways]} 111 } 112 113 func getK8sGrantReference(name string, namespace string) models.IstioReference { 114 return models.IstioReference{Name: name, Namespace: namespace, ObjectType: models.ObjectTypeSingular[kubernetes.K8sReferenceGrants]} 115 }