blob: 7f4bb80371bdcf29b985c38f8a0fe52618b6a876 [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;
Yixiao Chen68bfab22016-11-11 11:04:10 -050080import org.onosproject.tetopology.management.impl.TeTopologyMapEvent;
81import org.onosproject.tetopology.management.impl.TeTopologyStore;
82import org.onosproject.tetopology.management.impl.TeTopologyStoreDelegate;
83import org.slf4j.Logger;
84
85import com.google.common.collect.Lists;
86import com.google.common.collect.Maps;
87
88/**
89 * Implementation of the TE network store.
90 */
91@Component(immediate = true)
92@Service
93public class SimpleTeTopologyStore
94 extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
95 implements TeTopologyStore {
96 private static final String STORE_NAME = "TE_NETWORK_TOPOLOGY_STORE";
97 private final Logger log = getLogger(getClass());
98
99 // Track TE topologies by TE Topology key
100 private Map<TeTopologyKey, InternalTeTopology> teTopologyMap = Maps
101 .newConcurrentMap();
102 // Track networks by network Id
103 private Map<KeyId, InternalNetwork> networkMap = Maps.newConcurrentMap();
104 // Track TE nodes by TE node key
105 private Map<TeNodeKey, InternalTeNode> teNodeMap = Maps.newConcurrentMap();
106 // Track ConnectivityMatrix by its key
107 private Map<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixMap = Maps
108 .newConcurrentMap();
109 // Track Tunnel Termination Points by its key
110 private Map<TtpKey, TunnelTerminationPoint> ttpMap = Maps
111 .newConcurrentMap();
112 // Track network nodes by network node key
113 private Map<NetworkNodeKey, InternalNetworkNode> networkNodeMap = Maps
114 .newConcurrentMap();
115 // Track TE links by its key
116 private Map<TeLinkTpGlobalKey, InternalTeLink> teLinkMap = Maps
117 .newConcurrentMap();
118 // Track network links by network link key
119 private Map<NetworkLinkKey, InternalNetworkLink> networkLinkMap = Maps
120 .newConcurrentMap();
121 // Track Termination points by termination point key
122 private Map<TerminationPointKey, InternalTerminationPoint> tpMap = Maps
123 .newConcurrentMap();
124 // Track termination point keys by TE termination point Key
125 private Map<TeLinkTpGlobalKey, TerminationPointKey> tpKeyMap = Maps
126 .newConcurrentMap();
Yixiao Chen29f06332016-12-07 16:14:29 -0500127 private long providerId;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500128
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);
Yixiao Chen29f06332016-12-07 16:14:29 -0500407 if (network.teTopologyId().clientId() == providerId) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500408 // Hard rule for now
409 flags.set(TeTopology.BIT_CUSTOMIZED);
410 }
411 CommonTopologyData common = new CommonTopologyData(network
412 .networkId(), OptimizationType.NOT_OPTIMIZED, flags, network
413 .ownerId());
414 intTopo.setTopologydata(common);
415 teTopologyMap.put(topoKey, intTopo);
416 // Assume new topology
417 TeTopologyEvent topologyEvent = new TeTopologyEvent(TE_TOPOLOGY_ADDED,
418 teTopology(topoKey));
419 notifyDelegate(topologyEvent);
420 }
421 // Finally Update networkMap
422 InternalNetwork newNetwork = new InternalNetwork(network);
423 newNetwork.setTeTopologyKey(topoKey);
424 networkMap.put(network.networkId(), newNetwork);
425 // Assume new network
426 TeTopologyEvent topologyEvent = new TeTopologyEvent(NETWORK_ADDED,
427 network(network
428 .networkId()));
429 notifyDelegate(topologyEvent);
430 }
431
432 @Override
433 public void removeNetwork(KeyId networkId) {
434 // Remove it from networkMap
435 InternalNetwork network = networkMap.remove(networkId);
436 TeTopologyEvent topologyEvent = new TeTopologyEvent(NETWORK_REMOVED,
437 new DefaultNetwork(networkId,
438 null,
439 null,
440 null,
441 null,
442 false,
443 null));
444 notifyDelegate(topologyEvent);
445 if (network != null && network.teTopologyKey() != null) {
446 removeNetworkMapEntrys(network, false);
447 teTopologyMap.remove(network.teTopologyKey());
448 topologyEvent = new TeTopologyEvent(TE_TOPOLOGY_REMOVED,
449 new DefaultTeTopology(network
450 .teTopologyKey(), null, null, null, null));
451 notifyDelegate(topologyEvent);
452 }
453 }
454
455 private TeNode teNode(TeNodeKey nodeKey, InternalTeNode intNode) {
456 if (intNode == null) {
457 return null;
458 }
459 Map<Long, ConnectivityMatrix> connMatrices = null;
460 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
461 connMatrices = Maps.newHashMap();
462 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
463 connMatrices.put(key.entryId(), connMatrixMap.get(key));
464 }
465 }
466 List<Long> teLinkIds = null;
467 if (CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
468 teLinkIds = Lists.newArrayList();
469 for (TeLinkTpGlobalKey key : intNode.teLinkTpKeys()) {
470 teLinkIds = TeUtils.addListElement(teLinkIds, key.teLinkTpId());
471 }
472 }
473 List<Long> tps = null;
474 if (CollectionUtils.isNotEmpty(intNode.teTpKeys())) {
475 tps = Lists.newArrayList();
476 for (TeLinkTpGlobalKey key : intNode.teTpKeys()) {
477 tps = TeUtils.addListElement(tps, key.teLinkTpId());
478 }
479 }
480 Map<Long, TunnelTerminationPoint> ttps = null;
481 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
482 ttps = Maps.newHashMap();
483 for (TtpKey key : intNode.ttpKeys()) {
484 ttps.put(key.ttpId(), ttpMap.get(key));
485 }
486 }
487 return new DefaultTeNode(nodeKey.teNodeId(),
488 intNode.underlayTopologyKey(),
489 intNode.supportNodeKey(),
490 intNode.sourceTeNodeKey(), intNode.teData(),
491 connMatrices, teLinkIds, ttps, tps);
492 }
493
494 @Override
495 public TeNode teNode(TeNodeKey nodeKey) {
496 InternalTeNode intNode = teNodeMap.get(nodeKey);
497 return teNode(nodeKey, intNode);
498 }
499
500 private void removeTeNodeMapEntrys(InternalTeNode intNode) {
501 // Remove connMatrixMap entries for the node
502 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
503 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
504 connMatrixMap.remove(key);
505 }
506 }
507 // Remove ttpMap entries for the node
508 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
509 for (TtpKey key : intNode.ttpKeys()) {
510 ttpMap.remove(key);
511 }
512 }
513 }
514
515 private void updateTeNode(TeNodeKey nodeKey, TeNode node,
516 boolean parentUpdate, boolean teNodeUpdate,
517 NetworkNodeKey networkNodeKey) {
518 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
519 if (intTopo == null && !parentUpdate) {
520 log.error("TE Topology is not in dataStore for nodeUpdate {}",
521 nodeKey);
522 return;
523 }
524 InternalTeNode curNode = teNodeMap.get(nodeKey);
525 // Update connMatrixMap
526 if (MapUtils.isNotEmpty(node.connectivityMatrices())) {
527 for (Map.Entry<Long, ConnectivityMatrix> entry : node
528 .connectivityMatrices().entrySet()) {
529 connMatrixMap
530 .put(new ConnectivityMatrixKey(nodeKey, entry.getKey()),
531 entry.getValue());
532 }
533 }
534 // Update ttpMap
535 if (MapUtils.isNotEmpty(node.tunnelTerminationPoints())) {
536 for (Map.Entry<Long, TunnelTerminationPoint> entry : node
537 .tunnelTerminationPoints().entrySet()) {
538 ttpMap.put(new TtpKey(nodeKey, entry.getKey()),
539 entry.getValue());
540 }
541 }
542 // Update TE Termination Points
543
544 // Update teNodeMap
545 InternalTeNode intNode = new InternalTeNode(nodeKey, node,
546 networkNodeKey,
547 parentUpdate);
548 teNodeMap.put(nodeKey, intNode);
549 if (curNode == null && !parentUpdate && intTopo != null) {
550 // Update InternalTeTopology
551 intTopo.setChildUpdate(true);
552 TeUtils.addListElement(intTopo.teNodeKeys(), nodeKey);
553 }
554 // Update networkNodeMap
555 if (teNodeUpdate) {
556 updateNetworkNode(networkNodeKey, networkNode(node), parentUpdate,
557 teNodeUpdate, nodeKey);
558 }
559 }
560
561 private NetworkNode networkNode(TeNode node) {
562 KeyId nodeId = KeyId.keyId(Long.toString(node.teNodeId()));
563 List<NetworkNodeKey> supportingNodeIds = null;
564 if (node.supportingTeNodeId() != null) {
565 supportingNodeIds = Lists.newArrayList();
566 supportingNodeIds.add(new NetworkNodeKey(TeMgrUtil.toNetworkId((node
567 .supportingTeNodeId().teTopologyKey())), KeyId.keyId(Long
568 .toString(node.supportingTeNodeId().teNodeId()))));
569 }
570 Map<KeyId, TerminationPoint> tps = null;
571 if (node.teTerminationPointIds() != null) {
572 tps = Maps.newHashMap();
573 for (Long teTpId : node.teTerminationPointIds()) {
574 tps.put(KeyId.keyId(Long.toString(teTpId)),
575 new DefaultTerminationPoint(KeyId
576 .keyId(Long.toString(teTpId)), null, teTpId));
577 }
578 }
579 return new DefaultNetworkNode(nodeId, supportingNodeIds, node, tps);
580 }
581
582 @Override
583 public void updateTeNode(TeNodeKey nodeKey, TeNode node) {
584 updateTeNode(nodeKey, node, false, true,
585 TeMgrUtil.networkNodeKey(nodeKey));
586 }
587
588 private void removeTeNode(TeNodeKey nodeKey, boolean teNodeRemove) {
589 // Remove it from InternalTeTopology first
590 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
591 if (intTopo != null
592 && CollectionUtils.isNotEmpty(intTopo.teNodeKeys())) {
593 intTopo.setChildUpdate(true);
594 intTopo.teNodeKeys().remove(nodeKey);
595 }
596 // Then remove it from teNodeMap
597 InternalTeNode node = teNodeMap.remove(nodeKey);
598 removeTeNodeMapEntrys(node);
599 // Remove it from networkNodeMap
600 if (teNodeRemove && node != null) {
601 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
602 }
603 }
604
605 @Override
606 public void removeTeNode(TeNodeKey nodeKey) {
607 removeTeNode(nodeKey, true);
608 }
609
610 private NetworkNode networkNode(NetworkNodeKey nodeKey,
611 InternalNetworkNode intNode) {
612 if (intNode == null) {
613 return null;
614 }
615 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
616 for (KeyId tpId : intNode.tpIds()) {
617 tps.put(tpId,
618 terminationPoint(new TerminationPointKey(nodeKey, tpId)));
619
620 }
621 return new DefaultNetworkNode(nodeKey.nodeId(),
622 intNode.supportingNodeIds(),
623 teNode(intNode.teNodeKey()), tps);
624 }
625
626 @Override
627 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
628 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
629 return networkNode(nodeKey, intNode);
630 }
631
632 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
633 boolean parentUpdate, boolean teNodeUpdate,
634 TeNodeKey teNodeKey) {
635 InternalNetwork intNework = null;
636 if (!parentUpdate) {
637 intNework = networkMap.get(nodeKey.networkId());
638 if (intNework == null) {
639 log.error("Network is not in dataStore for nodeUpdate {}",
640 nodeKey);
641 return;
642 }
643 }
644
645 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
646 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
647 // Remove the TerminationPoints first
648 for (KeyId tpId : exNode.tpIds()) {
649 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
650 }
651 }
652
653 if (MapUtils.isNotEmpty(node.terminationPoints())) {
654 // Update with new TerminationPoints
655 for (Map.Entry<KeyId, TerminationPoint> entry : node
656 .terminationPoints().entrySet()) {
657 updateTerminationPoint(new TerminationPointKey(nodeKey,
658 entry.getKey()),
659 entry.getValue(), parentUpdate,
660 teNodeKey);
661 }
662 }
663
664 // Update teNodeMap first
665 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
666 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate,
667 nodeKey);
668 }
669 // Update networkNodeMap
670 InternalNetworkNode intNode = new InternalNetworkNode(node,
671 parentUpdate);
672 intNode.setTeNodeKey(teNodeKey);
673 networkNodeMap.put(nodeKey, intNode);
674 if (exNode == null && !parentUpdate && intNework != null) {
675 // Update the InternalNetwork
676 intNework.setChildUpdate(true);
677 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
678 }
679 }
680
681 @Override
682 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
683 TeNodeKey teNodeKey = null;
684 if (node.teNode() != null) {
685 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId())
686 .teTopologyKey(), node.teNode().teNodeId());
687 }
688 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
689 }
690
691 private void removeNetworkNode(NetworkNodeKey nodeKey,
692 boolean teNodeRemove) {
693 // Update the InternalNetwork
694 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
695 if (intNework != null
696 && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
697 intNework.setChildUpdate(true);
698 intNework.nodeIds().remove(nodeKey.nodeId());
699 }
700 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
701 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
702 // Remove the TerminationPoints first
703 for (KeyId tpId : intNode.tpIds()) {
704 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
705 }
706 }
707 if (!teNodeRemove && intNode != null) {
708 // Now remove it from teNodeMap
709 removeTeNode(intNode.teNodeKey(), teNodeRemove);
710 }
711 }
712
713 @Override
714 public void removeNetworkNode(NetworkNodeKey nodeKey) {
715 removeNetworkNode(nodeKey, false);
716 }
717
718 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
719 if (intLink == null) {
720 return null;
721 }
722 return new DefaultTeLink(linkKey.teLinkTpKey(), intLink.peerTeLinkKey(),
723 intLink.underlayTopologyKey(),
724 intLink.supportingLinkKey(),
725 intLink.sourceTeLinkKey(), intLink.teData());
726 }
727
728 @Override
729 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
730 InternalTeLink intLink = teLinkMap.get(linkKey);
731 return teLink(linkKey, intLink);
732 }
733
734 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
735 boolean parentUpdate, boolean teLinkUpdate,
736 NetworkLinkKey networkLinkKey) {
737 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
738 if (intTopo == null && !parentUpdate) {
739 log.error("TE Topology is not in dataStore for linkUpdate {}",
740 linkKey);
741 return;
742 }
743 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
744 if (intNode == null && !parentUpdate) {
745 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
746 return;
747 }
748 InternalTeLink exLink = teLinkMap.get(linkKey);
749
750 // Update teLinkMap
751 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
752 intLink.setNetworkLinkKey(networkLinkKey);
753 teLinkMap.put(linkKey, intLink);
754 if (exLink == null && !parentUpdate) {
755 if (intTopo != null) {
756 // Update the InternalTeTopology
757 intTopo.setChildUpdate(true);
758 intTopo.setTeLinkKeys(TeUtils
759 .addListElement(intTopo.teLinkKeys(), linkKey));
760 }
761 if (intNode != null) {
762 // Update the InternalNode
763 intNode.setChildUpdate(true);
764 intNode.setTeLinkTpKeys(TeUtils
765 .addListElement(intNode.teLinkTpKeys(), linkKey));
766 }
767 }
768
769 // Update networkLinkMap
770 if (teLinkUpdate) {
771 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
772 teLinkUpdate, linkKey);
773 }
774 }
775
776 private NetworkLink networkLink(TeLink link) {
777 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
778 NodeTpKey source = null;
779 if (link.teLinkKey() != null) {
780 source = new NodeTpKey(KeyId
781 .keyId(Long.toString(link.teLinkKey().teNodeId())), KeyId
782 .keyId(Long
783 .toString(link.teLinkKey().teLinkTpId())));
784 }
785 NodeTpKey dest = null;
786 if (link.peerTeLinkKey() != null) {
787 dest = new NodeTpKey(KeyId
788 .keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
789 KeyId.keyId(Long.toString(link.peerTeLinkKey()
790 .teLinkTpId())));
791 }
792 List<NetworkLinkKey> supportingLinkIds = null;
793 if (link.supportingTeLinkId() != null) {
794 supportingLinkIds = Lists.newArrayList();
795 supportingLinkIds.add(new NetworkLinkKey(TeMgrUtil.toNetworkId(link
796 .supportingTeLinkId().teTopologyKey()), TeMgrUtil
797 .toNetworkLinkId(link.supportingTeLinkId()
798 .teLinkTpKey())));
799 }
800 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds,
801 link);
802 }
803
804 @Override
805 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
806 updateTeLink(linkKey, link, false, true,
807 TeMgrUtil.networkLinkKey(linkKey));
808 }
809
810 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
811 // Remove it from InternalTeTopology first
812 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
813 if (intTopo != null
814 && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
815 intTopo.setChildUpdate(true);
816 intTopo.teLinkKeys().remove(linkKey);
817 }
818 // Remove it from InternalTeNode
819 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
820 if (intNode != null
821 && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
822 intNode.setChildUpdate(true);
823 intNode.teLinkTpKeys().remove(linkKey);
824 }
825 // Then remove it from teLinkMap
826 InternalTeLink link = teLinkMap.remove(linkKey);
827 if (teLinkRemove && link != null) {
828 // Remove it from networkLinkMap
829 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
830 }
831 }
832
833 @Override
834 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
835 removeTeLink(linkKey, true);
836 }
837
838 private NetworkLink networkLink(NetworkLinkKey linkKey,
839 InternalNetworkLink intLink) {
840 if (intLink == null) {
841 return null;
842 }
843 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
844 intLink.destination(),
845 intLink.supportingLinkIds(),
846 teLink(intLink.teLinkKey()));
847 }
848
849 @Override
850 public NetworkLink networkLink(NetworkLinkKey linkKey) {
851 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
852 return networkLink(linkKey, intLink);
853 }
854
855 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
856 boolean parentUpdate, boolean teLinkUpdate,
857 TeLinkTpGlobalKey teLinkKey) {
858 InternalNetwork intNework = null;
859 if (!parentUpdate) {
860 intNework = networkMap.get(linkKey.networkId());
861 if (intNework == null) {
862 log.error("Network is not in dataStore for linkUpdate {}",
863 linkKey);
864 return;
865 }
866 }
867
868 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
869
870 // Now update teLinkMap first
871 if (!teLinkUpdate && teLinkKey != null) {
872 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate,
873 linkKey);
874 }
875 // Update networkLinkMap
876 InternalNetworkLink intLink = new InternalNetworkLink(link,
877 parentUpdate);
878 intLink.setTeLinkKey(teLinkKey);
879 networkLinkMap.put(linkKey, intLink);
880 if (exLink == null && !parentUpdate && intNework != null) {
881 // Update the InternalNetwork
882 intNework.setChildUpdate(true);
883 TeUtils.addListElement(intNework.linkIds(), linkKey);
884 }
885 }
886
887 @Override
888 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
889 TeLinkTpGlobalKey teLinkKey = null;
890 if (link.teLink() != null) {
891 teLinkKey = new TeLinkTpGlobalKey(networkMap
892 .get(linkKey.networkId()).teTopologyKey(),
893 link.teLink().teLinkKey());
894 }
895
896 updateNetworkLink(linkKey, link, false, false, teLinkKey);
897 }
898
899 private void removeNetworkLink(NetworkLinkKey linkKey,
900 boolean teLinkRemove) {
901 // Update the InternalNetwork
902 InternalNetwork intNework = networkMap.get(linkKey.networkId());
903 if (intNework != null
904 && CollectionUtils.isNotEmpty(intNework.linkIds())) {
905 intNework.setChildUpdate(true);
906 intNework.linkIds().remove(linkKey.linkId());
907 }
908 // Remove it from networkLinkMap
909 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
910 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
911 // Now remove it from teLinkMap
912 removeTeLink(intLink.teLinkKey(), teLinkRemove);
913 }
914 }
915
916 @Override
917 public void removeNetworkLink(NetworkLinkKey linkKey) {
918 removeNetworkLink(linkKey, false);
919 }
920
921 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
922 InternalTerminationPoint intTp = tpMap.get(tpKey);
923 if (intTp == null) {
924 return null;
925 }
926 return new DefaultTerminationPoint(tpKey.tpId(),
927 intTp.supportingTpIds(),
928 intTp.teTpKey().teLinkTpId());
929 }
930
931 private void updateTerminationPoint(TerminationPointKey tpKey,
932 TerminationPoint tp,
933 boolean parentUpdate,
934 TeNodeKey teNodeKey) {
935 TeNodeKey myTeNodeKey;
936 InternalNetworkNode intNode = null;
937 if (!parentUpdate) {
938 intNode = networkNodeMap.get(tpKey.nodeId());
939 if (intNode == null) {
940 log.error(" node is not in dataStore for tp update {}", tpKey);
941 return;
942 }
943 myTeNodeKey = intNode.teNodeKey();
944 } else {
945 myTeNodeKey = teNodeKey;
946 }
947 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey,
948 tp.teTpId());
949
950 boolean newTp = tpMap.get(tpKey) == null;
951 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
952 intTp.setTeTpKey(teTpKey);
953 tpMap.put(tpKey, intTp);
954 if (newTp) {
955 // Update tpKeyMap
956 tpKeyMap.put(teTpKey, tpKey);
957 if (!parentUpdate && intNode != null) {
958 // Update InternalNetworkNode
959 intNode.setChildUpdate(true);
960 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(),
961 tpKey.tpId()));
962 }
963 }
964 }
965
966 @Override
967 public void updateTerminationPoint(TerminationPointKey tpKey,
968 TerminationPoint tp) {
969 updateTerminationPoint(tpKey, tp, false, null);
970 }
971
972 @Override
973 public void removeTerminationPoint(TerminationPointKey tpKey) {
974 // Update InternalNetworkNode
975 InternalNetworkNode intNode = networkNodeMap.get(tpKey.nodeId());
976 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
977 intNode.setChildUpdate(true);
978 intNode.tpIds().remove(tpKey.tpId());
979 }
980 // Remove it from tpMap
981 InternalTerminationPoint tp = tpMap.remove(tpKey);
982 // Remove it from tpKeyMap
983 if (tp != null) {
984 tpKeyMap.remove(tp.teTpKey());
985 }
986 }
987
988 @Override
989 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
990 return ttpMap.get(ttpId);
991 }
992
993 @Override
994 public long nextTeTopologyId() {
995 return 0;
996 }
997
998 @Override
999 public long nextTeNodeId(TeTopologyKey topoKey) {
1000 return teTopologyMap.get(topoKey).nextTeNodeId();
1001 }
1002
1003 @Override
1004 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1005 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1006 }
1007
1008 @Override
1009 public KeyId networkId(TeTopologyKey teTopologyKey) {
1010 return teTopologyMap.get(teTopologyKey).topologyData().networkId();
1011 }
1012
1013 @Override
1014 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
1015 return teNodeMap.get(teNodeKey).networkNodeKey();
1016 }
1017
1018 @Override
1019 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
1020 return teLinkMap.get(teLinkKey).networkLinkKey();
1021 }
1022
1023 @Override
1024 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1025 return tpKeyMap.get(teTpKey);
1026 }
1027
1028 @Override
1029 public void setMapEventQueue(BlockingQueue<TeTopologyMapEvent> queue) {
1030 }
Yixiao Chen29f06332016-12-07 16:14:29 -05001031
1032 @Override
1033 public void setProviderId(long providerId) {
1034 this.providerId = providerId;
1035 }
Yixiao Chen68bfab22016-11-11 11:04:10 -05001036}
1037