ONOS-2724
Fix bug of apply flowrule and remove flowrule

Change-Id: Ia7dec83206c3f5e24f912f111bd87dab6eab4610
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
index 8bccd5c..ab88a24 100644
--- a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
@@ -212,7 +212,7 @@
     void removeRow(String dbName, String tableName, String uuid);
 
     /**
-     * Update the local ovsdb store.
+     * Updates the local ovsdb store.
      *
      * @param dbName database name
      * @param tableName table name
@@ -221,4 +221,11 @@
      */
     void updateOvsdbStore(String dbName, String tableName, String uuid, Row row);
 
+    /**
+     * Gets ovsdb local ports.
+     *
+     * @param ifaceids the ifaceid that needed
+     * @return ovsdb ports
+     */
+    Set<OvsdbPort> getLocalPorts(Iterable<String> ifaceids);
 }
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
index a271f93..0c64cc0 100644
--- a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
@@ -46,6 +46,7 @@
 import org.onosproject.ovsdb.rfc.message.TableUpdates;
 import org.onosproject.ovsdb.rfc.notation.Condition;
 import org.onosproject.ovsdb.rfc.notation.Mutation;
+import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
 import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
 import org.onosproject.ovsdb.rfc.notation.Row;
 import org.onosproject.ovsdb.rfc.notation.UUID;
@@ -74,6 +75,7 @@
 import com.google.common.base.Function;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
@@ -1125,4 +1127,62 @@
         Iterator<Integer> it = ofPorts.iterator();
         return Long.parseLong(it.next().toString());
     }
+
+    @Override
+    public Set<OvsdbPort> getLocalPorts(Iterable<String> ifaceids) {
+        Set<OvsdbPort> ovsdbPorts = new HashSet<OvsdbPort>();
+        OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
+        if (tableStore == null) {
+            return null;
+        }
+        OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.INTERFACE);
+        if (rowStore == null) {
+            return null;
+        }
+        ConcurrentMap<String, Row> rows = rowStore.getRowStore();
+        for (String uuid : rows.keySet()) {
+            Row row = getRow(OvsdbConstant.DATABASENAME,
+                             OvsdbConstant.INTERFACE, uuid);
+            DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME);
+            Interface intf = (Interface) TableGenerator
+                    .getTable(dbSchema, row, OvsdbTable.INTERFACE);
+            if (intf == null || getIfaceid(intf) == null) {
+                continue;
+            }
+            String portName = intf.getName();
+            Set<String> ifaceidSet = Sets.newHashSet(ifaceids);
+            if (portName.startsWith("vxlan")
+                    || !ifaceidSet.contains(getIfaceid(intf))) {
+                continue;
+            }
+            long ofPort = getOfPort(intf);
+            if ((ofPort < 0) || (portName == null)) {
+                continue;
+            }
+
+            OvsdbPort ovsdbPort = new OvsdbPort(new OvsdbPortNumber(ofPort),
+                                                new OvsdbPortName(portName));
+            if (ovsdbPort != null) {
+                ovsdbPorts.add(ovsdbPort);
+            }
+        }
+        return ovsdbPorts;
+    }
+
+    private String getIfaceid(Interface intf) {
+        OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data();
+        @SuppressWarnings("unchecked")
+        Map<String, String> externalIds = ovsdbMap.map();
+        if (externalIds.isEmpty()) {
+            log.warn("The external_ids is null");
+            return null;
+        }
+        String ifaceid = externalIds
+                .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID);
+        if (ifaceid == null) {
+            log.warn("The ifaceid is null");
+            return null;
+        }
+        return ifaceid;
+    }
 }
diff --git a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
index 07100a9..9b48296 100644
--- a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
+++ b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
@@ -220,7 +220,6 @@
                 log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}",
                           uuid.value(), dbName, tableName);
 
-                Row oldRow = update.getOld(uuid);
                 Row newRow = update.getNew(uuid);
                 if (newRow != null) {
                     clientService.updateOvsdbStore(dbName, tableName,
@@ -228,18 +227,19 @@
 
                     if (OvsdbConstant.INTERFACE.equals(tableName)) {
                         dispatchInterfaceEvent(clientService,
-                                               newRow, null,
+                                               newRow,
                                                OvsdbEvent.Type.PORT_ADDED,
                                                dbSchema);
                     }
                 } else if (update.getOld(uuid) != null) {
-                    clientService.removeRow(dbName, tableName, uuid.value());
-                    if (OvsdbConstant.PORT.equals(tableName)) {
-                        dispatchInterfaceEvent(clientService, null,
-                                               oldRow,
+                    if (OvsdbConstant.INTERFACE.equals(tableName)) {
+                        Row row = clientService.getRow(OvsdbConstant.DATABASENAME, tableName, uuid.value());
+                        dispatchInterfaceEvent(clientService,
+                                               row,
                                           OvsdbEvent.Type.PORT_REMOVED,
                                           dbSchema);
                     }
+                    clientService.removeRow(dbName, tableName, uuid.value());
                 }
             }
         }
@@ -255,13 +255,13 @@
      * @param dbSchema ovsdb database schema
      */
     private void dispatchInterfaceEvent(OvsdbClientService clientService,
-                                        Row newRow, Row oldRow,
+                                        Row row,
                                         Type eventType,
                                         DatabaseSchema dbSchema) {
 
         long dpid = getDataPathid(clientService, dbSchema);
         Interface intf = (Interface) TableGenerator
-                .getTable(dbSchema, newRow, OvsdbTable.INTERFACE);
+                .getTable(dbSchema, row, OvsdbTable.INTERFACE);
         if (intf == null) {
             return;
         }