[ONOS-3659] Submit the modified content of onos-1.4 to onos-master.

Change-Id: Ibdb9897cde6bc7622276178a6087f02c49da2a48
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
index ac898d1..023bd05 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
@@ -19,6 +19,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -75,9 +76,12 @@
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.LogicalClockService;
+import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
 import org.onosproject.vtn.manager.VTNService;
 import org.onosproject.vtn.table.ArpService;
 import org.onosproject.vtn.table.ClassifierService;
@@ -188,7 +192,7 @@
     private final DeviceListener deviceListener = new InnerDeviceListener();
     private final VtnRscListener l3EventListener = new VtnL3EventListener();
 
-    private static String exPortName = "eth0";
+    private static final String EX_PORT_KEY = "exPortKey";
     private static final String IFACEID = "ifaceid";
     private static final String CONTROLLER_IP_KEY = "ipaddress";
     public static final String DRIVER_NAME = "onosfw";
@@ -198,6 +202,7 @@
     private static final String ROUTERINF_FLAG_OF_TENANT = "routerInfFlagOfTenant";
     private static final String HOSTS_OF_SUBNET = "hostsOfSubnet";
     private static final String EX_PORT_OF_DEVICE = "exPortOfDevice";
+    private static final String EX_PORT_MAP = "exPortMap";
     private static final String DEFAULT_IP = "0.0.0.0";
     private static final int SUBNET_NUM = 2;
 
@@ -207,6 +212,7 @@
     private EventuallyConsistentMap<SubnetId, Map<HostId, Host>> hostsOfSubnet;
     private EventuallyConsistentMap<TenantId, Boolean> routerInfFlagOfTenant;
     private EventuallyConsistentMap<DeviceId, Port> exPortOfDevice;
+    private static ConsistentMap<String, String> exPortMap;
 
     @Activate
     public void activate() {
@@ -275,6 +281,14 @@
                 .withTimestampProvider((k, v) -> clockService.getTimestamp())
                 .build();
 
+        exPortMap = storageService
+                .<String, String>consistentMapBuilder()
+                .withName(EX_PORT_MAP)
+                .withApplicationId(appId)
+                .withPurgeOnUninstall()
+                .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API)))
+                .build();
+
         log.info("Started");
     }
 
@@ -310,8 +324,11 @@
             config.driver(DRIVER_NAME);
             configService.applyConfig(deviceId, BasicDeviceConfig.class, config.node());
             // Add Bridge
-            VtnConfig.applyBridgeConfig(handler, dpid, exPortName);
-            log.info("A new ovs is created in node {}", localIp.toString());
+            Versioned<String> exPortVersioned = exPortMap.get(EX_PORT_KEY);
+            if (exPortVersioned != null) {
+                VtnConfig.applyBridgeConfig(handler, dpid, exPortVersioned.value());
+                log.info("A new ovs is created in node {}", localIp.toString());
+            }
             switchesOfController.put(localIp, true);
         }
         // Create tunnel in br-int on all controllers
@@ -330,8 +347,6 @@
         if (mastershipService.isLocalMaster(controllerDeviceId)) {
             switchesOfController.remove(dstIpAddress);
         }
-        // remove tunnel in br-int on other controllers
-        programTunnelConfig(controllerDeviceId, dstIpAddress, null);
     }
 
     @Override
@@ -357,6 +372,7 @@
             log.error("The ifaceId of Host is null");
             return;
         }
+        programSffAndClassifierHost(host, Objective.Operation.ADD);
         // apply L2 openflow rules
         applyHostMonitoredL2Rules(host, Objective.Operation.ADD);
         // apply L3 openflow rules
@@ -374,6 +390,7 @@
             log.error("The ifaceId of Host is null");
             return;
         }
+        programSffAndClassifierHost(host, Objective.Operation.REMOVE);
         // apply L2 openflow rules
         applyHostMonitoredL2Rules(host, Objective.Operation.REMOVE);
         // apply L3 openflow rules
@@ -463,6 +480,22 @@
         }
     }
 
+    private void programSffAndClassifierHost(Host host, Objective.Operation type) {
+        DeviceId deviceId = host.location().deviceId();
+        String ifaceId = host.annotations().value(IFACEID);
+        VirtualPortId virtualPortId = VirtualPortId.portId(ifaceId);
+        VirtualPort virtualPort = virtualPortService.getPort(virtualPortId);
+        if (virtualPort == null) {
+            virtualPort = VtnData.getPort(vPortStore, virtualPortId);
+        }
+        TenantId tenantId = virtualPort.tenantId();
+        if (Objective.Operation.ADD == type) {
+            vtnRscService.addDeviceIdOfOvsMap(virtualPortId, tenantId, deviceId);
+        } else if (Objective.Operation.REMOVE == type) {
+            vtnRscService.removeDeviceIdOfOvsMap(host, tenantId, deviceId);
+        }
+    }
+
     private void applyHostMonitoredL2Rules(Host host, Objective.Operation type) {
         DeviceId deviceId = host.location().deviceId();
         if (!mastershipService.isLocalMaster(deviceId)) {
@@ -971,7 +1004,9 @@
         Port exPort = null;
         for (Port port : ports) {
             String portName = port.annotations().value(AnnotationKeys.PORT_NAME);
-            if (portName != null && portName.equals(exPortName)) {
+            Versioned<String> exPortVersioned = exPortMap.get(EX_PORT_KEY);
+            if (portName != null && exPortVersioned != null && portName.
+                    equals(exPortVersioned.value())) {
                 exPort = port;
                 break;
             }
@@ -1071,6 +1106,6 @@
     }
 
     public static void setExPortName(String name) {
-        exPortName = name;
+        exPortMap.put(EX_PORT_KEY, name);
     }
 }