blob: e3a63b37c6f0d6c59f11199668b6c29512552f61 [file] [log] [blame]
Yixiao Chen68bfab22016-11-11 11:04:10 -05001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Yixiao Chen68bfab22016-11-11 11:04:10 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.tetopology.management.impl;
17
Aihua Guo0bc12092017-02-10 09:53:55 -050018import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
Yixiao Chen68bfab22016-11-11 11:04:10 -050019import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
20import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
21import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
22import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
23import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
24import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_UPDATED;
25import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
26import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
27import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
28import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
29import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
30import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
31import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
32import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
33import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
34import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
35import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
36import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_UPDATED;
37import static org.slf4j.LoggerFactory.getLogger;
38
39import java.util.BitSet;
40import java.util.List;
41import java.util.Map;
42import java.util.concurrent.BlockingQueue;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050043import java.util.concurrent.LinkedBlockingQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -050044
45import org.apache.commons.collections.CollectionUtils;
46import org.apache.commons.collections.MapUtils;
47import org.apache.felix.scr.annotations.Activate;
48import org.apache.felix.scr.annotations.Component;
49import org.apache.felix.scr.annotations.Deactivate;
50import org.apache.felix.scr.annotations.Reference;
51import org.apache.felix.scr.annotations.ReferenceCardinality;
52import org.apache.felix.scr.annotations.Service;
53import org.onlab.util.KryoNamespace;
54import org.onosproject.net.DeviceId;
55import org.onosproject.store.AbstractStore;
56import org.onosproject.store.serializers.KryoNamespaces;
57import org.onosproject.store.service.AtomicCounter;
58import org.onosproject.store.service.ConsistentMap;
59import org.onosproject.store.service.MapEvent;
60import org.onosproject.store.service.MapEventListener;
61import org.onosproject.store.service.Serializer;
62import org.onosproject.store.service.StorageService;
63import org.onosproject.tetopology.management.api.CommonTopologyData;
64import org.onosproject.tetopology.management.api.DefaultNetwork;
65import org.onosproject.tetopology.management.api.DefaultTeTopologies;
66import org.onosproject.tetopology.management.api.DefaultTeTopology;
67import org.onosproject.tetopology.management.api.EncodingType;
68import org.onosproject.tetopology.management.api.KeyId;
69import org.onosproject.tetopology.management.api.LongValue;
70import org.onosproject.tetopology.management.api.Network;
71import org.onosproject.tetopology.management.api.OptimizationType;
72import org.onosproject.tetopology.management.api.ProviderClientId;
73import org.onosproject.tetopology.management.api.SwitchingType;
74import org.onosproject.tetopology.management.api.TeConstants;
75import org.onosproject.tetopology.management.api.TeStatus;
76import org.onosproject.tetopology.management.api.TeTopologies;
77import org.onosproject.tetopology.management.api.TeTopology;
78import org.onosproject.tetopology.management.api.TeTopologyEvent;
79import org.onosproject.tetopology.management.api.TeTopologyEvent.Type;
80import org.onosproject.tetopology.management.api.TeTopologyId;
81import org.onosproject.tetopology.management.api.TeTopologyKey;
82import org.onosproject.tetopology.management.api.TeUtils;
83import org.onosproject.tetopology.management.api.link.AsNumber;
84import org.onosproject.tetopology.management.api.link.CommonLinkData;
Yixiao Chen29f06332016-12-07 16:14:29 -050085import org.onosproject.tetopology.management.api.link.ConnectivityMatrixId;
Yixiao Chen68bfab22016-11-11 11:04:10 -050086import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
87import org.onosproject.tetopology.management.api.link.DefaultTeLink;
88import org.onosproject.tetopology.management.api.link.ElementType;
89import org.onosproject.tetopology.management.api.link.ExternalLink;
90import org.onosproject.tetopology.management.api.link.Label;
91import org.onosproject.tetopology.management.api.link.LinkBandwidth;
92import org.onosproject.tetopology.management.api.link.NetworkLink;
93import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
94import org.onosproject.tetopology.management.api.link.OduResource;
95import org.onosproject.tetopology.management.api.link.PathElement;
96import org.onosproject.tetopology.management.api.link.TeIpv4;
97import org.onosproject.tetopology.management.api.link.TeIpv6;
98import org.onosproject.tetopology.management.api.link.TeLink;
Yixiao Chen29f06332016-12-07 16:14:29 -050099import org.onosproject.tetopology.management.api.link.TeLinkId;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500100import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
101import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
102import org.onosproject.tetopology.management.api.link.TePathAttributes;
103import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
104import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
105import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
106import org.onosproject.tetopology.management.api.link.UnderlayPath;
107import org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath;
108import org.onosproject.tetopology.management.api.link.UnnumberedLink;
109import org.onosproject.tetopology.management.api.node.CommonNodeData;
110import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
111import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
112import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
113import org.onosproject.tetopology.management.api.node.DefaultTeNode;
114import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
115import org.onosproject.tetopology.management.api.node.DefaultTunnelTerminationPoint;
116import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
117import org.onosproject.tetopology.management.api.node.NetworkNode;
118import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
119import org.onosproject.tetopology.management.api.node.NodeTpKey;
120import org.onosproject.tetopology.management.api.node.TeNode;
121import org.onosproject.tetopology.management.api.node.TeNodeKey;
122import org.onosproject.tetopology.management.api.node.TerminationPoint;
123import org.onosproject.tetopology.management.api.node.TerminationPointKey;
124import org.onosproject.tetopology.management.api.node.TtpKey;
125import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
126import org.slf4j.Logger;
127
Yixiao Chen68bfab22016-11-11 11:04:10 -0500128import com.google.common.collect.Lists;
129import com.google.common.collect.Maps;
130
131/**
132 * Implementation of the TE network store.
133 */
134@Component(immediate = true)
135@Service
136public class DistributedTeTopologyStore
137 extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
138 implements TeTopologyStore {
139 private static final String STORE_NAME = "TE_NETWORK_TOPOLOGY_STORE";
Jordan Halterman279773e2017-06-15 11:17:21 -0700140 private static final String COUNTER_NAME = "TeTopology-TeTopologyId";
Yixiao Chen68bfab22016-11-11 11:04:10 -0500141 private static final String TETOPOLOGYKEY_INTERNALTETOPOLOGY = "TeTopologyKey-InternalTeTopology";
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500142 private static final String NETWORKID_NETWORK = "NetworkId-InternalNetwork";
Yixiao Chen68bfab22016-11-11 11:04:10 -0500143 private static final String TENODEKEY_INTERNALTENODE = "TeNodeKey-InternalTeNode";
144 private static final String CONNMATRIXKEY_CONNECTIVITYMATRIX = "ConnMatrixKey-ConnectivityMatrix";
145 private static final String NETWORKNODEKEY_INTERNALNETWORKNODE = "NetworkNodeKey-InternalNetworkNode";
146 private static final String TELINKGLOBALKEY_INTERNALTELINK = "TeLinkGlobalKey-InternalTeLink";
147 private static final String NETWORKLINKKEY_INTERNALNETWORKLINK = "NetworkLinkKey-InternalNetworkLink";
148 private static final String TPKEY_INTERNALTERMINATIONPOINT = "tpKey-InternalTerminationPoint";
149 private static final String TELINKTPGLOBALKEY_TERMINATIONPOINTKEY = "TeLinkGlobalKey-TerminationPointKey";
150 private static final String TTPKEY_TUNNELTERMINATIONPOINT = "TtpKey-TunnelTerminationPoint";
151 private final Logger log = getLogger(getClass());
152
153 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
154 protected StorageService storageService;
155 // Track TE topologies by TE Topology key
156 private ConsistentMap<TeTopologyKey, InternalTeTopology> teTopologyConsistentMap;
157 private Map<TeTopologyKey, InternalTeTopology> teTopologyMap;
158 private AtomicCounter nextTeTopologyId;
159 // Listener for te topology events
160 private final MapEventListener<TeTopologyKey, InternalTeTopology> teTopologyListener =
161 new InternalTeTopologyListener();
162 // Track networks by network Id
163 private ConsistentMap<KeyId, InternalNetwork> networkConsistentMap;
164 private Map<KeyId, InternalNetwork> networkMap;
165 // Listener for network events
166 private final MapEventListener<KeyId, InternalNetwork> networkListener =
167 new InternalNetworkListener();
168 // Track TE nodes by TE node key
169 private ConsistentMap<TeNodeKey, InternalTeNode> teNodeConsistentMap;
170 private Map<TeNodeKey, InternalTeNode> teNodeMap;
171 // Track ConnectivityMatrix by its key
172 private ConsistentMap<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixConsistentMap;
173 private Map<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixMap;
174 // Track Tunnel Termination Points by its key
175 private ConsistentMap<TtpKey, TunnelTerminationPoint> ttpConsistentMap;
176 private Map<TtpKey, TunnelTerminationPoint> ttpMap;
177 // Listener for TE node events
178 private final MapEventListener<TeNodeKey, InternalTeNode> teNodeListener =
179 new InternalTeNodeListener();
180 // Track network nodes by network node key
181 private ConsistentMap<NetworkNodeKey, InternalNetworkNode> networkNodeConsistentMap;
182 private Map<NetworkNodeKey, InternalNetworkNode> networkNodeMap;
183 // Listener for network node events
184 private final MapEventListener<NetworkNodeKey, InternalNetworkNode> networkNodeListener =
185 new InternalNetworkNodeListener();
186 // Track TE links by its key
187 private ConsistentMap<TeLinkTpGlobalKey, InternalTeLink> teLinkConsistentMap;
188 private Map<TeLinkTpGlobalKey, InternalTeLink> teLinkMap;
189 // Listener for te link events
190 private final MapEventListener<TeLinkTpGlobalKey, InternalTeLink> teLinkListener =
191 new InternalTeLinkListener();
192 // Track network links by network link key
193 private ConsistentMap<NetworkLinkKey, InternalNetworkLink> networkLinkConsistentMap;
194 private Map<NetworkLinkKey, InternalNetworkLink> networkLinkMap;
195 // Listener for network link events
196 private final MapEventListener<NetworkLinkKey, InternalNetworkLink> networkLinkListener =
197 new InternalNetworkLinkListener();
198 // Track Termination points by termination point key
199 private ConsistentMap<TerminationPointKey, InternalTerminationPoint> tpConsistentMap;
200 private Map<TerminationPointKey, InternalTerminationPoint> tpMap;
201 // Track termination point keys by TE termination point Key
202 private ConsistentMap<TeLinkTpGlobalKey, TerminationPointKey> tpKeyConsistentMap;
203 private Map<TeLinkTpGlobalKey, TerminationPointKey> tpKeyMap;
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500204 private final BlockingQueue<TeTopologyMapEvent> mapEventQueue = new LinkedBlockingQueue<>();
205
Yixiao Chen29f06332016-12-07 16:14:29 -0500206 private long providerId;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500207 private static final Serializer TETOPOLOGY_SERIALIZER = Serializer
208 .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
209 .register(TeTopologyKey.class)
210 .register(ProviderClientId.class)
211 .register(TeNodeKey.class)
212 .register(TeLinkTpGlobalKey.class)
213 .register(CommonTopologyData.class)
214 .register(KeyId.class)
215 .register(OptimizationType.class)
Yixiao Chen68bfab22016-11-11 11:04:10 -0500216 .register(InternalTeTopology.class)
217 .register(InternalNetwork.class)
218 .register(InternalTerminationPoint.class)
219 .register(InternalTeNode.class)
220 .register(InternalNetworkNode.class)
221 .register(CommonNodeData.class)
222 .register(ConnectivityMatrixKey.class)
223 .register(ConnectivityMatrix.class)
224 .register(TtpKey.class)
225 .register(NetworkNodeKey.class)
226 .register(TeStatus.class)
227 .register(ElementType.class)
228 .register(TeIpv4.class)
229 .register(TeIpv6.class)
230 .register(AsNumber.class)
231 .register(Label.class)
232 .register(UnnumberedLink.class)
Yixiao Chen29f06332016-12-07 16:14:29 -0500233 .register(TeLinkId.class)
234 .register(ConnectivityMatrixId.class)
Yixiao Chen68bfab22016-11-11 11:04:10 -0500235 .register(InternalTeLink.class)
236 .register(InternalNetworkLink.class)
237 .register(TeLinkTpKey.class)
238 .register(NetworkLinkKey.class)
239 .register(NodeTpKey.class)
240 .register(CommonLinkData.class)
241 .register(SwitchingType.class)
242 .register(EncodingType.class)
243 .register(ExternalLink.class)
244 .register(UnderlayPath.class)
245 .register(LinkBandwidth.class)
246 .register(OduResource.class)
247 .register(PathElement.class)
248 .register(UnderlayAbstractPath.class)
249 .register(UnderlayBackupPath.class)
250 .register(UnderlayPrimaryPath.class)
251 .register(TePathAttributes.class)
252 .register(TerminationPoint.class)
253 .register(TunnelTerminationPoint.class)
254 .register(DefaultTunnelTerminationPoint.class)
255 .register(TerminationPointKey.class)
256 .register(TunnelProtectionType.class)
257 .register(LongValue.class)
258 .register(LocalLinkConnectivity.class)
259 .build());
260
261 /**
262 * Distributed network store service activate method.
263 */
264 @Activate
265 public void activate() {
266 teTopologyConsistentMap = storageService
267 .<TeTopologyKey, InternalTeTopology>consistentMapBuilder()
268 .withSerializer(TETOPOLOGY_SERIALIZER)
269 .withName(TETOPOLOGYKEY_INTERNALTETOPOLOGY)
270 .withRelaxedReadConsistency()
271 .build();
272 teTopologyConsistentMap.addListener(teTopologyListener);
273 teTopologyMap = teTopologyConsistentMap.asJavaMap();
274 networkConsistentMap = storageService
275 .<KeyId, InternalNetwork>consistentMapBuilder()
276 .withSerializer(TETOPOLOGY_SERIALIZER)
277 .withName(NETWORKID_NETWORK)
278 .withRelaxedReadConsistency()
279 .build();
280 networkConsistentMap.addListener(networkListener);
281 networkMap = networkConsistentMap.asJavaMap();
282 teNodeConsistentMap = storageService
283 .<TeNodeKey, InternalTeNode>consistentMapBuilder()
284 .withSerializer(TETOPOLOGY_SERIALIZER)
285 .withName(TENODEKEY_INTERNALTENODE)
286 .withRelaxedReadConsistency()
287 .build();
288 teNodeConsistentMap.addListener(teNodeListener);
289 teNodeMap = teNodeConsistentMap.asJavaMap();
290 connMatrixConsistentMap = storageService
291 .<ConnectivityMatrixKey, ConnectivityMatrix>consistentMapBuilder()
292 .withSerializer(TETOPOLOGY_SERIALIZER)
293 .withName(CONNMATRIXKEY_CONNECTIVITYMATRIX)
294 .withRelaxedReadConsistency()
295 .build();
296 connMatrixMap = connMatrixConsistentMap.asJavaMap();
297 networkNodeConsistentMap = storageService
298 .<NetworkNodeKey, InternalNetworkNode>consistentMapBuilder()
299 .withSerializer(TETOPOLOGY_SERIALIZER)
300 .withName(NETWORKNODEKEY_INTERNALNETWORKNODE)
301 .withRelaxedReadConsistency()
302 .build();
303 networkNodeConsistentMap.addListener(networkNodeListener);
304 networkNodeMap = networkNodeConsistentMap.asJavaMap();
305 teLinkConsistentMap = storageService
306 .<TeLinkTpGlobalKey, InternalTeLink>consistentMapBuilder()
307 .withSerializer(TETOPOLOGY_SERIALIZER)
308 .withName(TELINKGLOBALKEY_INTERNALTELINK)
309 .withRelaxedReadConsistency()
310 .build();
311 teLinkConsistentMap.addListener(teLinkListener);
312 teLinkMap = teLinkConsistentMap.asJavaMap();
313 networkLinkConsistentMap = storageService
314 .<NetworkLinkKey, InternalNetworkLink>consistentMapBuilder()
315 .withSerializer(TETOPOLOGY_SERIALIZER)
316 .withName(NETWORKLINKKEY_INTERNALNETWORKLINK)
317 .withRelaxedReadConsistency()
318 .build();
319 networkLinkConsistentMap.addListener(networkLinkListener);
320 networkLinkMap = networkLinkConsistentMap.asJavaMap();
321 tpConsistentMap = storageService
322 .<TerminationPointKey, InternalTerminationPoint>consistentMapBuilder()
323 .withSerializer(TETOPOLOGY_SERIALIZER)
324 .withName(TPKEY_INTERNALTERMINATIONPOINT)
325 .withRelaxedReadConsistency()
326 .build();
327 tpMap = tpConsistentMap.asJavaMap();
328 tpKeyConsistentMap = storageService
329 .<TeLinkTpGlobalKey, TerminationPointKey>consistentMapBuilder()
330 .withSerializer(TETOPOLOGY_SERIALIZER)
331 .withName(TELINKTPGLOBALKEY_TERMINATIONPOINTKEY)
332 .withRelaxedReadConsistency()
333 .build();
334 tpKeyMap = tpKeyConsistentMap.asJavaMap();
335 ttpConsistentMap = storageService
336 .<TtpKey, TunnelTerminationPoint>consistentMapBuilder()
337 .withSerializer(TETOPOLOGY_SERIALIZER)
338 .withName(TTPKEY_TUNNELTERMINATIONPOINT)
339 .withRelaxedReadConsistency()
340 .build();
341 ttpMap = ttpConsistentMap.asJavaMap();
342
Jordan Halterman279773e2017-06-15 11:17:21 -0700343 nextTeTopologyId = storageService.getAtomicCounter(COUNTER_NAME);
Yixiao Chen68bfab22016-11-11 11:04:10 -0500344 log.info("Started");
345 }
346
347 /**
348 * Distributed network store service deactivate method.
349 */
350 @Deactivate
351 public void deactivate() {
352 teTopologyConsistentMap.removeListener(teTopologyListener);
353 teTopologyConsistentMap.destroy();
354 teTopologyMap.clear();
355 networkConsistentMap.removeListener(networkListener);
356 networkConsistentMap.destroy();
357 networkMap.clear();
358 teNodeConsistentMap.removeListener(teNodeListener);
359 teNodeConsistentMap.destroy();
360 teNodeMap.clear();
361 connMatrixConsistentMap.destroy();
362 connMatrixMap.clear();
363 networkNodeConsistentMap.destroy();
364 networkNodeConsistentMap.removeListener(networkNodeListener);
365 networkNodeMap.clear();
366 teLinkConsistentMap.removeListener(teLinkListener);
367 teLinkConsistentMap.destroy();
368 teLinkMap.clear();
369 networkLinkConsistentMap.destroy();
370 networkLinkConsistentMap.removeListener(networkLinkListener);
371 networkLinkMap.clear();
372 tpConsistentMap.destroy();
373 tpMap.clear();
374 tpKeyConsistentMap.destroy();
375 tpKeyMap.clear();
376 ttpConsistentMap.destroy();
377 ttpMap.clear();
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500378 mapEventQueue.clear();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500379 log.info("Stopped");
380 }
381
382 /**
383 * Listener class to map listener map events to the TETOPOLOGY events.
384 */
385 private class InternalTeTopologyListener implements MapEventListener<TeTopologyKey, InternalTeTopology> {
386 @Override
387 public void event(MapEvent<TeTopologyKey, InternalTeTopology> event) {
388 Type type = null;
389 switch (event.type()) {
390 case INSERT:
391 type = TE_TOPOLOGY_ADDED;
392 break;
393 case UPDATE:
394 if (event.newValue().value().childUpdate()) {
395 // Masked by the child events (e.g. Removal)
396 break;
397 }
398 type = TE_TOPOLOGY_UPDATED;
399 break;
400 case REMOVE:
401 type = TE_TOPOLOGY_REMOVED;
402 break;
403 default:
404 log.error("Unsupported event type: {}", event.type());
405 }
406 if (type != null) {
407 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
408 mapEvent.setTeTopologyKey(event.key());
409 try {
410 mapEventQueue.put(mapEvent);
411 } catch (InterruptedException e) {
412 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800413 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500414 }
415 }
416 }
417 }
418
419 /**
420 * Listener class to map listener map events to the network events.
421 */
422 private class InternalNetworkListener implements MapEventListener<KeyId, InternalNetwork> {
423 @Override
424 public void event(MapEvent<KeyId, InternalNetwork> event) {
425 Type type = null;
426 switch (event.type()) {
427 case INSERT:
428 type = NETWORK_ADDED;
429 break;
430 case UPDATE:
431 if (event.newValue().value().childUpdate()) {
432 // Masked by the child events (e.g. Removal)
433 break;
434 }
435 type = NETWORK_UPDATED;
436 break;
437 case REMOVE:
438 type = NETWORK_REMOVED;
439 break;
440 default:
441 log.error("Unsupported event type: {}", event.type());
442 }
443 if (type != null) {
444 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
445 mapEvent.setNetworkKey(event.key());
446 try {
447 mapEventQueue.put(mapEvent);
448 } catch (InterruptedException e) {
449 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800450 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500451 }
452 }
453 }
454 }
455
456 /**
457 * Listener class to map listener map events to the TENODE events.
458 */
459 private class InternalTeNodeListener implements MapEventListener<TeNodeKey, InternalTeNode> {
460 @Override
461 public void event(MapEvent<TeNodeKey, InternalTeNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500462 Type type = null;
463 switch (event.type()) {
464 case INSERT:
465 if (event.newValue().value().parentUpdate()) {
466 // Masked by the parent event (e.g. Add)
467 break;
468 }
469 type = TE_NODE_ADDED;
470 break;
471 case UPDATE:
472 if (event.newValue().value().childUpdate() ||
473 event.newValue().value().parentUpdate()) {
474 // Masked by the child event (e.g. Removal) or parent event
475 break;
476 }
477 type = TE_NODE_UPDATED;
478 break;
479 case REMOVE:
480 type = TE_NODE_REMOVED;
481 break;
482 default:
483 log.error("Unsupported event type: {}", event.type());
484 }
485 if (type != null) {
486 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
487 mapEvent.setTeNodeKey(event.key());
488 try {
489 mapEventQueue.put(mapEvent);
490 } catch (InterruptedException e) {
491 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800492 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500493 }
494 }
495 }
496 }
497
498 /**
499 * Listener class to map listener map events to the NETWORK NODE events.
500 */
501 private class InternalNetworkNodeListener implements MapEventListener<NetworkNodeKey, InternalNetworkNode> {
502 @Override
503 public void event(MapEvent<NetworkNodeKey, InternalNetworkNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500504 Type type = null;
505 switch (event.type()) {
506 case INSERT:
507 if (event.newValue().value().parentUpdate()) {
508 // Masked by the parent event (e.g. Add)
509 break;
510 }
511 type = NODE_ADDED;
512 break;
513 case UPDATE:
514 if (event.newValue().value().childUpdate() ||
515 event.newValue().value().parentUpdate()) {
516 // Masked by the child event (e.g. Removal) or parent event
517 break;
518 }
519 type = NODE_UPDATED;
520 break;
521 case REMOVE:
522 type = NODE_REMOVED;
523 break;
524 default:
525 log.error("Unsupported event type: {}", event.type());
526 }
527 if (type != null) {
528 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
529 mapEvent.setNetworkNodeKey(event.key());
530 try {
531 mapEventQueue.put(mapEvent);
532 } catch (InterruptedException e) {
533 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800534 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500535 }
536 }
537 }
538 }
539
540 /**
541 * Listener class to map listener map events to the TELINK events.
542 */
543 private class InternalTeLinkListener implements MapEventListener<TeLinkTpGlobalKey, InternalTeLink> {
544 @Override
545 public void event(MapEvent<TeLinkTpGlobalKey, InternalTeLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500546 Type type = null;
547 switch (event.type()) {
548 case INSERT:
549 if (event.newValue().value().parentUpdate()) {
550 // Masked by the parent event (e.g. Add)
551 break;
552 }
553 type = TE_LINK_ADDED;
554 break;
555 case UPDATE:
556 if (event.newValue().value().parentUpdate()) {
557 // Masked by parent event
558 break;
559 }
560 type = TE_LINK_UPDATED;
561 break;
562 case REMOVE:
563 type = TE_LINK_REMOVED;
564 break;
565 default:
566 log.error("Unsupported event type: {}", event.type());
567 }
568 if (type != null) {
569 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
570 mapEvent.setTeLinkKey(event.key());
571 try {
572 mapEventQueue.put(mapEvent);
573 } catch (InterruptedException e) {
574 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800575 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500576 }
577 }
578 }
579 }
580
581 /**
582 * Listener class to map listener map events to the NETWORK LINK events.
583 */
584 private class InternalNetworkLinkListener implements MapEventListener<NetworkLinkKey, InternalNetworkLink> {
585 @Override
586 public void event(MapEvent<NetworkLinkKey, InternalNetworkLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500587 Type type = null;
588 switch (event.type()) {
589 case INSERT:
590 if (event.newValue().value().parentUpdate()) {
591 // Masked by the parent event (e.g. Add)
592 break;
593 }
594 type = LINK_ADDED;
595 break;
596 case UPDATE:
597 if (event.newValue().value().parentUpdate()) {
598 // Masked by the child event (e.g. Removal) or parent event
599 break;
600 }
601 type = LINK_UPDATED;
602 break;
603 case REMOVE:
604 type = LINK_REMOVED;
605 break;
606 default:
607 log.error("Unsupported event type: {}", event.type());
608 }
609 if (type != null) {
610 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
611 mapEvent.setNetworkLinkKey(event.key());
612 try {
613 mapEventQueue.put(mapEvent);
614 } catch (InterruptedException e) {
615 log.warn("Unable to queue event {} ", mapEvent, e);
Ray Milkey5c7d4882018-02-05 14:50:39 -0800616 Thread.currentThread().interrupt();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500617 }
618 }
619 }
620 }
621
622 @Override
623 public TeTopologies teTopologies() {
624 Map<TeTopologyKey, TeTopology> teTopologies = Maps.newHashMap();
625 if (MapUtils.isNotEmpty(teTopologyMap)) {
626 for (TeTopologyKey key : teTopologyMap.keySet()) {
627 teTopologies.put(key, teTopology(key));
628 }
629 }
630 return new DefaultTeTopologies(STORE_NAME, teTopologies);
631 }
632
633 private TeTopology teTopology(TeTopologyKey topologyId,
634 InternalTeTopology intTopology) {
635 if (intTopology == null) {
636 return null;
637 }
638 Map<Long, TeNode> teNodes = null;
639 if (CollectionUtils.isNotEmpty(intTopology.teNodeKeys())) {
640 teNodes = Maps.newHashMap();
641 for (TeNodeKey key : intTopology.teNodeKeys()) {
642 teNodes.put(key.teNodeId(), teNode(key));
643 }
644 }
645 Map<TeLinkTpKey, TeLink> teLinks = null;
646 if (CollectionUtils.isNotEmpty(intTopology.teLinkKeys())) {
647 teLinks = Maps.newHashMap();
648 for (TeLinkTpGlobalKey key : intTopology.teLinkKeys()) {
649 teLinks.put(key.teLinkTpKey(), teLink(key));
650 }
651 }
652 return new DefaultTeTopology(topologyId, teNodes, teLinks,
653 intTopology.teTopologyId(), intTopology.topologyData());
654 }
655
656 @Override
657 public TeTopology teTopology(TeTopologyKey topologyId) {
658 InternalTeTopology intTopology = teTopologyMap.get(topologyId);
659 return teTopology(topologyId, intTopology);
660 }
661
662 private void removeTopologyeMapEntrys(InternalTeTopology curTopology) {
663 // Remove TE nodes
664 if (CollectionUtils.isNotEmpty(curTopology.teNodeKeys())) {
665 for (TeNodeKey key : curTopology.teNodeKeys()) {
666 removeTeNode(key, true);
667 }
668 }
669 // Remove TE Links
670 if (CollectionUtils.isNotEmpty(curTopology.teLinkKeys())) {
671 for (TeLinkTpGlobalKey key : curTopology.teLinkKeys()) {
672 removeTeLink(key, true);
673 }
674 }
675 }
676
677 @Override
678 public void updateTeTopology(TeTopology teTopology) {
679 InternalTeTopology curTopology = teTopologyMap.get(teTopology.teTopologyId());
680 // Update TE nodes
681 List<NetworkNodeKey> nodeIds = null;
682 if (MapUtils.isNotEmpty(teTopology.teNodes())) {
683 nodeIds = Lists.newArrayList();
684 for (Map.Entry<Long, TeNode> entry : teTopology.teNodes().entrySet()) {
685 TeNodeKey teNodeKey = new TeNodeKey(teTopology.teTopologyId(), entry.getKey());
686 NetworkNodeKey nodeKey = TeMgrUtil.networkNodeKey(teNodeKey);
687 updateTeNode(teNodeKey, entry.getValue(), true, true, nodeKey);
688 nodeIds.add(nodeKey);
689 }
690 }
691 // Update TE links
692 List<NetworkLinkKey> linkIds = null;
693 if (MapUtils.isNotEmpty(teTopology.teLinks())) {
694 linkIds = Lists.newArrayList();
695 for (Map.Entry<TeLinkTpKey, TeLink> entry : teTopology.teLinks().entrySet()) {
696 TeLinkTpGlobalKey teLinkKey = new TeLinkTpGlobalKey(teTopology.teTopologyId(),
697 entry.getKey());
698 NetworkLinkKey linkKey = TeMgrUtil.networkLinkKey(teLinkKey);
699 updateTeLink(teLinkKey, entry.getValue(), true, true, linkKey);
700 linkIds.add(linkKey);
701 }
702 }
703 // Finally Update teTopologyMap
704 InternalTeTopology newTopology = new InternalTeTopology(teTopology);
705 teTopologyMap.put(teTopology.teTopologyId(), newTopology);
706
707 if (curTopology == null) {
708 // New topology, update networkMap
709 InternalNetwork intNetwork = new InternalNetwork();
710 intNetwork.setServerProvided(false);
711 intNetwork.setTeTopologyKey(teTopology.teTopologyId());
712 intNetwork.setNodeIds(nodeIds);
713 intNetwork.setLinkIds(linkIds);
714 networkMap.put(teTopology.networkId(), intNetwork);
715 }
716 }
717
718 @Override
719 public void removeTeTopology(TeTopologyKey topologyId) {
720 // Remove it from teTopologyMap
721 InternalTeTopology topology = teTopologyMap.remove(topologyId);
722 if (topology != null) {
723 removeTopologyeMapEntrys(topology);
724 // Remove it from networkMap;
725 networkMap.remove(topology.topologyData().networkId());
726 }
727 }
728
729 @Override
730 public List<Network> networks() {
731 if (MapUtils.isEmpty(networkMap)) {
732 return null;
733 }
734 List<Network> networks = Lists.newArrayList();
735 for (KeyId networkId : networkMap.keySet()) {
736 networks.add(network(networkId));
737 }
738 return networks;
739 }
740
741 private Network network(KeyId networkId, InternalNetwork curNetwork) {
742 if (curNetwork == null) {
743 return null;
744 }
745 List<KeyId> supportingNetworkIds = curNetwork.supportingNetworkIds();
746 Map<KeyId, NetworkNode> nodes = null;
747 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
748 nodes = Maps.newHashMap();
749 for (NetworkNodeKey key : curNetwork.nodeIds()) {
750 nodes.put(key.nodeId(), networkNode(key));
751 }
752 }
753 Map<KeyId, NetworkLink> links = null;
754 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
755 links = Maps.newHashMap();
756 for (NetworkLinkKey key : curNetwork.linkIds()) {
757 links.put(key.linkId(), networkLink(key));
758 }
759 }
760 TeTopologyId topologyId = null;
761 DeviceId ownerId = null;
Aihua Guo0bc12092017-02-10 09:53:55 -0500762 OptimizationType opt = NOT_OPTIMIZED;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500763 if (curNetwork.teTopologyKey() != null &&
764 teTopologyMap.get(curNetwork.teTopologyKey()) != null) {
765 topologyId = new TeTopologyId(curNetwork.teTopologyKey().providerId(),
766 curNetwork.teTopologyKey().clientId(),
Aihua Guo0bc12092017-02-10 09:53:55 -0500767 teTopologyMap.get(curNetwork.teTopologyKey())
Yixiao Chen68bfab22016-11-11 11:04:10 -0500768 .teTopologyId());
769 ownerId = teTopologyMap.get(curNetwork.teTopologyKey())
770 .topologyData().ownerId();
Aihua Guo0bc12092017-02-10 09:53:55 -0500771 opt = teTopologyMap.get(curNetwork.teTopologyKey()).topologyData().optimization();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500772 }
773 return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
Aihua Guo0bc12092017-02-10 09:53:55 -0500774 topologyId, curNetwork.serverProvided(), ownerId, opt);
Yixiao Chen68bfab22016-11-11 11:04:10 -0500775 }
776
777 @Override
778 public Network network(KeyId networkId) {
779 InternalNetwork curNetwork = networkMap.get(networkId);
780 return network(networkId, curNetwork);
781 }
782
783 private void removeNetworkMapEntrys(InternalNetwork curNetwork, boolean teRemove) {
784 // Remove TE nodes
785 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
786 for (NetworkNodeKey key : curNetwork.nodeIds()) {
787 removeNetworkNode(key, teRemove);
788 }
789 }
790 // Remove TE Links
791 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
792 for (NetworkLinkKey key : curNetwork.linkIds()) {
793 removeNetworkLink(key, teRemove);
794 }
795 }
796 }
797
798 private TeTopologyKey newTeTopologyKey(TeTopologyId teTopologyId) {
799 long idValue;
800 try {
801 idValue = Long.parseLong(teTopologyId.topologyId());
802 } catch (NumberFormatException e) {
803 // Can't get the long value from the string.
804 // Use an assigned id value from local id pool,
805 // Ideally id should be assigned per provider base.
806 idValue = nextTeTopologyId();
807 }
808 return new TeTopologyKey(teTopologyId.providerId(), teTopologyId.clientId(), idValue);
809 }
810
811 @Override
812 public void updateNetwork(Network network) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500813 log.debug("updateNetwork {}", network);
Yixiao Chen68bfab22016-11-11 11:04:10 -0500814 InternalNetwork curNetwork = networkMap.get(network.networkId());
815 TeTopologyKey topoKey = null;
816 if (network.teTopologyId() != null) {
817 topoKey = newTeTopologyKey(network.teTopologyId());
818 }
819 // Update TE nodes
820 List<TeNodeKey> teNodeKeys = null;
821 if (MapUtils.isNotEmpty(network.nodes())) {
822 teNodeKeys = Lists.newArrayList();
823 for (Map.Entry<KeyId, NetworkNode> entry : network.nodes().entrySet()) {
824 NetworkNodeKey nodeKey = new NetworkNodeKey(network.networkId(), entry.getKey());
825 TeNodeKey teNodeKey = null;
826 if (topoKey != null && entry.getValue().teNode() != null) {
827 teNodeKey = new TeNodeKey(topoKey, entry.getValue().teNode().teNodeId());
828 }
829 updateNetworkNode(nodeKey, entry.getValue(), true, false, teNodeKey);
830 teNodeKeys.add(teNodeKey);
831 }
832 }
833 // Update TE links
834 List<TeLinkTpGlobalKey> teLinkKeys = null;
835 if (MapUtils.isNotEmpty(network.links())) {
836 teLinkKeys = Lists.newArrayList();
837 for (Map.Entry<KeyId, NetworkLink> entry : network.links().entrySet()) {
838 NetworkLinkKey linkKey = new NetworkLinkKey(network.networkId(), entry.getKey());
839 TeLinkTpGlobalKey teLinkKey = null;
840 if (topoKey != null && entry.getValue().teLink() != null) {
841 teLinkKey = new TeLinkTpGlobalKey(topoKey, entry.getValue().teLink().teLinkKey());
842 }
843 updateNetworkLink(linkKey, entry.getValue(), true, false, teLinkKey);
844 teLinkKeys.add(teLinkKey);
845 }
846 }
847
848 // New network, update TE Topology first
849 if (curNetwork == null) {
850 InternalTeTopology intTopo = new InternalTeTopology(network.teTopologyId().topologyId());
851 intTopo.setTeNodeKeys(teNodeKeys);
852 intTopo.setTeLinkKeys(teLinkKeys);
853 BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS);
854 flags.set(TeTopology.BIT_LEARNT);
Yixiao Chen29f06332016-12-07 16:14:29 -0500855 if (network.teTopologyId().clientId() == providerId) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500856 // Hard rule for now
857 flags.set(TeTopology.BIT_CUSTOMIZED);
858 }
859 CommonTopologyData common = new CommonTopologyData(network.networkId(),
Aihua Guo0bc12092017-02-10 09:53:55 -0500860 network.optimization(),
861 flags,
862 network.ownerId());
Yixiao Chen68bfab22016-11-11 11:04:10 -0500863 intTopo.setTopologydata(common);
864 teTopologyMap.put(topoKey, intTopo);
865 }
866 // Finally Update networkMap
867 InternalNetwork newNetwork = new InternalNetwork(network);
868 newNetwork.setTeTopologyKey(topoKey);
869 networkMap.put(network.networkId(), newNetwork);
870 }
871
872 @Override
873 public void removeNetwork(KeyId networkId) {
874 // Remove it from networkMap
875 InternalNetwork network = networkMap.remove(networkId);
876 if (network != null && network.teTopologyKey() != null) {
877 removeNetworkMapEntrys(network, false);
878 teTopologyMap.remove(network.teTopologyKey());
879 }
880 }
881
882 private TeNode teNode(TeNodeKey nodeKey, InternalTeNode intNode) {
883 if (intNode == null) {
884 return null;
885 }
886 Map<Long, ConnectivityMatrix> connMatrices = null;
887 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
888 connMatrices = Maps.newHashMap();
889 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
890 connMatrices.put(key.entryId(), connMatrixMap.get(key));
891 }
892 }
893 List<Long> teLinkIds = null;
894 if (CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
895 teLinkIds = Lists.newArrayList();
896 for (TeLinkTpGlobalKey key : intNode.teLinkTpKeys()) {
897 teLinkIds = TeUtils.addListElement(teLinkIds, key.teLinkTpId());
898 }
899 }
900 List<Long> tps = null;
901 if (CollectionUtils.isNotEmpty(intNode.teTpKeys())) {
902 tps = Lists.newArrayList();
903 for (TeLinkTpGlobalKey key : intNode.teTpKeys()) {
904 tps = TeUtils.addListElement(tps, key.teLinkTpId());
905 }
906 }
907 Map<Long, TunnelTerminationPoint> ttps = null;
908 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
909 ttps = Maps.newHashMap();
910 for (TtpKey key : intNode.ttpKeys()) {
911 ttps.put(key.ttpId(), ttpMap.get(key));
912 }
913 }
914 return new DefaultTeNode(nodeKey.teNodeId(),
915 intNode.underlayTopologyKey(),
916 intNode.supportNodeKey(),
917 intNode.sourceTeNodeKey(),
918 intNode.teData(),
919 connMatrices, teLinkIds, ttps, tps);
920 }
921
922 @Override
923 public TeNode teNode(TeNodeKey nodeKey) {
924 InternalTeNode intNode = teNodeMap.get(nodeKey);
925 return teNode(nodeKey, intNode);
926 }
927
928 private void removeTeNodeMapEntrys(InternalTeNode intNode) {
929 // Remove connMatrixMap entries for the node
930 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
931 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
932 connMatrixMap.remove(key);
933 }
934 }
935 // Remove ttpMap entries for the node
936 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
937 for (TtpKey key : intNode.ttpKeys()) {
938 ttpMap.remove(key);
939 }
940 }
941 }
942
943 private void updateTeNode(TeNodeKey nodeKey, TeNode node, boolean parentUpdate,
944 boolean teNodeUpdate, NetworkNodeKey networkNodeKey) {
945 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
946 if (intTopo == null && !parentUpdate) {
947 log.error("TE Topology is not in dataStore for nodeUpdate {}", nodeKey);
948 return;
949 }
950 InternalTeNode curNode = teNodeMap.get(nodeKey);
951 // Update connMatrixMap
952 if (MapUtils.isNotEmpty(node.connectivityMatrices())) {
953 for (Map.Entry<Long, ConnectivityMatrix> entry : node.connectivityMatrices().entrySet()) {
954 connMatrixMap.put(new ConnectivityMatrixKey(nodeKey, entry.getKey()),
955 entry.getValue());
956 }
957 }
958 // Update ttpMap
959 if (MapUtils.isNotEmpty(node.tunnelTerminationPoints())) {
960 for (Map.Entry<Long, TunnelTerminationPoint> entry : node.tunnelTerminationPoints().entrySet()) {
961 ttpMap.put(new TtpKey(nodeKey, entry.getKey()), entry.getValue());
962 }
963 }
964 // Update teNodeMap
965 InternalTeNode intNode = new InternalTeNode(nodeKey, node, networkNodeKey, parentUpdate);
966 teNodeMap.put(nodeKey, intNode);
967 if (curNode == null && !parentUpdate && intTopo != null) {
968 // Update InternalTeTopology
969 intTopo.setChildUpdate(true);
970 TeUtils.addListElement(intTopo.teNodeKeys(), nodeKey);
971 }
972 // Update networkNodeMap
973 if (teNodeUpdate) {
974 updateNetworkNode(networkNodeKey, networkNode(node), parentUpdate,
975 teNodeUpdate, nodeKey);
976 }
977 }
978
979 private NetworkNode networkNode(TeNode node) {
980 KeyId nodeId = KeyId.keyId(Long.toString(node.teNodeId()));
981 List<NetworkNodeKey> supportingNodeIds = null;
982 if (node.supportingTeNodeId() != null) {
983 supportingNodeIds = Lists.newArrayList();
984 supportingNodeIds.add(new NetworkNodeKey(
985 TeMgrUtil.toNetworkId((node.supportingTeNodeId().teTopologyKey())),
986 KeyId.keyId(Long.toString(node.supportingTeNodeId().teNodeId()))));
987 }
988 Map<KeyId, TerminationPoint> tps = null;
989 if (node.teTerminationPointIds() != null) {
990 tps = Maps.newHashMap();
991 for (Long teTpId : node.teTerminationPointIds()) {
992 tps.put(KeyId.keyId(Long.toString(teTpId)),
993 new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)),
994 null, teTpId));
995 }
996 }
997 return new DefaultNetworkNode(nodeId, supportingNodeIds, node, tps);
998 }
999
1000 @Override
1001 public void updateTeNode(TeNodeKey nodeKey, TeNode node) {
1002 updateTeNode(nodeKey, node, false, true, TeMgrUtil.networkNodeKey(nodeKey));
1003 }
1004
1005 private void removeTeNode(TeNodeKey nodeKey, boolean teNodeRemove) {
1006 // Remove it from InternalTeTopology first
1007 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
1008 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teNodeKeys())) {
1009 intTopo.setChildUpdate(true);
1010 intTopo.teNodeKeys().remove(nodeKey);
1011 }
1012 // Then remove it from teNodeMap
1013 InternalTeNode node = teNodeMap.remove(nodeKey);
Palash Kala1ddfea02017-04-12 13:20:02 +09001014
1015 if (node == null) {
1016 log.error("No node found for nodeKey {}", nodeKey);
1017 return;
1018 }
1019
Yixiao Chen68bfab22016-11-11 11:04:10 -05001020 removeTeNodeMapEntrys(node);
1021 // Remove it from networkNodeMap
1022 if (teNodeRemove && node != null) {
1023 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
1024 }
1025 }
1026
1027 @Override
1028 public void removeTeNode(TeNodeKey nodeKey) {
1029 removeTeNode(nodeKey, true);
1030 }
1031
1032 private NetworkNode networkNode(NetworkNodeKey nodeKey, InternalNetworkNode intNode) {
1033 if (intNode == null) {
1034 return null;
1035 }
1036 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
1037 for (KeyId tpId : intNode.tpIds()) {
1038 tps.put(tpId, terminationPoint(
1039 new TerminationPointKey(nodeKey, tpId)));
1040
1041 }
1042 return new DefaultNetworkNode(nodeKey.nodeId(), intNode.supportingNodeIds(),
1043 teNode(intNode.teNodeKey()), tps);
1044 }
1045
1046 @Override
1047 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
1048 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
1049 return networkNode(nodeKey, intNode);
1050 }
1051
1052 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
1053 boolean parentUpdate, boolean teNodeUpdate, TeNodeKey teNodeKey) {
1054 InternalNetwork intNework = null;
1055 if (!parentUpdate) {
1056 intNework = networkMap.get(nodeKey.networkId());
1057 if (intNework == null) {
1058 log.error("Network is not in dataStore for nodeUpdate {}", nodeKey);
1059 return;
1060 }
1061 }
1062
1063 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
1064 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
1065 // Remove the TerminationPoints first
1066 for (KeyId tpId : exNode.tpIds()) {
1067 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1068 }
1069 }
1070
1071 if (MapUtils.isNotEmpty(node.terminationPoints())) {
1072 // Update with new TerminationPoints
1073 for (Map.Entry<KeyId, TerminationPoint> entry : node.terminationPoints().entrySet()) {
1074 updateTerminationPoint(new TerminationPointKey(nodeKey, entry.getKey()),
1075 entry.getValue(), parentUpdate, teNodeKey);
1076 }
1077 }
1078
1079 // Update teNodeMap first
1080 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
1081 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate, nodeKey);
1082 }
1083 // Update networkNodeMap
1084 InternalNetworkNode intNode = new InternalNetworkNode(node, parentUpdate);
1085 intNode.setTeNodeKey(teNodeKey);
1086 networkNodeMap.put(nodeKey, intNode);
1087 if (exNode == null && !parentUpdate && intNework != null) {
1088 // Update the InternalNetwork
1089 intNework.setChildUpdate(true);
1090 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
1091 }
1092 }
1093
1094 @Override
1095 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
1096 TeNodeKey teNodeKey = null;
1097 if (node.teNode() != null) {
1098 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId()).teTopologyKey(),
1099 node.teNode().teNodeId());
1100 }
1101 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
1102 }
1103
1104 private void removeNetworkNode(NetworkNodeKey nodeKey, boolean teNodeRemove) {
1105 // Update the InternalNetwork
1106 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
1107 if (intNework != null && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
1108 intNework.setChildUpdate(true);
Ray Milkeyfa6002c2018-01-19 15:50:37 -08001109 intNework.nodeIds().remove(nodeKey);
Yixiao Chen68bfab22016-11-11 11:04:10 -05001110 }
1111 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
1112 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1113 // Remove the TerminationPoints first
1114 for (KeyId tpId : intNode.tpIds()) {
1115 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1116 }
1117 }
1118 if (!teNodeRemove && intNode != null) {
1119 // Now remove it from teNodeMap
1120 removeTeNode(intNode.teNodeKey(), teNodeRemove);
1121 }
1122 }
1123
1124 @Override
1125 public void removeNetworkNode(NetworkNodeKey nodeKey) {
1126 removeNetworkNode(nodeKey, false);
1127 }
1128
1129 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
1130 if (intLink == null) {
1131 return null;
1132 }
1133 return new DefaultTeLink(linkKey.teLinkTpKey(),
1134 intLink.peerTeLinkKey(),
1135 intLink.underlayTopologyKey(),
1136 intLink.supportingLinkKey(),
1137 intLink.sourceTeLinkKey(),
1138 intLink.teData());
1139 }
1140
1141 @Override
1142 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
1143 InternalTeLink intLink = teLinkMap.get(linkKey);
1144 return teLink(linkKey, intLink);
1145 }
1146
1147 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
1148 boolean parentUpdate, boolean teLinkUpdate, NetworkLinkKey networkLinkKey) {
1149 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1150 if (intTopo == null && !parentUpdate) {
1151 log.error("TE Topology is not in dataStore for linkUpdate {}", linkKey);
1152 return;
1153 }
1154 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1155 if (intNode == null && !parentUpdate) {
1156 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
1157 return;
1158 }
1159 InternalTeLink exLink = teLinkMap.get(linkKey);
1160
1161 // Update teLinkMap
1162 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
1163 intLink.setNetworkLinkKey(networkLinkKey);
1164 teLinkMap.put(linkKey, intLink);
1165 if (exLink == null && !parentUpdate) {
1166 if (intTopo != null) {
1167 // Update the InternalTeTopology
1168 intTopo.setChildUpdate(true);
1169 intTopo.setTeLinkKeys(TeUtils.addListElement(intTopo.teLinkKeys(), linkKey));
1170 }
1171 if (intNode != null) {
1172 // Update the InternalNode
1173 intNode.setChildUpdate(true);
1174 intNode.setTeLinkTpKeys(TeUtils.addListElement(intNode.teLinkTpKeys(), linkKey));
1175 }
1176 }
1177
1178 // Update networkLinkMap
1179 if (teLinkUpdate) {
1180 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
1181 teLinkUpdate, linkKey);
1182 }
1183 }
1184
1185 private NetworkLink networkLink(TeLink link) {
1186 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
1187 NodeTpKey source = null;
1188 if (link.teLinkKey() != null) {
1189 source = new NodeTpKey(KeyId.keyId(Long.toString(link.teLinkKey().teNodeId())),
1190 KeyId.keyId(Long.toString(link.teLinkKey().teLinkTpId())));
1191 }
1192 NodeTpKey dest = null;
1193 if (link.peerTeLinkKey() != null) {
1194 dest = new NodeTpKey(KeyId.keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
1195 KeyId.keyId(Long.toString(link.peerTeLinkKey().teLinkTpId())));
1196 }
1197 List<NetworkLinkKey> supportingLinkIds = null;
1198 if (link.supportingTeLinkId() != null) {
1199 supportingLinkIds = Lists.newArrayList();
1200 supportingLinkIds.add(new NetworkLinkKey(
1201 TeMgrUtil.toNetworkId(link.supportingTeLinkId().teTopologyKey()),
1202 TeMgrUtil.toNetworkLinkId(link.supportingTeLinkId().teLinkTpKey())));
1203 }
1204 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds, link);
1205 }
1206
1207 @Override
1208 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
1209 updateTeLink(linkKey, link, false, true, TeMgrUtil.networkLinkKey(linkKey));
1210 }
1211
1212 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
1213 // Remove it from InternalTeTopology first
1214 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1215 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
1216 intTopo.setChildUpdate(true);
1217 intTopo.teLinkKeys().remove(linkKey);
1218 }
1219 // Remove it from InternalTeNode
1220 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1221 if (intNode != null && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
1222 intNode.setChildUpdate(true);
1223 intNode.teLinkTpKeys().remove(linkKey);
1224 }
1225 // Then remove it from teLinkMap
1226 InternalTeLink link = teLinkMap.remove(linkKey);
1227 if (teLinkRemove && link != null) {
1228 // Remove it from networkLinkMap
1229 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
1230 }
1231 }
1232
1233 @Override
1234 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
1235 removeTeLink(linkKey, true);
1236 }
1237
1238 private NetworkLink networkLink(NetworkLinkKey linkKey, InternalNetworkLink intLink) {
1239 if (intLink == null) {
1240 return null;
1241 }
1242 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
1243 intLink.destination(), intLink.supportingLinkIds(), teLink(intLink.teLinkKey()));
1244 }
1245
1246 @Override
1247 public NetworkLink networkLink(NetworkLinkKey linkKey) {
1248 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
1249 return networkLink(linkKey, intLink);
1250 }
1251
1252 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
1253 boolean parentUpdate, boolean teLinkUpdate, TeLinkTpGlobalKey teLinkKey) {
1254 InternalNetwork intNework = null;
1255 if (!parentUpdate) {
1256 intNework = networkMap.get(linkKey.networkId());
1257 if (intNework == null) {
1258 log.error("Network is not in dataStore for linkUpdate {}", linkKey);
1259 return;
1260 }
1261 }
1262
1263 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
1264
1265 // Now update teLinkMap first
1266 if (!teLinkUpdate && teLinkKey != null) {
1267 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate, linkKey);
1268 }
1269 // Update networkLinkMap
1270 InternalNetworkLink intLink = new InternalNetworkLink(link, parentUpdate);
1271 intLink.setTeLinkKey(teLinkKey);
1272 networkLinkMap.put(linkKey, intLink);
1273 if (exLink == null && !parentUpdate && intNework != null) {
1274 // Update the InternalNetwork
1275 intNework.setChildUpdate(true);
1276 TeUtils.addListElement(intNework.linkIds(), linkKey);
1277 }
1278 }
1279
1280 @Override
1281 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
1282 TeLinkTpGlobalKey teLinkKey = null;
1283 if (link.teLink() != null) {
1284 teLinkKey = new TeLinkTpGlobalKey(networkMap.get(linkKey.networkId()).teTopologyKey(),
1285 link.teLink().teLinkKey());
1286 }
1287
1288 updateNetworkLink(linkKey, link, false, false, teLinkKey);
1289 }
1290
1291 private void removeNetworkLink(NetworkLinkKey linkKey, boolean teLinkRemove) {
1292 // Update the InternalNetwork
1293 InternalNetwork intNework = networkMap.get(linkKey.networkId());
1294 if (intNework != null && CollectionUtils.isNotEmpty(intNework.linkIds())) {
1295 intNework.setChildUpdate(true);
Ray Milkeyfa6002c2018-01-19 15:50:37 -08001296 intNework.linkIds().remove(linkKey);
Yixiao Chen68bfab22016-11-11 11:04:10 -05001297 }
1298 // Remove it from networkLinkMap
1299 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
1300 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
1301 // Now remove it from teLinkMap
1302 removeTeLink(intLink.teLinkKey(), teLinkRemove);
1303 }
1304 }
1305
1306 @Override
1307 public void removeNetworkLink(NetworkLinkKey linkKey) {
1308 removeNetworkLink(linkKey, false);
1309 }
1310
1311 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
1312 InternalTerminationPoint intTp = tpMap.get(tpKey);
1313 if (intTp == null) {
1314 return null;
1315 }
1316 return new DefaultTerminationPoint(tpKey.tpId(), intTp.supportingTpIds(),
1317 intTp.teTpKey().teLinkTpId());
1318 }
1319
1320 private void updateTerminationPoint(TerminationPointKey tpKey,
1321 TerminationPoint tp, boolean parentUpdate, TeNodeKey teNodeKey) {
1322 TeNodeKey myTeNodeKey;
1323 InternalNetworkNode intNode = null;
1324 if (!parentUpdate) {
Yuta HIGUCHI488a94c2018-01-26 17:24:09 -08001325 intNode = networkNodeMap.get(tpKey);
Yixiao Chen68bfab22016-11-11 11:04:10 -05001326 if (intNode == null) {
1327 log.error(" node is not in dataStore for tp update {}", tpKey);
1328 return;
1329 }
1330 myTeNodeKey = intNode.teNodeKey();
1331 } else {
1332 myTeNodeKey = teNodeKey;
1333 }
1334 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey, tp.teTpId());
1335
1336 boolean newTp = tpMap.get(tpKey) == null;
1337 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
1338 intTp.setTeTpKey(teTpKey);
1339 tpMap.put(tpKey, intTp);
1340 if (newTp) {
1341 // Update tpKeyMap
1342 tpKeyMap.put(teTpKey, tpKey);
1343 if (!parentUpdate && intNode != null) {
1344 // Update InternalNetworkNode
1345 intNode.setChildUpdate(true);
1346 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(), tpKey.tpId()));
1347 }
1348 }
1349 }
1350
1351 @Override
1352 public void updateTerminationPoint(TerminationPointKey tpKey,
1353 TerminationPoint tp) {
1354 updateTerminationPoint(tpKey, tp, false, null);
1355 }
1356
1357 @Override
1358 public void removeTerminationPoint(TerminationPointKey tpKey) {
1359 // Update InternalNetworkNode
Yuta HIGUCHI488a94c2018-01-26 17:24:09 -08001360 InternalNetworkNode intNode = networkNodeMap.get(tpKey);
Yixiao Chen68bfab22016-11-11 11:04:10 -05001361 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1362 intNode.setChildUpdate(true);
1363 intNode.tpIds().remove(tpKey.tpId());
1364 }
1365 // Remove it from tpMap
1366 InternalTerminationPoint tp = tpMap.remove(tpKey);
1367 // Remove it from tpKeyMap
1368 if (tp != null) {
1369 tpKeyMap.remove(tp.teTpKey());
1370 }
1371 }
1372
1373 @Override
1374 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
1375 return ttpMap.get(ttpId);
1376 }
1377
1378 @Override
1379 public long nextTeTopologyId() {
1380 return nextTeTopologyId.getAndIncrement();
1381 }
1382
1383 @Override
1384 public long nextTeNodeId(TeTopologyKey topoKey) {
1385 return teTopologyMap.get(topoKey).nextTeNodeId();
1386 }
1387
1388 @Override
1389 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1390 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1391 }
1392
1393 @Override
1394 public KeyId networkId(TeTopologyKey teTopologyKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001395 return teTopologyMap.get(teTopologyKey) == null ||
1396 teTopologyMap.get(teTopologyKey).topologyData() == null ? null :
1397 teTopologyMap.get(teTopologyKey).topologyData().networkId();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001398 }
1399
1400 @Override
1401 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001402 return teNodeMap.get(teNodeKey) == null ? null :
1403 teNodeMap.get(teNodeKey).networkNodeKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001404 }
1405
1406 @Override
1407 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001408 return teLinkMap.get(teLinkKey) == null ? null :
1409 teLinkMap.get(teLinkKey).networkLinkKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001410 }
1411
1412 @Override
1413 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1414 return tpKeyMap.get(teTpKey);
1415 }
1416
1417 @Override
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001418 public BlockingQueue<TeTopologyMapEvent> mapEventQueue() {
1419 return mapEventQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -05001420 }
Yixiao Chen29f06332016-12-07 16:14:29 -05001421
1422 @Override
1423 public void setProviderId(long providerId) {
1424 this.providerId = providerId;
1425 }
Yixiao Chen68bfab22016-11-11 11:04:10 -05001426}
1427