Adding Lease expiry to DHCP GUI

Change-Id: I61a8ecf376475c1ac99a59cd11a5ba1e83e6a3c9
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPService.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPService.java
index 0afda10..9c1a935 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPService.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPService.java
@@ -30,7 +30,7 @@
      *
      * @return collection of mappings.
      */
-    Map<MacAddress, Ip4Address> listMapping();
+    Map<MacAddress, IPAssignment> listMapping();
 
     /**
      * Returns the default lease time granted by the DHCP Server.
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPStore.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPStore.java
index e2cabbd..0ecd1cb 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPStore.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/DHCPStore.java
@@ -77,7 +77,7 @@
      *
      * @return the collection of the mappings
      */
-    Map<MacAddress, Ip4Address> listMapping();
+    Map<MacAddress, IPAssignment> listMapping();
 
     /**
      * Assigns the requested IP to the MAC ID (if available) for an indefinite period of time.
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPListAllMappings.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPListAllMappings.java
index b8d6287..42b0769 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPListAllMappings.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPListAllMappings.java
@@ -16,10 +16,10 @@
 package org.onosproject.dhcpserver.cli;
 
 import org.apache.karaf.shell.commands.Command;
-import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcpserver.DHCPService;
+import org.onosproject.dhcpserver.IPAssignment;
 
 import java.util.Map;
 
@@ -35,10 +35,10 @@
     protected void execute() {
 
         DHCPService dhcpService = AbstractShellCommand.get(DHCPService.class);
-        Map<MacAddress, Ip4Address> allocationMap = dhcpService.listMapping();
+        Map<MacAddress, IPAssignment> allocationMap = dhcpService.listMapping();
 
-        for (Map.Entry<MacAddress, Ip4Address> entry : allocationMap.entrySet()) {
-            print(DHCP_MAPPING_FORMAT, entry.getKey().toString(), entry.getValue().toString());
+        for (Map.Entry<MacAddress, IPAssignment> entry : allocationMap.entrySet()) {
+            print(DHCP_MAPPING_FORMAT, entry.getKey().toString(), entry.getValue().ipAddress().toString());
         }
     }
 }
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DHCPManager.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DHCPManager.java
index b97f816..a732196 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DHCPManager.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DHCPManager.java
@@ -37,6 +37,7 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.dhcpserver.DHCPService;
 import org.onosproject.dhcpserver.DHCPStore;
+import org.onosproject.dhcpserver.IPAssignment;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
@@ -212,7 +213,7 @@
     }
 
     @Override
-    public Map<MacAddress, Ip4Address> listMapping() {
+    public Map<MacAddress, IPAssignment> listMapping() {
 
         return dhcpStore.listMapping();
     }
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DhcpViewMessageHandler.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DhcpViewMessageHandler.java
index ee5a224..333f645 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DhcpViewMessageHandler.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DhcpViewMessageHandler.java
@@ -17,16 +17,17 @@
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
-import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcpserver.DHCPService;
+import org.onosproject.dhcpserver.IPAssignment;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.table.TableModel;
 import org.onosproject.ui.table.TableRequestHandler;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.Map;
 
 /**
@@ -40,9 +41,10 @@
 
     private static final String MAC = "mac";
     private static final String IP = "ip";
+    private static final String LEASE = "lease";
 
     private static final String[] COL_IDS = {
-            MAC, IP
+            MAC, IP, LEASE
     };
 
     @Override
@@ -71,16 +73,24 @@
         @Override
         protected void populateTable(TableModel tm, ObjectNode payload) {
             DHCPService dhcpService = AbstractShellCommand.get(DHCPService.class);
-            Map<MacAddress, Ip4Address> allocationMap = dhcpService.listMapping();
+            Map<MacAddress, IPAssignment> allocationMap = dhcpService.listMapping();
 
-            for (Map.Entry<MacAddress, Ip4Address> entry : allocationMap.entrySet()) {
+            for (Map.Entry<MacAddress, IPAssignment> entry : allocationMap.entrySet()) {
                 populateRow(tm.addRow(), entry);
             }
         }
 
-        private void populateRow(TableModel.Row row, Map.Entry<MacAddress, Ip4Address> entry) {
-            row.cell(MAC, entry.getKey())
-                    .cell(IP, entry.getValue());
+        private void populateRow(TableModel.Row row, Map.Entry<MacAddress, IPAssignment> entry) {
+            if (entry.getValue().leasePeriod() > 0) {
+                Date now = new Date(entry.getValue().timestamp().getTime() + entry.getValue().leasePeriod());
+                row.cell(MAC, entry.getKey())
+                        .cell(IP, entry.getValue().ipAddress())
+                        .cell(LEASE, now.toString());
+            } else {
+                row.cell(MAC, entry.getKey())
+                        .cell(IP, entry.getValue().ipAddress())
+                        .cell(LEASE, "Infinite Static Lease");
+            }
         }
     }
 }
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DistributedDHCPStore.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DistributedDHCPStore.java
index d072b58..feb07f4 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DistributedDHCPStore.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/impl/DistributedDHCPStore.java
@@ -224,17 +224,17 @@
     }
 
     @Override
-    public Map<MacAddress, Ip4Address> listMapping() {
+    public Map<MacAddress, IPAssignment> listMapping() {
 
-        Map<MacAddress, Ip4Address> allMapping = new HashMap<>();
+        Map<MacAddress, IPAssignment> allMapping = new HashMap<>();
         for (Map.Entry<MacAddress, Versioned<IPAssignment>> entry: allocationMap.entrySet()) {
             IPAssignment assignment = entry.getValue().value();
             if (assignment.assignmentStatus() == IPAssignment.AssignmentStatus.Option_Assigned) {
-                allMapping.put(entry.getKey(), assignment.ipAddress());
+                allMapping.put(entry.getKey(), assignment);
             }
         }
-
         return allMapping;
+
     }
 
     @Override
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
index deb38c9..b5cd5f8 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
@@ -21,6 +21,7 @@
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onosproject.dhcpserver.DHCPService;
+import org.onosproject.dhcpserver.IPAssignment;
 import org.onosproject.rest.AbstractWebResource;
 
 import javax.ws.rs.Consumes;
@@ -71,11 +72,11 @@
     public Response listMappings() {
         ObjectNode root = mapper().createObjectNode();
 
-        final Map<MacAddress, Ip4Address> intents = service.listMapping();
+        final Map<MacAddress, IPAssignment> intents = service.listMapping();
         ArrayNode arrayNode = root.putArray("mappings");
         intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
                 .put("mac", i.getKey().toString())
-                .put("ip", i.getValue().toString())));
+                .put("ip", i.getValue().ipAddress().toString())));
 
         return ok(root.toString()).build();
     }
@@ -123,11 +124,11 @@
                 }
             }
 
-            final Map<MacAddress, Ip4Address> intents = service.listMapping();
+            final Map<MacAddress, IPAssignment> intents = service.listMapping();
             ArrayNode arrayNode = root.putArray("mappings");
             intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
                     .put("mac", i.getKey().toString())
-                    .put("ip", i.getValue().toString())));
+                    .put("ip", i.getValue().ipAddress().toString())));
         } catch (IOException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
@@ -149,11 +150,11 @@
         if (!service.removeStaticMapping(MacAddress.valueOf(macID))) {
             throw new IllegalArgumentException("Static Mapping Removal Failed.");
         }
-        final Map<MacAddress, Ip4Address> intents = service.listMapping();
+        final Map<MacAddress, IPAssignment> intents = service.listMapping();
         ArrayNode arrayNode = root.putArray("mappings");
         intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
                 .put("mac", i.getKey().toString())
-                .put("ip", i.getValue().toString())));
+                .put("ip", i.getValue().ipAddress().toString())));
 
         return ok(root.toString()).build();
     }
diff --git a/onos-app-dhcpserver/src/main/resources/app/view/dhcp/dhcp.html b/onos-app-dhcpserver/src/main/resources/app/view/dhcp/dhcp.html
index 09f67e0..3e14570 100644
--- a/onos-app-dhcpserver/src/main/resources/app/view/dhcp/dhcp.html
+++ b/onos-app-dhcpserver/src/main/resources/app/view/dhcp/dhcp.html
@@ -19,6 +19,7 @@
         <tr>
           <td colId="mac" sortable>MAC Address</td>
           <td colId="ip" sortable>IP Address</td>
+          <td colId="lease" sortable>Lease Expiry</td>
         </tr>
       </table>
     </div>
@@ -36,6 +37,7 @@
             ng-repeat-complete row-id="{{dhcp.mac}}">
           <td>{{dhcp.mac}}</td>
           <td>{{dhcp.ip}}</td>
+          <td>{{dhcp.lease}}</td>
         </tr>
       </table>
     </div>