Bug 9116: SMR children of a prefix too
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / MappingService.java
index 90e0d44bd0a54ec29bc647f542e479945e64ae27..e7493eea654c5f8c62c3d15ab3b41a02db19a705 100644 (file)
@@ -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,
@@ -11,6 +11,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.Futures;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Future;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
@@ -21,6 +22,7 @@ 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.dao.Subscriber;
 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
@@ -79,7 +81,7 @@ import org.slf4j.LoggerFactory;
  *
  */
 public class MappingService implements OdlMappingserviceService, IMappingService, AutoCloseable {
-    protected static final Logger LOG = LoggerFactory.getLogger(MappingService.class);
+    private 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";
 
@@ -92,7 +94,7 @@ public class MappingService implements OdlMappingserviceService, IMappingService
     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;
@@ -109,11 +111,11 @@ public class MappingService implements OdlMappingserviceService, IMappingService
 
 
     @Override
-    public void setMappingOverwrite(boolean overwrite) {
-        this.overwritePolicy = overwrite;
+    public void setMappingMerge(boolean mergeMapping) {
+        this.mappingMergePolicy = mergeMapping;
         if (mappingSystem != null) {
-            mappingSystem.setOverwritePolicy(overwrite);
-            ConfigIni.getInstance().setMappingOverwrite(overwrite);
+            mappingSystem.setMappingMerge(mergeMapping);
+            ConfigIni.getInstance().setMappingMerge(mappingMergePolicy);
         }
     }
 
@@ -126,7 +128,7 @@ public class MappingService implements OdlMappingserviceService, IMappingService
         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();
 
@@ -187,6 +189,11 @@ public class MappingService implements OdlMappingserviceService, IMappingService
         }
     }
 
+    @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);
@@ -248,6 +255,16 @@ public class MappingService implements OdlMappingserviceService, IMappingService
         return mappingSystem.getMapping(srcKey, dstKey);
     }
 
+    @Override
+    public void subscribe(Subscriber subscriber, Eid subscribedEid) {
+        mappingSystem.subscribe(subscriber, subscribedEid);
+    }
+
+    @Override
+    public Set<Subscriber> getSubscribers(Eid eid) {
+        return mappingSystem.getSubscribers(eid);
+    }
+
     @Override
     public Future<RpcResult<GetMappingWithXtrIdOutput>> getMappingWithXtrId(GetMappingWithXtrIdInput input) {
         Preconditions.checkNotNull(input, "get-mapping RPC input must be not null!");
@@ -301,6 +318,9 @@ public class MappingService implements OdlMappingserviceService, IMappingService
 
     @Override
     public void removeMapping(MappingOrigin origin, Eid key) {
+        if (origin.equals(MappingOrigin.Southbound)) {
+            mappingSystem.removeMapping(origin, key);
+        }
         dsbe.removeMapping(DSBEInputUtil.toMapping(origin, key));
     }
 
@@ -413,11 +433,34 @@ public class MappingService implements OdlMappingserviceService, IMappingService
         return null;
     }
 
+    @Override
+    public Future<RpcResult<Void>> removeAllOperationalContent() {
+        RpcResultBuilder<Void> rpcResultBuilder;
+
+        /*
+         * Since master nodes ignore datastore changes for southbound originated mappings, they need to be removed
+         * explicitly.
+         */
+        if (isMaster) {
+            mappingSystem.cleanSBMappings();
+        }
+        dsbe.removeAllOperationalDatastoreContent();
+
+        rpcResultBuilder = RpcResultBuilder.success();
+
+        return Futures.immediateFuture(rpcResultBuilder.build());
+    }
+
     @Override
     public Eid getWidestNegativePrefix(Eid key) {
         return mappingSystem.getWidestNegativePrefix(key);
     }
 
+    @Override
+    public Set<Eid> getSubtree(MappingOrigin origin, Eid key) {
+        return mappingSystem.getSubtree(origin, key);
+    }
+
     @Override
     public void addAuthenticationKey(Eid key, MappingAuthkey authKey) {
         dsbe.addAuthenticationKey(DSBEInputUtil.toAuthenticationKey(key, authKey));
@@ -448,11 +491,31 @@ 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 String prettyPrintMappings() {
+        return mappingSystem.prettyPrintMappings();
+    }
+
+    @Override
+    public String printKeys() {
+        return mappingSystem.printKeys();
+    }
+
+    @Override
+    public String prettyPrintKeys() {
+        return mappingSystem.prettyPrintKeys();
+    }
+
     @Override
     public void close() throws Exception {
         LOG.info("Mapping Service is being destroyed!");