Separated OpenstackInterface feature from OpenstackNetworking application.

Change-Id: I4766de7e93c5b432c50a2167b9a9d9d4605b1ad2
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);
-            }
-        }
-    }
 }