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
def _process_deleted_physical_ports(self, context, deleted_physical_ports): for physical_port in deleted_physical_ports: pp_dict = physical_port pp_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier port_name = pp_dict['name'] p_port = db.get_physical_port(context, pp_dict) if not p_port: raise l2gw_exc.L2GatewayInterfaceNotFound( interface_id=port_name) p_switch_id = p_port.get('physical_switch_id') switch_dict = {} switch_dict['uuid'] = p_switch_id switch_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier switch_db = db.get_physical_switch(context, switch_dict) if not switch_db: raise l2gw_exc.L2GatewayDeviceNotFound( device_id=p_switch_id) switch_name = switch_db.get('name') l2gw_id_list = self.l2gw_mixin._get_l2gw_ids_by_interface_switch( context, port_name, switch_name) if l2gw_id_list: for l2gw_id in l2gw_id_list: self.l2gw_mixin._delete_connection_by_l2gw_id(context, l2gw_id) vlan_bindings = db.get_all_vlan_bindings_by_physical_port( context, pp_dict) ls_set = set() for vlan_binding in vlan_bindings: vlan_binding['logical_switch_id'] = vlan_binding.get( 'logical_switch_uuid') if vlan_binding.get('logical_switch_uuid') in ls_set: db.delete_vlan_binding(context, vlan_binding) continue bindings = db.get_all_vlan_bindings_by_logical_switch( context, vlan_binding) if bindings and len(bindings) == 1: self._delete_macs_from_ovsdb( context, vlan_binding.get('logical_switch_uuid'), self.ovsdb_identifier) elif bindings and len(bindings) > 1: flag = True for binding in bindings: if binding[ 'ovsdb_identifier'] == self.ovsdb_identifier: flag = False break if flag: self._delete_macs_from_ovsdb( context, vlan_binding.get('logical_switch_uuid'), self.ovsdb_identifier) ls_set.add(vlan_binding.get('logical_switch_uuid')) db.delete_vlan_binding(context, vlan_binding) db.delete_physical_port(context, pp_dict)
def _process_deleted_physical_ports(self, context, deleted_physical_ports): for physical_port in deleted_physical_ports: pp_dict = physical_port pp_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier port_name = pp_dict['name'] p_port = db.get_physical_port(context, pp_dict) if not p_port: raise l2gw_exc.L2GatewayInterfaceNotFound( interface_id=port_name) p_switch_id = p_port.get('physical_switch_id') switch_dict = {} switch_dict['uuid'] = p_switch_id switch_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier switch_db = db.get_physical_switch(context, switch_dict) if not switch_db: raise l2gw_exc.L2GatewayDeviceNotFound(device_id=p_switch_id) switch_name = switch_db.get('name') l2gw_id_list = self.l2gw_mixin._get_l2gw_ids_by_interface_switch( context, port_name, switch_name) if l2gw_id_list: for l2gw_id in l2gw_id_list: self.l2gw_mixin._delete_connection_by_l2gw_id( context, l2gw_id) vlan_bindings = db.get_all_vlan_bindings_by_physical_port( context, pp_dict) ls_set = set() for vlan_binding in vlan_bindings: vlan_binding['logical_switch_id'] = vlan_binding.get( 'logical_switch_uuid') if vlan_binding.get('logical_switch_uuid') in ls_set: db.delete_vlan_binding(context, vlan_binding) continue bindings = db.get_all_vlan_bindings_by_logical_switch( context, vlan_binding) if bindings and len(bindings) == 1: self._delete_macs_from_ovsdb( context, vlan_binding.get('logical_switch_uuid'), self.ovsdb_identifier) elif bindings and len(bindings) > 1: flag = True for binding in bindings: if binding[ 'ovsdb_identifier'] == self.ovsdb_identifier: flag = False break if flag: self._delete_macs_from_ovsdb( context, vlan_binding.get('logical_switch_uuid'), self.ovsdb_identifier) ls_set.add(vlan_binding.get('logical_switch_uuid')) db.delete_vlan_binding(context, vlan_binding) db.delete_physical_port(context, pp_dict)
def test_get_all_vlan_bindings_by_physical_port(self): record_dict1 = {'port_uuid': 'ps123', 'vlan': 200, 'logical_switch_uuid': 'ls123', 'ovsdb_identifier': 'host1'} self._create_vlan_binding(record_dict1) record_dict1['vlan'] = 300 record_dict1['logical_switch_uuid'] = 'ls456' self._create_vlan_binding(record_dict1) record_dict1['uuid'] = record_dict1.get('port_uuid') vlan_list = lib.get_all_vlan_bindings_by_physical_port(self.ctx, record_dict1) self.assertEqual(2, len(vlan_list))
def _process_modified_physical_ports(self, context, modified_physical_ports): for physical_port in modified_physical_ports: pp_dict = physical_port pp_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier modified_port = db.get_physical_port(context, pp_dict) if modified_port: db.update_physical_ports_status(context, pp_dict) port_vlan_bindings = physical_port.get('vlan_bindings') vlan_bindings = db.get_all_vlan_bindings_by_physical_port( context, pp_dict) for vlan_binding in vlan_bindings: db.delete_vlan_binding(context, vlan_binding) for port_vlan_binding in port_vlan_bindings: port_vlan_binding['port_uuid'] = pp_dict['uuid'] port_vlan_binding[ n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier db.add_vlan_binding(context, port_vlan_binding) else: db.add_physical_port(context, pp_dict)
def _process_modified_physical_ports(self, context, modified_physical_ports): for physical_port in modified_physical_ports: pp_dict = physical_port pp_dict[n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier modified_port = db.get_physical_port(context, pp_dict) if modified_port: db.update_physical_ports_status(context, pp_dict) port_vlan_bindings = physical_port.get('vlan_bindings') vlan_bindings = db.get_all_vlan_bindings_by_physical_port( context, pp_dict) for vlan_binding in vlan_bindings: db.delete_vlan_binding(context, vlan_binding) for port_vlan_binding in port_vlan_bindings: port_vlan_binding['port_uuid'] = pp_dict['uuid'] port_vlan_binding[ n_const.OVSDB_IDENTIFIER] = self.ovsdb_identifier db.add_vlan_binding(context, port_vlan_binding) else: db.add_physical_port(context, pp_dict)