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 }