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  }