Esempio n. 1
0
def main():
    """Main method for cleaning up OVS bridges.

    The utility cleans up the integration bridges used by Neutron.
    """

    conf = setup_conf()
    conf()
    config.setup_logging()

    configuration_bridges = set(
        [conf.ovs_integration_bridge, conf.external_network_bridge])
    ovs_bridges = set(ovs_lib.get_bridges(conf.AGENT.root_helper))
    available_configuration_bridges = configuration_bridges & ovs_bridges

    if conf.ovs_all_ports:
        bridges = ovs_bridges
    else:
        bridges = available_configuration_bridges

    # Collect existing ports created by Neutron on configuration bridges.
    # After deleting ports from OVS bridges, we cannot determine which
    # ports were created by Neutron, so port information is collected now.
    ports = collect_neutron_ports(available_configuration_bridges,
                                  conf.AGENT.root_helper)

    for bridge in bridges:
        LOG.info(_LI("Cleaning bridge: %s"), bridge)
        ovs = ovs_lib.OVSBridge(bridge, conf.AGENT.root_helper)
        ovs.delete_ports(all_ports=conf.ovs_all_ports)

    # Remove remaining ports created by Neutron (usually veth pair)
    delete_neutron_ports(ports, conf.AGENT.root_helper)

    LOG.info(_LI("OVS cleanup completed successfully"))
Esempio n. 2
0
 def _test_get_bridges(self, exp_timeout=None):
     bridges = ["br-int", "br-ex"]
     root_helper = "sudo"
     self.execute.return_value = "br-int\nbr-ex\n"
     timeout_str = self._build_timeout_opt(exp_timeout)
     self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
     self.execute.assert_called_once_with(["ovs-vsctl", timeout_str, "list-br"], root_helper=root_helper)
Esempio n. 3
0
 def setup_ancillary_bridges(self, integ_br, tun_br):
     '''Setup ancillary bridges - for example br-ex.'''
     ovs_bridges = set(ovs_lib.get_bridges(self.root_helper))
     # Remove all known bridges
     ovs_bridges.remove(integ_br)
     if self.enable_tunneling:
         ovs_bridges.remove(tun_br)
     br_names = [self.phys_brs[physical_network].br_name for
                 physical_network in self.phys_brs]
     ovs_bridges.difference_update(br_names)
     # Filter list of bridges to those that have external
     # bridge-id's configured
     br_names = []
     for bridge in ovs_bridges:
         id = ovs_lib.get_bridge_external_bridge_id(self.root_helper,
                                                    bridge)
         if id != bridge:
             br_names.append(bridge)
     ovs_bridges.difference_update(br_names)
     ancillary_bridges = []
     for bridge in ovs_bridges:
         br = ovs_lib.OVSBridge(bridge, self.root_helper)
         LOG.info(_('Adding %s to list of bridges.'), bridge)
         ancillary_bridges.append(br)
     return ancillary_bridges
Esempio n. 4
0
def main():
    """Main method for cleaning up OVS bridges.

    The utility cleans up the integration bridges used by Neutron.
    """

    conf = setup_conf()
    conf()
    config.setup_logging()

    configuration_bridges = set([conf.ovs_integration_bridge,
                                 conf.external_network_bridge])
    ovs_bridges = set(ovs_lib.get_bridges(conf.AGENT.root_helper))
    available_configuration_bridges = configuration_bridges & ovs_bridges

    if conf.ovs_all_ports:
        bridges = ovs_bridges
    else:
        bridges = available_configuration_bridges

    # Collect existing ports created by Neutron on configuration bridges.
    # After deleting ports from OVS bridges, we cannot determine which
    # ports were created by Neutron, so port information is collected now.
    ports = collect_neutron_ports(available_configuration_bridges,
                                  conf.AGENT.root_helper)

    for bridge in bridges:
        LOG.info(_LI("Cleaning bridge: %s"), bridge)
        ovs = ovs_lib.OVSBridge(bridge, conf.AGENT.root_helper)
        ovs.delete_ports(all_ports=conf.ovs_all_ports)

    # Remove remaining ports created by Neutron (usually veth pair)
    delete_neutron_ports(ports, conf.AGENT.root_helper)

    LOG.info(_LI("OVS cleanup completed successfully"))
Esempio n. 5
0
 def setup_ancillary_bridges(self, integ_br, tun_br):
     '''Setup ancillary bridges - for example br-ex.'''
     ovs_bridges = set(ovs_lib.get_bridges(self.root_helper))
     # Remove all known bridges
     ovs_bridges.remove(integ_br)
     if self.enable_tunneling:
         ovs_bridges.remove(tun_br)
     br_names = [
         self.phys_brs[physical_network].br_name
         for physical_network in self.phys_brs
     ]
     ovs_bridges.difference_update(br_names)
     # Filter list of bridges to those that have external
     # bridge-id's configured
     br_names = []
     for bridge in ovs_bridges:
         id = ovs_lib.get_bridge_external_bridge_id(self.root_helper,
                                                    bridge)
         if id != bridge:
             br_names.append(bridge)
     ovs_bridges.difference_update(br_names)
     ancillary_bridges = []
     for bridge in ovs_bridges:
         br = ovs_lib.OVSBridge(bridge, self.root_helper)
         LOG.info(_('Adding %s to list of bridges.'), bridge)
         ancillary_bridges.append(br)
     return ancillary_bridges
Esempio n. 6
0
    def test_get_bridges(self):
        bridges = ["br-int", "br-ex"]
        root_helper = "sudo"
        utils.execute(["ovs-vsctl", self.TO, "list-br"], root_helper=root_helper).AndReturn("br-int\nbr-ex\n")

        self.mox.ReplayAll()
        self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
        self.mox.VerifyAll()
Esempio n. 7
0
 def _test_get_bridges(self, exp_timeout=None):
     bridges = ['br-int', 'br-ex']
     root_helper = 'sudo'
     self.execute.return_value = 'br-int\nbr-ex\n'
     timeout_str = self._build_timeout_opt(exp_timeout)
     self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
     self.execute.assert_called_once_with(
         ["ovs-vsctl", timeout_str, "list-br"], root_helper=root_helper)
Esempio n. 8
0
    def test_get_bridges(self):
        bridges = ['br-int', 'br-ex']
        root_helper = 'sudo'
        self.execute.return_value = 'br-int\nbr-ex\n'

        self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
        self.execute.assert_called_once_with(["ovs-vsctl", self.TO, "list-br"],
                                             root_helper=root_helper)
Esempio n. 9
0
    def test_get_bridges(self):
        bridges = ['br-int', 'br-ex']
        root_helper = 'sudo'
        self.execute.return_value = 'br-int\nbr-ex\n'

        self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
        self.execute.assert_called_once_with(
            ["ovs-vsctl", self.TO, "list-br"],
            root_helper=root_helper)
Esempio n. 10
0
    def test_get_bridges(self):
        bridges = ['br-int', 'br-ex']
        root_helper = 'sudo'
        utils.execute(["ovs-vsctl", self.TO, "list-br"],
                      root_helper=root_helper).AndReturn('br-int\nbr-ex\n')

        self.mox.ReplayAll()
        self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
        self.mox.VerifyAll()
Esempio n. 11
0
    def test_get_bridges(self):
        bridges = ['br-int', 'br-ex']
        root_helper = 'sudo'
        utils.execute(["ovs-vsctl", self.TO, "list-br"],
                      root_helper=root_helper).AndReturn('br-int\nbr-ex\n')

        self.mox.ReplayAll()
        self.assertEqual(ovs_lib.get_bridges(root_helper), bridges)
        self.mox.VerifyAll()
Esempio n. 12
0
 def _find_port_info(self, physical_network):
     # return a[port_id][mac], a[port_id][vlan]
     port_names = set(self.int_br.get_port_name_list())
     ovs_bridges = set(ovs_lib.get_bridges(self.root_helper))
     for bridge in ovs_bridges:
         if bridge[0:3] == 'tbr':
             res = self.int_br.run_vsctl(["list-ports", bridge],
                                         check_error=True)
             tbr_ports = []
             if res:
                 tbr_ports = res.strip().split("\n")
             port_names.update(set(tbr_ports))
     port_infos = dict()
     args = [
         '--format=json', '--',
         '--columns=name,external_ids,ofport,other_config', 'list',
         'Interface'
     ]
     result = self.int_br.run_vsctl(args, check_error=True)
     if not result:
         return port_infos
     for row in jsonutils.loads(result)['data']:
         name = row[0]
         if name not in port_names:
             continue
         external_ids = dict(row[1][1])
         other_config = dict(row[3][1])
         # Do not consider VIFs which aren't yet ready
         # This can happen when ofport values are either [] or ["set", []]
         # We will therefore consider only integer values for ofport
         ofport = row[2]
         try:
             int_ofport = int(ofport)
         except (ValueError, TypeError):
             LOG.warn(_("Found not yet ready openvswitch port: %s"), row)
         else:
             if int_ofport > 0:
                 if ("iface-id" in external_ids
                         and "attached-mac" in external_ids
                         and "segmentation_id" in other_config
                         and physical_network
                         == other_config.get("physical_network")):
                     port_infos[external_ids['iface-id']] = dict()
                     port_infos[external_ids['iface-id']][
                         'mac'] = external_ids['attached-mac']
                     port_infos[external_ids['iface-id']][
                         'vlan'] = other_config['segmentation_id']
             else:
                 LOG.warn(_("Found failed openvswitch port: %s"), row)
     return port_infos
Esempio n. 13
0
 def _find_port_info(self, physical_network):
     # return a[port_id][mac], a[port_id][vlan]
     port_names = set(self.int_br.get_port_name_list())
     ovs_bridges = set(ovs_lib.get_bridges(self.root_helper))
     for bridge in ovs_bridges:
         if bridge[0:3] == 'tbr':
             res = self.int_br.run_vsctl(["list-ports", bridge], check_error=True)
             tbr_ports = []
             if res:
                 tbr_ports = res.strip().split("\n")
             port_names.update(set(tbr_ports))
     port_infos = dict()
     args = ['--format=json', '--', '--columns=name,external_ids,ofport,other_config',
             'list', 'Interface']
     result = self.int_br.run_vsctl(args, check_error=True)
     if not result:
         return port_infos
     for row in jsonutils.loads(result)['data']:
         name = row[0]
         if name not in port_names:
             continue
         external_ids = dict(row[1][1])
         other_config = dict(row[3][1])
         # Do not consider VIFs which aren't yet ready
         # This can happen when ofport values are either [] or ["set", []]
         # We will therefore consider only integer values for ofport
         ofport = row[2]
         try:
             int_ofport = int(ofport)
         except (ValueError, TypeError):
             LOG.warn(_("Found not yet ready openvswitch port: %s"), row)
         else:
             if int_ofport > 0:
                 if ("iface-id" in external_ids and
                     "attached-mac" in external_ids and
                     "segmentation_id" in other_config and
                     physical_network == other_config.get("physical_network")):
                     port_infos[external_ids['iface-id']] = dict()
                     port_infos[external_ids['iface-id']]['mac'] = external_ids['attached-mac']
                     port_infos[external_ids['iface-id']]['vlan'] = other_config['segmentation_id']
             else:
                 LOG.warn(_("Found failed openvswitch port: %s"), row)
     return port_infos
Esempio n. 14
0
    def setUp(self):
        super(TunnelTest, self).setUp()
        cfg.CONF.set_override('rpc_backend',
                              'neutron.openstack.common.rpc.impl_fake')
        cfg.CONF.set_override('report_interval', 0, 'AGENT')
        self.mox = mox.Mox()
        self.addCleanup(self.mox.UnsetStubs)

        self.INT_BRIDGE = 'integration_bridge'
        self.TUN_BRIDGE = 'tunnel_bridge'
        self.MAP_TUN_BRIDGE = 'tunnel_bridge_mapping'
        self.NET_MAPPING = {'net1': self.MAP_TUN_BRIDGE}
        self.INT_OFPORT = 11111
        self.TUN_OFPORT = 22222
        self.MAP_TUN_OFPORT = 33333
        self.VETH_MTU = None
        self.inta = self.mox.CreateMock(ip_lib.IPDevice)
        self.intb = self.mox.CreateMock(ip_lib.IPDevice)
        self.inta.link = self.mox.CreateMock(ip_lib.IpLinkCommand)
        self.intb.link = self.mox.CreateMock(ip_lib.IpLinkCommand)

        self.mox.StubOutClassWithMocks(ovs_lib, 'OVSBridge')
        self.mock_int_bridge = ovs_lib.OVSBridge(self.INT_BRIDGE, 'sudo')
        self.mock_int_bridge.delete_port('patch-tun')
        self.mock_int_bridge.remove_all_flows()
        self.mock_int_bridge.add_flow(priority=1, actions='normal')

        self.mock_map_tun_bridge = ovs_lib.OVSBridge(self.MAP_TUN_BRIDGE,
                                                     'sudo')
        self.mock_map_tun_bridge.br_name = self.MAP_TUN_BRIDGE
        self.mock_map_tun_bridge.remove_all_flows()
        self.mock_map_tun_bridge.add_flow(priority=1, actions='normal')
        self.mock_int_bridge.delete_port('int-tunnel_bridge_mapping')
        self.mock_map_tun_bridge.delete_port('phy-tunnel_bridge_mapping')
        self.mock_int_bridge.add_port(self.inta)
        self.mock_map_tun_bridge.add_port(self.intb)
        self.inta.link.set_up()
        self.intb.link.set_up()

        self.mock_int_bridge.add_flow(priority=2, in_port=None, actions='drop')
        self.mock_map_tun_bridge.add_flow(priority=2,
                                          in_port=None,
                                          actions='drop')

        self.mock_tun_bridge = ovs_lib.OVSBridge(self.TUN_BRIDGE, 'sudo')
        self.mock_tun_bridge.reset_bridge()
        self.mock_int_bridge.add_patch_port(
            'patch-tun', 'patch-int').AndReturn(self.TUN_OFPORT)
        self.mock_tun_bridge.add_patch_port(
            'patch-int', 'patch-tun').AndReturn(self.INT_OFPORT)
        self.mock_tun_bridge.remove_all_flows()
        self.mock_tun_bridge.add_flow(priority=1, actions='drop')

        self.mox.StubOutWithMock(ip_lib, 'device_exists')
        ip_lib.device_exists('tunnel_bridge_mapping', 'sudo').AndReturn(True)
        ip_lib.device_exists('int-tunnel_bridge_mapping',
                             'sudo').AndReturn(True)

        self.mox.StubOutWithMock(ip_lib.IpLinkCommand, 'delete')
        ip_lib.IPDevice('int-tunnel_bridge_mapping').link.delete()

        self.mox.StubOutClassWithMocks(ip_lib, 'IPWrapper')
        ip_lib.IPWrapper('sudo').add_veth(
            'int-tunnel_bridge_mapping',
            'phy-tunnel_bridge_mapping').AndReturn([self.inta, self.intb])

        self.mock_int_bridge.get_local_port_mac().AndReturn('000000000001')
        self.mox.StubOutWithMock(ovs_lib, 'get_bridges')
        ovs_lib.get_bridges('sudo').AndReturn(
            [self.INT_BRIDGE, self.TUN_BRIDGE, self.MAP_TUN_BRIDGE])
Esempio n. 15
0
    def setUp(self):
        super(TunnelTest, self).setUp()
        cfg.CONF.set_override('rpc_backend',
                              'neutron.openstack.common.rpc.impl_fake')
        cfg.CONF.set_override('report_interval', 0, 'AGENT')
        self.mox = mox.Mox()
        self.addCleanup(self.mox.UnsetStubs)

        self.INT_BRIDGE = 'integration_bridge'
        self.TUN_BRIDGE = 'tunnel_bridge'
        self.MAP_TUN_BRIDGE = 'tunnel_bridge_mapping'
        self.NET_MAPPING = {'net1': self.MAP_TUN_BRIDGE}
        self.INT_OFPORT = 11111
        self.TUN_OFPORT = 22222
        self.MAP_TUN_OFPORT = 33333
        self.VETH_MTU = None
        self.inta = self.mox.CreateMock(ip_lib.IPDevice)
        self.intb = self.mox.CreateMock(ip_lib.IPDevice)
        self.inta.link = self.mox.CreateMock(ip_lib.IpLinkCommand)
        self.intb.link = self.mox.CreateMock(ip_lib.IpLinkCommand)

        self.mox.StubOutClassWithMocks(ovs_lib, 'OVSBridge')
        self.mock_int_bridge = ovs_lib.OVSBridge(self.INT_BRIDGE, 'sudo')
        self.mock_int_bridge.delete_port('patch-tun')
        self.mock_int_bridge.remove_all_flows()
        self.mock_int_bridge.add_flow(priority=1, actions='normal')

        self.mock_map_tun_bridge = ovs_lib.OVSBridge(
            self.MAP_TUN_BRIDGE, 'sudo')
        self.mock_map_tun_bridge.br_name = self.MAP_TUN_BRIDGE
        self.mock_map_tun_bridge.remove_all_flows()
        self.mock_map_tun_bridge.add_flow(priority=1, actions='normal')
        self.mock_int_bridge.delete_port('int-tunnel_bridge_mapping')
        self.mock_map_tun_bridge.delete_port('phy-tunnel_bridge_mapping')
        self.mock_int_bridge.add_port(self.inta)
        self.mock_map_tun_bridge.add_port(self.intb)
        self.inta.link.set_up()
        self.intb.link.set_up()

        self.mock_int_bridge.add_flow(priority=2, in_port=None, actions='drop')
        self.mock_map_tun_bridge.add_flow(
            priority=2, in_port=None, actions='drop')

        self.mock_tun_bridge = ovs_lib.OVSBridge(self.TUN_BRIDGE, 'sudo')
        self.mock_tun_bridge.reset_bridge()
        self.mock_int_bridge.add_patch_port(
            'patch-tun', 'patch-int').AndReturn(self.TUN_OFPORT)
        self.mock_tun_bridge.add_patch_port(
            'patch-int', 'patch-tun').AndReturn(self.INT_OFPORT)
        self.mock_tun_bridge.remove_all_flows()
        self.mock_tun_bridge.add_flow(priority=1, actions='drop')

        self.mox.StubOutWithMock(ip_lib, 'device_exists')
        ip_lib.device_exists('tunnel_bridge_mapping', 'sudo').AndReturn(True)
        ip_lib.device_exists(
            'int-tunnel_bridge_mapping', 'sudo').AndReturn(True)

        self.mox.StubOutWithMock(ip_lib.IpLinkCommand, 'delete')
        ip_lib.IPDevice('int-tunnel_bridge_mapping').link.delete()

        self.mox.StubOutClassWithMocks(ip_lib, 'IPWrapper')
        ip_lib.IPWrapper('sudo').add_veth(
            'int-tunnel_bridge_mapping',
            'phy-tunnel_bridge_mapping').AndReturn([self.inta, self.intb])

        self.mock_int_bridge.get_local_port_mac().AndReturn('000000000001')
        self.mox.StubOutWithMock(ovs_lib, 'get_bridges')
        ovs_lib.get_bridges('sudo').AndReturn([self.INT_BRIDGE,
                                               self.TUN_BRIDGE,
                                               self.MAP_TUN_BRIDGE])
Esempio n. 16
0
    def setUp(self):
        super(TunnelTest, self).setUp()
        cfg.CONF.set_override('rpc_backend',
                              'neutron.openstack.common.rpc.impl_fake')
        cfg.CONF.set_override('report_interval', 0, 'AGENT')
        self.mox = mox.Mox()
        self.addCleanup(self.mox.UnsetStubs)

        self.INT_BRIDGE = 'integration_bridge'
        self.TUN_BRIDGE = 'tunnel_bridge'
        self.MAP_TUN_BRIDGE = 'tunnel_bridge_mapping'
        self.NET_MAPPING = {'net1': self.MAP_TUN_BRIDGE}
        self.INT_OFPORT = 11111
        self.TUN_OFPORT = 22222
        self.MAP_TUN_OFPORT = 33333
        self.VETH_MTU = None
        self.inta = self.mox.CreateMock(ip_lib.IPDevice)
        self.intb = self.mox.CreateMock(ip_lib.IPDevice)
        self.inta.link = self.mox.CreateMock(ip_lib.IpLinkCommand)
        self.intb.link = self.mox.CreateMock(ip_lib.IpLinkCommand)

        self.mox.StubOutClassWithMocks(ovs_lib, 'OVSBridge')
        self.mock_int_bridge = ovs_lib.OVSBridge(self.INT_BRIDGE, 'sudo')
        self.mock_int_bridge.get_local_port_mac().AndReturn('000000000001')
        self.mock_int_bridge.delete_port('patch-tun')
        self.mock_int_bridge.remove_all_flows()
        self.mock_int_bridge.add_flow(priority=1, actions='normal')

        self.mock_map_tun_bridge = ovs_lib.OVSBridge(
            self.MAP_TUN_BRIDGE, 'sudo')
        self.mock_map_tun_bridge.br_name = self.MAP_TUN_BRIDGE
        self.mock_map_tun_bridge.remove_all_flows()
        self.mock_map_tun_bridge.add_flow(priority=1, actions='normal')
        self.mock_int_bridge.delete_port('int-tunnel_bridge_mapping')
        self.mock_map_tun_bridge.delete_port('phy-tunnel_bridge_mapping')
        self.mock_int_bridge.add_port(self.inta)
        self.mock_map_tun_bridge.add_port(self.intb)
        self.inta.link.set_up()
        self.intb.link.set_up()

        self.mock_int_bridge.add_flow(priority=2, in_port=None, actions='drop')
        self.mock_map_tun_bridge.add_flow(
            priority=2, in_port=None, actions='drop')

        self.mock_tun_bridge = ovs_lib.OVSBridge(self.TUN_BRIDGE, 'sudo')
        self.mock_tun_bridge.reset_bridge()
        self.mock_int_bridge.add_patch_port(
            'patch-tun', 'patch-int').AndReturn(self.TUN_OFPORT)
        self.mock_tun_bridge.add_patch_port(
            'patch-int', 'patch-tun').AndReturn(self.INT_OFPORT)

        self.mock_tun_bridge.remove_all_flows()
        self.mock_tun_bridge.add_flow(priority=1,
                                      in_port=self.INT_OFPORT,
                                      actions="resubmit(,%s)" %
                                      constants.PATCH_LV_TO_TUN)
        self.mock_tun_bridge.add_flow(priority=0, actions='drop')
        self.mock_tun_bridge.add_flow(table=constants.PATCH_LV_TO_TUN,
                                      dl_dst=UCAST_MAC,
                                      actions="resubmit(,%s)" %
                                      constants.UCAST_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.PATCH_LV_TO_TUN,
                                      dl_dst=BCAST_MAC,
                                      actions="resubmit(,%s)" %
                                      constants.FLOOD_TO_TUN)
        for tunnel_type in constants.TUNNEL_NETWORK_TYPES:
            self.mock_tun_bridge.add_flow(
                table=constants.TUN_TABLE[tunnel_type],
                priority=0,
                actions="drop")
        learned_flow = ("table=%s,"
                        "priority=1,"
                        "hard_timeout=300,"
                        "NXM_OF_VLAN_TCI[0..11],"
                        "NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],"
                        "load:0->NXM_OF_VLAN_TCI[],"
                        "load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],"
                        "output:NXM_OF_IN_PORT[]" %
                        constants.UCAST_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.LEARN_FROM_TUN,
                                      priority=1,
                                      actions="learn(%s),output:%s" %
                                      (learned_flow, self.INT_OFPORT))
        self.mock_tun_bridge.add_flow(table=constants.UCAST_TO_TUN,
                                      priority=0,
                                      actions="resubmit(,%s)" %
                                      constants.FLOOD_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.FLOOD_TO_TUN,
                                      priority=0,
                                      actions="drop")

        self.mox.StubOutWithMock(ip_lib, 'device_exists')
        ip_lib.device_exists('tunnel_bridge_mapping', 'sudo').AndReturn(True)
        ip_lib.device_exists(
            'int-tunnel_bridge_mapping', 'sudo').AndReturn(True)

        self.mox.StubOutWithMock(ip_lib.IpLinkCommand, 'delete')
        ip_lib.IPDevice('int-tunnel_bridge_mapping').link.delete()

        self.mox.StubOutClassWithMocks(ip_lib, 'IPWrapper')
        ip_lib.IPWrapper('sudo').add_veth(
            'int-tunnel_bridge_mapping',
            'phy-tunnel_bridge_mapping').AndReturn([self.inta, self.intb])

        self.mox.StubOutWithMock(ovs_lib, 'get_bridges')
        ovs_lib.get_bridges('sudo').AndReturn([self.INT_BRIDGE,
                                               self.TUN_BRIDGE,
                                               self.MAP_TUN_BRIDGE])
Esempio n. 17
0
    def setUp(self):
        super(TunnelTest, self).setUp()
        cfg.CONF.set_override('rpc_backend',
                              'neutron.openstack.common.rpc.impl_fake')
        cfg.CONF.set_override('report_interval', 0, 'AGENT')
        self.mox = mox.Mox()
        self.addCleanup(self.mox.UnsetStubs)

        self.INT_BRIDGE = 'integration_bridge'
        self.TUN_BRIDGE = 'tunnel_bridge'
        self.MAP_TUN_BRIDGE = 'tunnel_bridge_mapping'
        self.NET_MAPPING = {'net1': self.MAP_TUN_BRIDGE}
        self.INT_OFPORT = 11111
        self.TUN_OFPORT = 22222
        self.MAP_TUN_OFPORT = 33333
        self.VETH_MTU = None
        self.inta = self.mox.CreateMock(ip_lib.IPDevice)
        self.intb = self.mox.CreateMock(ip_lib.IPDevice)
        self.inta.link = self.mox.CreateMock(ip_lib.IpLinkCommand)
        self.intb.link = self.mox.CreateMock(ip_lib.IpLinkCommand)

        self.mox.StubOutClassWithMocks(ovs_lib, 'OVSBridge')
        self.mock_int_bridge = ovs_lib.OVSBridge(self.INT_BRIDGE, 'sudo')
        self.mock_int_bridge.get_local_port_mac().AndReturn('000000000001')
        self.mock_int_bridge.delete_port('patch-tun')
        self.mock_int_bridge.remove_all_flows()
        self.mock_int_bridge.add_flow(priority=1, actions='normal')

        self.mock_map_tun_bridge = ovs_lib.OVSBridge(self.MAP_TUN_BRIDGE,
                                                     'sudo')
        self.mock_map_tun_bridge.br_name = self.MAP_TUN_BRIDGE
        self.mock_map_tun_bridge.remove_all_flows()
        self.mock_map_tun_bridge.add_flow(priority=1, actions='normal')
        self.mock_int_bridge.delete_port('int-tunnel_bridge_mapping')
        self.mock_map_tun_bridge.delete_port('phy-tunnel_bridge_mapping')
        self.mock_int_bridge.add_port(self.inta)
        self.mock_map_tun_bridge.add_port(self.intb)
        self.inta.link.set_up()
        self.intb.link.set_up()

        self.mock_int_bridge.add_flow(priority=2, in_port=None, actions='drop')
        self.mock_map_tun_bridge.add_flow(priority=2,
                                          in_port=None,
                                          actions='drop')

        self.mock_tun_bridge = ovs_lib.OVSBridge(self.TUN_BRIDGE, 'sudo')
        self.mock_tun_bridge.reset_bridge()
        self.mock_int_bridge.add_patch_port(
            'patch-tun', 'patch-int').AndReturn(self.TUN_OFPORT)
        self.mock_tun_bridge.add_patch_port(
            'patch-int', 'patch-tun').AndReturn(self.INT_OFPORT)

        self.mock_tun_bridge.remove_all_flows()
        self.mock_tun_bridge.add_flow(priority=1,
                                      in_port=self.INT_OFPORT,
                                      actions="resubmit(,%s)" %
                                      constants.PATCH_LV_TO_TUN)
        self.mock_tun_bridge.add_flow(priority=0, actions='drop')
        self.mock_tun_bridge.add_flow(table=constants.PATCH_LV_TO_TUN,
                                      dl_dst=UCAST_MAC,
                                      actions="resubmit(,%s)" %
                                      constants.UCAST_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.PATCH_LV_TO_TUN,
                                      dl_dst=BCAST_MAC,
                                      actions="resubmit(,%s)" %
                                      constants.FLOOD_TO_TUN)
        for tunnel_type in constants.TUNNEL_NETWORK_TYPES:
            self.mock_tun_bridge.add_flow(
                table=constants.TUN_TABLE[tunnel_type],
                priority=0,
                actions="drop")
        learned_flow = ("table=%s,"
                        "priority=1,"
                        "hard_timeout=300,"
                        "NXM_OF_VLAN_TCI[0..11],"
                        "NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],"
                        "load:0->NXM_OF_VLAN_TCI[],"
                        "load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],"
                        "output:NXM_OF_IN_PORT[]" % constants.UCAST_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.LEARN_FROM_TUN,
                                      priority=1,
                                      actions="learn(%s),output:%s" %
                                      (learned_flow, self.INT_OFPORT))
        self.mock_tun_bridge.add_flow(table=constants.UCAST_TO_TUN,
                                      priority=0,
                                      actions="resubmit(,%s)" %
                                      constants.FLOOD_TO_TUN)
        self.mock_tun_bridge.add_flow(table=constants.FLOOD_TO_TUN,
                                      priority=0,
                                      actions="drop")

        self.mox.StubOutWithMock(ip_lib, 'device_exists')
        ip_lib.device_exists('tunnel_bridge_mapping', 'sudo').AndReturn(True)
        ip_lib.device_exists('int-tunnel_bridge_mapping',
                             'sudo').AndReturn(True)

        self.mox.StubOutWithMock(ip_lib.IpLinkCommand, 'delete')
        ip_lib.IPDevice('int-tunnel_bridge_mapping').link.delete()

        self.mox.StubOutClassWithMocks(ip_lib, 'IPWrapper')
        ip_lib.IPWrapper('sudo').add_veth(
            'int-tunnel_bridge_mapping',
            'phy-tunnel_bridge_mapping').AndReturn([self.inta, self.intb])

        self.mox.StubOutWithMock(ovs_lib, 'get_bridges')
        ovs_lib.get_bridges('sudo').AndReturn(
            [self.INT_BRIDGE, self.TUN_BRIDGE, self.MAP_TUN_BRIDGE])