Refactor TAPI 2.4
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / ConvertORTopoToTapiTopo.java
index f463a8df9d04f1898c3e0b144df007ce7a474d43..6e9476adf3ec6aad3f4ce72e8d8bb4bc79837766 100644 (file)
@@ -9,76 +9,60 @@ package org.opendaylight.transportpce.tapi.topology;
 
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
-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.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
-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.TerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,196 +70,178 @@ import org.slf4j.LoggerFactory;
 
 public class ConvertORTopoToTapiTopo {
 
-    private static final String DSR = "DSR";
-    private static final String OTSI = "OTSi";
-    private static final String E_OTSI = "eOTSi";
-    private static final String I_OTSI = "iOTSi";
-    private static final String RDM_INFRA = "ROADM-infra";
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopo.class);
-    private String ietfNodeId;
-    private OpenroadmNodeType ietfNodeType;
-    private List<TerminationPoint> oorClientPortList;
-    private List<TerminationPoint> oorNetworkPortList;
-    private OduSwitchingPools oorOduSwitchingPool;
     private Uuid tapiTopoUuid;
-    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
         tapiNodes;
     private Map<LinkKey, Link> tapiLinks;
-    private Map<String, Uuid> uuidMap;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
+    private final TapiLink tapiLink;
 
 
-    public ConvertORTopoToTapiTopo(Uuid tapiTopoUuid) {
+    public ConvertORTopoToTapiTopo(Uuid tapiTopoUuid, TapiLink tapiLink) {
         this.tapiTopoUuid = tapiTopoUuid;
         this.tapiNodes = new HashMap<>();
         this.tapiLinks = new HashMap<>();
-        this.uuidMap = new HashMap<>();
+        this.tapiSips = new HashMap<>();
+        this.tapiLink = tapiLink;
     }
 
-    public void convertNode(Node ietfNode, List<String> networkPorts) {
-        this.ietfNodeId = ietfNode.getNodeId().getValue();
-        if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
-            == null) {
-            return;
-        }
-        this.ietfNodeType = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class).getNodeType();
-        this.oorNetworkPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-            .getTerminationPoint().values().stream()
-            .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-            == OpenroadmTpType.XPONDERNETWORK.getIntValue()
-            && networkPorts.contains(tp.getTpId().getValue()))
-            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-            .collect(Collectors.toList());
-        if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-            this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
-                .values().stream().findFirst().get();
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-            .getTerminationPoint().values().stream()
-            .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-            == OpenroadmTpType.XPONDERCLIENT.getIntValue())
-            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-            .collect(Collectors.toList());
-        } else {
-            this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
-            List<TpId> toto = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
-                .flatMap(nbl -> nbl.getTpList().stream())
-                .collect(Collectors.toList());
-            LOG.info("toto = {}", toto);
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                .getTerminationPoint().values().stream()
-                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                    == OpenroadmTpType.XPONDERCLIENT.getIntValue() && toto.contains(tp.getTpId()))
-                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                .collect(Collectors.toList());
-            this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
-        }
-
-        // node creation [DSR/ODU]
-        LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, DSR))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, DSR), nodeUuid);
-        Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(this.ietfNodeId).build();
-        List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr), dsrLayerProtocols);
-        tapiNodes.put(dsrNode.key(), dsrNode);
-
-        // node creation [otsi]
-        LOG.info("creation of an OTSi node for {}", this.ietfNodeId);
-        nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, OTSI))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, OTSI), nodeUuid);
-        Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(this.ietfNodeId).build();
-        List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node otsiNode = createTapiNode(Map.of(nameOtsi.key(), nameOtsi), otsiLayerProtocols);
-        tapiNodes.put(otsiNode.key(), otsiNode);
-
-        // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
-        LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
-        createTapiTransitionalLinks();
-    }
-
-    public void convertLinks(List
-        <org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link>
-        otnLinkList) {
+    public void convertLinks(Map<
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+                .LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+                .Link> otnLinkMap) {
+        List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
+        Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
+            .compareTo(l2.getLinkId().getValue()));
         List<String> linksToNotConvert = new ArrayList<>();
-        LOG.info("creation of {} otn links", otnLinkList.size() / 2);
+        LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link link : otnLinkList) {
-            if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
-                Link tapiLink = createTapiLink(link);
-                linksToNotConvert.add(link
-                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
-                    .getOppositeLink().getValue());
-                tapiLinks.put(tapiLink.key(), tapiLink);
+                .Link otnlink : otnLinkList) {
+            if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
+                    .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
+                        .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(Link1.class)
+                    .getOppositeLink()));
+
+                AdminStates oppLnkAdmState = null;
+                State oppLnkOpState = null;
+                String oppositeLinkId = null;
+                if (oppositeLink != null) {
+                    oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
+                    oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
+                    oppositeLinkId = oppositeLink.getLinkId().getValue();
+                }
+                String adminState =
+                    otnlink.augmentation(Link1.class).getAdministrativeState() == null
+                        || oppLnkAdmState == null
+                    ? null
+                    : this.tapiLink.setTapiAdminState(
+                        otnlink.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
+                String operState = otnlink.augmentation(Link1.class).getOperationalState() == null
+                        || oppLnkOpState == null
+                    ? null
+                    : this.tapiLink.setTapiOperationalState(
+                        otnlink.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
+                // TODO: Handle not only OTU4 but also other cases
+                String prefix = otnlink.getLinkId().getValue().split("-")[0];
+                String nodesQual = TapiStringConstants.XPDR;
+                String tpsQual = prefix.equals("OTU4") ? TapiStringConstants.I_OTSI : TapiStringConstants.E_ODU;
+                LayerProtocolName layerProtocolName = prefix.equals("OTU4") ? LayerProtocolName.PHOTONICMEDIA
+                    : LayerProtocolName.ODU;
+
+                Link tapLink = this.tapiLink.createTapiLink(otnlink.getSource().getSourceNode().getValue(),
+                    otnlink.getSource().getSourceTp().getValue(), otnlink.getDestination().getDestNode().getValue(),
+                    otnlink.getDestination().getDestTp().getValue(), TapiStringConstants.OTN_XPDR_XPDR_LINK, nodesQual,
+                    nodesQual, tpsQual, tpsQual, adminState, operState, Set.of(layerProtocolName),
+                    Set.of(layerProtocolName.getName()), this.tapiTopoUuid);
+                linksToNotConvert.add(oppositeLinkId);
+                tapiLinks.put(tapLink.key(), tapLink);
+                LOG.debug("Links converted are as follow  {}", tapiLinks.toString());
             }
         }
     }
 
     public void convertRoadmInfrastructure() {
         LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(RDM_INFRA.getBytes(Charset.forName("UTF-8"))).toString());
-        Name nodeName =  new NameBuilder().setValueName("otsi node name").setValue(RDM_INFRA).build();
-        List<LayerProtocolName> nodeLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Name nodeName =
+            new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA).build();
+        Name nodeName2 =
+            new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA).build();
+        Name nameNodeType = new NameBuilder().setValueName("Node Type")
+            .setValue(OpenroadmNodeType.ROADM.getName()).build();
+        Set<LayerProtocolName> nodeLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
             = pruneTapiPhotonicNodes();
+        //At that stage, there is no Roadm in the tapiPhotonicNodes Map / only the transponders
         Map<String, String> photonicNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(tapiPhotonicNodes);
         // nep creation for rdm infra abstraction node
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = createNepForRdmNode(photonicNepUuisMap.size());
         // node rule group creation
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList
-            = createNodeRuleGroupForRdmNode(nodeUuid, onepMap.values());
+        var tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
+            = tapiFactory.createAllNodeRuleGroupForRdmNode("T0ML", nodeUuid, null, onepMap.values());
+        Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap
+            = tapiFactory.createInterRuleGroupForRdmNode("T0ML", nodeUuid, null,
+                nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
+
+        // Empty random creation of mandatory fields for avoiding errors....
+        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+            .setCostAlgorithm("Restricted Shortest Path - RSP")
+            .setCostName("HOP_COUNT")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+            .build();
+        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+            .setTrafficPropertyName("FIXED_LATENCY")
+            .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
+            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+            .build();
         // build RDM infra node abstraction
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node rdmNode = new NodeBuilder()
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node rdmNode = new NodeBuilder()
             .setUuid(nodeUuid)
-            .setName(Map.of(nodeName.key(), nodeName))
+            .setName(Map.of(nodeName.key(), nodeName, nodeName2.key(), nodeName2, nameNodeType.key(), nameNodeType))
             .setLayerProtocolName(nodeLayerProtocols)
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setOwnedNodeEdgePoint(onepMap)
-            .setNodeRuleGroup(nodeRuleGroupList)
+            .setNodeRuleGroup(nodeRuleGroupMap)
+            .setInterRuleGroup(interRuleGroupMap)
+            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskParameterPac(riskParamPac)
             .build();
         tapiNodes.put(rdmNode.key(), rdmNode);
-
-        // OMS link creation between photonoci nodes and RDM infra abstraction node
+    // OTS link creation between photonic nodes and RDM infra abstraction node :
+      //onepMap is a list of nep which Uuid is formed from THE ROADM node name, "nep" and an integer (order of the nep)
+      // It has absolutely no relationship with the real ROADM infrastructure (SRG ports)
+      //rdmInfraNepUuisMap is a Map <ROADMnodeUuuid--NepUuid; ROADMnodeName--nepName> built from onepMap
+      //photonicNepUuisMap is a Map <TSPnodeUuuid--eNepUuid; TSPnodeName--nepName> built from TapiPhotonicNode
         Map<String, String> rdmInfraNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(List.of(rdmNode));
         if (photonicNepUuisMap.size() != rdmInfraNepUuisMap.size()) {
-            LOG.warn("Unable to build OMS links between photonics nodes and RDM infrasctructure abstraction");
+            LOG.warn("Unable to build OTS links between photonics nodes and RDM infrasctructure abstraction");
         } else {
-            createTapiOmsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
-        }
-    }
-
-    private OduSwitchingPools createOduSwitchingPoolForTp100G() {
-        Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
-        int count = 1;
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            TpId tpid1 = tp.getTpId();
-            TpId tpid2 = new TpId(tp.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
-                .getAssociatedConnectionMapPort());
-            List<TpId> tpList = new ArrayList<>();
-            tpList.add(tpid1);
-            tpList.add(tpid2);
-            NonBlockingList nbl = new NonBlockingListBuilder()
-                .setNblNumber(Uint16.valueOf(count))
-                .setTpList(tpList)
-                .build();
-            nblMap.put(nbl.key(), nbl);
-            count++;
+            //Tapi OtsLinks are created between Neps corresponding to the eNEPs of transponders (existing network ports)
+            //and Generic NEPS with abstracted names created in the ROADM infrastructure corresponding to tps mirroring
+            //transponders NETWORK PORTs. There is a simplification here considering that any network port of
+            //transponders will have a mirroring SRG client port in the ROADM infrastructure.
+            // TODO: Do not understand that we build OTS link without checking that existing transponder ports
+            //are effectively connected. Need some consolidation
+            createTapiOtsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
         }
-        return new OduSwitchingPoolsBuilder()
-            .setNonBlockingList(nblMap)
-            .setSwitchingPoolNumber(Uint16.valueOf(1))
-            .build();
     }
 
-    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
-        pruneTapiPhotonicNodes() {
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+            pruneTapiPhotonicNodes() {
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
             prunedTapiPhotonicNodes = new ArrayList<>();
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
             = this.tapiNodes.values().stream()
-                .filter(n -> LayerProtocolName.PHOTONICMEDIA.equals(n.getLayerProtocolName().get(0)))
+                .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
                 .collect(Collectors.toList());
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node
             : tapiPhotonicNodes) {
             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepM = new HashMap<>();
             for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
                 if (entry.getValue().getName().values().stream()
-                    .filter(name -> name.getValueName().startsWith("eNodeEdgePoint"))
-                    .count() > 0) {
+                    .filter(name -> name.getValueName().equals("eNodeEdgePoint")).count() > 0) {
                     onepM.put(entry.getKey(), entry.getValue());
                 }
             }
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node prunedNode
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node prunedNode
                 = new NodeBuilder(node).setOwnedNodeEdgePoint(onepM).build();
             prunedTapiPhotonicNodes.add(prunedNode);
         }
@@ -283,14 +249,15 @@ public class ConvertORTopoToTapiTopo {
     }
 
     private Map<String, String> convertListNodeWithListNepToMapForUuidAndName(
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodes) {
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodes) {
         Map<String, String> uuidNameMap = new HashMap<>();
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node : nodes) {
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node : nodes) {
             for (OwnedNodeEdgePoint nep : node.nonnullOwnedNodeEdgePoint().values()) {
                 String nodeUuid = node.getUuid().getValue();
                 String nepUuid = nep.getUuid().getValue();
                 String nodeName = node.getName().get(new NameKey("otsi node name")).getValue();
-                String nepName = nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst().get()))
+                String nepName = nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst()
+                        .orElseThrow()))
                     .getValue();
                 uuidNameMap.put(String.join("--", nodeUuid, nepUuid), String.join("--", nodeName, nepName));
             }
@@ -298,203 +265,6 @@ public class ConvertORTopoToTapiTopo {
         return uuidNameMap;
     }
 
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
-        createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
-        Uuid nodeUuid = null;
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        if (layerProtocols.contains(LayerProtocolName.DSR)) {
-            nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
-        } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
-            nodeUuid = getNodeUuid4Photonic(onepl, nodeRuleGroupList, ruleList);
-        } else {
-            LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
-                .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
-        }
-        return new NodeBuilder()
-                .setUuid(nodeUuid)
-                .setName(nodeNames)
-                .setLayerProtocolName(layerProtocols)
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED)
-                .setOwnedNodeEdgePoint(onepl)
-                .setNodeRuleGroup(nodeRuleGroupList)
-                .build();
-    }
-
-    private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI));
-        // iNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
-                    (String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
-                    .getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
-                nepUuid1);
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint")
-                .setValue(oorNetworkPortList.get(i).getTpId().getValue())
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
-                String.join("+", this.ietfNodeId, I_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // eNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
-                    (String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
-                    .getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
-                nepUuid2);
-            Name onedName = new NameBuilder()
-                .setValueName("eNodeEdgePoint")
-                .setValue(oorNetworkPortList.get(i).getTpId().getValue())
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
-                String.join("+", this.ietfNodeId, E_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue())))
-                .build();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, E_OTSI, tp.getTpId().getValue())))
-                .build();
-            nepList.put(inep.key(), inep);
-            nepList.put(enep.key(), enep);
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, DSR));
-        // client nep creation on DSR/ODU node
-        for (int i = 0; i < oorClientPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()))
-                .getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()),
-                nepUuid);
-            NameBuilder nameBldr = new NameBuilder().setValue(oorClientPortList.get(i).getTpId().getValue());
-            Name name;
-            if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-                name = nameBldr.setValueName("100G-tpdr").build();
-            } else {
-                name = nameBldr.setValueName("NodeEdgePoint_C").build();
-            }
-
-            OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
-                LayerProtocolName.ETH, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
-            onepl.put(onep.key(), onep);
-        }
-        // network nep creation on DSR/ODU node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()))
-                .getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()),
-                nepUuid);
-            Name onedName = new NameBuilder()
-                .setValueName("NodeEdgePoint_N")
-                .setValue(oorNetworkPortList.get(i).getTpId().getValue())
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            for (TpId tp : nbl.getTpList()) {
-                if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, DSR, tp.getValue()))) {
-                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                        nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                        .NodeEdgePointBuilder()
-                        .setTopologyUuid(tapiTopoUuid)
-                        .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
-                        .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR, tp.getValue())))
-                        .build();
-                    nepList.put(nep.key(), nep);
-                }
-            }
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
-        LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
-        String key = String.join("+", keyword, oorTp.getTpId().getValue());
-        OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
-            .setUuid(this.uuidMap.get(key))
-            .setLayerProtocolName(nepProtocol)
-            .setName(nepNames);
-        if (withSip) {
-            onepBldr.setMappedServiceInterfacePoint(createSIP(this.uuidMap.get(key), 1));
-        }
-        onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol));
-        onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
-                .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
-        return onepBldr.build();
-    }
-
     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createNepForRdmNode(int nbNep) {
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
         for (int i = 1; i <= nbNep; i++) {
@@ -504,240 +274,26 @@ public class ConvertORTopoToTapiTopo {
                 .setValueName("NodeEdgePoint name")
                 .setValue(new StringBuilder("NodeEdgePoint_").append(i).toString())
                 .build();
+            List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
+            sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                .setNumberOfCepInstances(Uint64.valueOf(1))
+                .build());
             OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
                 .setUuid(nepUuid)
                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
                 .setName(Map.of(nepName.key(), nepName))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
+                .setSupportedCepLayerProtocolQualifierInstances(sclpqiList)
+                .setDirection(Direction.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
                 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
+                .setLifecycleState(LifecycleState.INSTALLED)
                 .build();
             onepMap.put(onep.key(), onep);
         }
         return onepMap;
     }
 
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
-        Collection<OwnedNodeEdgePoint> onepl) {
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-            nepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint onep : onepl) {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                    .NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(nodeUuid)
-                .setNodeEdgePointUuid(onep.key().getUuid())
-                .build();
-            nepMap.put(nep.key(), nep);
-        }
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setRule(ruleList)
-            .setNodeEdgePoint(nepMap)
-            .build();
-        nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-        return nodeRuleGroupMap;
-    }
-
-    private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createSIP(Uuid nepUuid, int nb) {
-        Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
-        for (int i = 0; i < nb; i++) {
-            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
-                .setServiceInterfacePointUuid(new Uuid(UUID.nameUUIDFromBytes(nepUuid.getValue()
-                    .getBytes(Charset.forName("UTF-8"))).toString()))
-                .build();
-            msipl.put(msip.key(), msip);
-        }
-        return msipl;
-    }
-
-    private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
-        LayerProtocolName lpn) {
-        List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
-        List<SupportedInterfaceCapability> sicList = new ArrayList<>(
-            tp.augmentation(org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.otn.network.topology.rev200529.TerminationPoint1.class).getTpSupportedInterfaces()
-            .getSupportedInterfaceCapability().values());
-        for (SupportedInterfaceCapability sic : sicList) {
-            switch (lpn.getName()) {
-                case "DSR":
-                    if (sic.getIfCapType().getSimpleName().equals("If10GEODU2e")) {
-                        sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
-                        sclpqList.add(ODUTYPEODU2E.class);
-                    } else if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
-                        sclpqList.add(ODUTYPEODU4.class);
-                    } else if (sic.getIfCapType().getSimpleName().equals("If100GEODU4")) {
-                        sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
-                        sclpqList.add(ODUTYPEODU4.class);
-                    } else if (sic.getIfCapType().getSimpleName().equals("If100GE")) {
-                        sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
-                    }
-                    break;
-                case "PHOTONIC_MEDIA":
-                    if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
-                        sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
-                        sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
-                    }
-                    break;
-                default:
-                    LOG.error("Layer Protocol Name is unknown");
-                    break;
-            }
-        }
-        return sclpqList;
-    }
-
-    private void createTapiTransitionalLinks() {
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
-            String sourceKey = String.join("+", this.ietfNodeId, DSR, tp.getTpId().getValue());
-            Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
-            String destKey = String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue());
-            Uuid destUuidTp = this.uuidMap.get(destKey);
-            NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
-                .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
-                .setNodeEdgePointUuid(sourceUuidTp)
-                .build();
-            nepList.put(sourceNep.key(), sourceNep);
-            NodeEdgePoint destNep = new NodeEdgePointBuilder()
-                .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
-                .setNodeEdgePointUuid(destUuidTp)
-                .build();
-            nepList.put(destNep.key(), destNep);
-            Name linkName = new NameBuilder().setValueName("transitional link name")
-                .setValue(String.join("--", this.ietfNodeId, sourceKey, destKey))
-                .build();
-            Link transiLink = new LinkBuilder()
-                .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes((String.join("--", this.ietfNodeId, sourceKey, destKey))
-                            .getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setName(Map.of(linkName.key(), linkName))
-                .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
-                    LayerProtocolName.PHOTONICMEDIA.getName()))
-                .setNodeEdgePoint(nepList)
-                .setDirection(ForwardingDirection.BIDIRECTIONAL)
-                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(Uint64.valueOf(100)).build()).build())
-                .build();
-            this.tapiLinks.put(transiLink.key(), transiLink);
-        }
-    }
-
-    private Link createTapiLink(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-        .networks.network.Link link) {
-        String prefix = link.getLinkId().getValue().split("-")[0];
-        String sourceNode = link.getSource().getSourceNode().getValue();
-        String sourceTp = link.getSource().getSourceTp().toString();
-        String destNode = link.getDestination().getDestNode().getValue();
-        String destTp = link.getDestination().getDestTp().toString();
-        Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
-        Uuid sourceUuidTp;
-        Uuid sourceUuidNode;
-        Uuid destUuidTp;
-        Uuid destUuidNode;
-        Name linkName;
-        switch (prefix) {
-            case "OTU4":
-                sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, I_OTSI, sourceTp));
-                sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, OTSI));
-                NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
-                    .setTopologyUuid(this.tapiTopoUuid)
-                    .setNodeUuid(sourceUuidNode)
-                    .setNodeEdgePointUuid(sourceUuidTp)
-                    .build();
-                nepList.put(sourceNep.key(), sourceNep);
-                destUuidTp = this.uuidMap.get(String.join("+", destNode, I_OTSI, destTp));
-                destUuidNode = this.uuidMap.get(String.join("+", destNode, OTSI));
-                NodeEdgePoint destNep = new NodeEdgePointBuilder()
-                    .setTopologyUuid(this.tapiTopoUuid)
-                    .setNodeUuid(destUuidNode)
-                    .setNodeEdgePointUuid(destUuidTp)
-                    .build();
-                nepList.put(destNep.key(), destNep);
-                linkName = new NameBuilder().setValueName("otn link name")
-                    .setValue(link.getLinkId().getValue())
-                    .build();
-                return new LinkBuilder()
-                    .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes((link.getLinkId().getValue())
-                            .getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setName(Map.of(linkName.key(), linkName))
-                .setLayerProtocolName(Arrays.asList(LayerProtocolName.PHOTONICMEDIA))
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
-                .setDirection(ForwardingDirection.BIDIRECTIONAL)
-                .setNodeEdgePoint(nepList)
-                .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
-                        .setValue(Uint64.valueOf(100)).build()).build())
-                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
-                        .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
-                    .build())
-                .build();
-            case "ODU4":
-                sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, DSR, sourceTp));
-                sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, DSR));
-                NodeEdgePoint sourceNep2 = new NodeEdgePointBuilder()
-                    .setTopologyUuid(this.tapiTopoUuid)
-                    .setNodeUuid(sourceUuidNode)
-                    .setNodeEdgePointUuid(sourceUuidTp)
-                    .build();
-                nepList.put(sourceNep2.key(), sourceNep2);
-                destUuidTp = this.uuidMap.get(String.join("+", destNode, DSR, destTp));
-                destUuidNode = this.uuidMap.get(String.join("+", destNode, DSR));
-                NodeEdgePoint destNep2 = new NodeEdgePointBuilder()
-                    .setTopologyUuid(this.tapiTopoUuid)
-                    .setNodeUuid(destUuidNode)
-                    .setNodeEdgePointUuid(destUuidTp)
-                    .build();
-                nepList.put(destNep2.key(), destNep2);
-                linkName = new NameBuilder().setValueName("otn link name")
-                    .setValue(link.getLinkId().getValue())
-                    .build();
-                return new LinkBuilder()
-                    .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes((link.getLinkId().getValue())
-                            .getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setName(Map.of(linkName.key(), linkName))
-                .setLayerProtocolName(Arrays.asList(LayerProtocolName.ODU))
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
-                .setDirection(ForwardingDirection.BIDIRECTIONAL)
-                .setNodeEdgePoint(nepList)
-                .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
-                        .setValue(Uint64.valueOf(100)).build()).build())
-                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
-                        .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
-                    .build())
-                .build();
-            default:
-                LOG.error("OTN link of type {} not managed yet", prefix);
-                return null;
-        }
-    }
-
-    private void createTapiOmsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
+    private void createTapiOtsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
         Iterator<Entry<String, String>> it1 = photonicNepUuisMap.entrySet().iterator();
         Iterator<Entry<String, String>> it2 = rdmInfraNepUuisMap.entrySet().iterator();
         while (it1.hasNext()) {
@@ -760,29 +316,42 @@ public class ConvertORTopoToTapiTopo {
                 .setNodeEdgePointUuid(destUuidTp)
                 .build();
             nepMap.put(destNep.key(), destNep);
-            Name linkName = new NameBuilder().setValueName("OMS link name")
+            Name linkName = new NameBuilder().setValueName("OTS link name")
                 .setValue(String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
                 .build();
-            Link omsLink = new LinkBuilder()
+            Link otsLink = new LinkBuilder()
                 .setUuid(new Uuid(
-                      UUID.nameUUIDFromBytes((String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
-                          .getBytes(Charset.forName("UTF-8")))
-                  .toString()))
+                    UUID.nameUUIDFromBytes((String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
+                            .getBytes(Charset.forName("UTF-8")))
+                        .toString()))
                 .setName(Map.of(linkName.key(), linkName))
-                .setLayerProtocolName(List.of(LayerProtocolName.PHOTONICMEDIA))
+                .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA))
                 .setNodeEdgePoint(nepMap)
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
                 .build();
-            this.tapiLinks.put(omsLink.key(), omsLink);
+            this.tapiLinks.put(otsLink.key(), otsLink);
         }
     }
 
-    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
-        getTapiNodes() {
+    public void setTapiNodes(Map<NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
+        this.tapiNodes.putAll(nodeMap);
+    }
+
+    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+            getTapiNodes() {
         return tapiNodes;
     }
 
     public Map<LinkKey, Link> getTapiLinks() {
         return tapiLinks;
     }
-}
\ No newline at end of file
+
+    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
+        return tapiSips;
+    }
+
+    public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
+        this.tapiSips.putAll(tapiSip);
+    }
+}