github.com/kiali/kiali@v1.84.0/graph/telemetry/istio/appender/workload_entry.go (about)

     1  package appender
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kiali/kiali/business"
     7  	"github.com/kiali/kiali/config"
     8  	"github.com/kiali/kiali/graph"
     9  	"github.com/kiali/kiali/log"
    10  )
    11  
    12  const WorkloadEntryAppenderName = "workloadEntry"
    13  
    14  // WorkloadEntryAppender correlates trafficMap nodes to corresponding WorkloadEntry
    15  // Istio objects. If the trafficMap node has a matching WorkloadEntry, a label is
    16  // added to the node's Metadata. Matching is determined by the "app" and "version"
    17  // labels on both the trafficMap node and the WorkloadEntry object being equivalent.
    18  // A workload can have multiple matches.
    19  type WorkloadEntryAppender struct {
    20  	GraphType string
    21  }
    22  
    23  // Name implements Appender
    24  func (a WorkloadEntryAppender) Name() string {
    25  	return WorkloadEntryAppenderName
    26  }
    27  
    28  // IsFinalizer implements Appender
    29  func (a WorkloadEntryAppender) IsFinalizer() bool {
    30  	return true
    31  }
    32  
    33  // AppendGraph implements Appender
    34  func (a WorkloadEntryAppender) AppendGraph(trafficMap graph.TrafficMap, globalInfo *graph.AppenderGlobalInfo, namespaceInfo *graph.AppenderNamespaceInfo) {
    35  	if len(trafficMap) == 0 {
    36  		return
    37  	}
    38  
    39  	log.Trace("Running workload entry appender")
    40  
    41  	a.applyWorkloadEntries(trafficMap, globalInfo, namespaceInfo)
    42  }
    43  
    44  func (a WorkloadEntryAppender) applyWorkloadEntries(trafficMap graph.TrafficMap, globalInfo *graph.AppenderGlobalInfo, namespaceInfo *graph.AppenderNamespaceInfo) {
    45  	appLabel := config.Get().IstioLabels.AppLabelName
    46  	versionLabel := config.Get().IstioLabels.VersionLabelName
    47  
    48  	for _, n := range trafficMap {
    49  		// Skip the check if this node is outside the requested namespace, we limit badging to the requested namespaces
    50  		if n.Namespace != namespaceInfo.Namespace {
    51  			continue
    52  		}
    53  
    54  		// Only a workload or app node can be a workload entry
    55  		if n.NodeType != graph.NodeTypeWorkload && n.NodeType != graph.NodeTypeApp {
    56  			continue
    57  		}
    58  
    59  		istioCfg, err := globalInfo.Business.IstioConfig.GetIstioConfigListForNamespace(context.TODO(), n.Cluster, n.Namespace, business.IstioConfigCriteria{
    60  			IncludeWorkloadEntries: true,
    61  		})
    62  		graph.CheckError(err)
    63  
    64  		log.Tracef("WorkloadEntries found: %d", len(istioCfg.WorkloadEntries))
    65  
    66  		for _, entry := range istioCfg.WorkloadEntries {
    67  			if entry.Spec.Labels[appLabel] == n.App && entry.Spec.Labels[versionLabel] == n.Version {
    68  				if n.Metadata[graph.HasWorkloadEntry] == nil {
    69  					n.Metadata[graph.HasWorkloadEntry] = []graph.WEInfo{}
    70  				}
    71  
    72  				we := graph.WEInfo{Name: entry.Name}
    73  				weMetadata := n.Metadata[graph.HasWorkloadEntry].([]graph.WEInfo)
    74  				weMetadata = append(weMetadata, we)
    75  				n.Metadata[graph.HasWorkloadEntry] = weMetadata
    76  				log.Trace("Found matching WorkloadEntry")
    77  			}
    78  		}
    79  	}
    80  }