Exemple #1
0
    def plug(self,
             network_id,
             port_id,
             device_name,
             mac_address,
             bridge=None,
             namespace=None,
             prefix=None):
        """Plugin the interface."""
        if not ip_lib.device_exists(
                device_name, self.root_helper, namespace=namespace):
            ip = ip_lib.IPWrapper(self.root_helper)

            # Enable agent to define the prefix
            if prefix:
                tap_name = device_name.replace(prefix, 'tap')
            else:
                tap_name = device_name.replace(self.DEV_NAME_PREFIX, 'tap')
            root_veth, ns_veth = ip.add_veth(tap_name, device_name)
            ns_veth.link.set_address(mac_address)

            if self.conf.network_device_mtu:
                root_veth.link.set_mtu(self.conf.network_device_mtu)
                ns_veth.link.set_mtu(self.conf.network_device_mtu)

            if namespace:
                namespace_obj = ip.ensure_namespace(namespace)
                namespace_obj.add_device_to_namespace(ns_veth)

            root_veth.link.set_up()
            ns_veth.link.set_up()

        else:
            LOG.warn(_("Device %s already exists"), device_name)
Exemple #2
0
    def test_namespace_is_empty(self):
        ip = ip_lib.IPWrapper('sudo', 'ns')
        with mock.patch.object(ip, 'get_devices') as get_devices:
            get_devices.return_value = [mock.Mock()]

            self.assertFalse(ip.namespace_is_empty())
            get_devices.assert_called_once_with(exclude_loopback=True)
Exemple #3
0
    def test_garbage_collect_namespace_does_not_exist(self):
        with mock.patch.object(ip_lib, 'IpNetnsCommand') as ip_ns_cmd_cls:
            ip_ns_cmd_cls.return_value.exists.return_value = False
            ip = ip_lib.IPWrapper('sudo', 'ns')
            with mock.patch.object(ip, 'namespace_is_empty') as mock_is_empty:

                self.assertFalse(ip.garbage_collect_namespace())
                ip_ns_cmd_cls.assert_has_calls([mock.call().exists('ns')])
                self.assertNotIn(mock.call().delete('ns'),
                                 ip_ns_cmd_cls.return_value.mock_calls)
                self.assertEqual(mock_is_empty.mock_calls, [])
Exemple #4
0
 def test_ensure_namespace(self):
     with mock.patch.object(ip_lib, 'IPDevice') as ip_dev:
         ip = ip_lib.IPWrapper('sudo')
         with mock.patch.object(ip.netns, 'exists') as ns_exists:
             ns_exists.return_value = False
             ip.ensure_namespace('ns')
             self.execute.assert_has_calls(
                 [mock.call([], 'netns', ('add', 'ns'), 'sudo', None)])
             ip_dev.assert_has_calls(
                 [mock.call('lo', 'sudo', 'ns'),
                  mock.call().link.set_up()])
Exemple #5
0
    def test_get_devices_malformed_line(self):
        self.execute.return_value = '\n'.join(LINK_SAMPLE + ['gibberish'])
        retval = ip_lib.IPWrapper('sudo').get_devices()
        self.assertEqual(retval, [
            ip_lib.IPDevice('lo'),
            ip_lib.IPDevice('eth0'),
            ip_lib.IPDevice('br-int'),
            ip_lib.IPDevice('gw-ddc717df-49')
        ])

        self.execute.assert_called_once_with('o', 'link', ('list', ), 'sudo',
                                             None)
Exemple #6
0
    def test_garbage_collect_namespace_existing_empty_ns(self):
        with mock.patch.object(ip_lib, 'IpNetnsCommand') as ip_ns_cmd_cls:
            ip_ns_cmd_cls.return_value.exists.return_value = True

            ip = ip_lib.IPWrapper('sudo', 'ns')

            with mock.patch.object(ip, 'namespace_is_empty') as mock_is_empty:
                mock_is_empty.return_value = True
                self.assertTrue(ip.garbage_collect_namespace())

                mock_is_empty.assert_called_once_with()
                expected = [mock.call().exists('ns'), mock.call().delete('ns')]
                ip_ns_cmd_cls.assert_has_calls(expected)
Exemple #7
0
    def plug(self,
             network_id,
             port_id,
             device_name,
             mac_address,
             bridge=None,
             namespace=None,
             prefix=None):
        """Plug in the interface."""
        if not bridge:
            bridge = self.conf.ovs_integration_bridge

        self.check_bridge_exists(bridge)

        if not ip_lib.device_exists(
                device_name, self.root_helper, namespace=namespace):

            ip = ip_lib.IPWrapper(self.root_helper)
            tap_name = self._get_tap_name(device_name, prefix)

            if self.conf.ovs_use_veth:
                root_dev, ns_dev = ip.add_veth(tap_name, device_name)

            internal = not self.conf.ovs_use_veth
            self._ovs_add_port(bridge,
                               tap_name,
                               port_id,
                               mac_address,
                               internal=internal)

            ns_dev = ip.device(device_name)
            ns_dev.link.set_address(mac_address)

            if self.conf.network_device_mtu:
                ns_dev.link.set_mtu(self.conf.network_device_mtu)
                if self.conf.ovs_use_veth:
                    root_dev.link.set_mtu(self.conf.network_device_mtu)

            if namespace:
                namespace_obj = ip.ensure_namespace(namespace)
                namespace_obj.add_device_to_namespace(ns_dev)

            ns_dev.link.set_up()
            if self.conf.ovs_use_veth:
                root_dev.link.set_up()
        else:
            LOG.warn(_("Device %s already exists"), device_name)
Exemple #8
0
    def test_garbage_collect_namespace_existing_not_empty(self):
        lo_device = mock.Mock()
        lo_device.name = 'lo'
        tap_device = mock.Mock()
        tap_device.name = 'tap1'

        with mock.patch.object(ip_lib, 'IpNetnsCommand') as ip_ns_cmd_cls:
            ip_ns_cmd_cls.return_value.exists.return_value = True

            ip = ip_lib.IPWrapper('sudo', 'ns')

            with mock.patch.object(ip, 'namespace_is_empty') as mock_is_empty:
                mock_is_empty.return_value = False

                self.assertFalse(ip.garbage_collect_namespace())

                mock_is_empty.assert_called_once_with()
                expected = [mock.call(ip), mock.call().exists('ns')]
                self.assertEqual(ip_ns_cmd_cls.mock_calls, expected)
                self.assertNotIn(mock.call().delete('ns'),
                                 ip_ns_cmd_cls.mock_calls)
Exemple #9
0
 def test_add_device_to_namespace_is_none(self):
     dev = mock.Mock()
     ip_lib.IPWrapper('sudo').add_device_to_namespace(dev)
     self.assertEqual(dev.mock_calls, [])
Exemple #10
0
 def test_add_device_to_namespace(self):
     dev = mock.Mock()
     ip_lib.IPWrapper('sudo', 'ns').add_device_to_namespace(dev)
     dev.assert_has_calls([mock.call.link.set_netns('ns')])
Exemple #11
0
 def test_ensure_namespace_existing(self):
     with mock.patch.object(ip_lib, 'IpNetnsCommand') as ip_ns_cmd:
         ip_ns_cmd.exists.return_value = True
         ns = ip_lib.IPWrapper('sudo').ensure_namespace('ns')
         self.assertFalse(self.execute.called)
         self.assertEqual(ns.namespace, 'ns')
Exemple #12
0
 def test_get_device(self):
     dev = ip_lib.IPWrapper('sudo', 'ns').device('eth0')
     self.assertEqual(dev.root_helper, 'sudo')
     self.assertEqual(dev.namespace, 'ns')
     self.assertEqual(dev.name, 'eth0')
Exemple #13
0
 def test_add_veth(self):
     ip_lib.IPWrapper('sudo').add_veth('tap0', 'tap1')
     self.execute.assert_called_once_with(
         '', 'link',
         ('add', 'tap0', 'type', 'veth', 'peer', 'name', 'tap1'), 'sudo',
         None)
Exemple #14
0
 def test_add_tuntap(self):
     ip_lib.IPWrapper('sudo').add_tuntap('tap0')
     self.execute.assert_called_once_with('', 'tuntap',
                                          ('add', 'tap0', 'mode', 'tap'),
                                          'sudo', None)