def test_flat_override(self):
        """Makes sure flat_interface flag overrides network bridge_interface.

        Allows heterogeneous networks a la bug 833426
        """

        driver = linux_net.LinuxBridgeInterfaceDriver()

        info = {}

        @classmethod
        def test_ensure(_self, bridge, interface, network, gateway):
            info['passed_interface'] = interface

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'ensure_bridge', test_ensure)

        network = {
                "bridge": "br100",
                "bridge_interface": "base_interface",
        }
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "base_interface")
        self.flags(flat_interface="override_interface")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "override_interface")
Example #2
0
    def test_flat_override(self):
        """Makes sure flat_interface flag overrides network bridge_interface.

        Allows heterogeneous networks a la bug 833426
        """

        driver = linux_net.LinuxBridgeInterfaceDriver()

        info = {}

        @staticmethod
        def test_ensure(bridge, interface, network, gateway):
            info['passed_interface'] = interface

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, 'ensure_bridge',
                       test_ensure)

        network = {
            "bridge": "br100",
            "bridge_interface": "base_interface",
            "share_address": False,
        }
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "base_interface")
        self.flags(flat_interface="override_interface")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "override_interface")
Example #3
0
    def test_linux_bridge_driver_plug(self):
        """Makes sure plug doesn't drop FORWARD by default.

        Ensures bug 890195 doesn't reappear."""
        def fake_execute(*args, **kwargs):
            return "", ""

        self.stubs.Set(utils, 'execute', fake_execute)

        def verify_add_rule(chain, rule):
            self.assertEqual(chain, 'FORWARD')
            self.assertIn('ACCEPT', rule)

        self.stubs.Set(linux_net.iptables_manager.ipv4['filter'], 'add_rule',
                       verify_add_rule)
        driver = linux_net.LinuxBridgeInterfaceDriver()
        driver.plug({"bridge": "br100", "bridge_interface": "eth0"}, "fakemac")
Example #4
0
    def test_linux_bridge_driver_plug(self):
        """Makes sure plug doesn't drop FORWARD by default.

        Ensures bug 890195 doesn't reappear."""

        def fake_execute(*args, **kwargs):
            return "", ""
        self.stubs.Set(utils, 'execute', fake_execute)

        def verify_add_rule(chain, rule):
            self.assertEqual(chain, 'FORWARD')
            self.assertIn('ACCEPT', rule)
        self.stubs.Set(linux_net.iptables_manager.ipv4['filter'],
                       'add_rule', verify_add_rule)
        driver = linux_net.LinuxBridgeInterfaceDriver()
        driver.plug({"bridge": "br100", "bridge_interface": "eth0"},
                    "fakemac")
Example #5
0
    def test_linux_bridge_driver_plug(self):
        """Makes sure plug doesn't drop FORWARD by default.

        Ensures bug 890195 doesn't reappear.
        """

        def fake_execute(*args, **kwargs):
            return "", ""

        self.stubs.Set(utils, "execute", fake_execute)

        def verify_add_rule(chain, rule):
            self.assertEqual(chain, "FORWARD")
            self.assertIn("ACCEPT", rule)

        self.stubs.Set(linux_net.iptables_manager.ipv4["filter"], "add_rule", verify_add_rule)
        driver = linux_net.LinuxBridgeInterfaceDriver()
        driver.plug({"bridge": "br100", "bridge_interface": "eth0", "share_address": False}, "fakemac")
    def test_vlan_override(self):
        """Makes sure vlan_interface flag overrides network bridge_interface.

        Allows heterogeneous networks a la bug 833426
        """

        driver = linux_net.LinuxBridgeInterfaceDriver()

        info = {}

        @staticmethod
        def test_ensure(vlan, bridge, interface, network, mac_address):
            info['passed_interface'] = interface

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'ensure_vlan_bridge', test_ensure)

        network = {
            "bridge": "br100",
            "bridge_interface": "base_interface",
            "vlan": "fake"
        }
        self.flags(vlan_interface="")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "base_interface")
        self.flags(vlan_interface="override_interface")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "override_interface")
        driver.plug(network, "fakemac")
Example #7
0
    def test_vlan_override(self):
        """Makes sure vlan_interface flag overrides network bridge_interface.

        Allows heterogeneous networks a la bug 833426
        """

        driver = linux_net.LinuxBridgeInterfaceDriver()

        info = {}

        @staticmethod
        def test_ensure(vlan, bridge, interface, network, mac_address):
            info['passed_interface'] = interface

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'ensure_vlan_bridge', test_ensure)

        network = {
                "bridge": "br100",
                "bridge_interface": "base_interface",
                "vlan": "fake"
        }
        self.flags(vlan_interface="")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "base_interface")
        self.flags(vlan_interface="override_interface")
        driver.plug(network, "fakemac")
        self.assertEqual(info['passed_interface'], "override_interface")
        driver.plug(network, "fakemac")
    def test_isolated_host_iptables_logdrop(self):
        # Ensure that a different drop action for iptables doesn't change
        # the drop action for ebtables.
        self.flags(fake_network=False,
                   share_dhcp_address=True,
                   iptables_drop_action='LOGDROP')

        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, 'iptables_manager',
                       linux_net.IptablesManager())
        self.stubs.Set(linux_net, 'binary_name', 'test')
        executes = []
        inputs = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            process_input = kwargs.get('process_input')
            if process_input:
                inputs.append(process_input)
            return "", ""

        self.stubs.Set(utils, 'execute', fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @classmethod
        def fake_ensure(_self, bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'ensure_bridge', fake_ensure)

        iface = 'eth0'
        dhcp = '192.168.1.1'
        network = {'dhcp_server': dhcp,
                   'bridge': 'br100',
                   'bridge_interface': iface}
        driver.plug(network, 'fakemac')
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)
        expected_inputs = [
             ('-A test-FORWARD -m physdev --physdev-in %s '
              '-d 255.255.255.255 -p udp --dport 67 -j LOGDROP' % iface),
             ('-A test-FORWARD -m physdev --physdev-out %s '
              '-d 255.255.255.255 -p udp --dport 67 -j LOGDROP' % iface),
             ('-A test-FORWARD -m physdev --physdev-in %s '
              '-d 192.168.1.1 -j LOGDROP' % iface),
             ('-A test-FORWARD -m physdev --physdev-out %s '
              '-s 192.168.1.1 -j LOGDROP' % iface),
        ]
        for inp in expected_inputs:
            self.assertTrue(inp in inputs[0])

        executes = []
        inputs = []

        @classmethod
        def fake_remove(_self, bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'remove_bridge', fake_remove)

        driver.unplug(network)
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)
        for inp in expected_inputs:
            self.assertFalse(inp in inputs[0])
Example #9
0
    def test_isolated_host(self):
        self.flags(fake_network=False, share_dhcp_address=True)
        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, 'iptables_manager',
                       linux_net.IptablesManager())
        self.stubs.Set(linux_net, 'binary_name', 'test')
        executes = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            return "", ""

        self.stubs.Set(utils, 'execute', fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @staticmethod
        def fake_ensure(bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, 'ensure_bridge',
                       fake_ensure)

        iface = 'eth0'
        dhcp = '192.168.1.1'
        network = {
            'dhcp_server': dhcp,
            'share_address': False,
            'bridge': 'br100',
            'bridge_interface': iface
        }
        driver.plug(network, 'fakemac')
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)

        executes = []

        @staticmethod
        def fake_remove(bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, 'remove_bridge',
                       fake_remove)

        driver.unplug(network)
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
        ]
        self.assertEqual(executes, expected)
    def test_isolated_host_iptables_logdrop(self):
        # Ensure that a different drop action for iptables doesn't change
        # the drop action for ebtables.
        self.flags(fake_network=False,
                   share_dhcp_address=True,
                   iptables_drop_action='LOGDROP')

        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, 'iptables_manager',
                       linux_net.IptablesManager())
        self.stubs.Set(linux_net, 'binary_name', 'test')
        executes = []
        inputs = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            process_input = kwargs.get('process_input')
            if process_input:
                inputs.append(process_input)
            return "", ""

        self.stubs.Set(utils, 'execute', fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @staticmethod
        def fake_ensure(bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, 'ensure_bridge',
                       fake_ensure)

        iface = 'eth0'
        dhcp = '192.168.1.1'
        network = {
            'dhcp_server': dhcp,
            'bridge': 'br100',
            'bridge_interface': iface
        }
        driver.plug(network, 'fakemac')
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)
        expected_inputs = [
            ('-A test-FORWARD -m physdev --physdev-in %s '
             '-d 255.255.255.255 -p udp --dport 67 -j LOGDROP' % iface),
            ('-A test-FORWARD -m physdev --physdev-out %s '
             '-d 255.255.255.255 -p udp --dport 67 -j LOGDROP' % iface),
            ('-A test-FORWARD -m physdev --physdev-in %s '
             '-d 192.168.1.1 -j LOGDROP' % iface),
            ('-A test-FORWARD -m physdev --physdev-out %s '
             '-s 192.168.1.1 -j LOGDROP' % iface),
        ]
        for inp in expected_inputs:
            self.assertIn(inp, inputs[0])

        executes = []
        inputs = []

        @staticmethod
        def fake_remove(bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, 'remove_bridge',
                       fake_remove)

        driver.unplug(network)
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)
        for inp in expected_inputs:
            self.assertNotIn(inp, inputs[0])
Example #11
0
    def test_isolated_host(self):
        self.flags(fake_network=False, share_dhcp_address=True)
        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, "iptables_manager", linux_net.IptablesManager())
        self.stubs.Set(linux_net, "binary_name", "test")
        executes = []
        inputs = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            process_input = kwargs.get("process_input")
            if process_input:
                inputs.append(process_input)
            return "", ""

        self.stubs.Set(utils, "execute", fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @classmethod
        def fake_ensure(_self, bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, "ensure_bridge", fake_ensure)

        iface = "eth0"
        dhcp = "192.168.1.1"
        network = {"dhcp_server": dhcp, "bridge": "br100", "bridge_interface": iface}
        driver.plug(network, "fakemac")
        expected = [
            ("ebtables", "-t", "filter", "-D", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-I", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-D", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-I", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            ("iptables-save", "-c"),
            ("iptables-restore", "-c"),
            ("ip6tables-save", "-c"),
            ("ip6tables-restore", "-c"),
        ]
        self.assertEqual(executes, expected)
        expected_inputs = [
            "-A test-FORWARD -m physdev --physdev-in %s " "-d 255.255.255.255 -p udp --dport 67 -j DROP" % iface,
            "-A test-FORWARD -m physdev --physdev-out %s " "-d 255.255.255.255 -p udp --dport 67 -j DROP" % iface,
            "-A test-FORWARD -m physdev --physdev-in %s " "-d 192.168.1.1 -j DROP" % iface,
            "-A test-FORWARD -m physdev --physdev-out %s " "-s 192.168.1.1 -j DROP" % iface,
        ]
        for inp in expected_inputs:
            self.assertTrue(inp in inputs[0])

        executes = []
        inputs = []

        @classmethod
        def fake_remove(_self, bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, "remove_bridge", fake_remove)

        driver.unplug(network)
        expected = [
            ("ebtables", "-t", "filter", "-D", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-D", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            ("iptables-save", "-c"),
            ("iptables-restore", "-c"),
            ("ip6tables-save", "-c"),
            ("ip6tables-restore", "-c"),
        ]
        self.assertEqual(executes, expected)
        for inp in expected_inputs:
            self.assertFalse(inp in inputs[0])
Example #12
0
    def test_isolated_host(self):
        self.flags(fake_network=False,
                   share_dhcp_address=True)
        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, 'iptables_manager',
                       linux_net.IptablesManager())
        self.stubs.Set(linux_net, 'binary_name', 'test')
        executes = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            return "", ""

        self.stubs.Set(utils, 'execute', fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @staticmethod
        def fake_ensure(bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'ensure_bridge', fake_ensure)

        iface = 'eth0'
        dhcp = '192.168.1.1'
        network = {'dhcp_server': dhcp,
                   'share_address': False,
                   'bridge': 'br100',
                   'bridge_interface': iface}
        driver.plug(network, 'fakemac')
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-I', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('iptables-save', '-c'),
            ('iptables-restore', '-c'),
            ('ip6tables-save', '-c'),
            ('ip6tables-restore', '-c'),
        ]
        self.assertEqual(executes, expected)

        executes = []

        @staticmethod
        def fake_remove(bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver,
                       'remove_bridge', fake_remove)

        driver.unplug(network)
        expected = [
            ('ebtables', '-t', 'filter', '-D', 'INPUT', '-p', 'ARP', '-i',
             iface, '--arp-ip-dst', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'OUTPUT', '-p', 'ARP', '-o',
             iface, '--arp-ip-src', dhcp, '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-i',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
            ('ebtables', '-t', 'filter', '-D', 'FORWARD', '-p', 'IPv4', '-o',
             iface, '--ip-protocol', 'udp', '--ip-destination-port', '67:68',
             '-j', 'DROP'),
        ]
        self.assertEqual(executes, expected)
Example #13
0
    def test_isolated_host(self):
        self.flags(fake_network=False, share_dhcp_address=True)
        # NOTE(vish): use a fresh copy of the manager for each test
        self.stubs.Set(linux_net, "iptables_manager", linux_net.IptablesManager())
        self.stubs.Set(linux_net, "binary_name", "test")
        executes = []

        def fake_execute(*args, **kwargs):
            executes.append(args)
            return "", ""

        self.stubs.Set(utils, "execute", fake_execute)

        driver = linux_net.LinuxBridgeInterfaceDriver()

        @staticmethod
        def fake_ensure(bridge, interface, network, gateway):
            return bridge

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, "ensure_bridge", fake_ensure)

        iface = "eth0"
        dhcp = "192.168.1.1"
        network = {"dhcp_server": dhcp, "share_address": False, "bridge": "br100", "bridge_interface": iface}
        driver.plug(network, "fakemac")
        expected = [
            ("ebtables", "-t", "filter", "-D", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-I", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-D", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-I", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            (
                "ebtables",
                "-t",
                "filter",
                "-D",
                "FORWARD",
                "-p",
                "IPv4",
                "-i",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
            (
                "ebtables",
                "-t",
                "filter",
                "-I",
                "FORWARD",
                "-p",
                "IPv4",
                "-i",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
            (
                "ebtables",
                "-t",
                "filter",
                "-D",
                "FORWARD",
                "-p",
                "IPv4",
                "-o",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
            (
                "ebtables",
                "-t",
                "filter",
                "-I",
                "FORWARD",
                "-p",
                "IPv4",
                "-o",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
            ("iptables-save", "-c"),
            ("iptables-restore", "-c"),
            ("ip6tables-save", "-c"),
            ("ip6tables-restore", "-c"),
        ]
        self.assertEqual(executes, expected)

        executes = []

        @staticmethod
        def fake_remove(bridge, gateway):
            return

        self.stubs.Set(linux_net.LinuxBridgeInterfaceDriver, "remove_bridge", fake_remove)

        driver.unplug(network)
        expected = [
            ("ebtables", "-t", "filter", "-D", "INPUT", "-p", "ARP", "-i", iface, "--arp-ip-dst", dhcp, "-j", "DROP"),
            ("ebtables", "-t", "filter", "-D", "OUTPUT", "-p", "ARP", "-o", iface, "--arp-ip-src", dhcp, "-j", "DROP"),
            (
                "ebtables",
                "-t",
                "filter",
                "-D",
                "FORWARD",
                "-p",
                "IPv4",
                "-i",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
            (
                "ebtables",
                "-t",
                "filter",
                "-D",
                "FORWARD",
                "-p",
                "IPv4",
                "-o",
                iface,
                "--ip-protocol",
                "udp",
                "--ip-destination-port",
                "67:68",
                "-j",
                "DROP",
            ),
        ]
        self.assertEqual(executes, expected)