X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=mappingservice%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Flispflowmapping%2Fimplementation%2FMappingService.java;h=0cd50e7632c4a801699b24acffe3ccd490fdbef1;hb=c0e8d23f4f65b30b40ab92d4bcca33d591774923;hp=79a0ef4f3eb37970b0d9934ac97d53f1c558ace3;hpb=875081aa148e337269d6480e9dde55030553f9d5;p=lispflowmapping.git diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java index 79a0ef4f3..0cd50e763 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2015, 2017 Cisco Systems, Inc. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -7,26 +7,31 @@ */ package org.opendaylight.lispflowmapping.implementation; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.Futures; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Future; - import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; -import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; -import org.opendaylight.lispflowmapping.implementation.config.ConfigIni; +import org.opendaylight.lispflowmapping.config.ConfigIni; +import org.opendaylight.lispflowmapping.dsbackend.DataStoreBackEnd; import org.opendaylight.lispflowmapping.implementation.mdsal.AuthenticationKeyDataListener; -import org.opendaylight.lispflowmapping.implementation.mdsal.DataStoreBackEnd; import org.opendaylight.lispflowmapping.implementation.mdsal.MappingDataListener; import org.opendaylight.lispflowmapping.implementation.util.DSBEInputUtil; import org.opendaylight.lispflowmapping.implementation.util.RPCInputConvertorUtil; import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO; import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService; +import org.opendaylight.lispflowmapping.lisp.type.MappingData; +import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil; 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.XtrId; 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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddKeyInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddKeysInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddMappingInput; @@ -41,6 +46,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev15090 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingWithXtrIdInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingWithXtrIdOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingWithXtrIdOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin; @@ -53,16 +61,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev15090 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.UpdateKeysInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.UpdateMappingInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.UpdateMappingsInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkey; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.Futures; - /** * Dispatcher of API calls that implements the RPC and Java APIs in mappingservice.yang and IMappingService * respectively. It also coordinates and acts as container for all objects in charge of @@ -74,71 +78,61 @@ import com.google.common.util.concurrent.Futures; * @author Florin Coras * */ -public class MappingService implements OdlMappingserviceService, IMappingService, BindingAwareProvider, AutoCloseable { +public class MappingService implements OdlMappingserviceService, IMappingService, AutoCloseable { protected static final Logger LOG = LoggerFactory.getLogger(MappingService.class); private static final String NOT_FOUND_TAG = "data-missing"; private static final String DATA_EXISTS_TAG = "data-exists"; private MappingSystem mappingSystem; private DataStoreBackEnd dsbe; - private RpcRegistration mappingServiceRpc; private AuthenticationKeyDataListener keyListener; private MappingDataListener mappingListener; - private ILispDAO dao; + private final ILispDAO dao; - private DataBroker dataBroker; - private RpcProviderRegistry rpcRegistry; - private BindingAwareBroker bindingAwareBroker; - private NotificationPublishService notificationPublishService; + private final DataBroker dataBroker; + private final NotificationPublishService notificationPublishService; - private boolean overwritePolicy = ConfigIni.getInstance().mappingOverwriteIsSet(); + private boolean mappingMergePolicy = ConfigIni.getInstance().mappingMergeIsSet(); private boolean notificationPolicy = ConfigIni.getInstance().smrIsSet(); private boolean iterateMask = true; + private boolean isMaster = false; - public MappingService() { - LOG.debug("MappingService created!"); - } - - public void setDataBroker(DataBroker dataBroker) { - this.dataBroker = dataBroker; - } - - public void setRpcProviderRegistry(RpcProviderRegistry rpc) { - this.rpcRegistry = rpc; - } - - public void setBindingAwareBroker(BindingAwareBroker broker) { - this.bindingAwareBroker = broker; - } + public MappingService(final DataBroker broker, + final NotificationPublishService notificationPublishService, + final ILispDAO lispDAO) { + this.dataBroker = broker; + this.notificationPublishService = notificationPublishService; + this.dao = lispDAO; - public void setNotificationPublishService(NotificationPublishService nps) { - this.notificationPublishService = nps; + LOG.debug("MappingService created!"); } - public void setDaoService(ILispDAO dao) { - this.dao = dao; - } @Override - public void setMappingOverwrite(boolean overwrite) { - this.overwritePolicy = overwrite; + public void setMappingMerge(boolean mergeMapping) { + this.mappingMergePolicy = mergeMapping; if (mappingSystem != null) { - mappingSystem.setOverwritePolicy(overwrite); + mappingSystem.setMappingMerge(mergeMapping); + ConfigIni.getInstance().setMappingMerge(mappingMergePolicy); } } - public void initialize() { - bindingAwareBroker.registerProvider(this); + @Override + public void setLookupPolicy(IMappingService.LookupPolicy policy) { + ConfigIni.getInstance().setLookupPolicy(policy); + } - mappingServiceRpc = rpcRegistry.addRpcImplementation(OdlMappingserviceService.class, this); + public void initialize() { + LOG.info("Mapping Service initializing..."); dsbe = new DataStoreBackEnd(dataBroker); - mappingSystem = new MappingSystem(dao, iterateMask, notificationPolicy, overwritePolicy); + mappingSystem = new MappingSystem(dao, iterateMask, notificationPublishService, mappingMergePolicy); mappingSystem.setDataStoreBackEnd(dsbe); mappingSystem.initialize(); keyListener = new AuthenticationKeyDataListener(dataBroker, mappingSystem); mappingListener = new MappingDataListener(dataBroker, mappingSystem, notificationPublishService); + LOG.info("Mapping Service loaded."); } @Override @@ -148,7 +142,7 @@ public class MappingService implements OdlMappingserviceService, IMappingService RpcResultBuilder rpcResultBuilder; - MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid()); + MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid())); if (key != null) { String message = "Key already exists! Please use update-key if you want to change it."; @@ -177,6 +171,32 @@ public class MappingService implements OdlMappingserviceService, IMappingService return Futures.immediateFuture(rpcResultBuilder.build()); } + @Override + public void addMapping(MappingOrigin origin, Eid key, SiteId siteId, MappingData mappingData) { + // SB registrations are first written to the MappingSystem and only afterwards are persisted to the datastore + if (origin.equals(MappingOrigin.Southbound)) { + // Store data first in MapCache and only afterwards persist to datastore. This should be used only for SB + // registrations + mappingSystem.addMapping(origin, key, mappingData); + dsbe.addMapping(DSBEInputUtil.toMapping(origin, key, siteId, mappingData)); + if (mappingData.getXtrId() != null) { + dsbe.addXtrIdMapping(DSBEInputUtil.toXtrIdMapping(mappingData)); + } + } else { + dsbe.addMapping(DSBEInputUtil.toMapping(origin, key, siteId, mappingData)); + } + } + + @Override + public MappingData addNegativeMapping(Eid key) { + return mappingSystem.addNegativeMapping(key); + } + + @Override + public void refreshMappingRegistration(Eid key, XtrId xtrId, Long timestamp) { + mappingSystem.refreshMappingRegistration(key, xtrId, timestamp); + } + @Override public Future> getKey(GetKeyInput input) { Preconditions.checkNotNull(input, "get-key RPC input must be not null!"); @@ -184,7 +204,7 @@ public class MappingService implements OdlMappingserviceService, IMappingService RpcResultBuilder rpcResultBuilder; - MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid()); + MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid())); if (key == null) { String message = "Key was not found in the mapping database"; @@ -204,14 +224,53 @@ public class MappingService implements OdlMappingserviceService, IMappingService RpcResultBuilder rpcResultBuilder; - MappingRecord reply = (MappingRecord) mappingSystem.getMapping(input.getEid()); + MappingData reply = mappingSystem.getMapping(convertToBinaryIfNecessary(input.getEid())); if (reply == null) { String message = "No mapping was found in the mapping database"; rpcResultBuilder = RpcResultBuilder.failed() .withError(RpcError.ErrorType.APPLICATION, NOT_FOUND_TAG, message); } else { - rpcResultBuilder = RpcResultBuilder.success(new GetMappingOutputBuilder().setMappingRecord(reply)); + final MappingRecord convertedReply = convertFromBinaryIfNecessary(reply.getRecord()); + rpcResultBuilder = RpcResultBuilder.success(new GetMappingOutputBuilder().setMappingRecord(convertedReply)); + } + + return Futures.immediateFuture(rpcResultBuilder.build()); + } + + @Override + public MappingData getMapping(MappingOrigin origin, Eid key) { + return mappingSystem.getMapping(origin, key); + } + + @Override + public MappingData getMapping(Eid key) { + return mappingSystem.getMapping(key); + } + + @Override + public MappingData getMapping(Eid srcKey, Eid dstKey) { + return mappingSystem.getMapping(srcKey, dstKey); + } + + @Override + public Future> getMappingWithXtrId(GetMappingWithXtrIdInput input) { + Preconditions.checkNotNull(input, "get-mapping RPC input must be not null!"); + LOG.trace("RPC received to get the following mapping: " + input.toString()); + + RpcResultBuilder rpcResultBuilder; + + MappingData reply = mappingSystem.getMapping(null, convertToBinaryIfNecessary(input.getEid()), + input.getXtrId()); + + if (reply == null) { + String message = "No mapping was found in the mapping database"; + rpcResultBuilder = RpcResultBuilder.failed() + .withError(RpcError.ErrorType.APPLICATION, NOT_FOUND_TAG, message); + } else { + final MappingRecord convertedReply = convertFromBinaryIfNecessary(reply.getRecord()); + rpcResultBuilder = RpcResultBuilder.success(new GetMappingWithXtrIdOutputBuilder() + .setMappingRecord(convertedReply)); } return Futures.immediateFuture(rpcResultBuilder.build()); @@ -245,6 +304,11 @@ public class MappingService implements OdlMappingserviceService, IMappingService return Futures.immediateFuture(rpcResultBuilder.build()); } + @Override + public void removeMapping(MappingOrigin origin, Eid key) { + dsbe.removeMapping(DSBEInputUtil.toMapping(origin, key)); + } + @Override public Future> updateKey(UpdateKeyInput input) { Preconditions.checkNotNull(input, "update-key RPC input must be not null!"); @@ -252,7 +316,7 @@ public class MappingService implements OdlMappingserviceService, IMappingService RpcResultBuilder rpcResultBuilder; - MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid()); + MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid())); if (key == null) { String message = "Key doesn't exist! Please use add-key if you want to create a new authentication key."; @@ -355,36 +419,26 @@ public class MappingService implements OdlMappingserviceService, IMappingService } @Override - public void addMapping(MappingOrigin origin, Eid key, SiteId siteId, Object data) { - // SB registrations are first written to the MappingSystem and only afterwards are persisted to the datastore - if (origin.equals(MappingOrigin.Southbound)) { - // Store data first in MapCache and only afterwards persist to datastore. This should be used only for SB - // registrations - mappingSystem.addMapping(origin, key, data); - dsbe.addMapping(DSBEInputUtil.toMapping(origin, key, siteId, (MappingRecord) data)); - } else { - dsbe.addMapping(DSBEInputUtil.toMapping(origin, key, siteId, (MappingRecord) data)); - } - } + public Future> removeAllOperationalContent() { + RpcResultBuilder rpcResultBuilder; - @Override - public Object getMapping(MappingOrigin origin, Eid key) { - return mappingSystem.getMapping(origin, key); - } + /* + * Since master nodes ignore datastore changes for southbound originated mappings, they need to be removed + * explicitly. + */ + if (isMaster) { + mappingSystem.cleanSBMappings(); + } + dsbe.removeAllOperationalDatastoreContent(); - @Override - public Object getMapping(Eid key) { - return mappingSystem.getMapping(key); - } + rpcResultBuilder = RpcResultBuilder.success(); - @Override - public Object getMapping(Eid srcKey, Eid dstKey) { - return mappingSystem.getMapping(srcKey, dstKey); + return Futures.immediateFuture(rpcResultBuilder.build()); } @Override - public void removeMapping(MappingOrigin origin, Eid key) { - dsbe.removeMapping(DSBEInputUtil.toMapping(origin, key)); + public Eid getWidestNegativePrefix(Eid key) { + return mappingSystem.getWidestNegativePrefix(key); } @Override @@ -417,27 +471,94 @@ public class MappingService implements OdlMappingserviceService, IMappingService mappingSystem.removeData(origin, key, subKey); } + @Override + public Eid getParentPrefix(Eid key) { + return mappingSystem.getParentPrefix(key); + } + @Override public String printMappings() { return mappingSystem.printMappings(); } @Override - public void onSessionInitiated(ProviderContext session) { - LOG.info("Mapping Service provider session initializing!"); + public String prettyPrintMappings() { + return mappingSystem.prettyPrintMappings(); + } + + @Override + public String printKeys() { + return mappingSystem.printKeys(); } @Override public void close() throws Exception { LOG.info("Mapping Service is being destroyed!"); - mappingServiceRpc.close(); keyListener.closeDataChangeListener(); mappingListener.closeDataChangeListener(); + mappingSystem.destroy(); } @Override public void cleanCachedMappings() { mappingSystem.cleanCaches(); - dsbe.removeAllMappings(); + dsbe.removeAllDatastoreContent(); + } + + private static Eid convertToBinaryIfNecessary(Eid eid) { + if (LispAddressUtil.addressNeedsConversionToBinary(eid.getAddress())) { + return LispAddressUtil.convertToBinary(eid); + } + return eid; + } + + private static MappingRecord convertFromBinaryIfNecessary(MappingRecord originalRecord) { + List originalLocators = originalRecord.getLocatorRecord(); + + List convertedLocators = null; + if (originalLocators != null) { + // If convertedLocators is non-null, while originalLocators is also non-null, conversion has been made + convertedLocators = convertFromBinaryIfNecessary(originalLocators); + } + + if (LispAddressUtil.addressNeedsConversionFromBinary(originalRecord.getEid().getAddress()) + || (originalLocators != null && convertedLocators != null)) { + MappingRecordBuilder mrb = new MappingRecordBuilder(originalRecord); + mrb.setEid(LispAddressUtil.convertFromBinary(originalRecord.getEid())); + if (convertedLocators != null) { + mrb.setLocatorRecord(convertedLocators); + } + return mrb.build(); + } + return originalRecord; + } + + private static List convertFromBinaryIfNecessary(List originalLocators) { + List convertedLocators = null; + for (LocatorRecord record : originalLocators) { + if (LispAddressUtil.addressNeedsConversionFromBinary(record.getRloc().getAddress())) { + LocatorRecordBuilder lrb = new LocatorRecordBuilder(record); + lrb.setRloc(LispAddressUtil.convertFromBinary(record.getRloc())); + if (convertedLocators == null) { + convertedLocators = new ArrayList(); + } + convertedLocators.add(lrb.build()); + } + } + if (convertedLocators != null) { + return convertedLocators; + } + return originalLocators; + } + + @Override + public void setIsMaster(boolean isMaster) { + this.isMaster = isMaster; + mappingSystem.setIsMaster(isMaster); + } + + @Override + public boolean isMaster() { + return isMaster; } }