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 }