[ONOS-6551] Tunnel implementation for L3VPN service.

Change-Id: I3171a83305cb7391d80fda94ddf567629a10675e
diff --git a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
index 6fa2cfd..28a90da 100644
--- a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
+++ b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
@@ -32,6 +32,7 @@
 import org.onosproject.l3vpn.netl3vpn.NetL3VpnStore;
 import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
 import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
+import org.onosproject.l3vpn.netl3vpn.TunnelInfo;
 import org.onosproject.l3vpn.netl3vpn.VpnConfig;
 import org.onosproject.l3vpn.netl3vpn.VpnInstance;
 import org.onosproject.l3vpn.netl3vpn.VpnType;
@@ -81,6 +82,7 @@
                            .register(BgpInfo.class)
                            .register(RouteProtocol.class)
                            .register(ProtocolInfo.class)
+                           .register(TunnelInfo.class)
                            .build());
 
     private static final String FREE_ID_NULL = "Free ID cannot be null";
@@ -116,6 +118,11 @@
      */
     private ConsistentMap<BgpInfo, DeviceId> bgpInfoMap;
 
+    /**
+     * Map of device id and tunnel count.
+     */
+    private ConsistentMap<DeviceId, Integer> tunnelInfoMap;
+
     @Activate
     protected void activate() {
         vpnInsMap = storageService.<String, VpnInstance>consistentMapBuilder()
@@ -134,6 +141,11 @@
                 .withSerializer(L3VPN_SERIALIZER)
                 .build();
 
+        tunnelInfoMap = storageService.<DeviceId, Integer>consistentMapBuilder()
+                .withName("onos-l3vpn-tnl-info-map")
+                .withSerializer(L3VPN_SERIALIZER)
+                .build();
+
         freedIdList = storageService.<Long>setBuilder()
                 .withName("onos-l3vpn-id-freed-list")
                 .withSerializer(Serializer.using(KryoNamespaces.API))
@@ -175,6 +187,13 @@
     }
 
     @Override
+    public Map<DeviceId, Integer> getTunnelInfo() {
+        return tunnelInfoMap.entrySet().stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
+                        .value()));
+    }
+
+    @Override
     public void addIdToFreeList(Long id) {
         checkNotNull(id, FREE_ID_NULL);
         freedIdList.add(id);
@@ -203,12 +222,18 @@
 
     @Override
     public void addBgpInfo(BgpInfo bgpInfo, DeviceId devId) {
-        checkNotNull(devId, BGP_INFO_NULL);
+        checkNotNull(bgpInfo, BGP_INFO_NULL);
         checkNotNull(devId, DEV_ID_NULL);
         bgpInfoMap.put(bgpInfo, devId);
     }
 
     @Override
+    public void addTunnelInfo(DeviceId devId, Integer count) {
+        checkNotNull(devId, DEV_ID_NULL);
+        tunnelInfoMap.put(devId, count);
+    }
+
+    @Override
     public boolean removeInterfaceInfo(AccessInfo accessInfo) {
         checkNotNull(accessInfo, ACCESS_INFO_NULL);
 
@@ -255,4 +280,15 @@
         }
         return true;
     }
+
+    @Override
+    public boolean removeTunnelInfo(DeviceId id) {
+        checkNotNull(id, DEV_ID_NULL);
+
+        if (tunnelInfoMap.remove(id) == null) {
+            log.error("Device id deletion in tunnel info has failed.");
+            return false;
+        }
+        return true;
+    }
 }