[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/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java b/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
index cea8322..c4bb8c8 100644
--- a/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
+++ b/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