From 7e175bf72bc28db4299b1fd76e6d01bdb0854d0f Mon Sep 17 00:00:00 2001 From: manuedelf Date: Tue, 8 Dec 2020 18:41:21 +0100 Subject: [PATCH] Flexgrid for pce and network model - add ServiceRateConstant class in common module to centralize service rate Uint32 format. - update GridConstant with maps (service type and nb slots, service rate and modulation format, service rate-modulation format and frequency width) and constant for irrelevant wavelength number. - add methods in GridUtils. - rename methods in NetworkModelWaveLengthService to be compliant with frequencies. - disable NetworkModelWaveLengthService unit tests. - move some methods from NetworkModelWaveLengthServiceImpl to OpenRoadmTopology util class in network model. - update pce with flexgrid spectrum assignment computation. - update pce unit tests. - add getBitSetData method to PceNode and remove checkWL method. - update PceNode implementations (PceOtnNode and PceOpticalNode). - rename methods in pce to be compliant with frequencies. - update some log messages to be coherent with frequencies. - add minFrequency and maxFrequency to PceResult. - update functional tests. - update topology test files set freq map value to have the smallest lambda on the higher index of the freqmap. About "disable NetworkModelWaveLengthService unit tests": some updates are needed in test-common: path-description is a grouping and is used only in notification. DataObjectConverter converts only data so to be able to Deserialize path-description from json file in unit tests, a solution could be to add a dummy yang model in test-common with container using path-description. JIRA: TRNSPRTPCE-230 Signed-off-by: manuedelf Change-Id: Ie22761e535e0669f614ac18ea801b5dac75dd362 --- .../common/ServiceRateConstant.java | 26 + .../common/fixedflex/GridConstant.java | 31 + .../common/fixedflex/GridUtils.java | 75 +- .../common/fixedflex/GridUtilsTest.java | 57 +- .../listeners/ServiceHandlerListener.java | 4 +- .../NetworkModelWavelengthService.java | 8 +- .../NetworkModelWavelengthServiceImpl.java | 1037 ++++++++-------- .../networkmodel/util/OpenRoadmTopology.java | 140 ++- ...NetworkModelWaveLengthServiceFreeTest.java | 333 ------ .../NetworkModelWaveLengthServiceUseTest.java | 290 ----- .../NetworkModelWavelengthServiceTest.java | 58 + .../util/WaveLengthServiceUtils.java | 160 --- .../src/test/resources/openroadm-topology.xml | 1055 +++++++++++++++++ .../src/test/resources/path_description.json | 225 ++++ .../transportpce/pce/PcePathDescription.java | 90 +- .../transportpce/pce/graph/PceGraph.java | 11 +- .../pce/graph/PostAlgoPathValidator.java | 116 +- .../pce/networkanalyzer/PceCalculation.java | 2 +- .../pce/networkanalyzer/PceNode.java | 9 +- .../pce/networkanalyzer/PceOpticalNode.java | 92 +- .../pce/networkanalyzer/PceOtnNode.java | 12 +- .../pce/networkanalyzer/PceResult.java | 41 +- .../transportpce/pce/graph/PceGraphTest.java | 5 - .../networkanalyzer/PceOpticalNodeTest.java | 38 +- .../pce/networkanalyzer/PceOtnNodeTest.java | 1 - .../pce/networkanalyzer/PceResultTest.java | 4 +- tests/sample_configs/NW-for-test-5-4.xml | 160 +-- tests/sample_configs/NW-simple-topology.xml | 80 +- .../gnpy/openroadmTopology.json | 38 +- .../transportpce_tests/1.2.1/test_end2end.py | 172 +-- .../transportpce_tests/2.2.1/test_end2end.py | 114 +- .../2.2.1/test_otn_end2end.py | 51 +- .../common/flexgrid_utils.py | 31 - 33 files changed, 2769 insertions(+), 1797 deletions(-) create mode 100644 common/src/main/java/org/opendaylight/transportpce/common/ServiceRateConstant.java delete mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java delete mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java create mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceTest.java delete mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java create mode 100644 networkmodel/src/test/resources/openroadm-topology.xml create mode 100644 networkmodel/src/test/resources/path_description.json delete mode 100644 tests/transportpce_tests/common/flexgrid_utils.py diff --git a/common/src/main/java/org/opendaylight/transportpce/common/ServiceRateConstant.java b/common/src/main/java/org/opendaylight/transportpce/common/ServiceRateConstant.java new file mode 100644 index 000000000..80fa03aa7 --- /dev/null +++ b/common/src/main/java/org/opendaylight/transportpce/common/ServiceRateConstant.java @@ -0,0 +1,26 @@ +/* + * Copyright © 2020 Orange, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.common; + +import org.opendaylight.yangtools.yang.common.Uint32; + +/** + * Constant class for service rate. + * + */ +public final class ServiceRateConstant { + + public static final Uint32 RATE_100 = Uint32.valueOf(100); + public static final Uint32 RATE_200 = Uint32.valueOf(200); + public static final Uint32 RATE_300 = Uint32.valueOf(300); + public static final Uint32 RATE_400 = Uint32.valueOf(400); + + private ServiceRateConstant() { + } +} diff --git a/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java b/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java index 5bff0189f..5b90e2a24 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java @@ -8,8 +8,13 @@ package org.opendaylight.transportpce.common.fixedflex; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; import java.util.Map; +import org.opendaylight.transportpce.common.ServiceRateConstant; import org.opendaylight.transportpce.common.StringConstants; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat; +import org.opendaylight.yangtools.yang.common.Uint32; /** * Constant class common to fixed grid and flex grid. @@ -27,11 +32,37 @@ public final class GridConstant { public static final double CENTRAL_FREQUENCY = 193.1; public static final int NB_SLOTS_100G = 8; public static final int NB_SLOTS_400G = 14; + /** + * Map for associate service type with nb slots. + */ public static final Map SPECTRAL_WIDTH_SLOT_NUMBER_MAP = Map.of( StringConstants.SERVICE_TYPE_100GE, NB_SLOTS_100G, StringConstants.SERVICE_TYPE_400GE, NB_SLOTS_400G, StringConstants.SERVICE_TYPE_OTU4, NB_SLOTS_100G); + /** + * Map to associate service rate to modulation format. + */ + public static final Map RATE_MODULATION_FORMAT_MAP = Map.of( + ServiceRateConstant.RATE_100, ModulationFormat.DpQpsk, + ServiceRateConstant.RATE_200, ModulationFormat.DpQpsk, + ServiceRateConstant.RATE_300, ModulationFormat.DpQam8, + ServiceRateConstant.RATE_400, ModulationFormat.DpQam16); + /** + * Map to associate service rate and modulation format to frequency width. + */ + public static final Table FREQUENCY_WIDTH_TABLE = initFrequencyWidthTable(); + + public static final long IRRELEVANT_WAVELENGTH_NUMBER = 0; private GridConstant() { } + + private static Table initFrequencyWidthTable() { + Table frequencyWidthTable = HashBasedTable.create(); + frequencyWidthTable.put(ServiceRateConstant.RATE_100, ModulationFormat.DpQpsk, "40"); + frequencyWidthTable.put(ServiceRateConstant.RATE_200, ModulationFormat.DpQpsk, "80"); + frequencyWidthTable.put(ServiceRateConstant.RATE_300, ModulationFormat.DpQam8, "80"); + frequencyWidthTable.put(ServiceRateConstant.RATE_400, ModulationFormat.DpQam16, "80"); + return frequencyWidthTable; + } } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java b/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java index a8251c983..a3d13b22b 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java @@ -14,16 +14,25 @@ import java.util.HashMap; import java.util.Map; 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.common.types.rev181019.ModulationFormat; 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.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Util class for grid. + * Thoses methods are used for pce spectrum assignment and topology update. + * They use maximal precision of BigDecimal + * For device configuration which needs precision (4 digits), dedicated methods are + * located in FixedFlex and FrexGrid classes. * */ public final class GridUtils { + private static final Logger LOG = LoggerFactory.getLogger(GridUtils.class); private GridUtils() { } @@ -43,23 +52,75 @@ public final class GridUtils { } /** - * Compute the wavelength index from Spectrum assignment stop index. + * Compute the wavelength index from Spectrum assignment begin index. * Only for fix grid and device 1.2.1. - * @param stopIndex int + * @param index int * @return the wavelength number. */ - public static long getWaveLengthIndexFromSpectrumAssigment(int stopIndex) { - return (stopIndex + 1) / GridConstant.NB_SLOTS_100G; + public static long getWaveLengthIndexFromSpectrumAssigment(int index) { + return (GridConstant.EFFECTIVE_BITS - index) / GridConstant.NB_SLOTS_100G; } /** - * Compute the frequency in TGz for the given index. + * Compute the start frequency in TGz for the given index. * @param index int - * @return the frequency in THz for the provided index. + * @return the start frequency in THz for the provided index. */ - public static BigDecimal getFrequencyFromIndex(int index) { + public static BigDecimal getStartFrequencyFromIndex(int index) { int nvalue = index - 284; return BigDecimal.valueOf(GridConstant.CENTRAL_FREQUENCY + (nvalue * GridConstant.GRANULARITY / 1000)); } + /** + * Compute the stop frequency in TGz for the given index. + * @param index int + * @return the stop frequency in THz for the provided index. + */ + public static BigDecimal getStopFrequencyFromIndex(int index) { + return getStartFrequencyFromIndex(index).add(BigDecimal.valueOf(GridConstant.GRANULARITY / 1000)); + } + + /** + * Get the bit index for the frequency. + * + * @param frequency BigDecimal + * @return the bit index of the frequency. Throw IllegalArgumentException if + * index not in range of 0 GridConstant.EFFECTIVE_BITS + */ + public static int getIndexFromFrequency(BigDecimal frequency) { + double nvalue = (frequency.doubleValue() - GridConstant.CENTRAL_FREQUENCY) * (1000 / GridConstant.GRANULARITY); + int index = (int) Math.round(nvalue + 284); + if (index < 0 || index > GridConstant.EFFECTIVE_BITS) { + throw new IllegalArgumentException("Frequency not in range " + frequency); + } + return index; + } + + /** + * Get the spectrum width for rate and modulation format. + * @param rate Uint32 + * @param modulationFormat ModulationFormat + * @return spectrum width in GHz + */ + public static FrequencyGHz getWidthFromRateAndModulationFormat(Uint32 rate, ModulationFormat modulationFormat) { + String width = GridConstant.FREQUENCY_WIDTH_TABLE.get(rate, modulationFormat); + if (width == null) { + LOG.warn("No width found for service rate {} and modulation format {}, set width to 40", rate, + modulationFormat); + width = "40"; + } + return FrequencyGHz.getDefaultInstance(width); + } + + /** + * Get central frequency of spectrum. + * @param minFrequency BigDecimal + * @param maxFrequency BigDecimal + * @return central frequency in THz + */ + public static FrequencyTHz getCentralFrequency(BigDecimal minFrequency, BigDecimal maxFrequency) { + return new FrequencyTHz(minFrequency.add(maxFrequency).divide(BigDecimal.valueOf(2))); + + } + } diff --git a/common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java b/common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java index 8e485bb19..3e7ed5835 100644 --- a/common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java +++ b/common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java @@ -15,6 +15,10 @@ import java.math.BigDecimal; import java.util.Arrays; import java.util.Map; import org.junit.Test; +import org.opendaylight.transportpce.common.ServiceRateConstant; +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.common.types.rev181019.ModulationFormat; 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.AvailFreqMapsKey; @@ -22,7 +26,7 @@ public class GridUtilsTest { @Test public void getWaveLengthIndexFromSpectrumAssigmentTest() { - assertEquals("Wavelength index should be 15", 15, GridUtils.getWaveLengthIndexFromSpectrumAssigment(119)); + assertEquals("Wavelength index should be 15", 15, GridUtils.getWaveLengthIndexFromSpectrumAssigment(647)); } @Test @@ -33,12 +37,12 @@ public class GridUtilsTest { expectedFrequencies[i] = frequency; frequency = frequency.add(BigDecimal.valueOf(0.00625)); } - assertEquals("Frequency should be 191.325", expectedFrequencies[0], - GridUtils.getFrequencyFromIndex(0)); - assertEquals("Frequency should be 193.1", expectedFrequencies[284].setScale(1), - GridUtils.getFrequencyFromIndex(284)); - assertEquals("Frequency should be 196.11875", expectedFrequencies[767], - GridUtils.getFrequencyFromIndex(767)); + assertEquals("Frequency should be 191.325", 0, expectedFrequencies[0] + .compareTo(GridUtils.getStartFrequencyFromIndex(0))); + assertEquals("Frequency should be 193.1", 0, expectedFrequencies[284] + .compareTo(GridUtils.getStartFrequencyFromIndex(284))); + assertEquals("Frequency should be 196.1188", 0, expectedFrequencies[767] + .compareTo(GridUtils.getStartFrequencyFromIndex(767))); } @Test @@ -52,4 +56,43 @@ public class GridUtilsTest { assertTrue("Should have available freq map", Arrays.equals(byteArray, availFreqMaps.get(key).getFreqMap())); } + @Test + public void getIndexFromFrequencyTest() { + assertEquals("Index should be 693", 693, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(195.65625))); + assertEquals("Index should be 0", 0, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.325))); + assertEquals("Index should be 767", 767, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(196.11875))); + assertEquals("Index should be 8", 8, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.375))); + assertEquals("Index should be 15", 15, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.41875))); + } + + @Test(expected = IllegalArgumentException.class) + public void getIndexFromFrequencyExceptionTest() { + GridUtils.getIndexFromFrequency(BigDecimal.valueOf(196.13125)); + } + + @Test(expected = IllegalArgumentException.class) + public void getIndexFromFrequencyException2Test() { + GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.31875)); + } + + @Test + public void getWidthFromRateAndModulationFormatTest() { + assertEquals("Width should be 80", FrequencyGHz.getDefaultInstance("80"), + GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_400, + ModulationFormat.DpQam16)); + } + + @Test + public void getWidthFromRateAndModulationFormatNotFoundTest() { + assertEquals("As not found width should be 40", FrequencyGHz.getDefaultInstance("40"), + GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_100, + ModulationFormat.DpQam16)); + } + + @Test + public void getCentralFrequencyTest() { + assertEquals("Central frequency should be 191.350", + new FrequencyTHz(BigDecimal.valueOf(191.35).setScale(3)), + GridUtils.getCentralFrequency(BigDecimal.valueOf(191.325), BigDecimal.valueOf(191.375))); + } } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java index a193e3dfd..5f588a09d 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java @@ -63,7 +63,7 @@ public class ServiceHandlerListener implements TransportpceServicehandlerListene private void onServiceCreation(ServiceRpcResultSh notification) { if (notification.getAToZDirection() != null || notification.getZToADirection() != null) { LOG.info("Update topology with used frequency by service {}", notification.getServiceName()); - service.useWavelengths(notification.getAToZDirection(), notification.getZToADirection()); + service.allocateFrequencies(notification.getAToZDirection(), notification.getZToADirection()); } } @@ -75,7 +75,7 @@ public class ServiceHandlerListener implements TransportpceServicehandlerListene if (notification.getAToZDirection() != null || notification.getZToADirection() != null) { LOG.info("Update topology with no more used frequency by deleted service {}", notification.getServiceName()); - service.freeWavelengths(notification.getAToZDirection(), notification.getZToADirection()); + service.releaseFrequencies(notification.getAToZDirection(), notification.getZToADirection()); } } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java index 777bfe4da..e7d42fd9c 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java @@ -13,19 +13,19 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdes public interface NetworkModelWavelengthService { /** - * Remove wavelength from available and add it to used wavelength list. + * Allocate frequency in network topology. * * @param atoZDirection AToZDirection: a to z path * @param ztoADirection ZToADirection: z to a path */ - void useWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection); + void allocateFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection); /** - * Remove wavelength from used and add it to available wavelength list. + * Release frequency in network topology. * * @param atoZDirection AToZDirection: a to z path * @param ztoADirection ZToADirection: z to a path */ - void freeWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection); + void releaseFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection); } 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 diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java index 58166cabe..7513af0d3 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java @@ -30,6 +30,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.No import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes; 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.DegreeAttributes; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributes; @@ -187,14 +188,14 @@ public final class OpenRoadmTopology { if (!isOtn) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-network-topology tp augmentations - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http - .org.openroadm.common.network.rev200529.TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1Builder(); if (m.getPortQual().equals("xpdr-network")) { ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 = - new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019 - .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); ietfTpBldr .addAugmentation(ocnTp1Bldr.build()) .addAugmentation(tpceTp1); @@ -203,8 +204,8 @@ public final class OpenRoadmTopology { } else if (m.getPortQual().equals("xpdr-client")) { ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 = - new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019 - .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); ietfTpBldr .addAugmentation(ocnTp1Bldr.build()) .addAugmentation(tpceTp1); @@ -214,10 +215,10 @@ public final class OpenRoadmTopology { } else { if (m.getPortQual().equals("xpdr-network") || m.getPortQual().equals("switch-network")) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http - .org.openroadm.common.network.rev200529.TerminationPoint1Builder() - .setTpType(OpenroadmTpType.XPONDERNETWORK); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.XPONDERNETWORK); ietfTpBldr .addAugmentation(ocnTp1Bldr.build()); TerminationPoint ietfTp = ietfTpBldr.build(); @@ -226,10 +227,9 @@ public final class OpenRoadmTopology { } } // Create ietf node augmentation to support ietf tp-list - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology - .rev180226.Node1Builder() - .setTerminationPoint(tpMap); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder + ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder().setTerminationPoint(tpMap); ietfNodeBldr.addAugmentation(ietfNode1.build()); return ietfNodeBldr; } @@ -241,9 +241,9 @@ public final class OpenRoadmTopology { for (Mapping m : degListMap) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-common-network tp type augmentations - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http - .org.openroadm.common.network.rev200529.TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + .TerminationPoint1Builder(); switch (m.getPortDirection()) { case "bidirectional": ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); @@ -275,10 +275,9 @@ public final class OpenRoadmTopology { .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()) .build(); // Create ietf node augmentation to support ietf tp-list - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology - .rev180226.Node1Builder() - .setTerminationPoint(tpMap); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder + ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder().setTerminationPoint(tpMap); // set node-id String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); Node1 ontNode1 = new Node1Builder().setDegreeAttributes(degAtt).build(); @@ -340,10 +339,9 @@ public final class OpenRoadmTopology { .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build(); Node1 ontNode1 = new Node1Builder().setSrgAttributes(srgAttr).build(); // Create ietf node augmentation to support ietf tp-list - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology - .rev180226.Node1Builder() - .setTerminationPoint(tpMap); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder + ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder().setTerminationPoint(tpMap); // Create ietf node setting supporting-node data String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); return createTopoLayerNode(nodeId, clli) @@ -405,14 +403,19 @@ public final class OpenRoadmTopology { srcNode = nodes.get(i).getNodeId().getValue(); destNode = nodes.get(j).getNodeId().getValue(); // A to Z direction - srcTp = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf - .network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().stream() - .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) - .findFirst().get().getTpId().getValue(); - destTp = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf - .network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().stream() - .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) - .findFirst().get().getTpId().getValue(); + srcTp = nodes.get(i).augmentation( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class).nonnullTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") + || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().getTpId().getValue(); + destTp = nodes.get(j) + .augmentation(org.opendaylight.yang + .gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class).nonnullTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") + || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().getTpId().getValue(); Link1Builder ocnAzLinkBldr = new Link1Builder(); int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http .org.openroadm.common.network.rev200529.Node1.class).getNodeType().getIntValue(); @@ -499,4 +502,73 @@ public final class OpenRoadmTopology { } } + /** + * Get a builder for instance identifier related to common network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createCommonNetworkTerminationPointIIDBuilder(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); + } + + /** + * Get a builder for instance identifier related to network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createNetworkTerminationPointIIDBuilder(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); + } + + /** + * Get an instance identifier related to network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createNetworkNodeIID(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(); + } + + /** + * Get an instance identifier related to common network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createCommonNetworkNodeIID(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(); + } } diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java deleted file mode 100644 index 0532354fd..000000000 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.transportpce.networkmodel.service; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.opendaylight.transportpce.common.StringConstants; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; -import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl; -import org.opendaylight.transportpce.common.fixedflex.FixedFlexImpl; -import org.opendaylight.transportpce.common.fixedflex.GridConstant; -import org.opendaylight.transportpce.networkmodel.util.WaveLengthServiceUtils; -import org.opendaylight.transportpce.networkmodel.util.test.PathDescriptionUtils; -import org.opendaylight.transportpce.test.AbstractTest; -import org.opendaylight.transportpce.test.stub.MountPointServiceStub; -import org.opendaylight.transportpce.test.stub.MountPointStub; -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.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.TerminationPoint1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.CpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.CtpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.PpAttributesBuilder; -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.TxTtpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrClientAttributesBuilder; -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.XpdrPortAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; -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.WavelengthBuilder; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.PathDescription; -import org.opendaylight.yangtools.yang.common.Uint16; - -@Ignore -@RunWith(Parameterized.class) -public class NetworkModelWaveLengthServiceFreeTest extends AbstractTest { - private static final long WAVE_LENGTH = 20L; - private NetworkModelWavelengthService networkModelWavelengthService; - private DeviceTransactionManager deviceTransactionManager; - private TerminationPoint1 terminationPoint1; - private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1 terminationPoint2; - private PathDescription pathDescription; - private Node1 node1; - private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2; - private final AvailFreqMapsKey freqMapKey = new AvailFreqMapsKey(GridConstant.C_BAND); - - public NetworkModelWaveLengthServiceFreeTest(PathDescription pathDescription, TerminationPoint1 terminationPoint1, - Node1 node1, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 terminationPoint2, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2) { - - this.pathDescription = pathDescription; - this.terminationPoint1 = terminationPoint1; - this.terminationPoint2 = terminationPoint2; - this.node1 = node1; - this.node2 = node2; - - } - - @Parameterized.Parameters - public static Collection createParameters() { - List parameters = new ArrayList<>(); - - PathDescription pathDescription = - PathDescriptionUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); - - FixedFlexImpl fixedFlex = new FixedFlexImpl(); - fixedFlex = fixedFlex.getFixedFlexWaveMapping(WAVE_LENGTH); - - byte[] byteArray = new byte[GridConstant.NB_OCTECTS]; - Arrays.fill(byteArray, (byte) GridConstant.USED_SLOT_VALUE); - byteArray[19] = (byte) GridConstant.AVAILABLE_SLOT_VALUE; - Map waveMap = new HashMap<>(); - AvailFreqMaps availFreqMaps = new AvailFreqMapsBuilder().setMapName(GridConstant.C_BAND) - .setFreqMapGranularity(new FrequencyGHz(BigDecimal.valueOf(GridConstant.GRANULARITY))) - .setStartEdgeFreq(new FrequencyTHz(BigDecimal.valueOf(GridConstant.START_EDGE_FREQUENCY))) - .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS)) - .setFreqMap(byteArray) - .build(); - waveMap.put(availFreqMaps.key(), availFreqMaps); - FrequencyGHz frequencyGHz = new FrequencyGHz(BigDecimal.valueOf(fixedFlex.getWavelength())); - FrequencyTHz frequencyTHz = new FrequencyTHz(BigDecimal.valueOf(fixedFlex.getCenterFrequency())); - TerminationPoint1Builder terminationPoint1Builder = new TerminationPoint1Builder() - .setCtpAttributes((new CtpAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setCpAttributes((new CpAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setTxTtpAttributes((new TxTtpAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setRxTtpAttributes((new RxTtpAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setPpAttributes((new PpAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setXpdrClientAttributes((new XpdrClientAttributesBuilder()) - .setWavelength((new WavelengthBuilder()) - .setFrequency(frequencyTHz) - .setWidth(frequencyGHz) - .build()) - .build()) - .setXpdrNetworkAttributes((new XpdrNetworkAttributesBuilder()) - .setWavelength((new WavelengthBuilder()) - .setFrequency(frequencyTHz) - .setWidth(frequencyGHz) - .build()) - .build()) - .setXpdrPortAttributes((new XpdrPortAttributesBuilder()) - .setWavelength((new WavelengthBuilder()) - .setFrequency(frequencyTHz) - .setWidth(frequencyGHz) - .build()) - .build()); - - Node1Builder node1Builder = new Node1Builder() - .setDegreeAttributes((new DegreeAttributesBuilder()).setAvailFreqMaps(Map.of()).build()) - .setSrgAttributes((new SrgAttributesBuilder()).setAvailFreqMaps(Map.of()).build()); - - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder - terminationPoint2Builder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder(); - - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder node2Builder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder(); - - for (OpenroadmNodeType nodeType : Arrays.asList(OpenroadmNodeType.XPONDER, OpenroadmNodeType.DEGREE, - OpenroadmNodeType.SRG)) { - node2Builder.setNodeType(nodeType); - terminationPoint2Builder.setTpType(OpenroadmTpType.DEGREETXTTP); - parameters.add(new Object[] { pathDescription, terminationPoint1Builder.build(), node1Builder.build(), - terminationPoint2Builder.build(), node2Builder.build() }); - } - - for (OpenroadmTpType tpType : OpenroadmTpType.values()) { - node2Builder.setNodeType(OpenroadmNodeType.DEGREE); - node1Builder.setDegreeAttributes(null); - terminationPoint2Builder.setTpType(tpType); - parameters.add(new Object[] { pathDescription, terminationPoint1Builder.build(), node1Builder.build(), - terminationPoint2Builder.build(), node2Builder.build() }); - } - - node2Builder.setNodeType(OpenroadmNodeType.SRG); - node1Builder.setDegreeAttributes((new DegreeAttributesBuilder()).setAvailFreqMaps(Map.of()).build()) - .setSrgAttributes(null); - terminationPoint2Builder.setTpType(OpenroadmTpType.DEGREETXTTP); - parameters.add(new Object[] { pathDescription, terminationPoint1Builder.build(), node1Builder.build(), - terminationPoint2Builder.build(), node2Builder.build() }); - return parameters; - } - - @Before - public void setMountPoint() { - MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(getDataBroker())); - this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000); - networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); - } - - @Test - public void freeWavelengthsTest() throws ExecutionException, InterruptedException { - WaveLengthServiceUtils.putTerminationPoint1ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminationPoint1, this.deviceTransactionManager); - WaveLengthServiceUtils.putTerminationPoint2ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminationPoint2); - WaveLengthServiceUtils.putNode1ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node1, - this.deviceTransactionManager); - WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2); - this.networkModelWavelengthService.freeWavelengths(this.pathDescription.getAToZDirection(), - this.pathDescription.getZToADirection()); - Node1 updatedNode1 = WaveLengthServiceUtils.getNode1FromDatastore("node1" + StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 updatedNode2 = - WaveLengthServiceUtils.getNode2FromDatastore("node1" + StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - TerminationPoint1 updatedTerminationPoint1 = - WaveLengthServiceUtils.getTerminationPoint1FromDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.deviceTransactionManager); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1 updatedTerminationPoint2 = WaveLengthServiceUtils - .getTerminationPoint2FromDatastore("node1" + StringConstants.TTP_TOKEN, StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - switch (updatedTerminationPoint2.getTpType()) { - case DEGREETXRXCTP: - case DEGREETXCTP: - case DEGREERXCTP: - Assert.assertNull(updatedTerminationPoint1.getCtpAttributes()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case SRGTXCP: - case SRGRXCP: - case SRGTXRXCP: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getCpAttributes()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case DEGREETXRXTTP: - case DEGREETXTTP: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getTxTtpAttributes()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case DEGREERXTTP: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getRxTtpAttributes()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case SRGRXPP: - case SRGTXPP: - case SRGTXRXPP: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getPpAttributes()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERCLIENT: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERNETWORK: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERPORT: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes()); - break; - default: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - } - AvailFreqMaps availFreqMaps4Srg = updatedNode1.getSrgAttributes().nonnullAvailFreqMaps().get(freqMapKey); - AvailFreqMaps availFreqMaps4Degree = updatedNode1.getDegreeAttributes().nonnullAvailFreqMaps().get(freqMapKey); - int effectiveBits = availFreqMaps4Srg.getEffectiveBits().intValue(); - byte[] array = new byte[effectiveBits]; - Arrays.fill(array, (byte) 1); - switch (updatedNode2.getNodeType()) { - case DEGREE: - Assert.assertNotNull("FreqMap should not be null", availFreqMaps4Degree.getFreqMap()); - Assert.assertTrue("Index 20 should be available", - Arrays.equals(Arrays.copyOfRange(availFreqMaps4Degree.getFreqMap(), 152, 160), array)); - Assert.assertNull(availFreqMaps4Srg); - break; - case SRG: - Assert.assertNotNull("FreqMap should not be null", availFreqMaps4Srg.getFreqMap()); - Assert.assertTrue("Index 20 should be available", - Arrays.equals(Arrays.copyOfRange(availFreqMaps4Srg.getFreqMap(), 152, 160), array)); - Assert.assertNull(availFreqMaps4Degree); - break; - default: - Assert.assertNull(availFreqMaps4Degree); - Assert.assertNull(availFreqMaps4Srg); - break; - } - } -} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java deleted file mode 100644 index 23e35fe16..000000000 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.transportpce.networkmodel.service; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.opendaylight.transportpce.common.StringConstants; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; -import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl; -import org.opendaylight.transportpce.common.fixedflex.GridConstant; -import org.opendaylight.transportpce.networkmodel.util.WaveLengthServiceUtils; -import org.opendaylight.transportpce.networkmodel.util.test.PathDescriptionUtils; -import org.opendaylight.transportpce.test.AbstractTest; -import org.opendaylight.transportpce.test.stub.MountPointServiceStub; -import org.opendaylight.transportpce.test.stub.MountPointStub; -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.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.TerminationPoint1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.CpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.CtpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.PpAttributesBuilder; -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.TxTtpAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrClientAttributesBuilder; -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.XpdrPortAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; -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.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescription; -import org.opendaylight.yangtools.yang.common.Uint16; - -@Ignore -@RunWith(Parameterized.class) -public class NetworkModelWaveLengthServiceUseTest extends AbstractTest { - - private NetworkModelWavelengthService networkModelWavelengthService; - private DeviceTransactionManager deviceTransactionManager; - - private TerminationPoint1 terminationPoint1; - private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 terminatPoint2; - private PathDescription pathDescription; - private Node1 node1; - private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2; - - @Before - public void setMountPoint() { - MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(getDataBroker())); - this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000); - networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); - } - - public NetworkModelWaveLengthServiceUseTest(PathDescription pathDescription, TerminationPoint1 terminationPoint1, - Node1 node1, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 terminationPoint2, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2) { - this.pathDescription = pathDescription; - this.terminationPoint1 = terminationPoint1; - this.terminatPoint2 = terminationPoint2; - this.node1 = node1; - this.node2 = node2; - } - - @Parameterized.Parameters - public static Collection createParameters() { - List parameters = new ArrayList<>(); - - PathDescription pathDescription = - PathDescriptionUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); - - TerminationPoint1Builder terminationPoint1Builder = new TerminationPoint1Builder() - .setCtpAttributes((new CtpAttributesBuilder()).setAvailFreqMaps(Map.of()).build()) - .setCpAttributes((new CpAttributesBuilder()).setAvailFreqMaps(Map.of()).build()) - .setTxTtpAttributes((new TxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build()) - .setRxTtpAttributes((new RxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build()) - .setPpAttributes((new PpAttributesBuilder()).setUsedWavelength(Map.of()).build()) - .setXpdrClientAttributes((new XpdrClientAttributesBuilder()).build()) - .setXpdrNetworkAttributes((new XpdrNetworkAttributesBuilder()).build()) - .setXpdrPortAttributes((new XpdrPortAttributesBuilder()).build()); - - byte[] byteArray = new byte[GridConstant.NB_OCTECTS]; - Arrays.fill(byteArray, (byte) GridConstant.USED_SLOT_VALUE); - byteArray[19] = (byte) GridConstant.AVAILABLE_SLOT_VALUE; - Map waveMap = new HashMap<>(); - AvailFreqMaps availFreqMaps = new AvailFreqMapsBuilder().setMapName(GridConstant.C_BAND) - .setFreqMapGranularity(new FrequencyGHz(BigDecimal.valueOf(GridConstant.GRANULARITY))) - .setStartEdgeFreq(new FrequencyTHz(BigDecimal.valueOf(GridConstant.START_EDGE_FREQUENCY))) - .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS)) - .setFreqMap(byteArray) - .build(); - waveMap.put(availFreqMaps.key(), availFreqMaps); - Node1Builder node1Builder = new Node1Builder() - .setDegreeAttributes((new DegreeAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()) - .setSrgAttributes((new SrgAttributesBuilder()) - .setAvailFreqMaps(waveMap) - .build()); - - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder - terminationPoint2Builder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder(); - - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder node2Builder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder(); - - for (OpenroadmNodeType nodeType : Arrays - .asList(OpenroadmNodeType.XPONDER, OpenroadmNodeType.DEGREE, OpenroadmNodeType.SRG)) { - node2Builder.setNodeType(nodeType); - terminationPoint2Builder.setTpType(OpenroadmTpType.DEGREETXTTP); - parameters.add(new Object[] { pathDescription, terminationPoint1Builder.build(), node1Builder.build(), - terminationPoint2Builder.build(), node2Builder.build() }); - } - - for (OpenroadmTpType tpType : OpenroadmTpType.values()) { - node2Builder.setNodeType(OpenroadmNodeType.DEGREE); - terminationPoint2Builder.setTpType(tpType); - parameters.add(new Object[] { pathDescription, terminationPoint1Builder.build(), node1Builder.build(), - terminationPoint2Builder.build(), node2Builder.build() }); - } - - return parameters; - } - - @Test - public void freeWavelengthsTest() throws ExecutionException, InterruptedException { - WaveLengthServiceUtils.putTerminationPoint1ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminationPoint1, this.deviceTransactionManager); - WaveLengthServiceUtils.putTerminationPoint2ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminatPoint2); - WaveLengthServiceUtils.putNode1ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node1, - this.deviceTransactionManager); - WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2); - this.networkModelWavelengthService.useWavelengths(this.pathDescription.getAToZDirection(), - this.pathDescription.getZToADirection()); - Node1 updatedNode1 = WaveLengthServiceUtils.getNode1FromDatastore("node1" + StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 updatedNode2 = - WaveLengthServiceUtils.getNode2FromDatastore("node1" + StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - TerminationPoint1 updatedTerminationPoint1 = WaveLengthServiceUtils - .getTerminationPoint1FromDatastore("node1" + StringConstants.TTP_TOKEN, StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1 updatedTerminationPoint2 = WaveLengthServiceUtils - .getTerminationPoint2FromDatastore("node1" + StringConstants.TTP_TOKEN, StringConstants.TTP_TOKEN, - this.deviceTransactionManager); - - switch (updatedTerminationPoint2.getTpType()) { - //switch (((org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1) - // updatedTerminationPoint1).getTpType()) { - case DEGREETXRXCTP: - case DEGREETXCTP: - case DEGREERXCTP: - Assert.assertFalse(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case SRGTXCP: - case SRGRXCP: - case SRGTXRXCP: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case DEGREETXRXTTP: - case DEGREETXTTP: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case DEGREERXTTP: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case SRGRXPP: - case SRGTXPP: - case SRGTXRXPP: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertFalse(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERCLIENT: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrClientAttributes()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERNETWORK: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrNetworkAttributes()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - case XPONDERPORT: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNotNull(updatedTerminationPoint1.getXpdrPortAttributes()); - break; - default: - Assert.assertTrue(updatedTerminationPoint1.getCtpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getCpAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getTxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getRxTtpAttributes().getUsedWavelengths().isEmpty()); - Assert.assertTrue(updatedTerminationPoint1.getPpAttributes().getUsedWavelength().isEmpty()); - Assert.assertNull(updatedTerminationPoint1.getXpdrClientAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrNetworkAttributes().getWavelength()); - Assert.assertNull(updatedTerminationPoint1.getXpdrPortAttributes().getWavelength()); - break; - } - switch (updatedNode2.getNodeType()) { - case DEGREE: - Assert.assertNull(updatedNode1.getDegreeAttributes()); - Assert.assertFalse(updatedNode1.getSrgAttributes().getAvailFreqMaps().isEmpty()); - break; - case SRG: - Assert.assertNull(updatedNode1.getSrgAttributes()); - Assert.assertFalse(updatedNode1.getDegreeAttributes().getAvailFreqMaps().isEmpty()); - break; - default: - Assert.assertFalse(updatedNode1.getDegreeAttributes().getAvailFreqMaps().isEmpty()); - Assert.assertFalse(updatedNode1.getSrgAttributes().getAvailFreqMaps().isEmpty()); - break; - } - - } -} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceTest.java new file mode 100644 index 000000000..c861e9384 --- /dev/null +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceTest.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2020 Orange, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel.service; + +import static org.junit.Assert.fail; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.ExecutionException; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.opendaylight.transportpce.common.InstanceIdentifiers; +import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.converter.DataObjectConverter; +import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter; +import org.opendaylight.transportpce.test.utils.TopologyDataUtils; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.service.path.rpc.result.PathDescription; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Ignore +//FIXME: disabled because some updates are needed on test-common +public class NetworkModelWavelengthServiceTest extends AbstractTest { + private static final Logger LOG = LoggerFactory.getLogger(NetworkModelWavelengthServiceTest.class); + private static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology.xml"; + private static final String PATH_DESCRIPTION_FILE = "src/test/resources/path_description.json"; + private static DataObjectConverter dataObjectConverter; + + @BeforeClass + public static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException { + TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(), OPENROADM_TOPOLOGY_FILE, + InstanceIdentifiers.OVERLAY_NETWORK_II); + dataObjectConverter = JSONDataObjectConverter.createWithDataStoreUtil(getDataStoreContextUtil()); + } + + @Test + public void allocateFrequenciesTest() throws IOException { + try (Reader reader = new FileReader(PATH_DESCRIPTION_FILE, StandardCharsets.UTF_8)) { + PathDescription pathDescription = (PathDescription) dataObjectConverter.transformIntoNormalizedNode(reader) + .get().getValue(); + NetworkModelWavelengthService service = new NetworkModelWavelengthServiceImpl(getDataBroker()); + service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection()); + } catch (IOException e) { + LOG.error("Cannot load path description ", e); + fail("Cannot load path description "); + } + } +} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java deleted file mode 100644 index 6f68269a0..000000000 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.transportpce.networkmodel.util; - -import java.util.concurrent.ExecutionException; -import org.opendaylight.mdsal.binding.api.WriteTransaction; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.transportpce.common.NetworkUtils; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; -import org.opendaylight.transportpce.test.AbstractTest; -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.TerminationPoint1; -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; - -public final class WaveLengthServiceUtils extends AbstractTest { - - private WaveLengthServiceUtils() { - - } - - private static 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); - } - - private static 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); - } - - public static void putTerminationPoint1ToDatastore(String nodeId, String tpId, TerminationPoint1 terminationPoint1, - DeviceTransactionManager deviceTransactionManager) throws ExecutionException, InterruptedException { - WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.CONFIGURATION, - createTerminationPoint1IIDBuilder(nodeId, tpId).build(), terminationPoint1); - writeTransaction.commit(); - } - - public static void putTerminationPoint2ToDatastore(String nodeId, String tpId, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 - terminationPoint1) - throws ExecutionException, InterruptedException { - WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.CONFIGURATION, - createTerminationPoint2IIDBuilder(nodeId, tpId).build(), terminationPoint1); - writeTransaction.commit(); - } - - public static TerminationPoint1 getTerminationPoint1FromDatastore(String nodeId, String tpId, - DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - InstanceIdentifier tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build(); - return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, tpIID).get().get(); - } - - public static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .TerminationPoint1 getTerminationPoint2FromDatastore(String nodeId, String tpId, - DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - InstanceIdentifier - tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build(); - return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, tpIID).get().get(); - } - - private static 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 static 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(); - } - - public static void putNode1ToDatastore(String nodeId, Node1 node1, - DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - InstanceIdentifier nodeIID = createNode1IID(nodeId); - WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.CONFIGURATION,nodeIID, node1); - writeTransaction.commit(); - } - - public static void putNode2ToDatastore(String nodeId, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node1) - throws ExecutionException, InterruptedException { - InstanceIdentifier nodeIID = - createNode2IID(nodeId); - WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.CONFIGURATION, - nodeIID, node1); - writeTransaction.commit(); - } - - public static Node1 getNode1FromDatastore(String nodeId, DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - InstanceIdentifier nodeIID = createNode1IID(nodeId); - return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, nodeIID).get().get(); - } - - public static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 - .Node1 getNode2FromDatastore(String nodeId, DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - InstanceIdentifier nodeIID = createNode2IID(nodeId); - return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, nodeIID).get().get(); - } -} diff --git a/networkmodel/src/test/resources/openroadm-topology.xml b/networkmodel/src/test/resources/openroadm-topology.xml new file mode 100644 index 000000000..d8d90aa8d --- /dev/null +++ b/networkmodel/src/test/resources/openroadm-topology.xml @@ -0,0 +1,1055 @@ + + + + openroadm-topology + + + + + ROADM-A1-SRG3 + + SRG3-PP3-TXRX + SRG-TXRX-PP + + + SRG3-PP2-TXRX + SRG-TXRX-PP + + + SRG3-CP-TXRX + SRG-TXRX-CP + + + SRG3-PP1-TXRX + SRG-TXRX-PP + + + SRG3-PP4-TXRX + SRG-TXRX-PP + + + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + clli-network + NodeA + + + openroadm-network + ROADM-A1 + + SRG + + + XPDR-C1-XPDR1 + + XPDR1-CLIENT1 + XPDR1-NETWORK1 + XPONDER-CLIENT + + + XPDR1-CLIENT2 + XPDR1-NETWORK2 + XPONDER-CLIENT + + + XPDR1-NETWORK2 + XPDR1-CLIENT2 + XPONDER-NETWORK + + + XPDR1-NETWORK1 + XPDR1-CLIENT1 + + ROADM-C1-SRG1--SRG1-PP1-TXRX + + + XPONDER-NETWORK + + + clli-network + NodeC + + + openroadm-network + XPDR-C1 + + XPONDER + + + ROADM-A1-SRG1 + + SRG1-PP4-TXRX + SRG-TXRX-PP + + + SRG1-PP1-TXRX + SRG-TXRX-PP + + + SRG1-PP2-TXRX + SRG-TXRX-PP + + + SRG1-PP3-TXRX + SRG-TXRX-PP + + + SRG1-CP-TXRX + SRG-TXRX-CP + + + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + clli-network + NodeA + + + openroadm-network + ROADM-A1 + + SRG + + + ROADM-A1-DEG1 + + DEG1-CTP-TXRX + DEGREE-TXRX-CTP + + + DEG1-TTP-TXRX + DEGREE-TXRX-TTP + + + 1 + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + clli-network + NodeA + + + openroadm-network + ROADM-A1 + + DEGREE + + + XPDR-A1-XPDR1 + + XPDR1-CLIENT1 + XPDR1-NETWORK1 + XPONDER-CLIENT + + + XPDR1-CLIENT2 + XPDR1-NETWORK2 + XPONDER-CLIENT + + + XPDR1-NETWORK2 + XPDR1-CLIENT2 + XPONDER-NETWORK + + + XPDR1-NETWORK1 + XPDR1-CLIENT1 + + ROADM-A1-SRG1--SRG1-PP1-TXRX + + + XPONDER-NETWORK + + + openroadm-network + XPDR-A1 + + + clli-network + NodeA + + XPONDER + + + ROADM-A1-DEG2 + + DEG2-TTP-TXRX + DEGREE-TXRX-TTP + + + DEG2-CTP-TXRX + DEGREE-TXRX-CTP + + + 2 + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + clli-network + NodeA + + + openroadm-network + ROADM-A1 + + DEGREE + + + ROADM-C1-SRG1 + + SRG1-PP4-TXRX + SRG-TXRX-PP + + + SRG1-PP1-TXRX + SRG-TXRX-PP + + + SRG1-PP2-TXRX + SRG-TXRX-PP + + + SRG1-PP3-TXRX + SRG-TXRX-PP + + + SRG1-CP-TXRX + SRG-TXRX-CP + + + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + clli-network + NodeC + + + openroadm-network + ROADM-C1 + + SRG + + + SPDR-SA1-XPDR1 + + XPDR1-NETWORK1 + XPONDER-NETWORK + + ROADM-A1-SRG1--SRG1-PP2-TXRX + + + + + openroadm-network + SPDR-SA1 + + + clli-network + NodeSA + + XPONDER + + + ROADM-C1-DEG1 + + DEG1-CTP-TXRX + DEGREE-TXRX-CTP + + + DEG1-TTP-TXRX + DEGREE-TXRX-TTP + + + 1 + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + clli-network + NodeC + + + openroadm-network + ROADM-C1 + + DEGREE + + + SPDR-SC1-XPDR1 + + XPDR1-NETWORK1 + XPONDER-NETWORK + + ROADM-C1-SRG1--SRG1-PP2-TXRX + + + + + openroadm-network + SPDR-SC1 + + + clli-network + NodeSC + + XPONDER + + + ROADM-C1-DEG2 + + DEG2-TTP-TXRX + DEGREE-TXRX-TTP + + + DEG2-CTP-TXRX + DEGREE-TXRX-CTP + + + 2 + + cband + 191.325 + 6.25 + 768 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + clli-network + NodeC + + + openroadm-network + ROADM-C1 + + DEGREE + + + SPDR-SA1-XPDR2 + + XPDR2-NETWORK1 + XPONDER-NETWORK + + + XPDR2-NETWORK3 + XPONDER-NETWORK + + ROADM-A1-SRG1--SRG1-PP4-TXRX + + + + + XPDR2-NETWORK2 + XPONDER-NETWORK + + ROADM-A1-SRG1--SRG1-PP3-TXRX + + + + + XPDR2-NETWORK4 + XPONDER-NETWORK + + + openroadm-network + SPDR-SA1 + + + clli-network + NodeSA + + XPONDER + + + SPDR-SC1-XPDR2 + + XPDR2-NETWORK1 + XPONDER-NETWORK + + + XPDR2-NETWORK3 + XPONDER-NETWORK + + ROADM-C1-SRG1--SRG1-PP4-TXRX + + + + + XPDR2-NETWORK2 + XPONDER-NETWORK + + ROADM-C1-SRG1--SRG1-PP3-TXRX + + + + + XPDR2-NETWORK4 + XPONDER-NETWORK + + + openroadm-network + SPDR-SC1 + + + clli-network + NodeSC + + XPONDER + + + ROADM-C1-SRG1-SRG1-PP2-TXRXtoSPDR-SC1-XPDR1-XPDR1-NETWORK1 + + + ROADM-C1-SRG1 + SRG1-PP2-TXRX + + + XPDR1-NETWORK1 + SPDR-SC1-XPDR1 + + SPDR-SC1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX + + XPONDER-INPUT + + + ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX + + + ROADM-A1-DEG2 + DEG2-TTP-TXRX + + + + + DEG1-TTP-TXRX + ROADM-C1-DEG1 + + ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX + + ROADM-TO-ROADM + + + XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX + + + XPDR-C1-XPDR1 + XPDR1-NETWORK1 + + + SRG1-PP1-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1 + + XPONDER-OUTPUT + + + ROADM-C1-SRG1-SRG1-PP3-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK2 + + + ROADM-C1-SRG1 + SRG1-PP3-TXRX + + + XPDR2-NETWORK2 + SPDR-SC1-XPDR2 + + SPDR-SC1-XPDR2-XPDR2-NETWORK2toROADM-C1-SRG1-SRG1-PP3-TXRX + + XPONDER-INPUT + + + ROADM-A1-SRG1-SRG1-PP4-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK3 + + + ROADM-A1-SRG1 + SRG1-PP4-TXRX + + + XPDR2-NETWORK3 + SPDR-SA1-XPDR2 + + SPDR-SA1-XPDR2-XPDR2-NETWORK3toROADM-A1-SRG1-SRG1-PP4-TXRX + + XPONDER-INPUT + + + ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX + + + ROADM-C1-DEG1 + DEG1-CTP-TXRX + + + SRG1-CP-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX + + DROP-LINK + + + SPDR-SA1-XPDR2-XPDR2-NETWORK3toROADM-A1-SRG1-SRG1-PP4-TXRX + + + SPDR-SA1-XPDR2 + XPDR2-NETWORK3 + + + SRG1-PP4-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-PP4-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK3 + + XPONDER-OUTPUT + + + SPDR-SC1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX + + + SPDR-SC1-XPDR1 + XPDR1-NETWORK1 + + + SRG1-PP2-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-PP2-TXRXtoSPDR-SC1-XPDR1-XPDR1-NETWORK1 + + XPONDER-OUTPUT + + + ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + + ROADM-A1-SRG3 + SRG3-CP-TXRX + + + DEG1-CTP-TXRX + ROADM-A1-DEG1 + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX + + ADD-LINK + + + SPDR-SC1-XPDR2-XPDR2-NETWORK2toROADM-C1-SRG1-SRG1-PP3-TXRX + + + SPDR-SC1-XPDR2 + XPDR2-NETWORK2 + + + SRG1-PP3-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-PP3-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK2 + + XPONDER-OUTPUT + + + ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + + ROADM-A1-SRG3 + SRG3-CP-TXRX + + + DEG2-CTP-TXRX + ROADM-A1-DEG2 + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX + + ADD-LINK + + + ROADM-C1-SRG1-SRG1-PP4-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK3 + + + ROADM-C1-SRG1 + SRG1-PP4-TXRX + + + XPDR2-NETWORK3 + SPDR-SC1-XPDR2 + + SPDR-SC1-XPDR2-XPDR2-NETWORK3toROADM-C1-SRG1-SRG1-PP4-TXRX + + XPONDER-INPUT + + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX + + + ROADM-A1-DEG1 + DEG1-CTP-TXRX + + + SRG3-CP-TXRX + ROADM-A1-SRG3 + + ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + DROP-LINK + + + ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1 + + + ROADM-A1-SRG1 + SRG1-PP1-TXRX + + + XPDR1-NETWORK1 + XPDR-A1-XPDR1 + + XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX + + XPONDER-INPUT + + + SPDR-SA1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX + + + SPDR-SA1-XPDR1 + XPDR1-NETWORK1 + + + SRG1-PP2-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-PP2-TXRXtoSPDR-SA1-XPDR1-XPDR1-NETWORK1 + + XPONDER-OUTPUT + + + ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX + + + ROADM-C1-DEG1 + DEG1-TTP-TXRX + + + + + DEG2-TTP-TXRX + ROADM-A1-DEG2 + + ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX + + ROADM-TO-ROADM + + + ROADM-A1-SRG1-SRG1-PP2-TXRXtoSPDR-SA1-XPDR1-XPDR1-NETWORK1 + + + ROADM-A1-SRG1 + SRG1-PP2-TXRX + + + XPDR1-NETWORK1 + SPDR-SA1-XPDR1 + + SPDR-SA1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX + + XPONDER-INPUT + + + ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX + + + ROADM-C1-DEG2 + DEG2-CTP-TXRX + + + DEG1-CTP-TXRX + ROADM-C1-DEG1 + + ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX + + EXPRESS-LINK + + + ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX + + + ROADM-C1-DEG2 + DEG2-CTP-TXRX + + + SRG1-CP-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX + + DROP-LINK + + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX + + + ROADM-A1-DEG2 + DEG2-CTP-TXRX + + + SRG1-CP-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + DROP-LINK + + + ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX + + + ROADM-C1-DEG1 + DEG1-CTP-TXRX + + + DEG2-CTP-TXRX + ROADM-C1-DEG2 + + ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX + + EXPRESS-LINK + + + SPDR-SC1-XPDR2-XPDR2-NETWORK3toROADM-C1-SRG1-SRG1-PP4-TXRX + + + SPDR-SC1-XPDR2 + XPDR2-NETWORK3 + + + SRG1-PP4-TXRX + ROADM-C1-SRG1 + + ROADM-C1-SRG1-SRG1-PP4-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK3 + + XPONDER-OUTPUT + + + XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX + + + XPDR-A1-XPDR1 + XPDR1-NETWORK1 + + + SRG1-PP1-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1 + + XPONDER-OUTPUT + + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + + ROADM-A1-DEG2 + DEG2-CTP-TXRX + + + DEG1-CTP-TXRX + ROADM-A1-DEG1 + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + EXPRESS-LINK + + + ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + + ROADM-A1-SRG1 + SRG1-CP-TXRX + + + DEG1-CTP-TXRX + ROADM-A1-DEG1 + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX + + ADD-LINK + + + ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1 + + + ROADM-C1-SRG1 + SRG1-PP1-TXRX + + + XPDR1-NETWORK1 + XPDR-C1-XPDR1 + + XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX + + XPONDER-INPUT + + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX + + + ROADM-A1-DEG2 + DEG2-CTP-TXRX + + + SRG3-CP-TXRX + ROADM-A1-SRG3 + + ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + DROP-LINK + + + ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + + ROADM-A1-SRG1 + SRG1-CP-TXRX + + + DEG2-CTP-TXRX + ROADM-A1-DEG2 + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX + + ADD-LINK + + + SPDR-SA1-XPDR2-XPDR2-NETWORK2toROADM-A1-SRG1-SRG1-PP3-TXRX + + + SPDR-SA1-XPDR2 + XPDR2-NETWORK2 + + + SRG1-PP3-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-PP3-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK2 + + XPONDER-OUTPUT + + + ROADM-A1-SRG1-SRG1-PP3-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK2 + + + ROADM-A1-SRG1 + SRG1-PP3-TXRX + + + XPDR2-NETWORK2 + SPDR-SA1-XPDR2 + + SPDR-SA1-XPDR2-XPDR2-NETWORK2toROADM-A1-SRG1-SRG1-PP3-TXRX + + XPONDER-INPUT + + + ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX + + + ROADM-C1-SRG1 + SRG1-CP-TXRX + + + DEG2-CTP-TXRX + ROADM-C1-DEG2 + + ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX + + ADD-LINK + + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX + + + ROADM-A1-DEG1 + DEG1-CTP-TXRX + + + SRG1-CP-TXRX + ROADM-A1-SRG1 + + ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + DROP-LINK + + + ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX + + + ROADM-C1-SRG1 + SRG1-CP-TXRX + + + DEG1-CTP-TXRX + ROADM-C1-DEG1 + + ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX + + ADD-LINK + + + ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX + + + ROADM-A1-DEG1 + DEG1-CTP-TXRX + + + DEG2-CTP-TXRX + ROADM-A1-DEG2 + + ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX + + EXPRESS-LINK + + + + \ No newline at end of file diff --git a/networkmodel/src/test/resources/path_description.json b/networkmodel/src/test/resources/path_description.json new file mode 100644 index 000000000..816f6fa58 --- /dev/null +++ b/networkmodel/src/test/resources/path_description.json @@ -0,0 +1,225 @@ + { + "transportpce-pathDescription:path-description": { + "zToA-direction": { + "rate": 100, + "zToA": [ + { + "id": "0", + "resource": { + "tp-node-id": "ROADM-C1-SRG1", + "tp-id": "SRG1-PP1-TXRX" + } + }, + { + "id": "1", + "resource": { + "node-id": "ROADM-C1-SRG1" + } + }, + { + "id": "2", + "resource": { + "tp-node-id": "ROADM-C1-SRG1", + "tp-id": "SRG1-CP-TXRX" + } + }, + { + "id": "3", + "resource": { + "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX" + } + }, + { + "id": "4", + "resource": { + "tp-node-id": "ROADM-C1-DEG1", + "tp-id": "DEG1-CTP-TXRX" + } + }, + { + "id": "5", + "resource": { + "node-id": "ROADM-C1-DEG1" + } + }, + { + "id": "6", + "resource": { + "tp-node-id": "ROADM-C1-DEG1", + "tp-id": "DEG1-TTP-TXRX" + } + }, + { + "id": "7", + "resource": { + "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX" + } + }, + { + "id": "8", + "resource": { + "tp-node-id": "ROADM-A1-DEG2", + "tp-id": "DEG2-TTP-TXRX" + } + }, + { + "id": "9", + "resource": { + "node-id": "ROADM-A1-DEG2" + } + }, + { + "id": "10", + "resource": { + "tp-node-id": "ROADM-A1-DEG2", + "tp-id": "DEG2-CTP-TXRX" + } + }, + { + "id": "11", + "resource": { + "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX" + } + }, + { + "id": "12", + "resource": { + "tp-node-id": "ROADM-A1-SRG1", + "tp-id": "SRG1-CP-TXRX" + } + }, + { + "id": "13", + "resource": { + "node-id": "ROADM-A1-SRG1" + } + }, + { + "id": "14", + "resource": { + "tp-node-id": "ROADM-A1-SRG1", + "tp-id": "SRG1-PP1-TXRX" + } + } + ], + "zToA-wavelength-number": 3, + "zToA-min-frequency": 195.975, + "zToA-max-frequency": 196.02499999999998, + "modulation-format": "dp-qpsk" + }, + "aToZ-direction": { + "aToZ": [ + { + "id": "0", + "resource": { + "tp-node-id": "ROADM-A1-SRG1", + "tp-id": "SRG1-PP1-RX" + } + }, + { + "id": "1", + "resource": { + "node-id": "ROADM-A1-SRG1" + } + }, + { + "id": "2", + "resource": { + "tp-node-id": "ROADM-A1-SRG1", + "tp-id": "SRG1-CP-TX" + } + }, + { + "id": "14", + "resource": { + "tp-node-id": "OpenROADM-2-2-SRG1", + "tp-id": "SRG1-PP1-TX" + } + }, + { + "id": "10", + "resource": { + "tp-node-id": "ROADM-C1-DEG1", + "tp-id": "DEG1-CTP-TXRX" + } + }, + { + "id": "11", + "resource": { + "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX" + } + }, + { + "id": "12", + "resource": { + "tp-node-id": "ROADM-C1-SRG1", + "tp-id": "SRG1-CP-TXRX" + } + }, + { + "id": "13", + "resource": { + "node-id": "ROADM-C1-SRG1" + } + }, + { + "id": "14", + "resource": { + "tp-node-id": "ROADM-C1-SRG1", + "tp-id": "SRG1-PP1-TXRX" + } + }, + { + "id": "3", + "resource": { + "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX" + } + }, + { + "id": "4", + "resource": { + "tp-node-id": "ROADM-A1-DEG2", + "tp-id": "DEG2-CTP-TXRX" + } + }, + { + "id": "5", + "resource": { + "node-id": "ROADM-A1-DEG2" + } + }, + { + "id": "6", + "resource": { + "tp-node-id": "ROADM-A1-DEG2", + "tp-id": "DEG2-TTP-TXRX" + } + }, + { + "id": "7", + "resource": { + "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX" + } + }, + { + "id": "8", + "resource": { + "tp-node-id": "ROADM-C1-DEG1", + "tp-id": "DEG1-TTP-TXRX" + } + }, + { + "id": "9", + "resource": { + "node-id": "ROADM-C1-DEG1" + } + } + ], + "aToZ-min-frequency": 195.075, + "aToZ-max-frequency": 196.125, + "rate": 100, + "aToZ-wavelength-number": 1, + "modulation-format": "dp-qpsk" + } + } + } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java b/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java index dca626ce3..834958ea3 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java @@ -13,8 +13,11 @@ import java.util.List; import java.util.Map; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.common.StringConstants; +import org.opendaylight.transportpce.common.fixedflex.GridConstant; import org.opendaylight.transportpce.pce.networkanalyzer.PceLink; import org.opendaylight.transportpce.pce.networkanalyzer.PceResult; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyTHz; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.AToZDirectionBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.ZToADirectionBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201126.path.description.atoz.direction.AToZ; @@ -84,23 +87,32 @@ public class PcePathDescription { private AToZDirectionBuilder buildAtoZDirection(Map atozMap) { AToZDirectionBuilder atoZDirectionBldr = new AToZDirectionBuilder() .setRate(Uint32.valueOf(rc.getRate())) + .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP + .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName()) .setAToZ(atozMap); - if (StringConstants.SERVICE_TYPE_100GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_OTU4.equals(rc.getServiceType())) { - atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); - } else if (StringConstants.SERVICE_TYPE_10GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_1GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_ODU4.equals(rc.getServiceType())) { - if (rc.getResultTribSlot() != null && rc.getResultTribPort() != null) { - @SuppressWarnings("unchecked") - List tribSlotList = (List) rc.getResultTribSlot().values().toArray()[0]; - atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(0)) - .setTribPortNumber(Uint16.valueOf(rc.getResultTribPort().values().toArray()[0].toString())) - .setTribSlotNumber(tribSlotList.get(0)); - } else { - LOG.error("Trib port and trib slot number should be present"); - atoZDirectionBldr.setTribSlotNumber(Uint16.valueOf(0)).setTribPortNumber(Uint16.valueOf(0)); - } + switch (rc.getServiceType()) { + case StringConstants.SERVICE_TYPE_100GE: + case StringConstants.SERVICE_TYPE_OTU4: + atoZDirectionBldr.setAToZMaxFrequency(new FrequencyTHz(rc.getMaxFreq())); + atoZDirectionBldr.setAToZMinFrequency(new FrequencyTHz(rc.getMinFreq())); + atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); + break; + case StringConstants.SERVICE_TYPE_10GE: + case StringConstants.SERVICE_TYPE_1GE: + case StringConstants.SERVICE_TYPE_ODU4: + if (rc.getResultTribSlot() != null && rc.getResultTribPort() != null) { + @SuppressWarnings("unchecked") + List tribSlotList = (List) rc.getResultTribSlot().values().toArray()[0]; + atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(0)) + .setTribPortNumber(Uint16.valueOf(rc.getResultTribPort().values().toArray()[0].toString())) + .setTribSlotNumber(tribSlotList.get(0)); + } else { + LOG.error("Trib port and trib slot number should be present"); + atoZDirectionBldr.setTribSlotNumber(Uint16.valueOf(0)).setTribPortNumber(Uint16.valueOf(0)); + } + break; + default: + break; } return atoZDirectionBldr; } @@ -111,25 +123,33 @@ public class PcePathDescription { * @return a builder for ZtoADirection object */ private ZToADirectionBuilder buildZtoADirection(Map ztoaMap) { - ZToADirectionBuilder ztoADirectionBldr = new ZToADirectionBuilder() - .setRate(Uint32.valueOf(rc.getRate())) - .setZToA(ztoaMap); - if (StringConstants.SERVICE_TYPE_100GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_OTU4.equals(rc.getServiceType())) { - ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); - } else if (StringConstants.SERVICE_TYPE_10GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_1GE.equals(rc.getServiceType()) - || StringConstants.SERVICE_TYPE_ODU4.equals(rc.getServiceType())) { - if (rc.getResultTribSlot() != null && rc.getResultTribPort() != null) { - @SuppressWarnings("unchecked") - List tribSlotList = (List) rc.getResultTribSlot().values().toArray()[0]; - ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(0)) - .setTribPortNumber(Uint16.valueOf(rc.getResultTribPort().values().toArray()[0].toString())) - .setTribSlotNumber(tribSlotList.get(0)); - } else { - LOG.error("Trib port and trib slot number should be present"); - ztoADirectionBldr.setTribSlotNumber(Uint16.valueOf(0)).setTribPortNumber(Uint16.valueOf(0)); - } + ZToADirectionBuilder ztoADirectionBldr = new ZToADirectionBuilder().setRate(Uint32.valueOf(rc.getRate())) + .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP + .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName()) + .setZToA(ztoaMap); + switch (rc.getServiceType()) { + case StringConstants.SERVICE_TYPE_100GE: + case StringConstants.SERVICE_TYPE_OTU4: + ztoADirectionBldr.setZToAMaxFrequency(new FrequencyTHz(rc.getMaxFreq())); + ztoADirectionBldr.setZToAMinFrequency(new FrequencyTHz(rc.getMinFreq())); + ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); + break; + case StringConstants.SERVICE_TYPE_10GE: + case StringConstants.SERVICE_TYPE_1GE: + case StringConstants.SERVICE_TYPE_ODU4: + if (rc.getResultTribSlot() != null && rc.getResultTribPort() != null) { + @SuppressWarnings("unchecked") + List tribSlotList = (List) rc.getResultTribSlot().values().toArray()[0]; + ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(0)) + .setTribPortNumber(Uint16.valueOf(rc.getResultTribPort().values().toArray()[0].toString())) + .setTribSlotNumber(tribSlotList.get(0)); + } else { + LOG.error("Trib port and trib slot number should be present"); + ztoADirectionBldr.setTribSlotNumber(Uint16.valueOf(0)).setTribPortNumber(Uint16.valueOf(0)); + } + break; + default: + break; } return ztoADirectionBldr; } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java b/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java index f2d1c5dab..b29e4dbce 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java @@ -109,8 +109,10 @@ public class PceGraph { shortestPathAtoZ = new ArrayList<>(pathAtoZ); if ((StringConstants.SERVICE_TYPE_100GE.equals(serviceType)) || (StringConstants.SERVICE_TYPE_OTU4.equals(serviceType))) { - LOG.info("In calcPath Path FOUND path for wl [{}], hops {}, distance per metrics {}, path AtoZ {}", - pceResult.getResultWavelength(), pathAtoZ.size(), path.getWeight(), pathAtoZ); + LOG.info("In calcPath Path FOUND path for wl [{}], min Freq assignment {}, max Freq assignment {}," + + " hops {}, distance per metrics {}, path AtoZ {}", + pceResult.getResultWavelength(), pceResult.getMinFreq(), pceResult.getMaxFreq(), + pathAtoZ.size(), path.getWeight(), pathAtoZ); break; } else { // Service is at OTN layer and is relying on a supporting wavelength service @@ -122,8 +124,9 @@ public class PceGraph { } if (shortestPathAtoZ != null) { - LOG.info("In calcPath CHOOSEN PATH for wl [{}], hops {}, path AtoZ {}", - pceResult.getResultWavelength(), shortestPathAtoZ.size(), shortestPathAtoZ); + LOG.info("In calcPath CHOOSEN PATH for wl [{}], min freq {}, max freq {}, hops {}, path AtoZ {}", + pceResult.getResultWavelength(), pceResult.getMinFreq(), pceResult.getMaxFreq(), + shortestPathAtoZ.size(), shortestPathAtoZ); } LOG.info("In calcPath : pceResult {}", pceResult); return (pceResult.getStatus()); diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java b/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java index 047d248a9..dceefde5e 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java @@ -10,6 +10,8 @@ package org.opendaylight.transportpce.pce.graph; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -17,8 +19,11 @@ import java.util.Map; import org.jgrapht.GraphPath; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.common.StringConstants; +import org.opendaylight.transportpce.common.fixedflex.GridConstant; +import org.opendaylight.transportpce.common.fixedflex.GridUtils; import org.opendaylight.transportpce.pce.constraints.PceConstraints; import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair; +import org.opendaylight.transportpce.pce.model.SpectrumAssignment; import org.opendaylight.transportpce.pce.networkanalyzer.PceNode; import org.opendaylight.transportpce.pce.networkanalyzer.PceResult; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; @@ -31,7 +36,6 @@ public class PostAlgoPathValidator { /* Logging. */ private static final Logger LOG = LoggerFactory.getLogger(PostAlgoPathValidator.class); - private static final int MAX_WAWELENGTH = 96; private static final double MIN_OSNR_W100G = 17; private static final double TRX_OSNR = 33; private static final double ADD_OSNR = 30; @@ -49,23 +53,29 @@ public class PostAlgoPathValidator { pceResult.setRC(ResponseCodes.RESPONSE_FAILED); return pceResult; } - int tribSlotNb = 1; //variable to deal with 1GE (Nb=1) and 10GE (Nb=10) cases switch (serviceType) { case StringConstants.SERVICE_TYPE_100GE: case StringConstants.SERVICE_TYPE_OTU4: - // choose wavelength available in all nodes of the path - Long waveL = chooseWavelength(path, allPceNodes); + int spectralWidthSlotNumber = GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP + .getOrDefault(serviceType, GridConstant.NB_SLOTS_100G); + SpectrumAssignment spectrumAssignment = getSpectrumAssignment(path, + allPceNodes, spectralWidthSlotNumber); pceResult.setServiceType(serviceType); - if (waveL < 0) { + if (spectrumAssignment.getBeginIndex() == 0 && spectrumAssignment.getStopIndex() == 0) { pceResult.setRC(ResponseCodes.RESPONSE_FAILED); pceResult.setLocalCause(PceResult.LocalCause.NO_PATH_EXISTS); return pceResult; } - pceResult.setResultWavelength(waveL); - LOG.info("In PostAlgoPathValidator: chooseWavelength WL found {} {}", waveL, path); + //TODO: until change to manage connection name, logical connection point name and service path + // keep set wavelength number + pceResult.setResultWavelength( + GridUtils.getWaveLengthIndexFromSpectrumAssigment(spectrumAssignment.getBeginIndex())); + pceResult.setMinFreq(GridUtils.getStartFrequencyFromIndex(spectrumAssignment.getBeginIndex())); + pceResult.setMaxFreq(GridUtils.getStopFrequencyFromIndex(spectrumAssignment.getStopIndex())); + LOG.info("In PostAlgoPathValidator: spectrum assignment found {} {}", spectrumAssignment, path); // Check the OSNR if (!checkOSNR(path)) { @@ -131,28 +141,6 @@ public class PostAlgoPathValidator { return pceResult; } - // Choose the first available wavelength from the source to the destination - private Long chooseWavelength(GraphPath path, Map allPceNodes) { - Long wavelength = -1L; - for (long i = 1; i <= MAX_WAWELENGTH; i++) { - boolean completed = true; - LOG.debug("In chooseWavelength: {} {}", path.getLength(), path); - for (PceGraphEdge edge : path.getEdgeList()) { - LOG.debug("In chooseWavelength: source {} ", edge.link().getSourceId()); - PceNode pceNode = allPceNodes.get(edge.link().getSourceId()); - if (!pceNode.checkWL(i)) { - completed = false; - break; - } - } - if (completed) { - wavelength = i; - break; - } - } - return wavelength; - } - // Check the latency private boolean checkLatency(Long maxLatency, GraphPath path) { double latency = 0; @@ -389,4 +377,74 @@ public class PostAlgoPathValidator { return (CONST_OSNR / linkOsnrLu); } + /** + * Get spectrum assignment for path. + * + * @param path the path for which we get spectrum assignment. + * @param allPceNodes all optical nodes. + * @param spectralWidthSlotNumber number of slot for spectral width. Depends on + * service type. + * @return a spectrum assignment object which contains begin and end index. If + * no spectrum assignment found, beginIndex = stopIndex = 0 + */ + private SpectrumAssignment getSpectrumAssignment(GraphPath path, + Map allPceNodes, int spectralWidthSlotNumber) { + byte[] freqMap = new byte[GridConstant.NB_OCTECTS]; + Arrays.fill(freqMap, (byte) GridConstant.AVAILABLE_SLOT_VALUE); + BitSet result = BitSet.valueOf(freqMap); + boolean isFlexGrid = true; + LOG.debug("Processing path {} with length {}", path, path.getLength()); + BitSet pceNodeFreqMap; + for (PceGraphEdge edge : path.getEdgeList()) { + LOG.debug("Processing source {} ", edge.link().getSourceId()); + if (allPceNodes.containsKey(edge.link().getSourceId())) { + PceNode pceNode = allPceNodes.get(edge.link().getSourceId()); + if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNode.getVersion())) { + LOG.info("Node {} is 1.2.1 node", pceNode.getNodeId()); + isFlexGrid = false; + } + pceNodeFreqMap = pceNode.getBitSetData(); + LOG.debug("Pce node bitset {}", pceNodeFreqMap); + if (pceNodeFreqMap != null) { + result.and(pceNodeFreqMap); + LOG.debug("intermediate bitset {}", result); + } + } + } + LOG.debug("Bitset result {}", result); + return computeBestSpectrumAssignment(result, spectralWidthSlotNumber, isFlexGrid); + } + + /** + * Compute spectrum assignment from spectrum occupation for spectral width. + * + * @param spectrumOccupation the spectrum occupation BitSet. + * @param spectralWidthSlotNumber the nb slots for spectral width. + * @param isFlexGrid true if flexible grid, false otherwise. + * @return a spectrum assignment object which contains begin and stop index. If + * no spectrum assignment found, beginIndex = stopIndex = 0 + */ + private SpectrumAssignment computeBestSpectrumAssignment(BitSet spectrumOccupation, int spectralWidthSlotNumber, + boolean isFlexGrid) { + SpectrumAssignment spectrumAssignment = new SpectrumAssignment(0, 0); + spectrumAssignment.setFlexGrid(isFlexGrid); + BitSet referenceBitSet = new BitSet(spectralWidthSlotNumber); + referenceBitSet.set(0, spectralWidthSlotNumber); + int nbSteps = 1; + if (isFlexGrid) { + nbSteps = spectralWidthSlotNumber; + } + //higher is the frequency, smallest is the wavelength number + //in operational, the allocation is done through wavelength starting from the smallest + //so we have to loop from the last element of the spectrum occupation + for (int i = spectrumOccupation.size(); i >= spectralWidthSlotNumber; i -= nbSteps) { + if (spectrumOccupation.get(i - spectralWidthSlotNumber, i).equals(referenceBitSet)) { + spectrumAssignment.setBeginIndex(i - spectralWidthSlotNumber); + spectrumAssignment.setStopIndex(i - 1); + break; + } + } + return spectrumAssignment; + } + } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java index 125eeed75..aeb2938fc 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java @@ -492,7 +492,7 @@ public class PceCalculation { LOG.info("Device node id {} for {}", deviceNodeId, node); PceOpticalNode pceNode = new PceOpticalNode(node, nodeType, mappingUtils.getOpenRoadmVersion(deviceNodeId)); pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat()); - pceNode.initWLlist(); + pceNode.initFrequenciesBitSet(); if (!pceNode.isValid()) { LOG.warn(" validateNode: Node is ignored"); diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java index 127fa26d8..35b1dee3b 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java @@ -8,6 +8,7 @@ package org.opendaylight.transportpce.pce.networkanalyzer; +import java.util.BitSet; import java.util.List; import java.util.Map; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; @@ -32,8 +33,6 @@ public interface PceNode { NodeId getNodeId(); - boolean checkWL(long index); - Map> getAvailableTribPorts(); Map> getAvailableTribSlots(); @@ -43,4 +42,10 @@ public interface PceNode { * @return the OpenROADM yang release supported by the node. */ String getVersion(); + + /** + * For optical node, the spectrumOccupation of the node. + * @return BitSet. + */ + BitSet getBitSetData(); } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java index 4afbf70f6..17000587b 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java @@ -9,6 +9,8 @@ package org.opendaylight.transportpce.pce.networkanalyzer; import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -37,24 +39,26 @@ public class PceOpticalNode implements PceNode { private NodeId nodeId; private OpenroadmNodeType nodeType; - // wavelength calculation per node type - private List availableWLindex = new ArrayList<>(); private Map availableSrgPp = new TreeMap<>(); private Map availableSrgCp = new TreeMap<>(); private List usedXpndrNWTps = new ArrayList<>(); private List outgoingLinks = new ArrayList<>(); private Map clientPerNwTp = new HashMap<>(); private final AvailFreqMapsKey freqMapKey = new AvailFreqMapsKey(GridConstant.C_BAND); + private BitSet frequenciesBitSet; private String version; public PceOpticalNode(Node node, OpenroadmNodeType nodeType, String version) { - if (node != null && node.getNodeId() != null && nodeType != null && version != null) { + if (node != null + && node.getNodeId() != null + && nodeType != null + && version != null) { this.node = node; this.nodeId = node.getNodeId(); this.nodeType = nodeType; this.version = version; } else { - LOG.error("PceNode: one of parameters is not populated : nodeId, node type, version"); + LOG.error("PceNode: one of parameters is not populated : nodeId, node type"); this.valid = false; } } @@ -96,9 +100,7 @@ public class PceOpticalNode implements PceNode { case SRGTXPP: case SRGTXRXPP: LOG.info("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue()); - if (nttp1 == null || nttp1.getPpAttributes() == null - || nttp1.getPpAttributes().getUsedWavelength() == null - || nttp1.getPpAttributes().getUsedWavelength().values().isEmpty()) { + if (isTerminationPointAvailable(nttp1)) { LOG.info("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue()); this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType()); } else { @@ -118,48 +120,52 @@ public class PceOpticalNode implements PceNode { this.availableSrgPp.size(), this.availableSrgCp.size(), this); } - public void initWLlist() { - this.availableWLindex.clear(); + private boolean isTerminationPointAvailable( + org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1 nttp1) { + byte[] availableByteArray = new byte[GridConstant.NB_OCTECTS]; + Arrays.fill(availableByteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE); + return nttp1 == null || nttp1.getPpAttributes() == null + || nttp1.getPpAttributes().getAvailFreqMaps() == null + || !nttp1.getPpAttributes().getAvailFreqMaps().containsKey(freqMapKey) + || nttp1.getPpAttributes().getAvailFreqMaps().get(freqMapKey).getFreqMap() == null + || Arrays.equals(nttp1.getPpAttributes().getAvailFreqMaps().get(freqMapKey).getFreqMap(), + availableByteArray); + } + + public void initFrequenciesBitSet() { if (!isValid()) { return; } Node1 node1 = this.node.augmentation(Node1.class); - byte[] freqMap; - switch (this.nodeType) { case SRG : if (!node1.getSrgAttributes().nonnullAvailFreqMaps().containsKey(freqMapKey)) { - LOG.error("initWLlist: SRG no cband available freq maps for node {}", this); + LOG.error("initFrequenciesBitSet: SRG no cband available freq maps for node {}", this); this.valid = false; return; } - freqMap = node1.getSrgAttributes().nonnullAvailFreqMaps().get(freqMapKey).getFreqMap(); - updateAvailableWlIndex(freqMap); + this.frequenciesBitSet = BitSet.valueOf(node1.getSrgAttributes() + .nonnullAvailFreqMaps().get(freqMapKey).getFreqMap()); break; case DEGREE : if (!node1.getDegreeAttributes().nonnullAvailFreqMaps().containsKey(freqMapKey)) { - LOG.error("initWLlist: DEG no cband available freq maps for node {}", this); + LOG.error("initFrequenciesBitSet: DEG no cband available freq maps for node {}", this); this.valid = false; return; } - freqMap = node1.getDegreeAttributes().nonnullAvailFreqMaps().get(freqMapKey).getFreqMap(); - updateAvailableWlIndex(freqMap); + this.frequenciesBitSet = BitSet.valueOf(node1.getDegreeAttributes() + .nonnullAvailFreqMaps().get(freqMapKey).getFreqMap()); break; case XPONDER : - // HARD CODED 96 - for (long i = 1; i <= GridConstant.NB_OCTECTS; i++) { - this.availableWLindex.add(i); - } + // at init all bits are set to false (unavailable) + this.frequenciesBitSet = new BitSet(GridConstant.EFFECTIVE_BITS); + //set all bits to true (available) + this.frequenciesBitSet.set(0, GridConstant.EFFECTIVE_BITS); break; default: - LOG.error("initWLlist: unsupported node type {} in node {}", this.nodeType, this); + LOG.error("initFrequenciesBitSet: unsupported node type {} in node {}", this.nodeType, this); break; } - if (this.availableWLindex.isEmpty()) { - LOG.debug("initWLlist: There are no available wavelengths in node {}", this); - this.valid = false; - } - LOG.debug("initWLlist: availableWLindex size = {} in {}", this.availableWLindex.size(), this); } public void initXndrTps(ServiceFormat serviceFormat) { @@ -287,11 +293,6 @@ public class PceOpticalNode implements PceNode { return !this.usedXpndrNWTps.contains(tp); } - @Override - public boolean checkWL(long index) { - return (this.availableWLindex.contains(index)); - } - public boolean isValid() { if (node == null || nodeId == null || nodeType == null || this.getSupNetworkNodeId() == null || this.getSupClliNodeId() == null) { @@ -351,24 +352,14 @@ public class PceOpticalNode implements PceNode { return null; } - /** - * Get available wave length from frequency map array. - * @param freqMap byte[] - */ - private void updateAvailableWlIndex(byte[] freqMap) { - if (freqMap == null) { - LOG.warn("No frequency map for node {}", node); - this.valid = false; - return; - } - long wlIndex = 1; - for (int i = 0; i < freqMap.length; i++) { - if (freqMap[i] == (byte)GridConstant.AVAILABLE_SLOT_VALUE) { - LOG.debug("Adding channel {} to available wave length index",wlIndex); - this.availableWLindex.add(wlIndex); - } - wlIndex++; - } + /* + * (non-Javadoc) + * + * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getBitSetData() + */ + @Override + public BitSet getBitSetData() { + return this.frequenciesBitSet; } /* @@ -380,4 +371,5 @@ public class PceOpticalNode implements PceNode { public String getVersion() { return this.version; } + } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java index 8442cedc6..931b621f8 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java @@ -9,6 +9,7 @@ package org.opendaylight.transportpce.pce.networkanalyzer; import java.util.ArrayList; +import java.util.BitSet; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -527,11 +528,6 @@ public class PceOtnNode implements PceNode { return false; } - @Override - public boolean checkWL(long index) { - return false; - } - /* * (non-Javadoc) * @@ -542,4 +538,10 @@ public class PceOtnNode implements PceNode { // TODO Auto-generated method stub return null; } + + @Override + public BitSet getBitSetData() { + // TODO Auto-generated method stub + return null; + } } diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java index e9b635020..c35b94b06 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java @@ -8,9 +8,11 @@ package org.opendaylight.transportpce.pce.networkanalyzer; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import org.opendaylight.transportpce.common.ResponseCodes; +import org.opendaylight.transportpce.common.fixedflex.GridConstant; import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat; 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; @@ -23,11 +25,13 @@ public class PceResult { private String calcMessage = "503 Calculator Unavailable"; private boolean calcStatus = false; private String responseCode = ResponseCodes.RESPONSE_FAILED; - private long resultWavelength = -1; + private long resultWavelength = GridConstant.IRRELEVANT_WAVELENGTH_NUMBER; private Map resultTribPort; private Map> resultTribSlot; private Integer resultTribSlotNb = -1; private String serviceType = ""; + private BigDecimal minFreq; + private BigDecimal maxFreq; // for now it is constant returned as received from A-end private long rate = -1; @@ -42,9 +46,6 @@ public class PceResult { private AToZDirection atozdirection = null; private ZToADirection ztoadirection = null; - public PceResult() { - } - public void setRC(String rc) { switch (rc) { case ResponseCodes.RESPONSE_OK : @@ -163,4 +164,36 @@ public class PceResult { this.serviceType = serviceType; } + /** + * Get the minimal frequency. + * @return the minFreq. + */ + public BigDecimal getMinFreq() { + return minFreq; + } + + /** + * Set the minimal frequency. + * @param minFreq the minFreq to set. + */ + public void setMinFreq(BigDecimal minFreq) { + this.minFreq = minFreq; + } + + /** + * Get the maximal frequency. + * @return the maxFreq. + */ + public BigDecimal getMaxFreq() { + return maxFreq; + } + + /** + * Set the maximal frequency. + * @param maxFreq the maxFreq to set. + */ + public void setMaxFreq(BigDecimal maxFreq) { + this.maxFreq = maxFreq; + } + } diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java index d132c9c79..9e8575717 100644 --- a/pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java +++ b/pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java @@ -58,15 +58,11 @@ public class PceGraphTest { .build(); pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); - pceOpticalNode.checkWL(1); - pceOpticalNode.checkWL(2); NodeId nodeId2 = new NodeId("OpenROADM-3-1-DEG1"); Node node2 = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes()) .setNodeId(nodeId2).withKey(new NodeKey(nodeId2)).build(); pceOpticalNode2 = new PceOpticalNode(node2, OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); - pceOpticalNode2.checkWL(1); - pceOpticalNode2.checkWL(2); pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2); pceLink.setClient("XPONDER-CLIENT"); @@ -103,7 +99,6 @@ public class PceGraphTest { @Test public void clacPath100GE() { - pceOpticalNode.checkWL(1); pceGraph = new PceGraph(pceOpticalNode, pceOpticalNode2, allPceNodes, pceHardConstraints, null, rc, diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java index af6018e02..ab7b3be0e 100644 --- a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java +++ b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java @@ -10,6 +10,7 @@ package org.opendaylight.transportpce.pce.networkanalyzer; import java.math.BigDecimal; import java.util.Arrays; +import java.util.BitSet; import java.util.HashMap; import java.util.Map; import org.junit.Assert; @@ -59,11 +60,14 @@ public class PceOpticalNodeTest extends AbstractTest { private PceOpticalNode pceOpticalNode; private Node node; + private BitSet usedBitSet = new BitSet(8); + private BitSet availableBitSet = new BitSet(8); @Before public void setUp() { NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP); node = node1Builder.setNodeId(new NodeId("test")).build(); + availableBitSet.set(0,8); } @Test @@ -80,9 +84,9 @@ public class PceOpticalNodeTest extends AbstractTest { OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); pceOpticalNode.initSrgTps(); pceOpticalNode.initXndrTps(ServiceFormat.OMS); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); Assert.assertNull(pceOpticalNode.getAvailableTribPorts()); Assert.assertNull(pceOpticalNode.getAvailableTribPorts()); @@ -95,9 +99,9 @@ public class PceOpticalNodeTest extends AbstractTest { Node specificNode = node1Builder.build(); pceOpticalNode = new PceOpticalNode(specificNode, OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); Assert.assertTrue(pceOpticalNode.isValid()); - Assert.assertTrue(pceOpticalNode.checkWL(12)); + Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96)); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -105,9 +109,9 @@ public class PceOpticalNodeTest extends AbstractTest { public void testInitXndrTpDegTypes() { pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); Assert.assertTrue(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertEquals(usedBitSet,pceOpticalNode.getBitSetData().get(88,96)); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -115,20 +119,20 @@ public class PceOpticalNodeTest extends AbstractTest { public void testInitXndrTpXpondrTypes() { pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); Assert.assertTrue(pceOpticalNode.isValid()); - Assert.assertTrue(pceOpticalNode.checkWL(12)); + Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96)); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @Test - public void testInitWLlist() { + public void testinitFrequenciesBitSet() { pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); pceOpticalNode.initXndrTps(ServiceFormat.OMS); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -139,7 +143,7 @@ public class PceOpticalNodeTest extends AbstractTest { pceOpticalNode.initSrgTps(); Assert.assertNull(pceOpticalNode.getRdmSrgClient("7")); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -150,11 +154,11 @@ public class PceOpticalNodeTest extends AbstractTest { pceOpticalNode = new PceOpticalNode(specificNode, OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); pceOpticalNode.initSrgTps(); - pceOpticalNode.initWLlist(); + pceOpticalNode.initFrequenciesBitSet(); pceOpticalNode.initXndrTps(ServiceFormat.OMS); Assert.assertNull(pceOpticalNode.getRdmSrgClient("7")); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -165,7 +169,7 @@ public class PceOpticalNodeTest extends AbstractTest { pceOpticalNode.initSrgTps(); Assert.assertNull(pceOpticalNode.getRdmSrgClient("7")); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @@ -177,7 +181,7 @@ public class PceOpticalNodeTest extends AbstractTest { OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1); pceOpticalNode.initSrgTps(); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); Assert.assertNull(pceOpticalNode.getRdmSrgClient("5")); } @@ -191,7 +195,7 @@ public class PceOpticalNodeTest extends AbstractTest { pceOpticalNode.initSrgTps(); Assert.assertNull(pceOpticalNode.getRdmSrgClient("2")); Assert.assertFalse(pceOpticalNode.isValid()); - Assert.assertFalse(pceOpticalNode.checkWL(12)); + Assert.assertNull(pceOpticalNode.getBitSetData()); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java index 7a3b58705..39311a901 100644 --- a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java +++ b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java @@ -76,7 +76,6 @@ public class PceOtnNodeTest extends AbstractTest { pceOtnNode.checkAvailableTribPort(); pceOtnNode.checkAvailableTribSlot(); Assert.assertTrue("valid otn service type " , pceOtnNode.isValid()); - Assert.assertFalse("checkWl returns by default false" , pceOtnNode.checkWL(5L)); Assert.assertNotNull("tpAvailableTribPort isn't null !" , pceOtnNode.getAvailableTribPorts()); } diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java index 522e34376..00ca6a1b8 100644 --- a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java +++ b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java @@ -44,9 +44,9 @@ public class PceResultTest extends AbstractTest { @Test public void waveLengthTest() { - Assert.assertEquals(pceResult.getResultWavelength(), -1); + Assert.assertEquals(0, pceResult.getResultWavelength()); pceResult.setResultWavelength(12); - Assert.assertEquals(pceResult.getResultWavelength(), 12); + Assert.assertEquals(12, pceResult.getResultWavelength()); } @Test diff --git a/tests/sample_configs/NW-for-test-5-4.xml b/tests/sample_configs/NW-for-test-5-4.xml index 1a1f1086a..53852252f 100644 --- a/tests/sample_configs/NW-for-test-5-4.xml +++ b/tests/sample_configs/NW-for-test-5-4.xml @@ -12,7 +12,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// s> @@ -30,7 +30,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -48,7 +48,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -63,7 +63,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -166,7 +166,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -184,7 +184,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -202,7 +202,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -217,7 +217,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -320,7 +320,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -338,7 +338,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -356,7 +356,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -371,7 +371,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -474,7 +474,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -492,7 +492,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -510,7 +510,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -525,7 +525,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -628,7 +628,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -646,7 +646,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -664,7 +664,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -679,7 +679,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -782,7 +782,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -800,7 +800,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -818,7 +818,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -833,7 +833,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -936,7 +936,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -954,7 +954,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -972,7 +972,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A > @@ -987,7 +987,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A > @@ -1090,7 +1090,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -1108,7 +1108,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -1126,7 +1126,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -1141,7 +1141,7 @@ 191.325 6.25 768 - AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A @@ -1244,7 +1244,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1262,7 +1262,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1280,7 +1280,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1295,7 +1295,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1398,7 +1398,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1416,7 +1416,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1434,7 +1434,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1449,7 +1449,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA > @@ -1552,7 +1552,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1570,7 +1570,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1588,7 +1588,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1603,7 +1603,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1706,7 +1706,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1724,7 +1724,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1742,7 +1742,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1757,7 +1757,7 @@ 191.325 6.25 768 - AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA @@ -1860,7 +1860,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -1878,7 +1878,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -1896,7 +1896,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -1911,7 +1911,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA > @@ -2014,7 +2014,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2032,7 +2032,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2050,7 +2050,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2065,7 +2065,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2168,7 +2168,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2186,7 +2186,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA > @@ -2204,7 +2204,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2219,7 +2219,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2322,7 +2322,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2340,7 +2340,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA s> @@ -2358,7 +2358,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2373,7 +2373,7 @@ 191.325 6.25 768 - AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA @@ -2476,7 +2476,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2494,7 +2494,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2512,7 +2512,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2527,7 +2527,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2630,7 +2630,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2648,7 +2648,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2666,7 +2666,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2681,7 +2681,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2784,7 +2784,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2802,7 +2802,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2820,7 +2820,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2835,7 +2835,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2938,7 +2938,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2956,7 +2956,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2974,7 +2974,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA @@ -2989,7 +2989,7 @@ 191.325 6.25 768 - AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA diff --git a/tests/sample_configs/NW-simple-topology.xml b/tests/sample_configs/NW-simple-topology.xml index 39f777b42..6519ff434 100644 --- a/tests/sample_configs/NW-simple-topology.xml +++ b/tests/sample_configs/NW-simple-topology.xml @@ -16,7 +16,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -38,7 +38,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -60,7 +60,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -75,7 +75,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -207,7 +207,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -229,7 +229,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -251,7 +251,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -266,7 +266,7 @@ 191.325 6.25 768 - /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// @@ -391,7 +391,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -413,7 +413,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -435,7 +435,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -450,7 +450,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -575,7 +575,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -597,7 +597,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -619,7 +619,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -634,7 +634,7 @@ 191.325 6.25 768 - AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA @@ -759,7 +759,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -781,7 +781,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -803,7 +803,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -818,7 +818,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -943,7 +943,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -965,7 +965,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -987,7 +987,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -1002,7 +1002,7 @@ 191.325 6.25 768 - AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA @@ -1127,7 +1127,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1149,7 +1149,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1171,7 +1171,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1186,7 +1186,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1311,7 +1311,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA s> @@ -1333,7 +1333,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1355,7 +1355,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1370,7 +1370,7 @@ 191.325 6.25 768 - AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA @@ -1495,7 +1495,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1517,7 +1517,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1539,7 +1539,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1554,7 +1554,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1679,7 +1679,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1701,7 +1701,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1723,7 +1723,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA @@ -1738,7 +1738,7 @@ 191.325 6.25 768 - AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA diff --git a/tests/sample_configs/gnpy/openroadmTopology.json b/tests/sample_configs/gnpy/openroadmTopology.json index 47835d8a4..d0347cd4a 100644 --- a/tests/sample_configs/gnpy/openroadmTopology.json +++ b/tests/sample_configs/gnpy/openroadmTopology.json @@ -1328,7 +1328,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1372,7 +1372,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1416,7 +1416,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1491,7 +1491,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1535,7 +1535,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1579,7 +1579,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1623,7 +1623,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1698,7 +1698,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1742,7 +1742,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1786,7 +1786,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1830,7 +1830,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1874,7 +1874,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1949,7 +1949,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -1993,7 +1993,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -2037,7 +2037,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -2112,7 +2112,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -2156,7 +2156,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -2200,7 +2200,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, @@ -2244,7 +2244,7 @@ "start-edge-freq": 191.325, "freq-map-granularity": 6.25, "effective-bits": 768, - "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////" } ] }, diff --git a/tests/transportpce_tests/1.2.1/test_end2end.py b/tests/transportpce_tests/1.2.1/test_end2end.py index 42bb94e55..ce1191068 100644 --- a/tests/transportpce_tests/1.2.1/test_end2end.py +++ b/tests/transportpce_tests/1.2.1/test_end2end.py @@ -17,8 +17,6 @@ import unittest import requests from common import test_utils -from common.flexgrid_utils import INDEX_1_USED_FREQ_MAP, INDEX_1_2_USED_FREQ_MAP, AVAILABLE_FREQ_MAP, check_freq_map - class TransportPCEFulltesting(unittest.TestCase): cr_serv_sample_data = {"input": { @@ -296,16 +294,13 @@ class TransportPCEFulltesting(unittest.TestCase): liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'XPDR1-NETWORK1': - self.assertEqual({u'frequency': 196.1, u'width': 40}, + self.assertEqual({u'frequency': 196.1, + u'width': 40}, ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']) - if ele['tp-id'] == 'XPDR1-CLIENT1' or ele['tp-id'] == 'XPDR1-CLIENT3': - self.assertNotIn( - 'org-openroadm-network-topology:xpdr-client-attributes', - dict.keys(ele)) + if ele['tp-id'] == 'XPDR1-CLIENT2' or ele['tp-id'] == 'XPDR1-CLIENT1': + self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele)) if ele['tp-id'] == 'XPDR1-NETWORK2': - self.assertNotIn( - 'org-openroadm-network-topology:xpdr-network-attributes', - dict.keys(ele)) + self.assertNotIn('org-openroadm-network-topology:xpdr-network-attributes', dict.keys(ele)) time.sleep(3) def test_16_check_topo_ROADMA_SRG1(self): @@ -315,16 +310,16 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, u'width': 40}, - ele['org-openroadm-network-topology:' - 'pp-attributes']['used-wavelength'] - ) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") if ele['tp-id'] == 'SRG1-PP2-TXRX': - self.assertNotIn('used-wavelength', dict.keys(ele)) + self.assertNotIn('avail-freq-maps', dict.keys(ele)) time.sleep(3) def test_17_check_topo_ROADMA_DEG1(self): @@ -334,20 +329,19 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: - if ele['tp-id'] == 'DEG1-CTP-TXRX': - self.assertIn({u'map-name': 'cband', u'freq-map-granularity': 6.25, u'start-edge-freq': 191.325, - u'effective-bits': 768, u'freq-map': INDEX_1_USED_FREQ_MAP}, - ele['org-openroadm-network-topology:' - 'ctp-attributes'][ - 'avail-freq-maps']) - if ele['tp-id'] == 'DEG1-TTP-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, u'width': 40}, - ele['org-openroadm-network-topology:' - 'tx-ttp-attributes'][ - 'used-wavelengths']) + if ele['tp-id'] == 'DEG2-CTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + if ele['tp-id'] == 'DEG2-TTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") time.sleep(3) def test_18_connect_xprdA_N2_to_roadmA_PP2(self): @@ -438,20 +432,15 @@ class TransportPCEFulltesting(unittest.TestCase): liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'XPDR1-NETWORK1': - self.assertEqual({u'frequency': 196.1, u'width': 40}, - ele['org-openroadm-network-topology:' - 'xpdr-network-attributes'][ - 'wavelength']) + self.assertEqual({u'frequency': 196.1, + u'width': 40}, + ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']) if ele['tp-id'] == 'XPDR1-NETWORK2': - self.assertEqual({u'frequency': 196.05, u'width': 40}, - ele['org-openroadm-network-topology:' - 'xpdr-network-attributes'][ - 'wavelength']) - if ele['tp-id'] == 'XPDR1-CLIENT1' or \ - ele['tp-id'] == 'XPDR1-CLIENT3': - self.assertNotIn( - 'org-openroadm-network-topology:xpdr-client-attributes', - dict.keys(ele)) + self.assertEqual({u'frequency': 196.05, + u'width': 40}, + ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']) + if ele['tp-id'] == 'XPDR1-CLIENT1' or ele['tp-id'] == 'XPDR1-CLIENT2': + self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele)) time.sleep(10) def test_26_check_topo_ROADMA_SRG1(self): @@ -461,29 +450,24 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") - self.assertEqual(freq_map_array[1], 0, "Index 2 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, u'width': 40}, - ele['org-openroadm-network-topology:' - 'pp-attributes']['used-wavelength']) - self.assertNotIn({u'index': 2, u'frequency': 196.05, - u'width': 40}, - ele['org-openroadm-network-topology:' - 'pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") if ele['tp-id'] == 'SRG1-PP2-TXRX': - self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40}, - ele['org-openroadm-network-topology:' - 'pp-attributes']['used-wavelength']) - self.assertNotIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:' - 'pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") if ele['tp-id'] == 'SRG1-PP3-TXRX': - self.assertNotIn('org-openroadm-network-topology:pp-attributes', - dict.keys(ele)) + self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) time.sleep(10) def test_27_check_topo_ROADMA_DEG1(self): @@ -493,23 +477,22 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") - self.assertEqual(freq_map_array[1], 0, "Index 2 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: - if ele['tp-id'] == 'DEG1-CTP-TXRX': - self.assertIn({u'map-name': 'cband', u'freq-map-granularity': 6.25, u'start-edge-freq': 191.325, - u'effective-bits': 768, u'freq-map': INDEX_1_2_USED_FREQ_MAP}, - ele['org-openroadm-network-topology:' - 'ctp-attributes'][ - 'avail-freq-maps']) - if ele['tp-id'] == 'DEG1-TTP-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, u'width': 40}, - ele['org-openroadm-network-topology:' - 'tx-ttp-attributes']['used-wavelengths']) - self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40}, - ele['org-openroadm-network-topology:' - 'tx-ttp-attributes']['used-wavelengths']) + if ele['tp-id'] == 'DEG2-CTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") + if ele['tp-id'] == 'DEG2-TTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") time.sleep(10) # creation service test on a non-available resource @@ -594,10 +577,25 @@ class TransportPCEFulltesting(unittest.TestCase): res = response.json() freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) - self.assertTrue(check_freq_map(freq_map), "Index 1 and 2 should be available") + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: - self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) + if ele['tp-id'] == 'SRG1-PP1-TXRX' or ele['tp-id'] == 'SRG1-PP2-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") + elif ele['tp-id'] == 'SRG1-CP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:cp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") + else: + self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) time.sleep(10) def test_35_check_topo_ROADMA_DEG1(self): @@ -606,15 +604,23 @@ class TransportPCEFulltesting(unittest.TestCase): res = response.json() freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) - self.assertTrue(check_freq_map(freq_map), "Index 1 and 2 should be available") + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: - if ele['tp-id'] == 'DEG1-CTP-TXRX': - self.assertEqual(ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map'], - AVAILABLE_FREQ_MAP) - if ele['tp-id'] == 'DEG1-TTP-TXRX': - self.assertNotIn('org-openroadm-network-topology:' - 'tx-ttp-attributes', dict.keys(ele)) + if ele['tp-id'] == 'DEG2-CTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") + if ele['tp-id'] == 'DEG2-TTP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") time.sleep(10) # test service-create for Optical Channel (OC) service from srg-pp to srg-pp diff --git a/tests/transportpce_tests/2.2.1/test_end2end.py b/tests/transportpce_tests/2.2.1/test_end2end.py index a0a2f2b37..859d3e92a 100644 --- a/tests/transportpce_tests/2.2.1/test_end2end.py +++ b/tests/transportpce_tests/2.2.1/test_end2end.py @@ -15,7 +15,6 @@ import unittest import time import requests from common import test_utils -from common.flexgrid_utils import INDEX_1_USED_FREQ_MAP, INDEX_1_2_USED_FREQ_MAP, AVAILABLE_FREQ_MAP, check_freq_map class TransportPCEFulltesting(unittest.TestCase): @@ -294,15 +293,16 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available") if ele['tp-id'] == 'SRG1-PP2-TXRX': - self.assertNotIn('used-wavelength', dict.keys(ele)) + self.assertNotIn('avail-freq-maps', dict.keys(ele)) time.sleep(3) def test_17_check_topo_ROADMA_DEG1(self): @@ -312,19 +312,19 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'DEG2-CTP-TXRX': - self.assertIn({u'map-name': 'cband', u'freq-map-granularity': 6.25, u'start-edge-freq': 191.325, - u'effective-bits': 768, u'freq-map': INDEX_1_USED_FREQ_MAP}, - ele['org-openroadm-network-topology:' - 'ctp-attributes'][ - 'avail-freq-maps']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available") if ele['tp-id'] == 'DEG2-TTP-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available") time.sleep(3) def test_18_connect_xprdA_N2_to_roadmA_PP2(self): @@ -427,23 +427,22 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") - self.assertEqual(freq_map_array[1], 0, "Index 2 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) - self.assertNotIn({u'index': 2, u'frequency': 196.05, - u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") if ele['tp-id'] == 'SRG1-PP2-TXRX': - self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) - self.assertNotIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") if ele['tp-id'] == 'SRG1-PP3-TXRX': self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) time.sleep(10) @@ -455,22 +454,22 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") - self.assertEqual(freq_map_array[1], 0, "Index 2 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'DEG2-CTP-TXRX': - self.assertIn({u'map-name': 'cband', u'freq-map-granularity': 6.25, u'start-edge-freq': 191.325, - u'effective-bits': 768, u'freq-map': INDEX_1_2_USED_FREQ_MAP}, - ele['org-openroadm-network-topology:' - 'ctp-attributes'][ - 'avail-freq-maps']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") if ele['tp-id'] == 'DEG2-TTP-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths']) - self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40}, - ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") + self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available") time.sleep(10) # creation service test on a non-available resource @@ -539,12 +538,22 @@ class TransportPCEFulltesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 255, "Index 1 should be available") - self.assertEqual(freq_map_array[1], 255, "Index 2 should be available") + self.assertEqual(freq_map_array[95], 255, "Index 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Index 2 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: - if ele['tp-id'] == 'SRG1-PP1-TXRX' or ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) + if ele['tp-id'] == 'SRG1-PP1-TXRX' or ele['tp-id'] == 'SRG1-PP2-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Index 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Index 2 should be available") + elif ele['tp-id'] == 'SRG1-CP-TXRX': + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:cp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Index 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Index 2 should be available") else: self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele)) time.sleep(10) @@ -555,14 +564,23 @@ class TransportPCEFulltesting(unittest.TestCase): res = response.json() freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) - self.assertTrue(check_freq_map(freq_map), "Index 1 and 2 should be available") + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'DEG2-CTP-TXRX': - self.assertEqual(ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map'], - AVAILABLE_FREQ_MAP) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") if ele['tp-id'] == 'DEG2-TTP-TXRX': - self.assertNotIn('org-openroadm-network-topology:tx-ttp-attributes', dict.keys(ele)) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") + self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available") time.sleep(10) # test service-create for Optical Channel (OC) service from srg-pp to srg-pp diff --git a/tests/transportpce_tests/2.2.1/test_otn_end2end.py b/tests/transportpce_tests/2.2.1/test_otn_end2end.py index b6b6533a7..7b0a5db01 100644 --- a/tests/transportpce_tests/2.2.1/test_otn_end2end.py +++ b/tests/transportpce_tests/2.2.1/test_otn_end2end.py @@ -17,7 +17,6 @@ import unittest import time import requests from common import test_utils -from common.flexgrid_utils import INDEX_1_USED_FREQ_MAP, INDEX_1_2_USED_FREQ_MAP, AVAILABLE_FREQ_MAP class TransportPCEtesting(unittest.TestCase): @@ -379,15 +378,16 @@ class TransportPCEtesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:pp-attributes']['used-wavelength']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") if ele['tp-id'] == 'SRG1-PP2-TXRX': - self.assertNotIn('used-wavelength', dict.keys(ele)) + self.assertNotIn('avail-freq-maps', dict.keys(ele)) time.sleep(3) def test_21_check_openroadm_topo_ROADMA_DEG(self): @@ -397,17 +397,19 @@ class TransportPCEtesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 0, "Index 1 should not be available") + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'DEG2-CTP-TXRX': - self.assertIn({u'map-name': 'cband', u'freq-map-granularity': 6.25, u'start-edge-freq': 191.325, - u'effective-bits': 768, u'freq-map': INDEX_1_USED_FREQ_MAP}, - ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") if ele['tp-id'] == 'DEG2-TTP-TXRX': - self.assertIn({u'index': 1, u'frequency': 196.1, - u'width': 40}, - ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths']) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available") time.sleep(3) def test_22_check_otn_topo_otu4_links(self): @@ -971,31 +973,36 @@ class TransportPCEtesting(unittest.TestCase): freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 255, "Index 1 should be available") + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'SRG1-PP1-TXRX': - self.assertNotIn( - 'org-openroadm-network-topology:pp-attributes', dict.keys(ele)) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") time.sleep(3) def test_61_check_openroadm_topo_ROADMA_DEG(self): response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2") self.assertEqual(response.status_code, requests.codes.ok) res = response.json() - print(res) freq_map = base64.b64decode( res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map']) freq_map_array = [int(x) for x in freq_map] - self.assertEqual(freq_map_array[0], 255, "Index 1 should be available") + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") liste_tp = res['node'][0]['ietf-network-topology:termination-point'] for ele in liste_tp: if ele['tp-id'] == 'DEG2-CTP-TXRX': - self.assertEqual(ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map'], - AVAILABLE_FREQ_MAP) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:ctp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") if ele['tp-id'] == 'DEG2-TTP-TXRX': - self.assertNotIn( - 'org-openroadm-network-topology:tx-ttp-attributes', dict.keys(ele)) + freq_map = base64.b64decode( + ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map']) + freq_map_array = [int(x) for x in freq_map] + self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available") time.sleep(3) def test_62_connect_sprdA_3_N1_to_roadmA_PP2(self): diff --git a/tests/transportpce_tests/common/flexgrid_utils.py b/tests/transportpce_tests/common/flexgrid_utils.py deleted file mode 100644 index f7cff9734..000000000 --- a/tests/transportpce_tests/common/flexgrid_utils.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -############################################################################## -# Copyright (c) 2020 Orange, Inc. and others. All rights reserved. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# pylint: disable=no-member - -import base64 - -def check_freq_map(freq_map): - freq_map_array = [int(x) for x in freq_map] - return freq_map_array[0] == 255 and freq_map_array[1] == 255 - - -def set_used_index_for_freq_map(freq_map, index): - freq_map[index] = 0 - return freq_map - - -INDEX_1_USED_FREQ_MAP = base64.b64encode(set_used_index_for_freq_map(bytearray(b'\xFF' * 96), 0)).decode('UTF-8') - -INDEX_1_2_USED_FREQ_MAP = base64.b64encode(set_used_index_for_freq_map( - set_used_index_for_freq_map(bytearray(b'\xFF' * 96), 0), 1)).decode('utf-8') - -AVAILABLE_FREQ_MAP = base64.b64encode(bytearray(b'\xFF' * 96)).decode('UTF-8') -- 2.36.6