Enabled flex-grid support for 2.2.1 Roadms
[transportpce.git] / renderer / src / main / java / org / opendaylight / transportpce / renderer / openroadminterface / OpenRoadmInterface221.java
index bc65af56d86229bfda8857dd5b8a04dd8a312682..eb23b0ffc6f1b439a185c6b8f058011daaaae565 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.fixedflex.FixedFlexInterface;
+import org.opendaylight.transportpce.common.fixedflex.FlexGridInterface;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
@@ -70,14 +71,16 @@ public class OpenRoadmInterface221 {
     private final PortMapping portMapping;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private FixedFlexInterface fixedFlex;
+    private FlexGridInterface flexGrid;
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface221.class);
 
 
     public OpenRoadmInterface221(PortMapping portMapping, OpenRoadmInterfaces openRoadmInterfaces,
-        FixedFlexInterface fixedFlex) {
+        FixedFlexInterface fixedFlex, FlexGridInterface flexGrid) {
         this.portMapping = portMapping;
         this.openRoadmInterfaces = openRoadmInterfaces;
         this.fixedFlex = fixedFlex;
+        this.flexGrid = flexGrid;
     }
 
     public String createOpenRoadmEthInterface(String nodeId, String logicalConnPoint)
@@ -109,6 +112,27 @@ public class OpenRoadmInterface221 {
         return ethInterfaceBldr.getName();
     }
 
+    public List<String> createFlexOCH(String nodeId, String logicalConnPoint, Long bitmapIndex,
+        BigDecimal centerFreq, BigDecimal slotWidth)
+        throws OpenRoadmInterfaceException {
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    nodeId, logicalConnPoint));
+        }
+
+        List<String> interfacesCreated = new ArrayList<>();
+
+        if (logicalConnPoint.contains("DEG")) {
+            String mcInterfaceCreated = createMCInterface(nodeId, logicalConnPoint, centerFreq, slotWidth, bitmapIndex);
+            interfacesCreated.add(mcInterfaceCreated);
+        }
+        String mcInterfaceCreated = createNMCInterface(nodeId, logicalConnPoint, centerFreq, slotWidth, bitmapIndex);
+        interfacesCreated.add(mcInterfaceCreated);
+        return interfacesCreated;
+    }
+
     /**
      * This methods creates an OCH interface on the given termination point on
      * Roadm.
@@ -124,6 +148,12 @@ public class OpenRoadmInterface221 {
 
     public List<String> createFlexOCH(String nodeId, String logicalConnPoint, Long waveNumber)
         throws OpenRoadmInterfaceException {
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    nodeId, logicalConnPoint));
+        }
 
         List<String> interfacesCreated = new ArrayList<>();
 
@@ -131,13 +161,12 @@ public class OpenRoadmInterface221 {
             String mcInterfaceCreated = createMCInterface(nodeId, logicalConnPoint, waveNumber);
             interfacesCreated.add(mcInterfaceCreated);
         }
-
         String nmcInterfaceCreated = createNMCInterface(nodeId, logicalConnPoint, waveNumber);
         interfacesCreated.add(nmcInterfaceCreated);
-
         return interfacesCreated;
     }
 
+
     public String createMCInterface(String nodeId, String logicalConnPoint, Long waveNumber)
         throws OpenRoadmInterfaceException {
 
@@ -177,12 +206,13 @@ public class OpenRoadmInterface221 {
         return mcInterfaceBldr.getName();
     }
 
-    public String createNMCInterface(String nodeId, String logicalConnPoint, Long waveNumber)
+    public String createMCInterface(String nodeId, String logicalConnPoint,
+        BigDecimal centerFrequency, BigDecimal slotWidth, Long bitmapIndex)
         throws OpenRoadmInterfaceException {
 
         // TODO : Check this method
 
-        fixedFlex = fixedFlex.getFixedFlexWaveMapping(waveNumber.shortValue());
+        flexGrid = flexGrid.getFlexWaveMapping(centerFrequency.floatValue(), slotWidth.floatValue());
 
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
@@ -191,9 +221,46 @@ public class OpenRoadmInterface221 {
                     nodeId, logicalConnPoint));
         }
 
-        LOG.info(" Freq Start {} and Freq End {} and center-Freq {}",
-            String.valueOf(fixedFlex.getStart()), String.valueOf(fixedFlex.getStop()),
-            String.valueOf(fixedFlex.getCenterFrequency()));
+        // TODO : Check this method
+        LOG.info("MC interface Freq Start {} and Freq End {} and center-Freq {}",
+            flexGrid.getStart(), flexGrid.getStop(), centerFrequency);
+        InterfaceBuilder mcInterfaceBldr = createGenericInterfaceBuilder(portMap,
+            MediaChannelTrailTerminationPoint.class, logicalConnPoint + "-mc" + "-" + bitmapIndex)
+                .setSupportingInterface(portMap.getSupportingOms());
+
+        McTtpBuilder mcTtpBuilder = new McTtpBuilder()
+            .setMinFreq(FrequencyTHz.getDefaultInstance(String.valueOf(flexGrid.getStart())))
+            .setMaxFreq(FrequencyTHz.getDefaultInstance(String.valueOf(flexGrid.getStop())));
+
+        // Create Interface1 type object required for adding as augmentation
+        org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.Interface1Builder
+            interface1Builder =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.Interface1Builder()
+                .setMcTtp(mcTtpBuilder.build());
+
+        mcInterfaceBldr.addAugmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.Interface1.class,
+            interface1Builder.build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(nodeId, mcInterfaceBldr);
+        return mcInterfaceBldr.getName();
+    }
+
+    public String createNMCInterface(String nodeId, String logicalConnPoint, Long waveNumber)
+        throws OpenRoadmInterfaceException {
+
+        // TODO : Check this method
+        fixedFlex = fixedFlex.getFixedFlexWaveMapping(waveNumber.shortValue());
+
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    nodeId, logicalConnPoint));
+        }
+        LOG.info("Freq Start {} and Freq End {} and center-Freq {}",
+            fixedFlex.getStart(), fixedFlex.getStop(), fixedFlex.getCenterFrequency());
         //TODO : Check this method
         InterfaceBuilder nmcInterfaceBldr = createGenericInterfaceBuilder(portMap,
             NetworkMediaChannelConnectionTerminationPoint.class, logicalConnPoint + "-nmc" + "-" + waveNumber);
@@ -202,14 +269,14 @@ public class OpenRoadmInterface221 {
         }
 
         NmcCtpBuilder nmcCtpIfBuilder = new NmcCtpBuilder()
-                .setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(fixedFlex.getCenterFrequency())))
-                .setWidth(FrequencyGHz.getDefaultInstance("40"));
+            .setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(fixedFlex.getCenterFrequency())))
+            .setWidth(FrequencyGHz.getDefaultInstance("40"));
 
         // Create Interface1 type object required for adding as augmentation
         org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019.Interface1Builder
             nmcCtpI1fBuilder =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019
-                    .Interface1Builder().setNmcCtp(nmcCtpIfBuilder.build());
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019
+                .Interface1Builder().setNmcCtp(nmcCtpIfBuilder.build());
         nmcInterfaceBldr.addAugmentation(
             org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019.Interface1.class,
             nmcCtpI1fBuilder.build());
@@ -219,6 +286,70 @@ public class OpenRoadmInterface221 {
         return nmcInterfaceBldr.getName();
     }
 
+    public String createNMCInterface(String nodeId, String logicalConnPoint,
+        BigDecimal centerFrequency, BigDecimal slotWidth, Long bitmapIndex)
+        throws OpenRoadmInterfaceException {
+        LOG.info("This is the central frequency {}", centerFrequency.floatValue());
+        LOG.info("This is the slot-width {}", slotWidth.floatValue());
+        // TODO : Check this method
+        flexGrid = flexGrid.getFlexWaveMapping(centerFrequency.floatValue(), slotWidth.floatValue());
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    nodeId, logicalConnPoint));
+        }
+
+        LOG.info("Freq Start {} and Freq End {} and center-Freq {}", flexGrid.getStart(),
+            flexGrid.getStop(),centerFrequency);
+        //TODO : Check this method
+        InterfaceBuilder nmcInterfaceBldr = createGenericInterfaceBuilder(portMap,
+            NetworkMediaChannelConnectionTerminationPoint.class, logicalConnPoint + "-nmc" + "-" + bitmapIndex);
+        if (logicalConnPoint.contains("DEG")) {
+            nmcInterfaceBldr.setSupportingInterface(logicalConnPoint + "-mc" + "-" + bitmapIndex);
+        }
+        NmcCtpBuilder nmcCtpIfBuilder;
+
+        // From the logicalConnPoint, get the substring and for that associated substring find the mc-cap
+        String mcLcp = "";
+        if (logicalConnPoint.contains("-PP")) {
+            mcLcp = logicalConnPoint.substring(0, logicalConnPoint.indexOf("-")) + "-PP";
+        }
+        else if (logicalConnPoint.contains("-TTP")) {
+            mcLcp = logicalConnPoint.substring(0, logicalConnPoint.indexOf("-")) + "-TTP";
+        }
+        try {
+            double slotWidthGran = portMapping.getMcCapbilities(nodeId, mcLcp)
+                .getSlotWidthGranularity().getValue().doubleValue();
+
+            // Dead-band is constant (Ref: WP)
+            double deadBand = 8; // In GHz
+            double guardBand = Math.ceil(deadBand / slotWidthGran) * slotWidthGran;
+
+            nmcCtpIfBuilder = new NmcCtpBuilder()
+                .setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(centerFrequency)))
+                .setWidth(FrequencyGHz.getDefaultInstance(String.valueOf(slotWidth.doubleValue() - guardBand)));
+
+            // Create Interface1 type object required for adding as augmentation
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019.Interface1Builder
+                nmcCtpI1fBuilder =
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019
+                    .Interface1Builder().setNmcCtp(nmcCtpIfBuilder.build());
+            nmcInterfaceBldr.addAugmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019
+                    .Interface1.class, nmcCtpI1fBuilder.build());
+
+            // Post interface on the device
+            openRoadmInterfaces.postInterface(nodeId, nmcInterfaceBldr);
+
+        }
+        catch (NullPointerException e) {
+            LOG.error("Port mapping could not find {}", mcLcp);
+            LOG.error("Check the port mapping to verify {}", mcLcp);
+        }
+        return nmcInterfaceBldr.getName();
+    }
+
     public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint, Long waveNumber)
         throws OpenRoadmInterfaceException {
         // TODO : Check this method
@@ -263,6 +394,60 @@ public class OpenRoadmInterface221 {
         return ochInterfaceBldr.getName();
     }
 
+    public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint,
+        Long waveNumber, BigDecimal centerFrequency, BigDecimal slotWidth)
+        throws OpenRoadmInterfaceException {
+        // TODO : Check this method
+
+        // OCH interface specific data
+        OchBuilder ocIfBuilder = new OchBuilder()
+            .setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(centerFrequency)))
+            .setRate(R100G.class)
+            .setTransmitPower(new PowerDBm(new BigDecimal("-5")))
+            .setModulationFormat(ModulationFormat.DpQpsk);
+
+        // In Flex-grid, slot-width could be other than 50 GHz
+        if ((centerFrequency != null) && (slotWidth != null)) {
+            ocIfBuilder.setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(centerFrequency)));
+            ocIfBuilder.setWidth(FrequencyGHz.getDefaultInstance(String.valueOf(slotWidth)));
+        }
+        else {
+            // Use fixed grid to find the
+            fixedFlex = fixedFlex.getFixedFlexWaveMapping(waveNumber.shortValue());
+            ocIfBuilder.setFrequency(FrequencyTHz.getDefaultInstance(String.valueOf(fixedFlex.getCenterFrequency())));
+        }
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s",
+                    nodeId, logicalConnPoint));
+        }
+
+
+
+        // Create generic interface
+        InterfaceBuilder ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class,
+            createOpenRoadmOchInterfaceName(logicalConnPoint, waveNumber));
+        // Create Interface1 type object required for adding as augmentation
+        // TODO look at imports of different versions of class
+        org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.Interface1Builder
+            ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019
+            .Interface1Builder();
+        ochInterfaceBldr.addAugmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.Interface1.class,
+            ochIf1Builder.setOch(ocIfBuilder.build()).build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr);
+
+        // Post the equipment-state change on the device circuit-pack if xpdr node
+        if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
+            this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
+        }
+
+        return ochInterfaceBldr.getName();
+    }
+
     public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint, String supportingOtuInterface)
         throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);