Description of problem: os-net-config should configure ethtool_opts for SRIOV-VF. The current os-net-config in OSP16.x and upstream don't have the implementation of ethtool_opts for SRIOV VF. In the discussion with SBR-Networking, the VF's option configured by ethtool should work separately from SRIOV PF. Due to that, os-net-config should accept ethtool_opts for SRIOV VF. ~~~ 1362 class SriovVF(_BaseOpts): 1363 """Base class for SR-IOV VF.""" 1364 1365 def __init__(self, device, vfid, use_dhcp=False, use_dhcpv6=False, 1366 addresses=None, routes=None, rules=None, mtu=None, 1367 primary=False, nic_mapping=None, persist_mapping=False, 1368 defroute=True, dhclient_args=None, dns_servers=None, 1369 nm_controlled=False, onboot=True, domain=None, vlan_id=0, 1370 qos=0, spoofcheck=None, trust=None, state=None, macaddr=None, 1371 promisc=None, min_tx_rate=0, max_tx_rate=0): 1372 addresses = addresses or [] 1373 routes = routes or [] 1374 rules = rules or [] 1375 dns_servers = dns_servers or [] 1376 mapped_nic_names = mapped_nics(nic_mapping) 1377 if device in mapped_nic_names: 1378 device = mapped_nic_names[device] 1379 # Empty strings are set for the name field. 1380 # The provider shall identify the VF name from the PF device name 1381 # (device) and the VF id. 1382 name = utils.get_vf_devname(device, vfid) 1383 super(SriovVF, self).__init__(name, use_dhcp, use_dhcpv6, addresses, 1384 routes, rules, mtu, primary, nic_mapping, 1385 persist_mapping, defroute, 1386 dhclient_args, dns_servers, 1387 nm_controlled, onboot, domain) 1388 self.vfid = int(vfid) 1389 self.device = device 1390 self.vlan_id = int(vlan_id) 1391 self.qos = int(qos) 1392 self.min_tx_rate = int(min_tx_rate) 1393 self.max_tx_rate = int(max_tx_rate) 1394 self.spoofcheck = spoofcheck 1395 self.trust = trust 1396 self.state = state 1397 pci_address = utils.get_pci_address(name, False) 1398 if pci_address is None: 1399 pci_address = utils.get_stored_pci_address(name, False) 1400 self.macaddr = macaddr 1401 self.promisc = promisc 1402 self.pci_address = pci_address 1403 utils.update_sriov_vf_map(device, self.vfid, name, 1404 vlan_id=self.vlan_id, 1405 qos=self.qos, 1406 spoofcheck=spoofcheck, 1407 trust=trust, 1408 state=state, 1409 macaddr=macaddr, 1410 promisc=promisc, 1411 pci_address=pci_address, 1412 min_tx_rate=min_tx_rate, 1413 max_tx_rate=max_tx_rate) 1414 ~~~ ~~~ 1457 class SriovPF(_BaseOpts): 1458 """Base class for SR-IOV PF.""" 1459 1460 def __init__(self, name, numvfs, use_dhcp=False, use_dhcpv6=False, 1461 addresses=None, routes=None, rules=None, mtu=None, 1462 primary=False, nic_mapping=None, persist_mapping=False, 1463 defroute=True, dhclient_args=None, dns_servers=None, 1464 nm_controlled=False, onboot=True, domain=None, members=None, 1465 promisc=None, link_mode='legacy', ethtool_opts=None): 1466 addresses = addresses or [] 1467 routes = routes or [] 1468 rules = rules or [] 1469 dns_servers = dns_servers or [] 1470 super(SriovPF, self).__init__(name, use_dhcp, use_dhcpv6, addresses, 1471 routes, rules, mtu, primary, nic_mapping, 1472 persist_mapping, defroute, 1473 dhclient_args, dns_servers, 1474 nm_controlled, onboot, domain) 1475 self.numvfs = int(numvfs) 1476 mapped_nic_names = mapped_nics(nic_mapping) 1477 if name in mapped_nic_names: 1478 self.name = mapped_nic_names[name] 1479 else: 1480 self.name = name 1481 self.promisc = promisc 1482 self.link_mode = link_mode 1483 self.ethtool_opts = ethtool_opts ~~~ Version-Release number of selected component (if applicable): os-net-config in OSP16.x and upstream. How reproducible: Everytime Steps to Reproduce: 1. Add ethtool_opts option to sriov vf 2. 3. Actual results: os-net-config exited with an error. Expected results: os-net-config can handle ethtool_opts for SRIOV VF. Additional info: