blob: 3abaddc86418e2f683b380aa9d84d97e1c5faced [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;
17
18import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
19import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
20import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
21import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
22import static org.slf4j.LoggerFactory.getLogger;
23
24import java.util.BitSet;
25import java.util.List;
26import java.util.Map;
27import java.util.concurrent.BlockingQueue;
28
29import org.apache.commons.collections.CollectionUtils;
30import org.apache.commons.collections.MapUtils;
31import org.apache.felix.scr.annotations.Activate;
32import org.apache.felix.scr.annotations.Component;
33import org.apache.felix.scr.annotations.Deactivate;
34import org.apache.felix.scr.annotations.Service;
35import org.onosproject.net.DeviceId;
36import org.onosproject.store.AbstractStore;
37import org.onosproject.tetopology.management.api.CommonTopologyData;
38import org.onosproject.tetopology.management.api.DefaultNetwork;
39import org.onosproject.tetopology.management.api.DefaultTeTopologies;
40import org.onosproject.tetopology.management.api.DefaultTeTopology;
41import org.onosproject.tetopology.management.api.KeyId;
42import org.onosproject.tetopology.management.api.Network;
43import org.onosproject.tetopology.management.api.OptimizationType;
44import org.onosproject.tetopology.management.api.TeConstants;
45import org.onosproject.tetopology.management.api.TeTopologies;
46import org.onosproject.tetopology.management.api.TeTopology;
47import org.onosproject.tetopology.management.api.TeTopologyEvent;
48import org.onosproject.tetopology.management.api.TeTopologyId;
49import org.onosproject.tetopology.management.api.TeTopologyKey;
50import org.onosproject.tetopology.management.api.TeUtils;
51import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
52import org.onosproject.tetopology.management.api.link.DefaultTeLink;
53import org.onosproject.tetopology.management.api.link.NetworkLink;
54import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
55import org.onosproject.tetopology.management.api.link.TeLink;
56import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
57import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
58import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
59import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
60import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
61import org.onosproject.tetopology.management.api.node.DefaultTeNode;
62import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
63import org.onosproject.tetopology.management.api.node.NetworkNode;
64import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
65import org.onosproject.tetopology.management.api.node.NodeTpKey;
66import org.onosproject.tetopology.management.api.node.TeNode;
67import org.onosproject.tetopology.management.api.node.TeNodeKey;
68import org.onosproject.tetopology.management.api.node.TerminationPoint;
69import org.onosproject.tetopology.management.api.node.TerminationPointKey;
70import org.onosproject.tetopology.management.api.node.TtpKey;
71import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
72import org.onosproject.tetopology.management.impl.InternalNetwork;
73import org.onosproject.tetopology.management.impl.InternalNetworkLink;
74import org.onosproject.tetopology.management.impl.InternalNetworkNode;
75import org.onosproject.tetopology.management.impl.InternalTeLink;
76import org.onosproject.tetopology.management.impl.InternalTeNode;
77import org.onosproject.tetopology.management.impl.InternalTeTopology;
78import org.onosproject.tetopology.management.impl.InternalTerminationPoint;
79import org.onosproject.tetopology.management.impl.TeMgrUtil;
80import org.onosproject.tetopology.management.impl.TeTopologyManager;
81import org.onosproject.tetopology.management.impl.TeTopologyMapEvent;
82import org.onosproject.tetopology.management.impl.TeTopologyStore;
83import org.onosproject.tetopology.management.impl.TeTopologyStoreDelegate;
84import org.slf4j.Logger;
85
86import com.google.common.collect.Lists;
87import com.google.common.collect.Maps;
88
89/**
90 * Implementation of the TE network store.
91 */
92@Component(immediate = true)
93@Service
94public class SimpleTeTopologyStore
95 extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
96 implements TeTopologyStore {
97 private static final String STORE_NAME = "TE_NETWORK_TOPOLOGY_STORE";
98 private final Logger log = getLogger(getClass());
99
100 // Track TE topologies by TE Topology key
101 private Map<TeTopologyKey, InternalTeTopology> teTopologyMap = Maps
102 .newConcurrentMap();
103 // Track networks by network Id
104 private Map<KeyId, InternalNetwork> networkMap = Maps.newConcurrentMap();
105 // Track TE nodes by TE node key
106 private Map<TeNodeKey, InternalTeNode> teNodeMap = Maps.newConcurrentMap();
107 // Track ConnectivityMatrix by its key
108 private Map<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixMap = Maps
109 .newConcurrentMap();
110 // Track Tunnel Termination Points by its key
111 private Map<TtpKey, TunnelTerminationPoint> ttpMap = Maps
112 .newConcurrentMap();
113 // Track network nodes by network node key
114 private Map<NetworkNodeKey, InternalNetworkNode> networkNodeMap = Maps
115 .newConcurrentMap();
116 // Track TE links by its key
117 private Map<TeLinkTpGlobalKey, InternalTeLink> teLinkMap = Maps
118 .newConcurrentMap();
119 // Track network links by network link key
120 private Map<NetworkLinkKey, InternalNetworkLink> networkLinkMap = Maps
121 .newConcurrentMap();
122 // Track Termination points by termination point key
123 private Map<TerminationPointKey, InternalTerminationPoint> tpMap = Maps
124 .newConcurrentMap();
125 // Track termination point keys by TE termination point Key
126 private Map<TeLinkTpGlobalKey, TerminationPointKey> tpKeyMap = Maps
127 .newConcurrentMap();
128
129 @Activate
130 public void activate() {
131 log.info("Started");
132 }
133
134 @Deactivate
135 public void deactivate() {
136 teTopologyMap.clear();
137 networkMap.clear();
138 teNodeMap.clear();
139 connMatrixMap.clear();
140 networkNodeMap.clear();
141 teLinkMap.clear();
142 networkLinkMap.clear();
143 tpMap.clear();
144 tpKeyMap.clear();
145 ttpMap.clear();
146 log.info("Stopped");
147 }
148
149 @Override
150 public TeTopologies teTopologies() {
151 Map<TeTopologyKey, TeTopology> teTopologies = Maps.newHashMap();
152 if (MapUtils.isNotEmpty(teTopologyMap)) {
153 for (TeTopologyKey key : teTopologyMap.keySet()) {
154 teTopologies.put(key, teTopology(key));
155 }
156 }
157 return new DefaultTeTopologies(STORE_NAME, teTopologies);
158 }
159
160 private TeTopology teTopology(TeTopologyKey topologyId,
161 InternalTeTopology intTopology) {
162 if (intTopology == null) {
163 return null;
164 }
165 Map<Long, TeNode> teNodes = null;
166 if (CollectionUtils.isNotEmpty(intTopology.teNodeKeys())) {
167 teNodes = Maps.newHashMap();
168 for (TeNodeKey key : intTopology.teNodeKeys()) {
169 teNodes.put(key.teNodeId(), teNode(key));
170 }
171 }
172 Map<TeLinkTpKey, TeLink> teLinks = null;
173 if (CollectionUtils.isNotEmpty(intTopology.teLinkKeys())) {
174 teLinks = Maps.newHashMap();
175 for (TeLinkTpGlobalKey key : intTopology.teLinkKeys()) {
176 teLinks.put(key.teLinkTpKey(), teLink(key));
177 }
178 }
179 return new DefaultTeTopology(topologyId, teNodes, teLinks,
180 intTopology.teTopologyId(),
181 intTopology.topologyData());
182 }
183
184 @Override
185 public TeTopology teTopology(TeTopologyKey topologyId) {
186 InternalTeTopology intTopology = teTopologyMap.get(topologyId);
187 return teTopology(topologyId, intTopology);
188 }
189
190 private void removeTopologyeMapEntrys(InternalTeTopology curTopology) {
191 // Remove TE nodes
192 if (CollectionUtils.isNotEmpty(curTopology.teNodeKeys())) {
193 for (TeNodeKey key : curTopology.teNodeKeys()) {
194 removeTeNode(key, true);
195 }
196 }
197 // Remove TE Links
198 if (CollectionUtils.isNotEmpty(curTopology.teLinkKeys())) {
199 for (TeLinkTpGlobalKey key : curTopology.teLinkKeys()) {
200 removeTeLink(key, true);
201 }
202 }
203 }
204
205 @Override
206 public void updateTeTopology(TeTopology teTopology) {
207 InternalTeTopology curTopology = teTopologyMap
208 .get(teTopology.teTopologyId());
209 if (curTopology != null) {
210 // Existing topology update
211 // Remove existing map entries first, which should be removed by
212 // its own events
213 removeTopologyeMapEntrys(curTopology);
214 }
215 // Update TE nodes
216 List<NetworkNodeKey> nodeIds = null;
217 if (MapUtils.isNotEmpty(teTopology.teNodes())) {
218 nodeIds = Lists.newArrayList();
219 for (Map.Entry<Long, TeNode> entry : teTopology.teNodes()
220 .entrySet()) {
221 TeNodeKey teNodeKey = new TeNodeKey(teTopology.teTopologyId(),
222 entry.getKey());
223 NetworkNodeKey nodeKey = TeMgrUtil.networkNodeKey(teNodeKey);
224 updateTeNode(teNodeKey, entry.getValue(), true, true, nodeKey);
225 nodeIds.add(nodeKey);
226 }
227 }
228 // Update TE links
229 List<NetworkLinkKey> linkIds = null;
230 if (MapUtils.isNotEmpty(teTopology.teLinks())) {
231 linkIds = Lists.newArrayList();
232 for (Map.Entry<TeLinkTpKey, TeLink> entry : teTopology.teLinks()
233 .entrySet()) {
234 TeLinkTpGlobalKey teLinkKey = new TeLinkTpGlobalKey(teTopology
235 .teTopologyId(), entry.getKey());
236 NetworkLinkKey linkKey = TeMgrUtil.networkLinkKey(teLinkKey);
237 updateTeLink(teLinkKey, entry.getValue(), true, true, linkKey);
238 linkIds.add(linkKey);
239 }
240 }
241 // Finally Update teTopologyMap
242 InternalTeTopology newTopology = new InternalTeTopology(teTopology);
243 teTopologyMap.put(teTopology.teTopologyId(), newTopology);
244
245 if (curTopology == null) {
246 // New topology, update networkMap
247 InternalNetwork intNetwork = new InternalNetwork();
248 intNetwork.setServerProvided(false);
249 intNetwork.setTeTopologyKey(teTopology.teTopologyId());
250 intNetwork.setNodeIds(nodeIds);
251 intNetwork.setLinkIds(linkIds);
252 networkMap.put(teTopology.networkId(), intNetwork);
253 }
254 }
255
256 @Override
257 public void removeTeTopology(TeTopologyKey topologyId) {
258 // Remove it from teTopologyMap
259 InternalTeTopology topology = teTopologyMap.remove(topologyId);
260 if (topology != null) {
261 removeTopologyeMapEntrys(topology);
262 // Remove it from networkMap;
263 networkMap.remove(topology.topologyData().networkId());
264 }
265 }
266
267 @Override
268 public List<Network> networks() {
269 if (MapUtils.isEmpty(networkMap)) {
270 return null;
271 }
272 List<Network> networks = Lists.newArrayList();
273 for (KeyId networkId : networkMap.keySet()) {
274 networks.add(network(networkId));
275 }
276 return networks;
277 }
278
279 private Network network(KeyId networkId, InternalNetwork curNetwork) {
280 if (curNetwork == null) {
281 return null;
282 }
283 List<KeyId> supportingNetworkIds = curNetwork.supportingNetworkIds();
284 Map<KeyId, NetworkNode> nodes = null;
285 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
286 nodes = Maps.newHashMap();
287 for (NetworkNodeKey key : curNetwork.nodeIds()) {
288 nodes.put(key.nodeId(), networkNode(key));
289 }
290 }
291 Map<KeyId, NetworkLink> links = null;
292 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
293 links = Maps.newHashMap();
294 for (NetworkLinkKey key : curNetwork.linkIds()) {
295 links.put(key.linkId(), networkLink(key));
296 }
297 }
298 TeTopologyId topologyId = null;
299 DeviceId ownerId = null;
300 if (curNetwork.teTopologyKey() != null
301 && teTopology(curNetwork.teTopologyKey()) != null) {
302 topologyId = new TeTopologyId(curNetwork.teTopologyKey()
303 .providerId(), curNetwork.teTopologyKey().clientId(),
304 teTopology(curNetwork.teTopologyKey())
305 .teTopologyIdStringValue());
306 ownerId = teTopology(curNetwork.teTopologyKey()).ownerId();
307
308 }
309 return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
310 topologyId, curNetwork.serverProvided(),
311 ownerId);
312 }
313
314 @Override
315 public Network network(KeyId networkId) {
316 InternalNetwork curNetwork = networkMap.get(networkId);
317 return network(networkId, curNetwork);
318 }
319
320 private void removeNetworkMapEntrys(InternalNetwork curNetwork,
321 boolean teRemove) {
322 // Remove TE nodes
323 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
324 for (NetworkNodeKey key : curNetwork.nodeIds()) {
325 removeNetworkNode(key, teRemove);
326 }
327 }
328 // Remove TE Links
329 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
330 for (NetworkLinkKey key : curNetwork.linkIds()) {
331 removeNetworkLink(key, teRemove);
332 }
333 }
334 }
335
336 private TeTopologyKey newTeTopologyKey(TeTopologyId teTopologyId) {
337 long idValue;
338 try {
339 idValue = Long.parseLong(teTopologyId.topologyId());
340 } catch (NumberFormatException e) {
341 // Can't get the long value from the string.
342 // Use an assigned id value from local id pool,
343 // Ideally id should be assigned per provider base.
344 idValue = nextTeTopologyId();
345 }
346 return new TeTopologyKey(teTopologyId.providerId(),
347 teTopologyId.clientId(), idValue);
348 }
349
350 @Override
351 public void updateNetwork(Network network) {
352 InternalNetwork curNetwork = networkMap.get(network.networkId());
353 if (curNetwork != null) {
354 // Existing topology update
355 // Remove existing map entries first,
356 removeNetworkMapEntrys(curNetwork, false);
357 }
358 TeTopologyKey topoKey = null;
359 if (network.teTopologyId() != null) {
360 topoKey = newTeTopologyKey(network.teTopologyId());
361 }
362 // Update TE nodes
363 List<TeNodeKey> teNodeKeys = null;
364 if (MapUtils.isNotEmpty(network.nodes())) {
365 teNodeKeys = Lists.newArrayList();
366 for (Map.Entry<KeyId, NetworkNode> entry : network.nodes()
367 .entrySet()) {
368 NetworkNodeKey nodeKey = new NetworkNodeKey(network.networkId(),
369 entry.getKey());
370 TeNodeKey teNodeKey = null;
371 if (topoKey != null && entry.getValue().teNode() != null) {
372 teNodeKey = new TeNodeKey(topoKey, entry.getValue().teNode()
373 .teNodeId());
374 }
375 updateNetworkNode(nodeKey, entry.getValue(), true, false,
376 teNodeKey);
377 teNodeKeys.add(teNodeKey);
378 }
379 }
380 // Update TE links
381 List<TeLinkTpGlobalKey> teLinkKeys = null;
382 if (MapUtils.isNotEmpty(network.links())) {
383 teLinkKeys = Lists.newArrayList();
384 for (Map.Entry<KeyId, NetworkLink> entry : network.links()
385 .entrySet()) {
386 NetworkLinkKey linkKey = new NetworkLinkKey(network.networkId(),
387 entry.getKey());
388 TeLinkTpGlobalKey teLinkKey = null;
389 if (topoKey != null && entry.getValue().teLink() != null) {
390 teLinkKey = new TeLinkTpGlobalKey(topoKey, entry.getValue()
391 .teLink().teLinkKey());
392 }
393 updateNetworkLink(linkKey, entry.getValue(), true, false,
394 teLinkKey);
395 teLinkKeys.add(teLinkKey);
396 }
397 }
398
399 // New network, update TE Topology first
400 if (curNetwork == null) {
401 InternalTeTopology intTopo = new InternalTeTopology(network
402 .teTopologyId().topologyId());
403 intTopo.setTeNodeKeys(teNodeKeys);
404 intTopo.setTeLinkKeys(teLinkKeys);
405 BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS);
406 flags.set(TeTopology.BIT_LEARNT);
407 if (network.teTopologyId()
408 .clientId() == TeTopologyManager.DEFAULT_PROVIDER_ID) {
409 // Hard rule for now
410 flags.set(TeTopology.BIT_CUSTOMIZED);
411 }
412 CommonTopologyData common = new CommonTopologyData(network
413 .networkId(), OptimizationType.NOT_OPTIMIZED, flags, network
414 .ownerId());
415 intTopo.setTopologydata(common);
416 teTopologyMap.put(topoKey, intTopo);
417 // Assume new topology
418 TeTopologyEvent topologyEvent = new TeTopologyEvent(TE_TOPOLOGY_ADDED,
419 teTopology(topoKey));
420 notifyDelegate(topologyEvent);
421 }
422 // Finally Update networkMap
423 InternalNetwork newNetwork = new InternalNetwork(network);
424 newNetwork.setTeTopologyKey(topoKey);
425 networkMap.put(network.networkId(), newNetwork);
426 // Assume new network
427 TeTopologyEvent topologyEvent = new TeTopologyEvent(NETWORK_ADDED,
428 network(network
429 .networkId()));
430 notifyDelegate(topologyEvent);
431 }
432
433 @Override
434 public void removeNetwork(KeyId networkId) {
435 // Remove it from networkMap
436 InternalNetwork network = networkMap.remove(networkId);
437 TeTopologyEvent topologyEvent = new TeTopologyEvent(NETWORK_REMOVED,
438 new DefaultNetwork(networkId,
439 null,
440 null,
441 null,
442 null,
443 false,
444 null));
445 notifyDelegate(topologyEvent);
446 if (network != null && network.teTopologyKey() != null) {
447 removeNetworkMapEntrys(network, false);
448 teTopologyMap.remove(network.teTopologyKey());
449 topologyEvent = new TeTopologyEvent(TE_TOPOLOGY_REMOVED,
450 new DefaultTeTopology(network
451 .teTopologyKey(), null, null, null, null));
452 notifyDelegate(topologyEvent);
453 }
454 }
455
456 private TeNode teNode(TeNodeKey nodeKey, InternalTeNode intNode) {
457 if (intNode == null) {
458 return null;
459 }
460 Map<Long, ConnectivityMatrix> connMatrices = null;
461 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
462 connMatrices = Maps.newHashMap();
463 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
464 connMatrices.put(key.entryId(), connMatrixMap.get(key));
465 }
466 }
467 List<Long> teLinkIds = null;
468 if (CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
469 teLinkIds = Lists.newArrayList();
470 for (TeLinkTpGlobalKey key : intNode.teLinkTpKeys()) {
471 teLinkIds = TeUtils.addListElement(teLinkIds, key.teLinkTpId());
472 }
473 }
474 List<Long> tps = null;
475 if (CollectionUtils.isNotEmpty(intNode.teTpKeys())) {
476 tps = Lists.newArrayList();
477 for (TeLinkTpGlobalKey key : intNode.teTpKeys()) {
478 tps = TeUtils.addListElement(tps, key.teLinkTpId());
479 }
480 }
481 Map<Long, TunnelTerminationPoint> ttps = null;
482 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
483 ttps = Maps.newHashMap();
484 for (TtpKey key : intNode.ttpKeys()) {
485 ttps.put(key.ttpId(), ttpMap.get(key));
486 }
487 }
488 return new DefaultTeNode(nodeKey.teNodeId(),
489 intNode.underlayTopologyKey(),
490 intNode.supportNodeKey(),
491 intNode.sourceTeNodeKey(), intNode.teData(),
492 connMatrices, teLinkIds, ttps, tps);
493 }
494
495 @Override
496 public TeNode teNode(TeNodeKey nodeKey) {
497 InternalTeNode intNode = teNodeMap.get(nodeKey);
498 return teNode(nodeKey, intNode);
499 }
500
501 private void removeTeNodeMapEntrys(InternalTeNode intNode) {
502 // Remove connMatrixMap entries for the node
503 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
504 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
505 connMatrixMap.remove(key);
506 }
507 }
508 // Remove ttpMap entries for the node
509 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
510 for (TtpKey key : intNode.ttpKeys()) {
511 ttpMap.remove(key);
512 }
513 }
514 }
515
516 private void updateTeNode(TeNodeKey nodeKey, TeNode node,
517 boolean parentUpdate, boolean teNodeUpdate,
518 NetworkNodeKey networkNodeKey) {
519 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
520 if (intTopo == null && !parentUpdate) {
521 log.error("TE Topology is not in dataStore for nodeUpdate {}",
522 nodeKey);
523 return;
524 }
525 InternalTeNode curNode = teNodeMap.get(nodeKey);
526 // Update connMatrixMap
527 if (MapUtils.isNotEmpty(node.connectivityMatrices())) {
528 for (Map.Entry<Long, ConnectivityMatrix> entry : node
529 .connectivityMatrices().entrySet()) {
530 connMatrixMap
531 .put(new ConnectivityMatrixKey(nodeKey, entry.getKey()),
532 entry.getValue());
533 }
534 }
535 // Update ttpMap
536 if (MapUtils.isNotEmpty(node.tunnelTerminationPoints())) {
537 for (Map.Entry<Long, TunnelTerminationPoint> entry : node
538 .tunnelTerminationPoints().entrySet()) {
539 ttpMap.put(new TtpKey(nodeKey, entry.getKey()),
540 entry.getValue());
541 }
542 }
543 // Update TE Termination Points
544
545 // Update teNodeMap
546 InternalTeNode intNode = new InternalTeNode(nodeKey, node,
547 networkNodeKey,
548 parentUpdate);
549 teNodeMap.put(nodeKey, intNode);
550 if (curNode == null && !parentUpdate && intTopo != null) {
551 // Update InternalTeTopology
552 intTopo.setChildUpdate(true);
553 TeUtils.addListElement(intTopo.teNodeKeys(), nodeKey);
554 }
555 // Update networkNodeMap
556 if (teNodeUpdate) {
557 updateNetworkNode(networkNodeKey, networkNode(node), parentUpdate,
558 teNodeUpdate, nodeKey);
559 }
560 }
561
562 private NetworkNode networkNode(TeNode node) {
563 KeyId nodeId = KeyId.keyId(Long.toString(node.teNodeId()));
564 List<NetworkNodeKey> supportingNodeIds = null;
565 if (node.supportingTeNodeId() != null) {
566 supportingNodeIds = Lists.newArrayList();
567 supportingNodeIds.add(new NetworkNodeKey(TeMgrUtil.toNetworkId((node
568 .supportingTeNodeId().teTopologyKey())), KeyId.keyId(Long
569 .toString(node.supportingTeNodeId().teNodeId()))));
570 }
571 Map<KeyId, TerminationPoint> tps = null;
572 if (node.teTerminationPointIds() != null) {
573 tps = Maps.newHashMap();
574 for (Long teTpId : node.teTerminationPointIds()) {
575 tps.put(KeyId.keyId(Long.toString(teTpId)),
576 new DefaultTerminationPoint(KeyId
577 .keyId(Long.toString(teTpId)), null, teTpId));
578 }
579 }
580 return new DefaultNetworkNode(nodeId, supportingNodeIds, node, tps);
581 }
582
583 @Override
584 public void updateTeNode(TeNodeKey nodeKey, TeNode node) {
585 updateTeNode(nodeKey, node, false, true,
586 TeMgrUtil.networkNodeKey(nodeKey));
587 }
588
589 private void removeTeNode(TeNodeKey nodeKey, boolean teNodeRemove) {
590 // Remove it from InternalTeTopology first
591 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
592 if (intTopo != null
593 && CollectionUtils.isNotEmpty(intTopo.teNodeKeys())) {
594 intTopo.setChildUpdate(true);
595 intTopo.teNodeKeys().remove(nodeKey);
596 }
597 // Then remove it from teNodeMap
598 InternalTeNode node = teNodeMap.remove(nodeKey);
599 removeTeNodeMapEntrys(node);
600 // Remove it from networkNodeMap
601 if (teNodeRemove && node != null) {
602 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
603 }
604 }
605
606 @Override
607 public void removeTeNode(TeNodeKey nodeKey) {
608 removeTeNode(nodeKey, true);
609 }
610
611 private NetworkNode networkNode(NetworkNodeKey nodeKey,
612 InternalNetworkNode intNode) {
613 if (intNode == null) {
614 return null;
615 }
616 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
617 for (KeyId tpId : intNode.tpIds()) {
618 tps.put(tpId,
619 terminationPoint(new TerminationPointKey(nodeKey, tpId)));
620
621 }
622 return new DefaultNetworkNode(nodeKey.nodeId(),
623 intNode.supportingNodeIds(),
624 teNode(intNode.teNodeKey()), tps);
625 }
626
627 @Override
628 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
629 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
630 return networkNode(nodeKey, intNode);
631 }
632
633 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
634 boolean parentUpdate, boolean teNodeUpdate,
635 TeNodeKey teNodeKey) {
636 InternalNetwork intNework = null;
637 if (!parentUpdate) {
638 intNework = networkMap.get(nodeKey.networkId());
639 if (intNework == null) {
640 log.error("Network is not in dataStore for nodeUpdate {}",
641 nodeKey);
642 return;
643 }
644 }
645
646 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
647 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
648 // Remove the TerminationPoints first
649 for (KeyId tpId : exNode.tpIds()) {
650 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
651 }
652 }
653
654 if (MapUtils.isNotEmpty(node.terminationPoints())) {
655 // Update with new TerminationPoints
656 for (Map.Entry<KeyId, TerminationPoint> entry : node
657 .terminationPoints().entrySet()) {
658 updateTerminationPoint(new TerminationPointKey(nodeKey,
659 entry.getKey()),
660 entry.getValue(), parentUpdate,
661 teNodeKey);
662 }
663 }
664
665 // Update teNodeMap first
666 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
667 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate,
668 nodeKey);
669 }
670 // Update networkNodeMap
671 InternalNetworkNode intNode = new InternalNetworkNode(node,
672 parentUpdate);
673 intNode.setTeNodeKey(teNodeKey);
674 networkNodeMap.put(nodeKey, intNode);
675 if (exNode == null && !parentUpdate && intNework != null) {
676 // Update the InternalNetwork
677 intNework.setChildUpdate(true);
678 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
679 }
680 }
681
682 @Override
683 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
684 TeNodeKey teNodeKey = null;
685 if (node.teNode() != null) {
686 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId())
687 .teTopologyKey(), node.teNode().teNodeId());
688 }
689 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
690 }
691
692 private void removeNetworkNode(NetworkNodeKey nodeKey,
693 boolean teNodeRemove) {
694 // Update the InternalNetwork
695 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
696 if (intNework != null
697 && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
698 intNework.setChildUpdate(true);
699 intNework.nodeIds().remove(nodeKey.nodeId());
700 }
701 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
702 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
703 // Remove the TerminationPoints first
704 for (KeyId tpId : intNode.tpIds()) {
705 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
706 }
707 }
708 if (!teNodeRemove && intNode != null) {
709 // Now remove it from teNodeMap
710 removeTeNode(intNode.teNodeKey(), teNodeRemove);
711 }
712 }
713
714 @Override
715 public void removeNetworkNode(NetworkNodeKey nodeKey) {
716 removeNetworkNode(nodeKey, false);
717 }
718
719 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
720 if (intLink == null) {
721 return null;
722 }
723 return new DefaultTeLink(linkKey.teLinkTpKey(), intLink.peerTeLinkKey(),
724 intLink.underlayTopologyKey(),
725 intLink.supportingLinkKey(),
726 intLink.sourceTeLinkKey(), intLink.teData());
727 }
728
729 @Override
730 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
731 InternalTeLink intLink = teLinkMap.get(linkKey);
732 return teLink(linkKey, intLink);
733 }
734
735 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
736 boolean parentUpdate, boolean teLinkUpdate,
737 NetworkLinkKey networkLinkKey) {
738 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
739 if (intTopo == null && !parentUpdate) {
740 log.error("TE Topology is not in dataStore for linkUpdate {}",
741 linkKey);
742 return;
743 }
744 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
745 if (intNode == null && !parentUpdate) {
746 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
747 return;
748 }
749 InternalTeLink exLink = teLinkMap.get(linkKey);
750
751 // Update teLinkMap
752 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
753 intLink.setNetworkLinkKey(networkLinkKey);
754 teLinkMap.put(linkKey, intLink);
755 if (exLink == null && !parentUpdate) {
756 if (intTopo != null) {
757 // Update the InternalTeTopology
758 intTopo.setChildUpdate(true);
759 intTopo.setTeLinkKeys(TeUtils
760 .addListElement(intTopo.teLinkKeys(), linkKey));
761 }
762 if (intNode != null) {
763 // Update the InternalNode
764 intNode.setChildUpdate(true);
765 intNode.setTeLinkTpKeys(TeUtils
766 .addListElement(intNode.teLinkTpKeys(), linkKey));
767 }
768 }
769
770 // Update networkLinkMap
771 if (teLinkUpdate) {
772 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
773 teLinkUpdate, linkKey);
774 }
775 }
776
777 private NetworkLink networkLink(TeLink link) {
778 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
779 NodeTpKey source = null;
780 if (link.teLinkKey() != null) {
781 source = new NodeTpKey(KeyId
782 .keyId(Long.toString(link.teLinkKey().teNodeId())), KeyId
783 .keyId(Long
784 .toString(link.teLinkKey().teLinkTpId())));
785 }
786 NodeTpKey dest = null;
787 if (link.peerTeLinkKey() != null) {
788 dest = new NodeTpKey(KeyId
789 .keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
790 KeyId.keyId(Long.toString(link.peerTeLinkKey()
791 .teLinkTpId())));
792 }
793 List<NetworkLinkKey> supportingLinkIds = null;
794 if (link.supportingTeLinkId() != null) {
795 supportingLinkIds = Lists.newArrayList();
796 supportingLinkIds.add(new NetworkLinkKey(TeMgrUtil.toNetworkId(link
797 .supportingTeLinkId().teTopologyKey()), TeMgrUtil
798 .toNetworkLinkId(link.supportingTeLinkId()
799 .teLinkTpKey())));
800 }
801 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds,
802 link);
803 }
804
805 @Override
806 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
807 updateTeLink(linkKey, link, false, true,
808 TeMgrUtil.networkLinkKey(linkKey));
809 }
810
811 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
812 // Remove it from InternalTeTopology first
813 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
814 if (intTopo != null
815 && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
816 intTopo.setChildUpdate(true);
817 intTopo.teLinkKeys().remove(linkKey);
818 }
819 // Remove it from InternalTeNode
820 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
821 if (intNode != null
822 && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
823 intNode.setChildUpdate(true);
824 intNode.teLinkTpKeys().remove(linkKey);
825 }
826 // Then remove it from teLinkMap
827 InternalTeLink link = teLinkMap.remove(linkKey);
828 if (teLinkRemove && link != null) {
829 // Remove it from networkLinkMap
830 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
831 }
832 }
833
834 @Override
835 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
836 removeTeLink(linkKey, true);
837 }
838
839 private NetworkLink networkLink(NetworkLinkKey linkKey,
840 InternalNetworkLink intLink) {
841 if (intLink == null) {
842 return null;
843 }
844 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
845 intLink.destination(),
846 intLink.supportingLinkIds(),
847 teLink(intLink.teLinkKey()));
848 }
849
850 @Override
851 public NetworkLink networkLink(NetworkLinkKey linkKey) {
852 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
853 return networkLink(linkKey, intLink);
854 }
855
856 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
857 boolean parentUpdate, boolean teLinkUpdate,
858 TeLinkTpGlobalKey teLinkKey) {
859 InternalNetwork intNework = null;
860 if (!parentUpdate) {
861 intNework = networkMap.get(linkKey.networkId());
862 if (intNework == null) {
863 log.error("Network is not in dataStore for linkUpdate {}",
864 linkKey);
865 return;
866 }
867 }
868
869 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
870
871 // Now update teLinkMap first
872 if (!teLinkUpdate && teLinkKey != null) {
873 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate,
874 linkKey);
875 }
876 // Update networkLinkMap
877 InternalNetworkLink intLink = new InternalNetworkLink(link,
878 parentUpdate);
879 intLink.setTeLinkKey(teLinkKey);
880 networkLinkMap.put(linkKey, intLink);
881 if (exLink == null && !parentUpdate && intNework != null) {
882 // Update the InternalNetwork
883 intNework.setChildUpdate(true);
884 TeUtils.addListElement(intNework.linkIds(), linkKey);
885 }
886 }
887
888 @Override
889 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
890 TeLinkTpGlobalKey teLinkKey = null;
891 if (link.teLink() != null) {
892 teLinkKey = new TeLinkTpGlobalKey(networkMap
893 .get(linkKey.networkId()).teTopologyKey(),
894 link.teLink().teLinkKey());
895 }
896
897 updateNetworkLink(linkKey, link, false, false, teLinkKey);
898 }
899
900 private void removeNetworkLink(NetworkLinkKey linkKey,
901 boolean teLinkRemove) {
902 // Update the InternalNetwork
903 InternalNetwork intNework = networkMap.get(linkKey.networkId());
904 if (intNework != null
905 && CollectionUtils.isNotEmpty(intNework.linkIds())) {
906 intNework.setChildUpdate(true);
907 intNework.linkIds().remove(linkKey.linkId());
908 }
909 // Remove it from networkLinkMap
910 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
911 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
912 // Now remove it from teLinkMap
913 removeTeLink(intLink.teLinkKey(), teLinkRemove);
914 }
915 }
916
917 @Override
918 public void removeNetworkLink(NetworkLinkKey linkKey) {
919 removeNetworkLink(linkKey, false);
920 }
921
922 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
923 InternalTerminationPoint intTp = tpMap.get(tpKey);
924 if (intTp == null) {
925 return null;
926 }
927 return new DefaultTerminationPoint(tpKey.tpId(),
928 intTp.supportingTpIds(),
929 intTp.teTpKey().teLinkTpId());
930 }
931
932 private void updateTerminationPoint(TerminationPointKey tpKey,
933 TerminationPoint tp,
934 boolean parentUpdate,
935 TeNodeKey teNodeKey) {
936 TeNodeKey myTeNodeKey;
937 InternalNetworkNode intNode = null;
938 if (!parentUpdate) {
939 intNode = networkNodeMap.get(tpKey.nodeId());
940 if (intNode == null) {
941 log.error(" node is not in dataStore for tp update {}", tpKey);
942 return;
943 }
944 myTeNodeKey = intNode.teNodeKey();
945 } else {
946 myTeNodeKey = teNodeKey;
947 }
948 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey,
949 tp.teTpId());
950
951 boolean newTp = tpMap.get(tpKey) == null;
952 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
953 intTp.setTeTpKey(teTpKey);
954 tpMap.put(tpKey, intTp);
955 if (newTp) {
956 // Update tpKeyMap
957 tpKeyMap.put(teTpKey, tpKey);
958 if (!parentUpdate && intNode != null) {
959 // Update InternalNetworkNode
960 intNode.setChildUpdate(true);
961 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(),
962 tpKey.tpId()));
963 }
964 }
965 }
966
967 @Override
968 public void updateTerminationPoint(TerminationPointKey tpKey,
969 TerminationPoint tp) {
970 updateTerminationPoint(tpKey, tp, false, null);
971 }
972
973 @Override
974 public void removeTerminationPoint(TerminationPointKey tpKey) {
975 // Update InternalNetworkNode
976 InternalNetworkNode intNode = networkNodeMap.get(tpKey.nodeId());
977 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
978 intNode.setChildUpdate(true);
979 intNode.tpIds().remove(tpKey.tpId());
980 }
981 // Remove it from tpMap
982 InternalTerminationPoint tp = tpMap.remove(tpKey);
983 // Remove it from tpKeyMap
984 if (tp != null) {
985 tpKeyMap.remove(tp.teTpKey());
986 }
987 }
988
989 @Override
990 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
991 return ttpMap.get(ttpId);
992 }
993
994 @Override
995 public long nextTeTopologyId() {
996 return 0;
997 }
998
999 @Override
1000 public long nextTeNodeId(TeTopologyKey topoKey) {
1001 return teTopologyMap.get(topoKey).nextTeNodeId();
1002 }
1003
1004 @Override
1005 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1006 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1007 }
1008
1009 @Override
1010 public KeyId networkId(TeTopologyKey teTopologyKey) {
1011 return teTopologyMap.get(teTopologyKey).topologyData().networkId();
1012 }
1013
1014 @Override
1015 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
1016 return teNodeMap.get(teNodeKey).networkNodeKey();
1017 }
1018
1019 @Override
1020 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
1021 return teLinkMap.get(teLinkKey).networkLinkKey();
1022 }
1023
1024 @Override
1025 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1026 return tpKeyMap.get(teTpKey);
1027 }
1028
1029 @Override
1030 public void setMapEventQueue(BlockingQueue<TeTopologyMapEvent> queue) {
1031 }
1032}
1033