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

     1  package cluster
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	sriovv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
    10  )
    11  
    12  func init() {
    13  	sriovv1.InitNicIDMapFromList([]string{
    14  		"8086 158b 154c",
    15  		"15b3 1015 1016",
    16  	})
    17  }
    18  
    19  func TestFindSriovDevices(t *testing.T) {
    20  	nodes := &EnabledNodes{
    21  		Nodes: []string{"worker-0", "worker-1"},
    22  		States: map[string]sriovv1.SriovNetworkNodeState{
    23  			"worker-0": {
    24  				Status: sriovv1.SriovNetworkNodeStateStatus{
    25  					Interfaces: sriovv1.InterfaceExts{
    26  						makeConnectX4LX("eno1np0", "0000:19:00.0"),
    27  						makeConnectX4LX("eno1np1", "0000:19:00.1"),
    28  						makeSfp28("ens3f0", "0000:d8:00.0"),
    29  						makeSfp28("ens3f1", "0000:d8:00.0"),
    30  					},
    31  				},
    32  			},
    33  			"worker-1": {
    34  				Status: sriovv1.SriovNetworkNodeStateStatus{
    35  					Interfaces: sriovv1.InterfaceExts{
    36  						makeConnectX4LX("eno1np0", "0000:19:00.0"),
    37  						makeConnectX4LX("eno1np1", "0000:19:00.1"),
    38  						makeSfp28("ens3f0", "0000:d8:00.0"),
    39  						makeSfp28("ens3f1", "0000:d8:00.0"),
    40  					},
    41  				},
    42  			},
    43  		},
    44  		IsSecureBootEnabled: map[string]bool{
    45  			"worker-0": false,
    46  			"worker-1": true,
    47  		},
    48  	}
    49  
    50  	w0, err := nodes.FindSriovDevices("worker-0")
    51  	assert.NoError(t, err)
    52  
    53  	w0Names := extractNames(w0)
    54  	assert.Contains(t, w0Names, "eno1np0")
    55  	assert.Contains(t, w0Names, "eno1np1")
    56  	assert.Contains(t, w0Names, "ens3f0")
    57  	assert.Contains(t, w0Names, "ens3f1")
    58  
    59  	w1, err := nodes.FindSriovDevices("worker-1")
    60  	assert.NoError(t, err)
    61  
    62  	w1Names := extractNames(w1)
    63  	// worker-1 has SecureBoot enabled
    64  	assert.NotContains(t, w1Names, "eno1np0")
    65  	assert.NotContains(t, w1Names, "eno1np1")
    66  	assert.Contains(t, w1Names, "ens3f0")
    67  	assert.Contains(t, w1Names, "ens3f1")
    68  }
    69  
    70  func TestFindSriovDevicesFilteredByEnv(t *testing.T) {
    71  	nodes := &EnabledNodes{
    72  		Nodes: []string{"worker-0"},
    73  		States: map[string]sriovv1.SriovNetworkNodeState{
    74  			"worker-0": {
    75  				Status: sriovv1.SriovNetworkNodeStateStatus{
    76  					Interfaces: sriovv1.InterfaceExts{
    77  						makeConnectX4LX("eno1np0", "0000:19:00.0"),
    78  						makeConnectX4LX("eno1np1", "0000:19:00.1"),
    79  					},
    80  				},
    81  			},
    82  		},
    83  		IsSecureBootEnabled: map[string]bool{
    84  			"worker-0": false,
    85  		},
    86  	}
    87  
    88  	originalValue := os.Getenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER")
    89  	defer os.Setenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER", originalValue)
    90  
    91  	os.Setenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER", ".*:eno1np1")
    92  	w0, err := nodes.FindSriovDevices("worker-0")
    93  	assert.NoError(t, err)
    94  	w0Names := extractNames(w0)
    95  	assert.NotContains(t, w0Names, "eno1np0")
    96  	assert.Contains(t, w0Names, "eno1np1")
    97  
    98  	os.Setenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER", ".*:eno1.*")
    99  	w0, err = nodes.FindSriovDevices("worker-0")
   100  	assert.NoError(t, err)
   101  	w0Names = extractNames(w0)
   102  	assert.Contains(t, w0Names, "eno1np0")
   103  	assert.Contains(t, w0Names, "eno1np1")
   104  }
   105  
   106  func TestFindSriovDevicesFilteredByEnvOnDifferentNode(t *testing.T) {
   107  	nodes := &EnabledNodes{
   108  		Nodes: []string{"worker-0"},
   109  		States: map[string]sriovv1.SriovNetworkNodeState{
   110  			"worker-0": {
   111  				Status: sriovv1.SriovNetworkNodeStateStatus{
   112  					Interfaces: sriovv1.InterfaceExts{
   113  						makeConnectX4LX("eno1", "0000:19:00.0"),
   114  						makeConnectX4LX("eno2", "0000:19:00.1"),
   115  					},
   116  				},
   117  			},
   118  			"worker-1": {
   119  				Status: sriovv1.SriovNetworkNodeStateStatus{
   120  					Interfaces: sriovv1.InterfaceExts{
   121  						makeConnectX4LX("eno1", "0000:19:00.0"),
   122  						makeConnectX4LX("eno2", "0000:19:00.1"),
   123  					},
   124  				},
   125  			},
   126  		},
   127  		IsSecureBootEnabled: map[string]bool{
   128  			"worker-0": false,
   129  		},
   130  	}
   131  
   132  	originalValue := os.Getenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER")
   133  	defer os.Setenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER", originalValue)
   134  	os.Setenv("SRIOV_NODE_AND_DEVICE_NAME_FILTER", "worker-0:eno1|worker-1:eno2")
   135  
   136  	w0, err := nodes.FindSriovDevices("worker-0")
   137  	assert.NoError(t, err)
   138  	w0Names := extractNames(w0)
   139  	assert.Contains(t, w0Names, "eno1")
   140  	assert.NotContains(t, w0Names, "eno2")
   141  
   142  	w1, err := nodes.FindSriovDevices("worker-1")
   143  	assert.NoError(t, err)
   144  	w1Names := extractNames(w1)
   145  	assert.NotContains(t, w1Names, "eno1")
   146  	assert.Contains(t, w1Names, "eno2")
   147  }
   148  
   149  func makeConnectX4LX(name, pci string) sriovv1.InterfaceExt {
   150  	return sriovv1.InterfaceExt{
   151  		Vendor: "15b3", DeviceID: "1015", Driver: "mlx5_core",
   152  		Name: name, TotalVfs: 8, PciAddress: pci,
   153  	}
   154  }
   155  
   156  func makeSfp28(name, pci string) sriovv1.InterfaceExt {
   157  	return sriovv1.InterfaceExt{
   158  		Vendor: "8086", DeviceID: "158b", Driver: "i40e",
   159  		Name: name, TotalVfs: 64, PciAddress: pci,
   160  	}
   161  }
   162  
   163  func extractNames(in []*sriovv1.InterfaceExt) []string {
   164  	ret := make([]string, 0, len(in))
   165  	for _, intf := range in {
   166  		ret = append(ret, intf.Name)
   167  	}
   168  	return ret
   169  }