[CORD-2226] Dhcp6 Relay uses to store dhcp record for LeaseQuery

Change-Id: Ib3baadb38e3f5f6ebe6efc884660fe0c77cfe689
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
index bd41ecf..e872971 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
@@ -49,6 +49,8 @@
     private static final String NA = "N/A";
     private static final String STATUS_FMT = "[%s, %s]";
     private static final String STATUS_FMT_NH = "[%s via %s, %s]";
+    private static final String STATUS_FMT_V6 = "[%s, %s, %s]";
+    private static final String STATUS_FMT_V6_NH = "[%s, %s via %s, %s]";
     private static final String DEFAULT_SERVERS = "Default DHCP servers:";
     private static final String INDIRECT_SERVERS = "Indirect DHCP servers:";
 
@@ -135,13 +137,22 @@
     }
 
     private String ip6State(DhcpRecord record) {
-        String nextHopIp = findNextHopIp(IpAddress::isIp6,
+        String nextHopIp = findNextHopIp6(IpAddress::isIp6,
                                          record.nextHop().orElse(null),
                                          record.vlanId());
-        return ipState(record.ip6Address().map(Object::toString).orElse(NA),
-                       record.ip6Status().map(Object::toString).orElse(NA),
-                       record.directlyConnected(),
-                       nextHopIp);
+
+        if (record.directlyConnected()) {
+            return String.format(STATUS_FMT_V6,
+                    record.ip6Address().map(Object::toString).orElse(NA),
+                    record.pdPrefix().map(Object::toString).orElse(NA),
+                    record.ip6Status().map(Object::toString).orElse(NA));
+        } else {
+            return String.format(STATUS_FMT_V6_NH,
+                    record.ip6Address().map(Object::toString).orElse(NA),
+                    record.pdPrefix().map(Object::toString).orElse(NA),
+                    nextHopIp,
+                    record.ip6Status().map(Object::toString).orElse(NA));
+        }
     }
 
     private String ipState(String ipAddress, String status,
@@ -158,6 +169,7 @@
         if (ipFilter == null || nextHopMac == null || vlanId == null) {
             return NA;
         }
+
         Host host = HOST_SERVICE.getHost(HostId.hostId(nextHopMac, vlanId));
         if (host == null) {
             return NA;
@@ -169,4 +181,21 @@
                 .findFirst()
                 .orElse(NA);
     }
+
+    private String findNextHopIp6(Predicate<IpAddress> ipFilter, MacAddress nextHopMac, VlanId vlanId) {
+        if (ipFilter == null || nextHopMac == null || vlanId == null) {
+            return NA;
+        }
+
+        Host host = HOST_SERVICE.getHost(HostId.hostId(nextHopMac, vlanId));
+        if (host == null) {
+            return NA;
+        }
+        return host.ipAddresses().stream()
+                .filter(ipFilter)
+                .filter(ip -> ip.isLinkLocal())
+                .map(Object::toString)
+                .findFirst()
+                .orElse(NA);
+    }
 }