[ONOS-4213] Creates a OpenstackNetworking Config for common use

Change-Id: I241db20fc32788a405b260372eedc3dce2de73fd
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
index c971b99..4c5dc38 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
@@ -37,6 +37,7 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.openstackinterface.OpenstackInterfaceService;
 import org.onosproject.openstackinterface.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.slf4j.Logger;
@@ -61,7 +62,7 @@
     private final Map<String, OpenstackPortInfo> icmpInfoMap = Maps.newHashMap();
     private final OpenstackSwitchingService openstackSwitchingService;
     private final OpenstackInterfaceService openstackService;
-    private final OpenstackRoutingConfig config;
+    private final OpenstackNetworkingConfig config;
     private static final MacAddress GATEWAY_MAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
     private static final String NETWORK_ROUTER_INTERFACE = "network:router_interface";
     private static final String PORTNAME = "portName";
@@ -76,7 +77,7 @@
      * @param openstackSwitchingService openstackSwitching service
      */
     OpenstackIcmpHandler(PacketService packetService, DeviceService deviceService,
-                         OpenstackInterfaceService openstackService, OpenstackRoutingConfig config,
+                         OpenstackInterfaceService openstackService, OpenstackNetworkingConfig config,
                          OpenstackSwitchingService openstackSwitchingService) {
         this.packetService = packetService;
         this.deviceService = deviceService;
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
index 25ee9a5..f144e88 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
@@ -33,6 +33,7 @@
 import org.onosproject.openstackinterface.OpenstackNetwork;
 import org.onosproject.openstackinterface.OpenstackPort;
 import org.onosproject.openstackinterface.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,12 +57,12 @@
     private final int portNum;
     private final OpenstackPort openstackPort;
     private final Port port;
-    private OpenstackRoutingConfig config;
+    private OpenstackNetworkingConfig config;
 
     private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
 
     OpenstackPnatHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context,
-                         int portNum, OpenstackPort openstackPort, Port port, OpenstackRoutingConfig config) {
+                         int portNum, OpenstackPort openstackPort, Port port, OpenstackNetworkingConfig config) {
         this.rulePopulator = checkNotNull(rulePopulator);
         this.context = checkNotNull(context);
         this.portNum = checkNotNull(portNum);
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingArpHandler.java
index ff0a4ef..7dee2c1 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingArpHandler.java
@@ -33,6 +33,7 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.openstackinterface.OpenstackInterfaceService;
 import org.onosproject.openstackinterface.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
 import org.slf4j.Logger;
 
 import java.nio.ByteBuffer;
@@ -49,7 +50,7 @@
 
     private final PacketService packetService;
     private final OpenstackInterfaceService openstackService;
-    private final OpenstackRoutingConfig config;
+    private final OpenstackNetworkingConfig config;
     private static final String NETWORK_ROUTER_GATEWAY = "network:router_gateway";
 
     /**
@@ -60,7 +61,7 @@
      * @param config openstackRoutingConfig
      */
     OpenstackRoutingArpHandler(PacketService packetService, OpenstackInterfaceService openstackService,
-                               OpenstackRoutingConfig config) {
+                               OpenstackNetworkingConfig config) {
         this.packetService = packetService;
         this.openstackService = checkNotNull(openstackService);
         this.config = checkNotNull(config);
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingConfig.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingConfig.java
deleted file mode 100644
index 7c9f126..0000000
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingConfig.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacknetworking.routing;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Maps;
-import org.onlab.packet.Ip4Address;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.config.Config;
-import org.slf4j.Logger;
-
-import java.util.Map;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Configuration object for OpenstackRouting service.
- */
-public class OpenstackRoutingConfig extends Config<ApplicationId> {
-    protected final Logger log = getLogger(getClass());
-
-    public static final String PHYSICAL_ROUTER_MAC = "physicalRouterMac";
-    public static final String GATEWAY_BRIDGE_ID = "gatewayBridgeId";
-    public static final String GATEWAY_EXTERNAL_INTERFACE_NAME = "gatewayExternalInterfaceName";
-    public static final String GATEWAY_EXTERNAL_INTERFACE_MAC = "gatewayExternalInterfaceMac";
-    public static final String NODES = "nodes";
-    public static final String DATAPLANE_IP = "dataPlaneIp";
-    public static final String BRIDGE_ID = "bridgeId";
-
-
-    /**
-     * Returns the data plane IP map of nodes read from network config.
-     *
-     * @return data plane IP map
-     */
-    public Map<DeviceId, Ip4Address> nodes() {
-        Map<DeviceId, Ip4Address> nodeMap = Maps.newHashMap();
-
-        JsonNode jsonNodes = object.get(NODES);
-        if (jsonNodes == null) {
-            log.error("There's no node information");
-            return null;
-        }
-
-        jsonNodes.forEach(jsonNode -> {
-            try {
-                nodeMap.putIfAbsent(DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText()),
-                        Ip4Address.valueOf(jsonNode.path(DATAPLANE_IP).asText()));
-            } catch (IllegalArgumentException | NullPointerException e) {
-                log.error("Failed to read {}", e.toString());
-            }
-        });
-        return nodeMap;
-    }
-
-    /**
-     * Returns physical router mac.
-     *
-     * @return physical router mac
-     */
-    public String physicalRouterMac() {
-        return this.get(PHYSICAL_ROUTER_MAC, "");
-    }
-
-    /**
-     * Returns gateway's bridge id.
-     *
-     * @return bridge id
-     */
-    public String gatewayBridgeId() {
-        return this.get(GATEWAY_BRIDGE_ID, "");
-    }
-
-    /**
-     * Returns gateway's external interface name.
-     *
-     * @return external interface name
-     */
-    public String gatewayExternalInterfaceName() {
-        return this.get(GATEWAY_EXTERNAL_INTERFACE_NAME, "");
-    }
-
-    /**
-     * Returns gateway's external interface mac.
-     *
-     * @return external interface mac
-     */
-    public String gatewayExternalInterfaceMac() {
-        return this.get(GATEWAY_EXTERNAL_INTERFACE_MAC, "");
-    }
-}
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
index 891b622..62e8cdf 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
@@ -37,7 +37,6 @@
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
@@ -50,8 +49,10 @@
 import org.onosproject.openstackinterface.OpenstackPort;
 import org.onosproject.openstackinterface.OpenstackRouter;
 import org.onosproject.openstackinterface.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.onosproject.openstacknetworking.OpenstackRoutingService;
+import org.onosproject.openstacknetworking.OpenstackSubjectFactories;
 import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
@@ -124,16 +125,19 @@
     private static final int PNAT_PORT_EXPIRE_TIME = 1200 * 1000;
     private static final int TP_PORT_MINIMUM_NUM = 1024;
     private static final int TP_PORT_MAXIMUM_NUM = 65535;
+
     private final ConfigFactory configFactory =
-            new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, OpenstackRoutingConfig.class, "openstackrouting") {
+            new ConfigFactory(OpenstackSubjectFactories.USER_DEFINED_SUBJECT_FACTORY, OpenstackNetworkingConfig.class,
+                    "config") {
                 @Override
-                public OpenstackRoutingConfig createConfig() {
-                    return new OpenstackRoutingConfig();
+                public OpenstackNetworkingConfig createConfig() {
+                    return new OpenstackNetworkingConfig();
                 }
             };
+
     private final NetworkConfigListener configListener = new InternalConfigListener();
 
-    private OpenstackRoutingConfig config;
+    private OpenstackNetworkingConfig config;
     private static final KryoNamespace.Builder FLOATING_IP_SERIALIZER = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
             .register(KryoNamespaces.MISC)
@@ -167,8 +171,6 @@
         configRegistry.registerConfigFactory(configFactory);
         configService.addListener(configListener);
 
-        readConfiguration();
-
         floatingIpMap = storageService.<String, OpenstackFloatingIP>consistentMapBuilder()
                 .withSerializer(Serializer.using(FLOATING_IP_SERIALIZER.build()))
                 .withName(FLOATING_IP_MAP_NAME)
@@ -180,6 +182,8 @@
                 .withApplicationId(appId)
                 .build();
 
+        readConfiguration();
+
         log.info("onos-openstackrouting started");
     }
 
@@ -488,7 +492,7 @@
     }
 
     private void readConfiguration() {
-        config = configService.getConfig(appId, OpenstackRoutingConfig.class);
+        config = configService.getConfig("openstacknetworking", OpenstackNetworkingConfig.class);
         if (config == null) {
             log.error("No configuration found");
             return;
@@ -499,7 +503,7 @@
         checkNotNull(config.gatewayExternalInterfaceMac());
         checkNotNull(config.gatewayExternalInterfaceName());
 
-        log.debug("Configured info: {}, {}, {}, {}", config.physicalRouterMac(), config.gatewayBridgeId(),
+        log.warn("Configured info: {}, {}, {}, {}", config.physicalRouterMac(), config.gatewayBridgeId(),
                 config.gatewayExternalInterfaceMac(), config.gatewayExternalInterfaceName());
 
         rulePopulator = new OpenstackRoutingRulePopulator(appId,
@@ -512,6 +516,7 @@
         openstackIcmpHandler.requestPacket(appId);
         openstackArpHandler.requestPacket(appId);
         reloadInitL3Rules();
+
         log.info("OpenstackRouting configured");
     }
 
@@ -519,7 +524,7 @@
 
         @Override
         public void event(NetworkConfigEvent event) {
-            if (!event.configClass().equals(OpenstackRoutingConfig.class)) {
+            if (!event.configClass().equals(OpenstackNetworkingConfig.class)) {
                 return;
             }
 
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
index d8d56e6..5616e0a 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
@@ -52,6 +52,7 @@
 import org.onosproject.openstackinterface.OpenstackRouterInterface;
 import org.onosproject.openstackinterface.OpenstackSubnet;
 import org.onosproject.openstackinterface.OpenstackFloatingIP;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
 import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,7 +73,7 @@
     private final OpenstackInterfaceService openstackService;
     private final DeviceService deviceService;
     private final DriverService driverService;
-    private final OpenstackRoutingConfig config;
+    private final OpenstackNetworkingConfig config;
 
     private static final String PORTNAME_PREFIX_TUNNEL = "vxlan";
     private static final String PORTNAME = "portName";
@@ -106,7 +107,7 @@
      */
     public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackInterfaceService openstackService,
                                          FlowObjectiveService flowObjectiveService, DeviceService deviceService,
-                                         DriverService driverService, OpenstackRoutingConfig config) {
+                                         DriverService driverService, OpenstackNetworkingConfig config) {
         this.appId = appId;
         this.flowObjectiveService = flowObjectiveService;
         this.openstackService = checkNotNull(openstackService);