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