github.com/k8snetworkplumbingwg/sriov-network-operator@v1.2.1-0.20240408194816-2d2e5a45d453/test/util/nodes/nodes.go (about)

     1  package nodes
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  
     8  	corev1 "k8s.io/api/core/v1"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  
    11  	sriovv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
    12  	"github.com/k8snetworkplumbingwg/sriov-network-operator/test/util/client"
    13  )
    14  
    15  // NodesSelector represent the label selector used to filter impacted nodes.
    16  var NodesSelector string
    17  
    18  func init() {
    19  	NodesSelector = os.Getenv("NODES_SELECTOR")
    20  }
    21  
    22  // MatchingOptionalSelectorByName filter the given slice with only the nodes matching the optional selector.
    23  // If no selector is set, it returns the same list.
    24  // The NODES_SELECTOR must be in the form of label=value.
    25  // For example: NODES_SELECTOR="sctp=true"
    26  func MatchingOptionalSelectorState(clients *client.ClientSet, toFilter []sriovv1.SriovNetworkNodeState) ([]sriovv1.SriovNetworkNodeState, error) {
    27  	if NodesSelector == "" {
    28  		return toFilter, nil
    29  	}
    30  	toMatch, err := clients.CoreV1Interface.Nodes().List(context.Background(), metav1.ListOptions{
    31  		LabelSelector: NodesSelector,
    32  	})
    33  	if err != nil {
    34  		return nil, fmt.Errorf("error in getting nodes matching %s, %v", NodesSelector, err)
    35  	}
    36  	if len(toMatch.Items) == 0 {
    37  		return nil, fmt.Errorf("failed to get nodes matching %s, %v", NodesSelector, err)
    38  	}
    39  
    40  	res := make([]sriovv1.SriovNetworkNodeState, 0)
    41  	for _, n := range toFilter {
    42  		for _, m := range toMatch.Items {
    43  			if n.Name == m.Name {
    44  				res = append(res, n)
    45  			}
    46  		}
    47  	}
    48  	if len(res) == 0 {
    49  		return nil, fmt.Errorf("failed to find matching nodes with %s", NodesSelector)
    50  	}
    51  	return res, nil
    52  }
    53  
    54  // MatchingOptionalSelector filter the given slice with only the nodes matching the optional selector.
    55  // If no selector is set, it returns the same list.
    56  // The NODES_SELECTOR must be set with a labelselector expression.
    57  // For example: NODES_SELECTOR="sctp=true"
    58  func MatchingOptionalSelector(clients *client.ClientSet, toFilter []corev1.Node) ([]corev1.Node, error) {
    59  	if NodesSelector == "" {
    60  		return toFilter, nil
    61  	}
    62  	toMatch, err := clients.CoreV1Interface.Nodes().List(context.Background(), metav1.ListOptions{
    63  		LabelSelector: NodesSelector,
    64  	})
    65  	if err != nil {
    66  		return nil, fmt.Errorf("error in getting nodes matching the %s label selector, %v", NodesSelector, err)
    67  	}
    68  	if len(toMatch.Items) == 0 {
    69  		return nil, fmt.Errorf("failed to get nodes matching %s label selector", NodesSelector)
    70  	}
    71  
    72  	res := make([]corev1.Node, 0)
    73  	for _, n := range toFilter {
    74  		for _, m := range toMatch.Items {
    75  			if n.Name == m.Name {
    76  				res = append(res, n)
    77  				break
    78  			}
    79  		}
    80  	}
    81  	if len(res) == 0 {
    82  		return nil, fmt.Errorf("failed to find matching nodes with %s label selector", NodesSelector)
    83  	}
    84  	return res, nil
    85  }