github.com/cilium/cilium@v1.16.2/pkg/hubble/filters/nodename.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Hubble 3 4 package filters 5 6 import ( 7 "context" 8 "strings" 9 10 flowpb "github.com/cilium/cilium/api/v1/flow" 11 ciliumDefaults "github.com/cilium/cilium/pkg/defaults" 12 v1 "github.com/cilium/cilium/pkg/hubble/api/v1" 13 ) 14 15 // filterByNodeNames returns a function that filters flow events based on the 16 // node name. 17 func filterByNodeNames(nodeNames []string) (FilterFunc, error) { 18 nodeNameRegexp, err := compileNodeNamePattern(nodeNames) 19 if err != nil { 20 return nil, err 21 } 22 23 return func(ev *v1.Event) bool { 24 nodeName := ev.GetFlow().GetNodeName() 25 if nodeName == "" { 26 return false 27 } 28 // ensure that the node name always includes a cluster name 29 if strings.IndexByte(nodeName, '/') == -1 { 30 nodeName = ciliumDefaults.ClusterName + "/" + nodeName 31 } 32 return nodeNameRegexp.MatchString(nodeName) 33 }, nil 34 } 35 36 // A NodeNameFilter filters on node name. 37 type NodeNameFilter struct{} 38 39 // OnBuildFilter builds a node name filter. 40 func (n *NodeNameFilter) OnBuildFilter(ctx context.Context, ff *flowpb.FlowFilter) ([]FilterFunc, error) { 41 var fs []FilterFunc 42 43 if ff.GetNodeName() != nil { 44 nodeNameF, err := filterByNodeNames(ff.GetNodeName()) 45 if err != nil { 46 return nil, err 47 } 48 fs = append(fs, nodeNameF) 49 } 50 51 return fs, nil 52 }