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