[WIP][CORD-200] Improves Segment Routing using Network Configuration Subsystem

DONE
- Remove original configuration subsystem
- Implement new SegmentRoutingConfig
- Update SegmentRoutingManager and DeviceConfiguration

TODO
- Extract adjacencySid array from JsonNode
- Extract subnets and prefixes from port subject

Change-Id: Ic7fec102f4427a30eec99ebf6c7c5584652a6280
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
index cea8322..c4bb8c8 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2014-2015 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.
@@ -18,15 +18,13 @@
 import com.google.common.collect.Lists;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
-import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
+import org.onosproject.segmentrouting.config.SegmentRoutingConfig.AdjacencySid;
 import org.onosproject.segmentrouting.grouphandler.DeviceProperties;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.onosproject.segmentrouting.config.NetworkConfig.SwitchConfig;
-import org.onosproject.segmentrouting.config.NetworkConfigManager;
-import org.onosproject.segmentrouting.config.SegmentRouterConfig;
-import org.onosproject.segmentrouting.config.SegmentRouterConfig.Subnet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +34,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Segment Routing configuration component that reads the
@@ -50,7 +49,7 @@
             .getLogger(DeviceConfiguration.class);
     private final List<Integer> allSegmentIds = new ArrayList<>();
     private final HashMap<DeviceId, SegmentRouterInfo> deviceConfigMap = new HashMap<>();
-    private final NetworkConfigManager configService;
+    private final NetworkConfigRegistry configService;
 
     private class SegmentRouterInfo {
         int nodeSid;
@@ -60,48 +59,39 @@
         boolean isEdge;
         HashMap<PortNumber, Ip4Address> gatewayIps;
         HashMap<PortNumber, Ip4Prefix> subnets;
-        List<SegmentRouterConfig.AdjacencySid> adjacencySids;
+        List<AdjacencySid> adjacencySids;
     }
 
     /**
      * Constructor. Reads all the configuration for all devices of type
      * Segment Router and organizes into various maps for easier access.
      *
-     * @param configService handle to network configuration manager
+     * @param cfgService handle to network configuration manager
      * component from where the relevant configuration is retrieved.
      */
-    public DeviceConfiguration(NetworkConfigManager configService) {
-        this.configService = checkNotNull(configService);
-        List<SwitchConfig> allSwitchCfg =
-                this.configService.getConfiguredAllowedSwitches();
-        for (SwitchConfig cfg : allSwitchCfg) {
-            if (!(cfg instanceof SegmentRouterConfig)) {
-                continue;
-            }
+    public DeviceConfiguration(NetworkConfigRegistry cfgService) {
+        this.configService = checkNotNull(cfgService);
+
+        Set<DeviceId> subjectSet =
+                cfgService.getSubjects(DeviceId.class, SegmentRoutingConfig.class);
+
+        subjectSet.forEach(subject -> {
+            SegmentRoutingConfig config =
+                cfgService.getConfig(subject, SegmentRoutingConfig.class);
             SegmentRouterInfo info = new SegmentRouterInfo();
-            info.nodeSid = ((SegmentRouterConfig) cfg).getNodeSid();
-            info.deviceId = cfg.getDpid();
-            info.mac = MacAddress.valueOf(((
-                    SegmentRouterConfig) cfg).getRouterMac());
-            String routerIp = ((SegmentRouterConfig) cfg).getRouterIp();
-            Ip4Prefix prefix = checkNotNull(IpPrefix.valueOf(routerIp).getIp4Prefix());
-            info.ip = prefix.address();
-            info.isEdge = ((SegmentRouterConfig) cfg).isEdgeRouter();
-            info.subnets = new HashMap<>();
+            info.nodeSid = config.getSid();
+            info.deviceId = subject;
+            info.ip = config.getIp();
+            info.mac = config.getMac();
+            info.isEdge = config.isEdgeRouter();
+            // TODO fecth subnet and gateway information via port subject
             info.gatewayIps = new HashMap<>();
-            for (Subnet s: ((SegmentRouterConfig) cfg).getSubnets()) {
-                info.subnets.put(PortNumber.portNumber(s.getPortNo()),
-                                 Ip4Prefix.valueOf(s.getSubnetIp()));
-                String gatewayIp = s.getSubnetIp().
-                        substring(0, s.getSubnetIp().indexOf('/'));
-                info.gatewayIps.put(PortNumber.portNumber(s.getPortNo()),
-                                    Ip4Address.valueOf(gatewayIp));
-            }
-            info.adjacencySids = ((SegmentRouterConfig) cfg).getAdjacencySids();
+            info.subnets = new HashMap<>();
+            info.adjacencySids = config.getAdjacencySids();
+
             this.deviceConfigMap.put(info.deviceId, info);
             this.allSegmentIds.add(info.nodeSid);
-
-        }
+        });
     }
 
     /**
@@ -379,8 +369,8 @@
      */
     public List<Integer> getPortsForAdjacencySid(DeviceId deviceId, int sid) {
         if (deviceConfigMap.get(deviceId) != null) {
-            for (SegmentRouterConfig.AdjacencySid asid : deviceConfigMap.get(deviceId).adjacencySids) {
-                if (asid.getAdjSid() == sid) {
+            for (AdjacencySid asid : deviceConfigMap.get(deviceId).adjacencySids) {
+                if (asid.getSid() == sid) {
                     return asid.getPorts();
                 }
             }
@@ -402,9 +392,9 @@
             if (deviceConfigMap.get(deviceId).adjacencySids.isEmpty()) {
                 return false;
             } else {
-                for (SegmentRouterConfig.AdjacencySid asid:
+                for (AdjacencySid asid:
                         deviceConfigMap.get(deviceId).adjacencySids) {
-                    if (asid.getAdjSid() == sid) {
+                    if (asid.getSid() == sid) {
                         return true;
                     }
                 }
@@ -414,4 +404,4 @@
 
         return false;
     }
-}
+}
\ No newline at end of file