import java.util.List;
import org.opendaylight.lispflowmapping.implementation.config.ConfigIni;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
import org.opendaylight.lispflowmapping.implementation.mapcache.FlatMapCache;
import org.opendaylight.lispflowmapping.implementation.mapcache.MultiTableMapCache;
import org.opendaylight.lispflowmapping.implementation.mapcache.SimpleMapCache;
import org.opendaylight.lispflowmapping.implementation.mdsal.DataStoreBackEnd;
+import org.opendaylight.lispflowmapping.implementation.util.DSBEInputUtil;
import org.opendaylight.lispflowmapping.implementation.util.MappingMergeUtil;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
private IMapCache pmc;
private final EnumMap<MappingOrigin, IMapCache> tableMap = new EnumMap<>(MappingOrigin.class);
private DataStoreBackEnd dsbe;
- private BindingAwareBroker bindingAwareBroker;
public MappingSystem(ILispDAO dao, boolean iterateMask, boolean notifications, boolean overwrite) {
this.dao = dao;
Object nbMapping = pmc.getMapping(src, dst);
if (nbMapping == null) {
- return smc.getMapping(src, dst);
+ return getSbMappingWithExpiration(src, dst);
}
if (dst.getAddress() instanceof ServicePath) {
return updateServicePathMappingRecord((MappingRecord) nbMapping, dst);
if (dst.getAddress() instanceof ServicePath) {
return updateServicePathMappingRecord((MappingRecord)nbMapping, dst);
}
- Object sbMapping = smc.getMapping(src, dst);
+ Object sbMapping = getSbMappingWithExpiration(src, dst);
if (sbMapping == null) {
return nbMapping;
}
return MappingMergeUtil.computeNbSbIntersection((MappingRecord)nbMapping, (MappingRecord)sbMapping);
}
+ private Object getSbMappingWithExpiration(Eid src, Eid dst) {
+ Object mappingObject = smc.getMapping(src, dst);
+ if (mappingObject instanceof MappingRecord) {
+ MappingRecord mapping = (MappingRecord) mappingObject;
+ if (MappingMergeUtil.mappingIsExpired(mapping)) {
+ dsbe.removeMapping(DSBEInputUtil.toMapping(MappingOrigin.Southbound, mapping.getEid(),
+ new SiteId(mapping.getSiteId()), mapping));
+ return null;
+ }
+ }
+ return mappingObject;
+ }
+
@Override
public Object getMapping(Eid dst) {
return getMapping((Eid)null, dst);
@Override
public Object getMapping(MappingOrigin origin, Eid key) {
+ if (origin.equals(MappingOrigin.Southbound)) {
+ return getSbMappingWithExpiration(null, key);
+ }
return tableMap.get(origin).getMapping(null, key);
}
@Override
public void addAuthenticationKey(Eid key, MappingAuthkey authKey) {
- LOG.debug("Adding authentication key '{}' for {}", authKey.getKeyString(),
+ LOG.debug("Adding authentication key '{}' with key-ID {} for {}", authKey.getKeyString(), authKey.getKeyType(),
LispAddressStringifier.getString(key));
smc.addAuthenticationKey(key, authKey);
}
LOG.info("Restoring {} mappings and {} keys from datastore into DAO", mappings.size(), authKeys.size());
+ int expiredMappings = 0;
for (Mapping mapping : mappings) {
+ if (MappingMergeUtil.mappingIsExpired(mapping.getMappingRecord())) {
+ dsbe.removeMapping(mapping);
+ expiredMappings++;
+ continue;
+ }
addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(), mapping.getMappingRecord());
}
+ LOG.info("{} mappings were expired and were not restored", expiredMappings);
for (AuthenticationKey authKey : authKeys) {
addAuthenticationKey(authKey.getEid(), authKey.getMappingAuthkey());