X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=vswitches%2Fovs_vanilla.py;h=12a460af19c96672bc0866d0cbc93cf151519abb;hb=refs%2Fchanges%2F33%2F27133%2F5;hp=77d3deaf575615a39f233a17db262597de781091;hpb=f463c563912abb806fe0d2fe85a4cf6825f416cc;p=vswitchperf.git diff --git a/vswitches/ovs_vanilla.py b/vswitches/ovs_vanilla.py index 77d3deaf..12a460af 100644 --- a/vswitches/ovs_vanilla.py +++ b/vswitches/ovs_vanilla.py @@ -17,16 +17,13 @@ import logging from conf import settings -from vswitches.vswitch import IVSwitch -from src.ovs import VSwitchd, OFBridge, DPCtl +from vswitches.ovs import IVSwitchOvs +from src.ovs import DPCtl from tools.module_manager import ModuleManager from tools import tasks -_LOGGER = logging.getLogger(__name__) -VSWITCHD_CONST_ARGS = ['--', '--log-file'] - -class OvsVanilla(IVSwitch): - """VSwitch Vanilla implementation +class OvsVanilla(IVSwitchOvs): + """ Open vSwitch This is wrapper for functionality implemented in src.ovs. @@ -35,31 +32,17 @@ class OvsVanilla(IVSwitch): see the interface definition. """ - _logger = logging.getLogger() - _ports = settings.getValue('VSWITCH_VANILLA_PHY_PORT_NAMES') _current_id = 0 _vport_id = 0 def __init__(self): - #vswitchd_args = VSWITCHD_CONST_ARGS - vswitchd_args = ["unix:%s" % VSwitchd.get_db_sock_path()] - vswitchd_args += settings.getValue('VSWITCHD_VANILLA_ARGS') - self._vswitchd = VSwitchd(vswitchd_args=vswitchd_args, - expected_cmd="db.sock: connected") - self._bridges = {} + super(OvsVanilla, self).__init__() + self._ports = list(nic['device'] for nic in settings.getValue('NICS')) + self._logger = logging.getLogger(__name__) + self._vswitchd_args += ["unix:%s" % self.get_db_sock_path()] + self._vswitchd_args += settings.getValue('VSWITCHD_VANILLA_ARGS') self._module_manager = ModuleManager() - def start(self): - """See IVswitch for general description - - Activates kernel modules, ovsdb and vswitchd. - """ - self._module_manager.insert_modules( - settings.getValue('VSWITCH_VANILLA_KERNEL_MODULES')) - self._logger.info("Starting Vswitchd...") - self._vswitchd.start() - self._logger.info("Vswitchd...Started.") - def stop(self): """See IVswitch for general description @@ -68,38 +51,23 @@ class OvsVanilla(IVSwitch): # remove all tap interfaces for i in range(self._vport_id): tapx = 'tap' + str(i) - tasks.run_task(['sudo', 'ip', 'tuntap', 'del', - tapx, 'mode', 'tap'], - _LOGGER, 'Deleting ' + tapx, False) + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'del', tapx, 'mode', 'tap'] + # let's assume, that all VMs have NIC QUEUES enabled or disabled + # at the same time + if int(settings.getValue('GUEST_NIC_QUEUES')[0]): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, 'Deleting ' + tapx, False) self._vport_id = 0 - self._vswitchd.kill() + super(OvsVanilla, self).stop() dpctl = DPCtl() dpctl.del_dp() self._module_manager.remove_modules() - - def add_switch(self, switch_name, params=None): - """See IVswitch for general description - """ - bridge = OFBridge(switch_name) - bridge.create(params) - bridge.set_db_attribute('Open_vSwitch', '.', - 'other_config:max-idle', '60000') - self._bridges[switch_name] = bridge - - def del_switch(self, switch_name): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - self._bridges.pop(switch_name) - bridge.destroy() - def add_phy_port(self, switch_name): """ - Method adds port based on configured VSWITCH_VANILLA_PHY_PORT_NAMES - stored in config file. + Method adds port based on detected device names. See IVswitch for general description """ @@ -110,16 +78,18 @@ class OvsVanilla(IVSwitch): raise if not self._ports[self._current_id]: - self._logger.error("VSWITCH_VANILLA_PHY_PORT_NAMES not set") - raise ValueError("Invalid VSWITCH_VANILLA_PHY_PORT_NAMES") + self._logger.error("Can't detect device name for NIC %s", self._current_id) + raise ValueError("Invalid device name for %s" % self._current_id) bridge = self._bridges[switch_name] port_name = self._ports[self._current_id] params = [] # For PVP only - tasks.run_task(['sudo', 'ifconfig', port_name, '0'], - _LOGGER, 'Remove IP', False) + tasks.run_task(['sudo', 'ip', 'addr', 'flush', 'dev', port_name], + self._logger, 'Remove IP', False) + tasks.run_task(['sudo', 'ip', 'link', 'set', 'dev', port_name, 'up'], + self._logger, 'Bring up ' + port_name, False) of_port = bridge.add_port(port_name, params) self._current_id += 1 @@ -134,98 +104,29 @@ class OvsVanilla(IVSwitch): # Create tap devices for the VM tap_name = 'tap' + str(self._vport_id) self._vport_id += 1 - - tasks.run_task(['sudo', 'ip', 'tuntap', 'del', - tap_name, 'mode', 'tap'], - _LOGGER, 'Creating tap device...', False) - - tasks.run_task(['sudo', 'ip', 'tuntap', 'add', - tap_name, 'mode', 'tap'], - _LOGGER, 'Creating tap device...', False) - - tasks.run_task(['sudo', 'ifconfig', tap_name, '0'], - _LOGGER, 'Bring up ' + tap_name, False) + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'del', tap_name, 'mode', 'tap'] + # let's assume, that all VMs have NIC QUEUES enabled or disabled + # at the same time + if int(settings.getValue('GUEST_NIC_QUEUES')[0]): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, + 'Creating tap device...', False) + + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'add', tap_name, 'mode', 'tap'] + # let's assume, that all VMs have NIC QUEUES enabled or disabled + # at the same time + if int(settings.getValue('GUEST_NIC_QUEUES')[0]): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, + 'Creating tap device...', False) + + tasks.run_task(['sudo', 'ip', 'addr', 'flush', 'dev', tap_name], + self._logger, 'Remove IP', False) + tasks.run_task(['sudo', 'ip', 'link', 'set', 'dev', tap_name, 'up'], + self._logger, 'Bring up ' + tap_name, False) bridge = self._bridges[switch_name] of_port = bridge.add_port(tap_name, []) return (tap_name, of_port) - def add_tunnel_port(self, switch_name, remote_ip, tunnel_type='vxlan', - params=None): - """Creates tunneling port - """ - bridge = self._bridges[switch_name] - pcount = str(self._get_port_count('type=' + tunnel_type)) - port_name = tunnel_type + pcount - local_params = ['--', 'set', 'Interface', port_name, - 'type=' + tunnel_type, - 'options:remote_ip=' + remote_ip] - - if params is not None: - local_params = local_params + params - - of_port = bridge.add_port(port_name, local_params) - return (port_name, of_port) - - def get_ports(self, switch_name): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - ports = list(bridge.get_ports().items()) - return [(name, of_port) for (name, (of_port, _)) in ports] - - def del_port(self, switch_name, port_name): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - bridge.del_port(port_name) - - def add_flow(self, switch_name, flow, cache='off'): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - bridge.add_flow(flow, cache=cache) - - def del_flow(self, switch_name, flow=None): - """See IVswitch for general description - """ - flow = flow or {} - bridge = self._bridges[switch_name] - bridge.del_flow(flow) - - def dump_flows(self, switch_name): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - bridge.dump_flows() - - def add_route(self, switch_name, network, destination): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - bridge.add_route(network, destination) - - def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): - """See IVswitch for general description - """ - bridge = self._bridges[switch_name] - bridge.set_tunnel_arp(ip_addr, mac_addr, switch_name) - - def _get_port_count(self, param): - """Returns the number of ports having a certain parameter - - :param bridge: The src.ovs.ofctl.OFBridge on which to operate - :param param: The parameter to search for - :returns: Count of matches - """ - cnt = 0 - for k in self._bridges: - pparams = [c for (_, (_, c)) in list(self._bridges[k].get_ports().items())] - phits = [i for i in pparams if param in i] - cnt += len(phits) - - if cnt is None: - cnt = 0 - return cnt -