Merge "Add RPC to read per xtrId mappings for an EID."
authorVina Ermagan <vermagan@cisco.com>
Sat, 17 Sep 2016 00:49:31 +0000 (00:49 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 17 Sep 2016 00:49:31 +0000 (00:49 +0000)
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMapCache.java
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java
mappingservice/api/src/main/yang/odl-mappingservice.yang
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/MappingSystemTest.java
mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/FlatMapCache.java
mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/MultiTableMapCache.java

index 6ffe803f46b7704474e21c40070cf494a89b36d7..24108aa2cdad6be6c1d02f450a239aed5e233657 100644 (file)
@@ -44,6 +44,21 @@ public interface IMapCache {
      */
     Object getMapping(Eid srcKey, Eid dstKey);
 
+    /**
+     * Retrieves mapping for the provided srcKey, dstKey and a XtrId. In case the IMapCache is not a
+     * Simple Map Cache i.e. Flat Map Cache or Multi Table Map Cache, this method returns null.
+     *
+     * @param srcKey
+     *            Source Key to be looked up
+     * @param dstKey
+     *            Destination Key to be looked up
+     * @param xtrId
+     *            xtr id for which look up to be done
+     * @return Returns the object found in the cache or null if nothing is found or IMapCache is not a Simple
+     *         Map Cache.
+     */
+    Object getMapping(Eid srcKey, Eid dstKey, byte[] xtrId);
+
     /**
      * Retrieves widest negative prefix.
      *
index a94182d1acbb57a6d18a1a7363728040945b1436..c280064b0b4e7bc2c788db999bf6504d2f12260c 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.lispflowmapping.interfaces.mapcache;
 
+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.mapping.authkey.container.MappingAuthkey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
@@ -54,6 +55,19 @@ public interface IMappingSystem {
      */
     Object getMapping(Eid dst);
 
+    /**
+     * Retrieves mapping for the provided dst key for a particular xtr id.
+     * @param src
+     *            Source Key to be looked up.
+     * @param dst
+     *            Destination Key to be looked up.
+     * @param xtrId
+     *            Xtr Id for which this look to be done. If null, this method works like
+     *            regular getMapping(src, dst)
+     * @return Returns the object found in the simple map cache or null if nothing is found.
+     */
+    Object getMapping(Eid src, Eid dst, XtrId xtrId);
+
     /**
      * Retrieves mapping from table for provided key.
      *
index e483d1cd1a9e60c2b8611d6f4554393e58e41559..7367b0691c15681da18f4b2cbef845ff0eb125ef 100644 (file)
@@ -182,6 +182,18 @@ module odl-mappingservice {
         }
     }
 
+    rpc get-mapping-with-xtr-id {
+        input {
+            uses lisp-proto:eid-container;
+            leaf xtr-id {
+                type lisp-proto:xtr-id;
+            }
+        }
+        output {
+            uses lisp-proto:mapping-record-container;
+        }
+    }
+
     rpc update-mapping {
         input {
             uses lisp-proto:mapping-record-container;
index 0928f2098932930a24537cd31c923456caa89bdf..d5feb2982a6b776bda962ca777d649fdc9d17ddf 100644 (file)
@@ -44,6 +44,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;
@@ -243,6 +246,29 @@ public class MappingService implements OdlMappingserviceService, IMappingService
         return mappingSystem.getMapping(srcKey, dstKey);
     }
 
+    @Override
+    public Future<RpcResult<GetMappingWithXtrIdOutput>> 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<GetMappingWithXtrIdOutput> rpcResultBuilder;
+
+        MappingRecord reply = (MappingRecord) mappingSystem.getMapping(null, convertToBinaryIfNecessary(input.getEid()),
+                input.getXtrId());
+
+        if (reply == null) {
+            String message = "No mapping was found in the mapping database";
+            rpcResultBuilder = RpcResultBuilder.<GetMappingWithXtrIdOutput>failed()
+                    .withError(RpcError.ErrorType.APPLICATION, NOT_FOUND_TAG, message);
+        } else {
+            final MappingRecord convertedReply = convertFromBinaryIfNecessary(reply);
+            rpcResultBuilder = RpcResultBuilder.success(new GetMappingWithXtrIdOutputBuilder()
+                    .setMappingRecord(convertedReply));
+        }
+
+        return Futures.immediateFuture(rpcResultBuilder.build());
+    }
+
     @Override
     public Future<RpcResult<Void>> removeKey(RemoveKeyInput input) {
         Preconditions.checkNotNull(input, "remove-key RPC input must be not null!");
index 8bc331e5c1638de5fc04767138b3d37e4c226c48..47f7c70146f29beb080132c730e72f1ea0f4ca3f 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 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.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;
@@ -172,6 +173,17 @@ public class MappingSystem implements IMappingSystem {
         return getMapping((Eid)null, dst);
     }
 
+    @Override
+    public Object getMapping(Eid src, Eid dst, XtrId xtrId) {
+        // Note: If xtrId is null, we need to go through regular policy checking else Policy doesn't matter
+
+        if (xtrId == null) {
+            return getMapping(src, dst);
+        }
+
+        return smc.getMapping(src, dst, xtrId.getValue());
+    }
+
     @Override
     public Object getMapping(MappingOrigin origin, Eid key) {
         if (origin.equals(MappingOrigin.Southbound)) {
index d0a4081502b9cedcb375d2a65de60c66b6373f88..114bd48ed242200fc5352f6d3ed8f011f60422e8 100644 (file)
@@ -51,6 +51,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 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.HopBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
 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.eid.container.EidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
@@ -114,6 +115,8 @@ public class MappingSystemTest {
     private static final Date EXPIRED_DATE = new Date(System.currentTimeMillis() - (REGISTRATION_VALIDITY + 1L));
     private static final Object DUMMY_OBJECT = "dummy-object";
     private static final SiteId SITE_ID = new SiteId(new byte[]{0, 1, 2, 3, 4, 5, 6, 7});
+    private static final XtrId XTR_ID = new XtrId(new byte[]{0, 1, 2, 3, 4, 5, 6, 7,
+                                                                8, 9, 10, 11, 12, 13, 14, 15});
 
     @Before
     public void init() throws Exception {
@@ -378,6 +381,20 @@ public class MappingSystemTest {
         assertEquals(mappingRecord, mappingSystem.getMapping(EID_IPV4_DST));
     }
 
+    /**
+     * Tests {@link MappingSystem#getMapping(Eid src, Eid dst, XtrId xtrId)} method.
+     */
+    @Test
+    public void getMappingTest_withXtrId() {
+        final MappingRecord mappingRecord = getDefaultMappingRecordBuilder()
+                .setXtrId(XTR_ID).build();
+
+        Mockito.when(smcMock.getMapping(null, EID_IPV4_DST, XTR_ID.getValue()))
+                .thenReturn(mappingRecord);
+
+        assertEquals(mappingRecord, mappingSystem.getMapping(null, EID_IPV4_DST, XTR_ID));
+    }
+
     /**
      * Tests {@link MappingSystem#getMapping(MappingOrigin, Eid)} method.
      */
index ecadaa5345b17e3c786a3ea5f9436a397c242eef..fe9348d6eb1212d52520d93e38ce90d45e9eb51c 100644 (file)
@@ -49,6 +49,11 @@ public class FlatMapCache implements IMapCache {
         return dao.getSpecific(key, SubKeys.RECORD);
     }
 
+    @Override
+    public Object getMapping(Eid srcKey, Eid dstKey, byte[] xtrId) {
+        return null;
+    }
+
     @Override
     public Eid getWidestNegativeMapping(Eid key) {
         return null;
index 0a2df133cd50cec5beb5d54e75e5e78be5198444..e2489deccda190f70a91ce91be36df795b250fe9 100644 (file)
@@ -134,6 +134,11 @@ public class MultiTableMapCache implements IMapCache {
         return getMappingLpmSD(srcEid, dstEid, table);
     }
 
+    @Override
+    public Object getMapping(Eid srcEid, Eid dstEid, byte[] xtrId) {
+        return null;
+    }
+
     @Override
     public Eid getWidestNegativeMapping(Eid key) {
         ILispDAO table = getVniTable(key);