[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),