Bug 3112: Add SB registrations to MD-SAL datastore 57/21457/1
authorLorand Jakab <lojakab@cisco.com>
Fri, 29 May 2015 22:46:43 +0000 (01:46 +0300)
committerLorand Jakab <lojakab@cisco.com>
Fri, 29 May 2015 22:46:43 +0000 (01:46 +0300)
Change-Id: I0dc44dd96a43fe5a104908192d7c7022d8889ffd
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/LispMappingService.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mdsal/DataStoreBackEnd.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mdsal/MappingDataListener.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/InstanceIdentifierUtil.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/LispNotificationHelper.java

index 5e994fbf9676dd94fff80cabe20a7866f737708b..825f2030e4101540c6c1e0ddfa2c4e06bda77565 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.lispflowmapping.implementation;
 
+import java.util.List;
+
 import org.apache.commons.lang3.tuple.MutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.eclipse.osgi.framework.console.CommandInterpreter;
@@ -26,6 +28,7 @@ import org.opendaylight.lispflowmapping.implementation.dao.MappingServiceNoMaskK
 import org.opendaylight.lispflowmapping.implementation.lisp.MapResolver;
 import org.opendaylight.lispflowmapping.implementation.lisp.MapServer;
 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.serializer.LispMessage;
 import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor;
@@ -56,6 +59,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequestmessage.MapRequestBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.transportaddress.TransportAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.transportaddress.TransportAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.Mapping;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
@@ -86,6 +90,7 @@ public class LispMappingService implements CommandProvider, IFlowMapping, IFlowM
 
     private ProviderContext session;
 
+    private DataStoreBackEnd dsbe;
     private NotificationService notificationService;
     private static LispMappingService lfmService = null;
 
@@ -313,6 +318,7 @@ public class LispMappingService implements CommandProvider, IFlowMapping, IFlowM
     public void onSessionInitiated(ProviderContext session) {
         LOG.info("Lisp Consumer session initialized!");
         notificationService = session.getSALService(NotificationService.class);
+        dsbe = new DataStoreBackEnd(session.getSALService(DataBroker.class));
         registerNotificationListener(AddMapping.class, new MapRegisterNotificationHandler());
         registerNotificationListener(RequestMapping.class, new MapRequestNotificationHandler());
         registerDataListeners(session.getSALService(DataBroker.class));
@@ -350,6 +356,10 @@ public class LispMappingService implements CommandProvider, IFlowMapping, IFlowM
                 LOG.warn("got null map notify");
             }
 
+            List<Mapping> mappings = LispNotificationHelper.getMapping(mapRegisterNotification);
+            for (Mapping mapping : mappings) {
+                dsbe.updateMapping(mapping);
+            }
         }
     }
 
index 5e0aaad3e9ec0027cd542095f18161e00518cbf9..4f68d41297bd402cef5cc787f872658a84c9a9e4 100644 (file)
@@ -56,7 +56,7 @@ public class DataStoreBackEnd {
                 LispAFIConvertor.toString(mapping.getLispAddressContainer()), mapping.getMaskLength());
 
         InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
-                .createMappingIid(mapping.getLispAddressContainer());
+                .createMappingIid(mapping.getLispAddressContainer(), mapping.getOrigin());
         WriteTransaction transaction = broker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, path, mapping, true);
         CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
@@ -81,7 +81,7 @@ public class DataStoreBackEnd {
                 LispAFIConvertor.toString(mapping.getLispAddressContainer()), mapping.getMaskLength());
 
         InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
-                .createMappingIid(mapping.getLispAddressContainer());
+                .createMappingIid(mapping.getLispAddressContainer(), mapping.getOrigin());
         WriteTransaction transaction = broker.newWriteOnlyTransaction();
         transaction.delete(LogicalDatastoreType.CONFIGURATION, path);
         CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
@@ -106,7 +106,7 @@ public class DataStoreBackEnd {
                 LispAFIConvertor.toString(mapping.getLispAddressContainer()), mapping.getMaskLength());
 
         InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
-                .createMappingIid(mapping.getLispAddressContainer());
+                .createMappingIid(mapping.getLispAddressContainer(), mapping.getOrigin());
         WriteTransaction transaction = broker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, path, mapping, true);
         CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
index 122e05b45cf88015c468acd91a083f8fd97ad9db..51a9d9a6583131db10218287a8bf9d60187a080c 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.lispflowmapping.implementation.LispMappingService;
 import org.opendaylight.lispflowmapping.implementation.util.MapServerMapResolverUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapRegister;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.MappingDatabase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.MappingOrigin;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.Mapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.mapping.database.InstanceId;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -56,8 +57,12 @@ public class MappingDataListener extends AbstractDataListener {
                 LOG.trace("Key: {}", entry.getKey());
                 LOG.trace("Value: {}", mapping);
 
-                MapRegister register = MapServerMapResolverUtil.getMapRegister(mapping);
-                msmr.handleMapRegister(register, false);
+                if (mapping.getOrigin() != MappingOrigin.Southbound) {
+                    MapRegister register = MapServerMapResolverUtil.getMapRegister(mapping);
+                    msmr.handleMapRegister(register, false);
+                } else {
+                    LOG.trace("Mapping is coming from the southbound plugin, already handled");
+                }
             }
         }
 
@@ -71,8 +76,12 @@ public class MappingDataListener extends AbstractDataListener {
                 LOG.trace("Key: {}", entry.getKey());
                 LOG.trace("Value: {}", entry.getValue());
 
-                MapRegister register = MapServerMapResolverUtil.getMapRegister(mapping);
-                msmr.handleMapRegister(register, false);
+                if (mapping.getOrigin() != MappingOrigin.Southbound) {
+                    MapRegister register = MapServerMapResolverUtil.getMapRegister(mapping);
+                    msmr.handleMapRegister(register, false);
+                } else {
+                    LOG.trace("Mapping is coming from the southbound plugin, already handled");
+                }
             }
         }
 
index 560948404c44a0cd7ad2b6036009322bd5133531..a6419f57cd05bcc4d5f76b6ed09cfcadd4b1c744 100644 (file)
@@ -41,11 +41,11 @@ public class InstanceIdentifierUtil {
                 .child(InstanceId.class, iidKey).child(AuthenticationKey.class, authKeyKey);
     }
 
-    public static InstanceIdentifier<Mapping> createMappingIid(LispAddressContainer eid) {
+    public static InstanceIdentifier<Mapping> createMappingIid(LispAddressContainer eid, MappingOrigin orig) {
         Preconditions.checkNotNull(eid, "Mapping needs an EID entry!");
 
         InstanceIdKey iidKey = new InstanceIdKey(new IidUri(Long.toString(getLispInstanceId(eid))));
-        MappingKey eidKey = new MappingKey(new EidUri(getAddressString(eid)),MappingOrigin.Northbound);
+        MappingKey eidKey = new MappingKey(new EidUri(getAddressString(eid)), orig);
         return InstanceIdentifier.create(MappingDatabase.class)
                 .child(InstanceId.class, iidKey).child(Mapping.class, eidKey);
     }
index 367fae028c4e97a84468334f31d4e58697df69ed..9cee420e427cde791778232afc918b89780f9855 100644 (file)
@@ -10,8 +10,12 @@ package org.opendaylight.lispflowmapping.implementation.util;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.opendaylight.lispflowmapping.implementation.serializer.LispMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.AddMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.EidToLocatorRecord;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LcafApplicationDataAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispAFIAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispDistinguishedNameAddress;
@@ -27,6 +31,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequestnotification.MapRequestBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.transportaddress.TransportAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.transportaddress.TransportAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.EidUri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.MappingOrigin;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.Mapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.MappingBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
@@ -120,4 +128,23 @@ public class LispNotificationHelper {
             return null;
         }
     }
+
+    public static List<Mapping> getMapping(AddMapping mapRegisterNotification) {
+        List<Mapping> mappings = new ArrayList<Mapping>();
+        for (int i=0; i<mapRegisterNotification.getMapRegister().getEidToLocatorRecord().size(); i++) {
+            EidToLocatorRecord record = mapRegisterNotification.getMapRegister().getEidToLocatorRecord().get(i);
+            MappingBuilder mb = new MappingBuilder();
+            mb.setEid(new EidUri(LispAFIConvertor.toString(record.getLispAddressContainer())));
+            mb.setOrigin(MappingOrigin.Southbound);
+            mb.setRecordTtl(record.getRecordTtl());
+            mb.setMaskLength(record.getMaskLength());
+            mb.setMapVersion(record.getMapVersion());
+            mb.setAction(record.getAction());
+            mb.setAuthoritative(record.isAuthoritative());
+            mb.setLispAddressContainer(record.getLispAddressContainer());
+            mb.setLocatorRecord(record.getLocatorRecord());
+            mappings.add(mb.build());
+        }
+        return mappings;
+    }
 }