Multi-layer TAPI topology creation for OTN 86/86186/3
authorGilles Thouenon <gilles.thouenon@orange.com>
Wed, 4 Dec 2019 13:13:31 +0000 (14:13 +0100)
committerguillaume.lambert <guillaume.lambert@orange.com>
Fri, 6 Dec 2019 14:33:23 +0000 (15:33 +0100)
- implementation of TAPI:get-topology-details rpc to abstract nodes from
OpenROADM otn-topology

JIRA: TRNSPRTPCE-161
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Co-authored-by: Christophe Betoule <christophe.betoule@orange.com>
Change-Id: I0f196248002390c7ec5567fd912d6fac2dcb1a91

common/src/main/java/org/opendaylight/transportpce/common/InstanceIdentifiers.java
common/src/main/java/org/opendaylight/transportpce/common/NetworkUtils.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTopoObject.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java

index 18f0c9cfd31acc875b486aa8c31c392d52139f6b..2cbd0a167c416f5f44c1a572ff0e309bf86ee46a 100644 (file)
@@ -30,8 +30,12 @@ public final class InstanceIdentifiers {
             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))).build();
 
     public static final InstanceIdentifier<Network> OVERLAY_NETWORK_II = InstanceIdentifier
-            .builder(Networks.class)
-            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
+        .builder(Networks.class)
+        .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
+
+    public static final InstanceIdentifier<Network> OTN_NETWORK_II = InstanceIdentifier
+        .builder(Networks.class)
+        .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build();
 
     public static final InstanceIdentifier<Network> CLLI_NETWORK_II = InstanceIdentifier
             .builder(Networks.class)
index 08e3f705b08fca8c3dd3f060cad4b9bef476a94e..f7d78fde1cc7c921a1d62e9e6151fa408584f065 100644 (file)
@@ -18,6 +18,8 @@ public final class NetworkUtils {
 
     public static final String OVERLAY_NETWORK_ID = "openroadm-topology";
 
+    public static final String OTN_NETWORK_ID = "otn-topology";
+
     public enum Operation {
         CREATE,
         DELETE
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTopoObject.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTopoObject.java
new file mode 100644 (file)
index 0000000..3174b2a
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * Copyright © 2019 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.tapi.topology;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1;
+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.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.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.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.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.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.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.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.NodeBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConvertORTopoObjectToTapiTopoObject {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImpl.class);
+    private String ietfNodeId;
+    private List<TerminationPoint> oorClientPortList;
+    private List<TerminationPoint> oorNetworkPortList;
+    private OduSwitchingPools oorOduSwitchingPool;
+    private Uuid tapiTopoUuid;
+    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes;
+    private List<Link> tapiLinks;
+    private Map<String, Uuid> uuidMap;
+
+    public ConvertORTopoObjectToTapiTopoObject(Node ietfNode, Link1 otnLink, Uuid tapiTopoUuid) {
+        this.ietfNodeId = ietfNode.getNodeId().getValue();
+        this.oorClientPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+            .network.topology.rev180226.Node1.class).getTerminationPoint().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());
+        this.oorNetworkPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+            .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
+            .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+            == OpenroadmTpType.XPONDERNETWORK.getIntValue())
+            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+            .collect(Collectors.toList());
+        this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools().get(0);
+        this.tapiTopoUuid = tapiTopoUuid;
+        this.tapiNodes = new ArrayList<>();
+        this.tapiLinks = new ArrayList<>();
+        this.uuidMap = new HashMap<>();
+    }
+
+
+    public void convertNode() {
+        //node creation [DSR/ODU]
+        LOG.info("creation of a DSR/ODU node");
+        Uuid nodeUuid = new Uuid(UUID.randomUUID().toString());
+        this.uuidMap.put(this.ietfNodeId + "+DSR", nodeUuid);
+        List<Name> dsrNodeNames = Arrays.asList(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(dsrNodeNames, dsrLayerProtocols);
+        tapiNodes.add(dsrNode);
+
+        //node creation [otsi]
+        LOG.info("creation of an OTSi node");
+        nodeUuid = new Uuid(UUID.randomUUID().toString());
+        this.uuidMap.put(this.ietfNodeId + "+OTSi", nodeUuid);
+        List<Name> otsiNodeNames = Arrays.asList(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(otsiNodeNames, otsiLayerProtocols);
+        tapiNodes.add(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();
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
+        .Node createTapiNode(List<Name> nodeNames, List<LayerProtocolName> layerProtocols) {
+        Uuid nodeUuid = null;
+        List<OwnedNodeEdgePoint> onepl = new ArrayList<>();
+        List<NodeRuleGroup> nodeRuleGroupList = new ArrayList<>();
+        List<Rule> ruleList = new ArrayList<>();
+        Rule rule = new RuleBuilder()
+            .setLocalId("forward")
+            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
+            .setRuleType(RuleType.FORWARDING)
+            .build();
+        ruleList.add(rule);
+        if (layerProtocols.contains(LayerProtocolName.DSR)) {
+            nodeUuid = this.uuidMap.get(this.ietfNodeId + "+DSR");
+            // client nep creation on DSR/ODU node
+            for (int i = 0; i < oorClientPortList.size(); i++) {
+                Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
+                this.uuidMap.put("DSR+" + oorClientPortList.get(i).getTpId().getValue(), nepUuid);
+                List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_C")
+                    .append(i + 1).toString()).setValue(oorClientPortList.get(i).getTpId().getValue()).build());
+                OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), onedNames, LayerProtocolName.ETH,
+                    LayerProtocolName.DSR, true, "DSR+");
+                onepl.add(onep);
+            }
+            // network nep creation on DSR/ODU node
+            for (int i = 0; i < oorNetworkPortList.size(); i++) {
+                Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
+                this.uuidMap.put("DSR+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid);
+                List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_N")
+                    .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+                OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames, LayerProtocolName.ODU,
+                    LayerProtocolName.DSR, true, "DSR+");
+                onepl.add(onep);
+            }
+            // create NodeRuleGroup
+            for (NonBlockingList nbl : this.oorOduSwitchingPool.getNonBlockingList()) {
+                List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+                    .NodeEdgePoint> nepList = new ArrayList<>();
+                for (TpId tp : nbl.getTpList()) {
+                    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(this.ietfNodeId + "+DSR"))
+                        .setNodeEdgePointUuid(this.uuidMap.get("DSR+" + tp.getValue()))
+                        .build();
+                    nepList.add(nep);
+                }
+                NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+                    .setUuid(new Uuid(UUID.randomUUID().toString()))
+                    .setRule(ruleList)
+                    .setNodeEdgePoint(nepList)
+                    .build();
+                nodeRuleGroupList.add(nodeRuleGroup);
+            }
+        } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
+            nodeUuid = this.uuidMap.get(this.ietfNodeId + "+OTSi");
+            // iNep creation on otsi node
+            for (int i = 0; i < oorNetworkPortList.size(); i++) {
+                Uuid nepUuid1 = new Uuid(UUID.randomUUID().toString());
+                this.uuidMap.put("iOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid1);
+                List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("iNodeEdgePoint_")
+                    .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+                OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
+                    LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "iOTSi+");
+                onepl.add(onep);
+            }
+            // eNep creation on otsi node
+            for (int i = 0; i < oorNetworkPortList.size(); i++) {
+                Uuid nepUuid2 = new Uuid(UUID.randomUUID().toString());
+                this.uuidMap.put("eOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid2);
+                List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("eNodeEdgePoint_")
+                    .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+                OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
+                    LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "eOTSi+");
+                onepl.add(onep);
+            }
+            // create NodeRuleGroup
+            for (TerminationPoint tp : this.oorNetworkPortList) {
+                List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+                    .NodeEdgePoint> nepList = new ArrayList<>();
+                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(this.ietfNodeId + "+OTSi"))
+                    .setNodeEdgePointUuid(this.uuidMap.get("iOTSi+" + 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(this.ietfNodeId + "+OTSi"))
+                    .setNodeEdgePointUuid(this.uuidMap.get("eOTSi+" + tp.getTpId().getValue()))
+                    .build();
+                nepList.add(inep);
+                nepList.add(enep);
+                NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+                    .setUuid(new Uuid(UUID.randomUUID().toString()))
+                    .setRule(ruleList)
+                    .setNodeEdgePoint(nepList)
+                    .build();
+                nodeRuleGroupList.add(nodeRuleGroup);
+            }
+        } else {
+            LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(0).getValueName(), nodeNames.get(0)
+                .getValue());
+        }
+
+        // create tapi node
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode =
+            new NodeBuilder()
+            .setUuid(nodeUuid)
+            .setName(nodeNames)
+            .setLayerProtocolName(layerProtocols)
+            .setAdministrativeState(AdministrativeState.UNLOCKED)
+            .setOperationalState(OperationalState.ENABLED)
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setOwnedNodeEdgePoint(onepl)
+            .setNodeRuleGroup(nodeRuleGroupList)
+            .build();
+        return tapiNode;
+    }
+
+    private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, List<Name> nepNames, LayerProtocolName nepProtocol,
+        LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
+        String key = keyword + oorTp.getTpId().getValue();
+        OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
+            .setUuid(this.uuidMap.get(key))
+            .setLayerProtocolName(nepProtocol)
+            .setName(nepNames);
+        if (withSip) {
+            onepBldr.setMappedServiceInterfacePoint(createSIP(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 List<MappedServiceInterfacePoint> createSIP(int nb) {
+        List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
+        for (int i = 0; i < nb; i++) {
+            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
+                .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
+            msipl.add(msip);
+        }
+        return msipl;
+    }
+
+    private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
+        LayerProtocolName lpn) {
+        List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
+        List<SupportedInterfaceCapability> sicList = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm
+            .otn.network.topology.rev181130.TerminationPoint1.class).getTpSupportedInterfaces()
+            .getSupportedInterfaceCapability();
+        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);
+                    }
+                    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) {
+            List<NodeEdgePoint> nepList = new ArrayList<>();
+            String sourceKey = "DSR+" + tp.getTpId().getValue();
+            Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
+            String destKey = "iOTSi+" + tp.getTpId().getValue();
+            Uuid destUuidTp = this.uuidMap.get(destKey);
+            NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
+                .setTopologyUuid(this.tapiTopoUuid)
+                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
+                .setNodeEdgePointUuid(sourceUuidTp)
+                .build();
+            nepList.add(sourceNep);
+            NodeEdgePoint destNep = new NodeEdgePointBuilder()
+                .setTopologyUuid(this.tapiTopoUuid)
+                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
+                .setNodeEdgePointUuid(destUuidTp)
+                .build();
+            nepList.add(destNep);
+            LinkBuilder transiLinkBldr = new LinkBuilder()
+                .setUuid(new Uuid(UUID.randomUUID().toString()))
+                .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
+                    LayerProtocolName.PHOTONICMEDIA.getName()))
+                .setNodeEdgePoint(nepList)
+                .setDirection(ForwardingDirection.BIDIRECTIONAL)
+                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(new BigInteger("100")).build()).build());
+            this.tapiLinks.add(transiLinkBldr.build());
+        }
+    }
+
+    public List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> getTapiNodes() {
+        return tapiNodes;
+    }
+
+    public List<Link> getTapiLinks() {
+        return tapiLinks;
+    }
+}
index 76fcb7fe031a0b4a7315023552dd1441f9016c07..bea4f5c95979b5f6f96887d8ffe8513471e2b502 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,6 +26,7 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.NodesKey;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.nodes.Mapping;
@@ -94,7 +96,28 @@ public class TapiTopologyImpl implements TapiTopologyService {
 
     @Override
     public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> getTopologyDetails(GetTopologyDetailsInput input) {
-        LOG.info("Building TAPI Topology {}", input.getTopologyIdOrName());
+        LOG.info("Building TAPI Topology absraction from {}", input.getTopologyIdOrName());
+        Topology topology = null;
+        switch (input.getTopologyIdOrName()) {
+            case NetworkUtils.OVERLAY_NETWORK_ID:
+                topology = createAbstractedOpenroadmTopology();
+                break;
+            case NetworkUtils.OTN_NETWORK_ID:
+                topology = createAbstractedOtnTopology();
+                break;
+            default:
+                LOG.error("{} unknown - can not be abstracted", input.getTopologyIdOrName());
+                break;
+        }
+        if (topology != null) {
+            return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
+                .buildFuture();
+        } else {
+            return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().build()).buildFuture();
+        }
+    }
+
+    private Topology createAbstractedOpenroadmTopology() {
         // read openroadm-topology
         @NonNull
         FluentFuture<Optional<Network>> openroadmTopoOpt = dataBroker.newReadOnlyTransaction().read(
@@ -150,10 +173,52 @@ public class TapiTopologyImpl implements TapiTopologyService {
                 new ArrayList<>();
             tapiNodeList.add(createTapiNode(goodTpList));
             Topology topology = new TopologyBuilder().setName(names).setUuid(uuid).setNode(tapiNodeList).build();
-            return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
-                .buildFuture();
+            return topology;
         } else {
-            return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().build()).buildFuture();
+            return null;
+        }
+    }
+
+    private Topology createAbstractedOtnTopology() {
+        // read otn-topology
+        @NonNull
+        FluentFuture<Optional<Network>> otnTopoOpt = dataBroker.newReadOnlyTransaction().read(
+            LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.OTN_NETWORK_II);
+        if (otnTopoOpt.isDone()) {
+            Network otnTopo = null;
+            try {
+                otnTopo = otnTopoOpt.get().get();
+            } catch (InterruptedException | ExecutionException | NoSuchElementException e) {
+                LOG.error("Impossible to retreive otn-topology from mdsal");
+                return null;
+            }
+            List<Node> nodeList = otnTopo.getNode();
+            List<Node> otnNodeList = nodeList.stream().filter(nt -> nt.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1.class)
+                .getNodeType().equals(OpenroadmNodeType.SWITCH) || nt.augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1.class)
+                    .getNodeType().equals(OpenroadmNodeType.MUXPDR)).collect(Collectors.toList());
+            List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodeList =
+                new ArrayList<>();
+            List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> tapiLinkList =
+                new ArrayList<>();
+            Uuid topoUuid = new Uuid(UUID.randomUUID().toString());
+            for (Node node : otnNodeList) {
+                ConvertORTopoObjectToTapiTopoObject tapiFactory =
+                    new ConvertORTopoObjectToTapiTopoObject(node, null, topoUuid);
+                tapiFactory.convertNode();
+                tapiNodeList.addAll(tapiFactory.getTapiNodes());
+                tapiLinkList.addAll(tapiFactory.getTapiLinks());
+            }
+            Topology topology = new TopologyBuilder()
+                .setName(Arrays.asList(new NameBuilder().setValue("T0 - Multi-layer topology")
+                    .setValueName("TAPI Topology Name").build()))
+                .setUuid(topoUuid)
+                .setNode(tapiNodeList)
+                .setLink(tapiLinkList).build();
+            return topology;
+        } else {
+            return null;
         }
     }
 
@@ -178,7 +243,6 @@ public class TapiTopologyImpl implements TapiTopologyService {
 
     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node createTapiNode(List<
         String> tpList) {
-
         List<Name> names = new ArrayList<Name>();
         Name name = new NameBuilder().setValueName("node name").setValue("TapiNode1").build();
         names.add(name);
@@ -187,9 +251,7 @@ public class TapiTopologyImpl implements TapiTopologyService {
         List<OwnedNodeEdgePoint> onepl = new ArrayList<OwnedNodeEdgePoint>();
         for (int i = 0; i < tpList.size(); i++) {
             List<Name> onedNames = new ArrayList<Name>();
-            onedNames.add(new NameBuilder().setValueName("OwnedNodeEdgePoint" + i + " name").setValue(tpList.get(i))
-                .build());
-
+            onedNames.add(new NameBuilder().setValueName("OwnedNodeEdgePoint " + i).setValue(tpList.get(i)).build());
             OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder().setUuid(new Uuid(UUID.randomUUID().toString()))
                 .setLayerProtocolName(LayerProtocolName.ETH).setMappedServiceInterfacePoint(createSIP(1))
                 .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
@@ -209,8 +271,8 @@ public class TapiTopologyImpl implements TapiTopologyService {
     private List<MappedServiceInterfacePoint> createSIP(int nb) {
         List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
         for (int i = 0; i < nb; i++) {
-            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
-                .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
+            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder().setServiceInterfacePointUuid(
+                new Uuid(UUID.randomUUID().toString())).build();
             msipl.add(msip);
         }
         return msipl;
@@ -281,4 +343,5 @@ public class TapiTopologyImpl implements TapiTopologyService {
                 return false;
         }
     }
+
 }