1 # Copyright 2015 Intel Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 """VSPERF Vanilla OVS implementation
19 from conf import settings
20 from vswitches.vswitch import IVSwitch
21 from src.ovs import VSwitchd, OFBridge
22 from tools.module_manager import ModuleManager
23 from tools import tasks
25 _LOGGER = logging.getLogger(__name__)
26 VSWITCHD_CONST_ARGS = ['--', '--log-file']
28 class OvsVanilla(IVSwitch):
29 """VSwitch Vanilla implementation
31 This is wrapper for functionality implemented in src.ovs.
33 The method docstrings document only considerations specific to this
34 implementation. For generic information of the nature of the methods,
35 see the interface definition.
38 _logger = logging.getLogger()
39 _ports = settings.getValue('VSWITCH_VANILLA_PHY_PORT_NAMES')
44 #vswitchd_args = VSWITCHD_CONST_ARGS
45 vswitchd_args = ["unix:%s" % VSwitchd.get_db_sock_path()]
46 vswitchd_args += settings.getValue('VSWITCHD_VANILLA_ARGS')
47 self._vswitchd = VSwitchd(vswitchd_args=vswitchd_args,
48 expected_cmd="db.sock: connected")
50 self._module_manager = ModuleManager()
53 """See IVswitch for general description
55 Activates kernel modules, ovsdb and vswitchd.
57 self._module_manager.insert_modules(
58 settings.getValue('VSWITCH_VANILLA_KERNEL_MODULES'))
59 self._logger.info("Starting Vswitchd...")
60 self._vswitchd.start()
61 self._logger.info("Vswitchd...Started.")
64 """See IVswitch for general description
66 Kills ovsdb and vswitchd and removes kernel modules.
68 # remove all tap interfaces
69 for i in range(self._vport_id):
71 tasks.run_task(['sudo', 'ip', 'tuntap', 'del',
73 _LOGGER, 'Deleting ' + tapx, False)
77 self._module_manager.remove_modules()
80 def add_switch(self, switch_name):
81 """See IVswitch for general description
83 bridge = OFBridge(switch_name)
85 bridge.set_db_attribute('Open_vSwitch', '.',
86 'other_config:max-idle', '60000')
87 self._bridges[switch_name] = bridge
89 def del_switch(self, switch_name):
90 """See IVswitch for general description
92 bridge = self._bridges[switch_name]
93 self._bridges.pop(switch_name)
96 def add_phy_port(self, switch_name):
98 Method adds port based on configured VSWITCH_VANILLA_PHY_PORT_NAMES
99 stored in config file.
101 See IVswitch for general description
103 if self._current_id == len(self._ports):
104 self._logger.error("Can't add port! There are only " +
105 len(self._ports) + " ports " +
106 "defined in config!")
109 if not self._ports[self._current_id]:
110 self._logger.error("VSWITCH_VANILLA_PHY_PORT_NAMES not set")
111 raise ValueError("Invalid VSWITCH_VANILLA_PHY_PORT_NAMES")
113 bridge = self._bridges[switch_name]
114 port_name = self._ports[self._current_id]
118 tasks.run_task(['sudo', 'ifconfig', port_name, '0'],
119 _LOGGER, 'Remove IP', False)
121 of_port = bridge.add_port(port_name, params)
122 self._current_id += 1
123 return (port_name, of_port)
125 def add_vport(self, switch_name):
127 Method adds virtual port into OVS vanilla
129 See IVswitch for general description
131 # Create tap devices for the VM
132 tap_name = 'tap' + str(self._vport_id)
135 tasks.run_task(['sudo', 'ip', 'tuntap', 'del',
136 tap_name, 'mode', 'tap'],
137 _LOGGER, 'Creating tap device...', False)
139 tasks.run_task(['sudo', 'ip', 'tuntap', 'add',
140 tap_name, 'mode', 'tap'],
141 _LOGGER, 'Creating tap device...', False)
143 tasks.run_task(['sudo', 'ifconfig', tap_name, '0'],
144 _LOGGER, 'Bring up ' + tap_name, False)
146 bridge = self._bridges[switch_name]
147 of_port = bridge.add_port(tap_name, [])
148 return (tap_name, of_port)
151 def get_ports(self, switch_name):
152 """See IVswitch for general description
154 bridge = self._bridges[switch_name]
155 ports = list(bridge.get_ports().items())
156 return [(name, of_port) for (name, (of_port, _)) in ports]
158 def del_port(self, switch_name, port_name):
159 """See IVswitch for general description
161 bridge = self._bridges[switch_name]
162 bridge.del_port(port_name)
164 def add_flow(self, switch_name, flow):
165 """See IVswitch for general description
167 bridge = self._bridges[switch_name]
168 bridge.add_flow(flow)
170 def del_flow(self, switch_name, flow=None):
171 """See IVswitch for general description
174 bridge = self._bridges[switch_name]
175 bridge.del_flow(flow)
177 def dump_flows(self, switch_name):
178 """See IVswitch for general description
180 bridge = self._bridges[switch_name]