/
outsider.go
82 lines (72 loc) · 2.22 KB
/
outsider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package appender
import (
"github.com/kiali/kiali/graph"
)
const OutsiderAppenderName = "outsider"
// OutsiderAppender is responsible for marking the outsiders (i.e. nodes not in the requested namespaces) and inaccessible nodes
// Name: outsider
type OutsiderAppender struct {
AccessibleNamespaces graph.AccessibleNamespaces
Namespaces graph.NamespaceInfoMap
}
// Name implements Appender
func (a *OutsiderAppender) Name() string {
return OutsiderAppenderName
}
// IsFinalizer implements Appender
func (a OutsiderAppender) IsFinalizer() bool {
return true
}
// AppendGraph implements Appender
func (a *OutsiderAppender) AppendGraph(trafficMap graph.TrafficMap, globalInfo *graph.AppenderGlobalInfo, _namespaceInfo *graph.AppenderNamespaceInfo) {
if len(trafficMap) == 0 {
return
}
a.markOutsideOrInaccessible(trafficMap)
}
// MarkOutsideOrInaccessible sets metadata for outsider and inaccessible nodes. It should be called
// after all appender work is completed.
func (a *OutsiderAppender) markOutsideOrInaccessible(trafficMap graph.TrafficMap) {
for _, n := range trafficMap {
switch n.NodeType {
case graph.NodeTypeUnknown:
n.Metadata[graph.IsInaccessible] = true
case graph.NodeTypeService:
if n.Namespace == graph.Unknown {
n.Metadata[graph.IsInaccessible] = true
} else if n.Metadata[graph.IsEgressCluster] == true {
n.Metadata[graph.IsInaccessible] = true
} else {
if isOutside(n, a.Namespaces) {
n.Metadata[graph.IsOutside] = true
}
}
default:
if isOutside(n, a.Namespaces) {
n.Metadata[graph.IsOutside] = true
}
}
// Check if the node is outside accessible namespaces.
if _, ok := n.Metadata[graph.IsInaccessible]; !ok {
if isInaccessible(n, a.AccessibleNamespaces) {
n.Metadata[graph.IsInaccessible] = true
}
}
}
}
func isOutside(n *graph.Node, namespaces map[string]graph.NamespaceInfo) bool {
if n.Namespace == graph.Unknown {
return false
}
for _, ns := range namespaces {
if n.Namespace == ns.Name {
return false
}
}
return true
}
func isInaccessible(n *graph.Node, accessibleNamespaces graph.AccessibleNamespaces) bool {
key := graph.GetClusterSensitiveKey(n.Cluster, n.Namespace)
_, found := accessibleNamespaces[key]
return !found
}