Supports methods to get interface-related information in ovsdbclient service.

Change-Id: Ic7e45178c8adc9b207b43d893e64b1f2f47cebd4
(cherry picked from commit 1455268005049b83d7ef8f314fcacb35294f3e33)
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
index d552a70..dd0d787 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
@@ -15,11 +15,7 @@
  */
 package org.onosproject.ovsdb.controller;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
+import com.google.common.util.concurrent.ListenableFuture;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.behaviour.ControllerInfo;
@@ -34,10 +30,14 @@
 import org.onosproject.ovsdb.rfc.message.TableUpdates;
 import org.onosproject.ovsdb.rfc.notation.Row;
 import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-
-import com.google.common.util.concurrent.ListenableFuture;
+import org.onosproject.ovsdb.rfc.table.Interface;
 import org.onosproject.ovsdb.rfc.table.OvsdbTable;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
 /**
  * Represents to provider facing side of a node.
  */
@@ -267,6 +267,21 @@
     Set<OvsdbPort> getPorts();
 
     /**
+     * Gets interfaces of bridge.
+     *
+     * @return set of interfaces; empty if no interface is find
+     */
+    Set<Interface> getInterfaces();
+
+    /**
+     * Gets the interface with given portName.
+     *
+     * @param intf interface name
+     * @return interface
+     */
+    Interface getInterface(String intf);
+
+    /**
      * Checks if the node is still connected.
      *
      * @return true if the node is still connected
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
index 38f8ede..9ffa26e 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
@@ -106,7 +106,29 @@
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
-import static org.onosproject.ovsdb.controller.OvsdbConstant.*;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGE;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGES;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGE_CONTROLLER;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.CONTROLLER;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.DATABASENAME;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.EXTERNAL_ID;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.EXTERNAL_ID_INTERFACE_ID;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.INTERFACE;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.INTERFACES;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.MIRROR;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.MIRRORS;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.OFPORT;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.OFPORT_ERROR;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.PORT;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.PORTS;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.PORT_QOS;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EXTERNAL_ID_KEY;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUE;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUES;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUE_EXTERNAL_ID_KEY;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.TYPEVXLAN;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.UUID;
 
 /**
  * An representation of an ovsdb client.
@@ -1600,7 +1622,15 @@
 
     @Override
     public Set<OvsdbPort> getPorts() {
-        Set<OvsdbPort> ovsdbPorts;
+        return (Set<OvsdbPort>) getElements(this::getOvsdbPort);
+    }
+
+    @Override
+    public Set<Interface> getInterfaces() {
+        return (Set<Interface>) getElements(this::getInterface);
+    }
+
+    private Set<?> getElements(Function<Row, ?> method) {
         OvsdbTableStore tableStore = getTableStore(DATABASENAME);
         if (tableStore == null) {
             return null;
@@ -1610,16 +1640,32 @@
             return null;
         }
         ConcurrentMap<String, Row> rows = rowStore.getRowStore();
-        ovsdbPorts = rows.keySet()
+
+        return rows.keySet()
                 .stream()
                 .map(uuid -> getRow(DATABASENAME, INTERFACE, uuid))
-                .map(this::getOvsdbPort)
+                .map(method)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
-        return ovsdbPorts;
     }
 
     @Override
+    public Interface getInterface(String intf) {
+        return getInterfaces().stream()
+                .filter(ovsdbIntf -> ovsdbIntf.getName().equals(intf))
+                .findAny().orElse(null);
+    }
+
+    private Interface getInterface(Row row) {
+        DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
+        Interface intf = (Interface) TableGenerator
+                .getTable(dbSchema, row, OvsdbTable.INTERFACE);
+        if (intf == null) {
+            return null;
+        }
+        return intf;
+    }
+    @Override
     public DatabaseSchema getDatabaseSchema(String dbName) {
         return schema.get(dbName);
     }
diff --git a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
index 2d2b674..87dcc0b 100644
--- a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
+++ b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
@@ -48,6 +48,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.util.concurrent.ListenableFuture;
+import org.onosproject.ovsdb.rfc.table.Interface;
 import org.onosproject.ovsdb.rfc.table.OvsdbTable;
 
 /**
@@ -218,6 +219,16 @@
     }
 
     @Override
+    public Set<Interface> getInterfaces() {
+        return null;
+    }
+
+    @Override
+    public Interface getInterface(String intf) {
+        return null;
+    }
+
+    @Override
     public boolean isConnected() {
         return false;
     }