Flexgrid for pce and network model 56/94556/7
authormanuedelf <emmanuelle.delfour@orange.com>
Tue, 8 Dec 2020 17:41:21 +0000 (18:41 +0100)
committermanuedelf <emmanuelle.delfour@orange.com>
Sat, 9 Jan 2021 14:41:35 +0000 (15:41 +0100)
- 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 <emmanuelle.delfour@orange.com>
Change-Id: Ie22761e535e0669f614ac18ea801b5dac75dd362

33 files changed:
common/src/main/java/org/opendaylight/transportpce/common/ServiceRateConstant.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java
common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java
common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java [deleted file]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java [deleted file]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceTest.java [new file with mode: 0644]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java [deleted file]
networkmodel/src/test/resources/openroadm-topology.xml [new file with mode: 0644]
networkmodel/src/test/resources/path_description.json [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java
pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java
tests/sample_configs/NW-for-test-5-4.xml
tests/sample_configs/NW-simple-topology.xml
tests/sample_configs/gnpy/openroadmTopology.json
tests/transportpce_tests/1.2.1/test_end2end.py
tests/transportpce_tests/2.2.1/test_end2end.py
tests/transportpce_tests/2.2.1/test_otn_end2end.py
tests/transportpce_tests/common/flexgrid_utils.py [deleted file]

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 (file)
index 0000000..80fa03a
--- /dev/null
@@ -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() {
+    }
+}
index 5bff0189fe10a44c8d69532d5a98092e4ef33825..5b90e2a240d28f0fa86229ca59678fc009243878 100644 (file)
@@ -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<String, Integer> 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<Uint32, ModulationFormat> 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<Uint32, ModulationFormat, String> FREQUENCY_WIDTH_TABLE = initFrequencyWidthTable();
+
+    public static final long IRRELEVANT_WAVELENGTH_NUMBER = 0;
 
     private GridConstant() {
     }
+
+    private static Table<Uint32, ModulationFormat, String> initFrequencyWidthTable() {
+        Table<Uint32, ModulationFormat, String> 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;
+    }
 }
index a8251c9832fdaf45705b7fb922b9cd7c9e4ca306..a3d13b22b918a223e9488b1612a1730f5c26c689 100644 (file)
@@ -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)));
+
+    }
+
 }
index 8e485bb192b3a4ef87a212d8c7e7dca455e5f790..3e7ed5835d8d8e3636a799d4f3947b031ae6103d 100644 (file)
@@ -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)));
+    }
 }
index a193e3dfdfff1cdd4c0f0d6db5ea9816e31c459c..5f588a09de9c6afb85297e458bc1c42671493015 100644 (file)
@@ -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());
         }
     }
 
index 777bfe4dad139749c5c49b7857e4d0a96fa9c8c1..e7d42fd9cb7563b81acfd71e7d18493e1ed712b9 100644 (file)
@@ -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);
 
 }
index aa9e79ce356f40f7f623b4b35ed09698673c14d9..775ba53b5f1a496d13a3c2c68214faeac574ec5f 100644 (file)
@@ -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<NodeIdPair> atozTpIds = getAToZTpList(atoZDirection);
-            atozTpIds.removeIf(Objects::isNull);
-            deleteAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
-                    atoZDirection.getAToZWavelengthNumber().toJava());
-            addUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds);
-        }
-        if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) {
-            LOG.info("Update wavelength for z to a direction {}", ztoADirection);
-            List<NodeIdPair> ztoaTpIds = getZToATpList(ztoADirection);
-            ztoaTpIds.removeIf(Objects::isNull);
-            deleteAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
-                    ztoADirection.getZToAWavelengthNumber().toJava());
-
-            addUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds);
-        }
+    public void allocateFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection) {
+        updateFrequencies(atoZDirection, ztoADirection, true);
     }
 
 
     @Override
-    public void freeWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection) {
-        if (atoZDirection != null && atoZDirection.getAToZWavelengthNumber() != null) {
-            LOG.info("Free wavelength for a to z direction {}", atoZDirection);
+    public void releaseFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection) {
+        updateFrequencies(atoZDirection, ztoADirection, false);
+    }
+
+    /**
+     * Update frequency map for nodes and tp in atozDirection and ztoadirection.
+     * @param atoZDirection AToZDirection
+     * @param ztoADirection ZToADirection
+     * @param used used boolean true if frequencies are used, false otherwise.
+     */
+    private void updateFrequencies(AToZDirection atoZDirection, ZToADirection ztoADirection, boolean used) {
+        if (atoZDirection != null && atoZDirection.getAToZMinFrequency() != null) {
+            LOG.info("Update frequencies for a to z direction {}, used {}", atoZDirection, used);
             List<NodeIdPair> atozTpIds = getAToZTpList(atoZDirection);
-            atozTpIds.removeIf(Objects::isNull);
-            deleteUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds);
-            addAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
-                    atoZDirection.getAToZWavelengthNumber().toJava());
+            BigDecimal atozMinFrequency = atoZDirection.getAToZMinFrequency().getValue();
+            BigDecimal atozMaxFrequency = atoZDirection.getAToZMaxFrequency().getValue();
+            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
+                    .forName(atoZDirection.getModulationFormat());
+            if (!optionalModulationFormat.isPresent()) {
+                LOG.error("Unknown modulation format {} for a to z direction, frequencies not updated",
+                        atoZDirection.getModulationFormat());
+                return;
+            }
+            setFrequencies4Tps(atozMinFrequency, atozMaxFrequency, atoZDirection.getRate(),
+                    optionalModulationFormat.get(), atozTpIds, used);
+            setFrequencies4Nodes(atozMinFrequency,
+                    atozMaxFrequency,
+                    atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
+                    used);
         }
-        if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) {
-            LOG.info("Free wavelength for z to a direction {}", ztoADirection);
+        if (ztoADirection != null && ztoADirection.getZToAMinFrequency() != null) {
+            LOG.info("Update frequencies for z to a direction {}, used {}", ztoADirection, used);
             List<NodeIdPair> ztoaTpIds = getZToATpList(ztoADirection);
-            ztoaTpIds.removeIf(Objects::isNull);
-            deleteUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds);
-            addAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
-                    ztoADirection.getZToAWavelengthNumber().toJava());
+            BigDecimal ztoaMinFrequency = ztoADirection.getZToAMinFrequency().getValue();
+            BigDecimal ztoaMaxFrequency = ztoADirection.getZToAMaxFrequency().getValue();
+            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
+                    .forName(ztoADirection.getModulationFormat());
+            if (!optionalModulationFormat.isPresent()) {
+                LOG.error("Unknown modulation format {} for z to a direction, frequencies not updated",
+                        ztoADirection.getModulationFormat());
+                return;
+            }
+            setFrequencies4Tps(ztoaMinFrequency, ztoaMaxFrequency, ztoADirection.getRate(),
+                    optionalModulationFormat.get(), ztoaTpIds, used);
+            setFrequencies4Nodes(ztoaMinFrequency,
+                    ztoaMaxFrequency,
+                    ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
+                    used);
         }
     }
 
-    private List<NodeIdPair> getAToZTpList(AToZDirection atoZDirection) {
-        Collection<AToZ> atozList = atoZDirection.nonnullAToZ().values();
-        return atozList.stream()
-                .filter(aToZ -> {
-                    if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) {
-                        LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId());
-                        return false;
-                    }
-                    return aToZ.getResource().getResource() instanceof TerminationPoint;
-                }).map(aToZ -> {
-                    TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource();
-                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
-                        || tp.getTpId().isEmpty()) {
-                        LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId());
-                        return null;
-                    }
-                    return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
-                }).collect(Collectors.toList());
-    }
-
-    private List<NodeIdPair> getZToATpList(ZToADirection ztoADirection) {
-        Collection<ZToA> ztoaList = ztoADirection.nonnullZToA().values();
-        return ztoaList.stream()
-                .filter(zToA -> {
-                    if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) {
-                        LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId());
-                        return false;
-                    }
-                    return zToA.getResource().getResource() instanceof TerminationPoint;
-                }).map(zToA -> {
-                    TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource();
-                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
-                        || tp.getTpId().isEmpty()) {
-                        LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId());
-                        return null;
-                    }
-                    return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
-                }).collect(Collectors.toList());
-    }
-
-    private InstanceIdentifier<Node1> createNode1IID(String nodeId) {
-        return InstanceIdentifier
-                .builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
-                        .networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
-                .augmentation(Node1.class).build();
-    }
-
-    private InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .Node1> createNode2IID(String nodeId) {
-        return InstanceIdentifier
-                .builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
-                        .networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
-                .build();
-    }
-
-    private Optional<Node1> getNode1FromDatastore(String nodeId) {
-        InstanceIdentifier<Node1>
-                nodeIID = createNode1IID(nodeId);
-        Optional<Node1> nodeOpt;
+    /**
+     * Get network node with nodeId from datastore.
+     * @param nodeId String
+     * @return Node1, null otherwise.
+     */
+    private Node1 getNetworkNodeFromDatastore(String nodeId) {
+        InstanceIdentifier<Node1> nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId);
         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
-            nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
+            Optional<Node1> optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e);
-            nodeOpt = Optional.empty();
+            if (optionalNode.isPresent()) {
+                return optionalNode.get();
+            } else {
+                LOG.error("Unable to get network node for node id {}from topology {}", nodeId,
+                        NetworkUtils.OVERLAY_NETWORK_ID);
+                return null;
+            }
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.warn("Exception while getting network node for node id {} from {} topology", nodeId,
+                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        } catch (InterruptedException e) {
+            LOG.warn("Getting network node for node id {} from {} topology was interrupted", nodeId,
+                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            Thread.currentThread().interrupt();
+            return null;
         }
-        return nodeOpt;
     }
 
-    private Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .Node1> getNode2FromDatastore(String nodeId) {
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1>
-                nodeIID = createNode2IID(nodeId);
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> nodeOpt;
+    /**
+     * Get common network node with nodeId from datastore.
+     * @param nodeId String
+     * @return Node1, null otherwise.
+     */
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1
+        getCommonNetworkNodeFromDatastore(String nodeId) {
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> nodeIID =
+                OpenRoadmTopology.createCommonNetworkNodeIID(nodeId);
         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
-            nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> optionalNode =
+                    nodeReadTx
+                    .read(LogicalDatastoreType.CONFIGURATION, nodeIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e);
-            nodeOpt = Optional.empty();
+            if (optionalNode.isPresent()) {
+                return optionalNode.get();
+            } else {
+                LOG.error("Unable to get common network node for node id {} from topology {}", nodeId,
+                        NetworkUtils.OVERLAY_NETWORK_ID);
+                return null;
+            }
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.warn("Exception while getting common network node for node id {} from {} topology", nodeId,
+                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        } catch (InterruptedException e) {
+            LOG.warn("Getting common network node for node id {} from {} topology was interrupted", nodeId,
+                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            Thread.currentThread().interrupt();
+            return null;
         }
-        return nodeOpt;
-    }
-
-    private void addAvailableWL(List<String> nodeIds, Long wavelengthNumber) {
-        updateFreqMaps4Nodes(nodeIds, wavelengthNumber, true);
     }
 
-    private void deleteAvailableWL(List<String> nodeIds, Long wavelengthNumber) {
-        updateFreqMaps4Nodes(nodeIds, wavelengthNumber, false);
-    }
-
-    private InstanceIdentifierBuilder<TerminationPoint1> createTerminationPoint1IIDBuilder(String nodeId, String tpId) {
-        return InstanceIdentifier
-                .builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
-                        .networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
-                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                        .Node1.class)
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                        .networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-                .augmentation(TerminationPoint1.class);
+    /**
+     * Set frequency map for nodes in nodeIds.
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param nodeIds List of node id
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     */
+    private void setFrequencies4Nodes(BigDecimal minFrequency, BigDecimal maxFrequency,
+            List<String> nodeIds, boolean used) {
+        updateFreqMaps4Nodes(nodeIds, minFrequency, maxFrequency, used);
     }
 
-    private InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .TerminationPoint1> createTerminationPoint2IIDBuilder(String nodeId, String tpId) {
-        return InstanceIdentifier
-                .builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
-                        .networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
-                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                        .Node1.class)
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                        .networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-                    .TerminationPoint1.class);
-    }
 
-    private Optional<TerminationPoint1> getTerminationPoint1FromDatastore(String nodeId, String tpId) {
-        InstanceIdentifier<TerminationPoint1> tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build();
-        Optional<TerminationPoint1> tpOpt;
+    /**
+     * Get a network termination point for nodeId and tpId.
+     * @param nodeId String
+     * @param tpId String
+     * @return network termination point, null otherwise
+     */
+    private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
+        InstanceIdentifier<TerminationPoint1> tpIID = OpenRoadmTopology
+                .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
-            tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
+            Optional<TerminationPoint1> optionalTerminationPoint = readTx
+                    .read(LogicalDatastoreType.CONFIGURATION, tpIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting termination point from {} topology!",
+            if (optionalTerminationPoint.isPresent()) {
+                return optionalTerminationPoint.get();
+            } else {
+                return null;
+            }
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.warn("Exception while getting termination {} for node id {} point from {} topology", tpId, nodeId,
+                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        } catch (InterruptedException e) {
+            LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted", tpId, nodeId,
                     NetworkUtils.OVERLAY_NETWORK_ID, e);
-            tpOpt = Optional.empty();
+            Thread.currentThread().interrupt();
+            return null;
         }
-        return tpOpt;
     }
 
-    private Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .TerminationPoint1> getTerminationPoint2FromDatastore(String nodeId, String tpId) {
+    /**
+     * Get a common network termination point for nodeId and tpId.
+     * @param nodeId String
+     * @param tpId String
+     * @return common network termination point, null otherwise
+     */
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1
+        getCommonNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
-            tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build();
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1> tpOpt;
+            tpIID = OpenRoadmTopology.createCommonNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
-            tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
+                optionalTerminationPoint = readTx
+                    .read(LogicalDatastoreType.CONFIGURATION, tpIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting termination point from {} topology!",
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
-            tpOpt = Optional.empty();
+            if (optionalTerminationPoint.isPresent()) {
+                return optionalTerminationPoint.get();
+            } else {
+                LOG.error("Unable to get common-network termination point {} for node id {}from topology {}", tpId,
+                        nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
+                return null;
+            }
+
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.warn("Exception while getting common-network termination {} for node id {} point from {} topology",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        } catch (InterruptedException e) {
+            LOG.warn("Getting common-network termination {} for node id {} point from {} topology was interrupted",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
+            Thread.currentThread().interrupt();
+            return null;
         }
-        return tpOpt;
     }
 
-    private void deleteUsedWL(long wavelengthIndex, List<NodeIdPair> tpIds) {
-        WriteTransaction deleteUsedWlTx = this.dataBroker.newWriteOnlyTransaction();
+    /**
+     * Update availFreqMapsMap for min and max frequencies for termination point in tpIds.
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param rate Uint32
+     * @param modulationFormat ModulationFormat
+     * @param tpIds List of NodeIdPair
+     * @param sed boolean true if min and max frequencies are used, false otherwise.
+     */
+    private void setFrequencies4Tps(BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate,
+            ModulationFormat modulationFormat, List<NodeIdPair> tpIds, boolean used) {
+        String strTpIdsList = String.join(", ", tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList()));
+        LOG.debug("Update frequencies for termination points {}, rate {}, modulation format {},"
+                + "min frequency {}, max frequency {}, used {}", strTpIdsList, rate, modulationFormat,
+                minFrequency, maxFrequency, used);
+        WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction();
         for (NodeIdPair idPair : tpIds) {
-            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
-                tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID());
-
-            OpenroadmTpType tpType;
-            if (!tp2Opt.isPresent()) {
-                LOG.error("Unable to get termination point {} from topology {}! Skipping removal of used wavelength"
-                        + " for this node.", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID);
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1
+                commonNetworkTerminationPoint = getCommonNetworkTerminationPointFromDatastore(idPair.getNodeID(),
+                    idPair.getTpID());
+            if (commonNetworkTerminationPoint == null) {
+                LOG.warn("Cannot update frequencies for termination point {}, node id {}", idPair.getTpID(),
+                        idPair.getNodeID());
                 continue;
             }
-            tpType = tp2Opt.get().getTpType();
-            Optional<TerminationPoint1> tp1Opt =
-                getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID());
-            InstanceIdentifier.InstanceIdentifierBuilder<TerminationPoint1> usedWlIIDBuilder =
-                    createTerminationPoint1IIDBuilder(idPair.getNodeID(), idPair.getTpID());
-            switch (tpType) {
+            TerminationPoint1 networkTerminationPoint =
+                    getNetworkTerminationPointFromDatastore(idPair.getNodeID(), idPair.getTpID());
+            TerminationPoint1Builder networkTerminationPointBuilder;
+            if (networkTerminationPoint != null) {
+                networkTerminationPointBuilder = new TerminationPoint1Builder(networkTerminationPoint);
+            } else {
+                networkTerminationPointBuilder = new TerminationPoint1Builder();
+            }
+            switch (commonNetworkTerminationPoint.getTpType()) {
                 case DEGREETXTTP:
                 case DEGREETXRXTTP:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(TxTtpAttributes.class).child(UsedWavelengths.class,
-                                    new UsedWavelengthsKey((int)wavelengthIndex)).build());
+                    networkTerminationPointBuilder.setTxTtpAttributes(updateTxTtpAttributes(networkTerminationPoint,
+                            minFrequency,maxFrequency,used));
                     break;
-
                 case DEGREERXTTP:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(RxTtpAttributes.class).child(UsedWavelengths.class,
-                                    new UsedWavelengthsKey((int)wavelengthIndex)).build());
+                    networkTerminationPointBuilder.setRxTtpAttributes(updateRxTtpAttributes(networkTerminationPoint,
+                            minFrequency,maxFrequency,used));
                     break;
-
                 case DEGREETXCTP:
                 case DEGREERXCTP:
                 case DEGREETXRXCTP:
-                    if (tp1Opt.isPresent()) {
-                        TerminationPoint1 tp1 = tp1Opt.get();
-                        TerminationPoint1Builder tp1Builder = new TerminationPoint1Builder(tp1);
-                        CtpAttributesBuilder ctpAttributesBuilder;
-                        if (tp1Builder.getCtpAttributes() != null) {
-                            ctpAttributesBuilder = new CtpAttributesBuilder(tp1Builder.getCtpAttributes());
-                            Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = tp1Builder.getCtpAttributes()
-                                    .nonnullAvailFreqMaps();
-                            ctpAttributesBuilder
-                                    .setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, true));
-                            deleteUsedWlTx.merge(LogicalDatastoreType.CONFIGURATION,
-                                    createTerminationPoint1IIDBuilder(idPair.getNodeID(),
-                                            idPair.getTpID()).build(), tp1Builder.build());
-                        }
-                    }
+                    networkTerminationPointBuilder.setCtpAttributes(updateCtpAttributes(networkTerminationPoint,
+                            minFrequency,maxFrequency,used));
                     break;
-
                 case SRGTXCP:
                 case SRGRXCP:
                 case SRGTXRXCP:
-                    if (tp1Opt.isPresent()) {
-                        TerminationPoint1 tp1 = tp1Opt.get();
-                        TerminationPoint1Builder tp1Builder = new TerminationPoint1Builder(tp1);
-                        CpAttributesBuilder cpAttributesBuilder;
-                        if (tp1Builder.getCpAttributes() != null) {
-                            cpAttributesBuilder = new CpAttributesBuilder(tp1Builder.getCpAttributes());
-                            Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = tp1Builder.getCpAttributes()
-                                    .nonnullAvailFreqMaps();
-                            cpAttributesBuilder
-                                    .setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, true));
-                            deleteUsedWlTx.merge(LogicalDatastoreType.CONFIGURATION,
-                                    createTerminationPoint1IIDBuilder(idPair.getNodeID(),
-                                            idPair.getTpID()).build(), tp1Builder.build());
-                        }
-                    }
+                    networkTerminationPointBuilder.setCpAttributes(updateCpAttributes(networkTerminationPoint,
+                            minFrequency,maxFrequency,used));
                     break;
-
                 case SRGTXRXPP:
                 case SRGRXPP:
                 case SRGTXPP:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(PpAttributes.class).child(UsedWavelength.class,
-                                    new UsedWavelengthKey((int)wavelengthIndex)).build());
+                    networkTerminationPointBuilder.setPpAttributes(updatePpAttributes(networkTerminationPoint,
+                            minFrequency,maxFrequency,used));
                     break;
-
                 case XPONDERNETWORK:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(XpdrNetworkAttributes.class).child(Wavelength.class).build());
+                    networkTerminationPointBuilder.setXpdrNetworkAttributes(
+                            updateXpdrNetworkAttributes(networkTerminationPoint,
+                                    minFrequency, maxFrequency, rate, modulationFormat, used)).build();
                     break;
                 case XPONDERCLIENT:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(XpdrClientAttributes.class).child(Wavelength.class).build());
                     break;
                 case XPONDERPORT:
-                    deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION,
-                            usedWlIIDBuilder.child(XpdrPortAttributes.class).child(Wavelength.class).build());
+                    networkTerminationPointBuilder.setXpdrPortAttributes(
+                            updateXpdrPortAttributes(networkTerminationPoint,
+                                    minFrequency, maxFrequency, rate, modulationFormat, used)).build();
                     break;
-
                 default:
-                    break;
+                    LOG.warn("Termination point type {} not managed", commonNetworkTerminationPoint.getTpType());
+                    return;
             }
+            updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION, OpenRoadmTopology
+                    .createNetworkTerminationPointIIDBuilder(idPair.getNodeID(),
+                            idPair.getTpID()).build(), networkTerminationPointBuilder.build());
         }
         try {
-            deleteUsedWlTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            List<String> tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList());
-            LOG.error("Unable to delete used WL {} from TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e);
+            updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.error(
+                "Something went wrong for frequencies update (min frequency {}, max frequency {}, used {} for TPs {}",
+                minFrequency, maxFrequency, used, strTpIdsList, e);
+        } catch (InterruptedException e) {
+            LOG.error("Frequencies update (min frequency {}, max frequency {}, used {} for TPs {} was interrupted",
+                    minFrequency, maxFrequency, used,
+                    strTpIdsList, e);
+            Thread.currentThread().interrupt();
         }
     }
 
-    private void addUsedWL(long wavelengthIndex, List<NodeIdPair> tpIds) {
-        WriteTransaction addUsedWlTx = this.dataBroker.newWriteOnlyTransaction();
-        FixedFlexImpl fixedFlex = new FixedFlexImpl(wavelengthIndex);
-        FrequencyTHz centralTHz = new FrequencyTHz(new BigDecimal(fixedFlex.getCenterFrequency()));
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
-        for (NodeIdPair idPair : tpIds) {
-            Optional<TerminationPoint1> tp1Opt =
-                getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID());
-            TerminationPoint1 tp1 = null;
-            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-                .TerminationPoint1> tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID());
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 tp2;
-            if (!tp2Opt.isPresent()) {
-                LOG.error(
-                    "Unable to get common-network termination point {} from topology {}! Skip removal of used"
-                    + "wavelength for the node", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID);
+    /**
+     * Update availFreqMapsMap for min and max frequencies for nodes in nodeIds.
+     * @param nodeIds  List of node id
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     */
+    private void updateFreqMaps4Nodes(List<String> nodeIds, BigDecimal minFrequency, BigDecimal maxFrequency,
+            boolean used) {
+        String strNodesList = String.join(", ", nodeIds);
+        LOG.debug("Update frequencies for nodes {}, min frequency {}, max frequency {}, used {}",
+                strNodesList, minFrequency, maxFrequency, used);
+        WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction();
+        for (String nodeId : nodeIds) {
+            Node1 networkNode = getNetworkNodeFromDatastore(nodeId);
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 commonNetworkNode =
+                    getCommonNetworkNodeFromDatastore(nodeId);
+            if (networkNode == null || commonNetworkNode == null) {
+                LOG.warn(
+                        "From topology {} for node id {} -> Get common-network : {} "
+                                + "Get network-topology : {}. Skipping frequencies update for this node.",
+                        NetworkUtils.OVERLAY_NETWORK_ID, nodeId, commonNetworkNode, networkNode);
                 continue;
             }
-            tp2 = tp2Opt.get();
-            TerminationPoint1Builder tp1Builder;
-            if (tp1Opt.isPresent()) {
-                tp1 = tp1Opt.get();
-                tp1Builder = new TerminationPoint1Builder(tp1);
-            } else {
-                tp1Builder = new TerminationPoint1Builder();
+            Node1Builder networkNodeBuilder = new Node1Builder(networkNode);
+            switch (commonNetworkNode.getNodeType()) {
+                case DEGREE:
+                    networkNodeBuilder.setDegreeAttributes(
+                            updateDegreeAttributes(networkNode.getDegreeAttributes(), minFrequency,
+                                    maxFrequency, used));
+                    break;
+                case SRG:
+                    networkNodeBuilder.setSrgAttributes(
+                            updateSrgAttributes(networkNode.getSrgAttributes(), minFrequency, maxFrequency, used));
+                    break;
+                default:
+                    LOG.warn("Node type not managed {}", commonNetworkNode.getNodeType());
+                    break;
             }
+            updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION,
+                    OpenRoadmTopology.createNetworkNodeIID(nodeId), networkNodeBuilder.build());
+        }
+        try {
+            updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
+        } catch (ExecutionException | TimeoutException e) {
+            LOG.error("Cannot update frequencies {} {} for nodes {}", minFrequency, maxFrequency,
+                    strNodesList, e);
+        } catch (InterruptedException e) {
+            LOG.error("Update of frequencies {} {} for nodes {} was interrupted", minFrequency, maxFrequency,
+                    strNodesList, e);
+            Thread.currentThread().interrupt();
+        }
+    }
 
-            UsedWavelengths usedWaveLength = new UsedWavelengthsBuilder()
-                    .setIndex((int)wavelengthIndex)
-                    .setFrequency(centralTHz)
-                    .setWidth(FrequencyGHz.getDefaultInstance("40"))
-                    .build();
-            switch (tp2.getTpType()) {
-                case DEGREETXTTP:
-                case DEGREETXRXTTP:
-                    TxTtpAttributes txTtpAttributes = null;
-                    Map<UsedWavelengthsKey,UsedWavelengths> usedDegreeTxTtpWls;
-                    if (tp1 != null) {
-                        txTtpAttributes = tp1.getTxTtpAttributes();
+    /**
+     * Get list of NodeIdPair from atoZDirection.
+     * @param atoZDirection AToZDirection
+     * @return List of NodeIdPair
+     */
+    private List<NodeIdPair> getAToZTpList(AToZDirection atoZDirection) {
+        Collection<AToZ> atozList = atoZDirection.nonnullAToZ().values();
+        return atozList.stream()
+                .filter(aToZ -> {
+                    if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) {
+                        LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId());
+                        return false;
                     }
-                    TxTtpAttributesBuilder txTtpAttributesBuilder;
-                    usedDegreeTxTtpWls = new HashMap<>();
-                    if (txTtpAttributes == null) {
-                        txTtpAttributesBuilder = new TxTtpAttributesBuilder();
-                    } else {
-                        txTtpAttributesBuilder = new TxTtpAttributesBuilder(txTtpAttributes);
-                        usedDegreeTxTtpWls.putAll(txTtpAttributesBuilder.getUsedWavelengths());
+                    return aToZ.getResource().getResource() instanceof TerminationPoint;
+                }).map(aToZ -> {
+                    TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource();
+                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
+                        || tp.getTpId().isEmpty()) {
+                        LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId());
+                        return null;
                     }
-                    usedDegreeTxTtpWls.put(usedWaveLength.key(),usedWaveLength);
-                    txTtpAttributesBuilder.setUsedWavelengths(usedDegreeTxTtpWls);
-                    tp1Builder.setTxTtpAttributes(txTtpAttributesBuilder.build());
-                    break;
+                    return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
+                }).filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
 
-                case DEGREERXTTP:
-                    RxTtpAttributes rxTtpAttributes = null;
-                    Map<UsedWavelengthsKey,UsedWavelengths> usedDegreeRxTtpWls;
-                    if (tp1 != null) {
-                        rxTtpAttributes = tp1.getRxTtpAttributes();
+    /**
+     * Get list of NodeIdPair from ztoADirection.
+     * @param ztoADirection ZToADirection
+     * @return List of NodeIdPair
+     */
+    private List<NodeIdPair> getZToATpList(ZToADirection ztoADirection) {
+        Collection<ZToA> ztoaList = ztoADirection.nonnullZToA().values();
+        return ztoaList.stream()
+                .filter(zToA -> {
+                    if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) {
+                        LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId());
+                        return false;
                     }
-                    RxTtpAttributesBuilder rxTtpAttributesBuilder;
-                    usedDegreeRxTtpWls = new HashMap<>();
-                    if (rxTtpAttributes == null) {
-                        rxTtpAttributesBuilder = new RxTtpAttributesBuilder();
-                    } else {
-                        rxTtpAttributesBuilder = new RxTtpAttributesBuilder(rxTtpAttributes);
-                        usedDegreeRxTtpWls.putAll(rxTtpAttributesBuilder.getUsedWavelengths());
+                    return zToA.getResource().getResource() instanceof TerminationPoint;
+                }).map(zToA -> {
+                    TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource();
+                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
+                        || tp.getTpId().isEmpty()) {
+                        LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId());
+                        return null;
                     }
-                    usedDegreeRxTtpWls.put(usedWaveLength.key(),usedWaveLength);
-                    rxTtpAttributesBuilder.setUsedWavelengths(usedDegreeRxTtpWls);
-                    tp1Builder.setRxTtpAttributes(rxTtpAttributesBuilder.build());
-                    break;
+                    return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
+                }).filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
 
-                case DEGREETXCTP:
-                case DEGREERXCTP:
-                case DEGREETXRXCTP:
-                    CtpAttributes ctpAttributes = null;
-                    if (tp1 != null) {
-                        ctpAttributes = tp1.getCtpAttributes();
-                    }
-                    CtpAttributesBuilder ctpAttributesBuilder;
-                    if (ctpAttributes == null) {
-                        ctpAttributesBuilder = new CtpAttributesBuilder();
-                    } else {
-                        ctpAttributesBuilder = new CtpAttributesBuilder(ctpAttributes);
-                    }
-                    availFreqMapsMap = ctpAttributesBuilder.getAvailFreqMaps();
-                    ctpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, false));
-                    tp1Builder.setCtpAttributes(ctpAttributesBuilder.build());
-                    break;
+    /**
+     * Update Wavelength for xpdr port attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param rate Uint32
+     * @param modulationFormat ModulationFormat
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return XpdrPortAttributes with Wavelength updated
+     */
+    private XpdrPortAttributes updateXpdrPortAttributes(TerminationPoint1 networkTerminationPoint,
+            BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat,
+            boolean used) {
+        LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        XpdrPortAttributesBuilder xpdrPortAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(networkTerminationPoint.getXpdrPortAttributes());
+        } else {
+            xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder();
+        }
+        WavelengthBuilder waveLengthBuilder = new WavelengthBuilder();
+        if (used) {
+            waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
+                    .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency));
+        }
+        return xpdrPortAttributesBuilder.setWavelength(waveLengthBuilder.build()).build();
+    }
 
-                case SRGTXCP:
-                case SRGRXCP:
-                case SRGTXRXCP:
-                    CpAttributes cpAttributes = null;
-                    if (tp1 != null) {
-                        cpAttributes = tp1.getCpAttributes();
-                    }
-                    CpAttributesBuilder cpAttributesBuilder;
-                    if (cpAttributes == null) {
-                        cpAttributesBuilder = new CpAttributesBuilder();
-                    } else {
-                        cpAttributesBuilder = new CpAttributesBuilder(cpAttributes);
-                    }
-                    availFreqMapsMap = cpAttributesBuilder.getAvailFreqMaps();
-                    cpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(wavelengthIndex, availFreqMapsMap, false));
-                    tp1Builder.setCpAttributes(cpAttributesBuilder.build());
-                    break;
+    /**
+     * Update Wavelength for xpdr network attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param rate Uint32
+     * @param modulationFormat ModulationFormat
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return XpdrNetworkAttributes with Wavelength updated
+     */
+    private XpdrNetworkAttributes updateXpdrNetworkAttributes(TerminationPoint1 networkTerminationPoint,
+            BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat,
+            boolean used) {
+        LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(
+                    networkTerminationPoint.getXpdrNetworkAttributes());
+        } else {
+            xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder();
+        }
+        WavelengthBuilder waveLengthBuilder = new WavelengthBuilder();
+        if (used) {
+            waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
+                    .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency));
+        }
+        return xpdrNetworkAttributesBuilder.setWavelength(waveLengthBuilder.build()).build();
+    }
 
-                case SRGTXRXPP:
-                case SRGRXPP:
-                case SRGTXPP:
-                    PpAttributes ppAttributes = null;
-                    Map<UsedWavelengthKey, UsedWavelength> usedDegreePpWls;
-                    if (tp1 != null) {
-                        ppAttributes = tp1.getPpAttributes();
-                    }
-                    PpAttributesBuilder ppAttributesBuilder;
-                    usedDegreePpWls = new HashMap<>();
-                    if (ppAttributes == null) {
-                        ppAttributesBuilder = new PpAttributesBuilder();
-                    } else {
-                        ppAttributesBuilder = new PpAttributesBuilder(ppAttributes);
-                        usedDegreePpWls.putAll(ppAttributesBuilder.getUsedWavelength());
-                    }
-                    UsedWavelength usedDegreeWaveLength = new UsedWavelengthBuilder()
-                            .setIndex((int)wavelengthIndex)
-                            .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build();
-                    usedDegreePpWls.put(usedDegreeWaveLength.key(),usedDegreeWaveLength);
-                    ppAttributesBuilder.setUsedWavelength(usedDegreePpWls);
-                    tp1Builder.setPpAttributes(ppAttributesBuilder.build());
-                    break;
+    /**
+     * Update freqMaps for pp attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return PpAttributes with frequency map updated
+     */
+    private PpAttributes updatePpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        LOG.debug("Update pp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        PpAttributesBuilder ppAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            ppAttributesBuilder = new PpAttributesBuilder(networkTerminationPoint.getPpAttributes());
+        } else {
+            ppAttributesBuilder = new PpAttributesBuilder();
+        }
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = ppAttributesBuilder.getAvailFreqMaps();
+        return ppAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
+                .build();
+    }
 
-                case XPONDERNETWORK:
-                    XpdrNetworkAttributes xpdrNetworkAttributes = null;
-                    if (tp1 != null) {
-                        xpdrNetworkAttributes = tp1.getXpdrNetworkAttributes();
-                    }
-                    XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder;
-                    if (xpdrNetworkAttributes == null) {
-                        xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder();
-                    } else {
-                        xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(xpdrNetworkAttributes);
-                    }
-                    Wavelength usedXpdrNetworkWl = new WavelengthBuilder()
-                        .setWidth(FrequencyGHz.getDefaultInstance("40")).setFrequency(centralTHz).build();
-                    tp1Builder.setXpdrNetworkAttributes(xpdrNetworkAttributesBuilder.setWavelength(usedXpdrNetworkWl)
-                        .build());
-                    break;
-                case XPONDERCLIENT:
-                    break;
-                case XPONDERPORT:
-                    XpdrPortAttributes xpdrPortAttributes = null;
-                    if (tp1 != null) {
-                        xpdrPortAttributes = tp1.getXpdrPortAttributes();
-                    }
-                    XpdrPortAttributesBuilder xpdrPortAttributesBuilder;
-                    if (xpdrPortAttributes == null) {
-                        xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder();
-                    } else {
-                        xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(xpdrPortAttributes);
-                    }
-                    Wavelength usedXpdrPortWl = new WavelengthBuilder().setWidth(FrequencyGHz.getDefaultInstance("40"))
-                        .setFrequency(centralTHz).build();
-                    tp1Builder.setXpdrPortAttributes(xpdrPortAttributesBuilder.setWavelength(usedXpdrPortWl)
-                        .build());
-                    break;
+    /**
+     * Update freqMaps for cp attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return CpAttributes with frequency map updated
+     */
+    private CpAttributes updateCpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        LOG.debug("Update cp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        CpAttributesBuilder cpAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            cpAttributesBuilder = new CpAttributesBuilder(networkTerminationPoint.getCpAttributes());
+        } else {
+            cpAttributesBuilder = new CpAttributesBuilder();
+        }
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = cpAttributesBuilder.getAvailFreqMaps();
+        return cpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
+                .build();
+    }
 
-                default:
-                    // TODO skip for now
-                    continue;
-            }
-            addUsedWlTx.put(LogicalDatastoreType.CONFIGURATION, createTerminationPoint1IIDBuilder(idPair.getNodeID(),
-                    idPair.getTpID()).build(), tp1Builder.build());
+    /**
+     * Update freqMaps for ctp attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return CtpAttributes with frequency map updated
+     */
+    private CtpAttributes updateCtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        LOG.debug("Update ctp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        CtpAttributesBuilder ctpAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            ctpAttributesBuilder = new CtpAttributesBuilder(networkTerminationPoint.getCtpAttributes());
+        } else {
+            ctpAttributesBuilder = new CtpAttributesBuilder();
         }
-        try {
-            addUsedWlTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            List<String> tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList());
-            LOG.error("Unable to add used WL {} for TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e);
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = ctpAttributesBuilder.getAvailFreqMaps();
+        return ctpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
+                .build();
+    }
+
+    /**
+     * Update freqMaps for rxtp attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return RxTtpAttributes with frequency map updated
+     */
+    private RxTtpAttributes updateRxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        LOG.debug("Update rx attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        RxTtpAttributesBuilder rxTtpAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            rxTtpAttributesBuilder = new RxTtpAttributesBuilder(networkTerminationPoint.getRxTtpAttributes());
+        } else {
+            rxTtpAttributesBuilder = new RxTtpAttributesBuilder();
+        }
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = rxTtpAttributesBuilder.getAvailFreqMaps();
+        return rxTtpAttributesBuilder
+                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
+    }
+
+    /**
+     * Update freqMaps for txtp attributes.
+     * @param networkTerminationPoint TerminationPoint1
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return TxTtpAttributes with frequency map updated
+     */
+    private TxTtpAttributes updateTxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        LOG.debug("Update tx attributes for termination point {}, min frequency {}, max frequency {}, used {}",
+                networkTerminationPoint, minFrequency, maxFrequency, used);
+        TxTtpAttributesBuilder txTtpAttributesBuilder;
+        if (networkTerminationPoint != null) {
+            txTtpAttributesBuilder = new TxTtpAttributesBuilder(networkTerminationPoint.getTxTtpAttributes());
+        } else {
+            txTtpAttributesBuilder = new TxTtpAttributesBuilder();
         }
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = txTtpAttributesBuilder.getAvailFreqMaps();
+        return txTtpAttributesBuilder
+                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
     }
 
     /**
-     * Update availFreqMapsMap for wavelengthNumber for nodes in nodeIds.
-     * @param nodeIds List of node id.
-     * @param wavelengthNumber Long
-     * @param isSlotAvailable boolean true if waveLength is available, false otherwise.
+     * Update freqMaps for srg attributes of srgAttributes.
+     * @param srgAttributes SrgAttributes
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return SrgAttributes with frequency map updated
      */
-    //TODO: reduce its Cognitive Complexity from 21 to the 15
-    private void updateFreqMaps4Nodes(List<String> nodeIds, Long wavelengthNumber, boolean isSlotAvailable) {
-        WriteTransaction nodeWriteTx = this.dataBroker.newWriteOnlyTransaction();
+    private SrgAttributes updateSrgAttributes(SrgAttributes srgAttributes, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
         Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
-        String action = isSlotAvailable ? "addition" : "deletion";
-        for (String nodeId : nodeIds) {
-            Optional<Node1> node1Opt = getNode1FromDatastore(nodeId);
-            Optional<org.opendaylight.yang.gen.v1
-                .http.org.openroadm.common.network.rev200529.Node1> node2Opt = getNode2FromDatastore(nodeId);
-            if (!node1Opt.isPresent() || !node2Opt.isPresent()) {
-                LOG.error(
-                        "From topology {} for node id {} -> Get common-network : {} ! "
-                                + "Get network-topology : {} ! Skipping {} of available wavelength for this node.",
-                        NetworkUtils.OVERLAY_NETWORK_ID, nodeId, node1Opt.isPresent(), node2Opt.isPresent(), action);
-                continue;
-            }
-            Node1 node1 = node1Opt.get();
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node2 = node2Opt.get();
-            Node1Builder node1Builder = new Node1Builder(node1);
-            switch (node2.getNodeType()) {
-                case DEGREE:
-                    DegreeAttributes degreeAttributes = node1.getDegreeAttributes();
-                    DegreeAttributesBuilder degreeAttributesBuilder = degreeAttributes == null
-                        ? new DegreeAttributesBuilder() : new DegreeAttributesBuilder(degreeAttributes);
-                    availFreqMapsMap = degreeAttributesBuilder.getAvailFreqMaps();
-                    degreeAttributesBuilder
-                        .setAvailFreqMaps(updateFreqMaps(wavelengthNumber, availFreqMapsMap, isSlotAvailable));
-                    node1Builder.setDegreeAttributes(degreeAttributesBuilder.build());
-                    break;
-                case SRG:
-                    SrgAttributes srgAttributes = node1.getSrgAttributes();
-                    SrgAttributesBuilder srgAttributesBuilder = srgAttributes == null
-                        ? new SrgAttributesBuilder() : new SrgAttributesBuilder(srgAttributes);
-                    availFreqMapsMap = srgAttributesBuilder.getAvailFreqMaps();
-                    srgAttributesBuilder
-                        .setAvailFreqMaps(updateFreqMaps(wavelengthNumber, availFreqMapsMap, isSlotAvailable));
-                    node1Builder.setSrgAttributes(srgAttributesBuilder.build());
-                    break;
-                default:
-                    LOG.warn("Node type not managed {}", node2.getNodeType());
-                    break;
-            }
-            nodeWriteTx.put(LogicalDatastoreType.CONFIGURATION, createNode1IID(nodeId), node1Builder.build());
+        SrgAttributesBuilder srgAttributesBuilder;
+        if (srgAttributes == null) {
+            srgAttributesBuilder = new SrgAttributesBuilder();
+        } else {
+            srgAttributesBuilder = new SrgAttributesBuilder(srgAttributes);
         }
-        try {
-            nodeWriteTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
-        } catch (ExecutionException | TimeoutException e) {
-            LOG.error("Cannot perform {} WL {} for nodes {}!", action, wavelengthNumber, String.join(", ", nodeIds), e);
-        } catch (InterruptedException e) {
-            LOG.error("{} interrupted  WL {} for nodes {}!", action, wavelengthNumber, String.join(", ", nodeIds), e);
-            Thread.currentThread().interrupt();
+        availFreqMapsMap = srgAttributesBuilder.getAvailFreqMaps();
+        return srgAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
+                .build();
+    }
+
+    /**
+     * Update freqMaps for degree attributes of degreeAttributes.
+     * @param degreeAttributes DegreeAttributes
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
+     * @param used boolean true if min and max frequencies are used, false otherwise.
+     * @return DegreeAttributes with frequency map updated
+     */
+    private DegreeAttributes updateDegreeAttributes(DegreeAttributes degreeAttributes, BigDecimal minFrequency,
+            BigDecimal maxFrequency, boolean used) {
+        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
+        DegreeAttributesBuilder degreeAttributesBuilder;
+        if (degreeAttributes == null) {
+            degreeAttributesBuilder = new DegreeAttributesBuilder();
+        } else {
+            degreeAttributesBuilder = new DegreeAttributesBuilder(degreeAttributes);
         }
+        availFreqMapsMap = degreeAttributesBuilder.getAvailFreqMaps();
+        return degreeAttributesBuilder
+                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
     }
 
     /**
-     * Update availFreqMapsMap for wavelengthNumber.
-     * @param wavelengthNumber Long
+     * Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps.
+     * @param minFrequency BigDecimal
+     * @param maxFrequency BigDecimal
      * @param availFreqMapsMap Map
-     * @param isSlotAvailable boolean
-     * @return availFreqMapsMap updated for wavelengthNumber.
+     * @param used boolean
+     * @return updated Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps.
      */
-    private Map<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(Long wavelengthNumber,
-            Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap, boolean isSlotAvailable) {
-        byte slotValue = isSlotAvailable ? (byte)GridConstant.AVAILABLE_SLOT_VALUE : (byte)GridConstant.USED_SLOT_VALUE;
+    private Map<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(BigDecimal minFrequency, BigDecimal maxFrequency,
+            Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap, boolean used) {
+        int beginIndex = GridUtils.getIndexFromFrequency(minFrequency);
+        int endIndex = GridUtils.getIndexFromFrequency(maxFrequency);
         if (availFreqMapsMap == null) {
             availFreqMapsMap = GridUtils.initFreqMaps4FixedGrid2Available();
         }
         AvailFreqMaps availFreqMaps = availFreqMapsMap.get(availFreqMapKey);
         if (availFreqMaps != null && availFreqMaps.getFreqMap() != null) {
-            int intWlNumber = wavelengthNumber.intValue();
-            if (intWlNumber > 0 && intWlNumber <= availFreqMaps.getFreqMap().length) {
-                availFreqMaps.getFreqMap()[intWlNumber - 1] = slotValue;
-            }
+            BitSet bitSetFreq = BitSet.valueOf(availFreqMaps.getFreqMap());
+            LOG.debug(
+                 "Update frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
+                 beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq);
+            //if used = true then bit must be set to false to indicate the slot is no more available
+            bitSetFreq.set(beginIndex, endIndex, !used);
+            LOG.debug(
+                "Updated frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
+                beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq);
+            Map<AvailFreqMapsKey, AvailFreqMaps> updatedFreqMaps = new HashMap<>();
+            byte[] frequenciesByteArray = bitSetFreq.toByteArray();
+            AvailFreqMaps updatedAvailFreqMaps = new AvailFreqMapsBuilder(availFreqMaps)
+                    .setFreqMap(Arrays.copyOf(frequenciesByteArray,GridConstant.NB_OCTECTS))
+                    .build();
+            updatedFreqMaps.put(availFreqMaps.key(), updatedAvailFreqMaps);
+            return updatedFreqMaps;
         }
         return availFreqMapsMap;
     }
-}
+}
\ No newline at end of file
index 58166cabe1892f83ef562bb632a34b65a8de18bb..7513af0d33a65911d2c22ed65582e93c7a522eed 100644 (file)
@@ -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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+        .TerminationPoint1> 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<TerminationPoint1> 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<Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+        .Node1> 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 (file)
index 0532354..0000000
+++ /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<Object[]> 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<AvailFreqMapsKey, AvailFreqMaps> 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 (file)
index 23e35fe..0000000
+++ /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<Object[]> 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<AvailFreqMapsKey, AvailFreqMaps> 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 (file)
index 0000000..c861e93
--- /dev/null
@@ -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 (file)
index 6f68269..0000000
+++ /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<TerminationPoint1> createTerminationPoint1IIDBuilder(
-            String nodeId, String tpId) {
-        return InstanceIdentifier
-            .builder(Networks.class).child(Network.class,
-                new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                .Node.class, new NodeKey(new NodeId(nodeId)))
-            .augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
-                .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-            .augmentation(TerminationPoint1.class);
-    }
-
-    private static InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .TerminationPoint1> createTerminationPoint2IIDBuilder(
-                String nodeId, String tpId) {
-        return InstanceIdentifier
-            .builder(Networks.class).child(Network.class,
-                new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                .Node.class, new NodeKey(new NodeId(nodeId)))
-            .augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
-                .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-                .TerminationPoint1.class);
-    }
-
-    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<TerminationPoint1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1>
-            tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build();
-        return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, tpIID).get().get();
-    }
-
-    private static InstanceIdentifier<Node1> createNode1IID(String nodeId) {
-        return InstanceIdentifier
-            .builder(Networks.class)
-            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                .Node.class, new NodeKey(new NodeId(nodeId)))
-            .augmentation(Node1.class)
-            .build();
-    }
-
-    private static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-        .Node1> createNode2IID(String nodeId) {
-        return InstanceIdentifier
-            .builder(Networks.class)
-            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-            .child(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                .Node.class, new NodeKey(new NodeId(nodeId)))
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
-            .build();
-    }
-
-    public static void putNode1ToDatastore(String nodeId, Node1 node1,
-        DeviceTransactionManager deviceTransactionManager)
-        throws ExecutionException, InterruptedException {
-        InstanceIdentifier<Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1> 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<Node1> 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<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
-            .Node1> 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 (file)
index 0000000..d8d90aa
--- /dev/null
@@ -0,0 +1,1055 @@
+<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<networks xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
+<network>
+  <network-id>openroadm-topology</network-id>
+  <network-types>
+    <openroadm-common-network
+      xmlns="http://org/openroadm/common/network" />
+  </network-types>
+  <node>
+    <node-id>ROADM-A1-SRG3</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG3-PP3-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG3-PP2-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG3-CP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-CP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG3-PP1-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG3-PP4-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <srg-attributes
+      xmlns="http://org/openroadm/network/topology">
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>
+    </srg-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-A1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
+  </node>
+  <node>
+    <node-id>XPDR-C1-XPDR1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT1</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT2</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK2</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP1-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeC</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>XPDR-C1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-A1-SRG1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP4-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP1-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP2-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP3-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-CP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-CP</tp-type>
+    </termination-point>
+    <srg-attributes
+      xmlns="http://org/openroadm/network/topology">
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>
+    </srg-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-A1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-A1-DEG1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG1-CTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG1-TTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
+    </termination-point>
+    <degree-attributes
+      xmlns="http://org/openroadm/network/topology">
+      <degree-number>1</degree-number>
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>     </degree-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-A1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
+  </node>
+  <node>
+    <node-id>XPDR-A1-XPDR1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT1</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT2</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK2</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <associated-connection-map-port
+        xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-A1-SRG1--SRG1-PP1-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>XPDR-A1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeA</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-A1-DEG2</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG2-TTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG2-CTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
+    </termination-point>
+    <degree-attributes
+      xmlns="http://org/openroadm/network/topology">
+      <degree-number>2</degree-number>
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>     </degree-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-A1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-C1-SRG1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP4-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP1-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP2-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-PP3-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>SRG1-CP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-CP</tp-type>
+    </termination-point>
+    <srg-attributes
+      xmlns="http://org/openroadm/network/topology">
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>     </srg-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeC</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-C1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
+  </node>
+  <node>
+    <node-id>SPDR-SA1-XPDR1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-A1-SRG1--SRG1-PP2-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SA1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSA</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-C1-DEG1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG1-CTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG1-TTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
+    </termination-point>
+    <degree-attributes
+      xmlns="http://org/openroadm/network/topology">
+      <degree-number>1</degree-number>
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>     </degree-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeC</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-C1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
+  </node>
+  <node>
+    <node-id>SPDR-SC1-XPDR1</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP2-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SC1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSC</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <node>
+    <node-id>ROADM-C1-DEG2</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG2-TTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>DEG2-CTP-TXRX</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
+    </termination-point>
+    <degree-attributes
+      xmlns="http://org/openroadm/network/topology">
+      <degree-number>2</degree-number>
+    <avail-freq-maps>
+        <map-name>cband</map-name>
+        <start-edge-freq> 191.325</start-edge-freq>
+        <freq-map-granularity> 6.25</freq-map-granularity>
+        <effective-bits>768</effective-bits>
+        <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        </freq-map>
+    </avail-freq-maps>
+    </degree-attributes>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeC</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>ROADM-C1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
+  </node>
+  <node>
+    <node-id>SPDR-SA1-XPDR2</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK1</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK3</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-A1-SRG1--SRG1-PP4-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK2</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-A1-SRG1--SRG1-PP3-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK4</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SA1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSA</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <node>
+    <node-id>SPDR-SC1-XPDR2</node-id>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK1</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK3</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP4-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK2</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+      <xpdr-network-attributes
+        xmlns="http://org/openroadm/network/topology">
+        <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP3-TXRX
+        </tail-equipment-id>
+      </xpdr-network-attributes>
+    </termination-point>
+    <termination-point
+      xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK4</tp-id>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SC1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSC</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
+  </node>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-PP2-TXRXtoSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-PP2-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SC1-XPDR1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SC1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG2</source-node>
+      <source-tp>DEG2-TTP-TXRX</source-tp>
+    </source>
+    <OMS-attributes
+      xmlns="http://org/openroadm/network/topology">
+    </OMS-attributes>
+    <destination>
+      <dest-tp>DEG1-TTP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX
+    </link-id>
+    <source>
+      <source-node>XPDR-C1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP1-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-PP3-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK2
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-PP3-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR2-NETWORK2</dest-tp>
+      <dest-node>SPDR-SC1-XPDR2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SC1-XPDR2-XPDR2-NETWORK2toROADM-C1-SRG1-SRG1-PP3-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-PP4-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK3
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-PP4-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR2-NETWORK3</dest-tp>
+      <dest-node>SPDR-SA1-XPDR2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SA1-XPDR2-XPDR2-NETWORK3toROADM-A1-SRG1-SRG1-PP4-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-DEG1</source-node>
+      <source-tp>DEG1-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-CP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SA1-XPDR2-XPDR2-NETWORK3toROADM-A1-SRG1-SRG1-PP4-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SA1-XPDR2</source-node>
+      <source-tp>XPDR2-NETWORK3</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP4-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-PP4-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK3
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SC1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SC1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP2-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-PP2-TXRXtoSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG3</source-node>
+      <source-tp>SRG3-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG1-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SC1-XPDR2-XPDR2-NETWORK2toROADM-C1-SRG1-SRG1-PP3-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SC1-XPDR2</source-node>
+      <source-tp>XPDR2-NETWORK2</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP3-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-PP3-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK2
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG3</source-node>
+      <source-tp>SRG3-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG2-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-PP4-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK3
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-PP4-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR2-NETWORK3</dest-tp>
+      <dest-node>SPDR-SC1-XPDR2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SC1-XPDR2-XPDR2-NETWORK3toROADM-C1-SRG1-SRG1-PP4-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG1</source-node>
+      <source-tp>DEG1-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG3-CP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG3</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-PP1-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>XPDR-A1-XPDR1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SA1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SA1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP2-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-PP2-TXRXtoSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-DEG1</source-node>
+      <source-tp>DEG1-TTP-TXRX</source-tp>
+    </source>
+    <OMS-attributes
+      xmlns="http://org/openroadm/network/topology">
+    </OMS-attributes>
+    <destination>
+      <dest-tp>DEG2-TTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-PP2-TXRXtoSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-PP2-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SA1-XPDR1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SA1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-DEG2</source-node>
+      <source-tp>DEG2-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG1-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-DEG2</source-node>
+      <source-tp>DEG2-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-CP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG2</source-node>
+      <source-tp>DEG2-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-CP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-DEG1</source-node>
+      <source-tp>DEG1-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG2-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SC1-XPDR2-XPDR2-NETWORK3toROADM-C1-SRG1-SRG1-PP4-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SC1-XPDR2</source-node>
+      <source-tp>XPDR2-NETWORK3</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP4-TXRX</dest-tp>
+      <dest-node>ROADM-C1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-SRG1-SRG1-PP4-TXRXtoSPDR-SC1-XPDR2-XPDR2-NETWORK3
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX
+    </link-id>
+    <source>
+      <source-node>XPDR-A1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP1-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG2</source-node>
+      <source-tp>DEG2-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG1-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG1-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-PP1-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>XPDR-C1-XPDR1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG2</source-node>
+      <source-tp>DEG2-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG3-CP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG3</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG2-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>SPDR-SA1-XPDR2-XPDR2-NETWORK2toROADM-A1-SRG1-SRG1-PP3-TXRX
+    </link-id>
+    <source>
+      <source-node>SPDR-SA1-XPDR2</source-node>
+      <source-tp>XPDR2-NETWORK2</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-PP3-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-PP3-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK2
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-SRG1-SRG1-PP3-TXRXtoSPDR-SA1-XPDR2-XPDR2-NETWORK2
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-SRG1</source-node>
+      <source-tp>SRG1-PP3-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>XPDR2-NETWORK2</dest-tp>
+      <dest-node>SPDR-SA1-XPDR2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">SPDR-SA1-XPDR2-XPDR2-NETWORK2toROADM-A1-SRG1-SRG1-PP3-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG2-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG1</source-node>
+      <source-tp>DEG1-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>SRG1-CP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-SRG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-C1-SRG1</source-node>
+      <source-tp>SRG1-CP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG1-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-C1-DEG1</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX
+    </link-id>
+    <source>
+      <source-node>ROADM-A1-DEG1</source-node>
+      <source-tp>DEG1-CTP-TXRX</source-tp>
+    </source>
+    <destination>
+      <dest-tp>DEG2-CTP-TXRX</dest-tp>
+      <dest-node>ROADM-A1-DEG2</dest-node>
+    </destination>
+    <opposite-link
+      xmlns="http://org/openroadm/common/network">ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
+  </link>
+</network>
+</networks>
+</data>
\ 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 (file)
index 0000000..816f6fa
--- /dev/null
@@ -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"
+                }
+            }
+    }
index dca626ce3fdb5c0aed2c8905b2fe52e5ecfcf22e..834958ea383492cb45731cec361c13b8fcffac0d 100644 (file)
@@ -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<AToZKey, AToZ> 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<Uint16> tribSlotList = (List<Uint16>) 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<Uint16> tribSlotList = (List<Uint16>) 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<ZToAKey, ZToA> 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<Uint16> tribSlotList = (List<Uint16>) 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<Uint16> tribSlotList = (List<Uint16>) 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;
     }
index f2d1c5dabbb56f84104ecffaa4cf3e04725146fe..b29e4dbce8103d3af71e4f4204941659f7598ead 100644 (file)
@@ -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());
index 047d248a99022ee2d8facd93c388a0ae5f3be9a2..dceefde5e8acca52e18cba79b2752249683e13b5 100644 (file)
@@ -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<String, PceGraphEdge> path, Map<NodeId, PceNode> 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<String, PceGraphEdge> 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<String, PceGraphEdge> path,
+            Map<NodeId, PceNode> 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;
+    }
+
 }
index 125eeed75407796d0ac0bffb3323d65a4be87e23..aeb2938fca93cf83a3ed9c7ff6270a4cdef60541 100644 (file)
@@ -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");
index 127fa26d81cc5ac57ed88aed70fc75b6db5b5a99..35b1dee3bf41101a071bcb7f17b5c12e7148ee7b 100644 (file)
@@ -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<String, List<Uint16>> getAvailableTribPorts();
 
     Map<String, List<Uint16>> 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();
 }
index 4afbf70f69ff3b9abb696427bc89815ac38aea1e..17000587b6fa564f35997fa9d456c14d1590f982 100644 (file)
@@ -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<Long> availableWLindex = new ArrayList<>();
     private Map<String, OpenroadmTpType> availableSrgPp = new TreeMap<>();
     private Map<String, OpenroadmTpType> availableSrgCp = new TreeMap<>();
     private List<String> usedXpndrNWTps = new ArrayList<>();
     private List<PceLink> outgoingLinks = new ArrayList<>();
     private Map<String, String> 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;
     }
+
 }
index 8442cedc6f8cda26fce15c8b8ee1508c477f9018..931b621f82a9b893183f1a5fcfd3a37d0068a6f4 100644 (file)
@@ -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;
+    }
 }
index e9b6350205eb1f9fc63b473ff14ed8dbee6af279..c35b94b06fdda48f105a7819e462aea2e65fd4e3 100644 (file)
@@ -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<String, Uint16> resultTribPort;
     private Map<String, List<Uint16>> 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;
+    }
+
 }
index d132c9c797325467e306db5dddda547866c34c9e..9e8575717af04926ea5b7260464bcc55cad35759 100644 (file)
@@ -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,
index af6018e023db3b0bbe953cb3743ac119ac05dc93..ab7b3be0e7074279728f7acce45a84328c530065 100644 (file)
@@ -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"));
     }
 
index 7a3b5870540b490d17373b33a16cfb98c6ed436c..39311a9014e1aeb9dca8c63550c546071ba3e366 100644 (file)
@@ -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());
     }
 
index 522e34376f43af507d204d74b2f53d03438ad999..00ca6a1b82f5a3c472339a4678635dbc692d4a56 100644 (file)
@@ -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
index 1a1f1086aae892af20e71f3f14a2375b329708fc..53852252fc12d777db8b1e90908dea8378aceb73 100644 (file)
@@ -12,7 +12,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>s>
         </degree-attributes>
@@ -30,7 +30,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
@@ -48,7 +48,7 @@
         <start-edge-freq>191.325</start-edge-freq>
         <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
-        <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
         </freq-map>
       </avail-freq-maps>
     </degree-attributes>
@@ -63,7 +63,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
          </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>s>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
index 39f777b42a5490980b0fee4be135cc8620847851..6519ff434a52f8f6f9294708e498426a1d78a8b9 100644 (file)
@@ -16,7 +16,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
@@ -38,7 +38,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
@@ -60,7 +60,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
@@ -75,7 +75,7 @@
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>s>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAA/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </degree-attributes>
                 <start-edge-freq>191.325</start-edge-freq>
                 <freq-map-granularity>6.25</freq-map-granularity>
                 <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
                 </freq-map>
             </avail-freq-maps>
         </srg-attributes>
index 47835d8a4d275c068e7826d2edb60abfd7441dda..d0347cd4abc91ef22ae3a052c9a8bb5c78a7bde0 100644 (file)
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
                                 "start-edge-freq": 191.325,
                                 "freq-map-granularity": 6.25,
                                 "effective-bits": 768,
-                                "freq-map":"/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                                "freq-map":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
                             }
                         ]
                     },
index 42bb94e5580a7cb6423133aa9eb00a29d2713071..ce1191068729608b21e616f39778a47773256d29 100644 (file)
@@ -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
index a0a2f2b373265e4456e57ebc06d7799124b221db..859d3e92a0ee1e2643a098f4e0b1c57f88ebed48 100644 (file)
@@ -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
index b6b6533a7646e13a26f2ab0ac5e00247559e05fc..7b0a5db01284d15bb49583d5bac63eafe260071c 100644 (file)
@@ -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 (file)
index f7cff97..0000000
+++ /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')