CORD-628 Refactored VTN service network and port API

- Removed direct use of Neutron data model and Neutron API
- Extended service network and service port API to have all network
  information required for VTN
- Removed unnecessary dependency manager and store
- Removed network state sync method with Neutron and XOS
- Removed Neutron and XOS access information from the network config
- Re-organized API packages

Change-Id: I18f49ec733309315f683dfb2e6be6526056118f1
diff --git a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
index 4d68b8d..2011342 100644
--- a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
+++ b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
@@ -45,14 +45,14 @@
 import org.onosproject.net.provider.ProviderId;
 import org.opencord.cordconfig.CordConfigService;
 import org.opencord.cordconfig.access.AccessAgentData;
-import org.opencord.cordvtn.api.core.CordVtnService;
-import org.opencord.cordvtn.api.instance.Instance;
-import org.opencord.cordvtn.api.instance.InstanceService;
+import org.opencord.cordvtn.api.core.Instance;
+import org.opencord.cordvtn.api.core.InstanceService;
+import org.opencord.cordvtn.api.core.ServiceNetworkEvent;
+import org.opencord.cordvtn.api.core.ServiceNetworkListener;
+import org.opencord.cordvtn.api.core.ServiceNetworkService;
 import org.opencord.cordvtn.api.net.PortId;
-import org.opencord.cordvtn.api.net.VtnNetwork;
-import org.opencord.cordvtn.api.net.VtnNetworkEvent;
-import org.opencord.cordvtn.api.net.VtnNetworkListener;
-import org.opencord.cordvtn.api.net.VtnPort;
+import org.opencord.cordvtn.api.net.ServiceNetwork;
+import org.opencord.cordvtn.api.net.ServicePort;
 import org.slf4j.Logger;
 
 import java.util.Objects;
@@ -64,7 +64,7 @@
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.opencord.cordvtn.api.Constants.CORDVTN_APP_ID;
 import static org.opencord.cordvtn.api.Constants.NOT_APPLICABLE;
-import static org.opencord.cordvtn.api.net.ServiceNetwork.ServiceNetworkType.ACCESS_AGENT;
+import static org.opencord.cordvtn.api.net.ServiceNetwork.NetworkType.ACCESS_AGENT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -76,8 +76,8 @@
         InstanceService {
 
     protected final Logger log = getLogger(getClass());
-    private static final String ERR_VTN_NETWORK = "Faild to get VTN network for %s";
-    private static final String ERR_VTN_PORT = "Faild to get VTN port for %s";
+    private static final String ERR_SERVICE_NETWORK = "Failed to get service network for %s";
+    private static final String ERR_SERVICE_PORT = "Failed to get service port for %s";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
@@ -102,11 +102,11 @@
     protected CordConfigService cordConfig;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CordVtnService vtnService;
+    protected ServiceNetworkService snetService;
 
     private final ExecutorService eventExecutor =
             newSingleThreadExecutor(groupedThreads(this.getClass().getSimpleName(), "event-handler"));
-    private final VtnNetworkListener vtnNetListener = new InternalVtnNetworkListener();
+    private final ServiceNetworkListener snetListener = new InternalServiceNetworkListener();
 
     private ApplicationId appId;
     private NodeId localNodeId;
@@ -126,14 +126,14 @@
         leadershipService.runForLeadership(appId.name());
 
         hostProvider = hostProviderRegistry.register(this);
-        vtnService.addListener(vtnNetListener);
+        snetService.addListener(snetListener);
 
         log.info("Started");
     }
 
     @Deactivate
     protected void deactivate() {
-        vtnService.removeListener(vtnNetListener);
+        snetService.removeListener(snetListener);
         hostProviderRegistry.unregister(this);
         eventExecutor.shutdown();
         leadershipService.withdraw(appId.name());
@@ -164,34 +164,35 @@
             return;
         }
 
-        VtnPort vtnPort = vtnService.vtnPort(port.annotations().value(PORT_NAME));
-        if (vtnPort == null) {
-            log.warn(String.format(ERR_VTN_PORT, port));
+        ServicePort sport = getServicePortByPortName(port.annotations().value(PORT_NAME));
+        if (sport == null) {
+            log.warn(String.format(ERR_SERVICE_PORT, port));
             return;
         }
 
-        VtnNetwork vtnNet = vtnService.vtnNetwork(vtnPort.netId());
-        if (vtnNet == null) {
-            log.warn(String.format(ERR_VTN_NETWORK, vtnPort));
-            return;
+        ServiceNetwork snet = snetService.serviceNetwork(sport.networkId());
+        if (snet == null) {
+            final String error = String.format(ERR_SERVICE_NETWORK, sport);
+            throw new IllegalStateException(error);
         }
 
         // Added CREATE_TIME intentionally to trigger HOST_UPDATED event for the
-        // existing instances.
+        // existing instances. Fix this after adding a method to update/reinstall
+        // flow rules for the existing service instances.
         DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
-                .set(Instance.NETWORK_TYPE, vtnNet.type().name())
-                .set(Instance.NETWORK_ID, vtnNet.id().id())
-                .set(Instance.PORT_ID, vtnPort.id().id())
+                .set(Instance.NETWORK_TYPE, snet.type().name())
+                .set(Instance.NETWORK_ID, snet.id().id())
+                .set(Instance.PORT_ID, sport.id().id())
                 .set(Instance.CREATE_TIME, String.valueOf(System.currentTimeMillis()));
 
         HostDescription hostDesc = new DefaultHostDescription(
-                vtnPort.mac(),
+                sport.mac(),
                 VlanId.NONE,
                 new HostLocation(connectPoint, System.currentTimeMillis()),
-                Sets.newHashSet(vtnPort.ip()),
+                Sets.newHashSet(sport.ip()),
                 annotations.build());
 
-        HostId hostId = HostId.hostId(vtnPort.mac());
+        HostId hostId = HostId.hostId(sport.mac());
         hostProvider.hostDetected(hostId, hostDesc, false);
     }
 
@@ -225,6 +226,14 @@
         hostProvider.hostVanished(hostId);
     }
 
+    private ServicePort getServicePortByPortName(String portName) {
+        Optional<ServicePort> sport = snetService.servicePorts()
+                .stream()
+                .filter(p -> p.id().id().contains(portName.substring(3)))
+                .findFirst();
+        return sport.isPresent() ? sport.get() : null;
+    }
+
     // TODO remove this when XOS provides access agent information
     private boolean isAccessAgent(ConnectPoint connectPoint) {
         Optional<AccessAgentData> agent = cordConfig.getAccessAgent(connectPoint.deviceId());
@@ -255,22 +264,23 @@
     }
 
     private Instance getInstance(PortId portId) {
-        VtnPort vtnPort = vtnService.vtnPort(portId);
-        if (vtnPort == null) {
-            final String error = "Failed to build VTN port for " + portId.id();
+        // TODO use instance service instead
+        ServicePort sport = snetService.servicePort(portId);
+        if (sport == null) {
+            final String error = String.format(ERR_SERVICE_PORT, portId);
             throw new IllegalStateException(error);
         }
-        Host host = hostService.getHost(HostId.hostId(vtnPort.mac()));
+        Host host = hostService.getHost(HostId.hostId(sport.mac()));
         if (host == null) {
             return null;
         }
         return Instance.of(host);
     }
 
-    private class InternalVtnNetworkListener implements VtnNetworkListener {
+    private class InternalServiceNetworkListener implements ServiceNetworkListener {
 
         @Override
-        public void event(VtnNetworkEvent event) {
+        public void event(ServiceNetworkEvent event) {
             NodeId leader = leadershipService.getLeader(appId.name());
             if (!Objects.equals(localNodeId, leader)) {
                 // do not allow to proceed without leadership
@@ -278,10 +288,10 @@
             }
 
             switch (event.type()) {
-                case VTN_PORT_CREATED:
-                case VTN_PORT_UPDATED:
-                    log.debug("Processing service port {}", event.vtnPort());
-                    PortId portId = event.vtnPort().id();
+                case SERVICE_PORT_CREATED:
+                case SERVICE_PORT_UPDATED:
+                    log.debug("Processing service port {}", event.servicePort());
+                    PortId portId = event.servicePort().id();
                     eventExecutor.execute(() -> {
                         Instance instance = getInstance(portId);
                         if (instance != null) {
@@ -289,10 +299,10 @@
                         }
                     });
                     break;
-                case VTN_PORT_REMOVED:
-                case VTN_NETWORK_CREATED:
-                case VTN_NETWORK_UPDATED:
-                case VTN_NETWORK_REMOVED:
+                case SERVICE_PORT_REMOVED:
+                case SERVICE_NETWORK_CREATED:
+                case SERVICE_NETWORK_UPDATED:
+                case SERVICE_NETWORK_REMOVED:
                 default:
                     // do nothing for the other events
                     break;