CORD-176, CORD-431 Switch to new VTN API

- Implemented VTN store and manager to keep network states
- Implemented the new VTN API for service network and port

Change-Id: Id8f5d0e609fa3deba782ff2265fc0d3175cbcb4c
diff --git a/src/main/java/org/opencord/cordvtn/impl/CordVtnArpProxy.java b/src/main/java/org/opencord/cordvtn/impl/CordVtnArpProxy.java
index d1dfdd2..15269dd 100644
--- a/src/main/java/org/opencord/cordvtn/impl/CordVtnArpProxy.java
+++ b/src/main/java/org/opencord/cordvtn/impl/CordVtnArpProxy.java
@@ -15,8 +15,8 @@
  */
 package org.opencord.cordvtn.impl;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -30,8 +30,10 @@
 import org.onlab.packet.MacAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.xosclient.api.VtnService;
 import org.opencord.cordvtn.api.CordVtnConfig;
 import org.opencord.cordvtn.api.Instance;
 import org.onosproject.net.Host;
@@ -43,6 +45,8 @@
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketService;
+import org.opencord.cordvtn.api.VtnNetwork;
+import org.opencord.cordvtn.impl.handler.AbstractInstanceHandler;
 import org.slf4j.Logger;
 
 import java.nio.ByteBuffer;
@@ -51,9 +55,7 @@
 import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.xosclient.api.VtnServiceApi.NetworkType.PRIVATE;
-import static org.onosproject.xosclient.api.VtnServiceApi.ServiceType.ACCESS_AGENT;
-import static org.onosproject.xosclient.api.VtnServiceApi.ServiceType.MANAGEMENT;
+import static org.opencord.cordvtn.api.ServiceNetwork.ServiceNetworkType.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -69,14 +71,21 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CordVtnNodeManager nodeManager;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry configRegistry;
+
     private final PacketProcessor packetProcessor = new InternalPacketProcessor();
     private final Map<Ip4Address, MacAddress> gateways = Maps.newConcurrentMap();
 
     private MacAddress privateGatewayMac = MacAddress.NONE;
+    private NetworkConfigListener configListener = new InternalConfigListener();
 
     @Activate
     protected void activate() {
         super.activate();
+        configRegistry.addListener(configListener);
+        readConfiguration();
+
         packetService.addProcessor(packetProcessor, PacketProcessor.director(0));
         requestPacket();
     }
@@ -84,6 +93,7 @@
     @Deactivate
     protected void deactivate() {
         packetService.removeProcessor(packetProcessor);
+        configRegistry.removeListener(configListener);
         super.deactivate();
     }
 
@@ -158,7 +168,6 @@
             return;
         }
 
-        log.trace("Send ARP reply for {} with {}", targetIp, replyMac);
         Ethernet ethReply = ARP.buildArpReply(
                 targetIp,
                 replyMac,
@@ -213,7 +222,7 @@
                 .findFirst().orElse(null);
 
         if (host == null ||
-                !Instance.of(host).serviceType().equals(MANAGEMENT) ||
+                !Instance.of(host).netType().name().contains("MANAGEMENT") ||
                 hostMgmtPort == null) {
             context.block();
             return;
@@ -341,20 +350,17 @@
     public void instanceDetected(Instance instance) {
         // TODO remove this when XOS provides access agent information
         // and handle it the same way wit the other instances
-        if (instance.serviceType() == ACCESS_AGENT) {
+        if (instance.netType() == ACCESS_AGENT) {
             return;
         }
 
-        VtnService service = getVtnService(instance.serviceId());
-        if (service == null) {
-            return;
-        }
-
-        if (service.networkType().equals(PRIVATE)) {
-            log.trace("Added IP:{} MAC:{}", service.serviceIp(), privateGatewayMac);
-            addGateway(service.serviceIp(), privateGatewayMac);
+        VtnNetwork vtnNet = getVtnNetwork(instance);
+        if (vtnNet.type() != PUBLIC && vtnNet.type() != MANAGEMENT_HOST &&
+                vtnNet.type() != MANAGEMENT_LOCAL) {
+            log.trace("Added IP:{} MAC:{}", vtnNet.serviceIp(), privateGatewayMac);
+            addGateway(vtnNet.serviceIp(), privateGatewayMac);
             // send gratuitous ARP for the existing VMs when ONOS is restarted
-            sendGratuitousArp(service.serviceIp(), Sets.newHashSet(instance));
+            sendGratuitousArp(vtnNet.serviceIp(), ImmutableSet.of(instance));
         }
     }
 
@@ -362,24 +368,19 @@
     public void instanceRemoved(Instance instance) {
         // TODO remove this when XOS provides access agent information
         // and handle it the same way wit the other instances
-        if (instance.serviceType() == ACCESS_AGENT) {
+        if (instance.netType() == ACCESS_AGENT) {
             return;
         }
 
-        VtnService service = getVtnService(instance.serviceId());
-        if (service == null) {
-            return;
-        }
-
+        VtnNetwork vtnNet = getVtnNetwork(instance);
         // remove this network gateway from proxy ARP if no instance presents
-        if (service.networkType().equals(PRIVATE) &&
-                getInstances(service.id()).isEmpty()) {
-            removeGateway(service.serviceIp());
+        if (vtnNet.type() == PRIVATE &&
+                getInstances(vtnNet.id()).isEmpty()) {
+            removeGateway(vtnNet.serviceIp());
         }
     }
 
-    @Override
-    protected void readConfiguration() {
+    private void readConfiguration() {
         CordVtnConfig config = configRegistry.getConfig(appId, CordVtnConfig.class);
         if (config == null) {
             log.debug("No configuration found");
@@ -395,7 +396,24 @@
                       entry.getKey(), entry.getValue());
         });
         // TODO send gratuitous arp in case the MAC is changed
+    }
 
-        super.readConfiguration();
+    private class InternalConfigListener implements NetworkConfigListener {
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+            if (!event.configClass().equals(CordVtnConfig.class)) {
+                return;
+            }
+
+            switch (event.type()) {
+                case CONFIG_ADDED:
+                case CONFIG_UPDATED:
+                    readConfiguration();
+                    break;
+                default:
+                    break;
+            }
+        }
     }
 }