Cherry pick gNMI and Stratum related changes to this branch
Cherry picked commits:
20211 Update gNMI version and build script
20247 [ONOS-7829] Implement AbstractGrpcClient and AbstractGrpcClientControl
20233 [ONOS-7141][ONOS-7142] Add GnmiClient and GnmiController
20234 Refactor OpenConfig gNMI device description descovery
20260 [ONOS-7831] Implement GnmiHandshaker
20270 Add Stratum driver
Change-Id: I81ad8bce45251af5909cfcac0edbcfd11c8ebf1d
diff --git a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/AbstractGnmiHandlerBehaviour.java b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/AbstractGnmiHandlerBehaviour.java
index e6d8b16..3bfca46 100644
--- a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/AbstractGnmiHandlerBehaviour.java
+++ b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/AbstractGnmiHandlerBehaviour.java
@@ -41,9 +41,8 @@
private static final String DEVICE_REQ_TIMEOUT = "deviceRequestTimeout";
private static final int DEFAULT_DEVICE_REQ_TIMEOUT = 60;
- public static final String GNMI_SERVER_ADDR_KEY = "gnmi_ip";
- public static final String GNMI_SERVER_PORT_KEY = "gnmi_port";
- private static final String GNMI_SERVICE_NAME = "gnmi";
+ private static final String GNMI_SERVER_ADDR_KEY = "gnmi_ip";
+ private static final String GNMI_SERVER_PORT_KEY = "gnmi_port";
protected final Logger log = LoggerFactory.getLogger(getClass());
protected DeviceId deviceId;
@@ -66,7 +65,7 @@
return true;
}
- protected GnmiClient createClient() {
+ GnmiClient createClient() {
deviceId = handler().data().deviceId();
controller = handler().get(GnmiController.class);
@@ -74,7 +73,7 @@
final String serverPortString = this.data().value(GNMI_SERVER_PORT_KEY);
if (serverAddr == null || serverPortString == null) {
- log.warn("Unable to create client for {}, missing driver data key (required is {}, {}, and {})",
+ log.warn("Unable to create client for {}, missing driver data key (required is {} and {})",
deviceId, GNMI_SERVER_ADDR_KEY, GNMI_SERVER_PORT_KEY);
return null;
}
@@ -83,11 +82,10 @@
try {
serverPort = Integer.parseUnsignedInt(serverPortString);
} catch (NumberFormatException e) {
- log.error("{} is not a valid gNMI port number", serverPortString);
+ log.error("{} is not a valid port number", serverPortString);
return null;
}
- GnmiClientKey clientKey =
- new GnmiClientKey(GNMI_SERVICE_NAME, deviceId, serverAddr, serverPort);
+ GnmiClientKey clientKey = new GnmiClientKey(deviceId, serverAddr, serverPort);
if (!controller.createClient(clientKey)) {
log.warn("Unable to create client for {}, aborting operation", deviceId);
return null;
diff --git a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiHandshaker.java b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiHandshaker.java
index d1ee1b8..c443460 100644
--- a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiHandshaker.java
+++ b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiHandshaker.java
@@ -77,7 +77,9 @@
return false;
}
- return getFutureWithDeadline(client.isServiceAvailable(), "getting availability", false);
+ return getFutureWithDeadline(
+ client.isServiceAvailable(),
+ "checking if gNMI service is available", false);
}
@Override
diff --git a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/OpenConfigGnmiDeviceDescriptionDiscovery.java b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/OpenConfigGnmiDeviceDescriptionDiscovery.java
index f9d2236..526c333 100644
--- a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/OpenConfigGnmiDeviceDescriptionDiscovery.java
+++ b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/OpenConfigGnmiDeviceDescriptionDiscovery.java
@@ -30,13 +30,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
import static gnmi.Gnmi.Path;
import static gnmi.Gnmi.PathElem;
@@ -50,8 +46,6 @@
extends AbstractGnmiHandlerBehaviour
implements DeviceDescriptionDiscovery {
- private static final int REQUEST_TIMEOUT_SECONDS = 5;
-
private static final Logger log = LoggerFactory
.getLogger(OpenConfigGnmiDeviceDescriptionDiscovery.class);
@@ -67,18 +61,12 @@
}
log.debug("Discovering port details on device {}", handler().data().deviceId());
- GetResponse response;
- try {
- response = client.get(buildPortStateRequest())
- .get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
- } catch (InterruptedException | ExecutionException | TimeoutException e) {
- log.warn("Unable to discover ports from {}: {}", deviceId, e.getMessage());
- log.debug("{}", e);
- return Collections.emptyList();
- }
+ final GetResponse response = getFutureWithDeadline(
+ client.get(buildPortStateRequest()),
+ "getting port details", GetResponse.getDefaultInstance());
- Map<String, DefaultPortDescription.Builder> ports = Maps.newHashMap();
- Map<String, DefaultAnnotations.Builder> annotations = Maps.newHashMap();
+ final Map<String, DefaultPortDescription.Builder> ports = Maps.newHashMap();
+ final Map<String, DefaultAnnotations.Builder> annotations = Maps.newHashMap();
// Creates port descriptions with port name and port number
response.getNotificationList()
@@ -86,19 +74,18 @@
.flatMap(notification -> notification.getUpdateList().stream())
.forEach(update -> {
// /interfaces/interface[name=ifName]/state/...
- String ifName = update.getPath().getElem(1).getKeyMap().get("name");
+ final String ifName = update.getPath().getElem(1)
+ .getKeyMap().get("name");
if (!ports.containsKey(ifName)) {
ports.put(ifName, DefaultPortDescription.builder());
annotations.put(ifName, DefaultAnnotations.builder());
}
-
-
- DefaultPortDescription.Builder builder = ports.get(ifName);
- DefaultAnnotations.Builder annotationsBuilder = annotations.get(ifName);
+ final DefaultPortDescription.Builder builder = ports.get(ifName);
+ final DefaultAnnotations.Builder annotationsBuilder = annotations.get(ifName);
parseInterfaceInfo(update, ifName, builder, annotationsBuilder);
});
- List<PortDescription> portDescriptionList = Lists.newArrayList();
+ final List<PortDescription> portDescriptionList = Lists.newArrayList();
ports.forEach((key, value) -> {
DefaultAnnotations annotation = annotations.get(key).build();
portDescriptionList.add(value.annotations(annotation).build());
@@ -122,7 +109,7 @@
/**
* Parses the interface information.
*
- * @param update the update received
+ * @param update the update received
*/
private void parseInterfaceInfo(Update update,
String ifName,
@@ -130,45 +117,32 @@
DefaultAnnotations.Builder annotationsBuilder) {
- Path path = update.getPath();
- List<PathElem> elems = path.getElemList();
- Gnmi.TypedValue val = update.getVal();
+ final Path path = update.getPath();
+ final List<PathElem> elems = path.getElemList();
+ final Gnmi.TypedValue val = update.getVal();
if (elems.size() == 4) {
// /interfaces/interface/state/ifindex
// /interfaces/interface/state/oper-status
- String pathElemName = elems.get(3).getName();
+ final String pathElemName = elems.get(3).getName();
switch (pathElemName) {
case "ifindex": // port number
builder.withPortNumber(PortNumber.portNumber(val.getUintVal(), ifName));
- break;
+ return;
case "oper-status":
builder.isEnabled(parseOperStatus(val.getStringVal()));
- break;
+ return;
default:
- String valueString = val.toByteString().toString(Charset.defaultCharset()).trim();
- if (!valueString.isEmpty()) {
- annotationsBuilder.set(pathElemName, valueString);
- }
- log.debug("Unknown path: {}", path);
break;
}
- }
- if (elems.size() == 5) {
+ } else if (elems.size() == 5) {
// /interfaces/interface/ethernet/config/port-speed
- String pathElemName = elems.get(4).getName();
- switch (pathElemName) {
- case "port-speed":
- builder.portSpeed(parsePortSpeed(val.getStringVal()));
- break;
- default:
- String valueString = val.toByteString().toString(Charset.defaultCharset()).trim();
- if (!valueString.isEmpty()) {
- annotationsBuilder.set(pathElemName, valueString);
- }
- log.debug("Unknown path: {}", path);
- break;
+ final String pathElemName = elems.get(4).getName();
+ if (pathElemName.equals("port-speed")) {
+ builder.portSpeed(parsePortSpeed(val.getStringVal()));
+ return;
}
}
+ log.debug("Unknown path when parsing interface info: {}", path);
}
private boolean parseOperStatus(String operStatus) {
@@ -201,6 +175,7 @@
case "SPEED_100GB":
return 100000;
default:
+ log.warn("Unrecognized port speed string '{}'", speed);
return 1000;
}
}