[CORD-1880] Improve DHCP relay CLI

Change-Id: I38b8b0fdfefa8831c70c74708549fd6805f624bc
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 d4ea1d8..acf8f79 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
@@ -17,26 +17,20 @@
 package org.onosproject.dhcprelay.cli;
 
 import org.apache.karaf.shell.commands.Command;
-import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.dhcprelay.config.DefaultDhcpRelayConfig;
-import org.onosproject.dhcprelay.DhcpRelayManager;
+import org.onosproject.dhcprelay.api.DhcpServerInfo;
 import org.onosproject.dhcprelay.api.DhcpRelayService;
-import org.onosproject.dhcprelay.config.DhcpServerConfig;
 import org.onosproject.dhcprelay.store.DhcpRecord;
-import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
-import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.host.HostService;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.function.Predicate;
 
 /**
@@ -47,46 +41,37 @@
     private static final String HEADER = "DHCP relay records ([D]: Directly connected):";
     private static final String NO_RECORDS = "No DHCP relay record found";
     private static final String HOST = "id=%s/%s, locations=%s%s, last-seen=%s, IPv4=%s, IPv6=%s";
-    private static final String DHCP_SERVER_GW = "DHCP Server: %s, %s via %s (Mac: %s)";
-    private static final String DHCP_SERVER = "DHCP Server: %s, %s (Mac: %s)";
+    private static final String DHCP_SERVER_GW = "DHCP Server: %s, %s via %s (Mac: %s, relay IP overwrite: %s)";
+    private static final String DHCP_SERVER = "DHCP Server: %s, %s (Mac: %s, relay IP overwrite: %s)";
     private static final String MISSING_SERVER_CFG = "DHCP Server info not available";
     private static final String DIRECTLY = "[D]";
     private static final String EMPTY = "";
     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 DEFAULT_SERVERS = "Default DHCP servers:";
+    private static final String INDIRECT_SERVERS = "Indirect DHCP servers:";
 
     private static final DhcpRelayService DHCP_RELAY_SERVICE = get(DhcpRelayService.class);
-    private static final NetworkConfigRegistry CFG_SERVICE = get(NetworkConfigRegistry.class);
     private static final HostService HOST_SERVICE = get(HostService.class);
-    private static final CoreService CORE_SERVICE = get(CoreService.class);
-    private static final ApplicationId APP_ID =
-            CORE_SERVICE.getAppId(DhcpRelayManager.DHCP_RELAY_APP);
-
 
     @Override
     protected void execute() {
-        // TODO: add indirect config
-        DefaultDhcpRelayConfig cfg = CFG_SERVICE.getConfig(APP_ID, DefaultDhcpRelayConfig.class);
-        if (cfg == null || cfg.dhcpServerConfigs().size() == 0) {
+        List<DhcpServerInfo> defaultDhcpServerInfoList = DHCP_RELAY_SERVICE.getDefaultDhcpServerInfoList();
+        List<DhcpServerInfo> indirectDhcpServerInfoList = DHCP_RELAY_SERVICE.getIndirectDhcpServerInfoList();
+
+        if (defaultDhcpServerInfoList.isEmpty() && indirectDhcpServerInfoList.isEmpty()) {
             print(MISSING_SERVER_CFG);
             return;
         }
 
-        // DHCP server information
-        // TODO: currently we pick up first DHCP server config.
-        // Will use other server configs in the future.
-        DhcpServerConfig serverConfig = cfg.dhcpServerConfigs().get(0);
-
-        ConnectPoint connectPoint = serverConfig.getDhcpServerConnectPoint().orElse(null);
-        Ip4Address gatewayAddress = serverConfig.getDhcpGatewayIp4().orElse(null);
-        Ip4Address serverIp = serverConfig.getDhcpServerIp4().orElse(null);
-        String serverMac = DHCP_RELAY_SERVICE.getDhcpServerMacAddress()
-                .map(MacAddress::toString).orElse(NA);
-        if (gatewayAddress != null) {
-            print(DHCP_SERVER_GW, connectPoint, serverIp, gatewayAddress, serverMac);
-        } else {
-            print(DHCP_SERVER, connectPoint, serverIp, serverMac);
+        if (!defaultDhcpServerInfoList.isEmpty()) {
+            print(DEFAULT_SERVERS);
+            listServers(defaultDhcpServerInfoList);
+        }
+        if (!indirectDhcpServerInfoList.isEmpty()) {
+            print(INDIRECT_SERVERS);
+            listServers(indirectDhcpServerInfoList);
         }
 
         // DHCP records
@@ -106,6 +91,44 @@
                                         ip6State(record)));
     }
 
+    private void listServers(List<DhcpServerInfo> dhcpServerInfoList) {
+        dhcpServerInfoList.forEach(dhcpServerInfo -> {
+            String connectPoint = dhcpServerInfo.getDhcpServerConnectPoint()
+                    .map(Object::toString).orElse(NA);
+            String serverMac = dhcpServerInfo.getDhcpConnectMac()
+                    .map(Object::toString).orElse(NA);
+            String gatewayAddress;
+            String serverIp;
+            String relayAgentIp;
+
+            switch (dhcpServerInfo.getVersion()) {
+                case DHCP_V4:
+                    gatewayAddress = dhcpServerInfo.getDhcpGatewayIp4()
+                            .map(Object::toString).orElse(null);
+                    serverIp = dhcpServerInfo.getDhcpServerIp4()
+                            .map(Object::toString).orElse(NA);
+                    relayAgentIp = dhcpServerInfo.getRelayAgentIp4()
+                            .map(Object::toString).orElse(NA);
+                    break;
+                case DHCP_V6:
+                    gatewayAddress = dhcpServerInfo.getDhcpGatewayIp6()
+                            .map(Object::toString).orElse(null);
+                    serverIp = dhcpServerInfo.getDhcpServerIp6()
+                            .map(Object::toString).orElse(NA);
+                    relayAgentIp = dhcpServerInfo.getRelayAgentIp6()
+                            .map(Object::toString).orElse(NA);
+                    break;
+                default:
+                    return;
+            }
+            if (gatewayAddress != null) {
+                print(DHCP_SERVER_GW, connectPoint, serverIp, gatewayAddress, serverMac, relayAgentIp);
+            } else {
+                print(DHCP_SERVER, connectPoint, serverIp, serverMac, relayAgentIp);
+            }
+        });
+    }
+
     private String ip4State(DhcpRecord record) {
         String nextHopIp = findNextHopIp(IpAddress::isIp4,
                                          record.nextHop().orElse(null),