From 63b56ed1d74657129006f066a3f118c4c369d23c Mon Sep 17 00:00:00 2001 From: Martin Klozik Date: Tue, 15 May 2018 01:42:35 -0700 Subject: connections: Introduction of generic API Redesign of vSwitch and vSwitch controller classes, to use generic connection methods for configuration of vSwitch. This API is more generic and vSwitch agnostic, thus deployment scenarios like P2P, PVP, PVVP (i.e. PVVPx) can be used for all (currently) supported vSwitches. Usage of new API will simplify an introduction of new vSwitches in the future. This patchset introduces following changes: * OVS: implementation of add_, del_, dump_ connection(s) and their validation methods * VPP: bidir parameter removed - it is up to the deployment scenario implementation to take care about bidirectional connections * P2P and PXP controllers were updated to use connection methods instead of flow related methods. Thus standard TCs will support both OVS and VPP. NOTE, PVPV is not supported for VPP (yet?). * refactoring of vSwitch interfaces and inherited classes * VPP step driven TCs were replaced by standard TCs with appropriate deployment scenarios. This is for backward compatibility with TC reporting. Once reporting of VPP TC results into results DB will be modified, this TCs can be removed. * OVS routing tables support was generalized to support P2P and PXP deployments and step driven TCs. Usage of OVS routing tables is now configurable (turned off by default) for better comparison of results among various vSwitches. * Multistream pre_installed_flows feature was generalized to support P2P and PXP deployments and step driven TCs. * IxNet: TRAFFIC['l4']['dstport'] will be used as a start value for port iteration if L4 multistream feature is enabled. * OVS: default flow template is now configurable via OVS_FLOW_TEMPLATE * OVS: support of TRAFFIC['flow_type']='ip' was generalized to work with connection methods (i.e. with P2P and PXP deployments and step driven TCs) * integration TCs: modification of integration TCs and their macros to utilize new generic connection based API * CI: list of TCs for VERIFY & MERGE jobs was changed to run the same generic tests for both OVS & VPP * documentation update * small fixes and improvements JIRA: VSPERF-579 Change-Id: If4e6e6037929eab9f16c2bbcb8a0fb30e5d6f9b0 Signed-off-by: Martin Klozik Reviewed-by: Richard Elias Reviewed-by: Al Morton Reviewed-by: Christian Trautman Reviewed-by: Sridhar Rao --- core/vswitch_controller_p2p.py | 132 ++++------------------------------------- 1 file changed, 13 insertions(+), 119 deletions(-) (limited to 'core/vswitch_controller_p2p.py') diff --git a/core/vswitch_controller_p2p.py b/core/vswitch_controller_p2p.py index eb1f57f0..d8f22e4c 100644 --- a/core/vswitch_controller_p2p.py +++ b/core/vswitch_controller_p2p.py @@ -1,4 +1,4 @@ -# Copyright 2015-2017 Intel Corporation. +# Copyright 2015-2018 Intel Corporation., Tieto # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,20 +14,9 @@ """VSwitch controller for Physical to Physical deployment """ - -import logging -import netaddr - from core.vswitch_controller import IVswitchController from conf import settings -_FLOW_TEMPLATE = { - 'idle_timeout': '0' -} - -_PROTO_TCP = 6 -_PROTO_UDP = 17 - class VswitchControllerP2P(IVswitchController): """VSwitch controller for P2P deployment scenario. @@ -37,17 +26,11 @@ class VswitchControllerP2P(IVswitchController): _deployment_scenario: A string describing the scenario to set-up in the constructor. """ - def __init__(self, vswitch_class, traffic): - """Initializes up the prerequisites for the P2P deployment scenario. - - :vswitch_class: the vSwitch class to be used. + def __init__(self, deployment, vswitch_class, traffic): + """See IVswitchController for general description """ - self._logger = logging.getLogger(__name__) - self._vswitch_class = vswitch_class - self._vswitch = vswitch_class() - self._deployment_scenario = "P2P" - self._logger.debug('Creation using %s', str(self._vswitch_class)) - self._traffic = traffic.copy() + super().__init__(deployment, vswitch_class, traffic) + self._bridge = settings.getValue('VSWITCH_BRIDGE_NAME') def setup(self): """Sets up the switch for p2p. @@ -57,51 +40,14 @@ class VswitchControllerP2P(IVswitchController): try: self._vswitch.start() - bridge = settings.getValue('VSWITCH_BRIDGE_NAME') - self._vswitch.add_switch(bridge) - - (_, _) = self._vswitch.add_phy_port(bridge) - (_, _) = self._vswitch.add_phy_port(bridge) - - self._vswitch.del_flow(bridge) - - # table#0 - flows designed to force 5 & 13 tuple matches go here - flow = {'table':'0', 'priority':'1', 'actions': ['goto_table:1']} - self._vswitch.add_flow(bridge, flow) - - # table#1 - flows to route packets between ports goes here. The - # chosen port is communicated to subsequent tables by setting the - # metadata value to the egress port number + self._vswitch.add_switch(self._bridge) - # configure flows according to the TC definition - flow_template = _FLOW_TEMPLATE.copy() - if self._traffic['flow_type'] == 'IP': - flow_template.update({'dl_type':'0x0800', 'nw_src':self._traffic['l3']['srcip'], - 'nw_dst':self._traffic['l3']['dstip']}) + (port1, _) = self._vswitch.add_phy_port(self._bridge) + (port2, _) = self._vswitch.add_phy_port(self._bridge) - flow = flow_template.copy() - flow.update({'table':'1', 'priority':'1', 'in_port':'1', - 'actions': ['write_actions(output:2)', 'write_metadata:0x2', - 'goto_table:2']}) - self.process_flow_template(bridge, flow) - flow = flow_template.copy() - flow.update({'table':'1', 'priority':'1', 'in_port':'2', - 'actions': ['write_actions(output:1)', 'write_metadata:0x1', - 'goto_table:2']}) - self.process_flow_template(bridge, flow) + self._vswitch.add_connection(self._bridge, port1, port2, self._traffic) + self._vswitch.add_connection(self._bridge, port2, port1, self._traffic) - # Frame modification table. Frame modification flow rules are - # isolated in this table so that they can be turned on or off - # without affecting the routing or tuple-matching flow rules. - flow = {'table':'2', 'priority':'1', 'actions': ['goto_table:3']} - self._vswitch.add_flow(bridge, flow) - - # Egress table - # (TODO) Billy O'Mahony - the drop action here actually required in - # order to egress the packet. This is the subject of a thread on - # ovs-discuss 2015-06-30. - flow = {'table':'3', 'priority':'1', 'actions': ['drop']} - self._vswitch.add_flow(bridge, flow) except: self._vswitch.stop() raise @@ -112,65 +58,13 @@ class VswitchControllerP2P(IVswitchController): self._logger.debug('Stop using %s', str(self._vswitch_class)) self._vswitch.stop() - def __enter__(self): - self.setup() - - def __exit__(self, type_, value, traceback): - self.stop() - - def get_vswitch(self): - """See IVswitchController for description - """ - return self._vswitch - def get_ports_info(self): """See IVswitchController for description """ self._logger.debug('get_ports_info using %s', str(self._vswitch_class)) - return self._vswitch.get_ports(settings.getValue('VSWITCH_BRIDGE_NAME')) + return self._vswitch.get_ports(self._bridge) - def dump_vswitch_flows(self): + def dump_vswitch_connections(self): """See IVswitchController for description """ - self._vswitch.dump_flows(settings.getValue('VSWITCH_BRIDGE_NAME')) - - def process_flow_template(self, bridge, flow_template): - """Method adds flows into the vswitch based on given flow template - and configuration of multistream feature. - """ - if ('pre_installed_flows' in self._traffic and - self._traffic['pre_installed_flows'].lower() == 'yes' and - 'multistream' in self._traffic and self._traffic['multistream'] > 0 and - 'stream_type' in self._traffic): - # multistream feature is enabled and flows should be inserted into OVS - # so generate flows based on template and multistream configuration - if self._traffic['stream_type'] == 'L2': - # iterate through destimation MAC address - dst_mac_value = netaddr.EUI(self._traffic['l2']['dstmac']).value - for i in range(self._traffic['multistream']): - tmp_mac = netaddr.EUI(dst_mac_value + i) - tmp_mac.dialect = netaddr.mac_unix_expanded - flow_template.update({'dl_dst':tmp_mac}) - # optimize flow insertion by usage of cache - self._vswitch.add_flow(bridge, flow_template, cache='on') - elif self._traffic['stream_type'] == 'L3': - # iterate through destimation IP address - dst_ip_value = netaddr.IPAddress(self._traffic['l3']['dstip']).value - for i in range(self._traffic['multistream']): - tmp_ip = netaddr.IPAddress(dst_ip_value + i) - flow_template.update({'dl_type':'0x0800', 'nw_dst':tmp_ip}) - # optimize flow insertion by usage of cache - self._vswitch.add_flow(bridge, flow_template, cache='on') - elif self._traffic['stream_type'] == 'L4': - # read transport protocol from configuration and iterate through its destination port - proto = _PROTO_TCP if self._traffic['l3']['proto'].lower() == 'tcp' else _PROTO_UDP - for i in range(self._traffic['multistream']): - flow_template.update({'dl_type':'0x0800', 'nw_proto':proto, 'tp_dst':i}) - # optimize flow insertion by usage of cache - self._vswitch.add_flow(bridge, flow_template, cache='on') - else: - self._logger.error('Stream type is set to uknown value %s', self._traffic['stream_type']) - # insert cached flows into the OVS - self._vswitch.add_flow(bridge, [], cache='flush') - else: - self._vswitch.add_flow(bridge, flow_template) + self._vswitch.dump_connections(self._bridge) -- cgit 1.2.3-korg