@@ -2,6 +2,7 @@ package infer
22
33import (
44 "fmt"
5+ "sort"
56 "strings"
67
78 "github.com/Colvin-Y/kubernetes-ontology/internal/model"
@@ -106,6 +107,35 @@ func NewCSIComponentRegistry(rules []CSIComponentRule) *Registry {
106107 return NewRegistry (correlators ... )
107108}
108109
110+ func CorrelatePVToCSIComponents (correlator CSICorrelator , pv model.Node , nodeNames []string , infraPods []model.Node ) CorrelationResult {
111+ normalizedNodeNames := normalizeNodeNames (nodeNames )
112+ if len (normalizedNodeNames ) == 0 {
113+ return correlator .Correlate (pv , "" , infraPods )
114+ }
115+
116+ result := CorrelationResult {Edges : make ([]model.Edge , 0 ), Evidence : make ([]string , 0 )}
117+ seenEdges := make (map [string ]struct {})
118+ seenEvidence := make (map [string ]struct {})
119+ for _ , nodeName := range normalizedNodeNames {
120+ correlation := correlator .Correlate (pv , nodeName , infraPods )
121+ for _ , edge := range correlation .Edges {
122+ if _ , seen := seenEdges [edge .Key ()]; seen {
123+ continue
124+ }
125+ result .Edges = append (result .Edges , edge )
126+ seenEdges [edge .Key ()] = struct {}{}
127+ }
128+ for _ , evidence := range correlation .Evidence {
129+ if _ , seen := seenEvidence [evidence ]; seen {
130+ continue
131+ }
132+ result .Evidence = append (result .Evidence , evidence )
133+ seenEvidence [evidence ] = struct {}{}
134+ }
135+ }
136+ return result
137+ }
138+
109139func IsCSIProvisioner (provisioner string , observedCSIDriver bool , rules []CSIComponentRule ) bool {
110140 if provisioner == "" {
111141 return false
@@ -187,9 +217,9 @@ func (c componentRuleCorrelator) Correlate(pv model.Node, affinityNodeName strin
187217 }
188218 if len (c .rule .NodeAgentPodPrefixes ) > 0 {
189219 if affinityNodeName == "" {
190- result .Evidence = append (result .Evidence , fmt .Sprintf ("csi: PV affinity node missing for driver %s" , c .rule .Driver ))
220+ result .Evidence = append (result .Evidence , fmt .Sprintf ("csi: PV affinity or consuming pod node missing for driver %s" , c .rule .Driver ))
191221 } else if ! foundAgent {
192- result .Evidence = append (result .Evidence , fmt .Sprintf ("csi: no node agent found for driver %s on PV affinity node %s" , c .rule .Driver , affinityNodeName ))
222+ result .Evidence = append (result .Evidence , fmt .Sprintf ("csi: no node agent found for driver %s on node %s" , c .rule .Driver , affinityNodeName ))
193223 }
194224 }
195225 return result
@@ -217,6 +247,23 @@ func hasAnyPrefix(value string, prefixes []string) bool {
217247 return false
218248}
219249
250+ func normalizeNodeNames (nodeNames []string ) []string {
251+ seen := make (map [string ]struct {}, len (nodeNames ))
252+ for _ , nodeName := range nodeNames {
253+ nodeName = strings .TrimSpace (nodeName )
254+ if nodeName == "" {
255+ continue
256+ }
257+ seen [nodeName ] = struct {}{}
258+ }
259+ out := make ([]string , 0 , len (seen ))
260+ for nodeName := range seen {
261+ out = append (out , nodeName )
262+ }
263+ sort .Strings (out )
264+ return out
265+ }
266+
220267func looksLikeCSIProvisioner (provisioner string ) bool {
221268 if strings .HasPrefix (provisioner , "kubernetes.io/" ) {
222269 return false
0 commit comments