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 }