Merge "sriov-mech: Introduce a new VIF type for PF vnic type"

This commit is contained in:
Jenkins 2016-01-27 18:46:25 +00:00 committed by Gerrit Code Review
commit 8f8b07d396
3 changed files with 21 additions and 9 deletions

View File

@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from oslo_log import log
@ -29,6 +28,7 @@ from neutron.services.qos import qos_consts
LOG = log.getLogger(__name__)
VIF_TYPE_HW_VEB = 'hw_veb'
VIF_TYPE_HOSTDEV_PHY = 'hostdev_physical'
FLAT_VLAN = 0
sriov_opts = [
@ -60,7 +60,6 @@ class SriovNicSwitchMechanismDriver(api.MechanismDriver):
def __init__(self,
agent_type=constants.AGENT_TYPE_NIC_SWITCH,
vif_type=VIF_TYPE_HW_VEB,
vif_details={portbindings.CAP_PORT_FILTER: False},
supported_vnic_types=[portbindings.VNIC_DIRECT,
portbindings.VNIC_MACVTAP,
@ -69,14 +68,18 @@ class SriovNicSwitchMechanismDriver(api.MechanismDriver):
"""Initialize base class for SriovNicSwitch L2 agent type.
:param agent_type: Constant identifying agent type in agents_db
:param vif_type: Value for binding:vif_type when bound
:param vif_details: Dictionary with details for VIF driver when bound
:param supported_vnic_types: The binding:vnic_type values we can bind
:param supported_pci_vendor_info: The pci_vendor_info values to bind
"""
self.agent_type = agent_type
self.supported_vnic_types = supported_vnic_types
self.vif_type = vif_type
# NOTE(ndipanov): PF passthrough requires a different vif type
self.vnic_type_for_vif_type = (
{vtype: VIF_TYPE_HOSTDEV_PHY
if vtype == portbindings.VNIC_DIRECT_PHYSICAL
else VIF_TYPE_HW_VEB
for vtype in self.supported_vnic_types})
self.vif_details = vif_details
self.supported_network_types = (p_const.TYPE_VLAN, p_const.TYPE_FLAT)
@ -100,6 +103,9 @@ class SriovNicSwitchMechanismDriver(api.MechanismDriver):
vnic_type)
return
vif_type = self.vnic_type_for_vif_type.get(vnic_type,
VIF_TYPE_HW_VEB)
if not self._check_supported_pci_vendor_device(context):
LOG.debug("Refusing to bind due to unsupported pci_vendor device")
return
@ -112,25 +118,25 @@ class SriovNicSwitchMechanismDriver(api.MechanismDriver):
# either. This should be changed in the future so physical
# functions can use device mapping checks and the plugin can
# get port status updates.
self.try_to_bind(context, None)
self.try_to_bind(context, None, vif_type)
return
for agent in context.host_agents(self.agent_type):
LOG.debug("Checking agent: %s", agent)
if agent['alive']:
if self.try_to_bind(context, agent):
if self.try_to_bind(context, agent, vif_type):
return
else:
LOG.warning(_LW("Attempting to bind with dead agent: %s"),
agent)
def try_to_bind(self, context, agent):
def try_to_bind(self, context, agent, vif_type):
for segment in context.segments_to_bind:
if self.check_segment(segment, agent):
port_status = (constants.PORT_STATUS_ACTIVE if agent is None
else constants.PORT_STATUS_DOWN)
context.set_binding(segment[api.ID],
self.vif_type,
vif_type,
self._get_vif_details(segment),
port_status)
LOG.debug("Bound using segment: %s", segment)

View File

@ -150,7 +150,7 @@ class SriovSwitchMechVnicTypeTestCase(SriovNicSwitchMechanismBaseTestCase):
def test_vnic_type_direct_physical(self):
self._check_vif_type_for_vnic_type(portbindings.VNIC_DIRECT_PHYSICAL,
mech_driver.VIF_TYPE_HW_VEB)
mech_driver.VIF_TYPE_HOSTDEV_PHY)
class SriovSwitchMechProfileTestCase(SriovNicSwitchMechanismBaseTestCase):

View File

@ -0,0 +1,6 @@
---
features:
- SriovNicSwitchMechanismDriver driver now exposes a new VIF type
'hostdev_physical' for ports with vnic type 'direct-physical' (used for
SR-IOV PF passthrough). This will enable Nova to provision PFs as Neutron
ports.