ONOS-1930 : Tunnel and policy failover with multi-instances
- Prevents tunnel delete from removing groups used for default flows
- Removes SegmentRoutingManager reference from Tunnel and Policy class
- Adds some error checks such as duplicates tunnel IDs or duplicate polices
Change-Id: I0e7d5e2eff0aea6dad13137a872fee58e083b11c
diff --git a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 02ed88a..8a7aae9 100644
--- a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -128,6 +128,9 @@
// Per device next objective ID store with (device id + neighbor set) as key
private EventuallyConsistentMap<NeighborSetNextObjectiveStoreKey,
Integer> nsNextObjStore = null;
+ private EventuallyConsistentMap<String, Tunnel> tunnelStore = null;
+ private EventuallyConsistentMap<String, Policy> policyStore = null;
+
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected StorageService storageService;
@@ -148,13 +151,18 @@
kryoBuilder = new KryoNamespace.Builder()
.register(NeighborSetNextObjectiveStoreKey.class,
- NeighborSet.class,
- DeviceId.class,
- URI.class,
- WallClockTimestamp.class,
- org.onosproject.cluster.NodeId.class,
- HashSet.class
- );
+ NeighborSet.class,
+ DeviceId.class,
+ URI.class,
+ WallClockTimestamp.class,
+ org.onosproject.cluster.NodeId.class,
+ HashSet.class,
+ Tunnel.class,
+ DefaultTunnel.class,
+ Policy.class,
+ TunnelPolicy.class,
+ Policy.Type.class
+ );
log.debug("Creating EC map nsnextobjectivestore");
EventuallyConsistentMapBuilder<NeighborSetNextObjectiveStoreKey, Integer>
@@ -167,6 +175,24 @@
.build();
log.trace("Current size {}", nsNextObjStore.size());
+ EventuallyConsistentMapBuilder<String, Tunnel> tunnelMapBuilder =
+ storageService.eventuallyConsistentMapBuilder();
+
+ tunnelStore = tunnelMapBuilder
+ .withName("tunnelstore")
+ .withSerializer(kryoBuilder)
+ .withClockService(new WallclockClockManager<>())
+ .build();
+
+ EventuallyConsistentMapBuilder<String, Policy> policyMapBuilder =
+ storageService.eventuallyConsistentMapBuilder();
+
+ policyStore = policyMapBuilder
+ .withName("policystore")
+ .withSerializer(kryoBuilder)
+ .withClockService(new WallclockClockManager<>())
+ .build();
+
networkConfigService.init();
deviceConfiguration = new DeviceConfiguration(networkConfigService);
arpHandler = new ArpHandler(this);
@@ -174,8 +200,8 @@
ipHandler = new IpHandler(this);
routingRulePopulator = new RoutingRulePopulator(this);
defaultRoutingHandler = new DefaultRoutingHandler(this);
- tunnelHandler = new TunnelHandler();
- policyHandler = new PolicyHandler();
+ tunnelHandler = new TunnelHandler(this, tunnelStore);
+ policyHandler = new PolicyHandler(this, policyStore);
packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2);
linkService.addListener(new InternalLinkListener());
@@ -295,6 +321,24 @@
}
/**
+ * Checks if the next objective ID (group) for the neighbor set exists or not in the device.
+ *
+ * @param deviceId Device ID to check
+ * @param ns neighbor set to check
+ * @return true if it exists, false otherwise
+ */
+ public boolean hasNextObjectiveId(DeviceId deviceId, NeighborSet ns) {
+ if (groupHandlerMap.get(deviceId) != null) {
+ log.trace("getNextObjectiveId query in device {}", deviceId);
+ return groupHandlerMap
+ .get(deviceId).hasNextObjectiveId(ns);
+ } else {
+ log.warn("getNextObjectiveId query in device {} not found", deviceId);
+ return false;
+ }
+ }
+
+ /**
* Removes the next objective ID.
*
* @param deviceId Device ID