Refactor PCE network analyzer PceOtnNode step 9
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / networkanalyzer / PceOtnNode.java
1 /*
2  * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.transportpce.pce.networkanalyzer;
10
11 import java.math.BigDecimal;
12 import java.util.ArrayList;
13 import java.util.BitSet;
14 import java.util.Comparator;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.TreeMap;
19 import java.util.stream.Collectors;
20 import org.opendaylight.transportpce.common.StringConstants;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributes;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If100GEODU4;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2e;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If1GEODU0;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
44 import org.opendaylight.yangtools.yang.common.Uint16;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 public class PceOtnNode implements PceNode {
49     ////////////////////////// OTN NODES ///////////////////////////
50     /*
51      * For This Class the node passed shall be at the otn-openroadm Layer
52      */
53
54     private static final Logger LOG = LoggerFactory.getLogger(PceOtnNode.class);
55     private static final List<String> SERVICE_TYPE_ODU_LIST = List.of(
56         StringConstants.SERVICE_TYPE_ODU4,
57         StringConstants.SERVICE_TYPE_ODUC4,
58         StringConstants.SERVICE_TYPE_ODUC3,
59         StringConstants.SERVICE_TYPE_ODUC2);
60     private static final List<OpenroadmNodeType> VALID_NODETYPES_LIST = List.of(
61         OpenroadmNodeType.MUXPDR,
62         OpenroadmNodeType.SWITCH,
63         OpenroadmNodeType.TPDR);
64     private static final Map<String, Class<? extends SupportedIfCapability>> SERVICE_TYPE_ETH_CLASS_MAP = Map.of(
65         StringConstants.SERVICE_TYPE_1GE, If1GEODU0.class,
66         StringConstants.SERVICE_TYPE_10GE, If10GEODU2e.class,
67         StringConstants.SERVICE_TYPE_100GE_M, If100GEODU4.class,
68         StringConstants.SERVICE_TYPE_100GE_S, If100GEODU4.class);
69     private static final Map<String, Integer> SERVICE_TYPE_ETH_TS_NB_MAP = Map.of(
70         StringConstants.SERVICE_TYPE_1GE, 1,
71         StringConstants.SERVICE_TYPE_10GE, 10,
72         StringConstants.SERVICE_TYPE_100GE_M, 20);
73     private static final Map<String, String> SERVICE_TYPE_ETH_ODU_STRING_MAP = Map.of(
74         StringConstants.SERVICE_TYPE_1GE, "ODU0",
75         StringConstants.SERVICE_TYPE_10GE, "ODU2e",
76         StringConstants.SERVICE_TYPE_100GE_M, "ODU4");
77     private static final String INTERMEDIATE_MODETYPE = "intermediate";
78     private static final String AZ_MODETYPE = "AZ";
79
80     private boolean valid = true;
81
82     private final Node node;
83     private final NodeId nodeId;
84     private final OpenroadmNodeType nodeType;
85     private final String pceNodeType;
86     private final String otnServiceType;
87     private String modeType;
88     // TODO: not adding state check in this class as otn topology has not been modified
89     private final AdminStates adminStates;
90     private final State state;
91
92     private Map<String, List<Uint16>> tpAvailableTribPort = new TreeMap<>();
93     private Map<String, List<Uint16>> tpAvailableTribSlot = new TreeMap<>();
94     private Map<String, OpenroadmTpType> availableXponderTp = new TreeMap<>();
95     private List<String> usedXpdrNWTps = new ArrayList<>();
96     private List<TpId> availableXpdrNWTps;
97     private List<TpId> usableXpdrNWTps;
98     private List<String> usedXpdrClientTps = new ArrayList<>();
99     private List<TpId> availableXpdrClientTps;
100     private List<TpId> usableXpdrClientTps;
101
102     private List<PceLink> outgoingLinks = new ArrayList<>();
103     private Map<String, String> clientPerNwTp = new HashMap<>();
104     private String clientPort;
105
106     public PceOtnNode(
107             Node node,
108             OpenroadmNodeType nodeType,
109             NodeId nodeId,
110             String pceNodeType,
111             String serviceType,
112             String clientPort) {
113         this.node = node;
114         this.nodeId = nodeId;
115         this.nodeType = nodeType;
116         this.pceNodeType = pceNodeType;
117         this.otnServiceType = serviceType;
118         this.tpAvailableTribSlot.clear();
119         this.usedXpdrNWTps.clear();
120         this.availableXpdrNWTps = new ArrayList<>();
121         this.usableXpdrNWTps = new ArrayList<>();
122         this.usedXpdrClientTps.clear();
123         this.availableXpdrClientTps = new ArrayList<>();
124         this.usableXpdrClientTps = new ArrayList<>();
125         this.adminStates = node
126             .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
127             .getAdministrativeState();
128         this.state = node
129             .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
130             .getOperationalState();
131         this.tpAvailableTribPort.clear();
132         checkAvailableTribPort();
133         this.tpAvailableTribSlot.clear();
134         checkAvailableTribSlot();
135         this.clientPort = clientPort;
136         if (node == null
137                 || nodeId == null
138                 || nodeType == null
139                 || !VALID_NODETYPES_LIST.contains(nodeType)) {
140             LOG.error("PceOtnNode: one of parameters is not populated : nodeId, node type");
141             this.valid = false;
142         }
143         if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(serviceType)
144                 && !SERVICE_TYPE_ODU_LIST.contains(serviceType)) {
145             LOG.error("PceOtnNode: unsupported OTN Service Type {}", serviceType);
146             this.valid = false;
147         }
148     }
149
150     public void initXndrTps(String mode) {
151         LOG.info("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue());
152         this.availableXponderTp.clear();
153         this.modeType = mode;
154         List<TerminationPoint> allTps =
155             new ArrayList<>(
156                 this.node.augmentation(
157                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
158                         .Node1.class)
159                 .nonnullTerminationPoint()
160                 .values());
161         this.valid = false;
162         if (allTps.isEmpty()) {
163             LOG.error("PceOtnNode: initXndrTps: XPONDER TerminationPoint list is empty for node {}", this);
164             return;
165         }
166         for (TerminationPoint tp : allTps) {
167             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
168                     .TerminationPoint1 ocnTp1
169                 = tp.augmentation(
170                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
171                         .TerminationPoint1.class);
172             if (ocnTp1 == null) {
173                 LOG.warn("null ocn TP {}", tp);
174                 continue;
175             }
176             TerminationPoint1 ontTp1 = tp.augmentation(TerminationPoint1.class);
177             if (ontTp1 == null) {
178                 continue;
179             }
180             //TODO many nested structures below, this needs to be reworked
181             switch (ocnTp1.getTpType()) {
182                 case XPONDERNETWORK:
183                     String notCreatedServiceType = xpdrNetTpCreation(ontTp1);
184                     if (notCreatedServiceType == null) {
185                         LOG.info("TP {} of XPONDER {} is validated",
186                             tp.getTpId(),
187                             node.getNodeId().getValue());
188                         this.availableXpdrNWTps.add(tp.getTpId());
189                     } else {
190                         LOG.error("TP {} of {} does not allow {} termination creation",
191                             tp.getTpId().getValue(),
192                             node.getNodeId().getValue(),
193                             notCreatedServiceType);
194                     }
195                     break;
196
197                 case XPONDERCLIENT:
198                     if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) {
199                         continue;
200                     }
201                     if (checkClientTp(ontTp1)) {
202                         LOG.info("TP {} of XPONDER {} is validated",
203                             tp.getTpId(),
204                             node.getNodeId().getValue());
205                         this.availableXpdrClientTps.add(tp.getTpId());
206                     } else {
207                         LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation",
208                             tp.getTpId().getValue(),
209                             node.getNodeId().getValue());
210                     }
211                     break;
212
213                 default:
214                     LOG.debug("unsupported ocn TP type {}", ocnTp1.getTpType());
215             }
216         }
217         this.valid = checkSwPool(availableXpdrNWTps, availableXpdrClientTps);
218     }
219
220     private String xpdrNetTpCreation(TerminationPoint1 ontTp1) {
221         if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)
222                 || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)) {
223                 // TODO verify the capability of network port to support ODU4 CTP interface creation
224             if (checkTpForOdtuTermination(ontTp1)) {
225                 //success
226                 return null;
227             }
228             return "ODU4";
229         }
230         if (SERVICE_TYPE_ETH_TS_NB_MAP.containsKey(this.otnServiceType)) {
231             if (checkOdtuTTPforLoOduCreation(
232                     ontTp1,
233                     SERVICE_TYPE_ETH_TS_NB_MAP.get(this.otnServiceType))) {
234                 //success
235                 return null;
236             }
237             return SERVICE_TYPE_ETH_ODU_STRING_MAP.get(this.otnServiceType);
238         }
239         //failure
240         return "any";
241     }
242
243     private boolean checkSwPool(List<TpId> netwTps, List<TpId> clientTps) {
244
245         if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)) {
246             return true;
247         }
248         if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) {
249             return false;
250         }
251         if (netwTps == null) {
252             return false;
253         }
254         Node1 node1 = node.augmentation(Node1.class);
255         if (node1 == null) {
256             return false;
257         }
258         List<NonBlockingList> nblList = new ArrayList<>(
259                 node1.getSwitchingPools().nonnullOduSwitchingPools()
260                         .values().stream().findFirst().get()
261                                 .getNonBlockingList().values());
262         if (nblList == null) {
263             return false;
264         }
265         netwTps.sort(Comparator.comparing(TpId::getValue));
266
267         switch (modeType) {
268
269             case INTERMEDIATE_MODETYPE:
270                 return checkIntermediateSwPool(nblList, netwTps);
271
272             case AZ_MODETYPE:
273                 if (clientTps == null) {
274                     return false;
275                 }
276                 clientTps.sort(Comparator.comparing(TpId::getValue));
277                 return checkAzSwPool(nblList, netwTps, clientTps);
278
279             default:
280                 LOG.error("Unsupported mode type {}", modeType);
281                 return false;
282         }
283     }
284
285
286     private boolean checkIntermediateSwPool(List<NonBlockingList> nblList, List<TpId> netwTps) {
287         for (NonBlockingList nbl: nblList) {
288             for (TpId nwTp : netwTps) {
289                 if (nbl.getTpList().contains(nwTp)) {
290                     usableXpdrNWTps.add(nwTp);
291                 }
292                 if (usableXpdrNWTps.size() >= 2) {
293                     return true;
294                 }
295             }
296         }
297         return false;
298     }
299
300
301     private boolean checkAzSwPool(List<NonBlockingList> nblList, List<TpId> netwTps, List<TpId> clientTps) {
302         for (NonBlockingList nbl: nblList) {
303             for (TpId nwTp : netwTps) {
304                 for (TpId clTp : clientTps) {
305                     if (nbl.getTpList().contains(clTp)
306                             && nbl.getTpList().contains(nwTp)) {
307                         usableXpdrClientTps.add(clTp);
308                         usableXpdrNWTps.add(nwTp);
309                     }
310                     if (usableXpdrClientTps.size() >= 1
311                             && usableXpdrNWTps.size() >= 1
312                             && (this.clientPort == null || this.clientPort.equals(clTp.getValue()))) {
313                         clientPerNwTp.put(nwTp.getValue(), clTp.getValue());
314                         return true;
315                     }
316                 }
317             }
318         }
319         return false;
320     }
321
322     private boolean checkTpForOdtuTermination(TerminationPoint1 ontTp1) {
323         for (SupportedInterfaceCapability sic :
324                 ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
325             LOG.info("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
326             if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class) || sic.getIfCapType().equals(IfOtsiOtsigroup.class))
327                     && (ontTp1.getXpdrTpPortConnectionAttributes() == null
328                         || ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) {
329                 return true;
330             }
331         }
332         return false;
333     }
334
335     private boolean checkOdtuTTPforLoOduCreation(TerminationPoint1 ontTp1, int tsNb) {
336         XpdrTpPortConnectionAttributes portConAttr = ontTp1.getXpdrTpPortConnectionAttributes();
337         if (portConAttr == null
338                 || portConAttr.getTsPool() == null
339                 || portConAttr.getTsPool().size() < tsNb
340                 || portConAttr.getOdtuTpnPool() == null) {
341             return false;
342         }
343         return checkFirstOdtuTpn(portConAttr.getOdtuTpnPool().values().stream().findFirst().get());
344     }
345
346     private boolean checkFirstOdtuTpn(OdtuTpnPool otPool) {
347         return (otPool.getOdtuType().equals(ODTU4TsAllocated.class)
348                 || otPool.getOdtuType().equals(ODTUCnTs.class))
349             && !otPool.getTpnPool().isEmpty();
350     }
351
352     private boolean checkClientTp(TerminationPoint1 ontTp1) {
353         for (SupportedInterfaceCapability sic :
354                 ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
355             LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
356             // we could also check the administrative status of the tp
357             if (sic.getIfCapType().equals(SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType))) {
358                 return true;
359             }
360         }
361         return false;
362     }
363
364     public void validateXponder(String anodeId, String znodeId) {
365         if (!isValid()) {
366             return;
367         }
368         if (this.nodeId.getValue().equals(anodeId)
369                 || (this.nodeId.getValue().equals(znodeId))) {
370             initXndrTps(AZ_MODETYPE);
371         } else if (OpenroadmNodeType.SWITCH.equals(this.nodeType)) {
372             initXndrTps(INTERMEDIATE_MODETYPE);
373         } else {
374             LOG.info("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
375             valid = false;
376         }
377     }
378
379     public boolean validateSwitchingPoolBandwidth(TerminationPoint tp1, TerminationPoint tp2, Long neededBW) {
380         if (this.nodeType != OpenroadmNodeType.TPDR) {
381             return true;
382         }
383         for (OduSwitchingPools ospx :
384                 node.augmentation(Node1.class)
385                     .getSwitchingPools()
386                     .nonnullOduSwitchingPools().values()) {
387             for (NonBlockingList nbll : ospx.nonnullNonBlockingList().values()) {
388                 if (nbll.getAvailableInterconnectBandwidth().toJava() >= neededBW
389                         && nbll.getTpList() != null
390                         && nbll.getTpList().contains(tp1.getTpId())
391                         && nbll.getTpList().contains(tp2.getTpId())) {
392                     LOG.debug("validateSwitchingPoolBandwidth: couple  of tp {} x {} valid for crossconnection",
393                         tp1.getTpId(), tp2.getTpId());
394                     return true;
395                 }
396             }
397         }
398         LOG.debug("validateSwitchingPoolBandwidth: No valid Switching pool for crossconnecting tp {} and {}",
399             tp1.getTpId(), tp2.getTpId());
400         return false;
401     }
402
403     public void validateIntermediateSwitch() {
404         if (!isValid()) {
405             return;
406         }
407         if (this.nodeType != OpenroadmNodeType.SWITCH) {
408             return;
409         }
410         // Validate switch for use as an intermediate XPONDER on the path
411         initXndrTps(INTERMEDIATE_MODETYPE);
412         if (this.valid) {
413             LOG.info("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue());
414         } else {
415             LOG.debug("validateIntermediateSwitch: Switch unusable for transit == {}", nodeId.getValue());
416         }
417     }
418
419     public void checkAvailableTribPort() {
420         for (TerminationPoint tp :
421             node.augmentation(
422                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
423                         .Node1.class)
424                 .getTerminationPoint().values().stream()
425                 .filter(type -> type
426                     .augmentation(
427                         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
428                             .TerminationPoint1.class)
429                     .getTpType()
430                     .equals(OpenroadmTpType.XPONDERNETWORK))
431                 .collect(Collectors.toList())) {
432             XpdrTpPortConnectionAttributes portConAttr =
433                 tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes();
434             if (portConAttr != null && portConAttr.getOdtuTpnPool() != null) {
435                 OdtuTpnPool otPool = portConAttr.getOdtuTpnPool().values().stream().findFirst().get();
436                 if (checkFirstOdtuTpn(otPool)) {
437                     tpAvailableTribPort.put(tp.getTpId().getValue(), otPool.getTpnPool());
438                 }
439             }
440         }
441     }
442
443     public void checkAvailableTribSlot() {
444         for (TerminationPoint tp :
445             node.augmentation(
446                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
447                     .Node1.class)
448             .getTerminationPoint().values().stream()
449             .filter(type -> type
450                 .augmentation(
451                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
452                         .TerminationPoint1.class)
453                 .getTpType().equals(OpenroadmTpType.XPONDERNETWORK))
454             .collect(Collectors.toList())
455         ) {
456             XpdrTpPortConnectionAttributes portConAttr =
457                 tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes();
458             if (portConAttr != null && portConAttr.getTsPool() != null) {
459                 tpAvailableTribSlot.put(tp.getTpId().getValue(), portConAttr.getTsPool());
460             }
461         }
462     }
463
464     public boolean isValid() {
465         if (nodeId == null
466                 || nodeType == null
467                 || this.getSupNetworkNodeId() == null
468                 || this.getSupClliNodeId() == null) {
469             LOG.error("PceNode: one of parameters is not populated : nodeId, node type, supporting nodeId");
470             valid = false;
471         }
472         return valid;
473     }
474
475     @Override
476     public void addOutgoingLink(PceLink outLink) {
477         this.outgoingLinks.add(outLink);
478     }
479
480     @Override
481     public List<PceLink> getOutgoingLinks() {
482         return outgoingLinks;
483     }
484
485     @Override
486     public AdminStates getAdminStates() {
487         return adminStates;
488     }
489
490     @Override
491     public State getState() {
492         return state;
493     }
494
495     @Override
496     public String getXpdrClient(String tp) {
497         return this.clientPerNwTp.get(tp);
498     }
499
500     @Override
501     public String toString() {
502         return "PceNode type=" + nodeType + " ID=" + nodeId.getValue() + " CLLI=" + this.getSupClliNodeId();
503     }
504
505     public void printLinksOfNode() {
506         LOG.info(" outgoing links of node {} : {} ", nodeId.getValue(), this.getOutgoingLinks());
507     }
508
509     @Override
510     public Map<String, List<Uint16>> getAvailableTribPorts() {
511         return tpAvailableTribPort;
512     }
513
514     @Override
515     public Map<String, List<Uint16>> getAvailableTribSlots() {
516         return tpAvailableTribSlot;
517     }
518
519     public List<TpId> getUsableXpdrNWTps() {
520         return usableXpdrNWTps;
521     }
522
523     public List<TpId> getUsableXpdrClientTps() {
524         return usableXpdrClientTps;
525     }
526
527     @Override
528     public String getPceNodeType() {
529         return this.pceNodeType;
530     }
531
532     @Override
533     public String getSupNetworkNodeId() {
534         return MapUtils.getSupNetworkNode(this.node);
535     }
536
537     @Override
538     public String getSupClliNodeId() {
539         return MapUtils.getSupClliNode(this.node);
540     }
541
542     @Override
543     public String getRdmSrgClient(String tp, String direction) {
544         return null;
545     }
546
547     @Override
548     public NodeId getNodeId() {
549         return nodeId;
550     }
551
552     @Override
553     public boolean checkTP(String tp) {
554         return false;
555     }
556
557     /*
558     * (non-Javadoc)
559     *
560     * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getVersion()
561     */
562     @Override
563     public String getVersion() {
564         // TODO Auto-generated method stub
565         return null;
566     }
567
568     @Override
569     public BitSet getBitSetData() {
570         // TODO Auto-generated method stub
571         return null;
572     }
573
574     /*
575     * (non-Javadoc)
576     *
577     * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getSlotWidthGranularity()
578     */
579     @Override
580     public BigDecimal getSlotWidthGranularity() {
581         return null;
582     }
583
584     /*
585      * (non-Javadoc)
586      *
587      * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getCentralFreqGranularity()
588      */
589     @Override
590     public BigDecimal getCentralFreqGranularity() {
591         return null;
592     }
593 }