Exemple #1
0
 def _generate_port_list(self, context, method, seg_id,
                         interface, pp_dict,
                         logical_switch_uuid, gw_connection=None):
     port_list = []
     vlan_bindings = db.get_all_vlan_bindings_by_physical_port(
         context, pp_dict)
     if method == "CREATE":
         if not seg_id:
             vlan_id = interface.get('segmentation_id')
         else:
             vlan_id = int(seg_id)
         vlan_dict = {'vlan': vlan_id,
                      'logical_switch_uuid': logical_switch_uuid}
         port_list.append(vlan_dict)
         for vlan_binding in vlan_bindings:
             if vlan_binding.get('vlan') == vlan_id:
                 msg = _('Duplicate segmentation ID for the interface '
                         'name=%(name)s uuid=%(uuid)s'
                         ) % {'name': pp_dict['name'],
                              'uuid': pp_dict['uuid']}
                 raise l2gw_exc.L2GatewayDuplicateSegmentationID(message=msg
                                                                 )
             vlan_dict = {'vlan': vlan_binding.get('vlan'),
                          'logical_switch_uuid': vlan_binding.get(
                              'logical_switch_uuid')}
             port_list.append(vlan_dict)
         physical_port = self._get_dict(
             ovsdb_schema.PhysicalPort(
                 uuid=pp_dict.get('uuid'),
                 name=pp_dict.get('interface_name'),
                 phys_switch_id=pp_dict.get('physical_switch_id'),
                 vlan_binding_dicts=None,
                 port_fault_status=None))
         physical_port['vlan_bindings'] = port_list
     else:
         vlan_id = gw_connection.get('segmentation_id')
         if not vlan_id:
             vlan_id = interface.get('segmentation_id')
         for vlan_binding in vlan_bindings:
             if ((vlan_binding.get('vlan') == vlan_id) and (
                 vlan_binding.get(
                     'logical_switch_uuid') == logical_switch_uuid)):
                 continue
             else:
                 vlan_dict = {
                     'vlan': vlan_binding.get('vlan'),
                     'logical_switch_uuid':
                     vlan_binding.get('logical_switch_uuid')}
                 port_list.append(vlan_dict)
         physical_port = self._get_dict(
             ovsdb_schema.PhysicalPort(
                 uuid=pp_dict.get('uuid'),
                 name=pp_dict.get('interface_name'),
                 phys_switch_id=pp_dict.get('physical_switch_id'),
                 vlan_binding_dicts=None,
                 port_fault_status=None))
         physical_port['vlan_bindings'] = port_list
     return physical_port
Exemple #2
0
 def _process_physical_port(self, uuid, uuid_dict, port_map, data_dict):
     """Processes Physical_Port record from the OVSDB event."""
     new_row = uuid_dict.get('new', None)
     old_row = uuid_dict.get('old', None)
     if new_row:
         port_fault_status = new_row.get('port_fault_status')
         if type(port_fault_status) is list:
             port_fault_status = None
         port = ovsdb_schema.PhysicalPort(uuid, new_row.get('name'), None,
                                          None,
                                          port_fault_status)
         switch_id = port_map.get(uuid, None)
         if switch_id:
             port.physical_switch_id = switch_id
         # Update the vlan bindings
         outer_binding_list = new_row.get('vlan_bindings')
         # First element is "map"
         outer_binding_list.remove(outer_binding_list[0])
         vlan_bindings = []
         if len(outer_binding_list) > 0:
             for binding in outer_binding_list:
                 if len(binding) > 0:
                     for element in binding:
                         vlan = element[0]
                         inner_most_list = element[1]
                         ls_id = inner_most_list[1]
                         vb = ovsdb_schema.VlanBinding(vlan, ls_id).__dict__
                         vlan_bindings.append(vb)
         port.vlan_bindings = vlan_bindings
         if old_row:
             modified_physical_ports = data_dict.get(
                 'modified_physical_ports')
             modified_physical_ports.append(port)
         else:
             new_physical_ports = data_dict.get(
                 'new_physical_ports')
             new_physical_ports.append(port)
     elif old_row:
         # Port is deleted permanently from OVSDB server
         port_fault_status = old_row.get('port_fault_status')
         if type(port_fault_status) is list:
             port_fault_status = None
         port = ovsdb_schema.PhysicalPort(uuid, old_row.get('name'), None,
                                          None,
                                          port_fault_status)
         deleted_physical_ports = data_dict.get('deleted_physical_ports')
         deleted_physical_ports.append(port)
    def test_get_bindings_to_update1(self):
        """Test case to test _get_bindings_to_update."""
        fake_op_method = 'CREATE'
        with mock.patch.object(
                ovsdb_writer.OVSDBWriter,
                '_form_logical_switch') as form_ls, \
                mock.patch.object(
                    ovsdb_writer.OVSDBWriter,
                    '_form_physical_locators') as form_pl, \
                mock.patch.object(
                    ovsdb_writer.OVSDBWriter, '_form_ports') as form_pp, \
                mock.patch.object(
                    ovsdb_schema, 'LogicalSwitch') as mock_ls, \
                mock.patch.object(
                    ovsdb_schema, 'PhysicalLocator') as mock_pl, \
                mock.patch.object(
                    ovsdb_schema, 'UcastMacsRemote') as mock_ucmr, \
                mock.patch.object(ovsdb_schema, 'PhysicalPort') as mock_pp:
            ls = mock_ls.return_value = ovsdb_schema.LogicalSwitch(
                'ls_uuid', 'ls_name', 'ls_key', 'ls_desc')
            pl = mock_pl.return_value = ovsdb_schema.PhysicalLocator(
                'pl_uuid', 'pl_dst_ip')
            mock_ucmr.return_value = ovsdb_schema.UcastMacsRemote(
                'ucmr_uuid', 'ucmr_mac', 'ucmr_ls_id', 'ucmr_pl_id', 'ucmr_ip')
            pp = mock_pp.return_value = ovsdb_schema.PhysicalPort(
                'pp_uuid', 'pp_name', 'pp_ps_id', 'pp_vlan_bindings')
            form_ls.return_value = ['uuid', ls.uuid]
            self.l2gw_ovsdb._get_bindings_to_update(
                mock.MagicMock(), [{
                    'uuid': 'uuid',
                    'dst_ip': 'dst_ip'
                }], mock.MagicMock(), [{
                    'uuid': 'uuid',
                    'name': 'name',
                    'physical_switch_id': 'physical_switch_id',
                    'vlan_bindings': 'vlan_bindings',
                    'port_fault_status': 'port_fault_status'
                }], fake_op_method)

            form_ls.assert_called_with(ls, mock.ANY)
            form_pl.assert_called_with(['uuid', ls.uuid], [pl], mock.ANY,
                                       mock.ANY)
            form_pp.assert_called_with(['uuid', ls.uuid], [pp], mock.ANY,
                                       fake_op_method)
Exemple #4
0
    def _get_bindings_to_update(self, l_switch_dict, locator_dicts, mac_dicts,
                                port_dicts):
        # For connection-create, there are two cases to be handled
        # Case 1: VMs exist in a network on compute nodes.
        #         Connection request will contain locators, ports, MACs and
        #         network.
        # Case 2: VMs do not exist in a network on compute nodes.
        #         Connection request will contain only ports and network
        #
        # For connection-delete, we do not need logical_switch and locators
        # information, we just need ports.
        locator_list = []
        port_list = []
        ls_list = []
        logical_switch = None
        # Convert logical switch dict to a class object
        if l_switch_dict:
            logical_switch = ovsdb_schema.LogicalSwitch(
                l_switch_dict['uuid'], l_switch_dict['name'],
                l_switch_dict['key'], l_switch_dict['description'])

        # Convert locator dicts into class objects
        for locator in locator_dicts:
            locator_list.append(
                ovsdb_schema.PhysicalLocator(locator['uuid'],
                                             locator['dst_ip']))

        # Convert MAC dicts into class objects. mac_dicts is a dictionary with
        # locator VTEP IP as the key and list of MACs as the value.
        locator_macs = {}
        for locator_ip, mac_list in mac_dicts.items():
            mac_object_list = []
            for mac_dict in mac_list:
                mac_object = ovsdb_schema.UcastMacsRemote(
                    mac_dict['uuid'], mac_dict['mac'],
                    mac_dict['logical_switch_id'],
                    mac_dict['physical_locator_id'], mac_dict['ip_address'])
                mac_object_list.append(mac_object)
            locator_macs[locator_ip] = mac_object_list

        # Convert port dicts into class objects
        for port in port_dicts:
            phys_port = ovsdb_schema.PhysicalPort(port['uuid'], port['name'],
                                                  port['physical_switch_id'],
                                                  port['vlan_bindings'],
                                                  port['port_fault_status'])
            port_list.append(phys_port)

        bindings = []
        bindings.append(n_const.OVSDB_SCHEMA_NAME)

        # Form the query.
        commit_dict = {"op": "commit", "durable": True}
        params = [n_const.OVSDB_SCHEMA_NAME]

        # Use logical switch
        if logical_switch:
            ls_list = self._form_logical_switch(logical_switch, params)

        # Use physical locators
        if locator_list:
            self._form_physical_locators(ls_list, locator_list, locator_macs,
                                         params)

        # Use ports
        self._form_ports(ls_list, port_list, params)
        params.append(commit_dict)
        return params