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

     1  package discovery
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"strconv"
     7  
     8  	corev1 "k8s.io/api/core/v1"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
    11  
    12  	sriovv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
    13  	"github.com/k8snetworkplumbingwg/sriov-network-operator/test/util/client"
    14  	"github.com/k8snetworkplumbingwg/sriov-network-operator/test/util/cluster"
    15  )
    16  
    17  // Enabled indicates whether test discovery mode is enabled.
    18  func Enabled() bool {
    19  	discoveryMode, _ := strconv.ParseBool(os.Getenv("DISCOVERY_MODE"))
    20  	return discoveryMode
    21  }
    22  
    23  // DiscoveredResources discovers resources needed by the tests in discovery mode
    24  func DiscoveredResources(clients *client.ClientSet, sriovInfos *cluster.EnabledNodes, operatorNamespace string, filterPolicy func(sriovv1.SriovNetworkNodePolicy) bool, filterDevices func(string, []*sriovv1.InterfaceExt) (*sriovv1.InterfaceExt, bool)) (preferredNode string, preferredResourceName string, preferredResourceCount int, preferredDevice *sriovv1.InterfaceExt, err error) {
    25  	policyList := sriovv1.SriovNetworkNodePolicyList{}
    26  	err = clients.List(context.Background(), &policyList, runtimeclient.InNamespace(operatorNamespace))
    27  	if err != nil {
    28  		return
    29  	}
    30  	nodes, err := getSriovNodes(clients, sriovInfos.Nodes)
    31  	if err != nil {
    32  		return
    33  	}
    34  
    35  	for _, policy := range policyList.Items {
    36  		if !filterPolicy(policy) {
    37  			continue
    38  		}
    39  		resourceName := policy.Spec.ResourceName
    40  		for _, node := range nodes {
    41  			sriovDeviceList, err := sriovInfos.FindSriovDevices(node.ObjectMeta.Name)
    42  			if err != nil {
    43  				continue
    44  			}
    45  			device, ok := filterDevices(node.ObjectMeta.Name, sriovDeviceList)
    46  			if !ok {
    47  				continue
    48  			}
    49  			quantity := node.Status.Allocatable[corev1.ResourceName("openshift.io/"+resourceName)]
    50  			resourceCount64, _ := (&quantity).AsInt64()
    51  			resourceCount := int(resourceCount64)
    52  			if resourceCount > preferredResourceCount {
    53  				preferredResourceCount = resourceCount
    54  				preferredResourceName = resourceName
    55  				preferredNode = node.ObjectMeta.Name
    56  				preferredDevice = device
    57  			}
    58  		}
    59  	}
    60  	return
    61  }
    62  
    63  func getSriovNodes(clients *client.ClientSet, sriovNodeNames []string) ([]corev1.Node, error) {
    64  	var nodes []corev1.Node
    65  	for _, sriovNodeName := range sriovNodeNames {
    66  		node, err := clients.CoreV1Interface.Nodes().Get(context.Background(), sriovNodeName, metav1.GetOptions{})
    67  		if err != nil {
    68  			return nil, err
    69  		}
    70  		nodes = append(nodes, *node)
    71  	}
    72  	return nodes, nil
    73  }