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