blob: 151df3d534c0420f000a573a00ff486245314deb [file] [log] [blame]
Yixiao Chen68bfab22016-11-11 11:04:10 -05001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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
18import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
19import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
20import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
21import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
22import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
23import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_UPDATED;
24import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
25import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
26import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
27import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
28import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
29import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
30import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
31import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
32import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
33import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
34import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
35import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_UPDATED;
36import static org.slf4j.LoggerFactory.getLogger;
37
38import java.util.BitSet;
39import java.util.List;
40import java.util.Map;
41import java.util.concurrent.BlockingQueue;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050042import java.util.concurrent.LinkedBlockingQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -050043
44import org.apache.commons.collections.CollectionUtils;
45import org.apache.commons.collections.MapUtils;
46import org.apache.felix.scr.annotations.Activate;
47import org.apache.felix.scr.annotations.Component;
48import org.apache.felix.scr.annotations.Deactivate;
49import org.apache.felix.scr.annotations.Reference;
50import org.apache.felix.scr.annotations.ReferenceCardinality;
51import org.apache.felix.scr.annotations.Service;
52import org.onlab.util.KryoNamespace;
53import org.onosproject.net.DeviceId;
54import org.onosproject.store.AbstractStore;
55import org.onosproject.store.serializers.KryoNamespaces;
56import org.onosproject.store.service.AtomicCounter;
57import org.onosproject.store.service.ConsistentMap;
58import org.onosproject.store.service.MapEvent;
59import org.onosproject.store.service.MapEventListener;
60import org.onosproject.store.service.Serializer;
61import org.onosproject.store.service.StorageService;
62import org.onosproject.tetopology.management.api.CommonTopologyData;
63import org.onosproject.tetopology.management.api.DefaultNetwork;
64import org.onosproject.tetopology.management.api.DefaultTeTopologies;
65import org.onosproject.tetopology.management.api.DefaultTeTopology;
66import org.onosproject.tetopology.management.api.EncodingType;
67import org.onosproject.tetopology.management.api.KeyId;
68import org.onosproject.tetopology.management.api.LongValue;
69import org.onosproject.tetopology.management.api.Network;
70import org.onosproject.tetopology.management.api.OptimizationType;
71import org.onosproject.tetopology.management.api.ProviderClientId;
72import org.onosproject.tetopology.management.api.SwitchingType;
73import org.onosproject.tetopology.management.api.TeConstants;
74import org.onosproject.tetopology.management.api.TeStatus;
75import org.onosproject.tetopology.management.api.TeTopologies;
76import org.onosproject.tetopology.management.api.TeTopology;
77import org.onosproject.tetopology.management.api.TeTopologyEvent;
78import org.onosproject.tetopology.management.api.TeTopologyEvent.Type;
79import org.onosproject.tetopology.management.api.TeTopologyId;
80import org.onosproject.tetopology.management.api.TeTopologyKey;
81import org.onosproject.tetopology.management.api.TeUtils;
82import org.onosproject.tetopology.management.api.link.AsNumber;
83import org.onosproject.tetopology.management.api.link.CommonLinkData;
Yixiao Chen29f06332016-12-07 16:14:29 -050084import org.onosproject.tetopology.management.api.link.ConnectivityMatrixId;
Yixiao Chen68bfab22016-11-11 11:04:10 -050085import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
86import org.onosproject.tetopology.management.api.link.DefaultTeLink;
87import org.onosproject.tetopology.management.api.link.ElementType;
88import org.onosproject.tetopology.management.api.link.ExternalLink;
89import org.onosproject.tetopology.management.api.link.Label;
90import org.onosproject.tetopology.management.api.link.LinkBandwidth;
91import org.onosproject.tetopology.management.api.link.NetworkLink;
92import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
93import org.onosproject.tetopology.management.api.link.OduResource;
94import org.onosproject.tetopology.management.api.link.PathElement;
95import org.onosproject.tetopology.management.api.link.TeIpv4;
96import org.onosproject.tetopology.management.api.link.TeIpv6;
97import org.onosproject.tetopology.management.api.link.TeLink;
Yixiao Chen29f06332016-12-07 16:14:29 -050098import org.onosproject.tetopology.management.api.link.TeLinkId;
Yixiao Chen68bfab22016-11-11 11:04:10 -050099import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
100import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
101import org.onosproject.tetopology.management.api.link.TePathAttributes;
102import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
103import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
104import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
105import org.onosproject.tetopology.management.api.link.UnderlayPath;
106import org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath;
107import org.onosproject.tetopology.management.api.link.UnnumberedLink;
108import org.onosproject.tetopology.management.api.node.CommonNodeData;
109import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
110import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
111import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
112import org.onosproject.tetopology.management.api.node.DefaultTeNode;
113import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
114import org.onosproject.tetopology.management.api.node.DefaultTunnelTerminationPoint;
115import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
116import org.onosproject.tetopology.management.api.node.NetworkNode;
117import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
118import org.onosproject.tetopology.management.api.node.NodeTpKey;
119import org.onosproject.tetopology.management.api.node.TeNode;
120import org.onosproject.tetopology.management.api.node.TeNodeKey;
121import org.onosproject.tetopology.management.api.node.TerminationPoint;
122import org.onosproject.tetopology.management.api.node.TerminationPointKey;
123import org.onosproject.tetopology.management.api.node.TtpKey;
124import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
125import org.slf4j.Logger;
126
127import com.esotericsoftware.kryo.serializers.JavaSerializer;
128import 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";
140 private static final String TETOPOLOGYKEY_INTERNALTETOPOLOGY = "TeTopologyKey-InternalTeTopology";
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500141 private static final String NETWORKID_NETWORK = "NetworkId-InternalNetwork";
Yixiao Chen68bfab22016-11-11 11:04:10 -0500142 private static final String TENODEKEY_INTERNALTENODE = "TeNodeKey-InternalTeNode";
143 private static final String CONNMATRIXKEY_CONNECTIVITYMATRIX = "ConnMatrixKey-ConnectivityMatrix";
144 private static final String NETWORKNODEKEY_INTERNALNETWORKNODE = "NetworkNodeKey-InternalNetworkNode";
145 private static final String TELINKGLOBALKEY_INTERNALTELINK = "TeLinkGlobalKey-InternalTeLink";
146 private static final String NETWORKLINKKEY_INTERNALNETWORKLINK = "NetworkLinkKey-InternalNetworkLink";
147 private static final String TPKEY_INTERNALTERMINATIONPOINT = "tpKey-InternalTerminationPoint";
148 private static final String TELINKTPGLOBALKEY_TERMINATIONPOINTKEY = "TeLinkGlobalKey-TerminationPointKey";
149 private static final String TTPKEY_TUNNELTERMINATIONPOINT = "TtpKey-TunnelTerminationPoint";
150 private final Logger log = getLogger(getClass());
151
152 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
153 protected StorageService storageService;
154 // Track TE topologies by TE Topology key
155 private ConsistentMap<TeTopologyKey, InternalTeTopology> teTopologyConsistentMap;
156 private Map<TeTopologyKey, InternalTeTopology> teTopologyMap;
157 private AtomicCounter nextTeTopologyId;
158 // Listener for te topology events
159 private final MapEventListener<TeTopologyKey, InternalTeTopology> teTopologyListener =
160 new InternalTeTopologyListener();
161 // Track networks by network Id
162 private ConsistentMap<KeyId, InternalNetwork> networkConsistentMap;
163 private Map<KeyId, InternalNetwork> networkMap;
164 // Listener for network events
165 private final MapEventListener<KeyId, InternalNetwork> networkListener =
166 new InternalNetworkListener();
167 // Track TE nodes by TE node key
168 private ConsistentMap<TeNodeKey, InternalTeNode> teNodeConsistentMap;
169 private Map<TeNodeKey, InternalTeNode> teNodeMap;
170 // Track ConnectivityMatrix by its key
171 private ConsistentMap<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixConsistentMap;
172 private Map<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixMap;
173 // Track Tunnel Termination Points by its key
174 private ConsistentMap<TtpKey, TunnelTerminationPoint> ttpConsistentMap;
175 private Map<TtpKey, TunnelTerminationPoint> ttpMap;
176 // Listener for TE node events
177 private final MapEventListener<TeNodeKey, InternalTeNode> teNodeListener =
178 new InternalTeNodeListener();
179 // Track network nodes by network node key
180 private ConsistentMap<NetworkNodeKey, InternalNetworkNode> networkNodeConsistentMap;
181 private Map<NetworkNodeKey, InternalNetworkNode> networkNodeMap;
182 // Listener for network node events
183 private final MapEventListener<NetworkNodeKey, InternalNetworkNode> networkNodeListener =
184 new InternalNetworkNodeListener();
185 // Track TE links by its key
186 private ConsistentMap<TeLinkTpGlobalKey, InternalTeLink> teLinkConsistentMap;
187 private Map<TeLinkTpGlobalKey, InternalTeLink> teLinkMap;
188 // Listener for te link events
189 private final MapEventListener<TeLinkTpGlobalKey, InternalTeLink> teLinkListener =
190 new InternalTeLinkListener();
191 // Track network links by network link key
192 private ConsistentMap<NetworkLinkKey, InternalNetworkLink> networkLinkConsistentMap;
193 private Map<NetworkLinkKey, InternalNetworkLink> networkLinkMap;
194 // Listener for network link events
195 private final MapEventListener<NetworkLinkKey, InternalNetworkLink> networkLinkListener =
196 new InternalNetworkLinkListener();
197 // Track Termination points by termination point key
198 private ConsistentMap<TerminationPointKey, InternalTerminationPoint> tpConsistentMap;
199 private Map<TerminationPointKey, InternalTerminationPoint> tpMap;
200 // Track termination point keys by TE termination point Key
201 private ConsistentMap<TeLinkTpGlobalKey, TerminationPointKey> tpKeyConsistentMap;
202 private Map<TeLinkTpGlobalKey, TerminationPointKey> tpKeyMap;
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500203 private final BlockingQueue<TeTopologyMapEvent> mapEventQueue = new LinkedBlockingQueue<>();
204
Yixiao Chen29f06332016-12-07 16:14:29 -0500205 private long providerId;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500206 private static final Serializer TETOPOLOGY_SERIALIZER = Serializer
207 .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
208 .register(TeTopologyKey.class)
209 .register(ProviderClientId.class)
210 .register(TeNodeKey.class)
211 .register(TeLinkTpGlobalKey.class)
212 .register(CommonTopologyData.class)
213 .register(KeyId.class)
214 .register(OptimizationType.class)
215 .register(new JavaSerializer(), BitSet.class)
216 .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
343 nextTeTopologyId = storageService.getAtomicCounter("COUNTER_NAME");
344 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);
413 }
414 }
415 }
416 }
417
418 /**
419 * Listener class to map listener map events to the network events.
420 */
421 private class InternalNetworkListener implements MapEventListener<KeyId, InternalNetwork> {
422 @Override
423 public void event(MapEvent<KeyId, InternalNetwork> event) {
424 Type type = null;
425 switch (event.type()) {
426 case INSERT:
427 type = NETWORK_ADDED;
428 break;
429 case UPDATE:
430 if (event.newValue().value().childUpdate()) {
431 // Masked by the child events (e.g. Removal)
432 break;
433 }
434 type = NETWORK_UPDATED;
435 break;
436 case REMOVE:
437 type = NETWORK_REMOVED;
438 break;
439 default:
440 log.error("Unsupported event type: {}", event.type());
441 }
442 if (type != null) {
443 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
444 mapEvent.setNetworkKey(event.key());
445 try {
446 mapEventQueue.put(mapEvent);
447 } catch (InterruptedException e) {
448 log.warn("Unable to queue event {} ", mapEvent, e);
449 }
450 }
451 }
452 }
453
454 /**
455 * Listener class to map listener map events to the TENODE events.
456 */
457 private class InternalTeNodeListener implements MapEventListener<TeNodeKey, InternalTeNode> {
458 @Override
459 public void event(MapEvent<TeNodeKey, InternalTeNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500460 Type type = null;
461 switch (event.type()) {
462 case INSERT:
463 if (event.newValue().value().parentUpdate()) {
464 // Masked by the parent event (e.g. Add)
465 break;
466 }
467 type = TE_NODE_ADDED;
468 break;
469 case UPDATE:
470 if (event.newValue().value().childUpdate() ||
471 event.newValue().value().parentUpdate()) {
472 // Masked by the child event (e.g. Removal) or parent event
473 break;
474 }
475 type = TE_NODE_UPDATED;
476 break;
477 case REMOVE:
478 type = TE_NODE_REMOVED;
479 break;
480 default:
481 log.error("Unsupported event type: {}", event.type());
482 }
483 if (type != null) {
484 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
485 mapEvent.setTeNodeKey(event.key());
486 try {
487 mapEventQueue.put(mapEvent);
488 } catch (InterruptedException e) {
489 log.warn("Unable to queue event {} ", mapEvent, e);
490 }
491 }
492 }
493 }
494
495 /**
496 * Listener class to map listener map events to the NETWORK NODE events.
497 */
498 private class InternalNetworkNodeListener implements MapEventListener<NetworkNodeKey, InternalNetworkNode> {
499 @Override
500 public void event(MapEvent<NetworkNodeKey, InternalNetworkNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500501 Type type = null;
502 switch (event.type()) {
503 case INSERT:
504 if (event.newValue().value().parentUpdate()) {
505 // Masked by the parent event (e.g. Add)
506 break;
507 }
508 type = NODE_ADDED;
509 break;
510 case UPDATE:
511 if (event.newValue().value().childUpdate() ||
512 event.newValue().value().parentUpdate()) {
513 // Masked by the child event (e.g. Removal) or parent event
514 break;
515 }
516 type = NODE_UPDATED;
517 break;
518 case REMOVE:
519 type = NODE_REMOVED;
520 break;
521 default:
522 log.error("Unsupported event type: {}", event.type());
523 }
524 if (type != null) {
525 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
526 mapEvent.setNetworkNodeKey(event.key());
527 try {
528 mapEventQueue.put(mapEvent);
529 } catch (InterruptedException e) {
530 log.warn("Unable to queue event {} ", mapEvent, e);
531 }
532 }
533 }
534 }
535
536 /**
537 * Listener class to map listener map events to the TELINK events.
538 */
539 private class InternalTeLinkListener implements MapEventListener<TeLinkTpGlobalKey, InternalTeLink> {
540 @Override
541 public void event(MapEvent<TeLinkTpGlobalKey, InternalTeLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500542 Type type = null;
543 switch (event.type()) {
544 case INSERT:
545 if (event.newValue().value().parentUpdate()) {
546 // Masked by the parent event (e.g. Add)
547 break;
548 }
549 type = TE_LINK_ADDED;
550 break;
551 case UPDATE:
552 if (event.newValue().value().parentUpdate()) {
553 // Masked by parent event
554 break;
555 }
556 type = TE_LINK_UPDATED;
557 break;
558 case REMOVE:
559 type = TE_LINK_REMOVED;
560 break;
561 default:
562 log.error("Unsupported event type: {}", event.type());
563 }
564 if (type != null) {
565 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
566 mapEvent.setTeLinkKey(event.key());
567 try {
568 mapEventQueue.put(mapEvent);
569 } catch (InterruptedException e) {
570 log.warn("Unable to queue event {} ", mapEvent, e);
571 }
572 }
573 }
574 }
575
576 /**
577 * Listener class to map listener map events to the NETWORK LINK events.
578 */
579 private class InternalNetworkLinkListener implements MapEventListener<NetworkLinkKey, InternalNetworkLink> {
580 @Override
581 public void event(MapEvent<NetworkLinkKey, InternalNetworkLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500582 Type type = null;
583 switch (event.type()) {
584 case INSERT:
585 if (event.newValue().value().parentUpdate()) {
586 // Masked by the parent event (e.g. Add)
587 break;
588 }
589 type = LINK_ADDED;
590 break;
591 case UPDATE:
592 if (event.newValue().value().parentUpdate()) {
593 // Masked by the child event (e.g. Removal) or parent event
594 break;
595 }
596 type = LINK_UPDATED;
597 break;
598 case REMOVE:
599 type = LINK_REMOVED;
600 break;
601 default:
602 log.error("Unsupported event type: {}", event.type());
603 }
604 if (type != null) {
605 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
606 mapEvent.setNetworkLinkKey(event.key());
607 try {
608 mapEventQueue.put(mapEvent);
609 } catch (InterruptedException e) {
610 log.warn("Unable to queue event {} ", mapEvent, e);
611 }
612 }
613 }
614 }
615
616 @Override
617 public TeTopologies teTopologies() {
618 Map<TeTopologyKey, TeTopology> teTopologies = Maps.newHashMap();
619 if (MapUtils.isNotEmpty(teTopologyMap)) {
620 for (TeTopologyKey key : teTopologyMap.keySet()) {
621 teTopologies.put(key, teTopology(key));
622 }
623 }
624 return new DefaultTeTopologies(STORE_NAME, teTopologies);
625 }
626
627 private TeTopology teTopology(TeTopologyKey topologyId,
628 InternalTeTopology intTopology) {
629 if (intTopology == null) {
630 return null;
631 }
632 Map<Long, TeNode> teNodes = null;
633 if (CollectionUtils.isNotEmpty(intTopology.teNodeKeys())) {
634 teNodes = Maps.newHashMap();
635 for (TeNodeKey key : intTopology.teNodeKeys()) {
636 teNodes.put(key.teNodeId(), teNode(key));
637 }
638 }
639 Map<TeLinkTpKey, TeLink> teLinks = null;
640 if (CollectionUtils.isNotEmpty(intTopology.teLinkKeys())) {
641 teLinks = Maps.newHashMap();
642 for (TeLinkTpGlobalKey key : intTopology.teLinkKeys()) {
643 teLinks.put(key.teLinkTpKey(), teLink(key));
644 }
645 }
646 return new DefaultTeTopology(topologyId, teNodes, teLinks,
647 intTopology.teTopologyId(), intTopology.topologyData());
648 }
649
650 @Override
651 public TeTopology teTopology(TeTopologyKey topologyId) {
652 InternalTeTopology intTopology = teTopologyMap.get(topologyId);
653 return teTopology(topologyId, intTopology);
654 }
655
656 private void removeTopologyeMapEntrys(InternalTeTopology curTopology) {
657 // Remove TE nodes
658 if (CollectionUtils.isNotEmpty(curTopology.teNodeKeys())) {
659 for (TeNodeKey key : curTopology.teNodeKeys()) {
660 removeTeNode(key, true);
661 }
662 }
663 // Remove TE Links
664 if (CollectionUtils.isNotEmpty(curTopology.teLinkKeys())) {
665 for (TeLinkTpGlobalKey key : curTopology.teLinkKeys()) {
666 removeTeLink(key, true);
667 }
668 }
669 }
670
671 @Override
672 public void updateTeTopology(TeTopology teTopology) {
673 InternalTeTopology curTopology = teTopologyMap.get(teTopology.teTopologyId());
674 // Update TE nodes
675 List<NetworkNodeKey> nodeIds = null;
676 if (MapUtils.isNotEmpty(teTopology.teNodes())) {
677 nodeIds = Lists.newArrayList();
678 for (Map.Entry<Long, TeNode> entry : teTopology.teNodes().entrySet()) {
679 TeNodeKey teNodeKey = new TeNodeKey(teTopology.teTopologyId(), entry.getKey());
680 NetworkNodeKey nodeKey = TeMgrUtil.networkNodeKey(teNodeKey);
681 updateTeNode(teNodeKey, entry.getValue(), true, true, nodeKey);
682 nodeIds.add(nodeKey);
683 }
684 }
685 // Update TE links
686 List<NetworkLinkKey> linkIds = null;
687 if (MapUtils.isNotEmpty(teTopology.teLinks())) {
688 linkIds = Lists.newArrayList();
689 for (Map.Entry<TeLinkTpKey, TeLink> entry : teTopology.teLinks().entrySet()) {
690 TeLinkTpGlobalKey teLinkKey = new TeLinkTpGlobalKey(teTopology.teTopologyId(),
691 entry.getKey());
692 NetworkLinkKey linkKey = TeMgrUtil.networkLinkKey(teLinkKey);
693 updateTeLink(teLinkKey, entry.getValue(), true, true, linkKey);
694 linkIds.add(linkKey);
695 }
696 }
697 // Finally Update teTopologyMap
698 InternalTeTopology newTopology = new InternalTeTopology(teTopology);
699 teTopologyMap.put(teTopology.teTopologyId(), newTopology);
700
701 if (curTopology == null) {
702 // New topology, update networkMap
703 InternalNetwork intNetwork = new InternalNetwork();
704 intNetwork.setServerProvided(false);
705 intNetwork.setTeTopologyKey(teTopology.teTopologyId());
706 intNetwork.setNodeIds(nodeIds);
707 intNetwork.setLinkIds(linkIds);
708 networkMap.put(teTopology.networkId(), intNetwork);
709 }
710 }
711
712 @Override
713 public void removeTeTopology(TeTopologyKey topologyId) {
714 // Remove it from teTopologyMap
715 InternalTeTopology topology = teTopologyMap.remove(topologyId);
716 if (topology != null) {
717 removeTopologyeMapEntrys(topology);
718 // Remove it from networkMap;
719 networkMap.remove(topology.topologyData().networkId());
720 }
721 }
722
723 @Override
724 public List<Network> networks() {
725 if (MapUtils.isEmpty(networkMap)) {
726 return null;
727 }
728 List<Network> networks = Lists.newArrayList();
729 for (KeyId networkId : networkMap.keySet()) {
730 networks.add(network(networkId));
731 }
732 return networks;
733 }
734
735 private Network network(KeyId networkId, InternalNetwork curNetwork) {
736 if (curNetwork == null) {
737 return null;
738 }
739 List<KeyId> supportingNetworkIds = curNetwork.supportingNetworkIds();
740 Map<KeyId, NetworkNode> nodes = null;
741 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
742 nodes = Maps.newHashMap();
743 for (NetworkNodeKey key : curNetwork.nodeIds()) {
744 nodes.put(key.nodeId(), networkNode(key));
745 }
746 }
747 Map<KeyId, NetworkLink> links = null;
748 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
749 links = Maps.newHashMap();
750 for (NetworkLinkKey key : curNetwork.linkIds()) {
751 links.put(key.linkId(), networkLink(key));
752 }
753 }
754 TeTopologyId topologyId = null;
755 DeviceId ownerId = null;
756 if (curNetwork.teTopologyKey() != null &&
757 teTopologyMap.get(curNetwork.teTopologyKey()) != null) {
758 topologyId = new TeTopologyId(curNetwork.teTopologyKey().providerId(),
759 curNetwork.teTopologyKey().clientId(),
760 teTopologyMap
761 .get(curNetwork
762 .teTopologyKey())
763 .teTopologyId());
764 ownerId = teTopologyMap.get(curNetwork.teTopologyKey())
765 .topologyData().ownerId();
766
767 }
768 return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
769 topologyId, curNetwork.serverProvided(), ownerId);
770 }
771
772 @Override
773 public Network network(KeyId networkId) {
774 InternalNetwork curNetwork = networkMap.get(networkId);
775 return network(networkId, curNetwork);
776 }
777
778 private void removeNetworkMapEntrys(InternalNetwork curNetwork, boolean teRemove) {
779 // Remove TE nodes
780 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
781 for (NetworkNodeKey key : curNetwork.nodeIds()) {
782 removeNetworkNode(key, teRemove);
783 }
784 }
785 // Remove TE Links
786 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
787 for (NetworkLinkKey key : curNetwork.linkIds()) {
788 removeNetworkLink(key, teRemove);
789 }
790 }
791 }
792
793 private TeTopologyKey newTeTopologyKey(TeTopologyId teTopologyId) {
794 long idValue;
795 try {
796 idValue = Long.parseLong(teTopologyId.topologyId());
797 } catch (NumberFormatException e) {
798 // Can't get the long value from the string.
799 // Use an assigned id value from local id pool,
800 // Ideally id should be assigned per provider base.
801 idValue = nextTeTopologyId();
802 }
803 return new TeTopologyKey(teTopologyId.providerId(), teTopologyId.clientId(), idValue);
804 }
805
806 @Override
807 public void updateNetwork(Network network) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500808 log.debug("updateNetwork {}", network);
Yixiao Chen68bfab22016-11-11 11:04:10 -0500809 InternalNetwork curNetwork = networkMap.get(network.networkId());
810 TeTopologyKey topoKey = null;
811 if (network.teTopologyId() != null) {
812 topoKey = newTeTopologyKey(network.teTopologyId());
813 }
814 // Update TE nodes
815 List<TeNodeKey> teNodeKeys = null;
816 if (MapUtils.isNotEmpty(network.nodes())) {
817 teNodeKeys = Lists.newArrayList();
818 for (Map.Entry<KeyId, NetworkNode> entry : network.nodes().entrySet()) {
819 NetworkNodeKey nodeKey = new NetworkNodeKey(network.networkId(), entry.getKey());
820 TeNodeKey teNodeKey = null;
821 if (topoKey != null && entry.getValue().teNode() != null) {
822 teNodeKey = new TeNodeKey(topoKey, entry.getValue().teNode().teNodeId());
823 }
824 updateNetworkNode(nodeKey, entry.getValue(), true, false, teNodeKey);
825 teNodeKeys.add(teNodeKey);
826 }
827 }
828 // Update TE links
829 List<TeLinkTpGlobalKey> teLinkKeys = null;
830 if (MapUtils.isNotEmpty(network.links())) {
831 teLinkKeys = Lists.newArrayList();
832 for (Map.Entry<KeyId, NetworkLink> entry : network.links().entrySet()) {
833 NetworkLinkKey linkKey = new NetworkLinkKey(network.networkId(), entry.getKey());
834 TeLinkTpGlobalKey teLinkKey = null;
835 if (topoKey != null && entry.getValue().teLink() != null) {
836 teLinkKey = new TeLinkTpGlobalKey(topoKey, entry.getValue().teLink().teLinkKey());
837 }
838 updateNetworkLink(linkKey, entry.getValue(), true, false, teLinkKey);
839 teLinkKeys.add(teLinkKey);
840 }
841 }
842
843 // New network, update TE Topology first
844 if (curNetwork == null) {
845 InternalTeTopology intTopo = new InternalTeTopology(network.teTopologyId().topologyId());
846 intTopo.setTeNodeKeys(teNodeKeys);
847 intTopo.setTeLinkKeys(teLinkKeys);
848 BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS);
849 flags.set(TeTopology.BIT_LEARNT);
Yixiao Chen29f06332016-12-07 16:14:29 -0500850 if (network.teTopologyId().clientId() == providerId) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500851 // Hard rule for now
852 flags.set(TeTopology.BIT_CUSTOMIZED);
853 }
854 CommonTopologyData common = new CommonTopologyData(network.networkId(),
855 OptimizationType.NOT_OPTIMIZED, flags, network.ownerId());
856 intTopo.setTopologydata(common);
857 teTopologyMap.put(topoKey, intTopo);
858 }
859 // Finally Update networkMap
860 InternalNetwork newNetwork = new InternalNetwork(network);
861 newNetwork.setTeTopologyKey(topoKey);
862 networkMap.put(network.networkId(), newNetwork);
863 }
864
865 @Override
866 public void removeNetwork(KeyId networkId) {
867 // Remove it from networkMap
868 InternalNetwork network = networkMap.remove(networkId);
869 if (network != null && network.teTopologyKey() != null) {
870 removeNetworkMapEntrys(network, false);
871 teTopologyMap.remove(network.teTopologyKey());
872 }
873 }
874
875 private TeNode teNode(TeNodeKey nodeKey, InternalTeNode intNode) {
876 if (intNode == null) {
877 return null;
878 }
879 Map<Long, ConnectivityMatrix> connMatrices = null;
880 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
881 connMatrices = Maps.newHashMap();
882 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
883 connMatrices.put(key.entryId(), connMatrixMap.get(key));
884 }
885 }
886 List<Long> teLinkIds = null;
887 if (CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
888 teLinkIds = Lists.newArrayList();
889 for (TeLinkTpGlobalKey key : intNode.teLinkTpKeys()) {
890 teLinkIds = TeUtils.addListElement(teLinkIds, key.teLinkTpId());
891 }
892 }
893 List<Long> tps = null;
894 if (CollectionUtils.isNotEmpty(intNode.teTpKeys())) {
895 tps = Lists.newArrayList();
896 for (TeLinkTpGlobalKey key : intNode.teTpKeys()) {
897 tps = TeUtils.addListElement(tps, key.teLinkTpId());
898 }
899 }
900 Map<Long, TunnelTerminationPoint> ttps = null;
901 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
902 ttps = Maps.newHashMap();
903 for (TtpKey key : intNode.ttpKeys()) {
904 ttps.put(key.ttpId(), ttpMap.get(key));
905 }
906 }
907 return new DefaultTeNode(nodeKey.teNodeId(),
908 intNode.underlayTopologyKey(),
909 intNode.supportNodeKey(),
910 intNode.sourceTeNodeKey(),
911 intNode.teData(),
912 connMatrices, teLinkIds, ttps, tps);
913 }
914
915 @Override
916 public TeNode teNode(TeNodeKey nodeKey) {
917 InternalTeNode intNode = teNodeMap.get(nodeKey);
918 return teNode(nodeKey, intNode);
919 }
920
921 private void removeTeNodeMapEntrys(InternalTeNode intNode) {
922 // Remove connMatrixMap entries for the node
923 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
924 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
925 connMatrixMap.remove(key);
926 }
927 }
928 // Remove ttpMap entries for the node
929 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
930 for (TtpKey key : intNode.ttpKeys()) {
931 ttpMap.remove(key);
932 }
933 }
934 }
935
936 private void updateTeNode(TeNodeKey nodeKey, TeNode node, boolean parentUpdate,
937 boolean teNodeUpdate, NetworkNodeKey networkNodeKey) {
938 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
939 if (intTopo == null && !parentUpdate) {
940 log.error("TE Topology is not in dataStore for nodeUpdate {}", nodeKey);
941 return;
942 }
943 InternalTeNode curNode = teNodeMap.get(nodeKey);
944 // Update connMatrixMap
945 if (MapUtils.isNotEmpty(node.connectivityMatrices())) {
946 for (Map.Entry<Long, ConnectivityMatrix> entry : node.connectivityMatrices().entrySet()) {
947 connMatrixMap.put(new ConnectivityMatrixKey(nodeKey, entry.getKey()),
948 entry.getValue());
949 }
950 }
951 // Update ttpMap
952 if (MapUtils.isNotEmpty(node.tunnelTerminationPoints())) {
953 for (Map.Entry<Long, TunnelTerminationPoint> entry : node.tunnelTerminationPoints().entrySet()) {
954 ttpMap.put(new TtpKey(nodeKey, entry.getKey()), entry.getValue());
955 }
956 }
957 // Update teNodeMap
958 InternalTeNode intNode = new InternalTeNode(nodeKey, node, networkNodeKey, parentUpdate);
959 teNodeMap.put(nodeKey, intNode);
960 if (curNode == null && !parentUpdate && intTopo != null) {
961 // Update InternalTeTopology
962 intTopo.setChildUpdate(true);
963 TeUtils.addListElement(intTopo.teNodeKeys(), nodeKey);
964 }
965 // Update networkNodeMap
966 if (teNodeUpdate) {
967 updateNetworkNode(networkNodeKey, networkNode(node), parentUpdate,
968 teNodeUpdate, nodeKey);
969 }
970 }
971
972 private NetworkNode networkNode(TeNode node) {
973 KeyId nodeId = KeyId.keyId(Long.toString(node.teNodeId()));
974 List<NetworkNodeKey> supportingNodeIds = null;
975 if (node.supportingTeNodeId() != null) {
976 supportingNodeIds = Lists.newArrayList();
977 supportingNodeIds.add(new NetworkNodeKey(
978 TeMgrUtil.toNetworkId((node.supportingTeNodeId().teTopologyKey())),
979 KeyId.keyId(Long.toString(node.supportingTeNodeId().teNodeId()))));
980 }
981 Map<KeyId, TerminationPoint> tps = null;
982 if (node.teTerminationPointIds() != null) {
983 tps = Maps.newHashMap();
984 for (Long teTpId : node.teTerminationPointIds()) {
985 tps.put(KeyId.keyId(Long.toString(teTpId)),
986 new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)),
987 null, teTpId));
988 }
989 }
990 return new DefaultNetworkNode(nodeId, supportingNodeIds, node, tps);
991 }
992
993 @Override
994 public void updateTeNode(TeNodeKey nodeKey, TeNode node) {
995 updateTeNode(nodeKey, node, false, true, TeMgrUtil.networkNodeKey(nodeKey));
996 }
997
998 private void removeTeNode(TeNodeKey nodeKey, boolean teNodeRemove) {
999 // Remove it from InternalTeTopology first
1000 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
1001 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teNodeKeys())) {
1002 intTopo.setChildUpdate(true);
1003 intTopo.teNodeKeys().remove(nodeKey);
1004 }
1005 // Then remove it from teNodeMap
1006 InternalTeNode node = teNodeMap.remove(nodeKey);
Palash Kala1ddfea02017-04-12 13:20:02 +09001007
1008 if (node == null) {
1009 log.error("No node found for nodeKey {}", nodeKey);
1010 return;
1011 }
1012
Yixiao Chen68bfab22016-11-11 11:04:10 -05001013 removeTeNodeMapEntrys(node);
1014 // Remove it from networkNodeMap
1015 if (teNodeRemove && node != null) {
1016 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
1017 }
1018 }
1019
1020 @Override
1021 public void removeTeNode(TeNodeKey nodeKey) {
1022 removeTeNode(nodeKey, true);
1023 }
1024
1025 private NetworkNode networkNode(NetworkNodeKey nodeKey, InternalNetworkNode intNode) {
1026 if (intNode == null) {
1027 return null;
1028 }
1029 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
1030 for (KeyId tpId : intNode.tpIds()) {
1031 tps.put(tpId, terminationPoint(
1032 new TerminationPointKey(nodeKey, tpId)));
1033
1034 }
1035 return new DefaultNetworkNode(nodeKey.nodeId(), intNode.supportingNodeIds(),
1036 teNode(intNode.teNodeKey()), tps);
1037 }
1038
1039 @Override
1040 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
1041 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
1042 return networkNode(nodeKey, intNode);
1043 }
1044
1045 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
1046 boolean parentUpdate, boolean teNodeUpdate, TeNodeKey teNodeKey) {
1047 InternalNetwork intNework = null;
1048 if (!parentUpdate) {
1049 intNework = networkMap.get(nodeKey.networkId());
1050 if (intNework == null) {
1051 log.error("Network is not in dataStore for nodeUpdate {}", nodeKey);
1052 return;
1053 }
1054 }
1055
1056 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
1057 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
1058 // Remove the TerminationPoints first
1059 for (KeyId tpId : exNode.tpIds()) {
1060 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1061 }
1062 }
1063
1064 if (MapUtils.isNotEmpty(node.terminationPoints())) {
1065 // Update with new TerminationPoints
1066 for (Map.Entry<KeyId, TerminationPoint> entry : node.terminationPoints().entrySet()) {
1067 updateTerminationPoint(new TerminationPointKey(nodeKey, entry.getKey()),
1068 entry.getValue(), parentUpdate, teNodeKey);
1069 }
1070 }
1071
1072 // Update teNodeMap first
1073 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
1074 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate, nodeKey);
1075 }
1076 // Update networkNodeMap
1077 InternalNetworkNode intNode = new InternalNetworkNode(node, parentUpdate);
1078 intNode.setTeNodeKey(teNodeKey);
1079 networkNodeMap.put(nodeKey, intNode);
1080 if (exNode == null && !parentUpdate && intNework != null) {
1081 // Update the InternalNetwork
1082 intNework.setChildUpdate(true);
1083 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
1084 }
1085 }
1086
1087 @Override
1088 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
1089 TeNodeKey teNodeKey = null;
1090 if (node.teNode() != null) {
1091 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId()).teTopologyKey(),
1092 node.teNode().teNodeId());
1093 }
1094 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
1095 }
1096
1097 private void removeNetworkNode(NetworkNodeKey nodeKey, boolean teNodeRemove) {
1098 // Update the InternalNetwork
1099 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
1100 if (intNework != null && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
1101 intNework.setChildUpdate(true);
1102 intNework.nodeIds().remove(nodeKey.nodeId());
1103 }
1104 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
1105 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1106 // Remove the TerminationPoints first
1107 for (KeyId tpId : intNode.tpIds()) {
1108 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1109 }
1110 }
1111 if (!teNodeRemove && intNode != null) {
1112 // Now remove it from teNodeMap
1113 removeTeNode(intNode.teNodeKey(), teNodeRemove);
1114 }
1115 }
1116
1117 @Override
1118 public void removeNetworkNode(NetworkNodeKey nodeKey) {
1119 removeNetworkNode(nodeKey, false);
1120 }
1121
1122 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
1123 if (intLink == null) {
1124 return null;
1125 }
1126 return new DefaultTeLink(linkKey.teLinkTpKey(),
1127 intLink.peerTeLinkKey(),
1128 intLink.underlayTopologyKey(),
1129 intLink.supportingLinkKey(),
1130 intLink.sourceTeLinkKey(),
1131 intLink.teData());
1132 }
1133
1134 @Override
1135 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
1136 InternalTeLink intLink = teLinkMap.get(linkKey);
1137 return teLink(linkKey, intLink);
1138 }
1139
1140 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
1141 boolean parentUpdate, boolean teLinkUpdate, NetworkLinkKey networkLinkKey) {
1142 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1143 if (intTopo == null && !parentUpdate) {
1144 log.error("TE Topology is not in dataStore for linkUpdate {}", linkKey);
1145 return;
1146 }
1147 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1148 if (intNode == null && !parentUpdate) {
1149 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
1150 return;
1151 }
1152 InternalTeLink exLink = teLinkMap.get(linkKey);
1153
1154 // Update teLinkMap
1155 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
1156 intLink.setNetworkLinkKey(networkLinkKey);
1157 teLinkMap.put(linkKey, intLink);
1158 if (exLink == null && !parentUpdate) {
1159 if (intTopo != null) {
1160 // Update the InternalTeTopology
1161 intTopo.setChildUpdate(true);
1162 intTopo.setTeLinkKeys(TeUtils.addListElement(intTopo.teLinkKeys(), linkKey));
1163 }
1164 if (intNode != null) {
1165 // Update the InternalNode
1166 intNode.setChildUpdate(true);
1167 intNode.setTeLinkTpKeys(TeUtils.addListElement(intNode.teLinkTpKeys(), linkKey));
1168 }
1169 }
1170
1171 // Update networkLinkMap
1172 if (teLinkUpdate) {
1173 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
1174 teLinkUpdate, linkKey);
1175 }
1176 }
1177
1178 private NetworkLink networkLink(TeLink link) {
1179 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
1180 NodeTpKey source = null;
1181 if (link.teLinkKey() != null) {
1182 source = new NodeTpKey(KeyId.keyId(Long.toString(link.teLinkKey().teNodeId())),
1183 KeyId.keyId(Long.toString(link.teLinkKey().teLinkTpId())));
1184 }
1185 NodeTpKey dest = null;
1186 if (link.peerTeLinkKey() != null) {
1187 dest = new NodeTpKey(KeyId.keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
1188 KeyId.keyId(Long.toString(link.peerTeLinkKey().teLinkTpId())));
1189 }
1190 List<NetworkLinkKey> supportingLinkIds = null;
1191 if (link.supportingTeLinkId() != null) {
1192 supportingLinkIds = Lists.newArrayList();
1193 supportingLinkIds.add(new NetworkLinkKey(
1194 TeMgrUtil.toNetworkId(link.supportingTeLinkId().teTopologyKey()),
1195 TeMgrUtil.toNetworkLinkId(link.supportingTeLinkId().teLinkTpKey())));
1196 }
1197 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds, link);
1198 }
1199
1200 @Override
1201 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
1202 updateTeLink(linkKey, link, false, true, TeMgrUtil.networkLinkKey(linkKey));
1203 }
1204
1205 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
1206 // Remove it from InternalTeTopology first
1207 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1208 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
1209 intTopo.setChildUpdate(true);
1210 intTopo.teLinkKeys().remove(linkKey);
1211 }
1212 // Remove it from InternalTeNode
1213 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1214 if (intNode != null && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
1215 intNode.setChildUpdate(true);
1216 intNode.teLinkTpKeys().remove(linkKey);
1217 }
1218 // Then remove it from teLinkMap
1219 InternalTeLink link = teLinkMap.remove(linkKey);
1220 if (teLinkRemove && link != null) {
1221 // Remove it from networkLinkMap
1222 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
1223 }
1224 }
1225
1226 @Override
1227 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
1228 removeTeLink(linkKey, true);
1229 }
1230
1231 private NetworkLink networkLink(NetworkLinkKey linkKey, InternalNetworkLink intLink) {
1232 if (intLink == null) {
1233 return null;
1234 }
1235 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
1236 intLink.destination(), intLink.supportingLinkIds(), teLink(intLink.teLinkKey()));
1237 }
1238
1239 @Override
1240 public NetworkLink networkLink(NetworkLinkKey linkKey) {
1241 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
1242 return networkLink(linkKey, intLink);
1243 }
1244
1245 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
1246 boolean parentUpdate, boolean teLinkUpdate, TeLinkTpGlobalKey teLinkKey) {
1247 InternalNetwork intNework = null;
1248 if (!parentUpdate) {
1249 intNework = networkMap.get(linkKey.networkId());
1250 if (intNework == null) {
1251 log.error("Network is not in dataStore for linkUpdate {}", linkKey);
1252 return;
1253 }
1254 }
1255
1256 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
1257
1258 // Now update teLinkMap first
1259 if (!teLinkUpdate && teLinkKey != null) {
1260 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate, linkKey);
1261 }
1262 // Update networkLinkMap
1263 InternalNetworkLink intLink = new InternalNetworkLink(link, parentUpdate);
1264 intLink.setTeLinkKey(teLinkKey);
1265 networkLinkMap.put(linkKey, intLink);
1266 if (exLink == null && !parentUpdate && intNework != null) {
1267 // Update the InternalNetwork
1268 intNework.setChildUpdate(true);
1269 TeUtils.addListElement(intNework.linkIds(), linkKey);
1270 }
1271 }
1272
1273 @Override
1274 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
1275 TeLinkTpGlobalKey teLinkKey = null;
1276 if (link.teLink() != null) {
1277 teLinkKey = new TeLinkTpGlobalKey(networkMap.get(linkKey.networkId()).teTopologyKey(),
1278 link.teLink().teLinkKey());
1279 }
1280
1281 updateNetworkLink(linkKey, link, false, false, teLinkKey);
1282 }
1283
1284 private void removeNetworkLink(NetworkLinkKey linkKey, boolean teLinkRemove) {
1285 // Update the InternalNetwork
1286 InternalNetwork intNework = networkMap.get(linkKey.networkId());
1287 if (intNework != null && CollectionUtils.isNotEmpty(intNework.linkIds())) {
1288 intNework.setChildUpdate(true);
1289 intNework.linkIds().remove(linkKey.linkId());
1290 }
1291 // Remove it from networkLinkMap
1292 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
1293 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
1294 // Now remove it from teLinkMap
1295 removeTeLink(intLink.teLinkKey(), teLinkRemove);
1296 }
1297 }
1298
1299 @Override
1300 public void removeNetworkLink(NetworkLinkKey linkKey) {
1301 removeNetworkLink(linkKey, false);
1302 }
1303
1304 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
1305 InternalTerminationPoint intTp = tpMap.get(tpKey);
1306 if (intTp == null) {
1307 return null;
1308 }
1309 return new DefaultTerminationPoint(tpKey.tpId(), intTp.supportingTpIds(),
1310 intTp.teTpKey().teLinkTpId());
1311 }
1312
1313 private void updateTerminationPoint(TerminationPointKey tpKey,
1314 TerminationPoint tp, boolean parentUpdate, TeNodeKey teNodeKey) {
1315 TeNodeKey myTeNodeKey;
1316 InternalNetworkNode intNode = null;
1317 if (!parentUpdate) {
1318 intNode = networkNodeMap.get(tpKey.nodeId());
1319 if (intNode == null) {
1320 log.error(" node is not in dataStore for tp update {}", tpKey);
1321 return;
1322 }
1323 myTeNodeKey = intNode.teNodeKey();
1324 } else {
1325 myTeNodeKey = teNodeKey;
1326 }
1327 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey, tp.teTpId());
1328
1329 boolean newTp = tpMap.get(tpKey) == null;
1330 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
1331 intTp.setTeTpKey(teTpKey);
1332 tpMap.put(tpKey, intTp);
1333 if (newTp) {
1334 // Update tpKeyMap
1335 tpKeyMap.put(teTpKey, tpKey);
1336 if (!parentUpdate && intNode != null) {
1337 // Update InternalNetworkNode
1338 intNode.setChildUpdate(true);
1339 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(), tpKey.tpId()));
1340 }
1341 }
1342 }
1343
1344 @Override
1345 public void updateTerminationPoint(TerminationPointKey tpKey,
1346 TerminationPoint tp) {
1347 updateTerminationPoint(tpKey, tp, false, null);
1348 }
1349
1350 @Override
1351 public void removeTerminationPoint(TerminationPointKey tpKey) {
1352 // Update InternalNetworkNode
1353 InternalNetworkNode intNode = networkNodeMap.get(tpKey.nodeId());
1354 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1355 intNode.setChildUpdate(true);
1356 intNode.tpIds().remove(tpKey.tpId());
1357 }
1358 // Remove it from tpMap
1359 InternalTerminationPoint tp = tpMap.remove(tpKey);
1360 // Remove it from tpKeyMap
1361 if (tp != null) {
1362 tpKeyMap.remove(tp.teTpKey());
1363 }
1364 }
1365
1366 @Override
1367 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
1368 return ttpMap.get(ttpId);
1369 }
1370
1371 @Override
1372 public long nextTeTopologyId() {
1373 return nextTeTopologyId.getAndIncrement();
1374 }
1375
1376 @Override
1377 public long nextTeNodeId(TeTopologyKey topoKey) {
1378 return teTopologyMap.get(topoKey).nextTeNodeId();
1379 }
1380
1381 @Override
1382 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1383 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1384 }
1385
1386 @Override
1387 public KeyId networkId(TeTopologyKey teTopologyKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001388 return teTopologyMap.get(teTopologyKey) == null ||
1389 teTopologyMap.get(teTopologyKey).topologyData() == null ? null :
1390 teTopologyMap.get(teTopologyKey).topologyData().networkId();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001391 }
1392
1393 @Override
1394 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001395 return teNodeMap.get(teNodeKey) == null ? null :
1396 teNodeMap.get(teNodeKey).networkNodeKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001397 }
1398
1399 @Override
1400 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001401 return teLinkMap.get(teLinkKey) == null ? null :
1402 teLinkMap.get(teLinkKey).networkLinkKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001403 }
1404
1405 @Override
1406 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1407 return tpKeyMap.get(teTpKey);
1408 }
1409
1410 @Override
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001411 public BlockingQueue<TeTopologyMapEvent> mapEventQueue() {
1412 return mapEventQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -05001413 }
Yixiao Chen29f06332016-12-07 16:14:29 -05001414
1415 @Override
1416 public void setProviderId(long providerId) {
1417 this.providerId = providerId;
1418 }
Yixiao Chen68bfab22016-11-11 11:04:10 -05001419}
1420