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 }