blob: 69e533aae91d0a324d70b71391d0e5cb4d7f5338 [file] [log] [blame]
Yixiao Chen68bfab22016-11-11 11:04:10 -05001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.tetopology.management.impl;
17
18import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
19import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
20import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
21import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
22import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
23import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_UPDATED;
24import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
25import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
26import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
27import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
28import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
29import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
30import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
31import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
32import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
33import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
34import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
35import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_UPDATED;
36import static org.slf4j.LoggerFactory.getLogger;
37
38import java.util.BitSet;
39import java.util.List;
40import java.util.Map;
41import java.util.concurrent.BlockingQueue;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050042import java.util.concurrent.LinkedBlockingQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -050043
44import org.apache.commons.collections.CollectionUtils;
45import org.apache.commons.collections.MapUtils;
46import org.apache.felix.scr.annotations.Activate;
47import org.apache.felix.scr.annotations.Component;
48import org.apache.felix.scr.annotations.Deactivate;
49import org.apache.felix.scr.annotations.Reference;
50import org.apache.felix.scr.annotations.ReferenceCardinality;
51import org.apache.felix.scr.annotations.Service;
52import org.onlab.util.KryoNamespace;
53import org.onosproject.net.DeviceId;
54import org.onosproject.store.AbstractStore;
55import org.onosproject.store.serializers.KryoNamespaces;
56import org.onosproject.store.service.AtomicCounter;
57import org.onosproject.store.service.ConsistentMap;
58import org.onosproject.store.service.MapEvent;
59import org.onosproject.store.service.MapEventListener;
60import org.onosproject.store.service.Serializer;
61import org.onosproject.store.service.StorageService;
62import org.onosproject.tetopology.management.api.CommonTopologyData;
63import org.onosproject.tetopology.management.api.DefaultNetwork;
64import org.onosproject.tetopology.management.api.DefaultTeTopologies;
65import org.onosproject.tetopology.management.api.DefaultTeTopology;
66import org.onosproject.tetopology.management.api.EncodingType;
67import org.onosproject.tetopology.management.api.KeyId;
68import org.onosproject.tetopology.management.api.LongValue;
69import org.onosproject.tetopology.management.api.Network;
70import org.onosproject.tetopology.management.api.OptimizationType;
71import org.onosproject.tetopology.management.api.ProviderClientId;
72import org.onosproject.tetopology.management.api.SwitchingType;
73import org.onosproject.tetopology.management.api.TeConstants;
74import org.onosproject.tetopology.management.api.TeStatus;
75import org.onosproject.tetopology.management.api.TeTopologies;
76import org.onosproject.tetopology.management.api.TeTopology;
77import org.onosproject.tetopology.management.api.TeTopologyEvent;
78import org.onosproject.tetopology.management.api.TeTopologyEvent.Type;
79import org.onosproject.tetopology.management.api.TeTopologyId;
80import org.onosproject.tetopology.management.api.TeTopologyKey;
81import org.onosproject.tetopology.management.api.TeUtils;
82import org.onosproject.tetopology.management.api.link.AsNumber;
83import org.onosproject.tetopology.management.api.link.CommonLinkData;
Yixiao Chen29f06332016-12-07 16:14:29 -050084import org.onosproject.tetopology.management.api.link.ConnectivityMatrixId;
Yixiao Chen68bfab22016-11-11 11:04:10 -050085import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
86import org.onosproject.tetopology.management.api.link.DefaultTeLink;
87import org.onosproject.tetopology.management.api.link.ElementType;
88import org.onosproject.tetopology.management.api.link.ExternalLink;
89import org.onosproject.tetopology.management.api.link.Label;
90import org.onosproject.tetopology.management.api.link.LinkBandwidth;
91import org.onosproject.tetopology.management.api.link.NetworkLink;
92import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
93import org.onosproject.tetopology.management.api.link.OduResource;
94import org.onosproject.tetopology.management.api.link.PathElement;
95import org.onosproject.tetopology.management.api.link.TeIpv4;
96import org.onosproject.tetopology.management.api.link.TeIpv6;
97import org.onosproject.tetopology.management.api.link.TeLink;
Yixiao Chen29f06332016-12-07 16:14:29 -050098import org.onosproject.tetopology.management.api.link.TeLinkId;
Yixiao Chen68bfab22016-11-11 11:04:10 -050099import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
100import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
101import org.onosproject.tetopology.management.api.link.TePathAttributes;
102import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
103import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
104import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
105import org.onosproject.tetopology.management.api.link.UnderlayPath;
106import org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath;
107import org.onosproject.tetopology.management.api.link.UnnumberedLink;
108import org.onosproject.tetopology.management.api.node.CommonNodeData;
109import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
110import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
111import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
112import org.onosproject.tetopology.management.api.node.DefaultTeNode;
113import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
114import org.onosproject.tetopology.management.api.node.DefaultTunnelTerminationPoint;
115import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
116import org.onosproject.tetopology.management.api.node.NetworkNode;
117import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
118import org.onosproject.tetopology.management.api.node.NodeTpKey;
119import org.onosproject.tetopology.management.api.node.TeNode;
120import org.onosproject.tetopology.management.api.node.TeNodeKey;
121import org.onosproject.tetopology.management.api.node.TerminationPoint;
122import org.onosproject.tetopology.management.api.node.TerminationPointKey;
123import org.onosproject.tetopology.management.api.node.TtpKey;
124import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
125import org.slf4j.Logger;
126
Yixiao Chen68bfab22016-11-11 11:04:10 -0500127import com.google.common.collect.Lists;
128import com.google.common.collect.Maps;
129
130/**
131 * Implementation of the TE network store.
132 */
133@Component(immediate = true)
134@Service
135public class DistributedTeTopologyStore
136 extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
137 implements TeTopologyStore {
138 private static final String STORE_NAME = "TE_NETWORK_TOPOLOGY_STORE";
139 private static final String TETOPOLOGYKEY_INTERNALTETOPOLOGY = "TeTopologyKey-InternalTeTopology";
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500140 private static final String NETWORKID_NETWORK = "NetworkId-InternalNetwork";
Yixiao Chen68bfab22016-11-11 11:04:10 -0500141 private static final String TENODEKEY_INTERNALTENODE = "TeNodeKey-InternalTeNode";
142 private static final String CONNMATRIXKEY_CONNECTIVITYMATRIX = "ConnMatrixKey-ConnectivityMatrix";
143 private static final String NETWORKNODEKEY_INTERNALNETWORKNODE = "NetworkNodeKey-InternalNetworkNode";
144 private static final String TELINKGLOBALKEY_INTERNALTELINK = "TeLinkGlobalKey-InternalTeLink";
145 private static final String NETWORKLINKKEY_INTERNALNETWORKLINK = "NetworkLinkKey-InternalNetworkLink";
146 private static final String TPKEY_INTERNALTERMINATIONPOINT = "tpKey-InternalTerminationPoint";
147 private static final String TELINKTPGLOBALKEY_TERMINATIONPOINTKEY = "TeLinkGlobalKey-TerminationPointKey";
148 private static final String TTPKEY_TUNNELTERMINATIONPOINT = "TtpKey-TunnelTerminationPoint";
149 private final Logger log = getLogger(getClass());
150
151 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
152 protected StorageService storageService;
153 // Track TE topologies by TE Topology key
154 private ConsistentMap<TeTopologyKey, InternalTeTopology> teTopologyConsistentMap;
155 private Map<TeTopologyKey, InternalTeTopology> teTopologyMap;
156 private AtomicCounter nextTeTopologyId;
157 // Listener for te topology events
158 private final MapEventListener<TeTopologyKey, InternalTeTopology> teTopologyListener =
159 new InternalTeTopologyListener();
160 // Track networks by network Id
161 private ConsistentMap<KeyId, InternalNetwork> networkConsistentMap;
162 private Map<KeyId, InternalNetwork> networkMap;
163 // Listener for network events
164 private final MapEventListener<KeyId, InternalNetwork> networkListener =
165 new InternalNetworkListener();
166 // Track TE nodes by TE node key
167 private ConsistentMap<TeNodeKey, InternalTeNode> teNodeConsistentMap;
168 private Map<TeNodeKey, InternalTeNode> teNodeMap;
169 // Track ConnectivityMatrix by its key
170 private ConsistentMap<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixConsistentMap;
171 private Map<ConnectivityMatrixKey, ConnectivityMatrix> connMatrixMap;
172 // Track Tunnel Termination Points by its key
173 private ConsistentMap<TtpKey, TunnelTerminationPoint> ttpConsistentMap;
174 private Map<TtpKey, TunnelTerminationPoint> ttpMap;
175 // Listener for TE node events
176 private final MapEventListener<TeNodeKey, InternalTeNode> teNodeListener =
177 new InternalTeNodeListener();
178 // Track network nodes by network node key
179 private ConsistentMap<NetworkNodeKey, InternalNetworkNode> networkNodeConsistentMap;
180 private Map<NetworkNodeKey, InternalNetworkNode> networkNodeMap;
181 // Listener for network node events
182 private final MapEventListener<NetworkNodeKey, InternalNetworkNode> networkNodeListener =
183 new InternalNetworkNodeListener();
184 // Track TE links by its key
185 private ConsistentMap<TeLinkTpGlobalKey, InternalTeLink> teLinkConsistentMap;
186 private Map<TeLinkTpGlobalKey, InternalTeLink> teLinkMap;
187 // Listener for te link events
188 private final MapEventListener<TeLinkTpGlobalKey, InternalTeLink> teLinkListener =
189 new InternalTeLinkListener();
190 // Track network links by network link key
191 private ConsistentMap<NetworkLinkKey, InternalNetworkLink> networkLinkConsistentMap;
192 private Map<NetworkLinkKey, InternalNetworkLink> networkLinkMap;
193 // Listener for network link events
194 private final MapEventListener<NetworkLinkKey, InternalNetworkLink> networkLinkListener =
195 new InternalNetworkLinkListener();
196 // Track Termination points by termination point key
197 private ConsistentMap<TerminationPointKey, InternalTerminationPoint> tpConsistentMap;
198 private Map<TerminationPointKey, InternalTerminationPoint> tpMap;
199 // Track termination point keys by TE termination point Key
200 private ConsistentMap<TeLinkTpGlobalKey, TerminationPointKey> tpKeyConsistentMap;
201 private Map<TeLinkTpGlobalKey, TerminationPointKey> tpKeyMap;
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500202 private final BlockingQueue<TeTopologyMapEvent> mapEventQueue = new LinkedBlockingQueue<>();
203
Yixiao Chen29f06332016-12-07 16:14:29 -0500204 private long providerId;
Yixiao Chen68bfab22016-11-11 11:04:10 -0500205 private static final Serializer TETOPOLOGY_SERIALIZER = Serializer
206 .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
207 .register(TeTopologyKey.class)
208 .register(ProviderClientId.class)
209 .register(TeNodeKey.class)
210 .register(TeLinkTpGlobalKey.class)
211 .register(CommonTopologyData.class)
212 .register(KeyId.class)
213 .register(OptimizationType.class)
Yixiao Chen68bfab22016-11-11 11:04:10 -0500214 .register(InternalTeTopology.class)
215 .register(InternalNetwork.class)
216 .register(InternalTerminationPoint.class)
217 .register(InternalTeNode.class)
218 .register(InternalNetworkNode.class)
219 .register(CommonNodeData.class)
220 .register(ConnectivityMatrixKey.class)
221 .register(ConnectivityMatrix.class)
222 .register(TtpKey.class)
223 .register(NetworkNodeKey.class)
224 .register(TeStatus.class)
225 .register(ElementType.class)
226 .register(TeIpv4.class)
227 .register(TeIpv6.class)
228 .register(AsNumber.class)
229 .register(Label.class)
230 .register(UnnumberedLink.class)
Yixiao Chen29f06332016-12-07 16:14:29 -0500231 .register(TeLinkId.class)
232 .register(ConnectivityMatrixId.class)
Yixiao Chen68bfab22016-11-11 11:04:10 -0500233 .register(InternalTeLink.class)
234 .register(InternalNetworkLink.class)
235 .register(TeLinkTpKey.class)
236 .register(NetworkLinkKey.class)
237 .register(NodeTpKey.class)
238 .register(CommonLinkData.class)
239 .register(SwitchingType.class)
240 .register(EncodingType.class)
241 .register(ExternalLink.class)
242 .register(UnderlayPath.class)
243 .register(LinkBandwidth.class)
244 .register(OduResource.class)
245 .register(PathElement.class)
246 .register(UnderlayAbstractPath.class)
247 .register(UnderlayBackupPath.class)
248 .register(UnderlayPrimaryPath.class)
249 .register(TePathAttributes.class)
250 .register(TerminationPoint.class)
251 .register(TunnelTerminationPoint.class)
252 .register(DefaultTunnelTerminationPoint.class)
253 .register(TerminationPointKey.class)
254 .register(TunnelProtectionType.class)
255 .register(LongValue.class)
256 .register(LocalLinkConnectivity.class)
257 .build());
258
259 /**
260 * Distributed network store service activate method.
261 */
262 @Activate
263 public void activate() {
264 teTopologyConsistentMap = storageService
265 .<TeTopologyKey, InternalTeTopology>consistentMapBuilder()
266 .withSerializer(TETOPOLOGY_SERIALIZER)
267 .withName(TETOPOLOGYKEY_INTERNALTETOPOLOGY)
268 .withRelaxedReadConsistency()
269 .build();
270 teTopologyConsistentMap.addListener(teTopologyListener);
271 teTopologyMap = teTopologyConsistentMap.asJavaMap();
272 networkConsistentMap = storageService
273 .<KeyId, InternalNetwork>consistentMapBuilder()
274 .withSerializer(TETOPOLOGY_SERIALIZER)
275 .withName(NETWORKID_NETWORK)
276 .withRelaxedReadConsistency()
277 .build();
278 networkConsistentMap.addListener(networkListener);
279 networkMap = networkConsistentMap.asJavaMap();
280 teNodeConsistentMap = storageService
281 .<TeNodeKey, InternalTeNode>consistentMapBuilder()
282 .withSerializer(TETOPOLOGY_SERIALIZER)
283 .withName(TENODEKEY_INTERNALTENODE)
284 .withRelaxedReadConsistency()
285 .build();
286 teNodeConsistentMap.addListener(teNodeListener);
287 teNodeMap = teNodeConsistentMap.asJavaMap();
288 connMatrixConsistentMap = storageService
289 .<ConnectivityMatrixKey, ConnectivityMatrix>consistentMapBuilder()
290 .withSerializer(TETOPOLOGY_SERIALIZER)
291 .withName(CONNMATRIXKEY_CONNECTIVITYMATRIX)
292 .withRelaxedReadConsistency()
293 .build();
294 connMatrixMap = connMatrixConsistentMap.asJavaMap();
295 networkNodeConsistentMap = storageService
296 .<NetworkNodeKey, InternalNetworkNode>consistentMapBuilder()
297 .withSerializer(TETOPOLOGY_SERIALIZER)
298 .withName(NETWORKNODEKEY_INTERNALNETWORKNODE)
299 .withRelaxedReadConsistency()
300 .build();
301 networkNodeConsistentMap.addListener(networkNodeListener);
302 networkNodeMap = networkNodeConsistentMap.asJavaMap();
303 teLinkConsistentMap = storageService
304 .<TeLinkTpGlobalKey, InternalTeLink>consistentMapBuilder()
305 .withSerializer(TETOPOLOGY_SERIALIZER)
306 .withName(TELINKGLOBALKEY_INTERNALTELINK)
307 .withRelaxedReadConsistency()
308 .build();
309 teLinkConsistentMap.addListener(teLinkListener);
310 teLinkMap = teLinkConsistentMap.asJavaMap();
311 networkLinkConsistentMap = storageService
312 .<NetworkLinkKey, InternalNetworkLink>consistentMapBuilder()
313 .withSerializer(TETOPOLOGY_SERIALIZER)
314 .withName(NETWORKLINKKEY_INTERNALNETWORKLINK)
315 .withRelaxedReadConsistency()
316 .build();
317 networkLinkConsistentMap.addListener(networkLinkListener);
318 networkLinkMap = networkLinkConsistentMap.asJavaMap();
319 tpConsistentMap = storageService
320 .<TerminationPointKey, InternalTerminationPoint>consistentMapBuilder()
321 .withSerializer(TETOPOLOGY_SERIALIZER)
322 .withName(TPKEY_INTERNALTERMINATIONPOINT)
323 .withRelaxedReadConsistency()
324 .build();
325 tpMap = tpConsistentMap.asJavaMap();
326 tpKeyConsistentMap = storageService
327 .<TeLinkTpGlobalKey, TerminationPointKey>consistentMapBuilder()
328 .withSerializer(TETOPOLOGY_SERIALIZER)
329 .withName(TELINKTPGLOBALKEY_TERMINATIONPOINTKEY)
330 .withRelaxedReadConsistency()
331 .build();
332 tpKeyMap = tpKeyConsistentMap.asJavaMap();
333 ttpConsistentMap = storageService
334 .<TtpKey, TunnelTerminationPoint>consistentMapBuilder()
335 .withSerializer(TETOPOLOGY_SERIALIZER)
336 .withName(TTPKEY_TUNNELTERMINATIONPOINT)
337 .withRelaxedReadConsistency()
338 .build();
339 ttpMap = ttpConsistentMap.asJavaMap();
340
341 nextTeTopologyId = storageService.getAtomicCounter("COUNTER_NAME");
342 log.info("Started");
343 }
344
345 /**
346 * Distributed network store service deactivate method.
347 */
348 @Deactivate
349 public void deactivate() {
350 teTopologyConsistentMap.removeListener(teTopologyListener);
351 teTopologyConsistentMap.destroy();
352 teTopologyMap.clear();
353 networkConsistentMap.removeListener(networkListener);
354 networkConsistentMap.destroy();
355 networkMap.clear();
356 teNodeConsistentMap.removeListener(teNodeListener);
357 teNodeConsistentMap.destroy();
358 teNodeMap.clear();
359 connMatrixConsistentMap.destroy();
360 connMatrixMap.clear();
361 networkNodeConsistentMap.destroy();
362 networkNodeConsistentMap.removeListener(networkNodeListener);
363 networkNodeMap.clear();
364 teLinkConsistentMap.removeListener(teLinkListener);
365 teLinkConsistentMap.destroy();
366 teLinkMap.clear();
367 networkLinkConsistentMap.destroy();
368 networkLinkConsistentMap.removeListener(networkLinkListener);
369 networkLinkMap.clear();
370 tpConsistentMap.destroy();
371 tpMap.clear();
372 tpKeyConsistentMap.destroy();
373 tpKeyMap.clear();
374 ttpConsistentMap.destroy();
375 ttpMap.clear();
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500376 mapEventQueue.clear();
Yixiao Chen68bfab22016-11-11 11:04:10 -0500377 log.info("Stopped");
378 }
379
380 /**
381 * Listener class to map listener map events to the TETOPOLOGY events.
382 */
383 private class InternalTeTopologyListener implements MapEventListener<TeTopologyKey, InternalTeTopology> {
384 @Override
385 public void event(MapEvent<TeTopologyKey, InternalTeTopology> event) {
386 Type type = null;
387 switch (event.type()) {
388 case INSERT:
389 type = TE_TOPOLOGY_ADDED;
390 break;
391 case UPDATE:
392 if (event.newValue().value().childUpdate()) {
393 // Masked by the child events (e.g. Removal)
394 break;
395 }
396 type = TE_TOPOLOGY_UPDATED;
397 break;
398 case REMOVE:
399 type = TE_TOPOLOGY_REMOVED;
400 break;
401 default:
402 log.error("Unsupported event type: {}", event.type());
403 }
404 if (type != null) {
405 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
406 mapEvent.setTeTopologyKey(event.key());
407 try {
408 mapEventQueue.put(mapEvent);
409 } catch (InterruptedException e) {
410 log.warn("Unable to queue event {} ", mapEvent, e);
411 }
412 }
413 }
414 }
415
416 /**
417 * Listener class to map listener map events to the network events.
418 */
419 private class InternalNetworkListener implements MapEventListener<KeyId, InternalNetwork> {
420 @Override
421 public void event(MapEvent<KeyId, InternalNetwork> event) {
422 Type type = null;
423 switch (event.type()) {
424 case INSERT:
425 type = NETWORK_ADDED;
426 break;
427 case UPDATE:
428 if (event.newValue().value().childUpdate()) {
429 // Masked by the child events (e.g. Removal)
430 break;
431 }
432 type = NETWORK_UPDATED;
433 break;
434 case REMOVE:
435 type = NETWORK_REMOVED;
436 break;
437 default:
438 log.error("Unsupported event type: {}", event.type());
439 }
440 if (type != null) {
441 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
442 mapEvent.setNetworkKey(event.key());
443 try {
444 mapEventQueue.put(mapEvent);
445 } catch (InterruptedException e) {
446 log.warn("Unable to queue event {} ", mapEvent, e);
447 }
448 }
449 }
450 }
451
452 /**
453 * Listener class to map listener map events to the TENODE events.
454 */
455 private class InternalTeNodeListener implements MapEventListener<TeNodeKey, InternalTeNode> {
456 @Override
457 public void event(MapEvent<TeNodeKey, InternalTeNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500458 Type type = null;
459 switch (event.type()) {
460 case INSERT:
461 if (event.newValue().value().parentUpdate()) {
462 // Masked by the parent event (e.g. Add)
463 break;
464 }
465 type = TE_NODE_ADDED;
466 break;
467 case UPDATE:
468 if (event.newValue().value().childUpdate() ||
469 event.newValue().value().parentUpdate()) {
470 // Masked by the child event (e.g. Removal) or parent event
471 break;
472 }
473 type = TE_NODE_UPDATED;
474 break;
475 case REMOVE:
476 type = TE_NODE_REMOVED;
477 break;
478 default:
479 log.error("Unsupported event type: {}", event.type());
480 }
481 if (type != null) {
482 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
483 mapEvent.setTeNodeKey(event.key());
484 try {
485 mapEventQueue.put(mapEvent);
486 } catch (InterruptedException e) {
487 log.warn("Unable to queue event {} ", mapEvent, e);
488 }
489 }
490 }
491 }
492
493 /**
494 * Listener class to map listener map events to the NETWORK NODE events.
495 */
496 private class InternalNetworkNodeListener implements MapEventListener<NetworkNodeKey, InternalNetworkNode> {
497 @Override
498 public void event(MapEvent<NetworkNodeKey, InternalNetworkNode> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500499 Type type = null;
500 switch (event.type()) {
501 case INSERT:
502 if (event.newValue().value().parentUpdate()) {
503 // Masked by the parent event (e.g. Add)
504 break;
505 }
506 type = NODE_ADDED;
507 break;
508 case UPDATE:
509 if (event.newValue().value().childUpdate() ||
510 event.newValue().value().parentUpdate()) {
511 // Masked by the child event (e.g. Removal) or parent event
512 break;
513 }
514 type = NODE_UPDATED;
515 break;
516 case REMOVE:
517 type = NODE_REMOVED;
518 break;
519 default:
520 log.error("Unsupported event type: {}", event.type());
521 }
522 if (type != null) {
523 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
524 mapEvent.setNetworkNodeKey(event.key());
525 try {
526 mapEventQueue.put(mapEvent);
527 } catch (InterruptedException e) {
528 log.warn("Unable to queue event {} ", mapEvent, e);
529 }
530 }
531 }
532 }
533
534 /**
535 * Listener class to map listener map events to the TELINK events.
536 */
537 private class InternalTeLinkListener implements MapEventListener<TeLinkTpGlobalKey, InternalTeLink> {
538 @Override
539 public void event(MapEvent<TeLinkTpGlobalKey, InternalTeLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500540 Type type = null;
541 switch (event.type()) {
542 case INSERT:
543 if (event.newValue().value().parentUpdate()) {
544 // Masked by the parent event (e.g. Add)
545 break;
546 }
547 type = TE_LINK_ADDED;
548 break;
549 case UPDATE:
550 if (event.newValue().value().parentUpdate()) {
551 // Masked by parent event
552 break;
553 }
554 type = TE_LINK_UPDATED;
555 break;
556 case REMOVE:
557 type = TE_LINK_REMOVED;
558 break;
559 default:
560 log.error("Unsupported event type: {}", event.type());
561 }
562 if (type != null) {
563 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
564 mapEvent.setTeLinkKey(event.key());
565 try {
566 mapEventQueue.put(mapEvent);
567 } catch (InterruptedException e) {
568 log.warn("Unable to queue event {} ", mapEvent, e);
569 }
570 }
571 }
572 }
573
574 /**
575 * Listener class to map listener map events to the NETWORK LINK events.
576 */
577 private class InternalNetworkLinkListener implements MapEventListener<NetworkLinkKey, InternalNetworkLink> {
578 @Override
579 public void event(MapEvent<NetworkLinkKey, InternalNetworkLink> event) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500580 Type type = null;
581 switch (event.type()) {
582 case INSERT:
583 if (event.newValue().value().parentUpdate()) {
584 // Masked by the parent event (e.g. Add)
585 break;
586 }
587 type = LINK_ADDED;
588 break;
589 case UPDATE:
590 if (event.newValue().value().parentUpdate()) {
591 // Masked by the child event (e.g. Removal) or parent event
592 break;
593 }
594 type = LINK_UPDATED;
595 break;
596 case REMOVE:
597 type = LINK_REMOVED;
598 break;
599 default:
600 log.error("Unsupported event type: {}", event.type());
601 }
602 if (type != null) {
603 TeTopologyMapEvent mapEvent = new TeTopologyMapEvent(type);
604 mapEvent.setNetworkLinkKey(event.key());
605 try {
606 mapEventQueue.put(mapEvent);
607 } catch (InterruptedException e) {
608 log.warn("Unable to queue event {} ", mapEvent, e);
609 }
610 }
611 }
612 }
613
614 @Override
615 public TeTopologies teTopologies() {
616 Map<TeTopologyKey, TeTopology> teTopologies = Maps.newHashMap();
617 if (MapUtils.isNotEmpty(teTopologyMap)) {
618 for (TeTopologyKey key : teTopologyMap.keySet()) {
619 teTopologies.put(key, teTopology(key));
620 }
621 }
622 return new DefaultTeTopologies(STORE_NAME, teTopologies);
623 }
624
625 private TeTopology teTopology(TeTopologyKey topologyId,
626 InternalTeTopology intTopology) {
627 if (intTopology == null) {
628 return null;
629 }
630 Map<Long, TeNode> teNodes = null;
631 if (CollectionUtils.isNotEmpty(intTopology.teNodeKeys())) {
632 teNodes = Maps.newHashMap();
633 for (TeNodeKey key : intTopology.teNodeKeys()) {
634 teNodes.put(key.teNodeId(), teNode(key));
635 }
636 }
637 Map<TeLinkTpKey, TeLink> teLinks = null;
638 if (CollectionUtils.isNotEmpty(intTopology.teLinkKeys())) {
639 teLinks = Maps.newHashMap();
640 for (TeLinkTpGlobalKey key : intTopology.teLinkKeys()) {
641 teLinks.put(key.teLinkTpKey(), teLink(key));
642 }
643 }
644 return new DefaultTeTopology(topologyId, teNodes, teLinks,
645 intTopology.teTopologyId(), intTopology.topologyData());
646 }
647
648 @Override
649 public TeTopology teTopology(TeTopologyKey topologyId) {
650 InternalTeTopology intTopology = teTopologyMap.get(topologyId);
651 return teTopology(topologyId, intTopology);
652 }
653
654 private void removeTopologyeMapEntrys(InternalTeTopology curTopology) {
655 // Remove TE nodes
656 if (CollectionUtils.isNotEmpty(curTopology.teNodeKeys())) {
657 for (TeNodeKey key : curTopology.teNodeKeys()) {
658 removeTeNode(key, true);
659 }
660 }
661 // Remove TE Links
662 if (CollectionUtils.isNotEmpty(curTopology.teLinkKeys())) {
663 for (TeLinkTpGlobalKey key : curTopology.teLinkKeys()) {
664 removeTeLink(key, true);
665 }
666 }
667 }
668
669 @Override
670 public void updateTeTopology(TeTopology teTopology) {
671 InternalTeTopology curTopology = teTopologyMap.get(teTopology.teTopologyId());
672 // Update TE nodes
673 List<NetworkNodeKey> nodeIds = null;
674 if (MapUtils.isNotEmpty(teTopology.teNodes())) {
675 nodeIds = Lists.newArrayList();
676 for (Map.Entry<Long, TeNode> entry : teTopology.teNodes().entrySet()) {
677 TeNodeKey teNodeKey = new TeNodeKey(teTopology.teTopologyId(), entry.getKey());
678 NetworkNodeKey nodeKey = TeMgrUtil.networkNodeKey(teNodeKey);
679 updateTeNode(teNodeKey, entry.getValue(), true, true, nodeKey);
680 nodeIds.add(nodeKey);
681 }
682 }
683 // Update TE links
684 List<NetworkLinkKey> linkIds = null;
685 if (MapUtils.isNotEmpty(teTopology.teLinks())) {
686 linkIds = Lists.newArrayList();
687 for (Map.Entry<TeLinkTpKey, TeLink> entry : teTopology.teLinks().entrySet()) {
688 TeLinkTpGlobalKey teLinkKey = new TeLinkTpGlobalKey(teTopology.teTopologyId(),
689 entry.getKey());
690 NetworkLinkKey linkKey = TeMgrUtil.networkLinkKey(teLinkKey);
691 updateTeLink(teLinkKey, entry.getValue(), true, true, linkKey);
692 linkIds.add(linkKey);
693 }
694 }
695 // Finally Update teTopologyMap
696 InternalTeTopology newTopology = new InternalTeTopology(teTopology);
697 teTopologyMap.put(teTopology.teTopologyId(), newTopology);
698
699 if (curTopology == null) {
700 // New topology, update networkMap
701 InternalNetwork intNetwork = new InternalNetwork();
702 intNetwork.setServerProvided(false);
703 intNetwork.setTeTopologyKey(teTopology.teTopologyId());
704 intNetwork.setNodeIds(nodeIds);
705 intNetwork.setLinkIds(linkIds);
706 networkMap.put(teTopology.networkId(), intNetwork);
707 }
708 }
709
710 @Override
711 public void removeTeTopology(TeTopologyKey topologyId) {
712 // Remove it from teTopologyMap
713 InternalTeTopology topology = teTopologyMap.remove(topologyId);
714 if (topology != null) {
715 removeTopologyeMapEntrys(topology);
716 // Remove it from networkMap;
717 networkMap.remove(topology.topologyData().networkId());
718 }
719 }
720
721 @Override
722 public List<Network> networks() {
723 if (MapUtils.isEmpty(networkMap)) {
724 return null;
725 }
726 List<Network> networks = Lists.newArrayList();
727 for (KeyId networkId : networkMap.keySet()) {
728 networks.add(network(networkId));
729 }
730 return networks;
731 }
732
733 private Network network(KeyId networkId, InternalNetwork curNetwork) {
734 if (curNetwork == null) {
735 return null;
736 }
737 List<KeyId> supportingNetworkIds = curNetwork.supportingNetworkIds();
738 Map<KeyId, NetworkNode> nodes = null;
739 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
740 nodes = Maps.newHashMap();
741 for (NetworkNodeKey key : curNetwork.nodeIds()) {
742 nodes.put(key.nodeId(), networkNode(key));
743 }
744 }
745 Map<KeyId, NetworkLink> links = null;
746 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
747 links = Maps.newHashMap();
748 for (NetworkLinkKey key : curNetwork.linkIds()) {
749 links.put(key.linkId(), networkLink(key));
750 }
751 }
752 TeTopologyId topologyId = null;
753 DeviceId ownerId = null;
754 if (curNetwork.teTopologyKey() != null &&
755 teTopologyMap.get(curNetwork.teTopologyKey()) != null) {
756 topologyId = new TeTopologyId(curNetwork.teTopologyKey().providerId(),
757 curNetwork.teTopologyKey().clientId(),
758 teTopologyMap
759 .get(curNetwork
760 .teTopologyKey())
761 .teTopologyId());
762 ownerId = teTopologyMap.get(curNetwork.teTopologyKey())
763 .topologyData().ownerId();
764
765 }
766 return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
767 topologyId, curNetwork.serverProvided(), ownerId);
768 }
769
770 @Override
771 public Network network(KeyId networkId) {
772 InternalNetwork curNetwork = networkMap.get(networkId);
773 return network(networkId, curNetwork);
774 }
775
776 private void removeNetworkMapEntrys(InternalNetwork curNetwork, boolean teRemove) {
777 // Remove TE nodes
778 if (CollectionUtils.isNotEmpty(curNetwork.nodeIds())) {
779 for (NetworkNodeKey key : curNetwork.nodeIds()) {
780 removeNetworkNode(key, teRemove);
781 }
782 }
783 // Remove TE Links
784 if (CollectionUtils.isNotEmpty(curNetwork.linkIds())) {
785 for (NetworkLinkKey key : curNetwork.linkIds()) {
786 removeNetworkLink(key, teRemove);
787 }
788 }
789 }
790
791 private TeTopologyKey newTeTopologyKey(TeTopologyId teTopologyId) {
792 long idValue;
793 try {
794 idValue = Long.parseLong(teTopologyId.topologyId());
795 } catch (NumberFormatException e) {
796 // Can't get the long value from the string.
797 // Use an assigned id value from local id pool,
798 // Ideally id should be assigned per provider base.
799 idValue = nextTeTopologyId();
800 }
801 return new TeTopologyKey(teTopologyId.providerId(), teTopologyId.clientId(), idValue);
802 }
803
804 @Override
805 public void updateNetwork(Network network) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500806 log.debug("updateNetwork {}", network);
Yixiao Chen68bfab22016-11-11 11:04:10 -0500807 InternalNetwork curNetwork = networkMap.get(network.networkId());
808 TeTopologyKey topoKey = null;
809 if (network.teTopologyId() != null) {
810 topoKey = newTeTopologyKey(network.teTopologyId());
811 }
812 // Update TE nodes
813 List<TeNodeKey> teNodeKeys = null;
814 if (MapUtils.isNotEmpty(network.nodes())) {
815 teNodeKeys = Lists.newArrayList();
816 for (Map.Entry<KeyId, NetworkNode> entry : network.nodes().entrySet()) {
817 NetworkNodeKey nodeKey = new NetworkNodeKey(network.networkId(), entry.getKey());
818 TeNodeKey teNodeKey = null;
819 if (topoKey != null && entry.getValue().teNode() != null) {
820 teNodeKey = new TeNodeKey(topoKey, entry.getValue().teNode().teNodeId());
821 }
822 updateNetworkNode(nodeKey, entry.getValue(), true, false, teNodeKey);
823 teNodeKeys.add(teNodeKey);
824 }
825 }
826 // Update TE links
827 List<TeLinkTpGlobalKey> teLinkKeys = null;
828 if (MapUtils.isNotEmpty(network.links())) {
829 teLinkKeys = Lists.newArrayList();
830 for (Map.Entry<KeyId, NetworkLink> entry : network.links().entrySet()) {
831 NetworkLinkKey linkKey = new NetworkLinkKey(network.networkId(), entry.getKey());
832 TeLinkTpGlobalKey teLinkKey = null;
833 if (topoKey != null && entry.getValue().teLink() != null) {
834 teLinkKey = new TeLinkTpGlobalKey(topoKey, entry.getValue().teLink().teLinkKey());
835 }
836 updateNetworkLink(linkKey, entry.getValue(), true, false, teLinkKey);
837 teLinkKeys.add(teLinkKey);
838 }
839 }
840
841 // New network, update TE Topology first
842 if (curNetwork == null) {
843 InternalTeTopology intTopo = new InternalTeTopology(network.teTopologyId().topologyId());
844 intTopo.setTeNodeKeys(teNodeKeys);
845 intTopo.setTeLinkKeys(teLinkKeys);
846 BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS);
847 flags.set(TeTopology.BIT_LEARNT);
Yixiao Chen29f06332016-12-07 16:14:29 -0500848 if (network.teTopologyId().clientId() == providerId) {
Yixiao Chen68bfab22016-11-11 11:04:10 -0500849 // Hard rule for now
850 flags.set(TeTopology.BIT_CUSTOMIZED);
851 }
852 CommonTopologyData common = new CommonTopologyData(network.networkId(),
853 OptimizationType.NOT_OPTIMIZED, flags, network.ownerId());
854 intTopo.setTopologydata(common);
855 teTopologyMap.put(topoKey, intTopo);
856 }
857 // Finally Update networkMap
858 InternalNetwork newNetwork = new InternalNetwork(network);
859 newNetwork.setTeTopologyKey(topoKey);
860 networkMap.put(network.networkId(), newNetwork);
861 }
862
863 @Override
864 public void removeNetwork(KeyId networkId) {
865 // Remove it from networkMap
866 InternalNetwork network = networkMap.remove(networkId);
867 if (network != null && network.teTopologyKey() != null) {
868 removeNetworkMapEntrys(network, false);
869 teTopologyMap.remove(network.teTopologyKey());
870 }
871 }
872
873 private TeNode teNode(TeNodeKey nodeKey, InternalTeNode intNode) {
874 if (intNode == null) {
875 return null;
876 }
877 Map<Long, ConnectivityMatrix> connMatrices = null;
878 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
879 connMatrices = Maps.newHashMap();
880 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
881 connMatrices.put(key.entryId(), connMatrixMap.get(key));
882 }
883 }
884 List<Long> teLinkIds = null;
885 if (CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
886 teLinkIds = Lists.newArrayList();
887 for (TeLinkTpGlobalKey key : intNode.teLinkTpKeys()) {
888 teLinkIds = TeUtils.addListElement(teLinkIds, key.teLinkTpId());
889 }
890 }
891 List<Long> tps = null;
892 if (CollectionUtils.isNotEmpty(intNode.teTpKeys())) {
893 tps = Lists.newArrayList();
894 for (TeLinkTpGlobalKey key : intNode.teTpKeys()) {
895 tps = TeUtils.addListElement(tps, key.teLinkTpId());
896 }
897 }
898 Map<Long, TunnelTerminationPoint> ttps = null;
899 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
900 ttps = Maps.newHashMap();
901 for (TtpKey key : intNode.ttpKeys()) {
902 ttps.put(key.ttpId(), ttpMap.get(key));
903 }
904 }
905 return new DefaultTeNode(nodeKey.teNodeId(),
906 intNode.underlayTopologyKey(),
907 intNode.supportNodeKey(),
908 intNode.sourceTeNodeKey(),
909 intNode.teData(),
910 connMatrices, teLinkIds, ttps, tps);
911 }
912
913 @Override
914 public TeNode teNode(TeNodeKey nodeKey) {
915 InternalTeNode intNode = teNodeMap.get(nodeKey);
916 return teNode(nodeKey, intNode);
917 }
918
919 private void removeTeNodeMapEntrys(InternalTeNode intNode) {
920 // Remove connMatrixMap entries for the node
921 if (CollectionUtils.isNotEmpty(intNode.connMatrixKeys())) {
922 for (ConnectivityMatrixKey key : intNode.connMatrixKeys()) {
923 connMatrixMap.remove(key);
924 }
925 }
926 // Remove ttpMap entries for the node
927 if (CollectionUtils.isNotEmpty(intNode.ttpKeys())) {
928 for (TtpKey key : intNode.ttpKeys()) {
929 ttpMap.remove(key);
930 }
931 }
932 }
933
934 private void updateTeNode(TeNodeKey nodeKey, TeNode node, boolean parentUpdate,
935 boolean teNodeUpdate, NetworkNodeKey networkNodeKey) {
936 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
937 if (intTopo == null && !parentUpdate) {
938 log.error("TE Topology is not in dataStore for nodeUpdate {}", nodeKey);
939 return;
940 }
941 InternalTeNode curNode = teNodeMap.get(nodeKey);
942 // Update connMatrixMap
943 if (MapUtils.isNotEmpty(node.connectivityMatrices())) {
944 for (Map.Entry<Long, ConnectivityMatrix> entry : node.connectivityMatrices().entrySet()) {
945 connMatrixMap.put(new ConnectivityMatrixKey(nodeKey, entry.getKey()),
946 entry.getValue());
947 }
948 }
949 // Update ttpMap
950 if (MapUtils.isNotEmpty(node.tunnelTerminationPoints())) {
951 for (Map.Entry<Long, TunnelTerminationPoint> entry : node.tunnelTerminationPoints().entrySet()) {
952 ttpMap.put(new TtpKey(nodeKey, entry.getKey()), entry.getValue());
953 }
954 }
955 // Update teNodeMap
956 InternalTeNode intNode = new InternalTeNode(nodeKey, node, networkNodeKey, parentUpdate);
957 teNodeMap.put(nodeKey, intNode);
958 if (curNode == null && !parentUpdate && intTopo != null) {
959 // Update InternalTeTopology
960 intTopo.setChildUpdate(true);
961 TeUtils.addListElement(intTopo.teNodeKeys(), nodeKey);
962 }
963 // Update networkNodeMap
964 if (teNodeUpdate) {
965 updateNetworkNode(networkNodeKey, networkNode(node), parentUpdate,
966 teNodeUpdate, nodeKey);
967 }
968 }
969
970 private NetworkNode networkNode(TeNode node) {
971 KeyId nodeId = KeyId.keyId(Long.toString(node.teNodeId()));
972 List<NetworkNodeKey> supportingNodeIds = null;
973 if (node.supportingTeNodeId() != null) {
974 supportingNodeIds = Lists.newArrayList();
975 supportingNodeIds.add(new NetworkNodeKey(
976 TeMgrUtil.toNetworkId((node.supportingTeNodeId().teTopologyKey())),
977 KeyId.keyId(Long.toString(node.supportingTeNodeId().teNodeId()))));
978 }
979 Map<KeyId, TerminationPoint> tps = null;
980 if (node.teTerminationPointIds() != null) {
981 tps = Maps.newHashMap();
982 for (Long teTpId : node.teTerminationPointIds()) {
983 tps.put(KeyId.keyId(Long.toString(teTpId)),
984 new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)),
985 null, teTpId));
986 }
987 }
988 return new DefaultNetworkNode(nodeId, supportingNodeIds, node, tps);
989 }
990
991 @Override
992 public void updateTeNode(TeNodeKey nodeKey, TeNode node) {
993 updateTeNode(nodeKey, node, false, true, TeMgrUtil.networkNodeKey(nodeKey));
994 }
995
996 private void removeTeNode(TeNodeKey nodeKey, boolean teNodeRemove) {
997 // Remove it from InternalTeTopology first
998 InternalTeTopology intTopo = teTopologyMap.get(nodeKey.teTopologyKey());
999 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teNodeKeys())) {
1000 intTopo.setChildUpdate(true);
1001 intTopo.teNodeKeys().remove(nodeKey);
1002 }
1003 // Then remove it from teNodeMap
1004 InternalTeNode node = teNodeMap.remove(nodeKey);
Palash Kala1ddfea02017-04-12 13:20:02 +09001005
1006 if (node == null) {
1007 log.error("No node found for nodeKey {}", nodeKey);
1008 return;
1009 }
1010
Yixiao Chen68bfab22016-11-11 11:04:10 -05001011 removeTeNodeMapEntrys(node);
1012 // Remove it from networkNodeMap
1013 if (teNodeRemove && node != null) {
1014 removeNetworkNode(node.networkNodeKey(), teNodeRemove);
1015 }
1016 }
1017
1018 @Override
1019 public void removeTeNode(TeNodeKey nodeKey) {
1020 removeTeNode(nodeKey, true);
1021 }
1022
1023 private NetworkNode networkNode(NetworkNodeKey nodeKey, InternalNetworkNode intNode) {
1024 if (intNode == null) {
1025 return null;
1026 }
1027 Map<KeyId, TerminationPoint> tps = Maps.newHashMap();
1028 for (KeyId tpId : intNode.tpIds()) {
1029 tps.put(tpId, terminationPoint(
1030 new TerminationPointKey(nodeKey, tpId)));
1031
1032 }
1033 return new DefaultNetworkNode(nodeKey.nodeId(), intNode.supportingNodeIds(),
1034 teNode(intNode.teNodeKey()), tps);
1035 }
1036
1037 @Override
1038 public NetworkNode networkNode(NetworkNodeKey nodeKey) {
1039 InternalNetworkNode intNode = networkNodeMap.get(nodeKey);
1040 return networkNode(nodeKey, intNode);
1041 }
1042
1043 private void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node,
1044 boolean parentUpdate, boolean teNodeUpdate, TeNodeKey teNodeKey) {
1045 InternalNetwork intNework = null;
1046 if (!parentUpdate) {
1047 intNework = networkMap.get(nodeKey.networkId());
1048 if (intNework == null) {
1049 log.error("Network is not in dataStore for nodeUpdate {}", nodeKey);
1050 return;
1051 }
1052 }
1053
1054 InternalNetworkNode exNode = networkNodeMap.get(nodeKey);
1055 if (exNode != null && CollectionUtils.isNotEmpty(exNode.tpIds())) {
1056 // Remove the TerminationPoints first
1057 for (KeyId tpId : exNode.tpIds()) {
1058 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1059 }
1060 }
1061
1062 if (MapUtils.isNotEmpty(node.terminationPoints())) {
1063 // Update with new TerminationPoints
1064 for (Map.Entry<KeyId, TerminationPoint> entry : node.terminationPoints().entrySet()) {
1065 updateTerminationPoint(new TerminationPointKey(nodeKey, entry.getKey()),
1066 entry.getValue(), parentUpdate, teNodeKey);
1067 }
1068 }
1069
1070 // Update teNodeMap first
1071 if (!teNodeUpdate && teNodeKey != null && node.teNode() != null) {
1072 updateTeNode(teNodeKey, node.teNode(), parentUpdate, teNodeUpdate, nodeKey);
1073 }
1074 // Update networkNodeMap
1075 InternalNetworkNode intNode = new InternalNetworkNode(node, parentUpdate);
1076 intNode.setTeNodeKey(teNodeKey);
1077 networkNodeMap.put(nodeKey, intNode);
1078 if (exNode == null && !parentUpdate && intNework != null) {
1079 // Update the InternalNetwork
1080 intNework.setChildUpdate(true);
1081 TeUtils.addListElement(intNework.nodeIds(), nodeKey);
1082 }
1083 }
1084
1085 @Override
1086 public void updateNetworkNode(NetworkNodeKey nodeKey, NetworkNode node) {
1087 TeNodeKey teNodeKey = null;
1088 if (node.teNode() != null) {
1089 teNodeKey = new TeNodeKey(networkMap.get(nodeKey.networkId()).teTopologyKey(),
1090 node.teNode().teNodeId());
1091 }
1092 updateNetworkNode(nodeKey, node, false, false, teNodeKey);
1093 }
1094
1095 private void removeNetworkNode(NetworkNodeKey nodeKey, boolean teNodeRemove) {
1096 // Update the InternalNetwork
1097 InternalNetwork intNework = networkMap.get(nodeKey.networkId());
1098 if (intNework != null && CollectionUtils.isNotEmpty(intNework.nodeIds())) {
1099 intNework.setChildUpdate(true);
1100 intNework.nodeIds().remove(nodeKey.nodeId());
1101 }
1102 InternalNetworkNode intNode = networkNodeMap.remove(nodeKey);
1103 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1104 // Remove the TerminationPoints first
1105 for (KeyId tpId : intNode.tpIds()) {
1106 removeTerminationPoint(new TerminationPointKey(nodeKey, tpId));
1107 }
1108 }
1109 if (!teNodeRemove && intNode != null) {
1110 // Now remove it from teNodeMap
1111 removeTeNode(intNode.teNodeKey(), teNodeRemove);
1112 }
1113 }
1114
1115 @Override
1116 public void removeNetworkNode(NetworkNodeKey nodeKey) {
1117 removeNetworkNode(nodeKey, false);
1118 }
1119
1120 private TeLink teLink(TeLinkTpGlobalKey linkKey, InternalTeLink intLink) {
1121 if (intLink == null) {
1122 return null;
1123 }
1124 return new DefaultTeLink(linkKey.teLinkTpKey(),
1125 intLink.peerTeLinkKey(),
1126 intLink.underlayTopologyKey(),
1127 intLink.supportingLinkKey(),
1128 intLink.sourceTeLinkKey(),
1129 intLink.teData());
1130 }
1131
1132 @Override
1133 public TeLink teLink(TeLinkTpGlobalKey linkKey) {
1134 InternalTeLink intLink = teLinkMap.get(linkKey);
1135 return teLink(linkKey, intLink);
1136 }
1137
1138 private void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link,
1139 boolean parentUpdate, boolean teLinkUpdate, NetworkLinkKey networkLinkKey) {
1140 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1141 if (intTopo == null && !parentUpdate) {
1142 log.error("TE Topology is not in dataStore for linkUpdate {}", linkKey);
1143 return;
1144 }
1145 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1146 if (intNode == null && !parentUpdate) {
1147 log.error("TE node is not in dataStore for linkUpdate {}", linkKey);
1148 return;
1149 }
1150 InternalTeLink exLink = teLinkMap.get(linkKey);
1151
1152 // Update teLinkMap
1153 InternalTeLink intLink = new InternalTeLink(link, parentUpdate);
1154 intLink.setNetworkLinkKey(networkLinkKey);
1155 teLinkMap.put(linkKey, intLink);
1156 if (exLink == null && !parentUpdate) {
1157 if (intTopo != null) {
1158 // Update the InternalTeTopology
1159 intTopo.setChildUpdate(true);
1160 intTopo.setTeLinkKeys(TeUtils.addListElement(intTopo.teLinkKeys(), linkKey));
1161 }
1162 if (intNode != null) {
1163 // Update the InternalNode
1164 intNode.setChildUpdate(true);
1165 intNode.setTeLinkTpKeys(TeUtils.addListElement(intNode.teLinkTpKeys(), linkKey));
1166 }
1167 }
1168
1169 // Update networkLinkMap
1170 if (teLinkUpdate) {
1171 updateNetworkLink(networkLinkKey, networkLink(link), parentUpdate,
1172 teLinkUpdate, linkKey);
1173 }
1174 }
1175
1176 private NetworkLink networkLink(TeLink link) {
1177 KeyId linkId = TeMgrUtil.toNetworkLinkId(link.teLinkKey());
1178 NodeTpKey source = null;
1179 if (link.teLinkKey() != null) {
1180 source = new NodeTpKey(KeyId.keyId(Long.toString(link.teLinkKey().teNodeId())),
1181 KeyId.keyId(Long.toString(link.teLinkKey().teLinkTpId())));
1182 }
1183 NodeTpKey dest = null;
1184 if (link.peerTeLinkKey() != null) {
1185 dest = new NodeTpKey(KeyId.keyId(Long.toString(link.peerTeLinkKey().teNodeId())),
1186 KeyId.keyId(Long.toString(link.peerTeLinkKey().teLinkTpId())));
1187 }
1188 List<NetworkLinkKey> supportingLinkIds = null;
1189 if (link.supportingTeLinkId() != null) {
1190 supportingLinkIds = Lists.newArrayList();
1191 supportingLinkIds.add(new NetworkLinkKey(
1192 TeMgrUtil.toNetworkId(link.supportingTeLinkId().teTopologyKey()),
1193 TeMgrUtil.toNetworkLinkId(link.supportingTeLinkId().teLinkTpKey())));
1194 }
1195 return new DefaultNetworkLink(linkId, source, dest, supportingLinkIds, link);
1196 }
1197
1198 @Override
1199 public void updateTeLink(TeLinkTpGlobalKey linkKey, TeLink link) {
1200 updateTeLink(linkKey, link, false, true, TeMgrUtil.networkLinkKey(linkKey));
1201 }
1202
1203 private void removeTeLink(TeLinkTpGlobalKey linkKey, boolean teLinkRemove) {
1204 // Remove it from InternalTeTopology first
1205 InternalTeTopology intTopo = teTopologyMap.get(linkKey.teTopologyKey());
1206 if (intTopo != null && CollectionUtils.isNotEmpty(intTopo.teLinkKeys())) {
1207 intTopo.setChildUpdate(true);
1208 intTopo.teLinkKeys().remove(linkKey);
1209 }
1210 // Remove it from InternalTeNode
1211 InternalTeNode intNode = teNodeMap.get(linkKey.teNodeKey());
1212 if (intNode != null && CollectionUtils.isNotEmpty(intNode.teLinkTpKeys())) {
1213 intNode.setChildUpdate(true);
1214 intNode.teLinkTpKeys().remove(linkKey);
1215 }
1216 // Then remove it from teLinkMap
1217 InternalTeLink link = teLinkMap.remove(linkKey);
1218 if (teLinkRemove && link != null) {
1219 // Remove it from networkLinkMap
1220 removeNetworkLink(link.networkLinkKey(), teLinkRemove);
1221 }
1222 }
1223
1224 @Override
1225 public void removeTeLink(TeLinkTpGlobalKey linkKey) {
1226 removeTeLink(linkKey, true);
1227 }
1228
1229 private NetworkLink networkLink(NetworkLinkKey linkKey, InternalNetworkLink intLink) {
1230 if (intLink == null) {
1231 return null;
1232 }
1233 return new DefaultNetworkLink(linkKey.linkId(), intLink.source(),
1234 intLink.destination(), intLink.supportingLinkIds(), teLink(intLink.teLinkKey()));
1235 }
1236
1237 @Override
1238 public NetworkLink networkLink(NetworkLinkKey linkKey) {
1239 InternalNetworkLink intLink = networkLinkMap.get(linkKey);
1240 return networkLink(linkKey, intLink);
1241 }
1242
1243 private void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link,
1244 boolean parentUpdate, boolean teLinkUpdate, TeLinkTpGlobalKey teLinkKey) {
1245 InternalNetwork intNework = null;
1246 if (!parentUpdate) {
1247 intNework = networkMap.get(linkKey.networkId());
1248 if (intNework == null) {
1249 log.error("Network is not in dataStore for linkUpdate {}", linkKey);
1250 return;
1251 }
1252 }
1253
1254 InternalNetworkLink exLink = networkLinkMap.get(linkKey);
1255
1256 // Now update teLinkMap first
1257 if (!teLinkUpdate && teLinkKey != null) {
1258 updateTeLink(teLinkKey, link.teLink(), parentUpdate, teLinkUpdate, linkKey);
1259 }
1260 // Update networkLinkMap
1261 InternalNetworkLink intLink = new InternalNetworkLink(link, parentUpdate);
1262 intLink.setTeLinkKey(teLinkKey);
1263 networkLinkMap.put(linkKey, intLink);
1264 if (exLink == null && !parentUpdate && intNework != null) {
1265 // Update the InternalNetwork
1266 intNework.setChildUpdate(true);
1267 TeUtils.addListElement(intNework.linkIds(), linkKey);
1268 }
1269 }
1270
1271 @Override
1272 public void updateNetworkLink(NetworkLinkKey linkKey, NetworkLink link) {
1273 TeLinkTpGlobalKey teLinkKey = null;
1274 if (link.teLink() != null) {
1275 teLinkKey = new TeLinkTpGlobalKey(networkMap.get(linkKey.networkId()).teTopologyKey(),
1276 link.teLink().teLinkKey());
1277 }
1278
1279 updateNetworkLink(linkKey, link, false, false, teLinkKey);
1280 }
1281
1282 private void removeNetworkLink(NetworkLinkKey linkKey, boolean teLinkRemove) {
1283 // Update the InternalNetwork
1284 InternalNetwork intNework = networkMap.get(linkKey.networkId());
1285 if (intNework != null && CollectionUtils.isNotEmpty(intNework.linkIds())) {
1286 intNework.setChildUpdate(true);
1287 intNework.linkIds().remove(linkKey.linkId());
1288 }
1289 // Remove it from networkLinkMap
1290 InternalNetworkLink intLink = networkLinkMap.remove(linkKey);
1291 if (!teLinkRemove && intLink != null && intLink.teLinkKey() != null) {
1292 // Now remove it from teLinkMap
1293 removeTeLink(intLink.teLinkKey(), teLinkRemove);
1294 }
1295 }
1296
1297 @Override
1298 public void removeNetworkLink(NetworkLinkKey linkKey) {
1299 removeNetworkLink(linkKey, false);
1300 }
1301
1302 private TerminationPoint terminationPoint(TerminationPointKey tpKey) {
1303 InternalTerminationPoint intTp = tpMap.get(tpKey);
1304 if (intTp == null) {
1305 return null;
1306 }
1307 return new DefaultTerminationPoint(tpKey.tpId(), intTp.supportingTpIds(),
1308 intTp.teTpKey().teLinkTpId());
1309 }
1310
1311 private void updateTerminationPoint(TerminationPointKey tpKey,
1312 TerminationPoint tp, boolean parentUpdate, TeNodeKey teNodeKey) {
1313 TeNodeKey myTeNodeKey;
1314 InternalNetworkNode intNode = null;
1315 if (!parentUpdate) {
1316 intNode = networkNodeMap.get(tpKey.nodeId());
1317 if (intNode == null) {
1318 log.error(" node is not in dataStore for tp update {}", tpKey);
1319 return;
1320 }
1321 myTeNodeKey = intNode.teNodeKey();
1322 } else {
1323 myTeNodeKey = teNodeKey;
1324 }
1325 TeLinkTpGlobalKey teTpKey = new TeLinkTpGlobalKey(myTeNodeKey, tp.teTpId());
1326
1327 boolean newTp = tpMap.get(tpKey) == null;
1328 InternalTerminationPoint intTp = new InternalTerminationPoint(tp);
1329 intTp.setTeTpKey(teTpKey);
1330 tpMap.put(tpKey, intTp);
1331 if (newTp) {
1332 // Update tpKeyMap
1333 tpKeyMap.put(teTpKey, tpKey);
1334 if (!parentUpdate && intNode != null) {
1335 // Update InternalNetworkNode
1336 intNode.setChildUpdate(true);
1337 intNode.setTpIds(TeUtils.addListElement(intNode.tpIds(), tpKey.tpId()));
1338 }
1339 }
1340 }
1341
1342 @Override
1343 public void updateTerminationPoint(TerminationPointKey tpKey,
1344 TerminationPoint tp) {
1345 updateTerminationPoint(tpKey, tp, false, null);
1346 }
1347
1348 @Override
1349 public void removeTerminationPoint(TerminationPointKey tpKey) {
1350 // Update InternalNetworkNode
1351 InternalNetworkNode intNode = networkNodeMap.get(tpKey.nodeId());
1352 if (intNode != null && CollectionUtils.isNotEmpty(intNode.tpIds())) {
1353 intNode.setChildUpdate(true);
1354 intNode.tpIds().remove(tpKey.tpId());
1355 }
1356 // Remove it from tpMap
1357 InternalTerminationPoint tp = tpMap.remove(tpKey);
1358 // Remove it from tpKeyMap
1359 if (tp != null) {
1360 tpKeyMap.remove(tp.teTpKey());
1361 }
1362 }
1363
1364 @Override
1365 public TunnelTerminationPoint tunnelTerminationPoint(TtpKey ttpId) {
1366 return ttpMap.get(ttpId);
1367 }
1368
1369 @Override
1370 public long nextTeTopologyId() {
1371 return nextTeTopologyId.getAndIncrement();
1372 }
1373
1374 @Override
1375 public long nextTeNodeId(TeTopologyKey topoKey) {
1376 return teTopologyMap.get(topoKey).nextTeNodeId();
1377 }
1378
1379 @Override
1380 public void setNextTeNodeId(TeTopologyKey topoKey, long nextNodeId) {
1381 teTopologyMap.get(topoKey).setNextTeNodeId(nextNodeId);
1382 }
1383
1384 @Override
1385 public KeyId networkId(TeTopologyKey teTopologyKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001386 return teTopologyMap.get(teTopologyKey) == null ||
1387 teTopologyMap.get(teTopologyKey).topologyData() == null ? null :
1388 teTopologyMap.get(teTopologyKey).topologyData().networkId();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001389 }
1390
1391 @Override
1392 public NetworkNodeKey nodeKey(TeNodeKey teNodeKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001393 return teNodeMap.get(teNodeKey) == null ? null :
1394 teNodeMap.get(teNodeKey).networkNodeKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001395 }
1396
1397 @Override
1398 public NetworkLinkKey linkKey(TeLinkTpGlobalKey teLinkKey) {
Yixiao Chen29f06332016-12-07 16:14:29 -05001399 return teLinkMap.get(teLinkKey) == null ? null :
1400 teLinkMap.get(teLinkKey).networkLinkKey();
Yixiao Chen68bfab22016-11-11 11:04:10 -05001401 }
1402
1403 @Override
1404 public TerminationPointKey terminationPointKey(TeLinkTpGlobalKey teTpKey) {
1405 return tpKeyMap.get(teTpKey);
1406 }
1407
1408 @Override
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001409 public BlockingQueue<TeTopologyMapEvent> mapEventQueue() {
1410 return mapEventQueue;
Yixiao Chen68bfab22016-11-11 11:04:10 -05001411 }
Yixiao Chen29f06332016-12-07 16:14:29 -05001412
1413 @Override
1414 public void setProviderId(long providerId) {
1415 this.providerId = providerId;
1416 }
Yixiao Chen68bfab22016-11-11 11:04:10 -05001417}
1418