Separated OpenstackInterface feature from OpenstackNetworking application.

Change-Id: I4766de7e93c5b432c50a2167b9a9d9d4605b1ad2
diff --git a/apps/openstacknetworking/openstackswitching/pom.xml b/apps/openstacknetworking/openstackswitching/pom.xml
index 932da8f..3910025 100644
--- a/apps/openstacknetworking/openstackswitching/pom.xml
+++ b/apps/openstacknetworking/openstackswitching/pom.xml
@@ -37,6 +37,11 @@
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstackinterface-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-app-dhcp</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
index 415b6d2..e417d9a 100644
--- a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
@@ -27,8 +27,8 @@
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstacknetworking.OpenstackNetworkingService;
-import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstackinterface.OpenstackInterfaceService;
+import org.onosproject.openstackinterface.OpenstackPort;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,7 +46,7 @@
             .getLogger(OpenstackArpHandler.class);
     private static final MacAddress GATEWAY_MAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
     private PacketService packetService;
-    private OpenstackNetworkingService openstackService;
+    private OpenstackInterfaceService openstackService;
     private HostService hostService;
 
     /**
@@ -56,7 +56,7 @@
      * @param packetService PacketService reference
      * @param hostService host service
      */
-    public OpenstackArpHandler(OpenstackNetworkingService openstackService, PacketService packetService,
+    public OpenstackArpHandler(OpenstackInterfaceService openstackService, PacketService packetService,
                                HostService hostService) {
         this.openstackService = openstackService;
         this.packetService = packetService;
diff --git a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
index 52b0436..4e66d95 100644
--- a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
@@ -16,7 +16,6 @@
 package org.onosproject.openstacknetworking.switching;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.felix.scr.annotations.Activate;
@@ -35,10 +34,6 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.Port;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -51,24 +46,21 @@
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstacknetworking.OpenstackNetwork;
-import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
-import org.onosproject.openstacknetworking.OpenstackNetworkingService;
-import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstackinterface.OpenstackInterfaceService;
+import org.onosproject.openstackinterface.OpenstackNetwork;
+import org.onosproject.openstackinterface.OpenstackPort;
+import org.onosproject.openstackinterface.OpenstackSecurityGroup;
+import org.onosproject.openstackinterface.OpenstackSubnet;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
-import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
-import org.onosproject.openstacknetworking.OpenstackSubnet;
 import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.util.List;
 import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.onlab.util.Tools.groupedThreads;
 
 @Service
@@ -100,13 +92,9 @@
     protected DhcpService dhcpService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected NetworkConfigRegistry cfgService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected OpenstackNetworkingService openstackService;
+    protected OpenstackInterfaceService openstackService;
 
     public static final String PORTNAME_PREFIX_VM = "tap";
     public static final String PORTNAME_PREFIX_ROUTER = "qr-";
@@ -116,37 +104,15 @@
     public static final String DEVICE_OWNER_GATEWAY = "network:router_gateway";
 
     private ApplicationId appId;
-    private boolean doNotPushFlows;
-    private Ip4Address neutronServer;
-    private Ip4Address keystoneServer;
-    private String userName;
-    private String password;
-    private String physicalRouterMac;
-    private OpenstackArpHandler arpHandler;
+    private OpenstackArpHandler arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
 
     private ExecutorService deviceEventExcutorService =
             Executors.newSingleThreadExecutor(groupedThreads("onos/openstackswitching", "device-event"));
-    private ExecutorService networkEventExcutorService =
-            Executors.newSingleThreadExecutor(groupedThreads("onos/openstackswitching", "config-event"));
 
     private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
     private InternalDeviceListener internalDeviceListener = new InternalDeviceListener();
-    private InternalConfigListener internalConfigListener = new InternalConfigListener();
     private InternalHostListener internalHostListener = new InternalHostListener();
 
-
-    private final Set<ConfigFactory> factories = ImmutableSet.of(
-            new ConfigFactory<ApplicationId, OpenstackNetworkingConfig>(APP_SUBJECT_FACTORY,
-                    OpenstackNetworkingConfig.class,
-                    "openstackswitching") {
-                @Override
-                public OpenstackNetworkingConfig createConfig() {
-                    return new OpenstackNetworkingConfig();
-                }
-            }
-    );
-
-
     private Map<String, OpenstackPortInfo> openstackPortInfoMap = Maps.newHashMap();
 
     @Activate
@@ -154,13 +120,11 @@
         appId = coreService
                 .registerApplication("org.onosproject.openstackswitching");
 
-        factories.forEach(cfgService::registerConfigFactory);
         packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
         deviceService.addListener(internalDeviceListener);
         hostService.addListener(internalHostListener);
-        cfgService.addListener(internalConfigListener);
 
-        internalConfigListener.configureNetwork();
+        initializeFlowRules();
 
         log.info("Started");
     }
@@ -169,8 +133,6 @@
     protected void deactivate() {
         packetService.removeProcessor(internalPacketProcessor);
         deviceService.removeListener(internalDeviceListener);
-        cfgService.removeListener(internalConfigListener);
-        factories.forEach(cfgService::unregisterConfigFactory);
 
         deviceEventExcutorService.shutdown();
 
@@ -206,20 +168,18 @@
         OpenstackPortInfo routerPortInfo = openstackPortInfoMap.get(routerPortName);
         if (routerPortInfo != null) {
             dhcpService.removeStaticMapping(routerPortInfo.mac());
-            if (!doNotPushFlows) {
-                deviceService.getPorts(routerPortInfo.deviceId()).forEach(port -> {
-                    String pName = port.annotations().value("portName");
-                    if (pName.equals(routerPortName)) {
-                        OpenstackSwitchingRulePopulator rulePopulator =
-                                new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
-                                        deviceService, openstackService, driverService);
+            deviceService.getPorts(routerPortInfo.deviceId()).forEach(port -> {
+                String pName = port.annotations().value("portName");
+                if (pName.equals(routerPortName)) {
+                    OpenstackSwitchingRulePopulator rulePopulator =
+                            new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
+                                    deviceService, openstackService, driverService);
 
-                        rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
-                        openstackPortInfoMap.remove(routerPortName);
-                        return;
-                    }
-                });
-            }
+                    rulePopulator.removeSwitchingRules(port, openstackPortInfoMap);
+                    openstackPortInfoMap.remove(routerPortName);
+                    return;
+                }
+            });
         }
     }
 
@@ -245,13 +205,13 @@
     }
 
     private void processPortUpdated(Device device, Port port) {
-        if (!port.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL) && !doNotPushFlows) {
+        if (!port.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL)) {
             if (port.isEnabled() || port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER)) {
                 OpenstackSwitchingRulePopulator rulePopulator =
                         new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
                                 deviceService, openstackService, driverService);
 
-                rulePopulator.populateSwitchingRules(doNotPushFlows, device, port);
+                rulePopulator.populateSwitchingRules(device, port);
                 updatePortMap(device.id(), port, openstackService.networks(), openstackService.subnets(),
                         rulePopulator.openstackPort(port));
 
@@ -262,7 +222,7 @@
                         new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
                                 deviceService, openstackService, driverService);
 
-                rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
+                rulePopulator.removeSwitchingRules(port, openstackPortInfoMap);
                 dhcpService.removeStaticMapping(openstackPortInfoMap.get(port.annotations().value(PORTNAME)).mac());
                 openstackPortInfoMap.remove(port.annotations().value(PORTNAME));
             }
@@ -290,10 +250,8 @@
                             .forEach(vmPort -> {
                                         OpenstackPort osPort = rulePopulator.openstackPort(vmPort);
                                         if (osPort != null && !osPort.deviceOwner().equals(DEVICE_OWNER_GATEWAY)) {
-                                            if (!doNotPushFlows) {
-                                                rulePopulator.populateSwitchingRules(doNotPushFlows, device, vmPort);
-                                                updatePortMap(device.id(), vmPort, networks, subnets, osPort);
-                                            }
+                                            rulePopulator.populateSwitchingRules(device, vmPort);
+                                            updatePortMap(device.id(), vmPort, networks, subnets, osPort);
                                             registerDhcpInfo(osPort);
                                         } else {
                                             log.warn("No openstackPort information for port {}", vmPort);
@@ -458,34 +416,4 @@
             }
         }
     }
-
-    private class InternalConfigListener implements NetworkConfigListener {
-
-        public void configureNetwork() {
-            OpenstackNetworkingConfig cfg =
-                    cfgService.getConfig(appId, OpenstackNetworkingConfig.class);
-            if (cfg == null) {
-                log.error("There is no openstack server information in config.");
-                return;
-            }
-
-            doNotPushFlows = cfg.doNotPushFlows();
-            physicalRouterMac = cfg.physicalRouterMac();
-            openstackService.setConfigurations(cfg.neutronServer(), cfg.keystoneServer(),
-                    cfg.userName(), cfg.password());
-            arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
-            initializeFlowRules();
-        }
-
-        @Override
-        public void event(NetworkConfigEvent event) {
-            if (((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
-            event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) &&
-                    event.configClass().equals(OpenstackNetworkingConfig.class)) {
-
-                log.info("Network configuration changed");
-                networkEventExcutorService.execute(this::configureNetwork);
-            }
-        }
-    }
 }
diff --git a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
index 258b24c..d7223da 100644
--- a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
@@ -40,9 +40,9 @@
 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.openstacknetworking.OpenstackNetwork;
-import org.onosproject.openstacknetworking.OpenstackNetworkingService;
-import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstackinterface.OpenstackInterfaceService;
+import org.onosproject.openstackinterface.OpenstackNetwork;
+import org.onosproject.openstackinterface.OpenstackPort;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -80,7 +80,7 @@
     public OpenstackSwitchingRulePopulator(ApplicationId appId,
                                            FlowObjectiveService flowObjectiveService,
                                            DeviceService deviceService,
-                                           OpenstackNetworkingService openstackService,
+                                           OpenstackInterfaceService openstackService,
                                            DriverService driverService) {
         this.flowObjectiveService = flowObjectiveService;
         this.deviceService = deviceService;
@@ -95,14 +95,10 @@
     /**
      * Populates flow rules for the VM created.
      *
-     * @param doNotPushFlow true to suppress push of initial flows
      * @param device device to populate rules to
      * @param port port for the VM created
      */
-    public void populateSwitchingRules(boolean doNotPushFlow, Device device, Port port) {
-        if (doNotPushFlow) {
-            return;
-        }
+    public void populateSwitchingRules(Device device, Port port) {
         populateFlowRulesForTunnelTag(device, port);
         populateFlowRulesForTrafficToSameCnode(device, port);
         populateFlowRulesForTrafficToDifferentCnode(device, port);
@@ -271,15 +267,11 @@
     /**
      * Remove flows rules for the removed VM.
      *
-     * @param doNotPushFlows true to suppress push of initial flows
      * @param removedPort removedport info
      * @param openstackPortInfoMap openstackPortInfoMap
      */
-    public void removeSwitchingRules(boolean doNotPushFlows, Port removedPort, Map<String,
+    public void removeSwitchingRules(Port removedPort, Map<String,
             OpenstackPortInfo> openstackPortInfoMap) {
-        if (doNotPushFlows) {
-            return;
-        }
         OpenstackPortInfo openstackPortInfo = openstackPortInfoMap
                 .get(removedPort.annotations().value("portName"));