Exemple #1
0
    def plug(self, vif, instance_info):
        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__)

        if isinstance(vif, objects.vif.VIFOpenVSwitch):
            if sys.platform != constants.PLATFORM_WIN32:
                linux_net.ensure_ovs_bridge(vif.network.bridge,
                    self._get_vif_datapath_type(vif),
                    timeout=self.config.ovs_vsctl_timeout,
                    ovsdb_connection=self.config.ovsdb_connection)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFBridge):
            if sys.platform != constants.PLATFORM_WIN32:
                self._plug_bridge(vif, instance_info)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFVHostUser):
            self._plug_vhostuser(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFHostDevice):
            self._plug_vf_passthrough(vif, instance_info)
Exemple #2
0
    def _plug_bridge(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.
        """

        v1_name, v2_name = self.get_veth_pair_names(vif)

        linux_net.ensure_bridge(vif.bridge_name)

        mtu = self._get_mtu(vif)
        if not linux_net.device_exists(v2_name):
            linux_net.create_veth_pair(v1_name, v2_name, mtu)
            linux_net.add_bridge_port(vif.bridge_name, v1_name)
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                self._get_vif_datapath_type(vif),
                timeout=self.config.ovs_vsctl_timeout,
                ovsdb_connection=self.config.ovsdb_connection)
            self._create_vif_port(vif, v2_name, instance_info)
        else:
            linux_net.update_veth_pair(v1_name, v2_name, mtu)
            self._update_vif_port(vif, v2_name)
Exemple #3
0
    def _plug_vif_windows(self, vif, instance_info):
        """Create a per-VIF OVS port."""

        if not linux_net.device_exists(vif.id):
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                                        self._get_vif_datapath_type(vif))
            self._create_vif_port(vif, vif.id, instance_info)
Exemple #4
0
    def _plug_vif_windows(self, vif, instance_info):
        """Create a per-VIF OVS port."""

        if not linux_net.device_exists(vif.id):
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                                            constants.OVS_DATAPATH_SYSTEM)
            self._create_vif_port(vif, vif.id, instance_info)
Exemple #5
0
    def _plug_vif_windows(self, vif, instance_info):
        """Create a per-VIF OVS port."""

        if not linux_net.device_exists(vif.id):
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                                        constants.OVS_DATAPATH_SYSTEM)
            self._create_vif_port(vif, vif.id, instance_info)
Exemple #6
0
 def _plug_vhostuser(self, vif, instance_info):
     linux_net.ensure_ovs_bridge(vif.network.bridge,
                                 constants.OVS_DATAPATH_NETDEV)
     vif_name = OvsPlugin.gen_port_name("vhu", vif.id)
     self._create_vif_port(
         vif,
         vif_name,
         instance_info,
         interface_type=constants.OVS_VHOSTUSER_INTERFACE_TYPE)
Exemple #7
0
 def _plug_vf_passthrough(self, vif, instance_info):
     linux_net.ensure_ovs_bridge(vif.network.bridge,
                                 constants.OVS_DATAPATH_SYSTEM)
     pci_slot = vif.dev_address
     pf_ifname = linux_net.get_ifname_by_pci_address(pci_slot,
                                                     pf_interface=True,
                                                     switchdev=True)
     vf_num = linux_net.get_vf_num_by_pci_address(pci_slot)
     representor = linux_net.get_representor_port(pf_ifname, vf_num)
     linux_net.set_interface_state(representor, 'up')
     self._create_vif_port(vif, representor, instance_info)
Exemple #8
0
    def _plug_vhostuser(self, vif, instance_info):
        linux_net.ensure_ovs_bridge(vif.network.bridge,
                                    constants.OVS_DATAPATH_NETDEV)
        vif_name = OvsPlugin.gen_port_name(constants.OVS_VHOSTUSER_PREFIX,
                                           vif.id)
        args = {}
        if vif.mode == "client":
            args['interface_type'] = \
                constants.OVS_VHOSTUSER_INTERFACE_TYPE
        else:
            args['interface_type'] = \
                constants.OVS_VHOSTUSER_CLIENT_INTERFACE_TYPE
            args['vhost_server_path'] = vif.path

        self._create_vif_port(vif, vif_name, instance_info, **args)
Exemple #9
0
    def _plug_vhostuser(self, vif, instance_info):
        linux_net.ensure_ovs_bridge(vif.network.bridge,
                                    constants.OVS_DATAPATH_NETDEV)
        vif_name = OvsPlugin.gen_port_name(
            constants.OVS_VHOSTUSER_PREFIX, vif.id)
        args = {}
        if vif.mode == "client":
            args['interface_type'] = \
                constants.OVS_VHOSTUSER_INTERFACE_TYPE
        else:
            args['interface_type'] = \
                constants.OVS_VHOSTUSER_CLIENT_INTERFACE_TYPE
            args['vhost_server_path'] = vif.path

        self._create_vif_port(
            vif, vif_name, instance_info, **args)
Exemple #10
0
    def _plug_bridge(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.
        """

        v1_name, v2_name = self.get_veth_pair_names(vif)

        linux_net.ensure_bridge(vif.bridge_name)

        if not linux_net.device_exists(v2_name):
            linux_net.create_veth_pair(v1_name, v2_name,
                                       self.config.network_device_mtu)
            linux_net.add_bridge_port(vif.bridge_name, v1_name)
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                                        constants.OVS_DATAPATH_SYSTEM)
            self._create_vif_port(vif, v2_name, instance_info)
Exemple #11
0
    def plug(self, vif, instance_info):
        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__)

        if isinstance(vif, objects.vif.VIFOpenVSwitch):
            if sys.platform != constants.PLATFORM_WIN32:
                linux_net.ensure_ovs_bridge(vif.network.bridge,
                                            constants.OVS_DATAPATH_SYSTEM)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFBridge):
            if sys.platform != constants.PLATFORM_WIN32:
                self._plug_bridge(vif, instance_info)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFVHostUser):
            self._plug_vhostuser(vif, instance_info)
Exemple #12
0
    def plug(self, vif, instance_info):
        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__)

        if isinstance(vif, objects.vif.VIFOpenVSwitch):
            if sys.platform != constants.PLATFORM_WIN32:
                linux_net.ensure_ovs_bridge(vif.network.bridge,
                                            constants.OVS_DATAPATH_SYSTEM)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFBridge):
            if sys.platform != constants.PLATFORM_WIN32:
                self._plug_bridge(vif, instance_info)
            else:
                self._plug_vif_windows(vif, instance_info)
        elif isinstance(vif, objects.vif.VIFVHostUser):
            self._plug_vhostuser(vif, instance_info)
Exemple #13
0
    def _plug_bridge(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.
        """

        v1_name, v2_name = self.get_veth_pair_names(vif)

        linux_net.ensure_bridge(vif.bridge_name)

        if not linux_net.device_exists(v2_name):
            if vif.network and vif.network.mtu:
                mtu = vif.network.mtu
            else:
                mtu = self.config.network_device_mtu
            linux_net.create_veth_pair(v1_name, v2_name, mtu)
            linux_net.add_bridge_port(vif.bridge_name, v1_name)
            linux_net.ensure_ovs_bridge(vif.network.bridge,
                                        constants.OVS_DATAPATH_SYSTEM)
            self._create_vif_port(vif, v2_name, instance_info)
Exemple #14
0
 def test_ensure_ovs_bridge(self, mock_vsctl, mock_create_ovs_bridge):
     bridge = 'fake-bridge'
     dp_type = 'fake-type'
     linux_net.ensure_ovs_bridge(bridge, dp_type)
     mock_create_ovs_bridge.assert_called_once_with(bridge, dp_type)
     self.assertTrue(mock_vsctl.called)
Exemple #15
0
 def test_ensure_ovs_bridge(self, mock_vsctl, mock_create_ovs_bridge):
     bridge = 'fake-bridge'
     dp_type = 'fake-type'
     linux_net.ensure_ovs_bridge(bridge, dp_type)
     mock_create_ovs_bridge.assert_called_once_with(bridge, dp_type)
     self.assertTrue(mock_vsctl.called)