Add timeout to subscriber data 88/52088/11
authorLorand Jakab <lojakab@cisco.com>
Mon, 20 Feb 2017 22:10:29 +0000 (00:10 +0200)
committerLorand Jakab <lojakab@cisco.com>
Thu, 16 Mar 2017 18:05:59 +0000 (20:05 +0200)
The timeout of a subscriber is immutable too, and needs to be
transmitted in a MappingChanged notification using the YANG modeled
subscriber data.

Change-Id: Id62485c79b92ba35c6cd682c78a888ed14234059
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/dao/Subscriber.java
mappingservice/api/src/main/yang/odl-mappingservice.yang
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/MSNotificationInputUtil.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/lisp/MapResolverTest.java
mappingservice/lisp-proto/src/main/yang/odl-lisp-proto.yang

index 2e20813d97ea1985dd01b926baab39331f20246a..cfb3f4cb21dbbc785156fae14e7d576f75ca7861 100644 (file)
@@ -11,8 +11,8 @@ import java.util.Date;
 import java.util.concurrent.TimeUnit;
 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.rloc.container.Rloc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.subscriber.address.grouping.SubscriberAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.subscriber.address.grouping.SubscriberAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.subscriber.data.grouping.SubscriberData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.subscriber.data.grouping.SubscriberDataBuilder;
 
 /**
  * Request source RLOC in the mapping service with it's properties.
@@ -20,22 +20,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.su
 public class Subscriber {
     // 1 day is default Cisco IOS mapping TTL
     public static final int DEFAULT_SUBSCRIBER_TIMEOUT = (int) TimeUnit.DAYS.toMinutes(1);
-    // Subscriber timeout should be slightly higher than the mapping TTL. Arbitrary value is set to 10 minutes
+    // Subscriber TTL should be slightly higher than the mapping TTL. Arbitrary value is set to 10 minutes
     private static final int SUBSCRIBER_TIMEOUT_CONSTANT = 10;
 
-    private SubscriberAddress address;
+    private SubscriberData data;
     private Date lastRequestDate;
-    private int subscriberTimeout = DEFAULT_SUBSCRIBER_TIMEOUT;
 
     /**
      * Constructor.
      *
      * @param srcRloc A source RLOC.
      * @param srcEid  A source EID.
-     * @param subscriberTimeout Subscriber timeout in min(s).
+     * @param subscriberTtl Subscriber TTL in min(s).
      */
-    public Subscriber(Rloc srcRloc, Eid srcEid, int subscriberTimeout) {
-        this(srcRloc, srcEid, subscriberTimeout, new Date(System.currentTimeMillis()));
+    public Subscriber(Rloc srcRloc, Eid srcEid, int subscriberTtl) {
+        this(srcRloc, srcEid, subscriberTtl, new Date(System.currentTimeMillis()));
     }
 
     /**
@@ -43,26 +42,25 @@ public class Subscriber {
      *
      * @param srcRloc A source RLOC.
      * @param srcEid  A source EID.
-     * @param subscriberTimeout Subscriber timeout in min(s).
+     * @param subscriberTtl Subscriber TTL in min(s).
      * @param lastRequestDate Last request date for this subscriber.
      */
-    public Subscriber(Rloc srcRloc, Eid srcEid, int subscriberTimeout, Date lastRequestDate) {
+    public Subscriber(Rloc srcRloc, Eid srcEid, int subscriberTtl, Date lastRequestDate) {
         super();
-        this.address = new SubscriberAddressBuilder().setRloc(srcRloc).setEid(srcEid).build();
+        this.data = new SubscriberDataBuilder().setRloc(srcRloc).setEid(srcEid).setTtl(subscriberTtl).build();
         this.lastRequestDate = lastRequestDate;
-        this.subscriberTimeout = subscriberTimeout;
     }
 
-    public SubscriberAddress getSubscriberAddress() {
-        return address;
+    public SubscriberData getSubscriberData() {
+        return data;
     }
 
     public Rloc getSrcRloc() {
-        return address.getRloc();
+        return data.getRloc();
     }
 
     public Eid getSrcEid() {
-        return address.getEid();
+        return data.getEid();
     }
 
     public Date getLastRequestDate() {
@@ -73,25 +71,23 @@ public class Subscriber {
         this.lastRequestDate = lastRequestDate;
     }
 
-    public int getSubscriberTimeout() {
-        return subscriberTimeout;
-    }
-
-    public void setSubscriberTimeout(int subscriberTimeout) {
-        this.subscriberTimeout = subscriberTimeout;
+    public int getSubscriberTtl() {
+        return data.getTtl();
     }
 
     // Only used in MapResolverTest
-    public void setSubscriberTimeoutByRecordTtl(Integer recordTtl) {
-        this.subscriberTimeout = recordTtlToSubscriberTime(recordTtl);
+    public void setSubscriberTtlByRecordTtl(Integer recordTtl) {
+        SubscriberDataBuilder sdb = new SubscriberDataBuilder(this.data);
+        sdb.setTtl(recordTtlToSubscriberTime(recordTtl));
+        this.data = sdb.build();
     }
 
     /**
-     * Static method to calculate the subscriber timeout from a mapping record TTL. If a mapping record TTL is not
-     * provided, use the default 1 day TTL. The suscriber timeout is the TTL plus a constant value.
+     * Static method to calculate the subscriber TTL from a mapping record TTL. If a mapping record TTL is not
+     * provided, use the default 1 day TTL. The subscriber TTL is the TTL plus a constant value.
      *
      * @param recordTtl The time to live (TTL) value
-     * @return the subscriber timeout
+     * @return the subscriber TTL
      */
     public static int recordTtlToSubscriberTime(Integer recordTtl) {
         if (recordTtl != null) {
@@ -102,12 +98,12 @@ public class Subscriber {
 
     public boolean timedOut() {
         return TimeUnit.MILLISECONDS
-                .toMinutes(System.currentTimeMillis() - lastRequestDate.getTime()) > subscriberTimeout;
+                .toMinutes(System.currentTimeMillis() - lastRequestDate.getTime()) > data.getTtl();
     }
 
     @Override
     public int hashCode() {
-        return address.hashCode();
+        return data.hashCode();
     }
 
     @Override
@@ -122,7 +118,7 @@ public class Subscriber {
             return false;
         }
         Subscriber other = (Subscriber) obj;
-        if (!address.equals(other.address)) {
+        if (!data.equals(other.data)) {
             return false;
         }
         return true;
@@ -130,7 +126,7 @@ public class Subscriber {
 
     @Override
     public String toString() {
-        return "_rloc=" + address.getRloc().toString() + ", _eid=" + address.getEid().toString()
-                + ", last request @ " + lastRequestDate.toString();
+        return "_rloc=" + data.getRloc().toString() + ", _eid=" + data.getEid().toString()
+                + ", _ttl=" + data.getTtl().toString() + ", last request @ " + lastRequestDate.toString();
     }
 }
index 3c265eb18ceca89d0449d64617bcadfcff0ddf3e..c87bbd3031a0e267c49b1991dd7e12dab599a055 100644 (file)
@@ -296,7 +296,7 @@ module odl-mappingservice {
         uses lisp-proto:mapping-record-container;
         list subscriber-item {
             description "The list of subscribers to be notified of this change.";
-            uses lisp-proto:subscriber-address-grouping;
+            uses lisp-proto:subscriber-data-grouping;
         }
     }
 }
index 3c455839de18950cbafd6d0f4f99add18f6da1ac..2d8dd1db9ba5c53def6bbe4a8d2788db8655d5df 100644 (file)
@@ -40,8 +40,8 @@ public final class MSNotificationInputUtil {
             MappingChange change) {
         List<SubscriberItem> subscriberList = new ArrayList<SubscriberItem>();
         for (Subscriber subscriber : subscribers) {
-            subscriberList.add(new SubscriberItemBuilder().setSubscriberAddress(
-                    subscriber.getSubscriberAddress()).build());
+            subscriberList.add(new SubscriberItemBuilder().setSubscriberData(
+                    subscriber.getSubscriberData()).build());
         }
         return new MappingChangedBuilder().setMappingRecord(mapping.getRecord()).setSubscriberItem(subscriberList)
                 .setChangeType(change).build();
index 632bbc27c2528666caae9a12c777d6417df90a64..51a26f23fbeeb2110c206340807e4d4a07fba9f4 100644 (file)
@@ -308,7 +308,7 @@ public class MapResolverTest {
         Subscriber subscriberMock = new Subscriber(
                 mapRequestBuilder.getItrRloc().get(0).getRloc(),
                 mapRequestBuilder.getSourceEid().getEid(), Subscriber.DEFAULT_SUBSCRIBER_TIMEOUT);
-        subscriberMock.setSubscriberTimeoutByRecordTtl(
+        subscriberMock.setSubscriberTtlByRecordTtl(
                 mappingRecordBuilder.getRecordTtl());
         Mockito.when(subscriberSetMock.contains(subscriberMock))
                 .thenReturn(true);
@@ -320,8 +320,8 @@ public class MapResolverTest {
 
         // check if a subscriber is re-instantiating when there already is one in the subscriber set
         mapResolver.handleMapRequest(mapRequestBuilder.build());
-        Mockito.verify(subscriberSetMock).remove(SUBSCRIBER_RLOC_1);
-        Mockito.verify(subscriberSetMock).add(SUBSCRIBER_RLOC_1);
+        Mockito.verify(subscriberSetMock).remove(subscriberMock);
+        Mockito.verify(subscriberSetMock).add(subscriberMock);
         Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
         Mockito.verify(mapServiceMock).addData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1,
                 SubKeys.SUBSCRIBERS, subscriberSetMock);
index c14721a7a3c1318fe59186b1b941cd0207da7d3d..de88a6956bf4e4d272e6126a576514581c23cf2e 100644 (file)
@@ -390,12 +390,17 @@ module odl-lisp-proto {
         }
     }
 
-    grouping subscriber-address-grouping {
-        container subscriber-address {
+    grouping subscriber-data-grouping {
+        container subscriber-data {
             description
                 "A network element which subscribed to notifications about mapping changes.";
             uses rloc-container;
             uses eid-container;
+            leaf ttl {
+                type int32;
+                description
+                    "The time to live for the subscriber entry in minutes";
+            }
         }
     }