blob: 3d6be15ff788b7b43c75f768e8ba75ca9c263a48 [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);
1007 removeTeNodeMapEntrys(node);
1008 // Remove it from networkNodeMap
1009 if (teNodeRemove && node != null) {
1010 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
1011 }
1012 }
1013
1014 @Override
1015 public void removeTeNode(TeNodeKey nodeKey) {
1016 removeTeNode(nodeKey, true);
1017 }
1018
1019 private NetworkNode networkNode(NetworkNodeKey nodeKey, InternalNetworkNode intNode) {
1020 if (intNode == null) {
1021 return null;
1022 }
1023 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
1024 for (KeyId tpId : intNode.tpIds()) {
1025 tps.put(tpId, terminationPoint(
1026 new TerminationPointKey(nodeKey, tpId)));
1027
1028 }
1029 return new DefaultNetworkNode(nodeKey.nodeId(), intNode.supportingNodeIds(),
1030 teNode(intNode.teNodeKey()), tps);
1031 }
1032
1033 @Override
1034 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
1035 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
1036 return networkNode(nodeKey, intNode);
1037 }
1038
1039 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
1040 boolean parentUpdate, boolean teNodeUpdate, TeNodeKey teNodeKey) {
1041 InternalNetwork intNework = null;
1042 if (!parentUpdate) {
1043 intNework = networkMap.get(nodeKey.networkId());
1044 if (intNework == null) {
1045 log.error("Network is not in dataStore for nodeUpdate {}", nodeKey);
1046 return;
1047 }
1048 }
1049
1050 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
1051 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
1052 // Remove the TerminationPoints first
1053 for (KeyId tpId : exNode.tpIds()) {
1054 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1055 }
1056 }
1057
1058 if (MapUtils.isNotEmpty(node.terminationPoints())) {
1059 // Update with new TerminationPoints
1060 for (Map.Entry<KeyId, TerminationPoint> entry : node.terminationPoints().entrySet()) {
1061 updateTerminationPoint(new TerminationPointKey(nodeKey, entry.getKey()),
1062 entry.getValue(), parentUpdate, teNodeKey);
1063 }
1064 }
1065
1066 // Update teNodeMap first
1067 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
1068 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate, nodeKey);
1069 }
1070 // Update networkNodeMap
1071 InternalNetworkNode intNode = new InternalNetworkNode(node, parentUpdate);
1072 intNode.setTeNodeKey(teNodeKey);
1073 networkNodeMap.put(nodeKey, intNode);
1074 if (exNode == null && !parentUpdate && intNework != null) {
1075 // Update the InternalNetwork
1076 intNework.setChildUpdate(true);
1077 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
1078 }
1079 }
1080
1081 @Override
1082 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
1083 TeNodeKey teNodeKey = null;
1084 if (node.teNode() != null) {
1085 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId()).teTopologyKey(),
1086 node.teNode().teNodeId());
1087 }
1088 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
1089 }
1090
1091 private void removeNetworkNode(NetworkNodeKey nodeKey, boolean teNodeRemove) {
1092 // Update the InternalNetwork
1093 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
1094 if (intNework != null && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
1095 intNework.setChildUpdate(true);
1096 intNework.nodeIds().remove(nodeKey.nodeId());
1097 }
1098 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
1099 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1100 // Remove the TerminationPoints first
1101 for (KeyId tpId : intNode.tpIds()) {
1102 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1103 }
1104 }
1105 if (!teNodeRemove && intNode != null) {
1106 // Now remove it from teNodeMap
1107 removeTeNode(intNode.teNodeKey(), teNodeRemove);
1108 }
1109 }
1110
1111 @Override
1112 public void removeNetworkNode(NetworkNodeKey nodeKey) {
1113 removeNetworkNode(nodeKey, false);
1114 }
1115
1116 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
1117 if (intLink == null) {
1118 return null;
1119 }
1120 return new DefaultTeLink(linkKey.teLinkTpKey(),
1121 intLink.peerTeLinkKey(),
1122 intLink.underlayTopologyKey(),
1123 intLink.supportingLinkKey(),
1124 intLink.sourceTeLinkKey(),
1125 intLink.teData());
1126 }
1127
1128 @Override
1129 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
1130 InternalTeLink intLink = teLinkMap.get(linkKey);
1131 return teLink(linkKey, intLink);
1132 }
1133
1134 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
1135 boolean parentUpdate, boolean teLinkUpdate, NetworkLinkKey networkLinkKey) {
1136 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1137 if (intTopo == null && !parentUpdate) {
1138 log.error("TE Topology is not in dataStore for linkUpdate {}", linkKey);
1139 return;
1140 }
1141 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1142 if (intNode == null && !parentUpdate) {
1143 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
1144 return;
1145 }
1146 InternalTeLink exLink = teLinkMap.get(linkKey);
1147
1148 // Update teLinkMap
1149 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
1150 intLink.setNetworkLinkKey(networkLinkKey);
1151 teLinkMap.put(linkKey, intLink);
1152 if (exLink == null && !parentUpdate) {
1153 if (intTopo != null) {
1154 // Update the InternalTeTopology
1155 intTopo.setChildUpdate(true);
1156 intTopo.setTeLinkKeys(TeUtils.addListElement(intTopo.teLinkKeys(), linkKey));
1157 }
1158 if (intNode != null) {
1159 // Update the InternalNode
1160 intNode.setChildUpdate(true);
1161 intNode.setTeLinkTpKeys(TeUtils.addListElement(intNode.teLinkTpKeys(), linkKey));
1162 }
1163 }
1164
1165 // Update networkLinkMap
1166 if (teLinkUpdate) {
1167 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
1168 teLinkUpdate, linkKey);
1169 }
1170 }
1171
1172 private NetworkLink networkLink(TeLink link) {
1173 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
1174 NodeTpKey source = null;
1175 if (link.teLinkKey() != null) {
1176 source = new NodeTpKey(KeyId.keyId(Long.toString(link.teLinkKey().teNodeId())),
1177 KeyId.keyId(Long.toString(link.teLinkKey().teLinkTpId())));
1178 }
1179 NodeTpKey dest = null;
1180 if (link.peerTeLinkKey() != null) {
1181 dest = new NodeTpKey(KeyId.keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
1182 KeyId.keyId(Long.toString(link.peerTeLinkKey().teLinkTpId())));
1183 }
1184 List<NetworkLinkKey> supportingLinkIds = null;
1185 if (link.supportingTeLinkId() != null) {
1186 supportingLinkIds = Lists.newArrayList();
1187 supportingLinkIds.add(new NetworkLinkKey(
1188 TeMgrUtil.toNetworkId(link.supportingTeLinkId().teTopologyKey()),
1189 TeMgrUtil.toNetworkLinkId(link.supportingTeLinkId().teLinkTpKey())));
1190 }
1191 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds, link);
1192 }
1193
1194 @Override
1195 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
1196 updateTeLink(linkKey, link, false, true, TeMgrUtil.networkLinkKey(linkKey));
1197 }
1198
1199 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
1200 // Remove it from InternalTeTopology first
1201 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1202 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
1203 intTopo.setChildUpdate(true);
1204 intTopo.teLinkKeys().remove(linkKey);
1205 }
1206 // Remove it from InternalTeNode
1207 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1208 if (intNode != null && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
1209 intNode.setChildUpdate(true);
1210 intNode.teLinkTpKeys().remove(linkKey);
1211 }
1212 // Then remove it from teLinkMap
1213 InternalTeLink link = teLinkMap.remove(linkKey);
1214 if (teLinkRemove && link != null) {
1215 // Remove it from networkLinkMap
1216 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
1217 }
1218 }
1219
1220 @Override
1221 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
1222 removeTeLink(linkKey, true);
1223 }
1224
1225 private NetworkLink networkLink(NetworkLinkKey linkKey, InternalNetworkLink intLink) {
1226 if (intLink == null) {
1227 return null;
1228 }
1229 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
1230 intLink.destination(), intLink.supportingLinkIds(), teLink(intLink.teLinkKey()));
1231 }
1232
1233 @Override
1234 public NetworkLink networkLink(NetworkLinkKey linkKey) {
1235 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
1236 return networkLink(linkKey, intLink);
1237 }
1238
1239 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
1240 boolean parentUpdate, boolean teLinkUpdate, TeLinkTpGlobalKey teLinkKey) {
1241 InternalNetwork intNework = null;
1242 if (!parentUpdate) {
1243 intNework = networkMap.get(linkKey.networkId());
1244 if (intNework == null) {
1245 log.error("Network is not in dataStore for linkUpdate {}", linkKey);
1246 return;
1247 }
1248 }
1249
1250 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
1251
1252 // Now update teLinkMap first
1253 if (!teLinkUpdate && teLinkKey != null) {
1254 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate, linkKey);
1255 }
1256 // Update networkLinkMap
1257 InternalNetworkLink intLink = new InternalNetworkLink(link, parentUpdate);
1258 intLink.setTeLinkKey(teLinkKey);
1259 networkLinkMap.put(linkKey, intLink);
1260 if (exLink == null && !parentUpdate && intNework != null) {
1261 // Update the InternalNetwork
1262 intNework.setChildUpdate(true);
1263 TeUtils.addListElement(intNework.linkIds(), linkKey);
1264 }
1265 }
1266
1267 @Override
1268 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
1269 TeLinkTpGlobalKey teLinkKey = null;
1270 if (link.teLink() != null) {
1271 teLinkKey = new TeLinkTpGlobalKey(networkMap.get(linkKey.networkId()).teTopologyKey(),
1272 link.teLink().teLinkKey());
1273 }
1274
1275 updateNetworkLink(linkKey, link, false, false, teLinkKey);
1276 }
1277
1278 private void removeNetworkLink(NetworkLinkKey linkKey, boolean teLinkRemove) {
1279 // Update the InternalNetwork
1280 InternalNetwork intNework = networkMap.get(linkKey.networkId());
1281 if (intNework != null && CollectionUtils.isNotEmpty(intNework.linkIds())) {
1282 intNework.setChildUpdate(true);
1283 intNework.linkIds().remove(linkKey.linkId());
1284 }
1285 // Remove it from networkLinkMap
1286 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
1287 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
1288 // Now remove it from teLinkMap
1289 removeTeLink(intLink.teLinkKey(), teLinkRemove);
1290 }
1291 }
1292
1293 @Override
1294 public void removeNetworkLink(NetworkLinkKey linkKey) {
1295 removeNetworkLink(linkKey, false);
1296 }
1297
1298 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
1299 InternalTerminationPoint intTp = tpMap.get(tpKey);
1300 if (intTp == null) {
1301 return null;
1302 }
1303 return new DefaultTerminationPoint(tpKey.tpId(), intTp.supportingTpIds(),
1304 intTp.teTpKey().teLinkTpId());
1305 }
1306
1307 private void updateTerminationPoint(TerminationPointKey tpKey,
1308 TerminationPoint tp, boolean parentUpdate, TeNodeKey teNodeKey) {
1309 TeNodeKey myTeNodeKey;
1310 InternalNetworkNode intNode = null;
1311 if (!parentUpdate) {
1312 intNode = networkNodeMap.get(tpKey.nodeId());
1313 if (intNode == null) {
1314 log.error(" node is not in dataStore for tp update {}", tpKey);
1315 return;
1316 }
1317 myTeNodeKey = intNode.teNodeKey();
1318 } else {
1319 myTeNodeKey = teNodeKey;
1320 }
1321 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey, tp.teTpId());
1322
1323 boolean newTp = tpMap.get(tpKey) == null;
1324 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
1325 intTp.setTeTpKey(teTpKey);
1326 tpMap.put(tpKey, intTp);
1327 if (newTp) {
1328 // Update tpKeyMap
1329 tpKeyMap.put(teTpKey, tpKey);
1330 if (!parentUpdate && intNode != null) {
1331 // Update InternalNetworkNode
1332 intNode.setChildUpdate(true);
1333 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(), tpKey.tpId()));
1334 }
1335 }
1336 }
1337
1338 @Override
1339 public void updateTerminationPoint(TerminationPointKey tpKey,
1340 TerminationPoint tp) {
1341 updateTerminationPoint(tpKey, tp, false, null);
1342 }
1343
1344 @Override
1345 public void removeTerminationPoint(TerminationPointKey tpKey) {
1346 // Update InternalNetworkNode
1347 InternalNetworkNode intNode = networkNodeMap.get(tpKey.nodeId());
1348 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1349 intNode.setChildUpdate(true);
1350 intNode.tpIds().remove(tpKey.tpId());
1351 }
1352 // Remove it from tpMap
1353 InternalTerminationPoint tp = tpMap.remove(tpKey);
1354 // Remove it from tpKeyMap
1355 if (tp != null) {
1356 tpKeyMap.remove(tp.teTpKey());
1357 }
1358 }
1359
1360 @Override
1361 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
1362 return ttpMap.get(ttpId);
1363 }
1364
1365 @Override
1366 public long nextTeTopologyId() {
1367 return nextTeTopologyId.getAndIncrement();
1368 }
1369
1370 @Override
1371 public long nextTeNodeId(TeTopologyKey topoKey) {
1372 return teTopologyMap.get(topoKey).nextTeNodeId();
1373 }
1374
1375 @Override
1376 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1377 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1378 }
1379
1380 @Override
1381 public KeyId networkId(TeTopologyKey teTopologyKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001382 return teTopologyMap.get(teTopologyKey) == null ||
1383 teTopologyMap.get(teTopologyKey).topologyData() == null ? null :
1384 teTopologyMap.get(teTopologyKey).topologyData().networkId();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001385 }
1386
1387 @Override
1388 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001389 return teNodeMap.get(teNodeKey) == null ? null :
1390 teNodeMap.get(teNodeKey).networkNodeKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001391 }
1392
1393 @Override
1394 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001395 return teLinkMap.get(teLinkKey) == null ? null :
1396 teLinkMap.get(teLinkKey).networkLinkKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001397 }
1398
1399 @Override
1400 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1401 return tpKeyMap.get(teTpKey);
1402 }
1403
1404 @Override
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001405 public BlockingQueue<TeTopologyMapEvent> mapEventQueue() {
1406 return mapEventQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -05001407 }
Yixiao Chen29f06332016-12-07 16:14:29 -05001408
1409 @Override
1410 public void setProviderId(long providerId) {
1411 this.providerId = providerId;
1412 }
Yixiao Chen68bfab22016-11-11 11:04:10 -05001413}
1414