def plug(self, instance, vif): """Plug using hybrid strategy Create a per-VIF linux bridge, then link that bridge to the OVS integration bridge via a veth device, setting up the other end of the veth device just like a normal OVS port. Then boot the VIF on the linux bridge using standard libvirt mechanisms. """ iface_id = vif.ovs_interfaceid br_name = vif.br_name v1_name, v2_name = vif.veth_pair_names if not linux_net.device_exists(br_name): processutils.execute('brctl', 'addbr', br_name, run_as_root=True) processutils.execute('brctl', 'setfd', br_name, 0, run_as_root=True) processutils.execute('brctl', 'stp', br_name, 'off', run_as_root=True) syspath = '/sys/class/net/%s/bridge/multicast_snooping' syspath = syspath % br_name processutils.execute('tee', syspath, process_input='0', check_exit_code=[0, 1], run_as_root=True) if not linux_net.device_exists(v2_name): linux_net.create_veth_pair(v1_name, v2_name, self.network_device_mtu) processutils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True) processutils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True) linux_net.create_ovs_vif_port(vif.bridge_name, v2_name, iface_id, vif.address, instance.uuid)
def _post_plug_wiring_veth_and_bridge(instance, vif): """Wire/plug the virtual interface for the instance into the bridge that lxd is using. :param instance: the instance to plug into the bridge :type instance: ??? :param vif: the virtual interface to plug into the bridge :type vif: :class:`nova.network.model.VIF` """ config = get_config(vif) network = vif.get('network') mtu = network.get_meta('mtu') if network else None v1_name = get_vif_devname(vif) v2_name = get_vif_internal_devname(vif) if not network_utils.device_exists(v1_name): _create_veth_pair(v1_name, v2_name, mtu) if _is_ovs_vif_port(vif): # NOTE(jamespage): wire tap device directly to ovs bridge linux_net.create_ovs_vif_port(vif['network']['bridge'], v1_name, vif['id'], vif['address'], instance.uuid, mtu) else: # NOTE(jamespage): wire tap device linux bridge _add_bridge_port(config['bridge'], v1_name) else: network_utils.set_device_mtu(v1_name, mtu)
def test_ovs_vif_port_with_no_timeout(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl): linux_net.create_ovs_vif_port('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid") self.assertTrue(mock_create_cmd.called) self.assertFalse(mock_set_device_mtu.called) mock_vsctl.assert_called_with('ovs_command', timeout=None)
def test_ovs_vif_port_with_no_timeout(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl): linux_net.create_ovs_vif_port( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid") self.assertTrue(mock_create_cmd.called) self.assertFalse(mock_set_device_mtu.called) mock_vsctl.assert_called_with('ovs_command', timeout=None)
def _create_vif_port(self, vif, vif_name, instance_info, **kwargs): linux_net.create_ovs_vif_port(vif.network.bridge, vif_name, vif.port_profile.interface_id, vif.address, instance_info.uuid, self.config.network_device_mtu, timeout=self.config.ovs_vsctl_timeout, **kwargs)
def test_ovs_vif_port_with_no_mtu(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl): linux_net.create_ovs_vif_port( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid") mock_create_cmd.assert_called_once_with('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", None, None) self.assertFalse(mock_set_device_mtu.called) self.assertTrue(mock_vsctl.called)
def _create_vif_port(self, vif, vif_name, instance_info, **kwargs): mtu = self._get_mtu(vif) linux_net.create_ovs_vif_port( vif.network.bridge, vif_name, vif.port_profile.interface_id, vif.address, instance_info.uuid, mtu, timeout=self.config.ovs_vsctl_timeout, ovsdb_connection=self.config.ovsdb_connection, **kwargs)
def plug(self, vif, instance_info): """Plug using hybrid strategy Create a per-VIF linux bridge, then link that bridge to the OVS integration bridge via a veth device, setting up the other end of the veth device just like a normal OVS port. Then boot the VIF on the linux bridge using standard libvirt mechanisms. """ if not hasattr(vif, "port_profile"): raise exception.MissingPortProfile() if not isinstance(vif.port_profile, objects.vif.VIFPortProfileOpenVSwitch): raise exception.WrongPortProfile( profile=vif.port_profile.__class__.__name__) v1_name, v2_name = self.get_veth_pair_names(vif) if not linux_net.device_exists(vif.bridge_name): processutils.execute('brctl', 'addbr', vif.bridge_name, run_as_root=True) processutils.execute('brctl', 'setfd', vif.bridge_name, 0, run_as_root=True) processutils.execute('brctl', 'stp', vif.bridge_name, 'off', run_as_root=True) syspath = '/sys/class/net/%s/bridge/multicast_snooping' syspath = syspath % vif.bridge_name processutils.execute('tee', syspath, process_input='0', check_exit_code=[0, 1], run_as_root=True) disv6 = ('/proc/sys/net/ipv6/conf/%s/disable_ipv6' % vif.bridge_name) if os.path.exists(disv6): processutils.execute('tee', disv6, process_input='1', run_as_root=True, check_exit_code=[0, 1]) if not linux_net.device_exists(v2_name): linux_net.create_veth_pair(v1_name, v2_name, self.config.network_device_mtu) processutils.execute('ip', 'link', 'set', vif.bridge_name, 'up', run_as_root=True) processutils.execute('brctl', 'addif', vif.bridge_name, v1_name, run_as_root=True) linux_net.create_ovs_vif_port( vif.network.bridge, v2_name, vif.port_profile.interface_id, vif.address, instance_info.uuid, self.config.network_device_mtu, timeout=self.config.ovs_vsctl_timeout)
def test_ovs_vif_port_with_type_vhostuser(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl): linux_net.create_ovs_vif_port( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", mtu=1500, interface_type=constants.OVS_VHOSTUSER_INTERFACE_TYPE) mock_create_cmd.assert_called_once_with('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", constants.OVS_VHOSTUSER_INTERFACE_TYPE, None) self.assertFalse(mock_set_device_mtu.called) self.assertTrue(mock_vsctl.called)
def test_ovs_vif_port_with_no_timeout(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl, mock_set_mtu_request, mock_ovs_supports_mtu_requests): mock_ovs_supports_mtu_requests.return_value = True linux_net.create_ovs_vif_port('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid") self.assertTrue(mock_create_cmd.called) self.assertFalse(mock_set_device_mtu.called) mock_vsctl.assert_called_with('ovs_command', ovsdb_connection=None, timeout=None)
def test_ovs_vif_port_with_no_mtu(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl, mock_ovs_supports_mtu_requests): mock_ovs_supports_mtu_requests.return_value = True linux_net.create_ovs_vif_port('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid") mock_create_cmd.assert_called_once_with('fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", None, None) self.assertFalse(mock_set_device_mtu.called) self.assertTrue(mock_vsctl.called)
def _create_vif_port(self, vif, vif_name, instance_info, **kwargs): if vif.network and vif.network.mtu: mtu = vif.network.mtu else: mtu = self.config.network_device_mtu linux_net.create_ovs_vif_port( vif.network.bridge, vif_name, vif.port_profile.interface_id, vif.address, instance_info.uuid, mtu, timeout=self.config.ovs_vsctl_timeout, **kwargs)
def test_ovs_vif_port_with_type_vhostuser(self, mock_set_device_mtu, mock_create_cmd, mock_vsctl): linux_net.create_ovs_vif_port( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", mtu=1500, interface_type=constants.OVS_VHOSTUSER_INTERFACE_TYPE) mock_create_cmd.assert_called_once_with( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", constants.OVS_VHOSTUSER_INTERFACE_TYPE) self.assertFalse(mock_set_device_mtu.called) self.assertTrue(mock_vsctl.called)
def test_ovs_vif_port_with_type_vhostuserclient( self, mock_set_device_mtu, mock_create_cmd, mock_vsctl, mock_ovs_supports_mtu_requests): mock_ovs_supports_mtu_requests.return_value = True linux_net.create_ovs_vif_port( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", mtu=1500, interface_type=constants.OVS_VHOSTUSER_CLIENT_INTERFACE_TYPE, vhost_server_path="/fake/path") mock_create_cmd.assert_called_once_with( 'fake-bridge', 'fake-dev', 'fake-iface-id', 'fake-mac', "fake-instance-uuid", constants.OVS_VHOSTUSER_CLIENT_INTERFACE_TYPE, "/fake/path") self.assertFalse(mock_set_device_mtu.called) self.assertTrue(mock_vsctl.called)