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  }