X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fnetworkanalyzer%2FPceCalculation.java;h=373a3d695f156b8f160a33f97a25f1b5b8497e91;hb=refs%2Fchanges%2F26%2F97826%2F12;hp=5fad6c02c604b5c5ef767b6bf7c696ce1c9c357e;hpb=feb80c05128f6292a0c9735db4e7e542fbac1999;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java index 5fad6c02c..373a3d695 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java @@ -27,15 +27,15 @@ import org.opendaylight.transportpce.common.mapping.MappingUtils; import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl; import org.opendaylight.transportpce.common.mapping.PortMapping; import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.common.service.ServiceTypes; +import org.opendaylight.transportpce.pce.PceComplianceCheck; import org.opendaylight.transportpce.pce.constraints.PceConstraints; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilities; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev210701.PathComputationRequestInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.mc.capabilities.McCapabilities; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.PortQual; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; @@ -48,6 +48,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,7 +64,7 @@ public class PceCalculation { private String serviceFormatA = ""; private String serviceFormatZ = ""; private String serviceType = ""; - private Long serviceRate = 0L; + private Uint32 serviceRate = Uint32.valueOf(0); private PceConstraints pceHardConstraints; @@ -127,97 +128,48 @@ public class PceCalculation { } private boolean parseInput() { - if (input.getServiceAEnd().getServiceFormat() == null || input.getServiceZEnd().getServiceFormat() == null - || input.getServiceAEnd().getServiceRate() == null) { + if (!PceComplianceCheck.checkString(input.getServiceAEnd().getServiceFormat().getName()) + || !PceComplianceCheck.checkString(input.getServiceZEnd().getServiceFormat().getName()) + || !PceComplianceCheck.checkString(input.getServiceAEnd().getServiceRate().toString())) { LOG.error("Service Format and Service Rate are required for a path calculation"); return false; } serviceFormatA = input.getServiceAEnd().getServiceFormat().getName(); serviceFormatZ = input.getServiceZEnd().getServiceFormat().getName(); - serviceRate = input.getServiceAEnd().getServiceRate().toJava(); + serviceRate = input.getServiceAEnd().getServiceRate(); + serviceType = ServiceTypes.getServiceType(serviceFormatA, serviceRate, + (NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId()).getNodeInfo().getNodeType()) + && input.getServiceAEnd().getTxDirection() != null + && input.getServiceAEnd().getTxDirection().getPort() != null + && input.getServiceAEnd().getTxDirection().getPort().getPortName() != null) + ? portMapping.getMapping(input.getServiceAEnd().getNodeId(), + input.getServiceAEnd().getTxDirection().getPort().getPortName()) + : null); LOG.info("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId); - setServiceType(); - if (StringConstants.SERVICE_TYPE_ODU4.equals(serviceType) - || StringConstants.SERVICE_TYPE_ODUC4.equals(serviceType) - || StringConstants.SERVICE_TYPE_100GE_M.equals(serviceType) - || StringConstants.SERVICE_TYPE_10GE.equals(serviceType) - || StringConstants.SERVICE_TYPE_1GE.equals(serviceType)) { - anodeId = input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName(); - znodeId = input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName(); - } else { - anodeId = input.getServiceAEnd().getNodeId(); - znodeId = input.getServiceZEnd().getNodeId(); - } + getAZnodeId(); returnStructure.setRate(input.getServiceAEnd().getServiceRate().toJava()); returnStructure.setServiceFormat(input.getServiceAEnd().getServiceFormat()); return true; } - private void setServiceType() { - if ("Ethernet".equals(serviceFormatA)) { - switch (serviceRate.intValue()) { - case 1: - serviceType = StringConstants.SERVICE_TYPE_1GE; - break; - case 10: - serviceType = StringConstants.SERVICE_TYPE_10GE; - break; - case 100: - serviceType = StringConstants.SERVICE_TYPE_100GE_T; - if (NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId()) - .getNodeInfo().getNodeType())) { - if (input.getServiceAEnd().getTxDirection() != null - && input.getServiceAEnd().getTxDirection().getPort() != null - && input.getServiceAEnd().getTxDirection().getPort().getPortName() != null) { - String lcp = input.getServiceAEnd().getTxDirection().getPort().getPortName(); - if (portMapping.getMapping(input.getServiceAEnd().getNodeId(), lcp) != null) { - Mapping mapping = portMapping.getMapping(input.getServiceAEnd().getNodeId(), lcp); - if (PortQual.SwitchClient.getName().equals(mapping.getPortQual())) { - serviceType = StringConstants.SERVICE_TYPE_100GE_M; - } - } - } - } - break; - case 400: - serviceType = StringConstants.SERVICE_TYPE_400GE; - break; - default: - LOG.warn("Invalid service-rate {}", serviceRate); - break; - } - } - if ("OC".equals(serviceFormatA) && Long.valueOf(100L).equals(serviceRate)) { - serviceType = StringConstants.SERVICE_TYPE_100GE_T; - } - if ("OTU".equals(serviceFormatA)) { - switch (serviceRate.intValue()) { - case 100: - serviceType = StringConstants.SERVICE_TYPE_OTU4; - break; - case 400: - serviceType = StringConstants.SERVICE_TYPE_OTUC4; - break; - default: - LOG.warn("Invalid service-rate {}", serviceRate); - break; - } - } - if ("ODU".equals(serviceFormatA)) { - switch (serviceRate.intValue()) { - case 100: - serviceType = StringConstants.SERVICE_TYPE_ODU4; - break; - case 400: - serviceType = StringConstants.SERVICE_TYPE_ODUC4; - break; - default: - LOG.warn("Invalid service-rate {}", serviceRate); - break; - } + private void getAZnodeId() { + switch (serviceType) { + case StringConstants.SERVICE_TYPE_ODU4: + case StringConstants.SERVICE_TYPE_ODUC4: + case StringConstants.SERVICE_TYPE_100GE_M: + case StringConstants.SERVICE_TYPE_100GE_S: + case StringConstants.SERVICE_TYPE_10GE: + case StringConstants.SERVICE_TYPE_1GE: + anodeId = input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName(); + znodeId = input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName(); + break; + default: + anodeId = input.getServiceAEnd().getNodeId(); + znodeId = input.getServiceZEnd().getNodeId(); + break; } } @@ -233,6 +185,7 @@ public class PceCalculation { .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); break; case StringConstants.SERVICE_TYPE_100GE_M: + case StringConstants.SERVICE_TYPE_100GE_S: case StringConstants.SERVICE_TYPE_ODU4: case StringConstants.SERVICE_TYPE_ODUC4: case StringConstants.SERVICE_TYPE_10GE: @@ -247,36 +200,36 @@ public class PceCalculation { break; } - if (readTopology(nwInstanceIdentifier) != null) { - allNodes = readTopology(nwInstanceIdentifier).nonnullNode().values().stream().sorted((n1, n2) - -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList()); - Network1 nw1 = readTopology(nwInstanceIdentifier).augmentation(Network1.class); - if (nw1 != null) { - allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2) - -> l1.getSource().getSourceTp().toString().compareTo(l2.getSource().getSourceTp().toString())) - .collect(Collectors.toList()); - } else { - LOG.warn("no otn links in otn-topology"); - } - if (allNodes == null || allNodes.isEmpty()) { - LOG.error("readMdSal: no nodes "); - return false; - } - LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size()); - LOG.debug("readMdSal: network nodes: {} nodes added", allNodes); - - if (allLinks == null || allLinks.isEmpty()) { - LOG.error("readMdSal: no links "); - return false; - } - LOG.info("readMdSal: network links: {} links added", allLinks.size()); - LOG.debug("readMdSal: network links: {} links added", allLinks); + if (readTopology(nwInstanceIdentifier) == null) { + LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier); + return false; + } - return true; + allNodes = readTopology(nwInstanceIdentifier).nonnullNode().values().stream().sorted((n1, n2) + -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList()); + Network1 nw1 = readTopology(nwInstanceIdentifier).augmentation(Network1.class); + if (nw1 == null) { + LOG.warn("no otn links in otn-topology"); } else { - LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier); + allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2) + -> l1.getSource().getSourceTp().getValue().compareTo(l2.getSource().getSourceTp().getValue())) + .collect(Collectors.toList()); + } + if (allNodes == null || allNodes.isEmpty()) { + LOG.error("readMdSal: no nodes "); + return false; + } + LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size()); + LOG.debug("readMdSal: network nodes: {} nodes added", allNodes); + + if (allLinks == null || allLinks.isEmpty()) { + LOG.error("readMdSal: no links "); return false; } + LOG.info("readMdSal: network links: {} links added", allLinks.size()); + LOG.debug("readMdSal: network links: {} links added", allLinks); + + return true; } private Network readTopology(InstanceIdentifier nwInstanceIdentifier) { @@ -302,56 +255,58 @@ public class PceCalculation { private boolean analyzeNw() { LOG.debug("analyzeNw: allNodes size {}, allLinks size {}", allNodes.size(), allLinks.size()); + switch (serviceType) { + case StringConstants.SERVICE_TYPE_100GE_T: + case StringConstants.SERVICE_TYPE_OTU4: + case StringConstants.SERVICE_TYPE_400GE: + case StringConstants.SERVICE_TYPE_OTUC4: + // 100GE service and OTU4 service are handled at the openroadm-topology layer + for (Node node : allNodes) { + validateNode(node); + } - if (StringConstants.SERVICE_TYPE_100GE_T.equals(serviceType) - || StringConstants.SERVICE_TYPE_OTU4.equals(serviceType) - || StringConstants.SERVICE_TYPE_400GE.equals(serviceType) - || StringConstants.SERVICE_TYPE_OTUC4.equals(serviceType)) { - // 100GE service and OTU4 service are handled at the openroadm-topology layer - for (Node node : allNodes) { - validateNode(node); - } - - LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); + LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); - if (aendPceNode == null || zendPceNode == null) { - LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); - return false; - } - for (Link link : allLinks) { - validateLink(link); - } - // debug prints - LOG.debug("analyzeNw: addLinks size {}, dropLinks size {}", addLinks.size(), dropLinks.size()); - // debug prints - LOG.debug("analyzeNw: azSrgs size = {}", azSrgs.size()); - for (NodeId srg : azSrgs) { - LOG.debug("analyzeNw: A/Z Srgs SRG = {}", srg.getValue()); - } - // debug prints - for (PceLink link : addLinks) { - filteraddLinks(link); - } - for (PceLink link : dropLinks) { - filterdropLinks(link); - } + if (aendPceNode == null || zendPceNode == null) { + LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); + return false; + } + for (Link link : allLinks) { + validateLink(link); + } + // debug prints + LOG.debug("analyzeNw: addLinks size {}, dropLinks size {}", addLinks.size(), dropLinks.size()); + // debug prints + LOG.debug("analyzeNw: azSrgs size = {}", azSrgs.size()); + for (NodeId srg : azSrgs) { + LOG.debug("analyzeNw: A/Z Srgs SRG = {}", srg.getValue()); + } + // debug prints + for (PceLink link : addLinks) { + filteraddLinks(link); + } + for (PceLink link : dropLinks) { + filterdropLinks(link); + } + break; - } else { - // ODU4, 10GE/ODU2e or 1GE/ODU0 services are handled at openroadm-otn layer + default: + // ODU4, 10GE/ODU2e or 1GE/ODU0 services are handled at openroadm-otn layer - for (Node node : allNodes) { - validateOtnNode(node); - } + for (Node node : allNodes) { + validateOtnNode(node); + } - LOG.info("analyzeNw: allPceNodes {}", allPceNodes); + LOG.info("analyzeNw: allPceNodes {}", allPceNodes); - if (aendPceNode == null || zendPceNode == null) { - LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); - return false; - } - for (Link link : allLinks) { - validateLink(link); - } + if (aendPceNode == null || zendPceNode == null) { + LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); + return false; + } + for (Link link : allLinks) { + validateLink(link); + } + break; } LOG.info("analyzeNw: allPceNodes size {}, allPceLinks size {}", allPceNodes.size(), allPceLinks.size()); @@ -437,6 +392,7 @@ public class PceCalculation { case StringConstants.SERVICE_TYPE_ODU4: case StringConstants.SERVICE_TYPE_10GE: case StringConstants.SERVICE_TYPE_100GE_M: + case StringConstants.SERVICE_TYPE_100GE_S: case StringConstants.SERVICE_TYPE_ODUC4: case StringConstants.SERVICE_TYPE_1GE: return processPceOtnLink(link, source, dest); @@ -469,7 +425,8 @@ public class PceCalculation { LOG.info("Device node id {} for {}", deviceNodeId, node); PceOpticalNode pceNode = new PceOpticalNode(deviceNodeId, this.serviceType, portMapping, node, nodeType, - mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId())); + mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()), + getCentralFreqGranularity(deviceNodeId, node.getNodeId())); pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat()); pceNode.initFrequenciesBitSet(); @@ -521,32 +478,32 @@ public class PceCalculation { private void validateOtnNode(Node node) { LOG.info("validateOtnNode: {} ", node.getNodeId().getValue()); // PceOtnNode will be used in Graph algorithm - if (node.augmentation(Node1.class) != null) { - OpenroadmNodeType nodeType = node.augmentation(Node1.class).getNodeType(); + if (node.augmentation(Node1.class) == null) { + LOG.error("ValidateOtnNode: no node-type augmentation. Node {} is ignored", node.getNodeId().getValue()); + return; + } - PceOtnNode pceOtnNode = new PceOtnNode(node, nodeType, node.getNodeId(), "otn", serviceType); - pceOtnNode.validateXponder(anodeId, znodeId); + OpenroadmNodeType nodeType = node.augmentation(Node1.class).getNodeType(); - if (!pceOtnNode.isValid()) { - LOG.warn(" validateOtnNode: Node {} is ignored", node.getNodeId().getValue()); - return; - } - if (validateNodeConstraints(pceOtnNode).equals(ConstraintTypes.HARD_EXCLUDE)) { - return; - } - if (pceOtnNode.getNodeId().getValue().equals(anodeId) && this.aendPceNode == null) { - this.aendPceNode = pceOtnNode; - } - if (pceOtnNode.getNodeId().getValue().equals(znodeId) && this.zendPceNode == null) { - this.zendPceNode = pceOtnNode; - } - allPceNodes.put(pceOtnNode.getNodeId(), pceOtnNode); - LOG.info("validateOtnNode: node {} is saved", node.getNodeId().getValue()); + PceOtnNode pceOtnNode = new PceOtnNode(node, nodeType, node.getNodeId(), "otn", serviceType); + pceOtnNode.validateXponder(anodeId, znodeId); + + if (!pceOtnNode.isValid()) { + LOG.warn(" validateOtnNode: Node {} is ignored", node.getNodeId().getValue()); return; - } else { - LOG.error("ValidateOtnNode: no node-type augmentation. Node {} is ignored", node.getNodeId().getValue()); + } + if (validateNodeConstraints(pceOtnNode).equals(ConstraintTypes.HARD_EXCLUDE)) { return; } + if (pceOtnNode.getNodeId().getValue().equals(anodeId) && this.aendPceNode == null) { + this.aendPceNode = pceOtnNode; + } + if (pceOtnNode.getNodeId().getValue().equals(znodeId) && this.zendPceNode == null) { + this.zendPceNode = pceOtnNode; + } + allPceNodes.put(pceOtnNode.getNodeId(), pceOtnNode); + LOG.info("validateOtnNode: node {} is saved", node.getNodeId().getValue()); + return; } private ConstraintTypes validateNodeConstraints(PceNode pcenode) { @@ -637,12 +594,12 @@ public class PceCalculation { pcelink.getlinkType(), pcelink); break; case ADDLINK: - pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString())); + pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().getValue())); addLinks.add(pcelink); LOG.debug("validateLink: ADD-LINK saved {}", pcelink); break; case DROPLINK: - pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString())); + pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().getValue())); dropLinks.add(pcelink); LOG.debug("validateLink: DROP-LINK saved {}", pcelink); break; @@ -650,13 +607,13 @@ public class PceCalculation { // store separately all SRG links directly azSrgs.add(sourceId); // connected to A/Z - if (!dest.checkTP(pcelink.getDestTP().toString())) { + if (!dest.checkTP(pcelink.getDestTP().getValue())) { LOG.debug( "validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink); return false; } - if (dest.getXpdrClient(pcelink.getDestTP().toString()) != null) { - pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().toString())); + if (dest.getXpdrClient(pcelink.getDestTP().getValue()) != null) { + pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().getValue())); } allPceLinks.put(linkId, pcelink); source.addOutgoingLink(pcelink); @@ -667,13 +624,13 @@ public class PceCalculation { // store separately all SRG links directly azSrgs.add(destId); // connected to A/Z - if (!source.checkTP(pcelink.getSourceTP().toString())) { + if (!source.checkTP(pcelink.getSourceTP().getValue())) { LOG.debug( "validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink); return false; } - if (source.getXpdrClient(pcelink.getSourceTP().toString()) != null) { - pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().toString())); + if (source.getXpdrClient(pcelink.getSourceTP().getValue()) != null) { + pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().getValue())); } allPceLinks.put(linkId, pcelink); source.addOutgoingLink(pcelink); @@ -703,10 +660,12 @@ public class PceCalculation { switch (pceOtnLink.getlinkType()) { case OTNLINK: - if (dest.getXpdrClient(pceOtnLink.getDestTP().toString()) != null) { - pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().toString())); + if (source.getXpdrClient(pceOtnLink.getSourceTP().getValue()) != null) { + pceOtnLink.setClient(source.getXpdrClient(pceOtnLink.getSourceTP().getValue())); + } + if (dest.getXpdrClient(pceOtnLink.getDestTP().getValue()) != null) { + pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().getValue())); } - allPceLinks.put(linkId, pceOtnLink); source.addOutgoingLink(pceOtnLink); LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink); @@ -759,14 +718,44 @@ public class PceCalculation { // deviceNodeId: openroadm-network level node List mcCapabilities = mappingUtils.getMcCapabilitiesForNode(deviceNodeId); String[] params = nodeId.getValue().split("-"); - // DEGX or SRGX - String rdmModuleName = params[params.length - 1]; + // DEGx or SRGx or XPDRx + String moduleName = params[params.length - 1]; for (McCapabilities mcCapabitility : mcCapabilities) { - if (mcCapabitility.getMcNodeName().contains(rdmModuleName) + if (mcCapabitility.getMcNodeName().contains("XPDR") + && mcCapabitility.getSlotWidthGranularity() != null) { + return mcCapabitility.getSlotWidthGranularity().getValue(); + } + if (mcCapabitility.getMcNodeName().contains(moduleName) && mcCapabitility.getSlotWidthGranularity() != null) { return mcCapabitility.getSlotWidthGranularity().getValue(); } } return GridConstant.SLOT_WIDTH_50; } + + /** + * Get mc capability central-width granularity for device. + * @param deviceNodeId String + * @param nodeId NodeId + * @return center-freq granularity + */ + private BigDecimal getCentralFreqGranularity(String deviceNodeId, NodeId nodeId) { + // nodeId: openroadm-topology level node + // deviceNodeId: openroadm-network level node + List mcCapabilities = mappingUtils.getMcCapabilitiesForNode(deviceNodeId); + String[] params = nodeId.getValue().split("-"); + // DEGx or SRGx or XPDRx + String moduleName = params[params.length - 1]; + for (McCapabilities mcCapabitility : mcCapabilities) { + if (mcCapabitility.getMcNodeName().contains("XPDR") + && mcCapabitility.getCenterFreqGranularity() != null) { + return mcCapabitility.getCenterFreqGranularity().getValue(); + } + if (mcCapabitility.getMcNodeName().contains(moduleName) + && mcCapabitility.getCenterFreqGranularity() != null) { + return mcCapabitility.getCenterFreqGranularity().getValue(); + } + } + return GridConstant.SLOT_WIDTH_50; + } }