예제 #1
0
 def setUp(self):
     super(TrunkManagerTestCase, self).setUp()
     trunk_id = uuidutils.generate_uuid()
     self.tester = self.useFixture(
         conn_testers.OVSTrunkConnectionTester(
             self.net1_cidr, utils.gen_trunk_br_name(trunk_id)))
     self.trunk_manager = trunk_manager.TrunkManager(
         self.tester.bridge)
     self.trunk = trunk_manager.TrunkParentPort(
         trunk_id, uuidutils.generate_uuid())
예제 #2
0
    def _set_trunk_metadata(self, trunk_bridge, port, trunk_id, subport_ids):
        """Set trunk metadata in OVS port for trunk parent port."""
        # update the parent port external_ids to store the trunk bridge
        # name, trunk id and subport ids so we can easily remove the trunk
        # bridge and service ports once this port is removed
        trunk_bridge = trunk_bridge or ovs_lib.OVSBridge(
            utils.gen_trunk_br_name(trunk_id))
        port = port or self._get_parent_port(trunk_bridge)

        port['external_ids']['bridge_name'] = trunk_bridge.br_name
        port['external_ids']['trunk_id'] = trunk_id
        port['external_ids']['subport_ids'] = jsonutils.dumps(subport_ids)
        trunk_bridge.set_db_attribute(
            'Interface', port['name'], 'external_ids', port['external_ids'])
예제 #3
0
 def setUp(self):
     super(SubPortTestCase, self).setUp()
     trunk_id = uuidutils.generate_uuid()
     port_id = uuidutils.generate_uuid()
     port_mac = net.get_random_mac('fa:16:3e:00:00:00'.split(':'))
     trunk_bridge_name = utils.gen_trunk_br_name(trunk_id)
     trunk_bridge = self.useFixture(
         net_helpers.OVSTrunkBridgeFixture(trunk_bridge_name)).bridge
     segmentation_id = helpers.get_not_used_vlan(
         trunk_bridge, VLAN_RANGE)
     self.subport = trunk_manager.SubPort(
         trunk_id, port_id, port_mac, segmentation_id)
     self.subport.bridge = trunk_bridge
     self.br_int = self.useFixture(net_helpers.OVSBridgeFixture()).bridge
예제 #4
0
 def test_ovs_bridge_name_set_when_trunk_bound(self):
     helpers.register_ovs_agent(host=helpers.HOST)
     with self.port() as port:
         trunk_port_id = port['port']['id']
         trunk_req = {'port_id': trunk_port_id,
                      'tenant_id': 'test_tenant',
                      'sub_ports': []}
         trunk_res = self.trunk_plugin.create_trunk(self.context,
                                                    {'trunk': trunk_req})
         port['port'][pb.HOST_ID] = helpers.HOST
         bound_port = self.core_plugin.update_port(self.context,
                                                   trunk_port_id, port)
         self.assertEqual(
             utils.gen_trunk_br_name(trunk_res['id']),
             bound_port[pb.VIF_DETAILS][pb.VIF_DETAILS_BRIDGE_NAME])
예제 #5
0
 def get_connected_subports_for_trunk(self, trunk_id):
     """Return the list of subports present on the trunk bridge."""
     bridge = ovs_lib.OVSBridge(utils.gen_trunk_br_name(trunk_id))
     if not bridge.bridge_exists(bridge.br_name):
         return []
     try:
         ports = bridge.get_ports_attributes(
                         'Interface', columns=['name', 'external_ids'])
         return [
             self.trunk_manager.get_port_uuid_from_external_ids(port)
             for port in ports if is_subport(port['name'])
         ]
     except (RuntimeError, tman.TrunkManagerError) as e:
         LOG.error("Failed to get subports for bridge %(bridge)s: "
                   "%(err)s", {'bridge': bridge.br_name, 'err': e})
         return []
예제 #6
0
    def create_vlan_aware_vm(self, trunk_network, vlan_networks):
        """Create a fake machine with one untagged port and subports
        according vlan_networks parameter.

        :param trunk_network: Instance of Network where trunk port should be
                              created.
        :param vlan_networks: List of Network instances where subports should
                              be created.
        """
        trunk_parent_port = self.safe_client.create_port(
            self.tenant_id, trunk_network.id)

        vlan_subports = [
            self.safe_client.create_port(self.tenant_id, vlan_network.id,
                mac_address=trunk_parent_port['mac_address'])
            for vlan_network in vlan_networks]

        trunk = self.safe_client.create_trunk(
            self.tenant_id,
            name='mytrunk',
            port_id=trunk_parent_port['id'],
            sub_ports=[
                {'port_id': vlan_subport['id'],
                 'segmentation_type': 'vlan',
                 'segmentation_id': vlan_network.tag}
                for vlan_subport, vlan_network in zip(vlan_subports,
                                                      vlan_networks)
            ],
        )

        vm = self.useFixture(
            machine.FakeFullstackTrunkMachine(
                trunk,
                self.host,
                trunk_network.id,
                self.tenant_id,
                self.safe_client,
                neutron_port=trunk_parent_port,
                bridge_name=trunk_ovs_utils.gen_trunk_br_name(trunk['id'])))

        for port, vlan_network in zip(vlan_subports, vlan_networks):
            ip_network = make_ip_network(port, vlan_network.network)
            vm.add_vlan_interface(
                port['mac_address'], ip_network, vlan_network.tag)
        vm.block_until_boot()

        return vm
예제 #7
0
    def _update_trunk_metadata(self, trunk_bridge, port,
                               trunk_id, subport_ids, wire=True):
        """Update trunk metadata.

        :param trunk_bridge: OVS trunk bridge.
        :param port: OVS parent port.
        :param trunk_id: trunk ID.
        :param subport_ids: subports affecting the metadata.
        :param wire: if True subport_ids are added, otherwise removed.
        """
        trunk_bridge = trunk_bridge or ovs_lib.OVSBridge(
            utils.gen_trunk_br_name(trunk_id))
        port = port or self._get_parent_port(trunk_bridge)
        _port_id, _trunk_id, old_subports = self._get_trunk_metadata(port)
        if wire:
            new_subports = set(old_subports) | set(subport_ids)
        else:
            new_subports = set(old_subports) - set(subport_ids)
        self._set_trunk_metadata(trunk_bridge, port, trunk_id, new_subports)
예제 #8
0
 def manages_this_trunk(self, trunk_id):
     """True if this OVSDB handler manages trunk based on given ID."""
     bridge_name = utils.gen_trunk_br_name(trunk_id)
     return ovs_lib.BaseOVS().bridge_exists(bridge_name)
예제 #9
0
 def __init__(self, trunk_id):
     name = utils.gen_trunk_br_name(trunk_id)
     super(TrunkBridge, self).__init__(name)
예제 #10
0
파일: driver.py 프로젝트: cubeek/neutron
def vif_details_bridge_name_handler(resource, event, set_br_name,
                                    payload=None):
    """If port is a trunk port, generate a bridge_name for its vif_details."""
    port = payload.metadata['port']
    if 'trunk_details' in port:
        set_br_name(utils.gen_trunk_br_name(port['trunk_details']['trunk_id']))
예제 #11
0
def vif_details_bridge_name_handler(resource, event, set_br_name, **kwargs):
    """If port is a trunk port, generate a bridge_name for its vif_details."""
    port = kwargs["port"]
    if "trunk_details" in port:
        set_br_name(utils.gen_trunk_br_name(port["trunk_details"]["trunk_id"]))
예제 #12
0
def vif_details_bridge_name_handler(resource, event, set_br_name, **kwargs):
    """If port is a trunk port, generate a bridge_name for its vif_details."""
    port = kwargs['port']
    if 'trunk_details' in port:
        set_br_name(utils.gen_trunk_br_name(port['trunk_details']['trunk_id']))
예제 #13
0
def vif_details_bridge_name_handler(resource, event, set_br_name, **kwargs):
    """If port is a trunk port, generate a bridge_name for its vif_details."""
    port = kwargs['port']
    if 'trunk_details' in port:
        set_br_name(utils.gen_trunk_br_name(port['trunk_details']['trunk_id']))
예제 #14
0
 def __init__(self, trunk_id):
     name = utils.gen_trunk_br_name(trunk_id)
     super(TrunkBridge, self).__init__(name)