X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Fservice%2FNetworkModelWavelengthServiceImpl.java;h=775ba53b5f1a496d13a3c2c68214faeac574ec5f;hb=7e175bf72bc28db4299b1fd76e6d01bdb0854d0f;hp=aa9e79ce356f40f7f623b4b35ed09698673c14d9;hpb=90f7343d69fd5629f28eddae873ab3d2571ec46a;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java index aa9e79ce3..775ba53b5 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java @@ -8,6 +8,8 @@ package org.opendaylight.transportpce.networkmodel.service; import java.math.BigDecimal; +import java.util.Arrays; +import java.util.BitSet; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -25,14 +27,10 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.NodeIdPair; import org.opendaylight.transportpce.common.Timeouts; -import org.opendaylight.transportpce.common.fixedflex.FixedFlexImpl; import org.opendaylight.transportpce.common.fixedflex.GridConstant; import org.opendaylight.transportpce.common.fixedflex.GridUtils; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyGHz; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyTHz; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev200529.degree.used.wavelengths.UsedWavelengths; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev200529.degree.used.wavelengths.UsedWavelengthsBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev200529.degree.used.wavelengths.UsedWavelengthsKey; +import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1; @@ -51,34 +49,21 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev20052 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.RxTtpAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.TxTtpAttributes; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.TxTtpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrClientAttributes; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrNetworkAttributes; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrNetworkAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrPortAttributes; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrPortAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.pp.attributes.UsedWavelength; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.pp.attributes.UsedWavelengthBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.pp.attributes.UsedWavelengthKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.available.freq.map.AvailFreqMaps; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.available.freq.map.AvailFreqMapsBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.available.freq.map.AvailFreqMapsKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.port.connection.attributes.Wavelength; import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.port.connection.attributes.WavelengthBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.AToZDirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.ZToADirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.atoz.direction.AToZ; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.ztoa.direction.ZToA; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.pce.resource.resource.resource.TerminationPoint; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -93,568 +78,656 @@ public class NetworkModelWavelengthServiceImpl implements NetworkModelWavelength } @Override - public void useWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection) { - if (atoZDirection != null && atoZDirection.getAToZWavelengthNumber() != null) { - LOG.info("Update wavelength for a to z direction {}", atoZDirection); - List atozTpIds = getAToZTpList(atoZDirection); - atozTpIds.removeIf(Objects::isNull); - deleteAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - atoZDirection.getAToZWavelengthNumber().toJava()); - addUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds); - } - if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) { - LOG.info("Update wavelength for z to a direction {}", ztoADirection); - List ztoaTpIds = getZToATpList(ztoADirection); - ztoaTpIds.removeIf(Objects::isNull); - deleteAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - ztoADirection.getZToAWavelengthNumber().toJava()); - - addUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds); - } + public void allocateFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection) { + updateFrequencies(atoZDirection, ztoADirection, true); } @Override - public void freeWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection) { - if (atoZDirection != null && atoZDirection.getAToZWavelengthNumber() != null) { - LOG.info("Free wavelength for a to z direction {}", atoZDirection); + public void releaseFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection) { + updateFrequencies(atoZDirection, ztoADirection, false); + } + + /** + * Update frequency map for nodes and tp in atozDirection and ztoadirection. + * @param atoZDirection AToZDirection + * @param ztoADirection ZToADirection + * @param used used boolean true if frequencies are used, false otherwise. + */ + private void updateFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection, boolean used) { + if (atoZDirection != null && atoZDirection.getAToZMinFrequency() != null) { + LOG.info("Update frequencies for a to z direction {}, used {}", atoZDirection, used); List atozTpIds = getAToZTpList(atoZDirection); - atozTpIds.removeIf(Objects::isNull); - deleteUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds); - addAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - atoZDirection.getAToZWavelengthNumber().toJava()); + BigDecimal atozMinFrequency = atoZDirection.getAToZMinFrequency().getValue(); + BigDecimal atozMaxFrequency = atoZDirection.getAToZMaxFrequency().getValue(); + Optional optionalModulationFormat = ModulationFormat + .forName(atoZDirection.getModulationFormat()); + if (!optionalModulationFormat.isPresent()) { + LOG.error("Unknown modulation format {} for a to z direction, frequencies not updated", + atoZDirection.getModulationFormat()); + return; + } + setFrequencies4Tps(atozMinFrequency, atozMaxFrequency, atoZDirection.getRate(), + optionalModulationFormat.get(), atozTpIds, used); + setFrequencies4Nodes(atozMinFrequency, + atozMaxFrequency, + atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + used); } - if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) { - LOG.info("Free wavelength for z to a direction {}", ztoADirection); + if (ztoADirection != null && ztoADirection.getZToAMinFrequency() != null) { + LOG.info("Update frequencies for z to a direction {}, used {}", ztoADirection, used); List ztoaTpIds = getZToATpList(ztoADirection); - ztoaTpIds.removeIf(Objects::isNull); - deleteUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds); - addAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - ztoADirection.getZToAWavelengthNumber().toJava()); + BigDecimal ztoaMinFrequency = ztoADirection.getZToAMinFrequency().getValue(); + BigDecimal ztoaMaxFrequency = ztoADirection.getZToAMaxFrequency().getValue(); + Optional optionalModulationFormat = ModulationFormat + .forName(ztoADirection.getModulationFormat()); + if (!optionalModulationFormat.isPresent()) { + LOG.error("Unknown modulation format {} for z to a direction, frequencies not updated", + ztoADirection.getModulationFormat()); + return; + } + setFrequencies4Tps(ztoaMinFrequency, ztoaMaxFrequency, ztoADirection.getRate(), + optionalModulationFormat.get(), ztoaTpIds, used); + setFrequencies4Nodes(ztoaMinFrequency, + ztoaMaxFrequency, + ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + used); } } - private List getAToZTpList(AToZDirection atoZDirection) { - Collection atozList = atoZDirection.nonnullAToZ().values(); - return atozList.stream() - .filter(aToZ -> { - if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) { - LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId()); - return false; - } - return aToZ.getResource().getResource() instanceof TerminationPoint; - }).map(aToZ -> { - TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource(); - if ((tp == null) || (tp.getTpNodeId() == null) || (tp.getTpId() == null) - || tp.getTpId().isEmpty()) { - LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId()); - return null; - } - return new NodeIdPair(tp.getTpNodeId(), tp.getTpId()); - }).collect(Collectors.toList()); - } - - private List getZToATpList(ZToADirection ztoADirection) { - Collection ztoaList = ztoADirection.nonnullZToA().values(); - return ztoaList.stream() - .filter(zToA -> { - if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) { - LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId()); - return false; - } - return zToA.getResource().getResource() instanceof TerminationPoint; - }).map(zToA -> { - TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource(); - if ((tp == null) || (tp.getTpNodeId() == null) || (tp.getTpId() == null) - || tp.getTpId().isEmpty()) { - LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId()); - return null; - } - return new NodeIdPair(tp.getTpNodeId(), tp.getTpId()); - }).collect(Collectors.toList()); - } - - private InstanceIdentifier createNode1IID(String nodeId) { - return InstanceIdentifier - .builder(Networks.class) - .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 - .networks.network.Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(Node1.class).build(); - } - - private InstanceIdentifier createNode2IID(String nodeId) { - return InstanceIdentifier - .builder(Networks.class) - .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 - .networks.network.Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class) - .build(); - } - - private Optional getNode1FromDatastore(String nodeId) { - InstanceIdentifier - nodeIID = createNode1IID(nodeId); - Optional nodeOpt; + /** + * Get network node with nodeId from datastore. + * @param nodeId String + * @return Node1, null otherwise. + */ + private Node1 getNetworkNodeFromDatastore(String nodeId) { + InstanceIdentifier nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId); try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) { - nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID) + Optional optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID) .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e); - nodeOpt = Optional.empty(); + if (optionalNode.isPresent()) { + return optionalNode.get(); + } else { + LOG.error("Unable to get network node for node id {}from topology {}", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID); + return null; + } + } catch (ExecutionException | TimeoutException e) { + LOG.warn("Exception while getting network node for node id {} from {} topology", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID, e); + return null; + } catch (InterruptedException e) { + LOG.warn("Getting network node for node id {} from {} topology was interrupted", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID, e); + Thread.currentThread().interrupt(); + return null; } - return nodeOpt; } - private Optional getNode2FromDatastore(String nodeId) { - InstanceIdentifier - nodeIID = createNode2IID(nodeId); - Optional nodeOpt; + /** + * Get common network node with nodeId from datastore. + * @param nodeId String + * @return Node1, null otherwise. + */ + private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 + getCommonNetworkNodeFromDatastore(String nodeId) { + InstanceIdentifier nodeIID = + OpenRoadmTopology.createCommonNetworkNodeIID(nodeId); try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) { - nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID) + Optional optionalNode = + nodeReadTx + .read(LogicalDatastoreType.CONFIGURATION, nodeIID) .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e); - nodeOpt = Optional.empty(); + if (optionalNode.isPresent()) { + return optionalNode.get(); + } else { + LOG.error("Unable to get common network node for node id {} from topology {}", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID); + return null; + } + } catch (ExecutionException | TimeoutException e) { + LOG.warn("Exception while getting common network node for node id {} from {} topology", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID, e); + return null; + } catch (InterruptedException e) { + LOG.warn("Getting common network node for node id {} from {} topology was interrupted", nodeId, + NetworkUtils.OVERLAY_NETWORK_ID, e); + Thread.currentThread().interrupt(); + return null; } - return nodeOpt; - } - - private void addAvailableWL(List nodeIds, Long wavelengthNumber) { - updateFreqMaps4Nodes(nodeIds, wavelengthNumber, true); } - private void deleteAvailableWL(List nodeIds, Long wavelengthNumber) { - updateFreqMaps4Nodes(nodeIds, wavelengthNumber, false); - } - - private InstanceIdentifierBuilder createTerminationPoint1IIDBuilder(String nodeId, String tpId) { - return InstanceIdentifier - .builder(Networks.class) - .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 - .networks.network.Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1.class) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId))) - .augmentation(TerminationPoint1.class); + /** + * Set frequency map for nodes in nodeIds. + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param nodeIds List of node id + * @param used boolean true if min and max frequencies are used, false otherwise. + */ + private void setFrequencies4Nodes(BigDecimal minFrequency, BigDecimal maxFrequency, + List nodeIds, boolean used) { + updateFreqMaps4Nodes(nodeIds, minFrequency, maxFrequency, used); } - private InstanceIdentifierBuilder createTerminationPoint2IIDBuilder(String nodeId, String tpId) { - return InstanceIdentifier - .builder(Networks.class) - .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 - .networks.network.Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1.class) - .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId))) - .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1.class); - } - private Optional getTerminationPoint1FromDatastore(String nodeId, String tpId) { - InstanceIdentifier tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build(); - Optional tpOpt; + /** + * Get a network termination point for nodeId and tpId. + * @param nodeId String + * @param tpId String + * @return network termination point, null otherwise + */ + private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) { + InstanceIdentifier tpIID = OpenRoadmTopology + .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build(); try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) { - tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID) + Optional optionalTerminationPoint = readTx + .read(LogicalDatastoreType.CONFIGURATION, tpIID) .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.warn("Exception while getting termination point from {} topology!", + if (optionalTerminationPoint.isPresent()) { + return optionalTerminationPoint.get(); + } else { + return null; + } + } catch (ExecutionException | TimeoutException e) { + LOG.warn("Exception while getting termination {} for node id {} point from {} topology", tpId, nodeId, + NetworkUtils.OVERLAY_NETWORK_ID, e); + return null; + } catch (InterruptedException e) { + LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted", tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e); - tpOpt = Optional.empty(); + Thread.currentThread().interrupt(); + return null; } - return tpOpt; } - private Optional getTerminationPoint2FromDatastore(String nodeId, String tpId) { + /** + * Get a common network termination point for nodeId and tpId. + * @param nodeId String + * @param tpId String + * @return common network termination point, null otherwise + */ + private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 + getCommonNetworkTerminationPointFromDatastore(String nodeId, String tpId) { InstanceIdentifier - tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build(); - Optional tpOpt; + tpIID = OpenRoadmTopology.createCommonNetworkTerminationPointIIDBuilder(nodeId, tpId).build(); try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) { - tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID) + Optional + optionalTerminationPoint = readTx + .read(LogicalDatastoreType.CONFIGURATION, tpIID) .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.warn("Exception while getting termination point from {} topology!", - NetworkUtils.OVERLAY_NETWORK_ID, e); - tpOpt = Optional.empty(); + if (optionalTerminationPoint.isPresent()) { + return optionalTerminationPoint.get(); + } else { + LOG.error("Unable to get common-network termination point {} for node id {}from topology {}", tpId, + nodeId, NetworkUtils.OVERLAY_NETWORK_ID); + return null; + } + + } catch (ExecutionException | TimeoutException e) { + LOG.warn("Exception while getting common-network termination {} for node id {} point from {} topology", + tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e); + return null; + } catch (InterruptedException e) { + LOG.warn("Getting common-network termination {} for node id {} point from {} topology was interrupted", + tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e); + Thread.currentThread().interrupt(); + return null; } - return tpOpt; } - private void deleteUsedWL(long wavelengthIndex, List tpIds) { - WriteTransaction deleteUsedWlTx = this.dataBroker.newWriteOnlyTransaction(); + /** + * Update availFreqMapsMap for min and max frequencies for termination point in tpIds. + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param rate Uint32 + * @param modulationFormat ModulationFormat + * @param tpIds List of NodeIdPair + * @param sed boolean true if min and max frequencies are used, false otherwise. + */ + private void setFrequencies4Tps(BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, + ModulationFormat modulationFormat, List tpIds, boolean used) { + String strTpIdsList = String.join(", ", tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList())); + LOG.debug("Update frequencies for termination points {}, rate {}, modulation format {}," + + "min frequency {}, max frequency {}, used {}", strTpIdsList, rate, modulationFormat, + minFrequency, maxFrequency, used); + WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction(); for (NodeIdPair idPair : tpIds) { - Optional - tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID()); - - OpenroadmTpType tpType; - if (!tp2Opt.isPresent()) { - LOG.error("Unable to get termination point {} from topology {}! Skipping removal of used wavelength" - + " for this node.", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 + commonNetworkTerminationPoint = getCommonNetworkTerminationPointFromDatastore(idPair.getNodeID(), + idPair.getTpID()); + if (commonNetworkTerminationPoint == null) { + LOG.warn("Cannot update frequencies for termination point {}, node id {}", idPair.getTpID(), + idPair.getNodeID()); continue; } - tpType = tp2Opt.get().getTpType(); - Optional tp1Opt = - getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID()); - InstanceIdentifier.InstanceIdentifierBuilder usedWlIIDBuilder = - createTerminationPoint1IIDBuilder(idPair.getNodeID(), idPair.getTpID()); - switch (tpType) { + TerminationPoint1 networkTerminationPoint = + getNetworkTerminationPointFromDatastore(idPair.getNodeID(), idPair.getTpID()); + TerminationPoint1Builder networkTerminationPointBuilder; + if (networkTerminationPoint != null) { + networkTerminationPointBuilder = new TerminationPoint1Builder(networkTerminationPoint); + } else { + networkTerminationPointBuilder = new TerminationPoint1Builder(); + } + switch (commonNetworkTerminationPoint.getTpType()) { case DEGREETXTTP: case DEGREETXRXTTP: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(TxTtpAttributes.class).child(UsedWavelengths.class, - new UsedWavelengthsKey((int)wavelengthIndex)).build()); + networkTerminationPointBuilder.setTxTtpAttributes(updateTxTtpAttributes(networkTerminationPoint, + minFrequency,maxFrequency,used)); break; - case DEGREERXTTP: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(RxTtpAttributes.class).child(UsedWavelengths.class, - new UsedWavelengthsKey((int)wavelengthIndex)).build()); + networkTerminationPointBuilder.setRxTtpAttributes(updateRxTtpAttributes(networkTerminationPoint, + minFrequency,maxFrequency,used)); break; - case DEGREETXCTP: case DEGREERXCTP: case DEGREETXRXCTP: - if (tp1Opt.isPresent()) { - TerminationPoint1 tp1 = tp1Opt.get(); - TerminationPoint1Builder tp1Builder = new TerminationPoint1Builder(tp1); - CtpAttributesBuilder ctpAttributesBuilder; - if (tp1Builder.getCtpAttributes() != null) { - ctpAttributesBuilder = new CtpAttributesBuilder(tp1Builder.getCtpAttributes()); - Map availFreqMapsMap = tp1Builder.getCtpAttributes() - .nonnullAvailFreqMaps(); - ctpAttributesBuilder - .setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, true)); - deleteUsedWlTx.merge(LogicalDatastoreType.CONFIGURATION, - createTerminationPoint1IIDBuilder(idPair.getNodeID(), - idPair.getTpID()).build(), tp1Builder.build()); - } - } + networkTerminationPointBuilder.setCtpAttributes(updateCtpAttributes(networkTerminationPoint, + minFrequency,maxFrequency,used)); break; - case SRGTXCP: case SRGRXCP: case SRGTXRXCP: - if (tp1Opt.isPresent()) { - TerminationPoint1 tp1 = tp1Opt.get(); - TerminationPoint1Builder tp1Builder = new TerminationPoint1Builder(tp1); - CpAttributesBuilder cpAttributesBuilder; - if (tp1Builder.getCpAttributes() != null) { - cpAttributesBuilder = new CpAttributesBuilder(tp1Builder.getCpAttributes()); - Map availFreqMapsMap = tp1Builder.getCpAttributes() - .nonnullAvailFreqMaps(); - cpAttributesBuilder - .setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, true)); - deleteUsedWlTx.merge(LogicalDatastoreType.CONFIGURATION, - createTerminationPoint1IIDBuilder(idPair.getNodeID(), - idPair.getTpID()).build(), tp1Builder.build()); - } - } + networkTerminationPointBuilder.setCpAttributes(updateCpAttributes(networkTerminationPoint, + minFrequency,maxFrequency,used)); break; - case SRGTXRXPP: case SRGRXPP: case SRGTXPP: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(PpAttributes.class).child(UsedWavelength.class, - new UsedWavelengthKey((int)wavelengthIndex)).build()); + networkTerminationPointBuilder.setPpAttributes(updatePpAttributes(networkTerminationPoint, + minFrequency,maxFrequency,used)); break; - case XPONDERNETWORK: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(XpdrNetworkAttributes.class).child(Wavelength.class).build()); + networkTerminationPointBuilder.setXpdrNetworkAttributes( + updateXpdrNetworkAttributes(networkTerminationPoint, + minFrequency, maxFrequency, rate, modulationFormat, used)).build(); break; case XPONDERCLIENT: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(XpdrClientAttributes.class).child(Wavelength.class).build()); break; case XPONDERPORT: - deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, - usedWlIIDBuilder.child(XpdrPortAttributes.class).child(Wavelength.class).build()); + networkTerminationPointBuilder.setXpdrPortAttributes( + updateXpdrPortAttributes(networkTerminationPoint, + minFrequency, maxFrequency, rate, modulationFormat, used)).build(); break; - default: - break; + LOG.warn("Termination point type {} not managed", commonNetworkTerminationPoint.getTpType()); + return; } + updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION, OpenRoadmTopology + .createNetworkTerminationPointIIDBuilder(idPair.getNodeID(), + idPair.getTpID()).build(), networkTerminationPointBuilder.build()); } try { - deleteUsedWlTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - List tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList()); - LOG.error("Unable to delete used WL {} from TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e); + updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS); + } catch (ExecutionException | TimeoutException e) { + LOG.error( + "Something went wrong for frequencies update (min frequency {}, max frequency {}, used {} for TPs {}", + minFrequency, maxFrequency, used, strTpIdsList, e); + } catch (InterruptedException e) { + LOG.error("Frequencies update (min frequency {}, max frequency {}, used {} for TPs {} was interrupted", + minFrequency, maxFrequency, used, + strTpIdsList, e); + Thread.currentThread().interrupt(); } } - private void addUsedWL(long wavelengthIndex, List tpIds) { - WriteTransaction addUsedWlTx = this.dataBroker.newWriteOnlyTransaction(); - FixedFlexImpl fixedFlex = new FixedFlexImpl(wavelengthIndex); - FrequencyTHz centralTHz = new FrequencyTHz(new BigDecimal(fixedFlex.getCenterFrequency())); - Map availFreqMapsMap; - for (NodeIdPair idPair : tpIds) { - Optional tp1Opt = - getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID()); - TerminationPoint1 tp1 = null; - Optional tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID()); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 tp2; - if (!tp2Opt.isPresent()) { - LOG.error( - "Unable to get common-network termination point {} from topology {}! Skip removal of used" - + "wavelength for the node", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID); + /** + * Update availFreqMapsMap for min and max frequencies for nodes in nodeIds. + * @param nodeIds List of node id + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + */ + private void updateFreqMaps4Nodes(List nodeIds, BigDecimal minFrequency, BigDecimal maxFrequency, + boolean used) { + String strNodesList = String.join(", ", nodeIds); + LOG.debug("Update frequencies for nodes {}, min frequency {}, max frequency {}, used {}", + strNodesList, minFrequency, maxFrequency, used); + WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction(); + for (String nodeId : nodeIds) { + Node1 networkNode = getNetworkNodeFromDatastore(nodeId); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 commonNetworkNode = + getCommonNetworkNodeFromDatastore(nodeId); + if (networkNode == null || commonNetworkNode == null) { + LOG.warn( + "From topology {} for node id {} -> Get common-network : {} " + + "Get network-topology : {}. Skipping frequencies update for this node.", + NetworkUtils.OVERLAY_NETWORK_ID, nodeId, commonNetworkNode, networkNode); continue; } - tp2 = tp2Opt.get(); - TerminationPoint1Builder tp1Builder; - if (tp1Opt.isPresent()) { - tp1 = tp1Opt.get(); - tp1Builder = new TerminationPoint1Builder(tp1); - } else { - tp1Builder = new TerminationPoint1Builder(); + Node1Builder networkNodeBuilder = new Node1Builder(networkNode); + switch (commonNetworkNode.getNodeType()) { + case DEGREE: + networkNodeBuilder.setDegreeAttributes( + updateDegreeAttributes(networkNode.getDegreeAttributes(), minFrequency, + maxFrequency, used)); + break; + case SRG: + networkNodeBuilder.setSrgAttributes( + updateSrgAttributes(networkNode.getSrgAttributes(), minFrequency, maxFrequency, used)); + break; + default: + LOG.warn("Node type not managed {}", commonNetworkNode.getNodeType()); + break; } + updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION, + OpenRoadmTopology.createNetworkNodeIID(nodeId), networkNodeBuilder.build()); + } + try { + updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS); + } catch (ExecutionException | TimeoutException e) { + LOG.error("Cannot update frequencies {} {} for nodes {}", minFrequency, maxFrequency, + strNodesList, e); + } catch (InterruptedException e) { + LOG.error("Update of frequencies {} {} for nodes {} was interrupted", minFrequency, maxFrequency, + strNodesList, e); + Thread.currentThread().interrupt(); + } + } - UsedWavelengths usedWaveLength = new UsedWavelengthsBuilder() - .setIndex((int)wavelengthIndex) - .setFrequency(centralTHz) - .setWidth(FrequencyGHz.getDefaultInstance("40")) - .build(); - switch (tp2.getTpType()) { - case DEGREETXTTP: - case DEGREETXRXTTP: - TxTtpAttributes txTtpAttributes = null; - Map usedDegreeTxTtpWls; - if (tp1 != null) { - txTtpAttributes = tp1.getTxTtpAttributes(); + /** + * Get list of NodeIdPair from atoZDirection. + * @param atoZDirection AToZDirection + * @return List of NodeIdPair + */ + private List getAToZTpList(AToZDirection atoZDirection) { + Collection atozList = atoZDirection.nonnullAToZ().values(); + return atozList.stream() + .filter(aToZ -> { + if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) { + LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId()); + return false; } - TxTtpAttributesBuilder txTtpAttributesBuilder; - usedDegreeTxTtpWls = new HashMap<>(); - if (txTtpAttributes == null) { - txTtpAttributesBuilder = new TxTtpAttributesBuilder(); - } else { - txTtpAttributesBuilder = new TxTtpAttributesBuilder(txTtpAttributes); - usedDegreeTxTtpWls.putAll(txTtpAttributesBuilder.getUsedWavelengths()); + return aToZ.getResource().getResource() instanceof TerminationPoint; + }).map(aToZ -> { + TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource(); + if ((tp == null) || (tp.getTpNodeId() == null) || (tp.getTpId() == null) + || tp.getTpId().isEmpty()) { + LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId()); + return null; } - usedDegreeTxTtpWls.put(usedWaveLength.key(),usedWaveLength); - txTtpAttributesBuilder.setUsedWavelengths(usedDegreeTxTtpWls); - tp1Builder.setTxTtpAttributes(txTtpAttributesBuilder.build()); - break; + return new NodeIdPair(tp.getTpNodeId(), tp.getTpId()); + }).filter(Objects::nonNull) + .collect(Collectors.toList()); + } - case DEGREERXTTP: - RxTtpAttributes rxTtpAttributes = null; - Map usedDegreeRxTtpWls; - if (tp1 != null) { - rxTtpAttributes = tp1.getRxTtpAttributes(); + /** + * Get list of NodeIdPair from ztoADirection. + * @param ztoADirection ZToADirection + * @return List of NodeIdPair + */ + private List getZToATpList(ZToADirection ztoADirection) { + Collection ztoaList = ztoADirection.nonnullZToA().values(); + return ztoaList.stream() + .filter(zToA -> { + if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) { + LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId()); + return false; } - RxTtpAttributesBuilder rxTtpAttributesBuilder; - usedDegreeRxTtpWls = new HashMap<>(); - if (rxTtpAttributes == null) { - rxTtpAttributesBuilder = new RxTtpAttributesBuilder(); - } else { - rxTtpAttributesBuilder = new RxTtpAttributesBuilder(rxTtpAttributes); - usedDegreeRxTtpWls.putAll(rxTtpAttributesBuilder.getUsedWavelengths()); + return zToA.getResource().getResource() instanceof TerminationPoint; + }).map(zToA -> { + TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource(); + if ((tp == null) || (tp.getTpNodeId() == null) || (tp.getTpId() == null) + || tp.getTpId().isEmpty()) { + LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId()); + return null; } - usedDegreeRxTtpWls.put(usedWaveLength.key(),usedWaveLength); - rxTtpAttributesBuilder.setUsedWavelengths(usedDegreeRxTtpWls); - tp1Builder.setRxTtpAttributes(rxTtpAttributesBuilder.build()); - break; + return new NodeIdPair(tp.getTpNodeId(), tp.getTpId()); + }).filter(Objects::nonNull) + .collect(Collectors.toList()); + } - case DEGREETXCTP: - case DEGREERXCTP: - case DEGREETXRXCTP: - CtpAttributes ctpAttributes = null; - if (tp1 != null) { - ctpAttributes = tp1.getCtpAttributes(); - } - CtpAttributesBuilder ctpAttributesBuilder; - if (ctpAttributes == null) { - ctpAttributesBuilder = new CtpAttributesBuilder(); - } else { - ctpAttributesBuilder = new CtpAttributesBuilder(ctpAttributes); - } - availFreqMapsMap = ctpAttributesBuilder.getAvailFreqMaps(); - ctpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, false)); - tp1Builder.setCtpAttributes(ctpAttributesBuilder.build()); - break; + /** + * Update Wavelength for xpdr port attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param rate Uint32 + * @param modulationFormat ModulationFormat + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return XpdrPortAttributes with Wavelength updated + */ + private XpdrPortAttributes updateXpdrPortAttributes(TerminationPoint1 networkTerminationPoint, + BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat, + boolean used) { + LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + XpdrPortAttributesBuilder xpdrPortAttributesBuilder; + if (networkTerminationPoint != null) { + xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(networkTerminationPoint.getXpdrPortAttributes()); + } else { + xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(); + } + WavelengthBuilder waveLengthBuilder = new WavelengthBuilder(); + if (used) { + waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat)) + .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency)); + } + return xpdrPortAttributesBuilder.setWavelength(waveLengthBuilder.build()).build(); + } - case SRGTXCP: - case SRGRXCP: - case SRGTXRXCP: - CpAttributes cpAttributes = null; - if (tp1 != null) { - cpAttributes = tp1.getCpAttributes(); - } - CpAttributesBuilder cpAttributesBuilder; - if (cpAttributes == null) { - cpAttributesBuilder = new CpAttributesBuilder(); - } else { - cpAttributesBuilder = new CpAttributesBuilder(cpAttributes); - } - availFreqMapsMap = cpAttributesBuilder.getAvailFreqMaps(); - cpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, false)); - tp1Builder.setCpAttributes(cpAttributesBuilder.build()); - break; + /** + * Update Wavelength for xpdr network attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param rate Uint32 + * @param modulationFormat ModulationFormat + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return XpdrNetworkAttributes with Wavelength updated + */ + private XpdrNetworkAttributes updateXpdrNetworkAttributes(TerminationPoint1 networkTerminationPoint, + BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat, + boolean used) { + LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder; + if (networkTerminationPoint != null) { + xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder( + networkTerminationPoint.getXpdrNetworkAttributes()); + } else { + xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(); + } + WavelengthBuilder waveLengthBuilder = new WavelengthBuilder(); + if (used) { + waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat)) + .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency)); + } + return xpdrNetworkAttributesBuilder.setWavelength(waveLengthBuilder.build()).build(); + } - case SRGTXRXPP: - case SRGRXPP: - case SRGTXPP: - PpAttributes ppAttributes = null; - Map usedDegreePpWls; - if (tp1 != null) { - ppAttributes = tp1.getPpAttributes(); - } - PpAttributesBuilder ppAttributesBuilder; - usedDegreePpWls = new HashMap<>(); - if (ppAttributes == null) { - ppAttributesBuilder = new PpAttributesBuilder(); - } else { - ppAttributesBuilder = new PpAttributesBuilder(ppAttributes); - usedDegreePpWls.putAll(ppAttributesBuilder.getUsedWavelength()); - } - UsedWavelength usedDegreeWaveLength = new UsedWavelengthBuilder() - .setIndex((int)wavelengthIndex) - .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build(); - usedDegreePpWls.put(usedDegreeWaveLength.key(),usedDegreeWaveLength); - ppAttributesBuilder.setUsedWavelength(usedDegreePpWls); - tp1Builder.setPpAttributes(ppAttributesBuilder.build()); - break; + /** + * Update freqMaps for pp attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return PpAttributes with frequency map updated + */ + private PpAttributes updatePpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + LOG.debug("Update pp attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + PpAttributesBuilder ppAttributesBuilder; + if (networkTerminationPoint != null) { + ppAttributesBuilder = new PpAttributesBuilder(networkTerminationPoint.getPpAttributes()); + } else { + ppAttributesBuilder = new PpAttributesBuilder(); + } + Map availFreqMapsMap = ppAttributesBuilder.getAvailFreqMaps(); + return ppAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)) + .build(); + } - case XPONDERNETWORK: - XpdrNetworkAttributes xpdrNetworkAttributes = null; - if (tp1 != null) { - xpdrNetworkAttributes = tp1.getXpdrNetworkAttributes(); - } - XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder; - if (xpdrNetworkAttributes == null) { - xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(); - } else { - xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(xpdrNetworkAttributes); - } - Wavelength usedXpdrNetworkWl = new WavelengthBuilder() - .setWidth(FrequencyGHz.getDefaultInstance("40")).setFrequency(centralTHz).build(); - tp1Builder.setXpdrNetworkAttributes(xpdrNetworkAttributesBuilder.setWavelength(usedXpdrNetworkWl) - .build()); - break; - case XPONDERCLIENT: - break; - case XPONDERPORT: - XpdrPortAttributes xpdrPortAttributes = null; - if (tp1 != null) { - xpdrPortAttributes = tp1.getXpdrPortAttributes(); - } - XpdrPortAttributesBuilder xpdrPortAttributesBuilder; - if (xpdrPortAttributes == null) { - xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(); - } else { - xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(xpdrPortAttributes); - } - Wavelength usedXpdrPortWl = new WavelengthBuilder().setWidth(FrequencyGHz.getDefaultInstance("40")) - .setFrequency(centralTHz).build(); - tp1Builder.setXpdrPortAttributes(xpdrPortAttributesBuilder.setWavelength(usedXpdrPortWl) - .build()); - break; + /** + * Update freqMaps for cp attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return CpAttributes with frequency map updated + */ + private CpAttributes updateCpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + LOG.debug("Update cp attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + CpAttributesBuilder cpAttributesBuilder; + if (networkTerminationPoint != null) { + cpAttributesBuilder = new CpAttributesBuilder(networkTerminationPoint.getCpAttributes()); + } else { + cpAttributesBuilder = new CpAttributesBuilder(); + } + Map availFreqMapsMap = cpAttributesBuilder.getAvailFreqMaps(); + return cpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)) + .build(); + } - default: - // TODO skip for now - continue; - } - addUsedWlTx.put(LogicalDatastoreType.CONFIGURATION, createTerminationPoint1IIDBuilder(idPair.getNodeID(), - idPair.getTpID()).build(), tp1Builder.build()); + /** + * Update freqMaps for ctp attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return CtpAttributes with frequency map updated + */ + private CtpAttributes updateCtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + LOG.debug("Update ctp attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + CtpAttributesBuilder ctpAttributesBuilder; + if (networkTerminationPoint != null) { + ctpAttributesBuilder = new CtpAttributesBuilder(networkTerminationPoint.getCtpAttributes()); + } else { + ctpAttributesBuilder = new CtpAttributesBuilder(); } - try { - addUsedWlTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - List tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList()); - LOG.error("Unable to add used WL {} for TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e); + Map availFreqMapsMap = ctpAttributesBuilder.getAvailFreqMaps(); + return ctpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)) + .build(); + } + + /** + * Update freqMaps for rxtp attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return RxTtpAttributes with frequency map updated + */ + private RxTtpAttributes updateRxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + LOG.debug("Update rx attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + RxTtpAttributesBuilder rxTtpAttributesBuilder; + if (networkTerminationPoint != null) { + rxTtpAttributesBuilder = new RxTtpAttributesBuilder(networkTerminationPoint.getRxTtpAttributes()); + } else { + rxTtpAttributesBuilder = new RxTtpAttributesBuilder(); + } + Map availFreqMapsMap = rxTtpAttributesBuilder.getAvailFreqMaps(); + return rxTtpAttributesBuilder + .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build(); + } + + /** + * Update freqMaps for txtp attributes. + * @param networkTerminationPoint TerminationPoint1 + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return TxTtpAttributes with frequency map updated + */ + private TxTtpAttributes updateTxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + LOG.debug("Update tx attributes for termination point {}, min frequency {}, max frequency {}, used {}", + networkTerminationPoint, minFrequency, maxFrequency, used); + TxTtpAttributesBuilder txTtpAttributesBuilder; + if (networkTerminationPoint != null) { + txTtpAttributesBuilder = new TxTtpAttributesBuilder(networkTerminationPoint.getTxTtpAttributes()); + } else { + txTtpAttributesBuilder = new TxTtpAttributesBuilder(); } + Map availFreqMapsMap = txTtpAttributesBuilder.getAvailFreqMaps(); + return txTtpAttributesBuilder + .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build(); } /** - * Update availFreqMapsMap for wavelengthNumber for nodes in nodeIds. - * @param nodeIds List of node id. - * @param wavelengthNumber Long - * @param isSlotAvailable boolean true if waveLength is available, false otherwise. + * Update freqMaps for srg attributes of srgAttributes. + * @param srgAttributes SrgAttributes + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return SrgAttributes with frequency map updated */ - //TODO: reduce its Cognitive Complexity from 21 to the 15 - private void updateFreqMaps4Nodes(List nodeIds, Long wavelengthNumber, boolean isSlotAvailable) { - WriteTransaction nodeWriteTx = this.dataBroker.newWriteOnlyTransaction(); + private SrgAttributes updateSrgAttributes(SrgAttributes srgAttributes, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { Map availFreqMapsMap; - String action = isSlotAvailable ? "addition" : "deletion"; - for (String nodeId : nodeIds) { - Optional node1Opt = getNode1FromDatastore(nodeId); - Optional node2Opt = getNode2FromDatastore(nodeId); - if (!node1Opt.isPresent() || !node2Opt.isPresent()) { - LOG.error( - "From topology {} for node id {} -> Get common-network : {} ! " - + "Get network-topology : {} ! Skipping {} of available wavelength for this node.", - NetworkUtils.OVERLAY_NETWORK_ID, nodeId, node1Opt.isPresent(), node2Opt.isPresent(), action); - continue; - } - Node1 node1 = node1Opt.get(); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2 = node2Opt.get(); - Node1Builder node1Builder = new Node1Builder(node1); - switch (node2.getNodeType()) { - case DEGREE: - DegreeAttributes degreeAttributes = node1.getDegreeAttributes(); - DegreeAttributesBuilder degreeAttributesBuilder = degreeAttributes == null - ? new DegreeAttributesBuilder() : new DegreeAttributesBuilder(degreeAttributes); - availFreqMapsMap = degreeAttributesBuilder.getAvailFreqMaps(); - degreeAttributesBuilder - .setAvailFreqMaps(updateFreqMaps(wavelengthNumber, availFreqMapsMap, isSlotAvailable)); - node1Builder.setDegreeAttributes(degreeAttributesBuilder.build()); - break; - case SRG: - SrgAttributes srgAttributes = node1.getSrgAttributes(); - SrgAttributesBuilder srgAttributesBuilder = srgAttributes == null - ? new SrgAttributesBuilder() : new SrgAttributesBuilder(srgAttributes); - availFreqMapsMap = srgAttributesBuilder.getAvailFreqMaps(); - srgAttributesBuilder - .setAvailFreqMaps(updateFreqMaps(wavelengthNumber, availFreqMapsMap, isSlotAvailable)); - node1Builder.setSrgAttributes(srgAttributesBuilder.build()); - break; - default: - LOG.warn("Node type not managed {}", node2.getNodeType()); - break; - } - nodeWriteTx.put(LogicalDatastoreType.CONFIGURATION, createNode1IID(nodeId), node1Builder.build()); + SrgAttributesBuilder srgAttributesBuilder; + if (srgAttributes == null) { + srgAttributesBuilder = new SrgAttributesBuilder(); + } else { + srgAttributesBuilder = new SrgAttributesBuilder(srgAttributes); } - try { - nodeWriteTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS); - } catch (ExecutionException | TimeoutException e) { - LOG.error("Cannot perform {} WL {} for nodes {}!", action, wavelengthNumber, String.join(", ", nodeIds), e); - } catch (InterruptedException e) { - LOG.error("{} interrupted WL {} for nodes {}!", action, wavelengthNumber, String.join(", ", nodeIds), e); - Thread.currentThread().interrupt(); + availFreqMapsMap = srgAttributesBuilder.getAvailFreqMaps(); + return srgAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)) + .build(); + } + + /** + * Update freqMaps for degree attributes of degreeAttributes. + * @param degreeAttributes DegreeAttributes + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @param used boolean true if min and max frequencies are used, false otherwise. + * @return DegreeAttributes with frequency map updated + */ + private DegreeAttributes updateDegreeAttributes(DegreeAttributes degreeAttributes, BigDecimal minFrequency, + BigDecimal maxFrequency, boolean used) { + Map availFreqMapsMap; + DegreeAttributesBuilder degreeAttributesBuilder; + if (degreeAttributes == null) { + degreeAttributesBuilder = new DegreeAttributesBuilder(); + } else { + degreeAttributesBuilder = new DegreeAttributesBuilder(degreeAttributes); } + availFreqMapsMap = degreeAttributesBuilder.getAvailFreqMaps(); + return degreeAttributesBuilder + .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build(); } /** - * Update availFreqMapsMap for wavelengthNumber. - * @param wavelengthNumber Long + * Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps. + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal * @param availFreqMapsMap Map - * @param isSlotAvailable boolean - * @return availFreqMapsMap updated for wavelengthNumber. + * @param used boolean + * @return updated Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps. */ - private Map updateFreqMaps(Long wavelengthNumber, - Map availFreqMapsMap, boolean isSlotAvailable) { - byte slotValue = isSlotAvailable ? (byte)GridConstant.AVAILABLE_SLOT_VALUE : (byte)GridConstant.USED_SLOT_VALUE; + private Map updateFreqMaps(BigDecimal minFrequency, BigDecimal maxFrequency, + Map availFreqMapsMap, boolean used) { + int beginIndex = GridUtils.getIndexFromFrequency(minFrequency); + int endIndex = GridUtils.getIndexFromFrequency(maxFrequency); if (availFreqMapsMap == null) { availFreqMapsMap = GridUtils.initFreqMaps4FixedGrid2Available(); } AvailFreqMaps availFreqMaps = availFreqMapsMap.get(availFreqMapKey); if (availFreqMaps != null && availFreqMaps.getFreqMap() != null) { - int intWlNumber = wavelengthNumber.intValue(); - if (intWlNumber > 0 && intWlNumber <= availFreqMaps.getFreqMap().length) { - availFreqMaps.getFreqMap()[intWlNumber - 1] = slotValue; - } + BitSet bitSetFreq = BitSet.valueOf(availFreqMaps.getFreqMap()); + LOG.debug( + "Update frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}", + beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq); + //if used = true then bit must be set to false to indicate the slot is no more available + bitSetFreq.set(beginIndex, endIndex, !used); + LOG.debug( + "Updated frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}", + beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq); + Map updatedFreqMaps = new HashMap<>(); + byte[] frequenciesByteArray = bitSetFreq.toByteArray(); + AvailFreqMaps updatedAvailFreqMaps = new AvailFreqMapsBuilder(availFreqMaps) + .setFreqMap(Arrays.copyOf(frequenciesByteArray,GridConstant.NB_OCTECTS)) + .build(); + updatedFreqMaps.put(availFreqMaps.key(), updatedAvailFreqMaps); + return updatedFreqMaps; } return availFreqMapsMap; } -} +} \ No newline at end of file