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;
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;
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;
}
@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<NodeIdPair> 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<NodeIdPair> 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<NodeIdPair> 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<ModulationFormat> 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<NodeIdPair> 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<ModulationFormat> 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<NodeIdPair> getAToZTpList(AToZDirection atoZDirection) {
- Collection<AToZ> 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<NodeIdPair> getZToATpList(ZToADirection ztoADirection) {
- Collection<ZToA> 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<Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
- .Node1> 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<Node1> getNode1FromDatastore(String nodeId) {
- InstanceIdentifier<Node1>
- nodeIID = createNode1IID(nodeId);
- Optional<Node1> nodeOpt;
+ /**
+ * Get network node with nodeId from datastore.
+ * @param nodeId String
+ * @return Node1, null otherwise.
+ */
+ private Node1 getNetworkNodeFromDatastore(String nodeId) {
+ InstanceIdentifier<Node1> nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId);
try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
- nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
+ Optional<Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
- .Node1> getNode2FromDatastore(String nodeId) {
- InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1>
- nodeIID = createNode2IID(nodeId);
- Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> nodeIID =
+ OpenRoadmTopology.createCommonNetworkNodeIID(nodeId);
try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
- nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
+ Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> 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<String> nodeIds, Long wavelengthNumber) {
- updateFreqMaps4Nodes(nodeIds, wavelengthNumber, true);
}
- private void deleteAvailableWL(List<String> nodeIds, Long wavelengthNumber) {
- updateFreqMaps4Nodes(nodeIds, wavelengthNumber, false);
- }
-
- private InstanceIdentifierBuilder<TerminationPoint1> 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<String> nodeIds, boolean used) {
+ updateFreqMaps4Nodes(nodeIds, minFrequency, maxFrequency, used);
}
- private InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
- .TerminationPoint1> 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<TerminationPoint1> getTerminationPoint1FromDatastore(String nodeId, String tpId) {
- InstanceIdentifier<TerminationPoint1> tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build();
- Optional<TerminationPoint1> 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<TerminationPoint1> tpIID = OpenRoadmTopology
+ .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
- tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
+ Optional<TerminationPoint1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
- .TerminationPoint1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
- tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build();
- Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1> tpOpt;
+ tpIID = OpenRoadmTopology.createCommonNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
- tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
+ Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
+ 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<NodeIdPair> 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<NodeIdPair> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
- 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<TerminationPoint1> tp1Opt =
- getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID());
- InstanceIdentifier.InstanceIdentifierBuilder<TerminationPoint1> 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<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> 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<String> 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<NodeIdPair> tpIds) {
- WriteTransaction addUsedWlTx = this.dataBroker.newWriteOnlyTransaction();
- FixedFlexImpl fixedFlex = new FixedFlexImpl(wavelengthIndex);
- FrequencyTHz centralTHz = new FrequencyTHz(new BigDecimal(fixedFlex.getCenterFrequency()));
- Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
- for (NodeIdPair idPair : tpIds) {
- Optional<TerminationPoint1> tp1Opt =
- getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID());
- TerminationPoint1 tp1 = null;
- Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
- .TerminationPoint1> 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<String> 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<UsedWavelengthsKey,UsedWavelengths> usedDegreeTxTtpWls;
- if (tp1 != null) {
- txTtpAttributes = tp1.getTxTtpAttributes();
+ /**
+ * Get list of NodeIdPair from atoZDirection.
+ * @param atoZDirection AToZDirection
+ * @return List of NodeIdPair
+ */
+ private List<NodeIdPair> getAToZTpList(AToZDirection atoZDirection) {
+ Collection<AToZ> 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<UsedWavelengthsKey,UsedWavelengths> usedDegreeRxTtpWls;
- if (tp1 != null) {
- rxTtpAttributes = tp1.getRxTtpAttributes();
+ /**
+ * Get list of NodeIdPair from ztoADirection.
+ * @param ztoADirection ZToADirection
+ * @return List of NodeIdPair
+ */
+ private List<NodeIdPair> getZToATpList(ZToADirection ztoADirection) {
+ Collection<ZToA> 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<UsedWavelengthKey, UsedWavelength> 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<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> 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<String> tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList());
- LOG.error("Unable to add used WL {} for TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e);
+ Map<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> 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<String> nodeIds, Long wavelengthNumber, boolean isSlotAvailable) {
- WriteTransaction nodeWriteTx = this.dataBroker.newWriteOnlyTransaction();
+ private SrgAttributes updateSrgAttributes(SrgAttributes srgAttributes, BigDecimal minFrequency,
+ BigDecimal maxFrequency, boolean used) {
Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
- String action = isSlotAvailable ? "addition" : "deletion";
- for (String nodeId : nodeIds) {
- Optional<Node1> node1Opt = getNode1FromDatastore(nodeId);
- Optional<org.opendaylight.yang.gen.v1
- .http.org.openroadm.common.network.rev200529.Node1> 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<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(Long wavelengthNumber,
- Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap, boolean isSlotAvailable) {
- byte slotValue = isSlotAvailable ? (byte)GridConstant.AVAILABLE_SLOT_VALUE : (byte)GridConstant.USED_SLOT_VALUE;
+ private Map<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(BigDecimal minFrequency, BigDecimal maxFrequency,
+ Map<AvailFreqMapsKey, AvailFreqMaps> 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<AvailFreqMapsKey, AvailFreqMaps> 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