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;
         }
     }