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