Esempio n. 1
0
    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)
Esempio n. 2
0
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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
 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)
Esempio n. 7
0
 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)
Esempio n. 9
0
 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)
Esempio n. 10
0
 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)
Esempio n. 11
0
 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)
Esempio n. 12
0
 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)
Esempio n. 13
0
 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)
Esempio n. 14
0
 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)